From 405b7cdb87c21a766432036e6cd2975978517b1d Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Wed, 4 Aug 2021 23:55:43 +0300 Subject: [PATCH] [Build] --- .patch-version | 2 +- ...48232bc26b8d2aff6ea.css => 0.d8fb0ed03b2b879a4243.css} | 8 ++++++-- dist/0.d8fb0ed03b2b879a4243.css.map | 1 + dist/0.d8fb0ed03b2b879a4243.js | 2 ++ dist/0.d8fb0ed03b2b879a4243.js.map | 1 + dist/0.e48232bc26b8d2aff6ea.css.map | 1 - dist/0.e48232bc26b8d2aff6ea.js | 2 -- dist/0.e48232bc26b8d2aff6ea.js.map | 1 - ....db575d71a0009d78423e.js => 1.6110220c0cd22a07afe2.js} | 4 ++-- dist/1.6110220c0cd22a07afe2.js.map | 1 + dist/1.db575d71a0009d78423e.js.map | 1 - ...af7bed9ae098996acabc.js => 10.0f031682109823f02d37.js} | 4 ++-- ...e098996acabc.js.map => 10.0f031682109823f02d37.js.map} | 2 +- ...4d4bc793e11d4bb6728.css => 3.356913bd8f5c1b421f79.css} | 4 +--- dist/3.356913bd8f5c1b421f79.css.map | 1 + dist/3.356913bd8f5c1b421f79.js | 2 ++ dist/3.356913bd8f5c1b421f79.js.map | 1 + dist/3.c4d4bc793e11d4bb6728.css.map | 1 - dist/3.c4d4bc793e11d4bb6728.js | 2 -- dist/3.c4d4bc793e11d4bb6728.js.map | 1 - ...46a6915735f9deb48a8.css => 4.5fb9a295648f3bed8bba.css} | 6 +++++- dist/4.5fb9a295648f3bed8bba.css.map | 1 + dist/4.5fb9a295648f3bed8bba.js | 2 ++ dist/4.5fb9a295648f3bed8bba.js.map | 1 + dist/4.f46a6915735f9deb48a8.css.map | 1 - dist/4.f46a6915735f9deb48a8.js | 2 -- dist/4.f46a6915735f9deb48a8.js.map | 1 - dist/5.3751c0b85336f64c5d01.js.map | 1 - ...751c0b85336f64c5d01.css => 5.64e3757d90b4958d12d9.css} | 2 +- ...336f64c5d01.css.map => 5.64e3757d90b4958d12d9.css.map} | 2 +- ....3751c0b85336f64c5d01.js => 5.64e3757d90b4958d12d9.js} | 4 ++-- dist/5.64e3757d90b4958d12d9.js.map | 1 + dist/5aa1e598c74b078112d5.worker.js.map | 1 - ...7c58d7c5eb57719d840.css => 6.f9e82031a240faaf8916.css} | 2 +- ...eb57719d840.css.map => 6.f9e82031a240faaf8916.css.map} | 2 +- ....77c58d7c5eb57719d840.js => 6.f9e82031a240faaf8916.js} | 4 ++-- ...c5eb57719d840.js.map => 6.f9e82031a240faaf8916.js.map} | 2 +- ....fe92696749d312ea20ae.js => 7.5020185fc616949435e0.js} | 4 ++-- ...749d312ea20ae.js.map => 7.5020185fc616949435e0.js.map} | 2 +- ...d9def8546.worker.js => 7d222ae46ebed0531387.worker.js} | 2 +- ...6.worker.js.map => 7d222ae46ebed0531387.worker.js.map} | 2 +- dist/8.9786bdd67e960161780f.js | 2 -- dist/8.b1c64eac1a0833d4fa35.js | 2 ++ ...67e960161780f.js.map => 8.b1c64eac1a0833d4fa35.js.map} | 2 +- ....4c3e7b14c7a365900696.js => 9.8ce2b842c50b69d2f741.js} | 4 ++-- ...4c7a365900696.js.map => 9.8ce2b842c50b69d2f741.js.map} | 2 +- ...b078112d5.worker.js => f04c4dace6672b308b1e.worker.js} | 8 ++++---- dist/f04c4dace6672b308b1e.worker.js.map | 1 + dist/index.html | 2 +- dist/main.27f9887240a2d5c046ba.js | 2 -- dist/main.27f9887240a2d5c046ba.js.map | 1 - dist/main.9cbfb7726cae6e685678.js | 2 ++ dist/main.9cbfb7726cae6e685678.js.map | 1 + dist/report.html | 4 ++-- 54 files changed, 63 insertions(+), 57 deletions(-) rename dist/{0.e48232bc26b8d2aff6ea.css => 0.d8fb0ed03b2b879a4243.css} (96%) create mode 100644 dist/0.d8fb0ed03b2b879a4243.css.map create mode 100644 dist/0.d8fb0ed03b2b879a4243.js create mode 100644 dist/0.d8fb0ed03b2b879a4243.js.map delete mode 100644 dist/0.e48232bc26b8d2aff6ea.css.map delete mode 100644 dist/0.e48232bc26b8d2aff6ea.js delete mode 100644 dist/0.e48232bc26b8d2aff6ea.js.map rename dist/{1.db575d71a0009d78423e.js => 1.6110220c0cd22a07afe2.js} (99%) create mode 100644 dist/1.6110220c0cd22a07afe2.js.map delete mode 100644 dist/1.db575d71a0009d78423e.js.map rename dist/{10.af7bed9ae098996acabc.js => 10.0f031682109823f02d37.js} (98%) rename dist/{10.af7bed9ae098996acabc.js.map => 10.0f031682109823f02d37.js.map} (99%) rename dist/{3.c4d4bc793e11d4bb6728.css => 3.356913bd8f5c1b421f79.css} (98%) create mode 100644 dist/3.356913bd8f5c1b421f79.css.map create mode 100644 dist/3.356913bd8f5c1b421f79.js create mode 100644 dist/3.356913bd8f5c1b421f79.js.map delete mode 100644 dist/3.c4d4bc793e11d4bb6728.css.map delete mode 100644 dist/3.c4d4bc793e11d4bb6728.js delete mode 100644 dist/3.c4d4bc793e11d4bb6728.js.map rename dist/{4.f46a6915735f9deb48a8.css => 4.5fb9a295648f3bed8bba.css} (98%) create mode 100644 dist/4.5fb9a295648f3bed8bba.css.map create mode 100644 dist/4.5fb9a295648f3bed8bba.js create mode 100644 dist/4.5fb9a295648f3bed8bba.js.map delete mode 100644 dist/4.f46a6915735f9deb48a8.css.map delete mode 100644 dist/4.f46a6915735f9deb48a8.js delete mode 100644 dist/4.f46a6915735f9deb48a8.js.map delete mode 100644 dist/5.3751c0b85336f64c5d01.js.map rename dist/{5.3751c0b85336f64c5d01.css => 5.64e3757d90b4958d12d9.css} (99%) rename dist/{5.3751c0b85336f64c5d01.css.map => 5.64e3757d90b4958d12d9.css.map} (99%) rename dist/{5.3751c0b85336f64c5d01.js => 5.64e3757d90b4958d12d9.js} (90%) create mode 100644 dist/5.64e3757d90b4958d12d9.js.map delete mode 100644 dist/5aa1e598c74b078112d5.worker.js.map rename dist/{6.77c58d7c5eb57719d840.css => 6.f9e82031a240faaf8916.css} (98%) rename dist/{6.77c58d7c5eb57719d840.css.map => 6.f9e82031a240faaf8916.css.map} (99%) rename dist/{6.77c58d7c5eb57719d840.js => 6.f9e82031a240faaf8916.js} (98%) rename dist/{6.77c58d7c5eb57719d840.js.map => 6.f9e82031a240faaf8916.js.map} (99%) rename dist/{7.fe92696749d312ea20ae.js => 7.5020185fc616949435e0.js} (93%) rename dist/{7.fe92696749d312ea20ae.js.map => 7.5020185fc616949435e0.js.map} (99%) rename dist/{f0ab47df0c7d9def8546.worker.js => 7d222ae46ebed0531387.worker.js} (98%) rename dist/{f0ab47df0c7d9def8546.worker.js.map => 7d222ae46ebed0531387.worker.js.map} (99%) delete mode 100644 dist/8.9786bdd67e960161780f.js create mode 100644 dist/8.b1c64eac1a0833d4fa35.js rename dist/{8.9786bdd67e960161780f.js.map => 8.b1c64eac1a0833d4fa35.js.map} (53%) rename dist/{9.4c3e7b14c7a365900696.js => 9.8ce2b842c50b69d2f741.js} (99%) rename dist/{9.4c3e7b14c7a365900696.js.map => 9.8ce2b842c50b69d2f741.js.map} (99%) rename dist/{5aa1e598c74b078112d5.worker.js => f04c4dace6672b308b1e.worker.js} (95%) create mode 100644 dist/f04c4dace6672b308b1e.worker.js.map delete mode 100644 dist/main.27f9887240a2d5c046ba.js delete mode 100644 dist/main.27f9887240a2d5c046ba.js.map create mode 100644 dist/main.9cbfb7726cae6e685678.js create mode 100644 dist/main.9cbfb7726cae6e685678.js.map diff --git a/.patch-version b/.patch-version index 1e8b31496..7f8f011eb 100644 --- a/.patch-version +++ b/.patch-version @@ -1 +1 @@ -6 +7 diff --git a/dist/0.e48232bc26b8d2aff6ea.css b/dist/0.d8fb0ed03b2b879a4243.css similarity index 96% rename from dist/0.e48232bc26b8d2aff6ea.css rename to dist/0.d8fb0ed03b2b879a4243.css index 127e6dc62..708eb7811 100644 --- a/dist/0.e48232bc26b8d2aff6ea.css +++ b/dist/0.d8fb0ed03b2b879a4243.css @@ -34,6 +34,10 @@ .Chat{--background-color: var(--color-background);position:absolute;top:0;left:0;margin:0;width:100%}body.is-ios .Chat,body.is-macos .Chat{--color-text-meta: var(--color-text-meta-apple)}.Chat.animate-opacity{will-change:opacity;transition:opacity .2s ease-out}.Chat.animate-transform{will-change:transform;transition:transform .2s ease-out}.Chat:hover .Avatar.online::after,.Chat.ListItem.has-menu-open .Avatar.online::after{border-color:var(--color-chat-hover)}@media (max-width: 600px){.Chat.selected{--background-color: var(--color-chat-hover) !important}.Chat.selected .Avatar.online::after{border-color:var(--color-chat-hover)}}@media (min-width: 600px){.Chat.selected,.Chat.selected:hover{--background-color: var(--color-chat-active) !important}.Chat.selected .Avatar.online::after,.Chat.selected:hover .Avatar.online::after{border-color:var(--color-chat-active) !important;background:var(--color-white)}.Chat.selected .ListItem-button,.Chat.selected:hover .ListItem-button{--background-color: var(--color-chat-active) !important;--color-text: var(--color-white);--color-text-meta-colored: var(--color-white);--color-text-meta: var(--color-white);--color-text-secondary: var(--color-white);--color-error: var(--color-white);--color-pinned: var(--color-white)}.Chat.selected .icon-muted-chat,.Chat.selected:hover .icon-muted-chat{color:var(--color-white) !important}.Chat.selected .Badge:not(.pinned),.Chat.selected:hover .Badge:not(.pinned){background:var(--color-white);color:var(--color-chat-active)}}.Chat .status{flex-shrink:0}.Chat .info .title,.Chat .info .subtitle{padding-right:.125rem}.Chat .info .subtitle{margin-top:-.125rem}.Chat .info h3{width:auto;max-width:80%}.Chat .info .icon-muted-chat{font-size:1.25rem;margin-left:0.25rem;margin-top:-.0625rem;color:#C6C8CA}body.is-ios .Chat .info .icon-muted-chat{margin-top:0;margin-right:.5rem}.Chat .info .LastMessageMeta{margin-left:auto}body.is-ios .Chat .info .LastMessageMeta{font-size:.875rem;margin-right:0}.Chat .info .last-message,.Chat .info .typing-status{padding-right:0.25rem;flex-grow:1;color:var(--color-text-secondary);unicode-bidi:plaintext}.Chat .info .last-message[dir=ltr],.Chat .info .typing-status[dir=ltr]{text-align:left}.Chat .info .last-message .sender-name,.Chat .info .typing-status .sender-name{color:var(--color-text)}.Chat .info .last-message .draft,.Chat .info .typing-status .draft{color:var(--color-error)}.Chat .info .last-message .draft::after{content:': '}.Chat .info .last-message .colon{margin-inline-end:.25rem}.Chat .info .last-message img{width:1.25rem;height:1.25rem;object-fit:cover;border-radius:.125rem;vertical-align:-.25rem;margin-inline-end:.25rem}body.is-ios .Chat .info .last-message img{width:1.125rem;height:1.125rem;vertical-align:-.1875rem}.Chat .info .last-message img.round{border-radius:.625rem}.Chat .info .last-message .emoji-small{width:1rem;height:1rem;vertical-align:-.125rem}.Chat .info .last-message .icon-play{position:relative;display:inline-block;font-size:.75rem;color:#fff;margin-inline-start:-1.25rem;margin-inline-end:0.5rem;bottom:0.0625rem}body.is-ios .Chat .info .last-message .icon-play{margin-inline-start:-1.125rem;bottom:0}.Chat[dir=rtl] .info .LastMessageMeta{margin-left:0;margin-right:auto}.Chat[dir=rtl] .info .title,.Chat[dir=rtl] .info .subtitle{padding-left:.15rem;padding-right:0}.Chat[dir=rtl] .info .icon-muted-chat{margin-left:0;margin-right:0.25rem}.Chat[dir=rtl] .info .last-message,.Chat[dir=rtl] .info .typing-status{padding-left:0.5rem;padding-right:0;text-align:right;unicode-bidi:plaintext} +.AnimatedEmoji{margin-bottom:0.75rem}.AnimatedEmoji img{position:absolute;width:100%;height:100%}.AnimatedEmoji img.like-sticker-thumb{transform:scale(0.8)} + +.EmptyFolder{width:100%;height:80%;display:flex;align-items:center;justify-content:center;flex-direction:column}@media (max-height: 480px){.EmptyFolder{height:100%}}.EmptyFolder .sticker{height:8rem;margin-bottom:1.875rem}.EmptyFolder .title{font-size:1.25rem;margin-bottom:.125rem}.EmptyFolder .description{font-size:.875rem;color:var(--color-text-secondary)}body.is-ios .EmptyFolder .description,body.is-macos .EmptyFolder .description{color:var(--color-text-secondary-apple)}.EmptyFolder .Button.pill{margin-top:.625rem;font-weight:500;padding-inline-start:.75rem;unicode-bidi:plaintext}.EmptyFolder .Button.pill i{margin-inline-end:.625rem;font-size:1.5rem} + .NothingFound{display:flex;align-items:center;justify-content:center;color:var(--color-text-meta)}.NothingFound.with-description{flex-direction:column}.NothingFound .AnimatedSticker{margin:0 auto}.NothingFound .description{color:var(--color-text-secondary);font-size:.875rem;text-align:center;margin:1rem 0 0;unicode-bidi:plaintext} .Media{height:0;padding-bottom:100%;overflow:hidden;position:relative;cursor:pointer}.Media .video-duration{position:absolute;left:.25rem;top:.25rem;background:rgba(0,0,0,0.25);color:#fff;font-size:.75rem;padding:0 .3125rem;border-radius:.1875rem;line-height:1.125rem}.Media img{position:absolute;left:0;top:0;width:100%;height:100%;object-fit:cover} @@ -50,11 +54,11 @@ .DropArea{position:absolute;top:0;right:0;left:0;height:100vh;z-index:var(--z-drop-area);padding:80px 20px 20px;display:flex;flex-direction:column}#Main.right-column-open .DropArea{max-width:calc(100% - var(--right-column-width))} -.AnimatedEmoji{margin-bottom:0.75rem}.AnimatedEmoji img{position:absolute;width:100%;height:100%}.AnimatedEmoji img.like-sticker-thumb{transform:scale(0.8)} +.StickerButton{display:inline-block;width:4rem;height:4rem;margin:0.5rem;border-radius:var(--border-radius-messages-small);background:transparent no-repeat center;background-size:contain;cursor:pointer;transition:background-color .15s ease, opacity .3s ease !important;position:relative}@media (max-width: 600px){.StickerButton{margin:0.25rem}}.StickerButton.set-button{width:2.75rem !important;height:2.75rem;margin:0 0.5rem}.StickerButton.large{width:10rem;height:10rem;margin:0}.StickerButton .AnimatedSticker,.StickerButton img{position:absolute;top:0;left:0;width:100%;height:100%}.StickerButton img{object-fit:contain}.StickerButton .sticker-unfave-button{position:absolute;top:-0.5rem;right:-0.5rem;width:1.25rem;height:1.25rem;padding:0.125rem;opacity:0}.StickerButton .sticker-unfave-button i{font-size:1rem}.StickerButton:hover{background-color:var(--color-interactive-element-hover)}.StickerButton:hover .sticker-unfave-button{opacity:1} .TextFormatter{transform:translate(-50%, -3.25rem)}.TextFormatter,.TextFormatter-link-control{position:absolute;background:var(--color-background);border-radius:var(--border-radius-messages);padding:0.5rem 0.375rem;box-shadow:0 1px 2px var(--color-default-shadow)}.TextFormatter-link-control{left:0;top:0;opacity:0;pointer-events:none;transition:opacity .3s ease}.Modal .TextFormatter-link-control{max-width:100%}@media (max-width: 600px){.TextFormatter-link-control{max-width:calc(100vw - var(--text-formatter-left) + 3rem)}}.TextFormatter-link-control input{border:none !important;outline:none !important;width:100%;color:var(--color-text);background-color:var(--color-background)}.TextFormatter-buttons,.TextFormatter-link-url-confirm{display:flex;flex-wrap:nowrap;align-items:center}.TextFormatter-divider{width:1px;height:1.75rem;margin:0 0.25rem;background-color:var(--color-borders)}.TextFormatter-link-url-input-wrapper{width:20rem;position:relative;max-width:100%}@media (max-width: 600px){.TextFormatter-link-url-input-wrapper{max-width:90vw}}.TextFormatter-link-url-input-wrapper::before,.TextFormatter-link-url-input-wrapper::after{content:"";display:block;position:absolute;top:0;bottom:0;width:1rem;z-index:2;opacity:0;transition:opacity .2s ease}.TextFormatter-link-url-input-wrapper::before{left:0;background:linear-gradient(to right, var(--color-background) 0.25rem, transparent 1rem)}.TextFormatter-link-url-input-wrapper::after{right:0;background:linear-gradient(to left, var(--color-background) 0.25rem, transparent 1rem)}.TextFormatter-link-url-input-wrapper.mask-left::before{opacity:1}.TextFormatter-link-url-input-wrapper.mask-right::after{opacity:1}.TextFormatter-link-url-confirm{flex-shrink:0;opacity:0;transition:opacity .3s ease}.TextFormatter-link-url-confirm.shown{opacity:1}.TextFormatter.link-control-shown .TextFormatter-link-control{opacity:1;pointer-events:all}.TextFormatter .Button{width:2rem;height:2rem;padding:0.25rem;font-size:1.5rem;margin:0 0.125rem;border-radius:var(--border-radius-messages-small);flex-shrink:0;cursor:pointer}.TextFormatter .Button.active{background-color:var(--color-primary) !important;color:white}.TextFormatter .Button.disabled{opacity:.5;pointer-events:none} .Picker{height:100%;display:flex;flex-direction:column;overflow:hidden}.Picker .picker-header{padding:0 1rem 0.25rem 0.75rem;border-bottom:1px solid var(--color-borders);display:flex;flex-flow:row wrap;flex-shrink:0;overflow-y:auto;max-height:20rem}.Picker .picker-header .input-group{margin-bottom:0.5rem;margin-left:0.5rem;flex-grow:1}.Picker .picker-header .form-control{height:2rem;border:none;border-radius:0;padding:0;box-shadow:none}.Picker .picker-list{flex-grow:1;overflow-y:auto;overflow-x:hidden;padding:0.5rem}@media (max-width: 600px){.Picker .picker-list{padding-left:0 !important;padding-right:0 !important}}.Picker .no-results{height:100%;margin:0;padding:1rem 1rem;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary)} -/*# sourceMappingURL=0.e48232bc26b8d2aff6ea.css.map*/ \ No newline at end of file +/*# sourceMappingURL=0.d8fb0ed03b2b879a4243.css.map*/ \ No newline at end of file diff --git a/dist/0.d8fb0ed03b2b879a4243.css.map b/dist/0.d8fb0ed03b2b879a4243.css.map new file mode 100644 index 000000000..db9cea9dc --- /dev/null +++ b/dist/0.d8fb0ed03b2b879a4243.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/ui/Transition.scss","webpack:///./src/components/common/Avatar.scss","webpack:///./src/components/ui/ProgressSpinner.scss","webpack:///./src/components/ui/Modal.scss","webpack:///./src/components/ui/ListItem.scss","webpack:///./src/components/common/VerifiedIcon.scss","webpack:///./src/components/common/TypingStatus.scss","webpack:///./src/components/ui/Notification.scss","webpack:///./src/components/ui/Radio.scss","webpack:///./src/components/ui/Tab.scss","webpack:///./src/components/ui/TabList.scss","webpack:///./src/components/common/DeleteChatModal.scss","webpack:///./src/components/ui/SearchInput.scss","webpack:///./src/components/common/PickerSelectedItem.scss","webpack:///./src/components/common/MessageOutgoingStatus.scss","webpack:///./src/components/common/LastMessageMeta.scss","webpack:///./src/components/left/main/Badge.scss","webpack:///./src/components/left/main/Chat.scss","webpack:///./src/components/common/AnimatedEmoji.scss","webpack:///./src/components/left/main/EmptyFolder.scss","webpack:///./src/components/common/NothingFound.scss","webpack:///./src/components/common/Media.scss","webpack:///./src/components/common/WebLink.scss","webpack:///./src/components/common/File.scss","webpack:///./src/components/common/Audio.scss","webpack:///./src/components/middle/composer/DropTarget.scss","webpack:///./src/components/ui/FloatingActionButton.scss","webpack:///./src/components/middle/composer/DropArea.scss","webpack:///./src/components/common/StickerButton.scss","webpack:///./src/components/middle/composer/TextFormatter.scss","webpack:///./src/components/common/Picker.scss"],"names":[],"mappings":"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","file":"0.d8fb0ed03b2b879a4243.css","sourcesContent":[".Transition{position:relative}.Transition>*{width:100%;height:100%;animation-fill-mode:forwards !important;transition:background-color .2s}.Transition>*.from,.Transition>*.to{position:absolute;top:0;left:0}.Transition>*:not(.active):not(.from):not(.to){display:none !important}.Transition.skip-slide-transition{transition:none !important}.Transition.scroll-slide{width:100%;height:100%;overflow:hidden;display:flex;flex-wrap:nowrap}.Transition.scroll-slide>*{position:static;flex-shrink:0}.Transition.scroll-slide>*:not(.active):not(.from):not(.to){display:block !important;transform:scale(0)}.Transition.scroll-slide>*:not(.active):not(.from):not(.to).through{display:none !important}.Transition.slide>.to{transform:translateX(100%)}.Transition.slide.animating>.from{animation:slide-out var(--slide-transition)}.Transition.slide.animating>.to{animation:slide-in var(--slide-transition)}.Transition.slide.backwards>.to{transform:translateX(-100%)}.Transition.slide.backwards.animating>.from{animation:slide-in-backwards var(--slide-transition)}.Transition.slide.backwards.animating>.to{animation:slide-out-backwards var(--slide-transition)}.Transition.slide-reversed>.to{transform:translateX(-100%)}.Transition.slide-reversed.animating>.from{animation:slide-out var(--slide-transition)}.Transition.slide-reversed.animating>.to{animation:slide-in var(--slide-transition)}.Transition.slide-reversed.backwards>.to{transform:translateX(100%)}.Transition.slide-reversed.backwards.animating>.from{animation:slide-in-backwards var(--slide-transition)}.Transition.slide-reversed.backwards.animating>.to{animation:slide-out-backwards var(--slide-transition)}.Transition.mv-slide>*>div{animation-fill-mode:forwards !important}.Transition.mv-slide>.to>div{transform:translateX(100vw)}.Transition.mv-slide.animating>.from>div{animation:mv-slide-out .4s ease}.Transition.mv-slide.animating>.to>div{animation:mv-slide-in .4s ease}.Transition.mv-slide.backwards>.to>div{transform:translateX(-100vw)}.Transition.mv-slide.backwards.animating>.from>div{animation:mv-slide-in-backwards .4s ease}.Transition.mv-slide.backwards.animating>.to>div{animation:mv-slide-out-backwards .4s ease}.Transition.slide-fade>.from{transform-origin:left;transform:translateX(0);opacity:1}.Transition.slide-fade>.to{transform-origin:left;transform:translateX(1.5rem);opacity:0}.Transition.slide-fade.animating>.from{animation:fade-out-opacity var(--slide-transition),slide-fade-out-move var(--slide-transition)}.Transition.slide-fade.animating>.to{animation:fade-in-opacity var(--slide-transition),slide-fade-in-move var(--slide-transition)}.Transition.slide-fade.backwards>.from{transform:translateX(0);opacity:1}.Transition.slide-fade.backwards>.to{transform:translateX(-1.5rem);opacity:0}.Transition.slide-fade.backwards.animating>.from{animation:fade-in-backwards-opacity var(--slide-transition),slide-fade-in-backwards-move var(--slide-transition)}.Transition.slide-fade.backwards.animating>.to{animation:fade-out-backwards-opacity var(--slide-transition),slide-fade-out-backwards-move var(--slide-transition)}.Transition.zoom-fade>.from{transform-origin:center;transform:scale(1);opacity:1}.Transition.zoom-fade>.to{transform-origin:center;opacity:0}.Transition.zoom-fade.animating>.from{animation:fade-out-opacity .15s ease}.Transition.zoom-fade.animating>.to{animation:fade-in-opacity .15s ease, zoom-fade-in-move .15s ease}.Transition.zoom-fade.backwards>.from{transform:scale(1)}.Transition.zoom-fade.backwards>.to{transform:scale(0.95)}.Transition.zoom-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .1s ease, zoom-fade-in-backwards-move .15s ease}.Transition.zoom-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .15s ease, zoom-fade-out-backwards-move .15s ease}.Transition.fade>.from{opacity:1}.Transition.fade>.to{opacity:0}.Transition.fade.animating>.from{animation:fade-out-opacity .15s ease}.Transition.fade.animating>.to{animation:fade-in-opacity .15s ease}.Transition.slide-layers{--background-color: var(--color-background);background:black}.Transition.slide-layers>div{background:var(--background-color)}.Transition.slide-layers>.to{transform:translateX(100%)}.Transition.slide-layers.animating>.from{animation:slide-layers-out var(--layer-transition)}.Transition.slide-layers.animating>.to{animation:slide-in var(--layer-transition)}.Transition.slide-layers.backwards>.to{transform:translateX(-20%);opacity:0.75}.Transition.slide-layers.backwards.animating>.from{animation:slide-in-backwards var(--layer-transition)}.Transition.slide-layers.backwards.animating>.to{animation:slide-layers-out-backwards var(--layer-transition)}.Transition.push-slide>div{background:var(--color-background)}.Transition.push-slide>.from{transform-origin:center;transform:scale(1);opacity:1}.Transition.push-slide>.from .custom-scroll{scrollbar-color:transparent !important}.Transition.push-slide>.from .custom-scroll::-webkit-scrollbar-thumb{background-color:transparent !important}.Transition.push-slide>.to{transform:translateX(100%)}.Transition.push-slide.animating>.from{animation:push-out .3s ease-in-out}.Transition.push-slide.animating>.to{animation:slide-in-200 .3s ease-in-out}.Transition.push-slide.backwards>.to{transform:scale(0.7)}.Transition.push-slide.backwards.animating>.from{animation:slide-in-200-backwards .3s ease-in-out}.Transition.push-slide.backwards.animating>.to{animation:push-out-backwards .3s ease-in-out}.Transition.reveal>.to{-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0)}.Transition.reveal.animating>.to{animation:reveal-in 350ms ease-in}.Transition.reveal.backwards>.from{-webkit-clip-path:inset(0 0 0 0);clip-path:inset(0 0 0 0)}.Transition.reveal.backwards>.to{-webkit-clip-path:none;clip-path:none}.Transition.reveal.backwards.animating>.from{animation:reveal-in-backwards 350ms ease-out}.Transition.reveal.backwards.animating>.to{animation:none}@keyframes fade-in-opacity{0%{opacity:0}100%{opacity:1}}@keyframes fade-out-opacity{0%{opacity:1}100%{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@keyframes slide-in{0%{transform:translateX(100%)}100%{transform:translateX(0)}}@keyframes slide-out{0%{transform:translateX(0)}100%{transform:translateX(-100%)}}@keyframes slide-in-backwards{0%{transform:translateX(0)}100%{transform:translateX(100%)}}@keyframes slide-out-backwards{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes mv-slide-in{0%{transform:translateX(100vw)}100%{transform:translateX(0)}}@keyframes mv-slide-out{0%{transform:translateX(0)}100%{transform:translateX(-100vw)}}@keyframes mv-slide-in-backwards{0%{transform:translateX(0)}100%{transform:translateX(100vw)}}@keyframes mv-slide-out-backwards{0%{transform:translateX(-100vw)}100%{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes slide-layers-out{0%{transform:translateX(0);opacity:1}100%{transform:translateX(-20%);opacity:calc(1 - var(--layer-blackout-opacity))}}@keyframes slide-layers-out-backwards{0%{transform:translateX(-20%);opacity:calc(1 - var(--layer-blackout-opacity))}100%{transform:translateX(0);opacity:1}}@keyframes push-out{0%{transform:scale(1);opacity:1}100%{transform:scale(0.7);opacity:0}}@keyframes push-out-backwards{0%{transform:scale(0.7);opacity:0}100%{transform:scale(1);opacity:1}}@keyframes slide-in-200{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes slide-in-200-backwards{0%{transform:translateX(0)}100%{transform:translateX(200%)}}@keyframes reveal-in{0%{-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0)}100%{-webkit-clip-path:inset(0 0 0 0);clip-path:inset(0 0 0 0)}}@keyframes reveal-in-backwards{0%{-webkit-clip-path:inset(0 0 0 0);clip-path:inset(0 0 0 0)}100%{-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0)}}\n",".Avatar{--color-user: var(--color-primary);flex:none;align-items:center;justify-content:center;width:3.375rem;height:3.375rem;border-radius:50%;background:linear-gradient(var(--color-white) -125%, var(--color-user));color:white;font-weight:bold;display:flex;white-space:nowrap}.Avatar img:not(.emoji){border-radius:50%}.Avatar .emoji{width:1rem;height:1rem}.Avatar i{font-size:2.5rem}.Avatar.size-micro{width:1rem;height:1rem;font-size:0.5125rem}.Avatar.size-micro .emoji{width:.5625rem;height:.5625rem}.Avatar.size-tiny{width:2rem;height:2rem;font-size:.875rem}.Avatar.size-tiny .emoji{width:.875rem;height:.875rem}.Avatar.size-small{width:2.125rem;height:2.125rem;font-size:0.875rem}.Avatar.size-small .emoji{width:.875rem;height:.875rem}.Avatar.size-medium{width:2.75rem;height:2.75rem;font-size:1.1875rem}.Avatar.size-medium .emoji{width:1rem;height:1rem}.Avatar.size-large{font-size:1.3125rem}.Avatar.size-large i{font-size:3.5rem}.Avatar.size-large .emoji{width:1.3125rem;height:1.3125rem}.Avatar.size-jumbo{width:7.5rem;height:7.5rem;font-size:3.5rem}.Avatar.size-jumbo i{font-size:6rem}.Avatar.size-jumbo .emoji{width:3.5rem;height:3.5rem}.Avatar.online{position:relative}.Avatar.online::after{content:'';display:block;position:absolute;bottom:0.05rem;right:0.05rem;width:0.875rem;height:0.875rem;border-radius:50%;border:2px solid var(--color-background);background-color:#0ac630;flex-shrink:0}.Avatar.interactive{cursor:pointer}.Avatar img:not(.emoji){width:100%;height:100%}\n",".ProgressSpinner{position:relative;z-index:1;width:3.375rem;height:3.375rem;background:rgba(0,0,0,0.25) url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkiIGhlaWdodD0iMTkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjcxNyA5Ljc1TDE4LjMgMi4xNjdhLjY4NC42ODQgMCAxMC0uOTY3LS45NjdMOS43NSA4Ljc4MyAyLjE2NyAxLjJhLjY4NC42ODQgMCAxMC0uOTY3Ljk2N0w4Ljc4MyA5Ljc1IDEuMiAxNy4zMzNhLjY4NC42ODQgMCAxMC45NjcuOTY3bDcuNTgzLTcuNTgzIDcuNTgzIDcuNTgzYS42ODEuNjgxIDAgMDAuOTY3IDAgLjY4NC42ODQgMCAwMDAtLjk2N0wxMC43MTcgOS43NXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjRkZGIiBzdHJva2Utd2lkdGg9Ii43NSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==) no-repeat 49% 49%;border-radius:50%;cursor:pointer}.ProgressSpinner.no-cross{background:transparent !important;pointer-events:none}.ProgressSpinner.square{background-image:none}.ProgressSpinner.square::after{content:'';position:absolute;width:.8125rem;height:.8125rem;border-radius:.125rem;background-color:#fff;left:50%;top:50%;transform:translate3d(-50%, -50%, 0)}.ProgressSpinner.size-s,.ProgressSpinner.size-m{width:auto;height:auto;background:transparent url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjRkZGIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+) no-repeat 49% 49%}.ProgressSpinner.size-s.square,.ProgressSpinner.size-m.square{background-image:none;width:.75rem;height:.75rem}.ProgressSpinner.size-xl{width:3.25rem;height:3.25rem}.ProgressSpinner.size-xl svg{width:3rem;height:3rem;margin:.125rem}.ProgressSpinner.size-xl circle{stroke-width:3px}.ProgressSpinner.transparent{background-color:transparent !important}.ProgressSpinner svg{display:block;transform:rotate(-90deg);transform-origin:50% 50%;animation:4s linear 0s infinite ProgressSpinnerAnimation}.ProgressSpinner circle{transition:stroke-dashoffset .5s}@keyframes ProgressSpinnerAnimation{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}\n",".Modal{position:relative;z-index:var(--z-modal)}.Modal.delete .modal-dialog,.Modal.error .modal-dialog,.Modal.confirm .modal-dialog,.Modal.pin .modal-dialog,.Modal.unpin-all .modal-dialog{max-width:23rem}.Modal.error .modal-content>div{margin-top:1rem}.Modal.narrow .modal-dialog{max-width:20rem}.Modal.report .modal-dialog{max-width:15rem}.Modal .modal-container{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;justify-content:center;align-items:center}.Modal .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:-1;background-color:rgba(0,0,0,0.25)}.Modal.transparent-backdrop .modal-backdrop{background-color:transparent}.Modal .modal-dialog{position:relative;display:inline-flex;flex-direction:column;width:100%;max-width:35rem;min-width:17.5rem;margin:2rem auto;background-color:var(--color-background);box-shadow:0 0.25rem 0.5rem 0.125rem var(--color-default-shadow);border-radius:var(--border-radius-default);transform:translate3d(0, -1rem, 0);transition:transform .2s ease, opacity .2s ease}body.animation-level-0 .Modal .modal-dialog{transition:none;transform:none !important}@media (max-width: 450px){.Modal .modal-dialog{max-width:calc(100vw - 3rem) !important}}.Modal.open .modal-dialog{transform:translate3d(0, 0, 0)}.Modal.closing .modal-dialog{transform:translate3d(0, 1rem, 0)}.Modal .modal-header,.Modal .modal-header-condensed{padding:1rem 1rem 0;display:flex;align-items:center;flex-shrink:0}.Modal .modal-title{font-size:1.25rem;font-weight:500;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis}.Modal .modal-title:not(:only-child){margin:0 1.3125rem}.Modal .modal-header-condensed{padding:.5rem 1.25rem 0 .9375rem !important}.Modal .modal-header-condensed .modal-action-button{font-size:0.875rem;height:2.25rem;width:auto;line-height:1.625rem;margin-left:auto;padding-left:1.25rem;padding-right:1.25rem;min-width:5rem}.Modal .modal-content{width:100%;flex-grow:1;padding:1rem;overflow-y:auto}.Modal .modal-content b,.Modal .modal-content strong{word-break:break-word}.Modal .modal-title,.Modal .modal-content,.Modal .modal-content>p{unicode-bidi:plaintext;text-align:initial}.Modal .dialog-buttons{display:flex;align-items:flex-end}.Modal .dialog-buttons .confirm-dialog-button+.confirm-dialog-button{margin-left:1rem}.Modal .confirm-dialog-button{width:auto;height:auto;margin-left:auto;text-align:right;font-weight:500;white-space:pre-wrap}\n",".ListItem{position:relative}.ListItem .ListItem-button{width:100%;background-color:var(--background-color);border:none !important;box-shadow:none !important;outline:none !important;display:flex;padding:1rem;position:relative;overflow:hidden;line-height:1.5rem;white-space:nowrap;color:var(--color-text);border-radius:var(--border-radius-default);--ripple-color: rgba(0, 0, 0, .08)}.ListItem .ListItem-button>i{font-size:1.5rem;margin-right:2rem;color:var(--color-text-secondary)}.ListItem .user-status,.ListItem .group-status,.ListItem .title,.ListItem .subtitle{text-align:initial;unicode-bidi:plaintext}.ListItem.multiline .ListItem-button>i{position:relative;top:.25rem}.ListItem.disabled{pointer-events:none}.ListItem.disabled .ListItem-button{opacity:0.5}.ListItem:not(.disabled):not(.is-static) .ListItem-button{cursor:pointer}@media (hover: hover){.ListItem:not(.disabled):not(.is-static) .ListItem-button:hover,.ListItem:not(.disabled):not(.is-static) .ListItem-button:focus{--background-color: var(--color-chat-hover)}}@media (max-width: 600px){.ListItem:not(.disabled):not(.is-static) .ListItem-button.active{--background-color: var(--color-chat-hover)}}@media (min-width: 600px){.ListItem:not(.has-ripple):not(.is-static) .ListItem-button:active,body.animation-level-0 .ListItem .ListItem-button:active{--background-color: var(--color-item-active) !important}}.ListItem.has-menu-open .ListItem-button{--background-color: var(--color-chat-hover)}.ListItem.narrow{margin-bottom:0.75rem}.ListItem.narrow .ListItem-button{padding:0.5rem 1rem}.ListItem.inactive{pointer-events:none}.ListItem.focus{--background-color: var(--color-chat-hover)}.ListItem.destructive .ListItem-button{color:var(--color-error)}.ListItem.destructive .ListItem-button i{color:inherit}.ListItem-context-menu{position:absolute}.ListItem-context-menu .bubble{width:auto}.ListItem-context-menu .bubble .MenuItem button{padding-left:1rem !important;padding-right:2rem !important}.ListItem.chat-item-clickable{margin:0 -0.5rem}body.is-ios .ListItem.chat-item-clickable,body.is-macos .ListItem.chat-item-clickable{--color-text-secondary: var(--color-text-secondary-apple)}.ListItem.chat-item-clickable .ListItem-button{padding:.5625rem .6975rem .5625rem .5625rem}.ListItem.chat-item-clickable .Avatar{flex-shrink:0;margin-right:0.5rem}.ListItem.chat-item-clickable .info{flex-grow:1;overflow:hidden}.ListItem.chat-item-clickable .title,.ListItem.chat-item-clickable .subtitle{overflow:hidden;display:flex;justify-content:flex-start;align-items:center}.ListItem.chat-item-clickable h3,.ListItem.chat-item-clickable .last-message,.ListItem.chat-item-clickable .status,.ListItem.chat-item-clickable .typing-status{font-size:1rem;line-height:1.6875rem;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:initial}.ListItem.chat-item-clickable .title h3{font-weight:500}.ListItem.chat-item-clickable .title .VerifiedIcon{width:1.25rem;height:1.25rem;margin-left:0.25rem}.ListItem.chat-item-clickable .title .emoji{vertical-align:text-bottom;background-position:0 0;flex-shrink:0}.ListItem.chat-item-clickable .contact-phone,.ListItem.chat-item-clickable .contact-username{font-size:0.875rem;line-height:1.25rem;color:var(--color-text-secondary)}.ListItem.chat-item-clickable .ChatInfo{display:flex;align-items:center;flex-grow:1;overflow:hidden}.ListItem.chat-item-clickable .ChatInfo .status,.ListItem.chat-item-clickable .ChatInfo .typing-status{font-size:0.875rem;line-height:1.25rem;color:var(--color-text-secondary);display:inline-block}.ListItem.chat-item-clickable .ChatInfo .status.online,.ListItem.chat-item-clickable .ChatInfo .typing-status.online{color:var(--color-primary)}.ListItem.chat-item-clickable .ChatInfo .status[dir=rtl],.ListItem.chat-item-clickable .ChatInfo .status[dir=auto],.ListItem.chat-item-clickable .ChatInfo .typing-status[dir=rtl],.ListItem.chat-item-clickable .ChatInfo .typing-status[dir=auto]{text-align:initial;width:100%}.ListItem.chat-item-clickable .ChatInfo .status .group-status:only-child,.ListItem.chat-item-clickable .ChatInfo .status .user-status:only-child,.ListItem.chat-item-clickable .ChatInfo .typing-status .group-status:only-child,.ListItem.chat-item-clickable .ChatInfo .typing-status .user-status:only-child{display:flow-root}.ListItem.chat-item-clickable .contact-phone,.ListItem.chat-item-clickable .contact-username,.ListItem.chat-item-clickable h3,.ListItem.chat-item-clickable .last-message,.ListItem.chat-item-clickable .status,.ListItem.chat-item-clickable .typing-status{text-align:initial;unicode-bidi:plaintext}body.is-ios .ListItem.chat-item-clickable .last-message,body.is-macos .ListItem.chat-item-clickable .last-message,body.is-ios .ListItem.chat-item-clickable .status,body.is-macos .ListItem.chat-item-clickable .status,body.is-ios .ListItem.chat-item-clickable .typing-status,body.is-macos .ListItem.chat-item-clickable .typing-status{font-size:.9375rem}.ListItem.chat-item-clickable[dir=rtl] .ListItem-button{padding:.5625rem .5625rem .5625rem .6975rem}.ListItem.chat-item-clickable[dir=rtl] .Avatar{margin-left:0.5rem;margin-right:0}.ListItem.chat-item-clickable[dir=rtl] .info>.status{width:100%}.ListItem.search-result-message .title{padding-right:.15rem}.ListItem.search-result-message h3{max-width:80%}.ListItem.search-result-message h3,.ListItem.search-result-message .subtitle{font-size:1rem;line-height:1.5rem;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:left}.ListItem.search-result-message .LastMessageMeta{margin-left:auto;margin-right:0}.ListItem.search-result-message .subtitle{color:var(--color-text-secondary);margin-right:2rem}.ListItem.search-result-message .subtitle .matching-text-highlight{color:var(--color-text);background:#CAE3F7;border-radius:0.25rem;padding:0 0.125rem}.ListItem.search-result-message[dir=rtl] .LastMessageMeta{margin-left:0;margin-right:auto}.ListItem.search-result-message[dir=rtl] .subtitle{margin-right:0;display:block}.ListItem.picker-list-item{margin:0}.ListItem.picker-list-item .ListItem-button{padding-left:0;display:flex;align-items:center}.ListItem.picker-list-item .Avatar{width:3rem;height:3rem}.ListItem.picker-list-item .Checkbox{flex-shrink:0;height:1.5rem;margin:0;padding-left:4rem}.ListItem.picker-list-item[dir=rtl] .Checkbox{padding-left:0;padding-right:4rem}.ListItem .multiline-item{white-space:initial;overflow:hidden}.ListItem .multiline-item .title,.ListItem .multiline-item .subtitle{display:block;text-align:initial}.ListItem .multiline-item .title{line-height:1.25rem;overflow:hidden;text-overflow:ellipsis}.ListItem .multiline-item .subtitle{font-size:0.875rem;line-height:1.5rem;color:var(--color-text-secondary)}.ListItem .multiline-item .subtitle+.subtitle{margin-top:-0.25rem}.ListItem .multiline-item .subtitle.black{color:var(--color-text)}.ListItem[dir=rtl] .ListItem-button>i{margin-left:2rem;margin-right:0}\n",".VerifiedIcon{display:inline-block;flex-shrink:0;width:1.5rem;height:1.5rem;background-image:url(icon-verified.a2a4fb48197a45cb301b64e39d1a8427.svg);background-repeat:no-repeat;background-size:100%;background-position:center}\n",".typing-status{display:flex;align-items:baseline}.typing-status .sender-name::after{content:'\\00a0';color:var(--color-text-secondary)}.typing-status .ellipsis{display:flex;width:1rem;overflow:hidden}.typing-status .ellipsis::after{content:'...';animation:typing-animation 1s steps(4, start) infinite}html[lang=ar] .typing-status .ellipsis::after,html[lang=fa] .typing-status .ellipsis::after{animation-name:typing-animation-rtl}@keyframes typing-animation{from{transform:translateX(-1rem)}}@keyframes typing-animation-rtl{from{transform:translateX(1rem)}}\n",".Notification-container{position:relative;width:24rem;max-width:100vw;margin:.25rem auto;z-index:var(--z-notification)}@media (min-width: 1276px){.Notification-container{transition:transform var(--layer-transition)}}.Notification-container:first-of-type{margin-top:4.25rem}.has-header-tools .Notification-container:first-of-type{margin-top:7.375rem}.Notification{background:rgba(32,32,32,0.8) url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48Y2lyY2xlIGZpbGw9IiNGRkYiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPjxjaXJjbGUgZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJub256ZXJvIiBjeD0iMTIiIGN5PSI2LjUiIHI9IjEuNSIvPjxwYXRoIGQ9Ik0xMiA5LjVjLS41NTIgMC0xIC4zNy0xIC44MjZ2Ny4zNDhjMCAuNDU2LjQ0OC44MjYgMSAuODI2czEtLjM3IDEtLjgyNnYtNy4zNDhjMC0uNDU2LS40NDgtLjgyNi0xLS44MjZ6IiBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L2c+PC9zdmc+\") no-repeat 0.9375rem 50%;background-size:1.5rem;border-radius:var(--border-radius-default);padding:.9375rem .9375rem .9375rem 3.375rem;color:#fff;margin:0 .5rem}.Notification .text-entity-link,.Notification .text-entity-link:hover,.Notification .text-entity-link:active{color:#fff !important;text-decoration:underline}.Notification .content{line-height:1.25;word-break:break-word;font-size:.9375rem}\n",".Radio{display:block;position:relative;padding-left:4.5rem;text-align:left;margin-bottom:1.5rem;line-height:1.5rem;cursor:pointer}.Radio.disabled{pointer-events:none;opacity:0.5}.Radio.hidden-widget{cursor:default}.Radio.hidden-widget .Radio-main::before,.Radio.hidden-widget .Radio-main::after{visibility:hidden}.Radio>input{position:absolute;z-index:var(--z-below);opacity:0}.Radio .Radio-main::before,.Radio .Radio-main::after{content:'';display:block;position:absolute;left:1.0625rem;top:50%;width:1.25rem;height:1.25rem;transform:translateY(-50%)}.Radio .Radio-main::before{border:2px solid var(--color-borders-input);border-radius:50%;background-color:var(--color-background);opacity:1;transition:border-color .1s ease, opacity .1s ease}.Radio .Radio-main::after{left:1.375rem;width:0.625rem;height:0.625rem;border-radius:50%;background:var(--color-primary);opacity:0;transition:opacity .1s ease}.Radio .Radio-main .label{display:block;word-break:break-word;unicode-bidi:plaintext;text-align:left}.Radio .Radio-main .subLabel{display:block;font-size:0.875rem;line-height:1rem;color:var(--color-text-secondary);unicode-bidi:plaintext}.Radio input:checked ~ .Radio-main::before{border-color:var(--color-primary)}.Radio input:checked ~ .Radio-main::after{opacity:1}.Radio.loading .Radio-main::before,.Radio.loading .Radio-main::after{opacity:0 !important}.Radio.loading .Spinner{position:absolute;left:1.0625rem;top:50%;transform:translateY(-50%);opacity:0;animation:fade-in .2s ease forwards;--spinner-size: 1.25rem}.Radio[dir=rtl]{padding-left:0;padding-right:4.5rem}.Radio[dir=rtl] .Radio-main{text-align:right}.Radio[dir=rtl] .Radio-main::before{left:auto;right:1.0625rem}.Radio[dir=rtl] .Radio-main::after{left:auto;right:1.375rem}.Radio[dir=rtl] .label,.Radio[dir=rtl] .subLabel{text-align:right}.Radio[dir=rtl].loading .Spinner{left:auto;right:1.0625rem}@keyframes fade-in{from{opacity:0}to{opacity:1}}\n",".Tab{flex:1 1 auto;-webkit-appearance:none;appearance:none;background:none;width:auto;margin:0;border:none;padding:.625rem .25rem;font-weight:500;color:var(--color-text-secondary);cursor:pointer;border-top-left-radius:var(--border-radius-messages-small);border-top-right-radius:var(--border-radius-messages-small)}.Tab,.Tab:active,.Tab:focus{outline:none}.Tab.active{cursor:default;color:var(--color-primary)}.Tab.active i{opacity:1}.Tab:not(.active):hover{background:var(--color-interactive-element-hover)}.Tab>span{position:relative;display:inline-flex;align-items:center}.Tab .badge{min-width:1.25rem;height:1.25rem;margin-inline-start:0.5rem;background:var(--color-gray);border-radius:0.75rem;padding:0 .3125rem;color:white;font-size:0.875rem;line-height:1.3125rem;font-weight:500;text-align:center;flex-shrink:0}body.is-ios .Tab .badge,body.is-macos .Tab .badge{line-height:1.25rem}.Tab .badge.active{background:var(--color-primary)}.Tab i{position:absolute;bottom:calc(-.625rem - 1px);left:0;opacity:0;background-color:var(--color-primary);height:.1875rem;width:100%;border-radius:.1875rem .1875rem 0 0;pointer-events:none;box-sizing:content-box;transform-origin:left}.Tab i.animate{transition:transform var(--slide-transition)}body.animation-level-0 .Tab i.animate{transition:none !important}\n",".TabList{position:sticky;top:0;flex-shrink:0;display:flex;justify-content:space-between;align-items:flex-end;font-size:.875rem;flex-wrap:nowrap;box-shadow:0 2px 2px var(--color-light-shadow);background-color:var(--color-background);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;scrollbar-color:rgba(0,0,0,0)}.TabList.big{font-size:1rem;--border-radius-messages-small: 0}.TabList::-webkit-scrollbar{height:0}.TabList::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0)}\n",".DeleteChatModal .modal-dialog{max-width:20rem}.DeleteChatModal .modal-header{padding:1.125rem 1.25rem 0}.DeleteChatModal .modal-title:not(:only-child){margin:0 0 0 .75rem}.DeleteChatModal .modal-content{padding:.5rem 1.25rem}.DeleteChatModal .confirm-dialog-button{margin-right:-.625rem}\n",".SearchInput{position:relative;width:100%;color:rgba(var(--color-text-secondary-rgb), 0.5);background-color:var(--color-chat-hover);border:2px solid var(--color-chat-hover);border-radius:1.375rem;transition:border-color 0.15s ease}.SearchInput.with-picker-item{display:flex}.SearchInput.with-picker-item .icon-search{display:none}.SearchInput.with-picker-item input{padding-left:.5rem}.SearchInput.with-picker-item[dir=rtl] input{padding-right:.5rem;padding-left:0}.SearchInput.has-focus{border-color:var(--color-primary);caret-color:var(--color-primary);background-color:var(--color-background)}.SearchInput.has-focus input+i{color:var(--color-primary)}.SearchInput input{height:2.5rem;margin-bottom:0;border:none !important;border-radius:1.375rem;background-color:transparent !important;box-shadow:none !important;padding:calc(0.4375rem - var(--border-width)) calc(2.625rem - var(--border-width)) calc(0.5rem - var(--border-width)) calc(2.625rem - var(--border-width))}.SearchInput input::placeholder{color:var(--color-placeholders)}.SearchInput>i{position:absolute;top:.5rem;left:.75rem;font-size:1.5rem}.SearchInput .Loading{position:absolute;top:.5rem;right:.5rem;height:1.5rem}.SearchInput .Loading .Spinner{--spinner-size: 1.5rem}.SearchInput .Button{position:absolute;top:.125rem;right:.125rem;font-size:1rem}@media (max-width: 600px){.SearchInput input{height:2.5rem;border-radius:1.25rem;padding-left:calc(2.625rem - var(--border-width))}.SearchInput i{top:0.5rem}}.SearchInput[dir=rtl] input{direction:rtl}.SearchInput[dir=rtl]>i{left:auto;right:.75rem}.SearchInput[dir=rtl] .Loading{left:.5rem;right:auto}.SearchInput[dir=rtl] .Button{left:.125rem;right:auto}\n",".PickerSelectedItem{display:flex;align-items:center;background:var(--color-chat-hover);height:2rem;min-width:2rem;margin-left:0.5rem;margin-bottom:0.5rem;padding-right:1rem;border-radius:1rem;cursor:pointer;position:relative;overflow:hidden;flex-shrink:1;transition:background-color .15s ease;max-width:calc(50% - 0.5rem)}.PickerSelectedItem.minimized{padding-right:0}.PickerSelectedItem:hover{background-color:var(--color-item-active)}.PickerSelectedItem.closeable:hover{background-color:rgba(var(--color-error-rgb), 0.16)}.PickerSelectedItem.closeable:hover .item-remove{opacity:1}.PickerSelectedItem.closeable:hover .Avatar,.PickerSelectedItem.closeable:hover .item-icon{opacity:0}.PickerSelectedItem.search-date .item-remove{background:var(--color-primary)}.PickerSelectedItem.search-date:hover{background:var(--color-chat-hover)}.PickerSelectedItem.search-date .item-name{font-size:0.875rem}.SearchInput .PickerSelectedItem{flex:1 0 auto;position:relative;top:.25rem;left:-.125rem;color:var(--color-text-secondary)}.PickerSelectedItem .Avatar,.PickerSelectedItem .item-icon{width:2rem;height:2rem;opacity:1;flex-shrink:0;transition:opacity .15s ease}.PickerSelectedItem .Avatar i,.PickerSelectedItem .item-icon i{font-size:2rem}.PickerSelectedItem .item-icon{display:flex;align-items:center;justify-content:center;padding:0.375rem;border-radius:50%;background-color:var(--color-primary);color:white}.PickerSelectedItem .item-icon i{font-size:1.25rem;position:relative;top:-1px}.PickerSelectedItem .item-name{margin-left:0.5rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.PickerSelectedItem .item-name .emoji.emoji-small{width:1.125rem;height:1.125rem;background-size:1.125rem;vertical-align:-2px}.PickerSelectedItem .item-remove{position:absolute;left:0;top:0;width:2rem;height:2rem;border-radius:50%;display:flex;align-items:center;justify-content:center;background-color:var(--color-error);font-size:1.5rem;color:white;opacity:0;transition:opacity .15s ease}.PickerSelectedItem[dir=rtl]{padding-left:1rem;padding-right:0}.PickerSelectedItem[dir=rtl].minimized{padding-right:0;padding-left:0}.SearchInput .PickerSelectedItem[dir=rtl]{left:auto;right:-.125rem}.PickerSelectedItem[dir=rtl] .item-name{margin-left:0;margin-right:0.5rem}.PickerSelectedItem[dir=rtl] .item-remove{left:auto;right:0}\n",".MessageOutgoingStatus{width:1.19rem;height:1.19rem;overflow:hidden;display:inline-block;line-height:1;font-size:1.1875rem}.MessageOutgoingStatus i{background:var(--background-color)}.MessageOutgoingStatus .icon-message-succeeded{padding-left:0.13rem}.MessageOutgoingStatus .Transition{width:100%;height:100%}\n",".LastMessageMeta{margin-right:.2rem;padding:.3rem 0 .15rem;flex-shrink:0;font-size:0.75rem;line-height:1;display:flex;align-items:center}.LastMessageMeta .MessageOutgoingStatus{color:var(--color-text-meta-colored);margin-right:0.1rem;font-size:1.15rem}body.is-ios .LastMessageMeta .MessageOutgoingStatus{margin-bottom:-.125rem}.LastMessageMeta .time{color:var(--color-text-meta);line-height:1.15rem}\n",".Badge-transition{opacity:1;transition:transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1)}.Badge-transition:not(.open){transform:scale(0);opacity:0}.Badge-transition:not(.shown){display:none}.Badge-transition.closing{transition:transform .2s ease-out, opacity .2s ease-out}.Badge-wrapper{display:flex}.Badge-wrapper .Badge{margin-inline-start:.5rem}.Badge{min-width:1.5rem;height:1.5rem;background:var(--color-gray);border-radius:0.75rem;padding:0 .4375rem;color:white;font-size:0.875rem;line-height:1.5625rem;font-weight:500;text-align:center;flex-shrink:0}body.is-macos .Badge{line-height:1.5rem}body.is-ios .Badge{line-height:1.375rem;min-width:1.375rem;height:1.375rem;padding:0 .375rem}.Badge.mention,.Badge.unread:not(.muted){background:var(--color-green);color:var(--color-white)}.Badge.pinned:not(.unread){color:var(--color-pinned);background:transparent;width:1.5rem;padding:0}.Badge.pinned:not(.unread) i{font-size:1.5rem}.Badge.mention{width:1.5rem;padding:0.25rem}.Badge.mention i{font-size:1rem;vertical-align:super}body.is-ios .Badge.mention{width:1.375rem;padding:0.25rem}body.is-ios .Badge.mention i{font-size:.875rem}\n",".Chat{--background-color: var(--color-background);position:absolute;top:0;left:0;margin:0;width:100%}body.is-ios .Chat,body.is-macos .Chat{--color-text-meta: var(--color-text-meta-apple)}.Chat.animate-opacity{will-change:opacity;transition:opacity .2s ease-out}.Chat.animate-transform{will-change:transform;transition:transform .2s ease-out}.Chat:hover .Avatar.online::after,.Chat.ListItem.has-menu-open .Avatar.online::after{border-color:var(--color-chat-hover)}@media (max-width: 600px){.Chat.selected{--background-color: var(--color-chat-hover) !important}.Chat.selected .Avatar.online::after{border-color:var(--color-chat-hover)}}@media (min-width: 600px){.Chat.selected,.Chat.selected:hover{--background-color: var(--color-chat-active) !important}.Chat.selected .Avatar.online::after,.Chat.selected:hover .Avatar.online::after{border-color:var(--color-chat-active) !important;background:var(--color-white)}.Chat.selected .ListItem-button,.Chat.selected:hover .ListItem-button{--background-color: var(--color-chat-active) !important;--color-text: var(--color-white);--color-text-meta-colored: var(--color-white);--color-text-meta: var(--color-white);--color-text-secondary: var(--color-white);--color-error: var(--color-white);--color-pinned: var(--color-white)}.Chat.selected .icon-muted-chat,.Chat.selected:hover .icon-muted-chat{color:var(--color-white) !important}.Chat.selected .Badge:not(.pinned),.Chat.selected:hover .Badge:not(.pinned){background:var(--color-white);color:var(--color-chat-active)}}.Chat .status{flex-shrink:0}.Chat .info .title,.Chat .info .subtitle{padding-right:.125rem}.Chat .info .subtitle{margin-top:-.125rem}.Chat .info h3{width:auto;max-width:80%}.Chat .info .icon-muted-chat{font-size:1.25rem;margin-left:0.25rem;margin-top:-.0625rem;color:#C6C8CA}body.is-ios .Chat .info .icon-muted-chat{margin-top:0;margin-right:.5rem}.Chat .info .LastMessageMeta{margin-left:auto}body.is-ios .Chat .info .LastMessageMeta{font-size:.875rem;margin-right:0}.Chat .info .last-message,.Chat .info .typing-status{padding-right:0.25rem;flex-grow:1;color:var(--color-text-secondary);unicode-bidi:plaintext}.Chat .info .last-message[dir=ltr],.Chat .info .typing-status[dir=ltr]{text-align:left}.Chat .info .last-message .sender-name,.Chat .info .typing-status .sender-name{color:var(--color-text)}.Chat .info .last-message .draft,.Chat .info .typing-status .draft{color:var(--color-error)}.Chat .info .last-message .draft::after{content:': '}.Chat .info .last-message .colon{margin-inline-end:.25rem}.Chat .info .last-message img{width:1.25rem;height:1.25rem;object-fit:cover;border-radius:.125rem;vertical-align:-.25rem;margin-inline-end:.25rem}body.is-ios .Chat .info .last-message img{width:1.125rem;height:1.125rem;vertical-align:-.1875rem}.Chat .info .last-message img.round{border-radius:.625rem}.Chat .info .last-message .emoji-small{width:1rem;height:1rem;vertical-align:-.125rem}.Chat .info .last-message .icon-play{position:relative;display:inline-block;font-size:.75rem;color:#fff;margin-inline-start:-1.25rem;margin-inline-end:0.5rem;bottom:0.0625rem}body.is-ios .Chat .info .last-message .icon-play{margin-inline-start:-1.125rem;bottom:0}.Chat[dir=rtl] .info .LastMessageMeta{margin-left:0;margin-right:auto}.Chat[dir=rtl] .info .title,.Chat[dir=rtl] .info .subtitle{padding-left:.15rem;padding-right:0}.Chat[dir=rtl] .info .icon-muted-chat{margin-left:0;margin-right:0.25rem}.Chat[dir=rtl] .info .last-message,.Chat[dir=rtl] .info .typing-status{padding-left:0.5rem;padding-right:0;text-align:right;unicode-bidi:plaintext}\n",".AnimatedEmoji{margin-bottom:0.75rem}.AnimatedEmoji img{position:absolute;width:100%;height:100%}.AnimatedEmoji img.like-sticker-thumb{transform:scale(0.8)}\n",".EmptyFolder{width:100%;height:80%;display:flex;align-items:center;justify-content:center;flex-direction:column}@media (max-height: 480px){.EmptyFolder{height:100%}}.EmptyFolder .sticker{height:8rem;margin-bottom:1.875rem}.EmptyFolder .title{font-size:1.25rem;margin-bottom:.125rem}.EmptyFolder .description{font-size:.875rem;color:var(--color-text-secondary)}body.is-ios .EmptyFolder .description,body.is-macos .EmptyFolder .description{color:var(--color-text-secondary-apple)}.EmptyFolder .Button.pill{margin-top:.625rem;font-weight:500;padding-inline-start:.75rem;unicode-bidi:plaintext}.EmptyFolder .Button.pill i{margin-inline-end:.625rem;font-size:1.5rem}\n",".NothingFound{display:flex;align-items:center;justify-content:center;color:var(--color-text-meta)}.NothingFound.with-description{flex-direction:column}.NothingFound .AnimatedSticker{margin:0 auto}.NothingFound .description{color:var(--color-text-secondary);font-size:.875rem;text-align:center;margin:1rem 0 0;unicode-bidi:plaintext}\n",".Media{height:0;padding-bottom:100%;overflow:hidden;position:relative;cursor:pointer}.Media .video-duration{position:absolute;left:.25rem;top:.25rem;background:rgba(0,0,0,0.25);color:#fff;font-size:.75rem;padding:0 .3125rem;border-radius:.1875rem;line-height:1.125rem}.Media img{position:absolute;left:0;top:0;width:100%;height:100%;object-fit:cover}\n",".WebLink{min-height:3rem;padding:.25rem 0 0 3.75rem;font-size:0.875rem;line-height:1.125rem;position:relative}.WebLink+.WebLink{margin-top:1.5rem}.WebLink.without-media::before{content:attr(data-initial);width:3rem;height:3rem;position:absolute;left:0;top:0;background-color:var(--color-webpage-initial-background);color:#fff;display:flex;align-items:center;justify-content:center;border-radius:var(--border-radius-messages-small);text-transform:uppercase;font-weight:500;font-size:1.5rem}.WebLink .Media{position:absolute;left:0;top:0;width:3rem;height:3rem;cursor:default !important;padding-bottom:unset !important;border-radius:var(--border-radius-messages-small) !important}.WebLink .site-name,.WebLink .site-description,.WebLink .site-title{word-break:break-word;text-align:initial}.WebLink .site-name{display:block;color:var(--color-links);font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.WebLink .site-title{font-size:1rem;font-weight:400;margin-bottom:.0625rem;line-height:1.3125rem}.WebLink .sender-name,.WebLink .site-description{margin-bottom:0;color:var(--color-text-secondary);line-height:1.125rem;max-height:2.25rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.WebLink .sender-name{margin-top:.25rem}.WebLink .site-description .emoji{width:1rem !important;height:1rem !important}.WebLink[dir=rtl]{padding:.25rem 3.75rem 0 0}.WebLink[dir=rtl] .Media,.WebLink[dir=rtl].without-media::before{left:auto;right:0}.WebLink[dir=rtl] .content{text-align:right}\n",".File{--secondary-color: var(--color-text-secondary);display:flex;align-items:center}.Message.own .File{--secondary-color: var(--color-text-green)}.content-inner .File{min-width:14rem}@media (max-width: 340px){.content-inner .File{min-width:11rem}}.File .file-icon-container{position:relative}.File .file-progress,.File .file-icon,.File .file-preview{width:3.375rem;height:3.375rem;margin-inline-end:.75rem;border-radius:var(--border-radius-messages-small);background:var(--color-primary);display:flex;align-items:center;justify-content:center}.File .file-progress{position:absolute;top:0;left:0}.File .file-icon{padding:1rem .75rem .5rem;align-items:flex-end;flex-shrink:0;position:relative;color:white}.File .file-icon .file-ext{font-size:1rem;font-weight:500;transition:opacity .15s}.File .file-icon::after{content:\"\";display:block;position:absolute;top:0;right:0;border-bottom-left-radius:0.25rem;background:rgba(0,0,0,0.25);border-color:transparent var(--background-color) transparent var(--background-color);border-width:0 1.125rem 1.125rem 0;border-style:solid;transition:border-width .15s ease-in}.File .file-preview{background:transparent;overflow:hidden}.File .file-preview+.action-icon,.File .file-preview+.file-progress{background:rgba(0,0,0,0.5);border-radius:var(--border-radius-messages-small)}.File .file-preview img{object-fit:cover}.File .action-icon{color:#fff;font-size:1.5rem;position:absolute;top:0;start:0;width:3.375rem;height:3.375rem;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.File.interactive .file-icon-container{cursor:pointer}.File.interactive .file-icon-container:hover .file-icon::after{border-width:0}.File.interactive .file-icon-container:hover .action-icon{opacity:1}.File.interactive .file-icon-container:hover .action-icon.hidden{opacity:0}.File.interactive .file-icon-container:hover .file-ext{opacity:0}.File .file-info{margin-top:.1875rem;margin-right:.125rem;white-space:nowrap;overflow:hidden;flex-grow:1}.File .file-info+.Link{font-size:.75rem;color:var(--color-text-secondary);padding-left:1rem;white-space:nowrap}.File .file-title{font-size:1rem;line-height:1.5rem;font-weight:500;overflow:hidden;text-overflow:ellipsis}.File .file-title .emoji{vertical-align:-4px}.File .file-subtitle{font-size:.875rem;line-height:.9375rem;color:var(--secondary-color);max-width:100%;overflow:hidden;text-overflow:ellipsis}.File .file-subtitle span+span::before{content:'\\00a0\\2022\\00a0'}.File.smaller{--background-color: var(--color-background);--border-radius-messages-small: .3125rem}.File.smaller .action-icon,.File.smaller .file-progress,.File.smaller .file-icon,.File.smaller .file-preview{width:3rem;height:3rem}.File.smaller .file-icon{padding-bottom:.375rem}.File.smaller .file-icon::after{border-width:0 1rem 1rem 0}.File.smaller .file-info{margin-top:-.125rem}.File.smaller .file-title{font-weight:400}.File.smaller .file-subtitle{line-height:1rem}.File:dir(rtl) .file-progress,.File:dir(rtl) .file-icon,.File:dir(rtl) .file-preview,.File[dir=rtl] .file-progress,.File[dir=rtl] .file-icon,.File[dir=rtl] .file-preview{margin-left:.75rem;margin-right:0}.File:dir(rtl) .file-info,.File[dir=rtl] .file-info{text-align:right}.File:dir(rtl) .file-info+.Link,.File[dir=rtl] .file-info+.Link{padding-left:0;padding-right:1rem}.File:dir(rtl) .action-icon,.File[dir=rtl] .action-icon{left:auto;right:0}.File .file-progress.red,.File .file-icon.red{background-color:var(--color-error)}.File .file-progress.orange,.File .file-icon.orange{background-color:var(--color-warning)}.File .file-progress.green,.File .file-icon.green{background-color:var(--color-text-green)}\n",".Audio{display:flex;align-items:flex-start}.Audio.media-inner{overflow:visible}.Audio.own{--color-text-secondary: var(--accent-color);--color-interactive-active: var(--color-text-green);--color-interactive-inactive: rgba(var(--color-text-green-rgb), 0.4);--color-interactive-buffered: rgba(var(--color-text-green-rgb), 0.4)}.theme-dark .Audio.own{--color-text-green-rgb: 255, 255, 255;--color-text-green: var(--color-white)}.Audio.own .Button{--color-primary: var(--color-text-green);--color-primary-shade: var(--color-green);--color-primary-shade-darker: var(--color-green-darker);--color-white: var(--color-background-own)}.theme-dark .Audio.own .Button{--color-primary-shade: #fff;--color-primary-shade-darker: #fff}.Audio .toggle-play{margin-inline-end:.5rem}.Audio .toggle-play.smaller{width:3rem;height:3rem;margin-inline-end:.75rem}.Audio .toggle-play.smaller i{font-size:1.625rem;margin-top:-.025rem}.Audio .toggle-play i{position:absolute}.Audio .toggle-play i.icon-play{margin-left:.125rem}@media (max-width: 600px){.Audio .toggle-play i.icon-play{margin-left:.0625rem}}.Audio .toggle-play .icon-play,.Audio .toggle-play .icon-pause{opacity:1;transform:scale(1);transition:opacity 0.4s,transform 0.6s cubic-bezier(0.34, 1.56, 0.64, 1)}.Audio .toggle-play.play .icon-pause,.Audio .toggle-play.pause .icon-play,.Audio .toggle-play.loading .icon-play,.Audio .toggle-play.loading .icon-pause{opacity:0;transform:scale(0.5)}.Audio .media-loading{pointer-events:none}.Audio .media-loading .interactive{pointer-events:auto}.Audio .download-button{position:absolute;width:1.125rem !important;height:1.125rem !important;padding:0;left:1.5rem;top:1.5rem;border:0.125rem solid var(--background-color);z-index:1}.Audio .download-button i{font-size:0.8125rem}.Audio.bigger .download-button{left:2rem;top:2rem;border:0.125rem solid var(--color-background)}.Audio .content{align-self:center;min-width:0;flex-grow:1;text-align:initial}.Audio .content-row{display:flex;justify-content:space-between}.Audio .title{font-weight:500;margin:0;line-height:1.25;overflow:hidden;text-overflow:ellipsis}.Audio .voice-duration{margin:.25rem 0 0;font-size:.875rem;color:var(--color-text-secondary)}.Audio .voice-duration span{margin-left:0.25rem;font-size:1.5rem;line-height:.875rem;vertical-align:middle}.Audio:not(.own) .voice-duration span{color:var(--color-primary)}.Audio .waveform{cursor:pointer;margin-left:1px}.Audio .meta,.Audio .performer,.Audio .date{font-size:.875rem;line-height:1;color:var(--color-text-secondary);margin:0}.Audio .duration{margin:.1875rem 0 0;font-size:.875rem;color:var(--color-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.Audio .seekline{width:calc(100% - 2px);padding-left:6px;margin-bottom:.3125rem;height:12px;position:relative;margin-left:-6px;top:1px;cursor:pointer}.Audio .seekline::before{content:'';position:absolute;width:100%;left:6px;top:6px;height:2px;background-color:var(--color-interactive-inactive);border-radius:2px}.Audio .seekline-buffered-progress,.Audio .seekline-play-progress{position:absolute;height:2px;border-radius:2px;overflow:hidden;width:100%;top:6px;left:6px}.Audio .seekline-buffered-progress i,.Audio .seekline-play-progress i{position:absolute;width:100%;background-color:var(--color-interactive-active);height:2px;border-radius:2px;right:100%}.Audio .seekline-buffered-progress i{background-color:var(--color-interactive-buffered) !important}.Audio .seekline-thumb{position:absolute;width:100%;top:7px;left:0}.Audio .seekline-thumb i{pointer-events:none;position:absolute;width:100%;right:100%}.Audio .seekline-thumb i::after{content:'';position:absolute;top:-6px;right:-12px;width:12px;height:12px;border-radius:6px;background:var(--color-interactive-active)}.Audio.bigger .content{margin-top:.1875rem}.Audio.bigger .title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:400;line-height:1.5rem}.Audio.bigger .meta,.Audio.bigger .performer,.Audio.bigger .date{line-height:1.0625rem}.Audio.bigger .seekline{top:2px;margin-bottom:.5rem}.Audio.bigger .duration{line-height:1rem}.Audio.bigger .media-loading{top:0.1875rem;left:0.1875rem}.Audio.bigger[dir=rtl] .media-loading{left:auto !important;right:0}.Audio .ProgressSpinner.size-s svg{width:2.25rem;height:2.25rem}.Audio[dir=rtl] .toggle-play{margin-left:.5rem;margin-right:0}.Audio[dir=rtl] .toggle-play.smaller{margin-left:.75rem;margin-right:0}.Audio[dir=rtl] .content,.Audio[dir=rtl] .duration{text-align:right}.Audio[dir=rtl] .download-button{left:auto;right:1.5rem}\n",".DropTarget{border-radius:var(--border-radius-default);background:var(--color-background);padding:1.25rem;flex:1 1 auto;width:100%;max-width:43.75rem;margin-left:auto;margin-right:auto;margin-bottom:.3125rem;display:flex;color:#A4ACB3;box-shadow:0 1px 2px var(--color-default-shadow)}@media (max-height: 350px){.DropTarget{padding:.75rem}}.DropTarget.hovered .target-content{color:var(--color-primary);background-image:var(--drag-target-border-hovered)}.DropTarget+.DropTarget{margin-top:.3125rem}.DropTarget:last-child{margin-bottom:0}.DropTarget .target-content{pointer-events:none;background-image:var(--drag-target-border);border-radius:.5rem;flex:1 1 100%;display:flex;flex-direction:column;align-items:center;justify-content:center;transition:.2s color, .2s background}.DropTarget .icon{font-size:6.25rem;line-height:4.6875rem;margin-bottom:2.25rem}@media (max-height: 520px){.DropTarget .icon{font-size:4.25rem;line-height:3.5rem;margin-bottom:1rem}}@media (max-height: 450px){.DropTarget .icon{font-size:2rem;line-height:1rem;margin-bottom:.5rem;margin-top:.25rem}}.DropTarget .title{font-size:1.3125rem;font-weight:500;letter-spacing:-.18px}@media (max-height: 450px){.DropTarget .title{font-size:1rem}}.DropTarget .description{font-size:1rem;letter-spacing:.3px}@media (max-height: 450px){.DropTarget .description{font-size:.875rem}}\n",".FloatingActionButton{position:absolute;right:1rem;bottom:1rem;transform:translateY(5rem);transition:transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1)}body.animation-level-0 .FloatingActionButton{transition:none !important}.FloatingActionButton.revealed{transform:translateY(0)}\n",".DropArea{position:absolute;top:0;right:0;left:0;height:100vh;z-index:var(--z-drop-area);padding:80px 20px 20px;display:flex;flex-direction:column}#Main.right-column-open .DropArea{max-width:calc(100% - var(--right-column-width))}\n",".StickerButton{display:inline-block;width:4rem;height:4rem;margin:0.5rem;border-radius:var(--border-radius-messages-small);background:transparent no-repeat center;background-size:contain;cursor:pointer;transition:background-color .15s ease, opacity .3s ease !important;position:relative}@media (max-width: 600px){.StickerButton{margin:0.25rem}}.StickerButton.set-button{width:2.75rem !important;height:2.75rem;margin:0 0.5rem}.StickerButton.large{width:10rem;height:10rem;margin:0}.StickerButton .AnimatedSticker,.StickerButton img{position:absolute;top:0;left:0;width:100%;height:100%}.StickerButton img{object-fit:contain}.StickerButton .sticker-unfave-button{position:absolute;top:-0.5rem;right:-0.5rem;width:1.25rem;height:1.25rem;padding:0.125rem;opacity:0}.StickerButton .sticker-unfave-button i{font-size:1rem}.StickerButton:hover{background-color:var(--color-interactive-element-hover)}.StickerButton:hover .sticker-unfave-button{opacity:1}\n",".TextFormatter{transform:translate(-50%, -3.25rem)}.TextFormatter,.TextFormatter-link-control{position:absolute;background:var(--color-background);border-radius:var(--border-radius-messages);padding:0.5rem 0.375rem;box-shadow:0 1px 2px var(--color-default-shadow)}.TextFormatter-link-control{left:0;top:0;opacity:0;pointer-events:none;transition:opacity .3s ease}.Modal .TextFormatter-link-control{max-width:100%}@media (max-width: 600px){.TextFormatter-link-control{max-width:calc(100vw - var(--text-formatter-left) + 3rem)}}.TextFormatter-link-control input{border:none !important;outline:none !important;width:100%;color:var(--color-text);background-color:var(--color-background)}.TextFormatter-buttons,.TextFormatter-link-url-confirm{display:flex;flex-wrap:nowrap;align-items:center}.TextFormatter-divider{width:1px;height:1.75rem;margin:0 0.25rem;background-color:var(--color-borders)}.TextFormatter-link-url-input-wrapper{width:20rem;position:relative;max-width:100%}@media (max-width: 600px){.TextFormatter-link-url-input-wrapper{max-width:90vw}}.TextFormatter-link-url-input-wrapper::before,.TextFormatter-link-url-input-wrapper::after{content:\"\";display:block;position:absolute;top:0;bottom:0;width:1rem;z-index:2;opacity:0;transition:opacity .2s ease}.TextFormatter-link-url-input-wrapper::before{left:0;background:linear-gradient(to right, var(--color-background) 0.25rem, transparent 1rem)}.TextFormatter-link-url-input-wrapper::after{right:0;background:linear-gradient(to left, var(--color-background) 0.25rem, transparent 1rem)}.TextFormatter-link-url-input-wrapper.mask-left::before{opacity:1}.TextFormatter-link-url-input-wrapper.mask-right::after{opacity:1}.TextFormatter-link-url-confirm{flex-shrink:0;opacity:0;transition:opacity .3s ease}.TextFormatter-link-url-confirm.shown{opacity:1}.TextFormatter.link-control-shown .TextFormatter-link-control{opacity:1;pointer-events:all}.TextFormatter .Button{width:2rem;height:2rem;padding:0.25rem;font-size:1.5rem;margin:0 0.125rem;border-radius:var(--border-radius-messages-small);flex-shrink:0;cursor:pointer}.TextFormatter .Button.active{background-color:var(--color-primary) !important;color:white}.TextFormatter .Button.disabled{opacity:.5;pointer-events:none}\n",".Picker{height:100%;display:flex;flex-direction:column;overflow:hidden}.Picker .picker-header{padding:0 1rem 0.25rem 0.75rem;border-bottom:1px solid var(--color-borders);display:flex;flex-flow:row wrap;flex-shrink:0;overflow-y:auto;max-height:20rem}.Picker .picker-header .input-group{margin-bottom:0.5rem;margin-left:0.5rem;flex-grow:1}.Picker .picker-header .form-control{height:2rem;border:none;border-radius:0;padding:0;box-shadow:none}.Picker .picker-list{flex-grow:1;overflow-y:auto;overflow-x:hidden;padding:0.5rem}@media (max-width: 600px){.Picker .picker-list{padding-left:0 !important;padding-right:0 !important}}.Picker .no-results{height:100%;margin:0;padding:1rem 1rem;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary)}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/0.d8fb0ed03b2b879a4243.js b/dist/0.d8fb0ed03b2b879a4243.js new file mode 100644 index 000000000..6510c6723 --- /dev/null +++ b/dist/0.d8fb0ed03b2b879a4243.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],Array(108).concat([function(e,t,n){"use strict";var a=n(0),r=n(6),c=n(10),i=n(9),s=n(150),o=n(182),l=n(25),d=n(16),u=n(44),m=n(55),b=n(43);n(216);t.a=e=>{const{ref:t,buttonRef:n,icon:h,className:f,style:p,children:O,disabled:g,ripple:v,narrow:j,inactive:E,focus:y,destructive:C,multiline:N,isStatic:T,contextActions:w,onClick:I}=e;let M=Object(a.q)(null);t&&(M=t);const[k,S,L]=Object(l.a)(),{isContextMenuOpen:A,contextMenuPosition:x,handleBeforeContextMenu:D,handleContextMenu:R,handleContextMenuClose:F,handleContextMenuHide:_}=Object(s.a)(M,!w),P=Object(a.m)(()=>M.current,[]),U=Object(a.m)(()=>M.current.closest(".custom-scroll"),[]),B=Object(a.m)(()=>M.current.querySelector(".ListItem-context-menu .bubble"),[]),{positionX:q,positionY:H,style:$}=Object(o.a)(x,P,U,B),K=Object(a.m)(e=>{!g&&I&&(I(e),r.n&&!v&&(S(),Object(c.b)(L)))},[g,S,I,v,L]),z=Object(a.m)(e=>{E||r.n||(!w||2!==e.button&&I||D(e),0===e.button&&(I?K(e):R(e)))},[E,w,I,D,R,K]),V=Object(d.a)(),Y=Object(i.a)("ListItem",f,!T&&"no-selection",v&&"has-ripple",j&&"narrow",g&&"disabled",E&&"inactive",x&&"has-menu-open",y&&"focus",C&&"destructive",N&&"multiline",T&&"is-static");return a.a.createElement("div",{ref:M,className:Y,dir:V.isRtl?"rtl":void 0,style:p},a.a.createElement("div",{className:Object(i.a)("ListItem-button",k&&"active"),role:"button",ref:n,tabIndex:0,onClick:!E&&r.n?K:void 0,onMouseDown:z,onContextMenu:!E&&w?R:void 0},h&&a.a.createElement("i",{className:"icon-"+h}),N&&a.a.createElement("div",{className:"multiline-item"},O),!N&&O,!g&&!E&&v&&a.a.createElement(u.a,null)),w&&void 0!==x&&a.a.createElement(m.a,{isOpen:A,positionX:q,positionY:H,style:$,className:"ListItem-context-menu",autoClose:!0,onClose:F,onCloseAnimationEnd:_},w.map(e=>a.a.createElement(b.a,{key:e.title,icon:e.icon,destructive:e.destructive,disabled:!e.handler,onClick:e.handler},e.title))))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"b",(function(){return o}));var a=n(0),r=n(10),c=n(37);function i({rootRef:e,throttleMs:t,debounceMs:n,shouldSkipFirst:i,margin:s,threshold:o,isDisabled:l},d){const u=Object(a.q)(),m=Object(a.q)(),b=Object(a.q)(0),h=Object(a.q)();m.current=d;const f=Object(a.m)(()=>{b.current++},[]),p=Object(a.m)(()=>{b.current&&(b.current--,!b.current&&h.current&&(h.current(),h.current=void 0))},[]);Object(c.c)(f,p),Object(a.n)(()=>{if(!l)return()=>{u.current&&(u.current.observer.disconnect(),u.current.callbacks.clear(),u.current=void 0)}},[l]);return{observe:Object(a.m)((a,c)=>{u.current||function(){const a=new Map,c=new Map,l=()=>{const e=Array.from(c.values());e.forEach(t=>{const n=a.get(t.target);n&&n(t,e)}),m.current&&m.current(e),c.clear()},d=t?r.h:n?r.a:void 0,f=d?d(l,t||n,!i):l,p=new IntersectionObserver(e=>{e.forEach(e=>{c.set(e.target,e)}),b.current?h.current=()=>{f()}:f()},{root:e.current,rootMargin:s?s+"px":void 0,threshold:o});u.current={observer:p,callbacks:a}}();const l=u.current;return l.observer.observe(a),c&&l.callbacks.set(a,c),()=>{c&&l.callbacks.delete(a),l.observer.unobserve(a)}},[l]),freeze:f,unfreeze:p}}function s(e,t,n){Object(a.n)(()=>t?t(e.current,n):void 0,[])}function o(e,t,n){const[r,c]=Object(a.r)(!t);return s(e,t,e=>{c(e.isIntersecting),n&&n(e)}),r}},function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(57),i=n(31);t.a=(e,t=!1,n=r.ApiMediaFormat.BlobUrl,s,o)=>{const l=e?c.c(e):void 0,d=Object(i.a)();return Object(a.n)(()=>{if(!t&&e&&!l){const t=Date.now();c.b(e,n).then(()=>{const e=Date.now()-t;!o||e>=o?d():setTimeout(d,o-e)})}},[t,e,l,n,s,d,o]),l}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(13),i=n(7),s=n(4),o=n(22),l=n(3),d=n(16),u=n(114),m=n(138),b=n(161);t.a=Object(a.h)(Object(r.h)((e,{userId:t,forceShowSelf:n})=>{const{lastSyncTime:a,serverTimeOffset:r}=e,c=Object(i.Jb)(e,t);return{lastSyncTime:a,user:c,isSavedMessages:!n&&c&&c.isSelf,areMessagesLoaded:Boolean(Object(i.n)(e,t)),serverTimeOffset:r}},(e,t)=>Object(l.l)(t,["loadFullUser","openMediaViewer"]))(({typingStatus:e,avatarSize:t="medium",status:n,withMediaViewer:r,withUsername:i,withFullInfo:l,withUpdatingStatus:h,noStatusOrTyping:f,noRtl:p,user:O,isSavedMessages:g,areMessagesLoaded:v,lastSyncTime:j,loadFullUser:E,openMediaViewer:y,serverTimeOffset:C})=>{const{id:N}=O||{},T=Object(s.bb)(O);Object(a.n)(()=>{l&&j&&N&&E({userId:N})},[N,E,j,l]);const w=Object(a.m)((e,n)=>{O&&n&&(e.stopPropagation(),y({avatarOwnerId:O.id,origin:"jumbo"===t?c.h.ProfileAvatar:c.h.MiddleHeaderAvatar}))},[O,t,y]),I=Object(d.a)();if(O)return a.a.createElement("div",{className:"ChatInfo",dir:!p&&I.isRtl?"rtl":void 0},a.a.createElement(u.a,{key:O.id,size:t,user:O,isSavedMessages:g,onClick:r?w:void 0}),a.a.createElement("div",{className:"info"},g?a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,I("SavedMessages"))):a.a.createElement("div",{className:"title"},a.a.createElement("h3",{dir:"auto"},T&&Object(o.a)(T)),O&&O.isVerified&&a.a.createElement(m.a,null)),(n||!g&&!f)&&(n?a.a.createElement("span",{className:"status",dir:"auto"},n):h&&!v?a.a.createElement("span",{className:"status",dir:"auto"},I("Updating")):O?e?a.a.createElement(b.a,{typingStatus:e}):a.a.createElement("div",{className:"status "+(Object(s.Cb)(O)?"online":"")},i&&O.username&&a.a.createElement("span",{className:"handle"},O.username),a.a.createElement("span",{className:"user-status",dir:"auto"},Object(s.cb)(I,O,C))):void 0)))}))},function(e,t,n){"use strict";var a=n(0),r=n(56);var c=n(9),i=n(37),s=n(40),o=n(58),l=n(16),d=n(39),u=n(21),m=n(128);n(155);t.a=({title:e,className:t,isOpen:n,header:b,hasCloseButton:h,noBackdrop:f,children:p,onClose:O,onCloseAnimationEnd:g,onEnter:v,shouldSkipHistoryAnimations:j})=>{const{shouldRender:E,transitionClassNames:y}=Object(s.a)(n,g,j,void 0,j),C=Object(a.q)(null);Object(a.n)(()=>n?Object(r.a)({onEsc:O,onEnter:v}):void 0,[n,O,v]),Object(a.n)(()=>n&&C.current?function(e){function t(t){if("Tab"!==t.key)return;t.preventDefault(),t.stopPropagation();const n=Array.from(e.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'));if(!n.length)return;const a=n.findIndex(e=>e.isSameNode(document.activeElement));let r=0;a>=0&&(r=t.shiftKey?a>0?a-1:n.length-1:a{document.removeEventListener("keydown",t,!1)}}(C.current):void 0,[n]);const{forceClose:N}=Object(d.a)(n,O);Object(a.n)(()=>()=>{n&&N()},[]),Object(o.a)(([e])=>(document.body.classList.toggle("has-open-dialog",n),(n||!n&&void 0!==e)&&Object(i.d)(200),()=>{document.body.classList.remove("has-open-dialog")}),[n]);const T=Object(l.a)();if(!E)return;const w=Object(c.a)("Modal",t,y,f&&"transparent-backdrop");return a.a.createElement(m.a,null,a.a.createElement("div",{ref:C,className:w,tabIndex:-1,role:"dialog"},a.a.createElement("div",{className:"modal-container"},a.a.createElement("div",{className:"modal-backdrop",onClick:O}),a.a.createElement("div",{className:"modal-dialog"},b||(e?a.a.createElement("div",{className:"modal-header"},h&&a.a.createElement(u.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:T("Close"),onClick:O},a.a.createElement("i",{className:"icon-close"})),a.a.createElement("div",{className:"modal-title"},e)):void 0),a.a.createElement("div",{className:"modal-content custom-scroll"},p)))))}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(31),i=n(29),s=n(9),o=n(37),l=n(178);n(202);const d=Symbol("CLEANED_UP");t.a=({ref:e,activeKey:t,name:n,direction:u="auto",renderCount:m,shouldRestoreHeight:b,shouldCleanup:h,cleanupExceptionKey:f,id:p,className:O,onStart:g,onStop:v,children:j})=>{const{animationLevel:E}=Object(r.e)().settings.byKey;let y=Object(a.q)(null);e&&(y=e);const C=Object(a.q)({}),N=Object(i.a)(t),T=Object(c.a)(),w=void 0!==N&&t!==N;!m&&w&&(C.current={[N]:C.current[N]}),C.current[t]=j,Object(a.o)(()=>{function e(){!h||void 0!==f&&f===N||(C.current={[N]:d},T())}const a=y.current,r=a.children;if(1===r.length&&!w)return void r[0].classList.add("active");const c=Array.from(a.childNodes);if(!w||!c.length)return;const i=-1===u||"auto"===u&&N>t||"inverse"===u&&N{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===O))}),void e();let j;c.forEach((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("active"),e.classList.toggle("from",t===p),e.classList.toggle("through",t>p&&tO),e.classList.toggle("to",t===O))}),E>0&&(j=Object(o.d)()),requestAnimationFrame(()=>{function t(){requestAnimationFrame(()=>{if(a.classList.remove("animating","backwards"),c.forEach((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===O))}),b){const e=a.querySelector(".active");e&&(e.style.height="auto",a.style.height=e.clientHeight+"px")}j&&j(),e(),v&&v()})}if(a.classList.add("animating"),E>0){const e="mv-slide"===n?c[O].firstChild:c[O];Object(l.a)(e,t)}else t();g&&g()})},[t,N,w,u,n,g,v,m,b,h,f,E,T]),Object(a.o)(()=>{if(b){const e=y.current,t=e.querySelector(".active")||e.querySelector(".from");t&&(t.style.height="auto",e.style.height=t.clientHeight+"px",e.style.flexBasis=t.clientHeight+"px")}},[b,j]);const I=C.current,M=Object.keys(m?new Array(m).fill(void 0):I).map(Number).map(e=>{const n=I[e];return"function"==typeof n?a.a.createElement("div",{key:e},n(e===t,e===N,t)):void 0}),k=Object(s.a)("Transition",O,n);return a.a.createElement("div",{ref:y,id:p,className:k},M)}},function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(2),i=n(4),s=n(50),o=n(9),l=n(22),d=n(110),u=n(117),m=n(16);n(204);t.a=Object(a.h)(({className:e,size:t="large",chat:n,user:b,text:h,withOnlineStatus:f,isSavedMessages:p,lastSyncTime:O,onClick:g})=>{const v=b&&Object(i.sb)(b);let j;p||v||(b?j=Object(i.e)(b):n&&(j=Object(i.e)(n)));const E=Object(d.a)(j,!1,r.ApiMediaFormat.DataUri,O),{shouldRenderFullMedia:y,transitionClassNames:C}=Object(u.a)(E,"slow"),N=Object(m.a)();let T="";if(p)T=a.a.createElement("i",{className:"icon-avatar-saved-messages"});else if(v)T=a.a.createElement("i",{className:"icon-avatar-deleted-account"});else if(y)T=a.a.createElement("img",{src:E,className:C+" avatar-media",alt:"",decoding:"async"});else if(b){const e=Object(i.bb)(b);T=e?Object(s.c)(e,2):void 0}else if(n){const e=Object(i.k)(N,n);T=e&&Object(s.c)(e,Object(i.ob)(n.id)?2:1)}else h&&(T=Object(s.c)(h,2));const w=!p&&b&&Object(i.Cb)(b),I=Object(o.a)("Avatar size-"+t,e,"color-bg-"+Object(i.Z)(b||n),p&&"saved-messages",v&&"deleted-account",f&&w&&"online",g&&"interactive",!p&&!y&&"no-photo"),M=Object(a.m)(e=>{g&&g(e,p||y)},[g,p,y]),k=(b||n)&&(b||n).id;return a.a.createElement("div",{className:I,onClick:M,"data-test-sender-id":c.N?k:void 0},"string"==typeof T?Object(l.a)(T,["jumbo"===t?"hq_emoji":"emoji"]):T)})},function(e,t,n){"use strict";var a=n(13),r=n(0),c=n(10),i=n(160);t.a=({ref:e,className:t,onLoadMore:n,onScroll:s,onKeyDown:o,items:l,itemSelector:d=".ListItem",preloadBackwards:u=20,sensitiveArea:m=800,noScrollRestore:b=!1,noScrollRestoreOnTop:h=!1,noFastList:f,cacheBuster:p,children:O})=>{let g=Object(r.q)(null);e&&(g=e);const v=Object(r.q)({}),[j,E]=Object(r.p)(()=>n?[Object(c.a)((e=!1)=>{n({direction:a.e.Backwards,noScroll:e})},1e3,!0,!1),Object(c.a)(()=>{n({direction:a.e.Forwards})},1e3,!0,!1)]:[],[n,l]);Object(r.n)(()=>{if(!j)return;if(u>0&&(!l||l.length{const e=g.current,t=v.current;let n;if(t.listItemElements=e.querySelectorAll(d),t.currentAnchor&&Array.from(t.listItemElements).includes(t.currentAnchor)){const{scrollTop:a}=e;n=a+(t.currentAnchor.getBoundingClientRect().top-t.currentAnchorTop)}else{const e=t.listItemElements[0];e&&(t.currentAnchor=e,t.currentAnchorTop=e.getBoundingClientRect().top)}b||h&&0===e.scrollTop||(Object(i.a)(e,n),t.isScrollTopJustUpdated=!0)},[l,d,b,h,p]);const y=Object(r.m)(e=>{if(E&&j){const{listItemElements:e,isScrollTopJustUpdated:t,currentAnchor:n,currentAnchorTop:a}=v.current;if(t)return void(v.current.isScrollTopJustUpdated=!1);const r=e.length,c=g.current,{scrollTop:s,scrollHeight:o,offsetHeight:l}=c,d=s<=(r?e[0].offsetTop:0)+m,u=(r?e[r-1].offsetTop+e[r-1].offsetHeight:o)-(s+l)<=m;let b=!1;if(d){const t=e[0];if(t){const e=t.getBoundingClientRect().top,r=n&&n.offsetParent&&n!==t?n.getBoundingClientRect().top:e;n&&void 0!==a&&r>a&&(v.current.currentAnchor=t,v.current.currentAnchorTop=e,b=!0,Object(i.a)(c),E())}}if(u){const t=e[r-1];if(t){const e=t.getBoundingClientRect().top,r=n&&n.offsetParent&&n!==t?n.getBoundingClientRect().top:e;n&&void 0!==a&&r{const d=Object(r.a)("FloatingActionButton",e&&"revealed",t);return a.a.createElement(c.a,{className:d,color:n,round:!0,disabled:s,onClick:e&&!s?o:void 0,ariaLabel:i,tabIndex:-1},l)}},function(e,t,n){"use strict";var a=n(0),r=n(40);const c={fast:200,slow:350};t.a=(e,t="fast",n=!1)=>{const i=Boolean(e),s=!Object(a.q)(i).current&&!n,[o,l]=Object(a.r)(!i),{shouldRender:d,transitionClassNames:u}=Object(r.a)(i,void 0,!s,t);return Object(a.n)(()=>{d&&(s?setTimeout(()=>{l(!1)},c[t]):l(!1))},[s,d,t]),{shouldRenderThumb:o,shouldRenderFullMedia:d,transitionClassNames:u}}},function(e,t,n){"use strict";n.d(t,"c",(function(){return s})),n.d(t,"d",(function(){return o})),n.d(t,"e",(function(){return l})),n.d(t,"a",(function(){return d})),n.d(t,"b",(function(){return u})),n.d(t,"j",(function(){return p})),n.d(t,"l",(function(){return g})),n.d(t,"g",(function(){return v})),n.d(t,"i",(function(){return j})),n.d(t,"m",(function(){return E})),n.d(t,"k",(function(){return y})),n.d(t,"n",(function(){return C})),n.d(t,"h",(function(){return N})),n.d(t,"f",(function(){return T}));var a=n(2),r=n(6),c=n(54),i=n(4);const s="(max-height: 640px)",o=parseInt(getComputedStyle(document.documentElement).fontSize,10),l=200,d={width:640,height:640},u="1258816259753933",m={width:100,height:100};let b,h,f;function p(e,t,n,a){const i=t||n?1.625:0;return(function(e,t){const n=e?30:29;if(!r.l)return n;const{width:a}=c.a.get();return b||(b=Math.min(30,a/o-4.5)),h||(h=Math.min(29,a/o-7)),f||(f=Math.min(29,a/o-4.5)),e?b:t?f:h}(e,a)-i)*o}function O({width:e,height:t,fromOwnMessage:n,isForwarded:a,isWebPagePhoto:r,isGif:c,noAvatars:i}){const s=t/e;return T(p(n,a,r,i),function(e,t){return e&&t&&t>=.75&&t<=1.25?20*o:27*o}(c,s),e,t)}function g(e,t){const n=window.matchMedia(s),{width:a,height:r}=c.a.get();let i=t&&n.matches?10:8.25;return e&&(i=n.matches?10:15),{width:a,height:r-i*o}}function v(e,t,n,a,r){const{width:c,height:s}=Object(i.V)(e)||m;return O({width:c,height:s,fromOwnMessage:t,isForwarded:n,isWebPagePhoto:a,noAvatars:r})}function j(e,t,n,a){const{width:r,height:c}=Object(i.db)(e)||m;return O({width:r,height:c,fromOwnMessage:t,isForwarded:n,isGif:e.isGif,noAvatars:a})}function E(){return{width:2*o,height:2*o}}function y(e){return e?{width:3*o,height:3*o}:{width:3.375*o,height:3.375*o}}function C(e){const{width:t}=e;let{height:n}=e;e.id===u&&(n=t);const c=n&&t&&n/t,i=o*(r.l?a.Jb:a.Ib),s=c?i*c:i;return c&&s>i?{width:Math.round(i/c),height:i}:{width:i,height:s}}function N({width:e,height:t},n,a=!1){const{width:r,height:c}=g(n,a);return T(r,c,e,t)}function T(e,t,n,a){const r=a/n,c=Math.min(n,e);return Math.round(c*r)>t?{width:Math.round(t/r),height:t}:{width:c,height:Math.round(c*r)}}},function(e,t,n){"use strict";var a=n(0),r=n(10),c=n(9),i=n(37),s=n(127);let o,l;async function d(){return o||(o=n.e(7).then(n.bind(null,201)),l=(await o).default),o}setTimeout(d,5e3);t.a=Object(a.h)(({className:e,id:t,animationData:n,play:o,playSegment:u,speed:m,noLoop:b,size:h,quality:f,isLowPriority:p,onLoad:O})=>{const[g,v]=Object(a.r)(),j=Object(a.q)(null),E=Object(a.q)(!1),y=Object(a.q)(!1),C=Object(a.q)();C.current=o;const N=Object(a.q)();N.current=u,Object(a.n)(()=>{if(g||!n)return;const e=()=>{if(!j.current)return;const e=new l(t,j.current,n,{noLoop:b,size:h,quality:f,isLowPriority:p},O);m&&e.setSpeed(m),v(e)};l?e():d().then(()=>{Object(r.b)(()=>{j.current&&e()})})},[g,n,t,p,b,O,f,h,m]),Object(a.n)(()=>()=>{g&&g.destroy()},[g]);const T=Object(a.m)((e=!1)=>{g&&(C.current||N.current)&&(N.current?g.playSegment(N.current):e?g.goToAndPlay(0):g.play())},[g]),w=Object(a.m)(()=>{g&&g.pause()},[g]),I=Object(a.m)(()=>{y.current=!0,g&&(E.current||(E.current=g.isPlaying()),w())},[g,w]),M=Object(a.m)(()=>{E.current&&T(),E.current=!1,y.current=!1},[T]),k=Object(a.m)(()=>{Object(r.b)(M)},[M]);Object(a.n)(()=>{g&&(o||u?y.current?E.current=!0:T(b):y.current?E.current=!1:w())},[g,o,u,b,T,w]),Object(i.c)(I,M),Object(s.a)(I,k);const S=Object(c.a)("AnimatedSticker",e),L=h?`width: ${h}px; height: ${h}px;`:void 0;return a.a.createElement("div",{ref:j,className:S,style:L})})},function(e,t,n){"use strict";var a=n(0),r=n(16),c=n(112),i=n(21);t.a=Object(a.h)(({isOpen:e,onClose:t,onCloseAnimationEnd:n,title:s,header:o,text:l,textParts:d,confirmLabel:u="Confirm",confirmHandler:m,confirmIsDestructive:b,isButtonsInOneRow:h})=>{const f=Object(r.a)();return a.a.createElement(c.a,{className:"confirm",title:s,header:o,isOpen:e,onClose:t,onCloseAnimationEnd:n,onEnter:m},l&&l.split("\\n").map(e=>a.a.createElement("p",null,e)),d,a.a.createElement("div",{className:h?"dialog-buttons mt-2":""},a.a.createElement(i.a,{className:"confirm-dialog-button",isText:!0,onClick:m,color:b?"danger":"primary"},u),a.a.createElement(i.a,{className:"confirm-dialog-button",isText:!0,onClick:t},f("Cancel"))))})},function(e,t,n){"use strict";var a=n(0),r=n(9),c=n(40),i=n(22),s=n(16);n(261);t.a=Object(a.h)(({text:e="Nothing found.",description:t})=>{const n=Object(s.a)(),{transitionClassNames:o}=Object(c.a)(!0);return a.a.createElement("div",{className:Object(r.a)("NothingFound",o,t&&"with-description")},e,t&&a.a.createElement("p",{className:"description"},Object(i.a)(n(t),["br"])))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(0),r=n(52),c=n(31);function i(e,t){const n=void 0===t,i=Object(a.q)(n),s=Object(a.q)(),o=Object(c.a)();return Object(r.a)(()=>{n||(i.current=!1,s.current&&(clearTimeout(s.current),s.current=void 0))},e),Object(a.n)(()=>{if(n||i.current)return;const e=()=>{i.current=!0,o()};t>0?s.current=window.setTimeout(e,t):e()},e),i.current}},function(e,t,n){"use strict";var a=n(0),r=n(6),c=n(8),i=n(10),s=n(57),o=n(31);t.a=(e,t=!1,n=c.ApiMediaFormat.BlobUrl,l,d)=>{const u=e?s.c(e):void 0,m=n===c.ApiMediaFormat.Stream||r.h&&n===c.ApiMediaFormat.Progressive,b=Object(o.a)(),[h,f]=Object(a.r)(u&&!m?1:0),p=Object(a.q)(),O=Object(a.p)(()=>Object(i.h)(e=>{(!d||Date.now()-p.current>d)&&f(e)},500,!0),[d]);return Object(a.n)(()=>{!t&&e&&(u?m&&setTimeout(()=>{f(.75)},1500):(f(0),p.current&&s.a(O),p.current=Date.now(),s.b(e,n,O).then(()=>{const e=Date.now()-p.current;p.current=void 0,!d||e>=d?b():setTimeout(b,d-e)})))},[t,e,u,n,l,b,m,d,O]),Object(a.n)(()=>{t&&p.current&&(s.a(O),f(0))},[O,t]),{mediaData:u,downloadProgress:h}}},function(e,t,n){"use strict";var a=n(0),r=n(9);n(229);const c={s:22,m:25,l:28,xl:20};t.a=Object(a.h)(({progress:e=0,size:t="l",square:n,transparent:i,noCross:s,onClick:o})=>{const l=c[t],d=l-4,u=l-1,m=2*d*Math.PI,b=Object(a.q)(null);Object(a.n)(()=>{if(!b.current)return;const t=b.current.firstElementChild,n=m-Math.min(Math.max(.05,e),1)*m;t?t.firstElementChild.setAttribute("stroke-dashoffset",n.toString()):b.current.innerHTML=`\n \n `},[b,m,u,d,e]);const h=Object(r.a)("ProgressSpinner size-"+t,i&&"transparent",n&&"square",s&&"no-cross");return a.a.createElement("div",{ref:b,className:h,onClick:o})})},function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(109),i=n(110),s=n(117),o=n(25),l=n(9),d=n(119),u=n(21);n(246);t.a=Object(a.h)(({sticker:e,size:t,observeIntersection:n,noAnimate:m,title:b,className:h,onClick:f,clickArg:p,onUnfaveClick:O})=>{const g=Object(a.q)(null),v="sticker"+e.id,j="sticker-button-"+e.id,E=Object(c.b)(g,n),y=e.thumbnail?e.thumbnail.dataUri:void 0,C=Object(i.a)(v+"?size=m",!E,r.ApiMediaFormat.BlobUrl),N=E&&!m,T=Object(i.a)(e.isAnimated&&v,!N,r.ApiMediaFormat.Lottie),[w,I,M]=Object(o.a)(Boolean(T)),k=w&&N,{shouldRenderThumb:S,shouldRenderFullMedia:L,transitionClassNames:A}=Object(s.a)(C||k,"slow");Object(a.n)(()=>{N||M()},[M,N]);const x=Object(l.a)("StickerButton",e.isAnimated&&"animated",j,h),D=S&&y?`background-image: url('${y}');`:"";return a.a.createElement("div",{ref:g,className:x,title:b||e&&e.emoji,style:D,"data-sticker-id":e.id,onClick:function(){f&&f(p)}},L&&!k&&a.a.createElement("img",{src:C,className:A}),N&&T&&a.a.createElement(d.a,{id:v,animationData:T,play:!0,size:t,isLowPriority:!0,onLoad:I}),O&&a.a.createElement(u.a,{className:"sticker-unfave-button",color:"dark",round:!0,onClick:function(t){t.stopPropagation(),t.preventDefault(),O(e)}},a.a.createElement("i",{className:"icon-close"})))})},function(e,t,n){"use strict";var a=n(0),r=n(9),c=n(16),i=n(26);n(235);var s=Object(a.h)(({id:e,label:t,subLabel:n,value:s,name:o,checked:l,disabled:d,hidden:u,isLoading:m,onChange:b})=>{const h=Object(c.a)(),f=Object(r.a)("Radio",d&&"disabled",u&&"hidden-widget",m&&"loading");return a.a.createElement("label",{className:f,dir:h.isRtl?"rtl":void 0},a.a.createElement("input",{type:"radio",name:o,value:s,id:e,checked:l,onChange:b,disabled:d||u}),a.a.createElement("div",{className:"Radio-main"},a.a.createElement("span",{className:"label",dir:h.isRtl?"auto":void 0},t),n&&a.a.createElement("span",{className:"subLabel",dir:h.isRtl?"auto":void 0},n)),m&&a.a.createElement(i.a,null))});t.a=Object(a.h)(({id:e,name:t,options:n,selected:r,disabled:c,loadingOption:i,onChange:o})=>{const l=Object(a.m)(e=>{const{value:t}=e.currentTarget;o(t)},[o]);return a.a.createElement("div",{id:e,className:"radio-group"},n.map(e=>a.a.createElement(s,{name:t,label:e.label,subLabel:e.subLabel,value:e.value,checked:e.value===r,hidden:e.hidden,disabled:c,isLoading:i?i===e.value:void 0,onChange:l})))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(0);function r(e,t){Object(a.n)(()=>(e&&!document.hasFocus()&&e(),e&&window.addEventListener("blur",e),t&&window.addEventListener("focus",t),()=>{t&&window.removeEventListener("focus",t),e&&window.removeEventListener("blur",e)}),[e,t])}},function(e,t,n){"use strict";var a=n(0),r=n(67);t.a=({containerId:e,className:t,children:n})=>{const c=Object(a.q)(document.createElement("div"));return Object(a.o)(()=>{const n=document.querySelector(e||"#portals");if(!n)return;const a=c.current;return t&&a.classList.add(t),n.appendChild(a),()=>{r.a.render(void 0,a),n.removeChild(a)}},[t,e]),r.a.render(n,c.current)}},function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(118),i=n(109),s=n(110),o=n(117),l=n(25),d=n(119);n(219);const u={large:160,medium:128,small:104};t.a=({sticker:e,size:t="medium",observeIntersection:n,lastSyncTime:m,forceLoadPreview:b})=>{const h=Object(a.q)(null),[f,p]=Object(l.a)(),O="sticker"+e.id,g=Object(i.b)(h,n),v=e.thumbnail&&e.thumbnail.dataUri,j=Object(s.a)(O+"?size=m",!g&&!b,r.ApiMediaFormat.BlobUrl,m),{transitionClassNames:E}=Object(o.a)(j,"slow"),y=Object(s.a)(O,!g,r.ApiMediaFormat.Lottie,m),C=Boolean(y),[N,T]=Object(a.r)(String(Math.random())),w=Object(a.m)(()=>{T(String(Math.random()))},[]),I=u[t],M=`width: ${I}px; height: ${I}px;`;return a.a.createElement("div",{ref:h,className:"AnimatedEmoji media-inner",style:M,onClick:w},!f&&v&&a.a.createElement("img",{src:v,className:e.id===c.b?"like-sticker-thumb":void 0,alt:""}),!f&&j&&a.a.createElement("img",{src:j,className:E,alt:""}),C&&a.a.createElement(d.a,{key:O,id:O,animationData:y,size:I,quality:1,play:g&&N,noLoop:!0,onLoad:p}))}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(13),i=n(4),s=n(7),o=n(22),l=n(3),d=n(16),u=n(114),m=n(138),b=n(161);t.a=Object(a.h)(Object(r.h)((e,{chatId:t})=>{const{lastSyncTime:n}=e,a=Object(s.g)(e,t);return{lastSyncTime:n,chat:a,onlineCount:a?Object(s.o)(e,a):void 0,areMessagesLoaded:Boolean(Object(s.n)(e,t))}},(e,t)=>Object(l.l)(t,["loadFullChat","openMediaViewer"]))(({typingStatus:e,avatarSize:t="medium",withMediaViewer:n,withUsername:r,withFullInfo:s,withUpdatingStatus:l,withChatType:h,noRtl:f,chat:p,onlineCount:O,areMessagesLoaded:g,lastSyncTime:v,loadFullChat:j,openMediaViewer:E})=>{const y=p&&Object(i.qb)(p),{id:C,isMin:N,isRestricted:T}=p||{};Object(a.n)(()=>{C&&!N&&s&&v&&j({chatId:C})},[C,N,v,s,j,y]);const w=Object(a.m)((e,n)=>{p&&n&&(e.stopPropagation(),E({avatarOwnerId:p.id,origin:"jumbo"===t?c.h.ProfileAvatar:c.h.MiddleHeaderAvatar}))},[p,t,E]),I=Object(d.a)();if(p)return a.a.createElement("div",{className:"ChatInfo",dir:!f&&I.isRtl?"rtl":void 0},a.a.createElement(u.a,{key:p.id,size:t,chat:p,onClick:n?w:void 0}),a.a.createElement("div",{className:"info"},a.a.createElement("div",{className:"title"},a.a.createElement("h3",{dir:"auto"},Object(o.a)(Object(i.k)(I,p))),p.isVerified&&a.a.createElement(m.a,null)),function(){if(l&&!g&&!T)return a.a.createElement("span",{className:"status",dir:"auto"},I("Updating"));if(!p)return;if(e)return a.a.createElement(b.a,{typingStatus:e});if(h)return a.a.createElement("div",{className:"status",dir:"auto"},I(Object(i.l)(p)));const t=r?p.username:void 0,n=function(e,t){const n=e(Object(i.l)(t)),{membersCount:a}=t;if(t.isRestricted)return"Channel"===n?"channel is inaccessible":"group is inaccessible";if(!a)return n;return e("Channel"===n?"Subscribers":"Members",a,"i")}(I,p),c=O?", "+I("OnlineCount",O,"i"):void 0;return a.a.createElement("div",{className:"status"},t&&a.a.createElement("span",{className:"handle"},t),a.a.createElement("span",{className:"group-status"},n),c&&a.a.createElement("span",{className:"online-status"},c))}()))}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return l})),n.d(t,"b",(function(){return d}));var a=n(1),r=n(13),c=n(2),i=n(37),s=n(62);let o=!1;function l(e,t,n,i=0,s=c.B,o,l,d){const m=function(e,t,n=c.B,a){const{offsetTop:i}=t,{scrollTop:s}=e;if(void 0===a){const t=i-e.scrollTop;if(t<-n)return s+(t+n);if(t>n)return s+(t-n)}else{if(a===r.b.Up)return i+n;if(a===r.b.Down)return Math.max(0,i-n)}return s}(e,t,s,o);o!==r.b.Static?(Object(a.e)().settings.byKey.animationLevel===c.f&&(l=0),u(e,t,m,n,i,l,d)):u(e,t,m,n,i,0)}function d(){return o}function u(e,t,n,a,r=0,l,d){const{offsetTop:u,offsetHeight:h}=t,{scrollTop:f,offsetHeight:p,scrollHeight:O}=e,g=!d&&e.dataset.normalHeight?Number(e.dataset.normalHeight):p;let v;switch(f!==n&&(e.scrollTop=n),a){case"start":v=u-r-n;break;case"end":v=u+h+r-(n+g);break;case"nearest":case"center":case"centerOrTop":v=h0){const e=O-(n+g);v=Math.min(v,e)}if(0===v)return;const j=n+v;if(0===l)return void(e.scrollTop=j);o=!0;const E=Math.abs(v),y=E{const t=Math.min((Date.now()-N)/C,1),n=v*(1-y(t));return e.scrollTop=Math.round(j-n),o=t<1,o||T(),o})}function m(e){return 1-(1-e)**5}function b(e){return 1-(1-e)**3.5}},,function(e,t,n){"use strict";var a=n(0),r=n(13),c=n(3),i=n(31),s=n(29);function o(e,t=0,n,a){const{length:c}=e,i=e.indexOf(t),s=n===r.e.Forwards?i:i+1||c,o=Math.max(0,s-a),l=s+a-1,d=e.slice(Math.max(0,o),l+1);let u,m;switch(n){case r.e.Forwards:u=s>0,m=o>=0;break;case r.e.Backwards:u=s{const u=Object(a.q)(),m=Object(a.q)((()=>{if(!t||u.current)return;const{newViewportIds:e}=o(t,t[0],r.e.Forwards,l);return e})()),b=Object(i.a)(),h=Object(s.a)(t),f=Object(s.a)(n);if(t&&!n&&(t!==h||n!==f)){const{offsetId:e=t[0],direction:n=r.e.Forwards}=u.current||{},{newViewportIds:a}=o(t,e,n,l);m.current&&Object(c.a)(m.current,a)||(m.current=a)}Object(a.n)(()=>{if(t&&!n&&e&&d){const t=m.current;e({offsetId:t[t.length-1]})}},[t,n,e,d]);const p=Object(a.m)(({direction:n,noScroll:a})=>{const i=m.current,s=i?n===r.e.Backwards?i[i.length-1]:i[0]:void 0;if(!t)return void(e&&e({offsetId:s}));a||(u.current={...u.current,direction:n,offsetId:s});const{newViewportIds:d,areSomeLocal:h,areAllLocal:f}=o(t,s,n,l);!h||i&&Object(c.a)(i,d)||(m.current=d,b()),!f&&e&&e({offsetId:s})},[t,l,e,b]);return n?[t]:[m.current,p]}},function(e,t,n){"use strict";function a(e,t){return t-Math.floor(t/e)*e}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(6);function r(e,t){if(!t&&e===document.activeElement)return;const n=window.getSelection(),r=document.createRange(),c=e.lastChild||e;a.n||c&&c.nodeValue?(r.selectNodeContents(c),r.collapse(!1),n.removeAllRanges(),n.addRange(r)):e.focus()}},,function(e,t,n){"use strict";let a;n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return r})),function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Left=2]="Left",e[e.Right=3]="Right"}(a||(a={}));function r(e,t){let n,r,c=!1;function i(e){t.excludedClosestSelector&&(e.target.matches(t.excludedClosestSelector)||e.target.closest(t.excludedClosestSelector))||(n=e,"mousedown"===e.type?(document.addEventListener("mousemove",o),document.addEventListener("mouseup",s)):"touchstart"===e.type&&(document.addEventListener("touchmove",o),document.addEventListener("touchend",s),document.addEventListener("touchcancel",s),"touches"in e&&(void 0===e.pageX&&(e.pageX=e.touches[0].pageX),void 0===e.pageY&&(e.pageY=e.touches[0].pageY))),document.body.classList.add("no-selection"),t.withCursor&&document.body.classList.add("cursor-grabbing"),t.onCapture&&t.onCapture(e))}function s(e){n&&(t.withCursor&&document.body.classList.remove("cursor-grabbing"),document.body.classList.remove("no-selection"),document.removeEventListener("mouseup",s),document.removeEventListener("mousemove",o),document.removeEventListener("touchcancel",s),document.removeEventListener("touchend",s),document.removeEventListener("touchmove",o),n=void 0,c?t.onRelease&&t.onRelease(e):!t.onClick||"button"in e&&0!==e.button||t.onClick(e)),c=!1,r=void 0}function o(e){if(n){"touchmove"===e.type&&"touches"in e&&(void 0===e.pageX&&(e.pageX=e.touches[0].pageX),void 0===e.pageY&&(e.pageY=e.touches[0].pageY));const i=e.pageX-n.pageX,s=e.pageY-n.pageY;(Math.abs(i)>=15||Math.abs(s)>=15)&&(c=!0),t.onDrag&&(e.preventDefault(),t.onDrag(e,n,{dragOffsetX:i,dragOffsetY:s})),t.onSwipe&&function(e,n,c){if(!r){const e=Math.abs(n),t=Math.abs(c);if(n&&c){if(Math.max(e,t)/Math.min(e,t)<2)return}e>=50?r="x":t>=50&&(r="y")}!function(e,t,n,r,c){"x"===t?c(e,n<0?a.Left:a.Right):"y"===t&&c(e,r<0?a.Up:a.Down)}(e,r,n,c,t.onSwipe)}(e,i,s)}}return e.addEventListener("mousedown",i),e.addEventListener("touchstart",i,{passive:!0}),()=>{e.removeEventListener("mousedown",i),e.removeEventListener("touchstart",i)}}},function(e,t,n){"use strict";var a=n(0);n(211);t.a=()=>a.a.createElement("span",{className:"VerifiedIcon"})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(29);function r(e,t=!1,n=!1){const r=Object(a.a)(e,t);return n||null!=e?e:r}},function(e,t,n){"use strict";var a=n(2);t.a=e=>{e.play().catch(e=>{a.r&&console.warn(e)})}},function(e,t,n){"use strict";var a=n(0),r=n(10),c=n(164);t.a=(e=!1)=>{const[t,n]=Object(a.r)(!e),[i,s]=Object(a.r)(0),o=Object(a.p)(()=>Object(r.a)(n,200,!1,!0),[]),l=Object(a.m)(e=>{const t=e.currentTarget;Object(c.a)(t)||(t.buffered.length&&s(t.buffered.end(0)/t.duration),o(t.readyState>=3||t.currentTime>0))},[o]);return{isBuffered:t,bufferedProgress:i,bufferingHandlers:{onLoadedData:l,onPlaying:l,onLoadStart:l,onPause:l,onTimeUpdate:l,onProgress:l},checkBuffering(e){o(e.readyState>=3)}}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(8),r=n(6);const c={B:a.ApiMessageEntityTypes.Bold,STRONG:a.ApiMessageEntityTypes.Bold,I:a.ApiMessageEntityTypes.Italic,EM:a.ApiMessageEntityTypes.Italic,U:a.ApiMessageEntityTypes.Underline,S:a.ApiMessageEntityTypes.Strike,STRIKE:a.ApiMessageEntityTypes.Strike,DEL:a.ApiMessageEntityTypes.Strike,CODE:a.ApiMessageEntityTypes.Code,PRE:a.ApiMessageEntityTypes.Pre,BLOCKQUOTE:a.ApiMessageEntityTypes.Blockquote};function i(e){const t=document.createElement("div");t.innerHTML=function(e){let t=e.slice(0);r.d||(t=t.replace(/]+alt="([^"]+)"[^>]*>/gm,"$1"));return t=t.replace(/<\/?span([^>]*)?>/g,""),t=t.replace(/ /g," "),t=t.replace(/
]*)?><\/div>/g,"\n"),t=t.replace(/]*)?>/g,"\n"),t=t.replace(/<\/div>(\s*)
/g,"\n"),t=t.replace(/
/g,"\n"),t=t.replace(/<\/div>/g,""),t=t.replace(/^`{3}(.*[\n\r][^]*?^)`{3}/gm,"
$1
"),t=t.replace(/[`]{3}([^`]+)[`]{3}/g,"
$1
"),t=t.replace(/[`]{1}([^`\n]+)[`]{1}/g,"$1"),t=t.replace(/[*]{2}([^*\n]+)[*]{2}/g,"$1"),t=t.replace(/[_]{2}([^*\n]+)[_]{2}/g,"$1"),t=t.replace(/[~]{2}([^~\n]+)[~]{2}/g,"$1"),t}(e);const n=t.innerText.trim().replace(/\u200b+/g,"").slice(0,4096);let i=0,s=0;const o=[];function l(e){const{index:t,entity:r}=function(e,t,n){const r=function(e){if(c[e.nodeName])return c[e.nodeName];if("A"===e.nodeName){const t=e;return t.dataset.entityType===a.ApiMessageEntityTypes.MentionName?a.ApiMessageEntityTypes.MentionName:t.dataset.entityType===a.ApiMessageEntityTypes.Url?a.ApiMessageEntityTypes.Url:t.href.startsWith("mailto:")?a.ApiMessageEntityTypes.Email:t.href.startsWith("tel:")?a.ApiMessageEntityTypes.Phone:t.href!==t.textContent?a.ApiMessageEntityTypes.TextUrl:a.ApiMessageEntityTypes.Url}if("SPAN"===e.nodeName)return e.dataset.entityType;return}(e);if(!r||!e.textContent)return{index:n,entity:void 0};const i=t.indexOf(e.textContent,n),s=i>=0?i:n,o=t.substring(0,s).length,{length:l}=t.substring(s,s+e.textContent.length);let d,u;r===a.ApiMessageEntityTypes.TextUrl&&(d=e.href);r===a.ApiMessageEntityTypes.MentionName&&(u=Number(e.dataset.userId));return{index:s,entity:{type:r,offset:o,length:l,...d&&{url:d},...u&&{userId:u}}}}(e,n,i);r?(i=t,o.push(r)):e.textContent&&(i+=e.textContent.length),e.hasChildNodes()&&s<=3&&(s+=1,Array.from(e.childNodes).forEach(l))}return Array.from(t.childNodes).forEach(e=>{s=1,l(e)}),{text:n,entities:o.length?o:void 0}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));var a=n(0),r=n(40),c=n(9),i=n(49),s=n(29),o=n(25);n(224);var l=Object(a.h)(({isQuick:e,onFileSelect:t})=>{const[n,r,i]=Object(o.a)(),s=Object(c.a)("DropTarget",n&&"hovered");return a.a.createElement("div",{className:s,onDrop:t,onDragEnter:()=>{r()},onDragLeave:e=>{const{relatedTarget:t}=e;t&&e.stopPropagation(),i()}},a.a.createElement("div",{className:"target-content"},a.a.createElement("div",{className:"icon icon-"+(e?"photo":"document")}),a.a.createElement("div",{className:"title"},"Drop files here to send them"),a.a.createElement("div",{className:"description"},e?"in a quick way":"without compression")))});n(225);let d;!function(e){e.None="none",e.Document="document",e.QuickFile="quick_file"}(d||(d={}));t.b=Object(a.h)(({isOpen:e,withQuick:t,onHide:n,onFileSelect:o})=>{const d=Object(a.q)(null),u=Object(s.a)(t),{shouldRender:m,transitionClassNames:b}=Object(r.a)(e);Object(a.n)(()=>e?Object(i.a)(n):void 0,[e,n]);const h=Object(a.m)(e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),o(Array.from(t.files),!1))},[o,n]),f=Object(a.m)(e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),o(Array.from(t.files),!0))},[o,n]),p=Object(a.m)(e=>{e.stopPropagation();const{target:t,relatedTarget:a}=e;t.matches(".DropTarget, .DropArea")&&!a&&(d.current=window.setTimeout(()=>{n()},150))},[n]);if(!m)return;const O=Object(c.a)("DropArea",b);return a.a.createElement("div",{className:O,onDragLeave:p,onDragOver:()=>{d.current&&window.clearTimeout(d.current)},onDrop:n},a.a.createElement(l,{onFileSelect:h}),(t||u)&&a.a.createElement(l,{onFileSelect:f,isQuick:!0}))})},,function(e,t,n){"use strict";n.d(t,"b",(function(){return c})),n.d(t,"a",(function(){return i})),n.d(t,"d",(function(){return l}));var a=n(158),r=n(3);const c=[{icon:"user",title:"FilterContacts",key:"contacts"},{icon:"non-contacts",title:"FilterNonContacts",key:"nonContacts"},{icon:"group",title:"FilterGroups",key:"groups"},{icon:"channel",title:"FilterChannels",key:"channels"},{icon:"bots",title:"FilterBots",key:"bots"}],i=[{icon:"mute",title:"FilterMuted",key:"excludeMuted"},{icon:"archive",title:"FilterArchived",key:"excludeArchived"},{icon:"readchats",title:"FilterRead",key:"excludeRead"}],s=["includedChatIds","bots","channels","groups","contacts","nonContacts"],o=["excludedChatIds","excludeArchived","excludeMuted","excludeRead"];function l(e,t,n){let a=[],c=[];if("included"===t){const{includedChatIds:t,...i}=n?e.includeFilters||{}:Object(r.l)(e.folder,s);a=t||[],c=Object.keys(i).filter(e=>Boolean(i[e]))}else{const{excludedChatIds:t,...i}=n?e.excludeFilters||{}:Object(r.l)(e.folder,o);a=t||[],c=Object.keys(i).filter(e=>Boolean(i[e]))}return{selectedChatIds:a,selectedChatTypes:c}}function d(e){if(e){const{includedChatIds:t,...n}=e;if(Object.values(n).filter(Boolean).length>1||t&&t.length)return"";if(n.bots)return"Bots";if(n.groups)return"Groups";if(n.channels)return"Channels";if(n.contacts)return"Contacts";if(n.nonContacts)return"Non-Contacts"}return""}const u={mode:"create",chatFilter:"",folder:{title:"",includedChatIds:[],excludedChatIds:[]}},m=(e,t)=>{switch(t.type){case"setTitle":return{...e,folder:{...e.folder,title:t.payload},isTouched:!0};case"editIncludeFilters":return{...e,includeFilters:Object(r.l)(e.folder,s)};case"editExcludeFilters":return{...e,excludeFilters:Object(r.l)(e.folder,o)};case"setIncludeFilters":return{...e,includeFilters:t.payload,chatFilter:""};case"setExcludeFilters":return{...e,excludeFilters:t.payload,chatFilter:""};case"saveFilters":return e.includeFilters?{...e,folder:{...Object(r.j)(e.folder,s),title:e.folder.title?e.folder.title:d(e.includeFilters),...e.includeFilters},includeFilters:void 0,chatFilter:"",isTouched:!0}:e.excludeFilters?{...e,folder:{...Object(r.j)(e.folder,o),...e.excludeFilters},excludeFilters:void 0,chatFilter:"",isTouched:!0}:e;case"editFolder":{const{id:e,description:n,...a}=t.payload;return{mode:"edit",folderId:e,folder:a,chatFilter:""}}case"setChatFilter":return{...e,chatFilter:t.payload};case"setIsLoading":return{...e,isLoading:t.payload};case"setError":return{...e,error:t.payload};case"reset":return u;default:return e}};t.c=()=>Object(a.a)(m,u)},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(7),i=n(4),s=n(22),o=n(9),l=n(16),d=n(114);n(205);t.a=Object(a.h)(Object(r.h)((e,{chatOrUserId:t})=>{if(!t)return{};return{chat:t?Object(c.g)(e,t):void 0,user:Object(i.ob)(t)?Object(c.Jb)(e,t):void 0}})(({icon:e,title:t,isMinimized:n,canClose:r,onClick:c,clickArg:u,chat:m,user:b,className:h})=>{const f=Object(l.a)();let p,O;if(e&&t)p=a.a.createElement("div",{className:"item-icon"},a.a.createElement("i",{className:"icon-"+e})),O=t;else if(m||b){p=a.a.createElement(d.a,{chat:m,user:b,size:"small",isSavedMessages:b&&b.isSelf});const e=!m||b&&!b.isSelf?Object(i.ab)(b):Object(i.k)(f,m,b);O=e?Object(s.a)(e):void 0}const g=Object(o.a)("PickerSelectedItem",h,n&&"minimized",r&&"closeable");return a.a.createElement("div",{className:g,onClick:()=>c(u),title:n?O:void 0,dir:f.isRtl?"rtl":void 0},p,!n&&a.a.createElement("div",{className:"item-name",dir:"auto"},O),r&&a.a.createElement("div",{className:"item-remove"},a.a.createElement("i",{className:"icon-close"})))}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(1),r=n(2),c=n(6),i=n(62);function s(e,t,n=300){Object(a.e)().settings.byKey.animationLevel===r.f&&(n=0),c.e?function(e,t,n){const{scrollLeft:a,offsetWidth:r,scrollWidth:c}=e;let s=t-a;if(s<0){const e=-a;s=Math.max(s,e)}else if(s>0){const e=c-(a+r);s=Math.min(s,e)}if(0===s)return;const o=a+s;if(0===n)return void(e.scrollLeft=o);const l=Date.now();Object(i.a)(()=>{const t=Math.min((Date.now()-l)/n,1),a=s*(1-function(e){return 1-(1-e)**3.5}(t));return e.scrollLeft=Math.round(o-a),t<1})}(e,t,n):e.scrollTo({left:t,...n&&{behavior:"smooth"}})}},function(e,t,n){"use strict";var a=n(0);t.a=(e,t)=>{Object(a.n)(()=>{if(e)return e.addEventListener("wheel",t,{passive:!0}),()=>{e.removeEventListener("wheel",t)};function t(t){t.deltaX||(e.scrollLeft+=t.deltaY/4)}},[e,t])}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(10);t.a=(e,t,n,i)=>{const{loadMessage:s}=Object(r.d)(),o=Object(a.p)(()=>{const n=Object(c.h)(s,500,!0);return()=>{n({chatId:e,messageId:t,replyOriginForId:i})}},[s,e,t,i]);Object(a.n)(()=>{t&&!n&&o()})}},function(e,t,n){"use strict";var a=n(0),r=n(6);let c=0;t.a=(e,t,n,i)=>{const[s,o]=Object(a.r)(!1),[l,d]=Object(a.r)(void 0),u=Object(a.m)(e=>{t||2!==e.button||document.body.classList.add("no-selection")},[t]),m=Object(a.m)(e=>{document.body.classList.remove("no-selection"),t||n&&e.target.matches("a.text-entity-link[href]")||(e.preventDefault(),l||(document.body.classList.remove("no-selection"),0===c&&document.body.classList.add("has-context-menu"),c++,o(!0),d({x:e.clientX,y:e.clientY})))},[t,n,l]),b=Object(a.m)(()=>{o(!1)},[]),h=Object(a.m)(()=>{d(void 0),document.body.classList.remove("no-selection"),setTimeout(()=>{c--,0===c&&document.body.classList.remove("has-context-menu")},200)},[]);return Object(a.n)(()=>{if(t||!r.n||i)return;const a=e.current;if(!a)return;let c;const s=()=>{c&&(clearTimeout(c),c=void 0)},u=e=>{t||r.l&&window.document.body.classList.contains("enable-symbol-menu-transforms")||(s(),c=window.setTimeout(()=>(e=>{s();const{clientX:t,clientY:r,target:c}=e.touches[0];l||n&&c.matches("a.text-entity-link[href]")||(a.addEventListener("touchend",(function e(t){a.removeEventListener("touchend",e,!0),t.stopImmediatePropagation(),t.preventDefault(),t.stopPropagation()}),!0),document.body.classList.add("no-selection"),o(!0),d({x:t,y:r}))})(e),250))};return a.addEventListener("touchstart",u,{passive:!0}),a.addEventListener("touchcancel",s,!0),a.addEventListener("touchend",s,!0),a.addEventListener("touchmove",s,{passive:!0}),()=>{s(),a.removeEventListener("touchstart",u),a.removeEventListener("touchcancel",s,!0),a.removeEventListener("touchend",s,!0),a.removeEventListener("touchmove",s)}},[l,t,i,e,n]),{isContextMenuOpen:s,contextMenuPosition:l,handleBeforeContextMenu:u,handleContextMenu:m,handleContextMenuClose:b,handleContextMenuHide:h}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return d})),n.d(t,"b",(function(){return m}));var a=n(0),r=n(1),c=n(8),i=n(4),s=n(22),o=n(78),l=n(59);function d(e,t,n){const a=e.content.text;if(!a||!a.text){const t=Object(i.P)(e);return t?[t]:void 0}const{text:r,entities:c}=a;return m(r,c,t,n)}function u(e){const t=new Set,n=[];return e.forEach((a,r)=>{if(t.has(r))return;const c=function e(t,n,a,r){const{offset:c,length:i}=t,s=new Set([n]);if(r.has(n))return;const o=[];return a.filter((e,t)=>t>n&&e.offset>=c&&e.offsete(t,a.indexOf(t),a,r)).filter(Boolean).forEach(e=>{let t=!1;e.organizedIndexes.forEach(e=>{t||s.has(e)||(t=!0),s.add(e)}),t&&o.push(e)}),{entity:t,organizedIndexes:s,nestedEntities:o}}(a,r,e,t);c&&(c.organizedIndexes.forEach(e=>{t.add(e)}),n.push(c))}),n}function m(e,t,n,r,i){if(!t||!t.length)return b(e,n,r,i);const d=[];let m=!1;const O=u(t);function g(t,d,u,O){const v=[],{entity:j,nestedEntities:E}=u,{offset:y,length:C,type:N}=j;let T=e.substring(t,y);const w=T.length;T&&(m&&T.length>0&&"\n"===T[0]&&(T=T.substr(1),m=!1),T&&v.push(...b(T,n,r,i)));const I=t+w,M=I+C;let k=e.substring(y,y+C);const S=[];if(m&&k.length>0&&"\n"===k[0]&&(k=k.substr(1),m=!1),N===c.ApiMessageEntityTypes.Pre&&(m=!0),E.length){let e=I;E.forEach((t,n)=>{const{renderResult:a,entityEndIndex:r}=g(e,M,t,n===E.length-1);S.push(...a),e=r})}const L=i?function(e,t,n){const a="string"==typeof t&&t,r=n.length?n.join(""):Object(s.a)(t,["emoji_html","br_html"]).join("");if(!a)return r;switch(e.type){case c.ApiMessageEntityTypes.Bold:return`${r}`;case c.ApiMessageEntityTypes.Italic:return`${r}`;case c.ApiMessageEntityTypes.Underline:return`${r}`;case c.ApiMessageEntityTypes.Code:return`${r}`;case c.ApiMessageEntityTypes.Pre:return`\`\`\`
${r}
\`\`\``;case c.ApiMessageEntityTypes.Strike:return`${r}`;case c.ApiMessageEntityTypes.MentionName:return`${r}`;case c.ApiMessageEntityTypes.Url:case c.ApiMessageEntityTypes.TextUrl:return`${r}`;default:return r}}(j,k,S):function(e,t,n){const r="string"==typeof t&&t,i=n.length?n:t;if(!r)return b(i);switch(e.type){case c.ApiMessageEntityTypes.Bold:return a.a.createElement("strong",null,b(i));case c.ApiMessageEntityTypes.Blockquote:return a.a.createElement("blockquote",null,b(i));case c.ApiMessageEntityTypes.BotCommand:return a.a.createElement("a",{onClick:f,className:"text-entity-link",dir:"auto"},b(i));case c.ApiMessageEntityTypes.Hashtag:case c.ApiMessageEntityTypes.Cashtag:return a.a.createElement("a",{onClick:p,className:"text-entity-link",dir:"auto"},b(i));case c.ApiMessageEntityTypes.Code:return a.a.createElement("code",{className:"text-entity-code"},b(i));case c.ApiMessageEntityTypes.Email:return a.a.createElement("a",{href:"mailto:"+r,target:"_blank",rel:"noopener noreferrer",className:"text-entity-link",dir:"auto"},b(i));case c.ApiMessageEntityTypes.Italic:return a.a.createElement("em",null,b(i));case c.ApiMessageEntityTypes.MentionName:return a.a.createElement(o.a,{userId:e.userId},b(i));case c.ApiMessageEntityTypes.Mention:return a.a.createElement(o.a,{username:r},b(i));case c.ApiMessageEntityTypes.Phone:return a.a.createElement("a",{href:"tel:"+r,className:"text-entity-link",dir:"auto"},b(i));case c.ApiMessageEntityTypes.Pre:return a.a.createElement("pre",{className:"text-entity-pre"},b(i));case c.ApiMessageEntityTypes.Strike:return a.a.createElement("del",null,b(i));case c.ApiMessageEntityTypes.TextUrl:case c.ApiMessageEntityTypes.Url:return a.a.createElement(l.a,{url:h(r,e),text:r},b(i));case c.ApiMessageEntityTypes.Underline:return a.a.createElement("ins",null,b(i));default:return b(i)}}(j,k,S);if(Array.isArray(L)?v.push(...L):v.push(L),O&&M0&&"\n"===t[0]&&(t=t.substring(1)),t&&v.push(...b(t,n,r,i))}return{renderResult:v,entityEndIndex:M}}let v=0;return O.forEach((t,n)=>{const{renderResult:a,entityEndIndex:r}=g(v,e.length,t,n===O.length-1);d.push(...a),v=r}),d}function b(e,t,n,a){if(Array.isArray(e)){const r=[];return e.forEach(e=>{r.push(...b(e,t,n,a))}),r}if(a)return Object(s.a)(e,["escape_html","emoji_html","br_html"]);const r=n?"hq_emoji":"emoji";return t?Object(s.a)(e,[r,"br","highlight"],{highlight:t}):Object(s.a)(e,[r,"br"])}function h(e,t){const{type:n,url:a}=t;return n===c.ApiMessageEntityTypes.TextUrl&&a?a:e}function f(e){Object(r.d)().sendBotCommand({command:e.currentTarget.innerText})}function p(e){Object(r.d)().setLocalTextSearchQuery({query:e.currentTarget.innerText}),Object(r.d)().searchTextMessagesLocal()}},function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var a=n(0),r=n(10);function c(e,t){Object(a.n)(()=>{const t=e.current;return()=>{t&&Object(r.b)(()=>{t.pause(),t.src="",t.load()})}},t)}},,,function(e,t,n){},,,function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(0);function r(e,t){const n=Object(a.q)(e),[r,c]=Object(a.r)(t);return[r,Object(a.m)(e=>{c(t=>n.current(t,e))},[])]}},function(e,t,n){"use strict";var a=n(0),r=n(9),c=n(25),i=n(16),s=n(20),o=n(21);n(203);t.a=Object(a.h)(({ref:e,children:t,parentContainerClassName:n,value:l,inputId:d,className:u,focused:m,isLoading:b,placeholder:h,disabled:f,autoComplete:p,canClose:O,onChange:g,onReset:v,onFocus:j,onBlur:E})=>{let y=Object(a.q)(null);e&&(y=e);const[C,N,T]=Object(c.a)(m);Object(a.n)(()=>{y.current&&(m?y.current.focus():y.current.blur())},[m,h]);const w=Object(i.a)();const I=Object(a.m)(e=>{if("ArrowDown"===e.key||"Enter"===e.key){const e=document.querySelector(`.${n} .ListItem-button`);e&&e.focus()}},[n]);return a.a.createElement("div",{className:Object(r.a)("SearchInput",u,C&&"has-focus"),dir:w.isRtl?"rtl":void 0},t,a.a.createElement("input",{ref:y,id:d,type:"text",dir:"auto",placeholder:h||w("Search"),className:"form-control",value:l,disabled:f,autoComplete:p,onChange:function(e){const{currentTarget:t}=e;g(t.value)},onFocus:function(){N(),j&&j()},onBlur:function(){T(),E&&E()},onKeyDown:I}),a.a.createElement("i",{className:"icon-search"}),b&&a.a.createElement(s.a,null),!b&&(l||O)&&v&&a.a.createElement(o.a,{round:!0,size:"tiny",color:"translucent",onClick:v},a.a.createElement("span",{className:"icon-close"})))})},function(e,t,n){"use strict";var a=n(6);t.a=(e,t)=>{a.e&&(e.style.overflow="hidden"),void 0!==t&&(e.scrollTop=t),a.e&&(e.style.overflow="")}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(7),i=n(4),s=n(22),o=n(16);n(212);t.a=Object(a.h)(Object(r.h)((e,{typingStatus:t})=>{if(!t.userId)return{};return{typingUser:Object(c.Jb)(e,t.userId)}})(({typingStatus:e,typingUser:t})=>{const n=Object(o.a)(),r=t&&!t.isSelf&&Object(i.ab)(t);return a.a.createElement("p",{className:"typing-status",dir:n.isRtl?"rtl":"auto"},r&&a.a.createElement("span",{className:"sender-name",dir:"auto"},Object(s.a)(r)),n(e.action).replace("{user}","").trim(),a.a.createElement("span",{className:"ellipsis"}))}))},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(7),i=n(4),s=n(3),o=n(16),l=n(22),d=n(114),u=n(112),m=n(21);n(215);t.a=Object(a.h)(Object(r.h)((e,{chat:t})=>{const n=Object(i.ob)(t.id),a=Object(c.P)(e,t.id),r=n&&Object(c.Jb)(e,Object(i.W)(t)),s=r&&Object(i.Bb)(r)&&!t.isSupport,o=n&&!a&&!s,l=n?Object(i.ab)(Object(c.Jb)(e,Object(i.W)(t))):void 0;return{isPrivateChat:n,isChatWithSelf:a,isBot:s,isChannel:Object(i.mb)(t),isBasicGroup:Object(i.lb)(t),isSuperGroup:Object(i.qb)(t),currentUserId:e.currentUserId,canDeleteForAll:o,contactName:l}},(e,t)=>Object(s.l)(t,["leaveChannel","deleteHistory","deleteChannel","deleteChatUser","blockContact"]))(({isOpen:e,chat:t,isChannel:n,isPrivateChat:r,isChatWithSelf:c,isBot:s,isBasicGroup:b,isSuperGroup:h,currentUserId:f,canDeleteForAll:p,contactName:O,onClose:g,onCloseAnimationEnd:v,leaveChannel:j,deleteHistory:E,deleteChannel:y,deleteChatUser:C,blockContact:N})=>{const T=Object(o.a)(),w=Object(i.k)(T,t),I=Object(a.m)(()=>{E({chatId:t.id,shouldDeleteForAll:!0}),g()},[E,t.id,g]),M=Object(a.m)(()=>{E({chatId:t.id,shouldDeleteForAll:!0}),N({contactId:t.id,accessHash:t.accessHash}),g()},[E,t.id,t.accessHash,N,g]),k=Object(a.m)(()=>{r?E({chatId:t.id,shouldDeleteForAll:!1}):b?(C({chatId:t.id,userId:f}),E({chatId:t.id,shouldDeleteForAll:!1})):!n&&!h||t.isCreator?(n||h)&&t.isCreator&&y({chatId:t.id}):j({chatId:t.id}),g()},[r,b,n,h,f,t.isCreator,t.id,g,E,C,j,y]);return a.a.createElement(u.a,{isOpen:e,className:"DeleteChatModal",header:a.a.createElement("div",{className:"modal-header",dir:T.isRtl?"rtl":void 0},a.a.createElement(d.a,{size:"tiny",chat:t,isSavedMessages:c}),a.a.createElement("h3",{className:"modal-title"},T(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"ChannelDelete":b||h?"Group.LeaveGroup":"DeleteChatUser"))),onClose:g,onCloseAnimationEnd:v},n&&t.isCreator?a.a.createElement("p",null,Object(l.a)(T("ChatList.DeleteAndLeaveGroupConfirmation",w),["simple_markdown"])):n&&!t.isCreator||b||h?a.a.createElement("p",null,Object(l.a)(T("ChannelLeaveAlertWithName",w),["simple_markdown"])):a.a.createElement("p",null,Object(l.a)(T("ChatList.DeleteChatConfirmation",O),["simple_markdown"])),s&&a.a.createElement(m.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:M},T("DeleteAndStop")),p&&a.a.createElement(m.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:I},O?Object(l.a)(T("ChatList.DeleteForEveryone",O)):T("DeleteForAll")),a.a.createElement(m.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:k},T(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"Chat.Input.Delete":b||h?"Group.LeaveGroup":p?"ChatList.DeleteForCurrentUser":"Delete")),a.a.createElement(m.a,{className:"confirm-dialog-button",isText:!0,onClick:g},T("Cancel")))}))},function(e,t,n){"use strict";var a=n(0),r=n(40),c=n(29),i=n(9);t.a=({isOpen:e,isCustom:t,id:n,className:s,onClick:o,children:l})=>{const{shouldRender:d,transitionClassNames:u}=Object(r.a)(e,void 0,void 0,!t&&void 0),m=Object(c.a)(e),b=Object(c.a)(l),h=Object(a.q)();return m&&!e&&(h.current=b),d&&a.a.createElement("div",{id:n,className:Object(i.a)(s,u),onClick:o},e?l():h.current())}},function(e,t,n){"use strict";function a(e){e.dataset.patchedForSafari||(e.addEventListener("play",()=>{const t=e.currentTime;e.addEventListener("progress",(function n(){e.buffered.length&&(e.dataset.patchForSafariInProgress="true",e.currentTime=e.duration-1,e.addEventListener("progress",()=>{delete e.dataset.patchForSafariInProgress,e.currentTime=t,e.paused&&e.play()},{once:!0}),e.removeEventListener("progress",n))}))},{once:!0}),e.dataset.patchedForSafari="true")}function r(e){return Boolean(e.dataset.patchForSafariInProgress)}n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";var a=n(0),r=n(29);t.a=(e,t,n)=>{const c=Object(r.a)(t);return Object(a.o)(()=>e(c||[]),t,n)}},function(e,t,n){"use strict";var a=n(0),r=n(60),c=n(4),i=n(109),s=n(123),o=n(110),l=n(186),d=n(187);t.a=Object(a.h)(({message:e,observeIntersection:t,smaller:n,uploadProgress:u,withDate:m,datetime:b,className:h,sender:f,isSelected:p,isSelectable:O,onCancelUpload:g,onMediaClick:v,onDateClick:j})=>{const E=Object(a.q)(null),y=e.content.document,C=Object(r.b)(y)||"",{fileName:N,size:T,timestamp:w}=y,I=v&&Boolean(y.mediaType),M=Object(i.b)(E,t),[k,S]=Object(a.r)(!1),{mediaData:L,downloadProgress:A}=Object(s.a)(Object(c.E)(e,"download"),!k),{isUploading:x,isTransferring:D,transferProgress:R}=Object(c.r)(e,u||A,k),F=Object(r.c)(y),_=F?Object(c.F)(e):void 0,P=F?y.previewBlobUrl:void 0,U=Object(o.a)(Object(c.E)(e,"pictogram"),!M),B=Object(a.m)(()=>{I?v():x?g&&g():S(e=>!e)},[I,x,g,v]),q=Object(a.m)(()=>{j(e.id,e.chatId)},[j,e.id,e.chatId]);return Object(a.n)(()=>{k&&L&&(Object(l.a)(L,N),S(!1))},[N,L,k]),a.a.createElement(d.a,{ref:E,name:N,extension:C,size:T,timestamp:m?b||w:void 0,thumbnailDataUri:_,previewData:P||U,smaller:n,isTransferring:D,isUploading:x,transferProgress:R,className:h,sender:f,isSelectable:O,isSelected:p,actionIcon:I?Object(c.wb)(e)?"icon-play":"icon-eye":"icon-download",onClick:B,onDateClick:j?q:void 0})})},function(e,t,n){"use strict";var a=n(0),r=n(15),c=n(24);t.a=Object(a.h)(e=>{const{isOpen:t}=e,n=Object(c.a)(r.a.Extra,"StickerSetModal",!t);return n?a.a.createElement(n,e):void 0})},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(0),r=n(169),c=n(31),i=n(6);function s(e,t=!1,n){const s=Object(a.q)(null),o=Object(c.a)();return Object(a.n)(()=>{const a=s.current;if(!e||!a||t)return;const c=new Image,o=()=>{a.width=c.width,a.height=c.height;const e=a.getContext("2d",{alpha:!1});i.c&&(e.filter="blur(2px)"),e.drawImage(c,-4,-4,a.width+8,a.height+8),i.c||Object(r.a)(e,0,0,a.width,a.height,2,2)};c.onload=()=>{n?requestAnimationFrame(o):o()},c.src=e},[s,e,o,t,n]),s}},function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));const a=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],r=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];function c(e,t,n,c,i,s,o){if(Number.isNaN(s)||s<1)return;s|=0,Number.isNaN(o)&&(o=1),(o|=0)>3&&(o=3),o<1&&(o=1);const l=e.getImageData(t,n,c,i),d=l.data;let u,m,b,h,f,p,O,g,v,j,E,y,C=c-1,N=i-1,T=s+1,w=[],I=[],M=[],k=a[s],S=r[s],L=[],A=[];for(;o-- >0;){for(y=E=0,f=0;fC?C:p)<<2),u+=d[O++],m+=d[O++],b+=d[O++];for(h=0;h0?O<<2:0),g=y+L[h],v=y+A[h],u+=d[g++]-d[v++],m+=d[g++]-d[v++],b+=d[g++]-d[v++],E++;y+=c<<2}for(h=0;hN?0:c,u+=w[j],m+=I[j],b+=M[j];for(E=h<<2,f=0;f>>S,d[E+1]=m*k>>>S,d[E+2]=b*k>>>S,0==h&&(L[f]=((O=f+T)0?O*c:0),g=h+L[f],v=h+A[f],u+=w[g]-w[v],m+=I[g]-I[v],b+=M[g]-M[v],E+=c<<2}}e.putImageData(l,t,n)}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(9),i=n(49),s=n(40),o=n(80),l=n(25),d=n(16),u=n(21);n(251);const m={B:"bold",STRONG:"bold",I:"italic",EM:"italic",U:"underline",DEL:"strikethrough",CODE:"monospace"};t.a=Object(a.h)(({isOpen:e,anchorPosition:t,selectedRange:n,onClose:b})=>{const h=Object(a.q)(null),f=Object(a.q)(null),{shouldRender:p,transitionClassNames:O}=Object(s.a)(e),[g,v,j]=Object(l.a)(),[E,y]=Object(a.r)(""),[C,N]=Object(a.r)(!1),[T,w]=Object(a.r)(),[I,M]=Object(a.r)({});Object(a.n)(()=>e?Object(i.a)(b):void 0,[e,b]),Object(o.a)(e,h,b),Object(a.n)(()=>{g?f.current.focus():(y(""),N(!1))},[g]),Object(a.n)(()=>{p||(j(),M({}),w(void 0))},[j,p]),Object(a.n)(()=>{if(!e||!n)return;const t={};let{parentElement:a}=n.commonAncestorContainer;for(;a&&a.id!==r.z;){const e=m[a.tagName];e&&(t[e]=!0),a=a.parentElement}M(t)},[e,n,v]);const k=Object(a.m)(()=>{if(n)return n.toString()},[n]),S=Object(a.m)(()=>{if(n)return n.commonAncestorContainer.parentElement},[n]);function L(){const e=f.current;if(!e)return;const{offsetWidth:t,scrollWidth:n,scrollLeft:a}=e;if(n<=t)return void w(void 0);let r="";a0&&(r+=" mask-left"),w(r)}function A(e){if(I[e])return"active";if("monospace"===e||"strikethrough"===e){if(Object.keys(I).some(t=>t!==e&&!!I[t]))return"disabled"}else if(I.monospace||I.strikethrough)return"disabled"}const x=Object(a.m)(()=>{M(e=>(document.execCommand(e.bold?"removeFormat":"bold"),Object.keys(e).forEach(t=>{"italic"!==t&&"underline"!==t||!e[t]||document.execCommand(t)}),{...e,bold:!e.bold}))},[]),D=Object(a.m)(()=>{document.execCommand("italic"),M(e=>({...e,italic:!e.italic}))},[]),R=Object(a.m)(()=>{document.execCommand("underline"),M(e=>({...e,underline:!e.underline}))},[]),F=Object(a.m)(()=>{if(I.strikethrough){const e=S();if(!n||!e||"DEL"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void M(e=>({...e,strikethrough:!1}))}const e=k();document.execCommand("insertHTML",!1,`${e}`),b()},[S,k,b,n,I.strikethrough]),_=Object(a.m)(()=>{if(I.monospace){const e=S();if(!n||!e||"CODE"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void M(e=>({...e,monospace:!1}))}const e=k();document.execCommand("insertHTML",!1,`${e}`),b()},[S,k,b,n,I.monospace]);function P(){const e=E.includes("://")?E:"http://"+E;if(C){const t=S();if(!t||"A"!==t.tagName)return;return t.href=e,void b()}const t=k();!function(){if(!n)return;const e=window.getSelection();e&&(e.removeAllRanges(),e.addRange(n))}(),document.execCommand("insertHTML",!1,`${t}`),b()}const U=Object(a.m)(e=>{const t={KeyK:v,KeyB:x,KeyU:R,KeyI:D,KeyM:_,KeyS:F}[e.code];!e.altKey&&(e.ctrlKey||e.metaKey)&&t&&(e.preventDefault(),e.stopPropagation(),t())},[x,D,R,_,F,v]);Object(a.n)(()=>(e&&document.addEventListener("keydown",U),()=>document.removeEventListener("keydown",U)),[e,U]);const B=Object(d.a)();if(!p)return;const q=Object(c.a)("TextFormatter",O,g&&"link-control-shown"),H=Object(c.a)("TextFormatter-link-url-confirm",!!E.length&&"shown"),$=t?`left: ${t.x}px; top: ${t.y}px;--text-formatter-left: ${t.x}px;`:"";return a.a.createElement("div",{ref:h,className:q,style:$,onKeyDown:function(e){"Enter"===e.key&&g&&(P(),e.preventDefault())}},a.a.createElement("div",{className:"TextFormatter-buttons"},a.a.createElement(u.a,{color:"translucent",ariaLabel:"Bold text",className:A("bold"),onClick:x},a.a.createElement("i",{className:"icon-bold"})),a.a.createElement(u.a,{color:"translucent",ariaLabel:"Italic text",className:A("italic"),onClick:D},a.a.createElement("i",{className:"icon-italic"})),a.a.createElement(u.a,{color:"translucent",ariaLabel:"Underlined text",className:A("underline"),onClick:R},a.a.createElement("i",{className:"icon-underlined"})),a.a.createElement(u.a,{color:"translucent",ariaLabel:"Strikethrough text",className:A("strikethrough"),onClick:F},a.a.createElement("i",{className:"icon-strikethrough"})),a.a.createElement(u.a,{color:"translucent",ariaLabel:"Monospace text",className:A("monospace"),onClick:_},a.a.createElement("i",{className:"icon-monospace"})),a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement(u.a,{color:"translucent",ariaLabel:B("TextFormat.AddLinkTitle"),onClick:v},a.a.createElement("i",{className:"icon-link"}))),a.a.createElement("div",{className:"TextFormatter-link-control"},a.a.createElement("div",{className:"TextFormatter-buttons"},a.a.createElement(u.a,{color:"translucent",ariaLabel:B("Cancel"),onClick:j},a.a.createElement("i",{className:"icon-arrow-left"})),a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement("div",{className:Object(c.a)("TextFormatter-link-url-input-wrapper",T)},a.a.createElement("input",{ref:f,className:"TextFormatter-link-url-input",type:"text",value:E,placeholder:"Enter URL...",autoComplete:"off",inputMode:"url",dir:"auto",onChange:function(e){y(e.target.value),L()},onScroll:L})),a.a.createElement("div",{className:H},a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement(u.a,{color:"translucent",ariaLabel:B("Save"),className:"color-primary",onClick:P},a.a.createElement("i",{className:"icon-check"}))))))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"c",(function(){return i})),n.d(t,"b",(function(){return s}));var a=n(2);const r=navigator.clipboard&&window.ClipboardItem,c=document.createElement("textarea");c.setAttribute("readonly",""),c.tabIndex=-1,c.className="visually-hidden";const i=e=>{c.value=e,document.body.appendChild(c);const t=document.getSelection();if(t){const e=t.rangeCount>0&&t.getRangeAt(0);c.select(),document.execCommand("copy"),e&&(t.removeAllRanges(),t.addRange(e))}document.body.removeChild(c)},s=e=>{if(!e)return;const t=document.createElement("canvas"),n=t.getContext("2d"),a=new Image;a.onload=e=>{if(n&&e.currentTarget){const a=e.currentTarget;t.width=a.width,t.height=a.height,n.drawImage(a,0,0,a.width,a.height),t.toBlob(o,"image/png",1)}},a.src=e};async function o(e){if(e&&r)try{await navigator.clipboard.write([new window.ClipboardItem({[e.type]:e})])}catch(e){a.r&&console.error(e)}}},function(e,t,n){"use strict";var a=n(0),r=n(30),c=n(4),i=n(110),s=n(117);n(259);t.a=Object(a.h)(({message:e,idPrefix:t="shared-media",onClick:n})=>{const o=Object(a.m)(()=>{n(e.id,e.chatId)},[e.id,e.chatId,n]),l=Object(c.F)(e),d=Object(i.a)(Object(c.E)(e,"pictogram")),{shouldRenderThumb:u,shouldRenderFullMedia:m,transitionClassNames:b}=Object(s.a)(d,"slow"),h=Object(c.Q)(e);return a.a.createElement("div",{id:`${t}${e.id}`,className:"Media scroll-item",onClick:n?o:void 0},u&&a.a.createElement("img",{src:l,alt:""}),m&&a.a.createElement("img",{src:d,className:b+" full-media",alt:""}),h&&a.a.createElement("span",{className:"video-duration"},h.isGif?"GIF":Object(r.e)(h.duration)))})},function(e,t,n){"use strict";var a=n(0),r=n(4),c=n(115),i=n(48),s=n(47),o=n(108),l=n(111),d=n(130),u=n(146),m=n(133),b=n(16),h=n(20);n(195);t.a=Object(a.h)(({itemIds:e,selectedIds:t,filterValue:n,filterPlaceholder:f,notFoundText:p,searchInputId:O,isLoading:g,noScrollRestore:v,onSelectedIdsChange:j,onFilterChange:E,onLoadMore:y})=>{const C=Object(a.q)(null),N=t.length>10;Object(a.n)(()=>{setTimeout(()=>{requestAnimationFrame(()=>{C.current.focus()})},500)},[]);const T=Object(a.m)(e=>{const n=[...t];n.includes(e)?n.splice(n.indexOf(e),1):n.push(e),j(n),E("")},[t,j,E]),w=Object(a.m)(e=>{const{value:t}=e.currentTarget;E(t)},[E]),[I,M]=Object(m.a)(y,e,Boolean(n)),k=Object(b.a)();return a.a.createElement("div",{className:"Picker"},a.a.createElement("div",{className:"picker-header custom-scroll",dir:k.isRtl?"rtl":void 0},t.map((e,n)=>a.a.createElement(u.a,{chatOrUserId:e,isMinimized:N&&na.a.createElement(o.a,{key:e,className:"chat-item-clickable picker-list-item",onClick:()=>T(e),ripple:!0},a.a.createElement(i.a,{label:"",checked:t.includes(e)}),Object(r.ob)(e)?a.a.createElement(l.a,{userId:e}):a.a.createElement(d.a,{chatId:e})))):g||!I||I.length?a.a.createElement(h.a,null):a.a.createElement("p",{className:"no-results"},p||"Sorry, nothing found."))})},,function(e,t,n){"use strict";var a=n(0),r=n(6),c=n(30),i=n(4);var s=n(9),o=n(22);var l=n(123),d=n(40),u=n(141),m=n(184),b=n(188),h=n(16),f=n(21),p=n(124),O=n(32);n(231);const g=r.l?20:25,v=r.l?50:75;function j(e,t,{handleStartSeek:n,handleSeek:r,handleStopSeek:c}){return a.a.createElement("div",{className:"seekline no-selection",onMouseDown:n,onMouseMove:r,onMouseUp:c},a.a.createElement("span",{className:"seekline-buffered-progress"},a.a.createElement("i",{style:`transform: translateX(${100*t}%)`})),a.a.createElement("span",{className:"seekline-play-progress"},a.a.createElement("i",{style:`transform: translateX(${100*e}%)`})),a.a.createElement("span",{className:"seekline-thumb"},a.a.createElement("i",{style:`transform: translateX(${100*e}%)`})))}t.a=Object(a.h)(({theme:e,message:t,senderTitle:n,uploadProgress:E,target:y,date:C,lastSyncTime:N,className:T,isSelectable:w,isSelected:I,onPlay:M,onReadMedia:k,onCancelUpload:S,onDateClick:L})=>{const{content:{audio:A,voice:x},isMediaUnread:D}=t,R=Boolean(x),F=Object(a.q)(!1),_=Object(h.a)(),[P,U]=Object(a.r)(!1),B=N,{mediaData:q,downloadProgress:H}=Object(l.a)(Object(i.E)(t,"inline"),!B,Object(i.D)(t,"inline"));const{isBuffered:$,bufferedProgress:K,bufferingHandlers:z,checkBuffering:V}=Object(u.a)(),{isPlaying:Y,playProgress:W,playPause:G,setCurrentTime:X,duration:J}=Object(m.a)(Object(i.C)(t),Object(i.q)(t),q,z,V,P,(function(){U(!0),M(t.id,t.chatId)}),Object(i.xb)(t));Object(a.n)(()=>{U(Y)},[Y]);const{isDownloadStarted:Q,downloadProgress:Z,handleDownloadClick:ee}=Object(b.a)(Object(i.E)(t,"download"),Object(i.u)(t)),te=P&&!$,{isUploading:ne,isTransferring:ae,transferProgress:re}=Object(i.r)(t,Q?Z:E||H,te||Q),{shouldRender:ce,transitionClassNames:ie}=Object(d.a)(ae),se=Object(a.m)(()=>{ne?S&&S():(Y||M(t.id,t.chatId),U(!P),G())},[Y,ne,t.id,t.chatId,S,M,G,P]);Object(a.n)(()=>{Y&&k&&D&&k()},[Y,D,k]);const oe=Object(a.m)(e=>{if(F.current){const t=e.currentTarget.closest(".seekline,.waveform");if(t){const{width:n,left:a}=t.getBoundingClientRect();X(J*((e.clientX-a)/n))}}},[J,X]),le=Object(a.m)(e=>{F.current=!0,oe(e)},[oe]),de=Object(a.m)(()=>{F.current=!1},[]),ue=Object(a.m)(()=>{L(t.id,t.chatId)},[L,t.id,t.chatId]);const me={handleStartSeek:le,handleSeek:oe,handleStopSeek:de},be=Object(i.yb)(t),he=Object(a.p)(()=>x&&function(e,t=0,n=!1,{handleStartSeek:r,handleSeek:c,handleStopSeek:i},s){const{waveform:o,duration:l}=e;if(!o)return;const d="dark"===s?"#494B75":"#CBCBCB",u="dark"===s?"#C0BBED":"#B0DEA6",m="dark"===s?"#868DF5":"#54a3e6",b="dark"===s?"#FFFFFF":"#53ad53",h=Math.min(l/30,1),f=Math.round(g+(v-g)*h),p=function(e){const t=8*e.length,n=Math.floor(t/5);if(!n)return[];const a=Array(n),r=e;for(let e=0,t=n-1;e!==t;++e){const t=Math.floor(5*e/8),n=Math.floor(5*e%8),c=r[t]+(r[t+1]<<8);a[e]=c>>n&31}const c=Math.floor(5*(n-1)/8),i=Math.floor(5*(n-1)%8),s=r[c]+(r[c+1]<<8);return a[n-1]=s>>i&31,a}(new Uint8Array(o)),{data:O,peak:j}=function(e,t){let n=0;const a=new Array(t),r=e.length/t,c=e[0],i=e[e.length-1];for(let d=0;d{s.globalAlpha=i/e.length>=t?.5:1,s.fillStyle=t>i/e.length?r:a;const o=Math.max(2,c/Math.max(1,n)*23);!function(e,t,n,a,r,c){a<2*c&&(c=a/2);r<2*c&&(c=r/2);e.beginPath(),e.moveTo(t+c,n),e.arcTo(t+a,n,t+a,n-r,c),e.arcTo(t+a,n-r,t,n-r,c),e.arcTo(t,n-r,t,n,c),e.arcTo(t,n,t+a,n,c),e.closePath()}(s,4*i,23,2,o,1),s.fill()}),{src:i.toDataURL(),width:c,height:23}}(O,t,{peak:j,fillStyle:n?u:d,progressFillStyle:n?b:m});return a.a.createElement("img",{src:E,alt:"",width:y,height:C,className:"waveform",draggable:!1,onMouseDown:r,onMouseMove:c,onMouseUp:i})}(x,W,be,me,e),[x,W,be,me,e]),fe=Object(s.a)("Audio media-inner",T,be&&!y&&"own",y&&"bigger",I&&"audio-is-selected"),pe=["toggle-play"];te?pe.push("loading"):Y?pe.push("pause"):Y||pe.push("play");const Oe=Y||W>0&&W<1,ge=Object(s.a)("content",Oe&&"with-seekline");return a.a.createElement("div",{className:fe,dir:_.isRtl?"rtl":void 0},w&&a.a.createElement("div",{className:"message-select-control"},I&&a.a.createElement("i",{className:"icon-select"})),a.a.createElement(f.a,{round:!0,ripple:!r.l,size:y?"smaller":"tiny",className:pe.join(" "),ariaLabel:Y?"Pause audio":"Play audio",onClick:se,isRtl:_.isRtl},a.a.createElement("i",{className:"icon-play"}),a.a.createElement("i",{className:"icon-pause"})),ce&&a.a.createElement("div",{className:Object(s.a)("media-loading",ie,te&&"interactive")},a.a.createElement(p.a,{progress:re,transparent:!0,size:y?"m":"s",onClick:te?se:void 0,noCross:!te})),A&&a.a.createElement(f.a,{round:!0,size:"tiny",className:"download-button",ariaLabel:Q?"Cancel download":"Download",onClick:ee},a.a.createElement("i",{className:Q?"icon-close":"icon-arrow-down"})),"searchResult"===y&&a.a.createElement(a.a.Fragment,null,a.a.createElement("div",{className:ge},a.a.createElement("div",{className:"content-row"},a.a.createElement("p",{className:"title",dir:"auto"},Object(o.a)(function(){if(R)return n||"Voice";const{title:e,fileName:t}=A;return e||t}())),a.a.createElement("div",{className:"message-date"},C&&a.a.createElement(O.a,{className:"date",onClick:ue},Object(c.g)(_,1e3*C)))),Oe&&j(W,K,me),!Oe&&a.a.createElement("p",{className:"duration",dir:"auto"},W>0?Object(c.e)(J*W)+" / ":void 0,function(){if(R)return Object(c.e)(x.duration);const{performer:e}=A;return a.a.createElement(a.a.Fragment,null,e&&Object(o.a)(e),e&&n&&a.a.createElement("span",null,"•"),n&&Object(o.a)(n))}()))),"searchResult"!==y&&A&&function(e,t,n,r,i,s,l,d){const{title:u,performer:m,duration:b,fileName:h}=t,f=n||r>0&&r<1;return a.a.createElement("div",{className:"content"},a.a.createElement("p",{className:"title",dir:"auto"},Object(o.a)(u||h)),f&&j(r,i,s),!f&&a.a.createElement("div",{className:"meta",dir:"auto"},a.a.createElement("span",{className:"performer"},Object(o.a)(m||"Unknown")),l&&a.a.createElement(a.a.Fragment,null," ","•"," ",a.a.createElement(O.a,{className:"date",onClick:d},Object(c.d)(e,1e3*l)))),a.a.createElement("p",{className:"duration",dir:"auto"},r>0?Object(c.e)(b*r)+" / ":void 0,Object(c.e)(b)))}(_,A,Y,W,K,me,C,L?ue:void 0),"searchResult"!==y&&x&&function(e,t,n){return a.a.createElement("div",{className:"content"},t,a.a.createElement("p",{className:"voice-duration",dir:"auto"},Object(c.e)(e.duration),n&&a.a.createElement("span",null,"•")))}(x,he,D))})},function(e,t,n){"use strict";var a=n(0),r=n(147),c=n(29),i=n(148),s=n(16),o=n(9),l=n(22);n(209);var d=Object(a.h)(({className:e,title:t,active:n,badgeCount:r,isBadgeActive:c,previousActiveTab:i,onClick:s,clickArg:d})=>{const u=Object(a.q)(null);return Object(a.o)(()=>{if(!n||void 0===i)return;const e=u.current,t=e.querySelector("i"),a=e.parentElement.children[i];if(!a)return;const r=a.querySelector("i");r.classList.remove("animate"),t.classList.remove("animate");const c=r.parentElement.offsetLeft-t.parentElement.offsetLeft,s=r.clientWidth/t.clientWidth;t.style.transform=`translate3d(${c}px, 0, 0) scale3d(${s}, 1, 1)`,requestAnimationFrame(()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{t.classList.add("animate"),t.style.transform="none"})})})},[n,i]),a.a.createElement("button",{type:"button",className:Object(o.a)("Tab",e,n&&"active"),onClick:()=>s(d),ref:u},a.a.createElement("span",null,Object(l.a)(t),!!r&&a.a.createElement("span",{className:Object(o.a)("badge",c&&"active")},r),a.a.createElement("i",null)))});n(210);t.a=Object(a.h)(({tabs:e,activeTab:t,big:n,onSwitchTab:o})=>{const l=Object(a.q)(null),u=Object(c.a)(t);Object(i.a)(l.current),Object(a.n)(()=>{const e=l.current;if(e.scrollWidth<=e.offsetWidth)return;const t=e.querySelector(".Tab.active");if(t){const n=t.offsetLeft-e.offsetWidth/2+t.offsetWidth/2;if(Math.abs(n-e.scrollLeft)<16)return;Object(r.a)(e,n)}},[t]);const m=Object(s.a)();return a.a.createElement("div",{className:"TabList no-selection no-scrollbar "+(n?"big":""),ref:l,dir:m.isRtl?"rtl":void 0},e.map((e,n)=>a.a.createElement(d,{key:e.title,title:m(e.title),active:n===t,badgeCount:e.badgeCount,isBadgeActive:e.isBadgeActive,previousActiveTab:u,onClick:o,clickArg:n})))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));const a={CHAT_RESTRICTED:"You can't send messages in this chat, you were restricted",CHAT_WRITE_FORBIDDEN:"You can't write in this chat",CHAT_SEND_POLL_FORBIDDEN:"You can't create polls in this chat",CHAT_SEND_STICKERS_FORBIDDEN:"You can't send stickers in this chat",CHAT_SEND_GIFS_FORBIDDEN:"You can't send gifs in this chat",CHAT_SEND_MEDIA_FORBIDDEN:"You can't send media in this chat",CHAT_LINK_EXISTS:"The chat is public, you can't hide the history to new users",SLOWMODE_WAIT_X:"Slowmode is enabled in this chat: you must wait for the specified number of seconds before sending another message to the chat.",USER_BANNED_IN_CHANNEL:"You're banned from sending messages in supergroups / channels",USER_IS_BLOCKED:"You were blocked by this user",YOU_BLOCKED_USER:"You blocked this user",IMAGE_PROCESS_FAILED:"Failure while processing image",MEDIA_EMPTY:"The provided media object is invalid",MEDIA_INVALID:"Media invalid",PHOTO_EXT_INVALID:"The extension of the photo is invalid",PHOTO_INVALID_DIMENSIONS:"The photo dimensions are invalid",PHOTO_SAVE_FILE_INVALID:"Internal issues, try again later",MESSAGE_DELETE_FORBIDDEN:"You can't delete one of the messages you tried to delete, most likely because it is a service message.",MESSAGE_POLL_CLOSED:"Poll closed",MESSAGE_EDIT_TIME_EXPIRED:"You can't edit this message anymore.",CHAT_ADMIN_REQUIRED:"You must be an admin in this chat to do this",PINNED_DIALOGS_TOO_MUCH:"Sorry, you can only pin 5 chats to the top",DIALOG_FILTERS_TOO_MUCH:"Sorry, you can't have more than 10 folders",CHANNEL_PRIVATE:"This channel is private",MEDIA_CAPTION_TOO_LONG:"The provided caption is too long",ADDRESS_STREET_LINE1_INVALID:"The address you provided is not valid",ADDRESS_STREET_LINE2_INVALID:"The address you provided is not valid",ADDRESS_CITY_INVALID:"The city you provided is not valid",ADDRESS_COUNTRY_INVALID:"The country you provided is not valid",ADDRESS_POSTCODE_INVALID:"The postcode you provided is not valid",ADDRESS_STATE_INVALID:"The state you provided is not valid",REQ_INFO_NAME_INVALID:"The name you provided is not valid",REQ_INFO_PHONE_INVALID:"The phone you provided is not valid",REQ_INFO_EMAIL_INVALID:"The email you provided is not valid",LINK_NOT_MODIFIED:"This discussion is already linked to the channel",SERVICE_WORKER_DISABLED:"Service Worker is disabled. Please reload the page without holding key.",CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS:"The provided caption is too long. Please remove {EXTRA_CHARS_COUNT} character{PLURAL_S}.",FRESH_RESET_AUTHORISATION_FORBIDDEN:"You can’t logout other sessions if less than 24 hours have passed since you logged on the current session",BOTS_TOO_MUCH:"There are too many bots in this chat/channel",BOT_GROUPS_BLOCKED:"This bot can't be added to groups",USERS_TOO_MUCH:"The maximum number of users has been exceeded",USER_CHANNELS_TOO_MUCH:"One of the users you tried to add is already in too many channels/supergroups",USER_KICKED:"This user was kicked from this supergroup/channel",USER_NOT_MUTUAL_CONTACT:"The provided user is not a mutual contact",USER_PRIVACY_RESTRICTED:"The user's privacy settings do not allow you to do this",INVITE_HASH_EMPTY:"The invite hash is empty",INVITE_HASH_EXPIRED:"The invite link has expired",INVITE_HASH_INVALID:"The invite hash is invalid",CHANNELS_TOO_MUCH:"You have joined too many channels/supergroups",USER_ALREADY_PARTICIPANT:"You already in the group",SCHEDULE_DATE_INVALID:"Invalid schedule date provided",WALLPAPER_DIMENSIONS_INVALID:"The wallpaper dimensions are invalid, please select another file"};function r(e){const{message:t,isSlowMode:n,textParams:r}=e;if(n){const e=t.indexOf(" (caused by");return e>0?t.substring(0,e):t}let c=a[t];return c&&r&&(c=Object.keys(r).reduce((e,t)=>e.replace(t,r[t]),c)),c}},function(e,t,n){"use strict";n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return r}));function a(e,t,n){c("transitionend",e,t,n)}function r(e,t,n){c("animationend",e,t,n)}function c(e,t,n,a){let r=!1;t.addEventListener(e,(function c(i){r||i.target!==i.currentTarget||a&&(i instanceof TransitionEvent&&i.propertyName===a||i instanceof AnimationEvent&&i.animationName===a)||(r=!0,t.removeEventListener(e,c),setTimeout(()=>{n()},50))}))}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(4),i=n(16);t.a=({chat:e,privateChatUser:t,handleDelete:n,folderId:s,isPinned:o,isMuted:l})=>{const d=Object(i.a)(),{toggleChatPinned:u,updateChatMutedState:m,toggleChatArchived:b,toggleChatUnread:h}=Object(r.d)();return Object(a.p)(()=>{if(!e)return;const a=t&&t.isSelf,r=e.unreadCount||e.hasUnreadMark?{title:d("MarkAsRead"),icon:"readchats",handler:()=>h({id:e.id})}:{title:d("MarkAsUnread"),icon:"unread",handler:()=>h({id:e.id})},i=o?{title:d("UnpinFromTop"),icon:"unpin",handler:()=>u({id:e.id,folderId:s})}:{title:d("PinToTop"),icon:"pin",handler:()=>u({id:e.id,folderId:s})},f=l?{title:d("ChatList.Unmute"),icon:"unmute",handler:()=>m({chatId:e.id,isMuted:!1})}:{title:d("ChatList.Mute"),icon:"mute",handler:()=>m({chatId:e.id,isMuted:!0})},p=Object(c.kb)(e)?{title:d("Unarchive"),icon:"unarchive",handler:()=>b({id:e.id})}:{title:d("Archive"),icon:"archive",handler:()=>b({id:e.id})};return[r,i,...a?[]:[f,p],{title:Object(c.ob)(e.id)?d("Delete"):d(Object(c.c)(e)?"DeleteChat":Object(c.mb)(e)?"LeaveChannel":"Group.LeaveGroup"),icon:"delete",destructive:!0,handler:n}]},[e,t,d,o,n,h,u,s,m,b,l])}},function(e,t,n){"use strict";var a=n(0),r=n(30),c=n(16),i=n(181);n(214);t.a=Object(a.h)(({message:e,outgoingStatus:t})=>{const n=Object(c.a)();return a.a.createElement("div",{className:"LastMessageMeta"},t&&a.a.createElement(i.a,{status:t}),a.a.createElement("span",{className:"time"},Object(r.g)(n,1e3*e.date)))})},function(e,t,n){"use strict";var a,r=n(0),c=n(113);n(213);!function(e){e[e.failed=0]="failed",e[e.pending=1]="pending",e[e.succeeded=2]="succeeded",e[e.read=3]="read"}(a||(a={}));t.a=Object(r.h)(({status:e})=>r.a.createElement("div",{className:"MessageOutgoingStatus"},r.a.createElement(c.a,{name:"reveal",activeKey:a[e]},()=>r.a.createElement("i",{className:"icon-message-"+e}))))},function(e,t,n){"use strict";var a=n(0);t.a=(e,t,n,r,c=0,i=0)=>{const[s,o]=Object(a.r)("right"),[l,d]=Object(a.r)("bottom"),[u,m]=Object(a.r)("");return Object(a.n)(()=>{const a=t();if(!e||!a)return;let{x:s,y:l}=e;const u={width:0,left:0,height:0,top:0},b=r(),h=n(),f=a.getBoundingClientRect(),p=b?{width:b.offsetWidth,height:b.offsetHeight}:u,O=h?h.getBoundingClientRect():u;let g;s+p.width+c0?(g="right",s-=3):(g="left",s=16),o(g),l+p.height{t&&!l&&d&&!s.current&&(s.current=window.setTimeout(()=>{s.current=void 0,o()},t))},[e]),s.current&&t&&!l?n:e}},function(e,t,n){"use strict";var a=n(0),r=n(185),c=n(58),i=n(164),s=n(52);t.a=(e,t,n,o,l,d=!1,u,m=!1)=>{const b=Object(a.q)(null),[h,f]=Object(a.r)(!1);let p=h;const[O,g]=Object(a.r)(0);Object(s.a)(()=>{b.current=Object(r.a)(e,(e,n)=>{switch(e){case"onPlay":f(!0);break;case"onPause":f(!1);break;case"onTimeUpdate":{const{proxy:e}=b.current,n=e.duration&&Number.isFinite(e.duration)?e.duration:t;g(e.currentTime/n);break}}o&&o[e]&&o[e](n)},u);const{proxy:n}=b.current;h||n.paused||(f(!0),p=!0),l&&l(n)},[e]);const{play:v,pause:j,setCurrentTime:E,proxy:y,destroy:C}=b.current,N=y.duration&&Number.isFinite(y.duration)?y.duration:t;Object(a.n)(()=>{N&&!Object(i.a)(y)&&g(y.currentTime/N)},[N,O,y]),Object(a.n)(()=>()=>{C(m)},[C,m]),Object(c.a)(([e,t])=>{e===d&&n===t||y.src&&y.paused||d&&n&&!h&&v(n)},[d,n,h,v,y.src,y.paused]);const T=Object(a.m)(()=>{h?j():n&&v(n)},[n,j,v,h]);return{isPlaying:p,playProgress:O,playPause:T,setCurrentTime:E,audioProxy:y,duration:N}}},function(e,t,n){"use strict";n.d(t,"b",(function(){return u})),n.d(t,"a",(function(){return m}));var a=n(6),r=n(140),c=n(164),i=n(1),s=n(4);const o=new Map;let l,d=[];function u(){const e=l&&o.get(l);e&&e.audio.pause()}function m(e,t,n){o.has(e)||(o.set(e,function(e,t){const n=new Audio;function a(t){return a=>{o.has(e)&&(Object(c.a)(n)||o.get(e).handlers.forEach(e=>{e(t,a)}))}}return n.addEventListener("timeupdate",a("onTimeUpdate")),n.addEventListener("play",a("onPlay")),n.addEventListener("pause",a("onPause")),n.addEventListener("loadstart",a("onLoadStart")),n.addEventListener("loadeddata",a("onLoadedData")),n.addEventListener("playing",a("onPlaying")),n.addEventListener("ended",()=>{if(Object(c.a)(n))return;const t=d[d.indexOf(e)+1];if(!t)return;if(!o.has(t))return void Object(i.d)().openAudioPlayer(Object(s.Eb)(t));const a=o.get(t);a.onForcePlay&&a.onForcePlay(),l=t,a.audio.src&&Object(r.a)(a.audio)}),{audio:n,proxy:new Proxy(n,{get:(e,t)=>e[t]}),handlers:[],onForcePlay:t}}(e,n)),d.includes(e)||d.push(e));const{audio:u,proxy:m,handlers:b}=o.get(e);return b.push(t),{play(t){l&&l!==e&&o.get(l).audio.pause(),l=e,u.src||(u.src=t,u.preload="auto",t.includes("/progressive/")&&a.j&&Object(c.b)(u)),Object(r.a)(u)},pause(){l===e&&u.pause()},setCurrentTime(t){l===e&&(u.currentTime=t)},proxy:m,destroy(n=!1){const a=o.get(e);a&&(a.handlers=a.handlers.filter(e=>e!==t),a.handlers.length||(a.audio.pause(),o.delete(e),n&&(d=d.filter(t=>t!==e)),e===l&&(l=void 0)))}}}},function(e,t,n){"use strict";function a(e,t){const n=document.createElement("a");n.href=e,n.download=t,n.click()}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";var a=n(0),r=n(40),c=n(117),i=n(9),s=n(30),o=n(60),l=n(118),d=n(22),u=n(16),m=n(124),b=n(32);n(230);t.a=Object(a.h)(({ref:e,name:t,size:n,extension:h="",timestamp:f,sender:p,thumbnailDataUri:O,previewData:g,className:v,smaller:j,isTransferring:E,isUploading:y,isSelectable:C,isSelected:N,transferProgress:T,actionIcon:w,onClick:I,onDateClick:M})=>{const k=Object(u.a)();let S=Object(a.q)(null);e&&(S=e);const{shouldRender:L,transitionClassNames:A}=Object(r.a)(E,void 0,!0),x=Object(o.a)(h),D=Object(o.e)(n),{shouldRenderThumb:R,shouldRenderFullMedia:F,transitionClassNames:_}=Object(c.a)(g,"slow"),{width:P,height:U}=Object(l.k)(j),B=Object(i.a)("File",v,j&&"smaller",I&&!y&&"interactive",N&&"file-is-selected");return a.a.createElement("div",{ref:S,className:B,dir:k.isRtl?"rtl":void 0},C&&a.a.createElement("div",{className:"message-select-control"},N&&a.a.createElement("i",{className:"icon-select"})),a.a.createElement("div",{className:"file-icon-container",onClick:y?void 0:I},O||g?a.a.createElement("div",{className:"file-preview media-inner"},R&&a.a.createElement("img",{src:O,width:P,height:U,className:"thumbnail",alt:""}),F&&a.a.createElement("img",{src:g,className:"full-media "+_,width:P,height:U,alt:""})):a.a.createElement("div",{className:"file-icon "+x},h.length<=4&&a.a.createElement("span",{className:"file-ext",dir:"auto"},h)),L&&a.a.createElement("div",{className:Object(i.a)("file-progress",x,A)},a.a.createElement(m.a,{progress:T,size:j?"s":"m",onClick:y?I:void 0})),I&&a.a.createElement("i",{className:Object(i.a)("action-icon",w||"icon-download",L&&"hidden")})),a.a.createElement("div",{className:"file-info"},a.a.createElement("div",{className:"file-title",dir:"auto"},Object(d.a)(t)),a.a.createElement("div",{className:"file-subtitle",dir:"auto"},a.a.createElement("span",null,E&&T?Math.round(100*T)+"%":D),p&&a.a.createElement("span",{className:"file-sender"},Object(d.a)(p)),!p&&f&&a.a.createElement(a.a.Fragment,null," ",a.a.createElement(b.a,{onClick:M},Object(s.d)(k,1e3*f))))),p&&f&&a.a.createElement(b.a,{onClick:M},Object(s.g)(k,1e3*f)))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(0),r=n(123),c=n(186);function i(e,t){const[n,i]=Object(a.r)(!1),{mediaData:s,downloadProgress:o}=Object(r.a)(e,!n);Object(a.n)(()=>{n&&s&&(Object(c.a)(s,t),i(!1))},[t,s,n]),Object(a.n)(()=>{i(!1)},[e]);const l=Object(a.m)(e=>{e.stopPropagation(),i(e=>!e)},[]);return{isDownloadStarted:n,downloadProgress:o,handleDownloadClick:l}}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(40),i=n(9),s=n(49),o=n(128);n(236);t.a=Object(a.h)(({message:e,duration:t=3e3,containerId:n,onDismiss:l})=>{const[d,u]=Object(a.r)(!0),m=Object(a.q)(null),{transitionClassNames:b}=Object(c.a)(d),h=Object(a.m)(()=>{u(!1),setTimeout(l,150+r.c)},[l]);Object(a.n)(()=>d?Object(s.a)(h):void 0,[d,h]),Object(a.n)(()=>(m.current=window.setTimeout(h,t),()=>{m.current&&(clearTimeout(m.current),m.current=void 0)}),[t,h]);const f=Object(a.m)(()=>{m.current&&(clearTimeout(m.current),m.current=void 0)},[]),p=Object(a.m)(()=>{m.current=window.setTimeout(h,t)},[t,h]);return a.a.createElement(o.a,{className:"Notification-container",containerId:n},a.a.createElement("div",{className:Object(i.a)("Notification",b),onClick:h,onMouseEnter:f,onMouseLeave:p},a.a.createElement("div",{className:"content"},e)))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));function a(e,t){const{commonAncestorContainer:n}=e;let a=n,r=1;for(;a&&a.id!==t&&r<5;)a=a.parentElement,r++;return Boolean(a&&a.id===t)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return O}));var a=n(0),r=n(2),c=n(51),i=n(66),s=n(135),o=n(3),l=n(25);let d,u,m,b;const h=/(
|)/g,f=/ /g,p=/(
|<\/div>)/gi;try{b=new RegExp("(^|\\s):[-+_:\\p{L}\\p{N}]*$","gui")}catch(e){b=new RegExp("(^|\\s):[-+_:\\d\\wа-яё]*$","gi")}function O(e,t,O,g=r.z,v,j,E,y=!1){const[C,N,T]=Object(l.a)(),[w,I]=Object(a.r)(),[M,k]=Object(a.r)(),[S,L]=Object(a.r)({}),[A,x]=Object(a.r)(),[D,R]=Object(a.r)({}),[F,_]=Object(a.r)(!1),[P,U]=Object(a.r)(c.a),B=Object(a.p)(()=>w&&O.length?Object.values(Object(o.m)(w,O)):[],[w,O]);Object(a.n)(()=>{if(y)return;const e=()=>{I(m.emojis)};m?e():async function(){d||(d=n.e(1).then(n.t.bind(null,331,3)),u=(await d).default,m=Object(i.b)(u));return d}().then(e)},[y]),Object(a.n)(()=>{if(!w||y)return;const e=Object.values(w),t=Object(o.c)(e,"native"),n=j?Object(o.i)(j,e=>Object.values(Object(o.m)(t,e))):{},a=E?Object(o.i)(E,e=>Object.values(Object(o.m)(t,e))):{};L({...n,...a}),k([...Object.keys(n),...Object.keys(a)]);const r=e.reduce((e,t)=>(t.names.forEach(n=>{e[n]||(e[n]=[]),e[n].push(t)}),e),{});R(r),x(Object.keys(r))},[y,j,w,E]),Object(a.n)(()=>{if(!(e&&t&&w&&M&&M.length))return void T();const n=t.includes(":")&&function(e){const t=e.replace(f," ").replace(h,"\n").replace(p,"").match(b);return t?t[0].trim():void 0}(t);if(!n)return U(c.a),void T();const a=n.length>2&&n.endsWith(":"),r=n.substr(1,a?n.length-2:void 0);let i=[];if(_(a),r){if(r.length>=2){const e=M.filter(e=>e.startsWith(r)).sort();i=i.concat(Object(o.h)(Object.values(Object(o.m)(S,e))));const t=A.filter(e=>e.startsWith(r));i=i.concat(Object(o.h)(Object.values(Object(o.m)(D,t)))),i=Object(o.o)(i)}}else i=B;i.length?(a||N(),U(i.slice(0,36))):T()},[w,S,M,D,A,t,e,N,B,T,_]);const q=Object(a.m)((e,n)=>{const a=t.lastIndexOf(":",n?t.lastIndexOf(":")-1:void 0);if(-1!==a){v(`${t.substr(0,a)}${e}`);const n=document.getElementById(g);requestAnimationFrame(()=>{Object(s.a)(n,!0)})}T()},[t,g,v,T]);return Object(a.n)(()=>{C&&F&&P.length&&q(P[0].native,!0)},[P,q,C,F]),{isEmojiTooltipOpen:C,closeEmojiTooltip:T,filteredEmojis:P,insertEmoji:q}}},function(e,t,n){"use strict";var a=n(0),r=n(15),c=n(24);t.a=Object(a.h)(e=>{const{isOpen:t}=e,n=Object(c.a)(r.a.Extra,"EmojiTooltip",!t);return n?a.a.createElement(n,e):void 0})},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(2),i=n(7),s=n(10),o=n(135),l=n(9),d=n(3),u=n(6),m=n(56),b=n(165),h=n(25),f=n(65),p=n(190),O=n(16),g=n(22),v=n(170);const j=u.l?256:416;t.a=Object(a.h)(Object(r.h)(e=>{const{chatId:t,threadId:n}=Object(i.z)(e)||{},{messageSendKeyCombo:a}=e.settings.byKey;return{currentChatId:t,messageSendKeyCombo:a,replyingToId:t&&n?Object(i.ob)(e,t,n):void 0,noTabCapture:e.isPollModalOpen||e.payment.isPaymentModalOpen}},(e,t)=>Object(d.l)(t,["editLastMessage","replyToNextMessage"]))(({id:e,isAttachmentModalInput:t,editableInputId:n,html:r,placeholder:i,forcedPlaceholder:d,shouldSetFocus:E,shouldSuppressFocus:y,shouldSuppressTextFormatter:C,onUpdate:N,onSuppressedFocus:T,onSend:w,currentChatId:I,replyingToId:M,noTabCapture:k,messageSendKeyCombo:S,editLastMessage:L,replyToNextMessage:A})=>{const x=Object(a.q)(null),D=Object(a.q)(null),R=Object(O.a)(),F=Object(a.q)(!1),[_,P,U]=Object(h.a)(),[B,q]=Object(a.r)(),[H,$]=Object(a.r)();Object(a.n)(()=>{t&&Y(!1)},[t]),Object(b.a)(([e])=>{r!==x.current.innerHTML&&(x.current.innerHTML=r),r!==D.current.innerHTML&&(D.current.innerHTML=r),void 0!==e&&e!==r&&Y(!r.length)},[r]);const K=Object(a.m)(()=>{x.current.closest(".from, .to")?setTimeout(K,350):Object(o.a)(x.current)},[]),z=Object(a.m)(()=>{U(),function(){const e=window.getSelection();e&&(e.removeAllRanges?e.removeAllRanges():e.empty&&e.empty())}()},[U]);function V(){if(u.e)return;const e=window.getSelection();if(!e||!e.rangeCount||F.current)return void U();const t=e.getRangeAt(0),a=t.toString().trim();if(C||!Object(p.a)(t,n||c.z)||!a||Object(f.a)(a)||!t.START_TO_END)return void U();const r=t.getBoundingClientRect(),i=x.current.getBoundingClientRect();let s=r.left+r.width/2-i.left;s<90?s=90:s>i.width-90&&(s=i.width-90),q({x:s,y:r.top-i.top}),$(t),P()}function Y(e=!1){const t=x.current,n=D.current,a=Number(t.style.height.replace("px","")),r=Math.min(n.scrollHeight,j);if(r===a)return;const c=Math.round(50*Math.log(Math.abs(r-a))),i=()=>{t.style.height=r+"px",t.style.transitionDuration=c+"ms",t.classList.toggle("overflown",n.scrollHeight>j)};e?requestAnimationFrame(i):i()}Object(a.n)(()=>{u.n||K()},[I,K,M,E]),Object(a.n)(()=>{if(k)return;const e=Object(s.a)(e=>{"Tab"===e.key&&(e.preventDefault(),requestAnimationFrame(K))},2e3,!0,!1);return Object(m.a)({onTab:e})},[K,k]),Object(a.n)(()=>{const e=x.current;function t(){e.blur()}return y&&e.addEventListener("focus",t),()=>{e.removeEventListener("focus",t)}},[y]);const W=Object(l.a)("form-control custom-scroll",r.length>0&&"touched",y&&"focus-disabled");return a.a.createElement("div",{id:e,onClick:y?T:void 0,dir:R.isRtl?"rtl":void 0},a.a.createElement("div",{ref:x,id:n||c.z,className:W,contentEditable:!0,dir:"auto",onClick:K,onChange:function(e){const{innerHTML:t,textContent:n}=e.currentTarget;if(N("
"===t?"":t),!(u.n||n&&n.length)){const e=window.getSelection();e&&(x.current.blur(),e.removeAllRanges(),Object(o.a)(x.current,!0))}},onKeyDown:function(e){if(e.metaKey&&!r.length){const t="ArrowDown"===e.key?1:"ArrowUp"===e.key?-1:void 0;if(t)return e.preventDefault(),void A({targetIndexDelta:t})}"Enter"!==e.key||e.shiftKey?"ArrowUp"!==e.key||r.length||e.metaKey?e.target.addEventListener("keyup",(function t(){V(),e.target.removeEventListener("keyup",t)})):(e.preventDefault(),L()):u.e||u.b||!("enter"===S&&!e.shiftKey||"ctrl-enter"===S&&(e.ctrlKey||e.metaKey))||(e.preventDefault(),U(),w())},onMouseDown:function(e){2===e.button?!0!==F.current&&(F.current=!0,document.addEventListener("mousedown",(function e(){setTimeout(()=>{F.current=!1},100),window.removeEventListener("mouseup",e)})),document.addEventListener("keydown",(function e(t){"Esc"!==t.key&&"Escape"!==t.key||(setTimeout(()=>{F.current=!1},100),window.removeEventListener("keydown",e))}))):e.target.addEventListener("mouseup",(function t(){V(),e.target.removeEventListener("mouseup",t)}))},onContextMenu:function(e){u.b&&(e.preventDefault(),e.stopPropagation())},onTouchCancel:function(){u.b&&V()}}),a.a.createElement("div",{ref:D,className:Object(l.a)(W,"clone"),dir:"auto"}),!d&&a.a.createElement("span",{className:"placeholder-text",dir:"auto"},i),a.a.createElement(v.a,{isOpen:_,anchorPosition:B,selectedRange:H,onClose:z}),d&&a.a.createElement("span",{className:"forced-placeholder"},Object(g.a)(d)))}))},function(e,t,n){"use strict";var a=n(0),r=n(4),c=n(9),i=n(41),s=n(22),o=n(30),l=n(16),d=n(172),u=n(32),m=n(59);n(260);t.a=Object(a.h)(({message:e,senderTitle:t,onMessageClick:n})=>{const b=Object(l.a)();let h=Object(r.R)(e);if(!h){const t=Object(r.m)(e);if(t){const{url:n,domain:a}=t,c=Object(r.O)(b,e);h={siteName:a.replace(/^www./,""),url:n.includes("://")?n:n.includes("@")?"mailto:"+n:"http://"+n,description:c!==n?c:void 0}}}const f=Object(a.m)(()=>{n(e.id,e.chatId)},[n,e.id,e.chatId]);if(!h)return;const{siteName:p,url:O,displayUrl:g,title:v,description:j,photo:E,video:y}=h,C=!t&&Object(i.a)(j,170),N=Object(c.a)("WebLink scroll-item",!E&&!y&&"without-media");return a.a.createElement("div",{className:N,"data-initial":(p||g)[0],dir:b.isRtl?"rtl":void 0},E&&a.a.createElement(d.a,{message:e}),a.a.createElement("div",{className:"content"},a.a.createElement(u.a,{isRtl:b.isRtl,className:"site-title",onClick:f},Object(s.a)(v||p||g)),C&&a.a.createElement(u.a,{isRtl:b.isRtl,className:"site-description",onClick:f},Object(s.a)(C)),a.a.createElement(m.a,{url:O,className:"site-name",text:"",isRtl:b.isRtl},O.replace("mailto:","")||g),t&&a.a.createElement("div",{className:"sender-name"},Object(s.a)(t))),t&&a.a.createElement("div",{className:"message-date"},a.a.createElement(u.a,{className:"date",onClick:f,isRtl:b.isRtl},Object(o.g)(b,1e3*e.date))))})},function(e,t,n){},,,function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(2),i=n(6),s=n(29),o=n(3),l=n(4),d=n(7),u=n(133);let m;!function(e){e[e.Move=0]="Move",e[e.Opacity=1]="Opacity",e[e.None=2]="None"}(m||(m={}));var b=n(115),h=n(20),f=n(16),p=n(8),O=n(68),g=n(22),v=n(10),j=n(9),E=n(149),y=n(179),C=n(25),N=n(110),T=n(114),w=n(138),I=n(161),M=n(180),k=n(162),S=n(108),L=n(50),A=n(163);n(217);var x=Object(a.h)(({chat:e,isPinned:t,isMuted:n})=>{const r=Boolean(e.unreadCount||e.hasUnreadMark||t),c=Object(j.a)("Badge",n&&"muted",t&&"pinned",Boolean(e.unreadCount||e.hasUnreadMark)&&"unread");function i(){return e.unreadCount?e.unreadMentionsCount?a.a.createElement("div",{className:"Badge-wrapper"},a.a.createElement("div",{className:"Badge mention"},a.a.createElement("i",{className:"icon-mention"})),a.a.createElement("div",{className:c},Object(L.b)(e.unreadCount))):a.a.createElement("div",{className:c},Object(L.b)(e.unreadCount)):e.hasUnreadMark?a.a.createElement("div",{className:c}):t?a.a.createElement("div",{className:c},a.a.createElement("i",{className:"icon-pinned-chat"})):void 0}return a.a.createElement(A.a,{isCustom:!0,className:"Badge-transition",isOpen:r},i)});n(218);var D=Object(a.h)(Object(r.h)((e,{chatId:t})=>{const n=Object(d.g)(e,t);if(!n||!n.lastMessage)return{};const{senderId:a,replyToMessageId:r,isOutgoing:c}=n.lastMessage,i=a?Object(d.Jb)(e,a):void 0,s=Object(l.s)(n.lastMessage),o=s&&r?Object(d.l)(e,n.id,r):void 0,{targetUserIds:u,targetChatId:m}=s||{},b=Object(l.W)(n),{byId:h}=e.users,{chatId:f,threadId:O,type:g}=Object(d.z)(e)||{},v=t===f&&O===p.MAIN_THREAD_ID;return{chat:n,isMuted:Object(l.Hb)(n,Object(d.fb)(e),Object(d.eb)(e)),lastMessageSender:i,actionTargetUserIds:u,actionTargetChatId:m,actionTargetMessage:o,draft:Object(d.C)(e,t,p.MAIN_THREAD_ID),animationLevel:e.settings.byKey.animationLevel,isSelected:v,canScrollDown:v&&"thread"===g,lastSyncTime:e.lastSyncTime,...c&&{lastMessageOutgoingStatus:Object(d.gb)(e,n.lastMessage)},...b&&{privateChatUser:Object(d.Jb)(e,b)},...u&&{usersById:h}}},(e,t)=>Object(o.l)(t,["openChat","focusLastMessage"]))(({style:e,chatId:t,folderId:n,orderDiff:r,animationType:s,isPinned:o,chat:d,isMuted:u,privateChatUser:b,actionTargetUserIds:h,usersById:p,lastMessageSender:L,lastMessageOutgoingStatus:A,actionTargetMessage:D,actionTargetChatId:R,draft:F,animationLevel:_,isSelected:P,canScrollDown:U,lastSyncTime:B,openChat:q,focusLastMessage:H})=>{const $=Object(a.q)(null),[K,z,V]=Object(C.a)(),[Y,W,G]=Object(C.a)(),{lastMessage:X,typingStatus:J}=d||{},Q=X&&Object(l.gb)(X);Object(E.a)(t,Q?X.replyToMessageId:void 0,D);const Z=X&&!Object(l.N)(X)?Object(l.F)(X):void 0,ee=Object(N.a)(X?Object(l.E)(X,"micro"):void 0),te=Boolean(X&&Object(l.J)(X)),ne=Object(a.p)(()=>h?h.map(e=>p&&p[e]).filter(Boolean):void 0,[h,p]);Object(a.o)(()=>{const e=$.current;if(0!==_&&e){if(s===m.Opacity)e.style.opacity="0",Object(v.b)(()=>{e.classList.add("animate-opacity"),e.style.opacity="1"});else{if(s!==m.Move)return;e.style.transform=`translate3d(0, ${100*-r}%, 0)`,Object(v.b)(()=>{e.classList.add("animate-transform"),e.style.transform=""})}setTimeout(()=>{Object(v.b)(()=>{e.classList.remove("animate-opacity","animate-transform"),e.style.opacity="",e.style.transform=""})},200+c.c)}},[_,r,s]);const ae=Object(a.m)(()=>{q({id:t,shouldReplaceHistory:!0}),P&&U&&H()},[P,U,q,t,H]);const re=Object(y.a)({chat:d,privateChatUser:b,handleDelete:function(){W(),z()},folderId:n,isPinned:o,isMuted:u}),ce=Object(f.a)();if(!d)return;const ie=Object(j.a)("Chat chat-item-clickable",Object(l.ob)(t)?"private":"group",P&&"selected");return a.a.createElement(S.a,{ref:$,className:ie,style:e,ripple:!i.l,contextActions:re,onClick:ae},a.a.createElement("div",{className:"status"},a.a.createElement(T.a,{chat:d,user:b,withOnlineStatus:!0,isSavedMessages:b&&b.isSelf,lastSyncTime:B})),a.a.createElement("div",{className:"info"},a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,Object(g.a)(Object(l.k)(ce,d,b))),d.isVerified&&a.a.createElement(w.a,null),u&&a.a.createElement("i",{className:"icon-muted-chat"}),d.lastMessage&&a.a.createElement(M.a,{message:d.lastMessage,outgoingStatus:A})),a.a.createElement("div",{className:"subtitle"},function(){if(J&&X&&J.timestamp>1e3*X.date)return a.a.createElement(I.a,{typingStatus:J});if(F&&F.text.length)return a.a.createElement("p",{className:"last-message",dir:ce.isRtl?"auto":"ltr"},a.a.createElement("span",{className:"draft"},ce("Draft")),Object(g.a)(F.text));if(!X)return;if(Q){const e=d&&(Object(l.mb)(d)||X.senderId===X.chatId)?d:L;return a.a.createElement("p",{className:"last-message",dir:ce.isRtl?"auto":"ltr"},Object(g.a)(Object(O.a)(ce,X,e,ne,D,R,{asPlain:!0})))}const e=Object(l.K)(ce,t,L);return a.a.createElement("p",{className:"last-message",dir:ce.isRtl?"auto":"ltr"},e&&a.a.createElement(a.a.Fragment,null,a.a.createElement("span",{className:"sender-name"},Object(g.a)(e)),a.a.createElement("span",{className:"colon"},":")),function(e,t,n,r){if(!n)return Object(g.a)(Object(l.O)(e,t));return a.a.createElement("span",{className:"media-preview"},a.a.createElement("img",{src:n,alt:"",className:r?"round":void 0}),Object(l.Q)(t)&&a.a.createElement("i",{className:"icon-play"}),Object(g.a)(Object(l.O)(e,t,!0)))}(ce,X,ee||Z,te))}(),a.a.createElement(x,{chat:d,isPinned:o,isMuted:u}))),Y&&a.a.createElement(k.a,{isOpen:K,onClose:V,onCloseAnimationEnd:G,chat:d}))})),R=n(13),F=n(21),_=n(129);n(220);var P,U=Object(a.h)(Object(r.h)((e,{folderId:t,folderType:n})=>({chatFolder:t&&"folder"===n?Object(d.j)(e,t):void 0,animatedEmoji:Object(d.c)(e,"📂")}))(({chatFolder:e,animatedEmoji:t,foldersDispatch:n,onScreenSelect:r})=>{const c=Object(f.a)(),s=Object(a.m)(()=>{n({type:"editFolder",payload:e}),r(R.n.FoldersEditFolderFromChatList)},[e,n,r]);return a.a.createElement("div",{className:"EmptyFolder"},a.a.createElement("div",{className:"sticker"},t&&a.a.createElement(_.a,{sticker:t})),a.a.createElement("h3",{className:"title",dir:"auto"},c("FilterNoChatsToDisplay")),a.a.createElement("p",{className:"description",dir:"auto"},c(e?"ChatList.EmptyChatListFilterText":"Chat.EmptyChat")),e&&n&&r&&a.a.createElement(F.a,{ripple:!i.l,fluid:!0,pill:!0,onClick:s,size:"smaller",isRtl:c.isRtl},a.a.createElement("i",{className:"icon-settings"}),c("ChatList.EmptyChatListEditFilter")))}));!function(e){e.all="active",e.archived="archived"}(P||(P={}));t.a=Object(a.h)(Object(r.h)((e,{folderType:t,folderId:n})=>{const{chats:{listIds:a,byId:r,orderedPinnedIds:c},users:{byId:i},lastSyncTime:s}=e,o="folder"!==t?P[t]:void 0,l=n?Object(d.j)(e,n):void 0;return{chatsById:r,usersById:i,lastSyncTime:s,notifySettings:Object(d.fb)(e),notifyExceptions:Object(d.eb)(e),...o?{listIds:a[o],orderedPinnedIds:c[o]}:{chatFolder:l}}},(e,t)=>Object(o.l)(t,["loadMoreChats","preloadTopChatMessages","openChat","openNextChat"]))(({folderType:e,folderId:t,isActive:n,chatFolder:r,chatsById:d,usersById:f,listIds:p,orderedPinnedIds:O,lastSyncTime:g,foldersDispatch:v,notifySettings:j,notifyExceptions:E,onScreenSelect:y,loadMoreChats:C,preloadTopChatMessages:N,openChat:T,openNextChat:w})=>{const[I,M]=Object(a.p)(()=>"folder"===e&&r?Object(l.Gb)(d,f,r,j,E):[p,O],[e,r,d,f,j,E,p,O]),[k,S]=Object(a.p)(()=>{if(!I||"folder"===e&&!r)return[];const t=Object(l.Fb)(d,I,M,e),n=[...t.pinnedChats,...t.otherChats],a=n.map(({id:e})=>e);return[n.reduce((e,t,n)=>(e[t.id]=n,e),{}),a]},[I,M,e,r,d]),L=Object(s.a)(k),A=Object(a.p)(()=>k&&L?Object(o.i)(k,(e,t)=>e-(void 0!==L[t]?L[t]:1/0)):{},[k,L]),x=Object(a.m)(()=>{C({listType:"archived"===e?"archived":"active"})},[C,e]),[R,F]=Object(u.a)(g?x:void 0,S,void 0,c.m,"all"===e&&!c.a),_=R&&Object(l.Fb)(d,R,M,e);Object(a.n)(()=>{g&&"all"===e&&N()},[g,e,N]);const P=function(e){const t=Object(a.m)(t=>e[t]<0,[e]),n=Object(a.m)(t=>e[t]>0,[e]),r=Object.keys(e).map(Number),c=r.filter(t).length,i=r.filter(n).length;return Object(a.m)(a=>{const r=e[a];return 0===r?m.None:r===1/0||r===-1/0||t(a)&&c<=i||n(a)&&i{const e=e=>{if(n&&S){if(i.i&&(i.f&&e.metaKey||!i.f&&e.ctrlKey)&&e.code.startsWith("Digit")){const[,t]=e.code.match(/Digit(\d)/)||[];if(!t)return;const n=Number(t)-1;if(n>S.length-1)return;T({id:S[n],shouldReplaceHistory:!0})}if(e.altKey){const t="ArrowDown"===e.key?1:"ArrowUp"===e.key?-1:void 0;if(!t)return;e.preventDefault(),w({targetIndexDelta:t,orderedIds:S})}}};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}}),a.a.createElement(b.a,{className:"chat-list custom-scroll",items:R,onLoadMore:F,preloadBackwards:c.m,noFastList:!0,noScrollRestore:!0},R&&R.length&&_?function(){const e=S.indexOf(R[0]),n=e+_.pinnedChats.length;return a.a.createElement("div",{className:"scroll-container",style:i.b?`height: ${S.length*c.k}px`:void 0,teactFastList:!0},_.pinnedChats.map(({id:n},r)=>a.a.createElement(D,{key:n,teactOrderKey:r,chatId:n,isPinned:!0,folderId:t,animationType:P(n),orderDiff:A[n],style:`top: ${(e+r)*c.k}px;`})),_.otherChats.map((e,r)=>a.a.createElement(D,{key:e.id,teactOrderKey:Object(l.i)(e),chatId:e.id,folderId:t,animationType:P(e.id),orderDiff:A[e.id],style:`top: ${(n+r)*c.k}px;`})))}():R&&!R.length?a.a.createElement(U,{folderId:t,folderType:e,foldersDispatch:v,onScreenSelect:y}):a.a.createElement(h.a,{key:"loading"}))}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return g}));var a=n(0),r=n(8),c=n(2),i=n(4),s=n(53);function o(e,t){const n=t.username.toLowerCase(),a=Object(i.bb)(t),r=a&&a.toLowerCase(),c=e.toLowerCase();return n.startsWith(c)||r&&Object(s.a)(r,c)}var l=n(135),d=n(25),u=n(3),m=n(10);const b=Object(m.h)(e=>e(),500,!0),h=/(
|)/g,f=/ /g,p=/(
|<\/div>)/gi,O=new RegExp("(^|\\s)@[\\w\\d_-]*$","gi");function g(e,t,n,s=c.z,m,g,v,j){const[E,y,C]=Object(d.a)(),[N,T]=Object(a.r)(""),[w,I]=Object(a.r)(),M=Object(a.p)(()=>(g||[]).map(e=>j&&j[e]).filter(Boolean),[g,j]),k=Object(a.m)((e,t)=>{(m||g)&&j?b(()=>{const n=(t?M:[]).filter(t=>!e||o(e,t)),a=(m||[]).map(({userId:e})=>j[e]).filter(t=>!(!t||t.id===v)&&(!e||o(e,t)));I(Object(u.o)(n.concat(a)))}):I(void 0)},[v,m,g,M,j]);Object(a.n)(()=>{if(!e||!t.length)return void C();const n=t.includes("@")&&function(e){const t=e.replace(f," ").replace(h,"\n").replace(p,"").replace(/\n$/i,"").match(O);return t?t[0].trim():void 0}(t);if(n){const e=n?n.substr(1):"";T(e),k(e,function(e){return e.startsWith("@")}(t))}else C()},[e,t,k,y,C]),Object(a.n)(()=>{w&&w.length?y():C()},[y,C,w]);const S=Object(a.m)((e,a=!1)=>{if(!e.username&&!Object(i.ab)(e))return;const c=e.username?"@"+e.username:`${Object(i.ab)(e)}`,o=t.lastIndexOf("@");if(-1!==o){n(`${t.substr(0,o)}${c} `);const e=document.getElementById(s);requestAnimationFrame(()=>{Object(l.a)(e,a)})}C()},[t,s,n,C]);return{isMentionTooltipOpen:E,mentionFilter:N,closeMentionTooltip:C,insertMention:S,mentionFilteredUsers:w}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var a=n(0),r=n(169),c=n(52),i=n(17),s=n(31);const o=new Map;function l(e){const t=Object(a.q)();let n=!1;Object(c.a)(()=>{if(n=!0,t.current=void 0,!e)return;const a=new Image;if(a.src=e,!a.width)return;const c=Object(i.f)(a);Object(r.a)(c.getContext("2d"),0,0,c.width,c.height,2,2),t.current=c.toDataURL()},[e]);const l=function(e,t=!1,n){const c=Object(a.q)(e?o.get(e):void 0),l=Object(a.q)(),d=Object(s.a)();return l.current&&t&&(clearTimeout(l.current),l.current=void 0),Object(a.n)(()=>{if(!e||c.current||t)return;const a=new Image;a.onload=()=>{const t=Object(i.f)(a);Object(r.a)(t.getContext("2d"),0,0,t.width,t.height,2,2);const n=t.toDataURL();c.current=n,d(),o.size>=1e3&&o.clear(),o.set(e,n)},n?l.current=window.setTimeout(()=>{a.src=e},n):a.src=e},[e,n,d,t]),c.current}(e||void 0,Boolean(t.current));return t.current||!n&&l||e||void 0}},,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},,,,,,,,,,function(e,t,n){},,,,,function(e,t,n){},,,,,,,,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){}])]); +//# sourceMappingURL=0.d8fb0ed03b2b879a4243.js.map \ No newline at end of file diff --git a/dist/0.d8fb0ed03b2b879a4243.js.map b/dist/0.d8fb0ed03b2b879a4243.js.map new file mode 100644 index 000000000..1ad717624 --- /dev/null +++ b/dist/0.d8fb0ed03b2b879a4243.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/ui/ListItem.tsx","webpack:///./src/hooks/useIntersectionObserver.ts","webpack:///./src/hooks/useMedia.ts","webpack:///./src/components/common/PrivateChatInfo.tsx","webpack:///./src/components/ui/Modal.tsx","webpack:///./src/util/trapFocus.ts","webpack:///./src/components/ui/Transition.tsx","webpack:///./src/components/common/Avatar.tsx","webpack:///./src/components/ui/InfiniteScroll.tsx","webpack:///./src/components/ui/FloatingActionButton.tsx","webpack:///./src/hooks/useTransitionForMedia.ts","webpack:///./src/components/common/helpers/mediaDimensions.ts","webpack:///./src/components/common/AnimatedSticker.tsx","webpack:///./src/components/ui/ConfirmDialog.tsx","webpack:///./src/components/common/NothingFound.tsx","webpack:///./src/components/right/hooks/useAsyncRendering.ts","webpack:///./src/hooks/useMediaWithDownloadProgress.ts","webpack:///./src/components/ui/ProgressSpinner.tsx","webpack:///./src/components/common/StickerButton.tsx","webpack:///./src/components/ui/Radio.tsx","webpack:///./src/components/ui/RadioGroup.tsx","webpack:///./src/hooks/useBackgroundMode.ts","webpack:///./src/components/ui/Portal.ts","webpack:///./src/components/common/AnimatedEmoji.tsx","webpack:///./src/components/common/GroupChatInfo.tsx","webpack:///./src/util/fastSmoothScroll.ts","webpack:///./src/hooks/useInfiniteScroll.ts","webpack:///./src/util/cycleRestrict.ts","webpack:///./src/util/focusEditableElement.ts","webpack:///./src/util/captureEvents.ts","webpack:///./src/components/common/VerifiedIcon.tsx","webpack:///./src/hooks/useCurrentOrPrev.ts","webpack:///./src/util/safePlay.ts","webpack:///./src/hooks/useBuffering.ts","webpack:///./src/components/middle/composer/helpers/parseMessageInput.ts","webpack:///./src/components/middle/composer/DropTarget.tsx","webpack:///./src/components/middle/composer/DropArea.tsx","webpack:///./src/hooks/reducers/useFoldersReducer.ts","webpack:///./src/components/common/PickerSelectedItem.tsx","webpack:///./src/util/fastSmoothScrollHorizontal.ts","webpack:///./src/hooks/useHorizontalScroll.ts","webpack:///./src/hooks/useEnsureMessage.ts","webpack:///./src/hooks/useContextMenuHandlers.ts","webpack:///./src/components/common/helpers/renderMessageText.tsx","webpack:///./src/hooks/useVideoCleanup.ts","webpack:///./src/hooks/useReducer.ts","webpack:///./src/components/ui/SearchInput.tsx","webpack:///./src/util/resetScroll.ts","webpack:///./src/components/common/TypingStatus.tsx","webpack:///./src/components/common/DeleteChatModal.tsx","webpack:///./src/components/ui/ShowTransition.tsx","webpack:///./src/util/patchSafariProgressiveAudio.ts","webpack:///./src/hooks/useLayoutEffectWithPrevDeps.ts","webpack:///./src/components/common/Document.tsx","webpack:///./src/components/common/StickerSetModal.async.tsx","webpack:///./src/hooks/useCanvasBlur.ts","webpack:///./src/lib/fastBlur.js","webpack:///./src/components/middle/composer/TextFormatter.tsx","webpack:///./src/util/clipboard.ts","webpack:///./src/components/common/Media.tsx","webpack:///./src/components/common/Picker.tsx","webpack:///./src/components/common/Audio.tsx","webpack:///./src/util/waveform.ts","webpack:///./src/components/common/helpers/waveform.ts","webpack:///./src/components/ui/Tab.tsx","webpack:///./src/components/ui/TabList.tsx","webpack:///./src/util/getReadableErrorText.ts","webpack:///./src/util/cssAnimationEndListeners.ts","webpack:///./src/hooks/useChatContextActions.ts","webpack:///./src/components/common/LastMessageMeta.tsx","webpack:///./src/components/common/MessageOutgoingStatus.tsx","webpack:///./src/hooks/useContextMenuPosition.ts","webpack:///./src/hooks/usePrevDuringAnimation.ts","webpack:///./src/hooks/useAudioPlayer.ts","webpack:///./src/util/audioPlayer.ts","webpack:///./src/util/download.ts","webpack:///./src/components/common/File.tsx","webpack:///./src/hooks/useMediaDownload.ts","webpack:///./src/components/ui/Notification.tsx","webpack:///./src/components/middle/composer/helpers/selection.ts","webpack:///./src/components/middle/composer/hooks/useEmojiTooltip.ts","webpack:///./src/components/middle/composer/EmojiTooltip.async.tsx","webpack:///./src/components/middle/composer/MessageInput.tsx","webpack:///./src/components/common/WebLink.tsx","webpack:///./src/components/left/main/hooks/useChatAnimationType.ts","webpack:///./src/components/left/main/Badge.tsx","webpack:///./src/components/left/main/Chat.tsx","webpack:///./src/components/left/main/EmptyFolder.tsx","webpack:///./src/components/left/main/ChatList.tsx","webpack:///./src/components/middle/composer/helpers/searchUserName.ts","webpack:///./src/components/middle/composer/hooks/useMentionTooltip.ts","webpack:///./src/hooks/useBlur.ts","webpack:///./src/hooks/useBlurSync.ts"],"names":["ListItem","props","ref","buttonRef","icon","className","style","children","disabled","ripple","narrow","inactive","focus","destructive","multiline","isStatic","contextActions","onClick","containerRef","useRef","isTouched","markIsTouched","unmarkIsTouched","useFlag","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","getTriggerElement","useCallback","current","getRootElement","closest","getMenuElement","querySelector","positionX","positionY","menuStyle","useContextMenuPosition","handleClick","e","IS_TOUCH_ENV","fastRaf","handleMouseDown","button","lang","useLang","fullClassName","buildClassName","dir","isRtl","undefined","role","tabIndex","onMouseDown","onContextMenu","isOpen","autoClose","onClose","onCloseAnimationEnd","map","action","key","title","handler","useIntersectionObserver","rootRef","throttleMs","debounceMs","shouldSkipFirst","margin","threshold","isDisabled","rootCallback","controllerRef","rootCallbackRef","freezeFlagsRef","onUnfreezeRef","freeze","unfreeze","useHeavyAnimationCheck","useEffect","observer","disconnect","callbacks","clear","observe","target","targetCallback","Map","entriesAccumulator","observerCallbackSync","entries","Array","from","values","forEach","entry","callback","get","scheduler","throttle","debounce","observerCallback","IntersectionObserver","set","root","rootMargin","initController","controller","delete","unobserve","useOnIntersect","targetRef","useIsIntersecting","isIntersecting","setIsIntersecting","useState","mediaHash","noLoad","mediaFormat","ApiMediaFormat","BlobUrl","cacheBuster","delay","mediaData","mediaLoader","forceUpdate","useForceUpdate","startedAt","Date","now","then","spentTime","setTimeout","memo","withGlobal","global","userId","forceShowSelf","lastSyncTime","serverTimeOffset","user","selectUser","isSavedMessages","isSelf","areMessagesLoaded","Boolean","selectChatMessages","setGlobal","actions","pick","typingStatus","avatarSize","status","withMediaViewer","withUsername","withFullInfo","withUpdatingStatus","noStatusOrTyping","noRtl","loadFullUser","openMediaViewer","id","fullName","getUserFullName","handleAvatarViewerOpen","hasPhoto","stopPropagation","avatarOwnerId","origin","MediaViewerOrigin","ProfileAvatar","MiddleHeaderAvatar","size","renderText","isVerified","isUserOnline","username","getUserStatus","Modal","header","hasCloseButton","noBackdrop","onEnter","shouldSkipHistoryAnimations","shouldRender","transitionClassNames","useShowTransition","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","preventDefault","focusableElements","querySelectorAll","length","currentFocusedIndex","findIndex","em","isSameNode","document","activeElement","newFocusedIndex","shiftKey","addEventListener","removeEventListener","trapFocus","forceClose","useHistoryBack","useEffectWithPrevDeps","prevIsOpen","body","classList","toggle","dispatchHeavyAnimationEvent","remove","Portal","Button","round","color","ariaLabel","CLEANED_UP","Symbol","Transition","activeKey","name","direction","renderCount","shouldRestoreHeight","shouldCleanup","cleanupExceptionKey","onStart","onStop","animationLevel","getGlobal","settings","byKey","rendersRef","prevActiveKey","usePrevious","activeKeyChanged","useLayoutEffect","cleanup","container","childElements","add","childNodes","isBackwards","keys","Object","Number","prevActiveIndex","indexOf","activeIndex","node","i","HTMLElement","dispatchHeavyAnimationStop","requestAnimationFrame","onAnimationEnd","height","clientHeight","toNode","firstChild","waitForAnimationEnd","flexBasis","renders","contents","fill","render","chat","text","withOnlineStatus","isDeleted","isDeletedUser","imageHash","getChatAvatarHash","dataUri","useMedia","DataUri","shouldRenderFullMedia","useTransitionForMedia","content","src","alt","decoding","userFullName","getFirstLetters","getChatTitle","isChatPrivate","isOnline","getUserColorKey","senderId","data-test-sender-id","IS_TEST","InfiniteScroll","onLoadMore","onScroll","onKeyDown","items","itemSelector","preloadBackwards","sensitiveArea","noScrollRestore","noScrollRestoreOnTop","noFastList","stateRef","loadMoreBackwards","loadMoreForwards","useMemo","noScroll","LoadMoreDirection","Backwards","Forwards","scrollHeight","state","newScrollTop","listItemElements","currentAnchor","includes","scrollTop","getBoundingClientRect","top","currentAnchorTop","nextAnchor","resetScroll","isScrollTopJustUpdated","handleScroll","listLength","offsetHeight","isNearTop","offsetTop","isNearBottom","isUpdated","nextAnchorTop","newAnchorTop","offsetParent","teactFastList","FloatingActionButton","isShown","buttonClassName","SPEED","fast","slow","speed","noAnimate","isMediaLoaded","willAnimate","shouldRenderThumb","setShouldRenderThumb","MEDIA_VIEWER_MEDIA_QUERY","REM","parseInt","getComputedStyle","documentElement","fontSize","ROUND_VIDEO_DIMENSIONS","AVATAR_FULL_DIMENSIONS","width","LIKE_STICKER_ID","DEFAULT_MEDIA_DIMENSIONS","cachedMaxWidthOwn","cachedMaxWidth","cachedMaxWidthNoAvatar","getAvailableWidth","fromOwnMessage","isForwarded","isWebPagePhoto","noAvatars","extraPaddingRem","regularMaxWidth","IS_SINGLE_COLUMN_LAYOUT","windowWidth","windowSize","Math","min","getMaxMessageWidthRem","calculateDimensionsForMessageMedia","isGif","aspectRatio","calculateDimensions","getAvailableHeight","getMediaViewerAvailableDimensions","withFooter","isVideo","mql","window","matchMedia","windowHeight","occupiedHeightRem","matches","calculateInlineImageDimensions","photo","getPhotoInlineDimensions","calculateVideoDimensions","video","getVideoDimensions","getPictogramDimensions","getDocumentThumbnailDimensions","smaller","getStickerDimensions","sticker","baseWidth","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_INLINE_DESKTOP_FACTOR","calculatedHeight","calculateMediaViewerDimensions","availableWidth","availableHeight","mediaWidth","mediaHeight","calculatedWidth","lottiePromise","RLottie","async","ensureLottie","default","animationData","play","playSegment","noLoop","quality","isLowPriority","onLoad","animation","setAnimation","wasPlaying","isFrozen","playRef","playSegmentRef","exec","newAnimation","setSpeed","destroy","playAnimation","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","useBackgroundMode","textParts","confirmLabel","confirmHandler","confirmIsDestructive","isButtonsInOneRow","split","textPart","isText","description","useAsyncRendering","dependencies","shouldRenderRef","timeoutRef","useOnChange","clearTimeout","isStreaming","Stream","IS_PROGRESSIVE_SUPPORTED","Progressive","downloadProgress","setDownloadProgress","startedAtRef","handleProgress","progress","RADIUSES","s","m","l","xl","square","transparent","noCross","radius","circleRadius","STROKE_WIDTH","borderRadius","circumference","PI","svg","firstElementChild","strokeDashOffset","max","setAttribute","toString","innerHTML","observeIntersection","clickArg","onUnfaveClick","localMediaHash","stickerSelector","thumbDataUri","thumbnail","previewBlobUrl","shouldPlay","lottieData","isAnimated","Lottie","isAnimationLoaded","markLoaded","unmarkLoaded","canAnimatedPlay","shouldRenderPreview","previewTransitionClassNames","emoji","data-sticker-id","label","subLabel","value","checked","hidden","isLoading","onChange","type","Spinner","options","selected","loadingOption","handleChange","event","currentTarget","option","onBlur","onFocus","hasFocus","containerId","elementRef","createElement","appendChild","TeactDOM","removeChild","WIDTH","large","medium","small","AnimatedEmoji","forceLoadPreview","markAnimationLoaded","playKey","setPlayKey","String","random","chatId","selectChat","onlineCount","selectChatOnlineCount","withChatType","loadFullChat","isSuperGroup","isChatSuperGroup","isMin","isRestricted","getChatTypeString","handle","groupStatus","chatTypeString","membersCount","getGroupStatus","onlineStatus","renderStatusOrTyping","isAnimating","fastSmoothScroll","position","maxDistance","FAST_SMOOTH_MAX_DISTANCE","forceDirection","forceDuration","forceCurrentContainerHeight","scrollFrom","elementTop","offset","FocusDirection","Up","Down","calculateScrollFrom","Static","ANIMATION_LEVEL_MIN","scrollWithJs","isAnimatingScroll","elementHeight","currentScrollTop","containerHeight","targetContainerHeight","dataset","normalHeight","path","remainingPath","absPath","abs","transition","FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE","shortTransition","longTransition","duration","FAST_SMOOTH_MIN_DURATION","FAST_SMOOTH_MAX_DURATION","startAt","onHeavyAnimationStop","animateSingle","t","currentPath","getViewportSlice","sourceIds","offsetId","listSlice","index","indexForDirection","to","newViewportIds","slice","areSomeLocal","areAllLocal","listIds","forceFullPreload","lastParamsRef","viewportIdsRef","prevListIds","prevIsDisabled","areSortedArraysEqual","viewportIds","getMore","cycleRestrict","floor","focusEditableElement","force","selection","getSelection","range","createRange","lastChild","nodeValue","selectNodeContents","collapse","removeAllRanges","addRange","SwipeDirection","captureEvents","captureEvent","currentSwipeAxis","hasMoved","onCapture","excludedClosestSelector","onMove","onRelease","pageX","touches","pageY","withCursor","dragOffsetX","dragOffsetY","onDrag","onSwipe","xAbs","yAbs","Left","Right","processSwipe","passive","VerifiedIcon","useCurrentOrPrev","shouldSkipUndefined","shouldForceCurrent","prev","mediaEl","catch","err","DEBUG","console","warn","noInitiallyBuffered","isBuffered","setIsBuffered","bufferedProgress","setBufferedProgress","setIsBufferedDebounced","handleBuffering","media","isSafariPatchInProgress","buffered","end","readyState","currentTime","bufferingHandlers","onLoadedData","onPlaying","onLoadStart","onPause","onTimeUpdate","onProgress","checkBuffering","ENTITY_CLASS_BY_NODE_NAME","B","ApiMessageEntityTypes","Bold","STRONG","I","Italic","EM","U","Underline","S","Strike","STRIKE","DEL","CODE","Code","PRE","Pre","BLOCKQUOTE","Blockquote","parseMessageInput","html","fragment","parsedHtml","IS_EMOJI_SUPPORTED","replace","parseMarkdown","innerText","trim","textIndex","recursionDeepness","entities","addEntity","entity","rawText","nodeName","anchor","entityType","MentionName","Url","href","startsWith","Email","Phone","textContent","TextUrl","getEntityTypeFromNode","rawIndex","substring","url","getEntityDataFromNode","push","hasChildNodes","isQuick","onFileSelect","isHovered","markHovered","unmarkHovered","onDrop","onDragEnter","onDragLeave","relatedTarget","toTarget","DropAreaState","withQuick","onHide","hideTimeoutRef","prevWithQuick","captureEscKeyListener","handleFilesDrop","dataTransfer","dt","files","handleQuickFilesDrop","handleDragLeave","fromTarget","onDragOver","INCLUDED_CHAT_TYPES","EXCLUDED_CHAT_TYPES","INCLUDE_FILTER_FIELDS","EXCLUDE_FILTER_FIELDS","selectChatFilters","mode","selectTemp","selectedChatIds","selectedChatTypes","includedChatIds","includeFilters","folder","filter","excludedChatIds","excludeFilters","getSuggestedFolderName","filters","bots","groups","channels","contacts","nonContacts","INITIAL_STATE","chatFilter","foldersReducer","payload","omit","folderId","error","useReducer","chatOrUserId","isMinimized","canClose","iconElement","titleText","getUserFirstOrLastName","fastSmoothScrollHorizontal","left","IS_IOS","scrollLeft","offsetWidth","containerWidth","scrollWidth","animate","scrollTo","behavior","deltaX","deltaY","messageId","message","replyOriginForId","loadMessage","getDispatch","loadMessageThrottled","throttled","contextMenuCounter","isMenuDisabled","shouldDisableOnLink","shouldDisableOnLongTap","setIsContextMenuOpen","setContextMenuPosition","x","clientX","y","clientY","timer","clearLongPressTimer","startLongPressTimer","contains","originalEvent","cancelClickOnce","stopImmediatePropagation","emulateContextMenuEvent","renderMessageText","highlight","shouldRenderHqEmoji","formattedText","getMessageText","renderTextWithEntities","organizeEntities","organizedEntityIndexes","Set","organizedEntities","has","organizedEntity","organizeEntity","organizedIndexes","nestedEntities","parsedEntity","isChanged","organizedIndex","shouldRenderAsHtml","renderMessagePart","result","deleteLineBreakAfterPre","renderEntity","textPartStart","textPartEnd","isLastEntity","renderResult","textBefore","textBeforeLength","substr","entityStartIndex","entityEndIndex","entityContent","nestedEntityContent","nestedIndex","nestedEntity","nestedEntityIndex","nestedResult","nestedEntityEndIndex","newEntity","rawEntityText","renderedContent","join","getLinkUrl","processEntityAsHtml","entityText","BotCommand","handleBotCommandClick","Hashtag","Cashtag","handleHashtagClick","rel","Mention","processEntity","isArray","textAfter","arrayIndex","c","emojiFilter","sendBotCommand","command","setLocalTextSearchQuery","query","searchTextMessagesLocal","useVideoCleanup","videoRef","videoEl","load","reducer","initialState","reducerRef","setState","currentState","parentContainerClassName","inputId","focused","placeholder","autoComplete","onReset","inputRef","isInputFocused","markInputFocused","unmarkInputFocused","blur","overflow","typingUser","typingUserName","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","getPrivateChatUserId","isBot","isUserBot","isSupport","canDeleteForAll","contactName","isChannel","isChatChannel","isBasicGroup","isChatBasicGroup","currentUserId","leaveChannel","deleteHistory","deleteChannel","deleteChatUser","blockContact","chatTitle","handleDeleteMessageForAll","shouldDeleteForAll","handleDeleteAndStop","contactId","accessHash","handleDeleteChat","isCreator","ShowTransition","isCustom","prevChildren","fromChildrenRef","patchSafariProgressiveAudio","audioEl","patchedForSafari","patchForSafariInProgress","paused","once","cb","debugKey","prevDeps","uploadProgress","withDate","datetime","sender","isSelected","isSelectable","onCancelUpload","onMediaClick","onDateClick","extension","getDocumentExtension","fileName","timestamp","mediaType","isDownloadAllowed","setIsDownloadAllowed","useMediaWithDownloadProgress","getMessageMediaHash","isUploading","isTransferring","transferProgress","getMediaTransferState","hasPreview","getDocumentHasPreview","getMessageMediaThumbDataUri","localBlobUrl","previewData","isAllowed","handleDateClick","download","thumbnailDataUri","actionIcon","isMessageDocumentVideo","StickerSetModal","useModuleLoader","Bundles","Extra","useCanvasBlur","withRaf","canvasRef","canvas","img","Image","processBlur","ctx","getContext","alpha","IS_CANVAS_FILTER_SUPPORTED","drawImage","RADIUS","fastBlur","onload","mul_table","shg_table","boxBlurCanvasRGB","context","top_x","top_y","iterations","isNaN","imageData","getImageData","pixels","data","rsum","gsum","bsum","p","p1","p2","yp","yi","yw","wm","hm","rad1","r","g","b","mul_sum","shg_sum","vmin","vmax","putImageData","TEXT_FORMAT_BY_TAG_NAME","anchorPosition","selectedRange","linkUrlInputRef","isLinkControlOpen","openLinkControl","closeLinkControl","linkUrl","setLinkUrl","isEditingLink","setIsEditingLink","inputClassName","setInputClassName","selectedTextFormats","setSelectedTextFormats","useVirtualBackdrop","selectedFormats","parentElement","commonAncestorContainer","EDITABLE_INPUT_ID","textFormat","tagName","getSelectedText","getSelectedElement","updateInputStyles","input","getFormatButtonClassName","some","fKey","monospace","strikethrough","handleBoldText","execCommand","bold","handleItalicText","italic","handleUnderlineText","underline","handleStrikethroughText","replaceWith","handleMonospaceText","handleLinkUrlConfirm","formattedLinkUrl","restoreSelection","KeyK","KeyB","KeyU","KeyI","KeyM","KeyS","code","altKey","ctrlKey","metaKey","linkUrlConfirmClassName","inputMode","CLIPBOARD_ITEM_SUPPORTED","navigator","clipboard","ClipboardItem","textCopyEl","copyTextToClipboard","str","rangeToRestore","rangeCount","getRangeAt","select","copyImageToClipboard","imageUrl","imageEl","toBlob","copyBlobToClipboard","pngBlob","write","idPrefix","mediaBlobUrl","getMessageVideo","formatMediaDuration","itemIds","selectedIds","filterValue","filterPlaceholder","notFoundText","searchInputId","onSelectedIdsChange","onFilterChange","shouldMinimize","handleItemClick","newSelectedIds","splice","handleFilterChange","useInfiniteScroll","MIN_SPIKES","MAX_SPIKES","renderSeekline","playProgress","handleStartSeek","handleSeek","handleStopSeek","onMouseMove","onMouseUp","theme","senderTitle","date","onPlay","onReadMedia","audio","voice","isMediaUnread","isVoice","isSeeking","isActivated","setIsActivated","shouldDownload","getMessageMediaFormat","useBuffering","playPause","setCurrentTime","useAudioPlayer","getMessageKey","getMediaDuration","isMessageLocal","isDownloadStarted","directDownloadProgress","handleDownloadClick","useMediaDownload","getMessageAudioCaption","isLoadingForPlaying","shouldRenderSpinner","spinnerClassNames","handleButtonClick","seekBar","seekHandlers","isOwn","isOwnMessage","renderedWaveform","waveform","fillColor","fillOwnColor","progressFillColor","progressFillOwnColor","durationFactor","spikesCount","decodedWaveform","encoded5bit","bitsCount","valuesCount","bitsData","byteIndex","bitShift","lastByteIndex","lastBitShift","lastValue","decodeWaveform","Uint8Array","spikes","peak","fitCount","newData","springFactor","leftFiller","rightFiller","idx","val","interpolateArray","fillStyle","progressFillStyle","scale","item","globalAlpha","spikeHeight","beginPath","moveTo","arcTo","closePath","roundedRectangle","toDataURL","renderWaveformToDataUri","draggable","renderWaveform","buttonClassNames","showSeekline","contentClassName","ProgressSpinner","getFirstLine","Link","formatPastTimeShort","performer","getSecondLine","formatMediaDateTime","renderAudio","renderVoice","active","badgeCount","isBadgeActive","previousActiveTab","tabRef","tab","indicator","prevTab","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","transform","tabs","activeTab","big","onSwitchTab","useHorizontalScroll","activeTabElement","newLeft","READABLE_ERROR_MESSAGES","CHAT_RESTRICTED","CHAT_WRITE_FORBIDDEN","CHAT_SEND_POLL_FORBIDDEN","CHAT_SEND_STICKERS_FORBIDDEN","CHAT_SEND_GIFS_FORBIDDEN","CHAT_SEND_MEDIA_FORBIDDEN","CHAT_LINK_EXISTS","SLOWMODE_WAIT_X","USER_BANNED_IN_CHANNEL","USER_IS_BLOCKED","YOU_BLOCKED_USER","IMAGE_PROCESS_FAILED","MEDIA_EMPTY","MEDIA_INVALID","PHOTO_EXT_INVALID","PHOTO_INVALID_DIMENSIONS","PHOTO_SAVE_FILE_INVALID","MESSAGE_DELETE_FORBIDDEN","MESSAGE_POLL_CLOSED","MESSAGE_EDIT_TIME_EXPIRED","CHAT_ADMIN_REQUIRED","PINNED_DIALOGS_TOO_MUCH","DIALOG_FILTERS_TOO_MUCH","CHANNEL_PRIVATE","MEDIA_CAPTION_TOO_LONG","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_CITY_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_POSTCODE_INVALID","ADDRESS_STATE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_PHONE_INVALID","REQ_INFO_EMAIL_INVALID","LINK_NOT_MODIFIED","SERVICE_WORKER_DISABLED","CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS","FRESH_RESET_AUTHORISATION_FORBIDDEN","BOTS_TOO_MUCH","BOT_GROUPS_BLOCKED","USERS_TOO_MUCH","USER_CHANNELS_TOO_MUCH","USER_KICKED","USER_NOT_MUTUAL_CONTACT","USER_PRIVACY_RESTRICTED","INVITE_HASH_EMPTY","INVITE_HASH_EXPIRED","INVITE_HASH_INVALID","CHANNELS_TOO_MUCH","USER_ALREADY_PARTICIPANT","SCHEDULE_DATE_INVALID","WALLPAPER_DIMENSIONS_INVALID","getReadableErrorText","isSlowMode","textParams","extraPartIndex","errorMessage","reduce","acc","waitForTransitionEnd","propertyName","waitForEndEvent","animationName","eventType","detailedName","isHandled","handleAnimationEnd","TransitionEvent","AnimationEvent","privateChatUser","handleDelete","isPinned","isMuted","toggleChatPinned","updateChatMutedState","toggleChatArchived","toggleChatUnread","actionUnreadMark","unreadCount","hasUnreadMark","actionPin","actionMute","actionArchive","isChatArchived","getCanDeleteChat","outgoingStatus","Keys","extraPaddingX","extraTopPadding","setPositionX","setPositionY","setStyle","triggerEl","emptyRect","menuEl","rootEl","triggerRect","menuRect","rootRect","horizontalPostition","usePrevDuringAnimation","isCurrentPresent","isPrevPresent","trackId","originalDuration","handlers","onInit","onForcePlay","noPlaylist","setIsPlaying","isPlayingSync","setPlayProgress","register","eventName","proxy","isFinite","prevShouldPlay","prevSrc","audioProxy","tracks","currentTrackId","queue","stopCurrentAudio","currentTrack","Audio","handleEvent","nextTrackId","openAudioPlayer","parseMessageKey","nextTrack","safePlay","Proxy","createAudio","preload","IS_SAFARI","time","shouldRemoveFromQueue","track","h","filename","link","click","shouldSpinnerRender","getColorFromExtension","sizeString","getFileSizeString","setIsDownloadStarted","onDismiss","setIsOpen","timerRef","closeAndDismiss","ANIMATION_END_DELAY","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","isSelectionInsideInput","selectionRange","parentNode","emojiDataPromise","emojiRawData","emojiData","RE_EMOJI_SEARCH","RE_BR","RE_SPACE","RE_CLEAN_HTML","RegExp","useEmojiTooltip","recentEmojiIds","onUpdateHtml","baseEmojiKeywords","emojiKeywords","markIsOpen","unmarkIsOpen","byId","setById","keywords","setKeywords","byKeyword","setByKeyword","names","setNames","byName","setByName","shouldForceInsertEmoji","setShouldForceInsertEmoji","filteredEmojis","setFilteredEmojis","MEMO_EMPTY_ARRAY","recentEmojis","pickTruthy","emojis","uncompressEmoji","ensureEmojiData","byNative","buildCollectionByKey","baseEmojisByKeyword","mapValues","natives","emojisByKeyword","emojisByName","match","getEmojiCode","forceSend","endsWith","matched","matchedKeywords","keyword","sort","concat","flatten","matchedNames","unique","insertEmoji","textEmoji","isForce","atIndex","lastIndexOf","messageInput","getElementById","native","isEmojiTooltipOpen","closeEmojiTooltip","EmojiTooltip","MAX_INPUT_HEIGHT","currentChatId","threadId","selectCurrentMessageList","messageSendKeyCombo","replyingToId","selectReplyingToId","noTabCapture","isPollModalOpen","payment","isPaymentModalOpen","isAttachmentModalInput","editableInputId","forcedPlaceholder","shouldSetFocus","shouldSuppressFocus","shouldSuppressTextFormatter","onUpdate","onSuppressedFocus","onSend","editLastMessage","replyToNextMessage","cloneRef","isContextMenuOpenRef","isTextFormatterOpen","openTextFormatter","closeTextFormatter","textFormatterAnchorPosition","setTextFormatterAnchorPosition","setSelectedRange","updateInputHeight","useLayoutEffectWithPrevDeps","prevHtml","focusInput","handleCloseTextFormatter","empty","clearSelection","checkSelection","selectedText","parseEmojiOnlyString","START_TO_END","selectionRect","inputRect","willSend","clone","currentHeight","newHeight","transitionDuration","log","captureFirstTab","onTab","suppressFocus","contentEditable","targetIndexDelta","handleKeyUp","IS_ANDROID","closeContextMenuMouseListener","closeContextMenuKeyListener","handleMouseUp","onTouchCancel","onMessageClick","linkData","getMessageWebPage","getFirstLinkInMessage","domain","messageText","getMessageSummaryText","siteName","handleMessageClick","displayUrl","truncatedDescription","trimText","data-initial","ChatAnimationTypes","renderContent","unreadMentionsCount","formatIntegerCompact","lastMessage","replyToMessageId","isOutgoing","lastMessageSender","lastMessageAction","getMessageAction","actionTargetMessage","selectChatMessage","targetUserIds","actionTargetUserIds","targetChatId","actionTargetChatId","privateChatUserId","usersById","users","currentThreadId","messageListType","MAIN_THREAD_ID","selectIsChatMuted","selectNotifySettings","selectNotifyExceptions","draft","selectDraft","canScrollDown","lastMessageOutgoingStatus","selectOutgoingStatus","orderDiff","animationType","openChat","focusLastMessage","isDeleteModalOpen","openDeleteModal","closeDeleteModal","shouldRenderDeleteModal","markRenderDeleteModal","unmarkRenderDeleteModal","isAction","isActionMessage","useEnsureMessage","mediaThumbnail","getMessageSticker","isRoundVideo","getMessageRoundVideo","actionTargetUsers","Opacity","opacity","Move","shouldReplaceHistory","useChatContextActions","Avatar","LastMessageMeta","TypingStatus","actionOrigin","renderActionMessageText","asPlain","senderName","getMessageSenderName","blobUrl","renderMessageSummary","renderLastMessageOrTyping","DeleteChatModal","FolderTypeToListType","folderType","chatFolder","selectChatFolder","animatedEmoji","selectAnimatedEmoji","foldersDispatch","onScreenSelect","handleEditFolder","SettingsScreens","FoldersEditFolderFromChatList","fluid","pill","chats","chatsById","orderedPinnedIds","listType","notifySettings","notifyExceptions","isActive","loadMoreChats","preloadTopChatMessages","openNextChat","currentListIds","currentPinnedIds","prepareFolderListIds","orderById","orderedIds","newChatArrays","prepareChatList","singleList","pinnedChats","otherChats","newOrderedIds","prevOrderById","orderDiffById","order","Infinity","loadMoreOfType","CHAT_LIST_SLICE","ALL_CHATS_PRELOAD_DISABLED","chatArrays","getAnimationType","movesUp","movesDown","orderDiffIds","numberOfUp","numberOfDown","None","useChatAnimationType","IS_PWA","IS_MAC_OS","digit","viewportOffset","pinnedOffset","CHAT_HEIGHT_PX","teactOrderKey","getChatOrder","renderChats","Loading","searchUserName","usernameLowered","toLowerCase","fullNameLowered","filterLowered","searchWords","runThrottled","RE_USERNAME_SEARCH","useMentionTooltip","canSuggestMembers","groupChatMembers","topInlineBotIds","currentFilter","setCurrentFilter","usersToMention","setUsersToMention","topInlineBots","getFilteredUsers","withInlineBots","inlineBots","inlineBot","chatMembers","usernameFilter","getUsernameFilter","canSuggestInlineBots","insertMention","forceFocus","insertedHtml","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","mentionFilteredUsers","cache","useBlurSync","blurredRef","imgToCanvas","blurredAsync","blurredDataUri","useBlur"],"mappings":"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AK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAE5qCC,EAAY,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI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","file":"0.d8fb0ed03b2b879a4243.js","sourcesContent":["import { RefObject } from 'react';\nimport React, { FC, useRef, useCallback } from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport useContextMenuHandlers from '../../hooks/useContextMenuHandlers';\nimport useContextMenuPosition from '../../hooks/useContextMenuPosition';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport RippleEffect from './RippleEffect';\nimport Menu from './Menu';\nimport MenuItem from './MenuItem';\n\nimport './ListItem.scss';\n\ntype OnClickHandler = (e: React.MouseEvent) => void;\n\ntype MenuItemContextAction = {\n title: string;\n icon: string;\n destructive?: boolean;\n handler?: () => void;\n};\n\ntype OwnProps = {\n ref?: RefObject;\n buttonRef?: RefObject;\n icon?: string;\n className?: string;\n style?: string;\n children: any;\n disabled?: boolean;\n ripple?: boolean;\n narrow?: boolean;\n inactive?: boolean;\n focus?: boolean;\n destructive?: boolean;\n multiline?: boolean;\n isStatic?: boolean;\n contextActions?: MenuItemContextAction[];\n onClick?: OnClickHandler;\n};\n\nconst ListItem: FC = (props) => {\n const {\n ref,\n buttonRef,\n icon,\n className,\n style,\n children,\n disabled,\n ripple,\n narrow,\n inactive,\n focus,\n destructive,\n multiline,\n isStatic,\n contextActions,\n onClick,\n } = props;\n\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n const [isTouched, markIsTouched, unmarkIsTouched] = useFlag();\n\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(containerRef, !contextActions);\n\n const getTriggerElement = useCallback(() => containerRef.current, []);\n\n const getRootElement = useCallback(\n () => containerRef.current!.closest('.custom-scroll'),\n [],\n );\n\n const getMenuElement = useCallback(\n () => containerRef.current!.querySelector('.ListItem-context-menu .bubble'),\n [],\n );\n\n const { positionX, positionY, style: menuStyle } = useContextMenuPosition(\n contextMenuPosition,\n getTriggerElement,\n getRootElement,\n getMenuElement,\n );\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || !onClick) {\n return;\n }\n onClick(e);\n\n if (IS_TOUCH_ENV && !ripple) {\n markIsTouched();\n fastRaf(unmarkIsTouched);\n }\n }, [disabled, markIsTouched, onClick, ripple, unmarkIsTouched]);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (inactive || IS_TOUCH_ENV) {\n return;\n }\n if (contextActions && (e.button === 2 || !onClick)) {\n handleBeforeContextMenu(e);\n }\n if (e.button === 0) {\n if (!onClick) {\n handleContextMenu(e);\n } else {\n handleClick(e);\n }\n }\n }, [inactive, contextActions, onClick, handleBeforeContextMenu, handleContextMenu, handleClick]);\n\n const lang = useLang();\n\n const fullClassName = buildClassName(\n 'ListItem',\n className,\n !isStatic && 'no-selection',\n ripple && 'has-ripple',\n narrow && 'narrow',\n disabled && 'disabled',\n inactive && 'inactive',\n contextMenuPosition && 'has-menu-open',\n focus && 'focus',\n destructive && 'destructive',\n multiline && 'multiline',\n isStatic && 'is-static',\n );\n\n return (\n \n \n {icon && (\n \n )}\n {multiline && (
{children}
)}\n {!multiline && children}\n {!disabled && !inactive && ripple && (\n \n )}\n
\n {contextActions && contextMenuPosition !== undefined && (\n \n {contextActions.map((action) => (\n \n {action.title}\n \n ))}\n \n )}\n
\n );\n};\n\nexport default ListItem;\n","import { RefObject } from 'react';\nimport {\n useEffect, useRef, useCallback, useState,\n} from '../lib/teact/teact';\n\nimport { throttle, debounce } from '../util/schedulers';\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\n\ntype TargetCallback = (entry: IntersectionObserverEntry) => void;\ntype RootCallback = (entries: IntersectionObserverEntry[]) => void;\ntype ObserveCleanup = NoneToVoidFunction;\nexport type ObserveFn = (target: HTMLElement, targetCallback?: TargetCallback) => ObserveCleanup;\n\ninterface IntersectionController {\n observer: IntersectionObserver;\n callbacks: Map;\n}\n\ninterface Response {\n observe: ObserveFn;\n freeze: NoneToVoidFunction;\n unfreeze: NoneToVoidFunction;\n}\n\nexport function useIntersectionObserver({\n rootRef,\n throttleMs,\n debounceMs,\n shouldSkipFirst,\n margin,\n threshold,\n isDisabled,\n}: {\n rootRef: RefObject;\n throttleMs?: number;\n debounceMs?: number;\n shouldSkipFirst?: boolean;\n margin?: number;\n threshold?: number | number[];\n isDisabled?: boolean;\n}, rootCallback?: RootCallback): Response {\n const controllerRef = useRef();\n const rootCallbackRef = useRef();\n const freezeFlagsRef = useRef(0);\n const onUnfreezeRef = useRef();\n\n rootCallbackRef.current = rootCallback;\n\n const freeze = useCallback(() => {\n freezeFlagsRef.current++;\n }, []);\n\n const unfreeze = useCallback(() => {\n if (!freezeFlagsRef.current) {\n return;\n }\n\n freezeFlagsRef.current--;\n\n if (!freezeFlagsRef.current && onUnfreezeRef.current) {\n onUnfreezeRef.current();\n onUnfreezeRef.current = undefined;\n }\n }, []);\n\n useHeavyAnimationCheck(freeze, unfreeze);\n\n useEffect(() => {\n if (isDisabled) {\n return undefined;\n }\n\n return () => {\n if (controllerRef.current) {\n controllerRef.current.observer.disconnect();\n controllerRef.current.callbacks.clear();\n controllerRef.current = undefined;\n }\n };\n }, [isDisabled]);\n\n function initController() {\n const callbacks = new Map();\n const entriesAccumulator = new Map();\n const observerCallbackSync = () => {\n const entries = Array.from(entriesAccumulator.values());\n\n entries.forEach((entry: IntersectionObserverEntry) => {\n const callback = callbacks.get(entry.target);\n if (callback) {\n callback!(entry, entries);\n }\n });\n\n if (rootCallbackRef.current) {\n rootCallbackRef.current(entries);\n }\n\n entriesAccumulator.clear();\n };\n const scheduler = throttleMs ? throttle : debounceMs ? debounce : undefined;\n const observerCallback = scheduler\n ? scheduler(observerCallbackSync, (throttleMs || debounceMs)!, !shouldSkipFirst)\n : observerCallbackSync;\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n entriesAccumulator.set(entry.target, entry);\n });\n\n if (freezeFlagsRef.current) {\n onUnfreezeRef.current = () => {\n observerCallback();\n };\n } else {\n observerCallback();\n }\n },\n {\n root: rootRef.current,\n rootMargin: margin ? `${margin}px` : undefined,\n threshold,\n },\n );\n\n controllerRef.current = { observer, callbacks };\n }\n\n const observe = useCallback((target, targetCallback) => {\n if (!controllerRef.current) {\n initController();\n }\n\n const controller = controllerRef.current!;\n controller.observer.observe(target);\n\n if (targetCallback) {\n controller.callbacks.set(target, targetCallback);\n }\n\n return () => {\n if (targetCallback) {\n controller.callbacks.delete(target);\n }\n\n controller.observer.unobserve(target);\n };\n // Arguments should never change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isDisabled]);\n\n return { observe, freeze, unfreeze };\n}\n\nexport function useOnIntersect(\n targetRef: RefObject, observe?: ObserveFn, callback?: TargetCallback,\n) {\n useEffect(() => {\n return observe ? observe(targetRef.current!, callback) : undefined;\n // Arguments should never change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\nexport function useIsIntersecting(\n targetRef: RefObject, observe?: ObserveFn, callback?: TargetCallback,\n) {\n const [isIntersecting, setIsIntersecting] = useState(!observe);\n\n useOnIntersect(targetRef, observe, (entry) => {\n setIsIntersecting(entry.isIntersecting);\n\n if (callback) {\n callback(entry);\n }\n });\n\n return isIntersecting;\n}\n","import { useEffect } from '../lib/teact/teact';\n\nimport { ApiMediaFormat } from '../api/types';\n\nimport * as mediaLoader from '../util/mediaLoader';\nimport useForceUpdate from './useForceUpdate';\n\nexport default (\n mediaHash: string | false | undefined,\n noLoad = false,\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n mediaFormat: T = ApiMediaFormat.BlobUrl,\n cacheBuster?: number,\n delay?: number | false,\n) => {\n const mediaData = mediaHash ? mediaLoader.getFromMemory(mediaHash) : undefined;\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n if (!noLoad && mediaHash && !mediaData) {\n const startedAt = Date.now();\n\n mediaLoader.fetch(mediaHash, mediaFormat).then(() => {\n const spentTime = Date.now() - startedAt;\n if (!delay || spentTime >= delay) {\n forceUpdate();\n } else {\n setTimeout(forceUpdate, delay - spentTime);\n }\n });\n }\n }, [noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, delay]);\n\n return mediaData;\n};\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiTypingStatus } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { selectChatMessages, selectUser } from '../../modules/selectors';\nimport { getUserFullName, getUserStatus, isUserOnline } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\nimport VerifiedIcon from './VerifiedIcon';\nimport TypingStatus from './TypingStatus';\n\ntype OwnProps = {\n userId: number;\n typingStatus?: ApiTypingStatus;\n avatarSize?: 'tiny' | 'small' | 'medium' | 'large' | 'jumbo';\n forceShowSelf?: boolean;\n status?: string;\n withMediaViewer?: boolean;\n withUsername?: boolean;\n withFullInfo?: boolean;\n withUpdatingStatus?: boolean;\n noStatusOrTyping?: boolean;\n noRtl?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n isSavedMessages?: boolean;\n areMessagesLoaded: boolean;\n serverTimeOffset: number;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst PrivateChatInfo: FC = ({\n typingStatus,\n avatarSize = 'medium',\n status,\n withMediaViewer,\n withUsername,\n withFullInfo,\n withUpdatingStatus,\n noStatusOrTyping,\n noRtl,\n user,\n isSavedMessages,\n areMessagesLoaded,\n lastSyncTime,\n loadFullUser,\n openMediaViewer,\n serverTimeOffset,\n}) => {\n const { id: userId } = user || {};\n const fullName = getUserFullName(user);\n\n useEffect(() => {\n if (withFullInfo && lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [userId, loadFullUser, lastSyncTime, withFullInfo]);\n\n const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => {\n if (user && hasPhoto) {\n e.stopPropagation();\n openMediaViewer({\n avatarOwnerId: user.id,\n origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar,\n });\n }\n }, [user, avatarSize, openMediaViewer]);\n\n const lang = useLang();\n\n if (!user) {\n return undefined;\n }\n\n function renderStatusOrTyping() {\n if (status) {\n return (\n {status}\n );\n }\n\n if (withUpdatingStatus && !areMessagesLoaded) {\n return (\n {lang('Updating')}\n );\n }\n\n if (!user) {\n return undefined;\n }\n\n if (typingStatus) {\n return ;\n }\n\n return (\n
\n {withUsername && user.username && {user.username}}\n {getUserStatus(lang, user, serverTimeOffset)}\n
\n );\n }\n\n return (\n
\n \n
\n {isSavedMessages ? (\n
\n

{lang('SavedMessages')}

\n
\n ) : (\n
\n

{fullName && renderText(fullName)}

\n {user && user.isVerified && }\n
\n )}\n {(status || (!isSavedMessages && !noStatusOrTyping)) && renderStatusOrTyping()}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId, forceShowSelf }): StateProps => {\n const { lastSyncTime, serverTimeOffset } = global;\n const user = selectUser(global, userId);\n const isSavedMessages = !forceShowSelf && user && user.isSelf;\n const areMessagesLoaded = Boolean(selectChatMessages(global, userId));\n\n return {\n lastSyncTime, user, isSavedMessages, areMessagesLoaded, serverTimeOffset,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullUser', 'openMediaViewer']),\n)(PrivateChatInfo));\n","import React, {\n FC, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { TextPart } from '../common/helpers/renderMessageText';\n\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport trapFocus from '../../util/trapFocus';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string | TextPart[];\n className?: string;\n isOpen?: boolean;\n header?: any;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n};\n\ntype StateProps = {\n shouldSkipHistoryAnimations?: boolean;\n};\n\nconst Modal: FC = ({\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n shouldSkipHistoryAnimations,\n}) => {\n const {\n shouldRender,\n transitionClassNames,\n } = useShowTransition(\n isOpen, onCloseAnimationEnd, shouldSkipHistoryAnimations, undefined, shouldSkipHistoryAnimations,\n );\n // eslint-disable-next-line no-null/no-null\n const modalRef = useRef(null);\n\n useEffect(() => (isOpen\n ? captureKeyboardListeners({ onEsc: onClose, onEnter })\n : undefined), [isOpen, onClose, onEnter]);\n useEffect(() => (isOpen && modalRef.current ? trapFocus(modalRef.current) : undefined), [isOpen]);\n\n const { forceClose } = useHistoryBack(isOpen, onClose);\n\n // For modals that are closed by unmounting without changing `isOpen` to `false`\n useEffect(() => {\n return () => {\n if (isOpen) {\n forceClose();\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n document.body.classList.toggle('has-open-dialog', isOpen);\n\n if (isOpen || (!isOpen && prevIsOpen !== undefined)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n\n return () => {\n document.body.classList.remove('has-open-dialog');\n };\n }, [isOpen]);\n\n const lang = useLang();\n\n if (!shouldRender) {\n return undefined;\n }\n\n function renderHeader() {\n if (header) {\n return header;\n }\n\n if (!title) {\n return undefined;\n }\n\n return (\n
\n {hasCloseButton && (\n \n \n \n )}\n
{title}
\n
\n );\n }\n\n const fullClassName = buildClassName(\n 'Modal',\n className,\n transitionClassNames,\n noBackdrop && 'transparent-backdrop',\n );\n\n return (\n \n \n
\n
\n
\n {renderHeader()}\n
\n {children}\n
\n
\n
\n
\n
\n );\n};\n\nexport default Modal;\n","export default function trapFocus(element: HTMLElement) {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const focusableElements = Array.from(\n element.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\n ) as HTMLElement[];\n if (!focusableElements.length) {\n return;\n }\n\n const currentFocusedIndex = focusableElements.findIndex((em) => em.isSameNode(document.activeElement));\n let newFocusedIndex = 0;\n if (currentFocusedIndex >= 0) {\n if (e.shiftKey) {\n newFocusedIndex = currentFocusedIndex > 0\n ? currentFocusedIndex - 1\n : focusableElements.length - 1;\n } else {\n newFocusedIndex = currentFocusedIndex < focusableElements.length - 1\n ? currentFocusedIndex + 1\n : 0;\n }\n }\n\n focusableElements[newFocusedIndex].focus();\n }\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n}\n","import { RefObject } from 'react';\nimport React, {\n FC, useLayoutEffect, useRef,\n} from '../../lib/teact/teact';\nimport { getGlobal } from '../../lib/teact/teactn';\n\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport usePrevious from '../../hooks/usePrevious';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport { waitForAnimationEnd } from '../../util/cssAnimationEndListeners';\n\nimport './Transition.scss';\n\ntype ChildrenFn = (isActive: boolean, isFrom: boolean, currentKey: number) => any;\ntype OwnProps = {\n ref?: RefObject;\n activeKey: number;\n name: (\n 'none' | 'slide' | 'slide-reversed' | 'mv-slide' | 'slide-fade' | 'zoom-fade' | 'slide-layers'\n | 'fade' | 'push-slide' | 'reveal'\n );\n direction?: 'auto' | 'inverse' | 1 | -1;\n renderCount?: number;\n shouldRestoreHeight?: boolean;\n shouldCleanup?: boolean;\n cleanupExceptionKey?: number;\n id?: string;\n className?: string;\n onStart?: () => void;\n onStop?: () => void;\n children: ChildrenFn;\n};\n\nconst CLEANED_UP = Symbol('CLEANED_UP');\n\nconst Transition: FC = ({\n ref,\n activeKey,\n name,\n direction = 'auto',\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n cleanupExceptionKey,\n id,\n className,\n onStart,\n onStop,\n children,\n}) => {\n // No need for a container to update on change\n const { animationLevel } = getGlobal().settings.byKey;\n\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const rendersRef = useRef>({});\n const prevActiveKey = usePrevious(activeKey);\n const forceUpdate = useForceUpdate();\n\n const activeKeyChanged = prevActiveKey !== undefined && activeKey !== prevActiveKey;\n\n if (!renderCount && activeKeyChanged) {\n rendersRef.current = { [prevActiveKey]: rendersRef.current[prevActiveKey] };\n }\n\n rendersRef.current[activeKey] = children;\n\n useLayoutEffect(() => {\n function cleanup() {\n if (!shouldCleanup || (cleanupExceptionKey !== undefined && cleanupExceptionKey === prevActiveKey)) {\n return;\n }\n\n rendersRef.current = { [prevActiveKey]: CLEANED_UP };\n forceUpdate();\n }\n\n const container = containerRef.current!;\n\n const childElements = container.children;\n if (childElements.length === 1 && !activeKeyChanged) {\n childElements[0].classList.add('active');\n\n return;\n }\n\n const childNodes = Array.from(container.childNodes);\n\n if (!activeKeyChanged || !childNodes.length) {\n return;\n }\n\n const isBackwards = (\n direction === -1\n || (direction === 'auto' && prevActiveKey > activeKey)\n || (direction === 'inverse' && prevActiveKey < activeKey)\n );\n\n container.classList.remove('animating');\n container.classList.toggle('backwards', isBackwards);\n\n const keys = Object.keys(rendersRef.current).map(Number);\n const prevActiveIndex = renderCount ? prevActiveKey : keys.indexOf(prevActiveKey);\n const activeIndex = renderCount ? activeKey : keys.indexOf(activeKey);\n\n if (name === 'none' || animationLevel === 0) {\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle('active', i === activeIndex);\n }\n });\n\n cleanup();\n\n return;\n }\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('active');\n node.classList.toggle('from', i === prevActiveIndex);\n node.classList.toggle('through', (\n (i > prevActiveIndex && i < activeIndex) || (i < prevActiveIndex && i > activeIndex)\n ));\n node.classList.toggle('to', i === activeIndex);\n }\n });\n\n let dispatchHeavyAnimationStop: NoneToVoidFunction;\n if (animationLevel > 0) {\n dispatchHeavyAnimationStop = dispatchHeavyAnimationEvent();\n }\n\n requestAnimationFrame(() => {\n container.classList.add('animating');\n\n function onAnimationEnd() {\n requestAnimationFrame(() => {\n container.classList.remove('animating', 'backwards');\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle('active', i === activeIndex);\n }\n });\n\n if (shouldRestoreHeight) {\n const activeElement = container.querySelector('.active');\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n }\n }\n\n if (dispatchHeavyAnimationStop) {\n dispatchHeavyAnimationStop();\n }\n\n cleanup();\n\n if (onStop) {\n onStop();\n }\n });\n }\n\n if (animationLevel > 0) {\n const toNode = name === 'mv-slide' ? childNodes[activeIndex].firstChild! : childNodes[activeIndex];\n waitForAnimationEnd(toNode, onAnimationEnd);\n } else {\n onAnimationEnd();\n }\n\n if (onStart) {\n onStart();\n }\n });\n }, [\n activeKey,\n prevActiveKey,\n activeKeyChanged,\n direction,\n name,\n onStart,\n onStop,\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n cleanupExceptionKey,\n animationLevel,\n forceUpdate,\n ]);\n\n useLayoutEffect(() => {\n if (shouldRestoreHeight) {\n const container = containerRef.current!;\n const activeElement = container.querySelector('.active')\n || container.querySelector('.from');\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n container.style.flexBasis = `${activeElement.clientHeight}px`;\n }\n }\n }, [shouldRestoreHeight, children]);\n\n const renders = rendersRef.current;\n const collection = Object.keys(renderCount ? new Array(renderCount).fill(undefined) : renders).map(Number);\n const contents = collection.map((key) => {\n const render = renders[key];\n\n return (\n typeof render === 'function'\n ?
{render(key === activeKey, key === prevActiveKey, activeKey)}
\n : undefined\n );\n });\n\n const fullClassName = buildClassName(\n 'Transition',\n className,\n name,\n );\n\n return (\n
\n {contents}\n
\n );\n};\n\nexport default Transition;\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, { FC, useCallback, memo } from '../../lib/teact/teact';\n\nimport { ApiUser, ApiChat, ApiMediaFormat } from '../../api/types';\n\nimport { IS_TEST } from '../../config';\nimport {\n getChatAvatarHash, getChatTitle, isChatPrivate,\n getUserFullName, isUserOnline, isDeletedUser, getUserColorKey,\n} from '../../modules/helpers';\nimport { getFirstLetters } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from './helpers/renderText';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useLang from '../../hooks/useLang';\n\nimport './Avatar.scss';\n\ntype OwnProps = {\n className?: string;\n size?: 'micro' | 'tiny' | 'small' | 'medium' | 'large' | 'jumbo';\n withOnlineStatus?: boolean;\n chat?: ApiChat;\n user?: ApiUser;\n text?: string;\n isSavedMessages?: boolean;\n lastSyncTime?: number;\n onClick?: (e: ReactMouseEvent, hasPhoto: boolean) => void;\n};\n\nconst Avatar: FC = ({\n className,\n size = 'large',\n chat,\n user,\n text,\n withOnlineStatus,\n isSavedMessages,\n lastSyncTime,\n onClick,\n}) => {\n const isDeleted = user && isDeletedUser(user);\n let imageHash: string | undefined;\n\n if (!isSavedMessages && !isDeleted) {\n if (user) {\n imageHash = getChatAvatarHash(user);\n } else if (chat) {\n imageHash = getChatAvatarHash(chat);\n }\n }\n\n const dataUri = useMedia(imageHash, false, ApiMediaFormat.DataUri, lastSyncTime);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(dataUri, 'slow');\n\n const lang = useLang();\n\n let content: string | undefined = '';\n\n if (isSavedMessages) {\n content = ;\n } else if (isDeleted) {\n content = ;\n } else if (shouldRenderFullMedia) {\n content = \"\";\n } else if (user) {\n const userFullName = getUserFullName(user);\n content = userFullName ? getFirstLetters(userFullName, 2) : undefined;\n } else if (chat) {\n const title = getChatTitle(lang, chat);\n content = title && getFirstLetters(title, isChatPrivate(chat.id) ? 2 : 1);\n } else if (text) {\n content = getFirstLetters(text, 2);\n }\n\n const isOnline = !isSavedMessages && user && isUserOnline(user);\n const fullClassName = buildClassName(\n `Avatar size-${size}`,\n className,\n `color-bg-${getUserColorKey(user || chat)}`,\n isSavedMessages && 'saved-messages',\n isDeleted && 'deleted-account',\n withOnlineStatus && isOnline && 'online',\n onClick && 'interactive',\n (!isSavedMessages && !shouldRenderFullMedia) && 'no-photo',\n );\n\n const handleClick = useCallback((e: ReactMouseEvent) => {\n if (onClick) {\n onClick(e, isSavedMessages || shouldRenderFullMedia);\n }\n }, [onClick, isSavedMessages, shouldRenderFullMedia]);\n\n const senderId = (user || chat) && (user || chat)!.id;\n\n return (\n
\n {typeof content === 'string' ? renderText(content, [size === 'jumbo' ? 'hq_emoji' : 'emoji']) : content}\n
\n );\n};\n\nexport default memo(Avatar);\n","import { RefObject, UIEvent } from 'react';\nimport { LoadMoreDirection } from '../../types';\n\nimport React, {\n FC, useCallback, useEffect, useLayoutEffect, useMemo, useRef,\n} from '../../lib/teact/teact';\n\nimport { debounce } from '../../util/schedulers';\nimport resetScroll from '../../util/resetScroll';\n\ntype OwnProps = {\n ref?: RefObject;\n className?: string;\n onLoadMore?: ({ direction }: { direction: LoadMoreDirection; noScroll?: boolean }) => void;\n onScroll?: (e: UIEvent) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n items?: any[];\n itemSelector?: string;\n preloadBackwards?: number;\n sensitiveArea?: number;\n noScrollRestore?: boolean;\n noScrollRestoreOnTop?: boolean;\n noFastList?: boolean;\n cacheBuster?: any;\n children: any;\n};\n\nconst DEFAULT_LIST_SELECTOR = '.ListItem';\nconst DEFAULT_PRELOAD_BACKWARDS = 20;\nconst DEFAULT_SENSITIVE_AREA = 800;\n\nconst InfiniteScroll: FC = ({\n ref,\n className,\n onLoadMore,\n onScroll,\n onKeyDown,\n items,\n itemSelector = DEFAULT_LIST_SELECTOR,\n preloadBackwards = DEFAULT_PRELOAD_BACKWARDS,\n sensitiveArea = DEFAULT_SENSITIVE_AREA,\n // Used to turn off restoring scroll position (e.g. for frequently re-ordered chat or user lists)\n noScrollRestore = false,\n noScrollRestoreOnTop = false,\n noFastList,\n // Used to re-query `listItemElements` if rendering is delayed by transition\n cacheBuster,\n children,\n}: OwnProps) => {\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const stateRef = useRef<{\n listItemElements: NodeListOf;\n isScrollTopJustUpdated: boolean;\n currentAnchor: HTMLDivElement | undefined;\n currentAnchorTop: number;\n }>({} as any);\n\n const [loadMoreBackwards, loadMoreForwards] = useMemo(() => {\n if (!onLoadMore) {\n return [];\n }\n\n return [\n debounce((noScroll = false) => {\n onLoadMore({ direction: LoadMoreDirection.Backwards, noScroll });\n }, 1000, true, false),\n debounce(() => {\n onLoadMore({ direction: LoadMoreDirection.Forwards });\n }, 1000, true, false),\n ];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [onLoadMore, items]);\n\n // Initial preload\n useEffect(() => {\n if (!loadMoreBackwards) {\n return;\n }\n\n if (preloadBackwards > 0 && (!items || items.length < preloadBackwards)) {\n loadMoreBackwards(true);\n return;\n }\n\n const { scrollHeight, clientHeight } = containerRef.current!;\n if (clientHeight && scrollHeight <= clientHeight) {\n loadMoreBackwards();\n }\n }, [items, loadMoreBackwards, preloadBackwards]);\n\n // Restore `scrollTop` after adding items\n useLayoutEffect(() => {\n const container = containerRef.current!;\n const state = stateRef.current;\n\n state.listItemElements = container.querySelectorAll(itemSelector);\n\n let newScrollTop;\n\n if (state.currentAnchor && Array.from(state.listItemElements).includes(state.currentAnchor)) {\n const { scrollTop } = container;\n const newAnchorTop = state.currentAnchor.getBoundingClientRect().top;\n newScrollTop = scrollTop + (newAnchorTop - state.currentAnchorTop);\n } else {\n const nextAnchor = state.listItemElements[0];\n if (nextAnchor) {\n state.currentAnchor = nextAnchor;\n state.currentAnchorTop = nextAnchor.getBoundingClientRect().top;\n }\n }\n\n if (noScrollRestore) {\n return;\n }\n\n if (noScrollRestoreOnTop && container.scrollTop === 0) {\n return;\n }\n\n resetScroll(container, newScrollTop);\n\n state.isScrollTopJustUpdated = true;\n }, [items, itemSelector, noScrollRestore, noScrollRestoreOnTop, cacheBuster]);\n\n const handleScroll = useCallback((e: UIEvent) => {\n if (loadMoreForwards && loadMoreBackwards) {\n const {\n listItemElements, isScrollTopJustUpdated, currentAnchor, currentAnchorTop,\n } = stateRef.current;\n\n if (isScrollTopJustUpdated) {\n stateRef.current.isScrollTopJustUpdated = false;\n return;\n }\n\n const listLength = listItemElements.length;\n const container = containerRef.current!;\n const { scrollTop, scrollHeight, offsetHeight } = container;\n const top = listLength ? listItemElements[0].offsetTop : 0;\n const isNearTop = scrollTop <= top + sensitiveArea;\n const bottom = listLength\n ? listItemElements[listLength - 1].offsetTop + listItemElements[listLength - 1].offsetHeight\n : scrollHeight;\n const isNearBottom = bottom - (scrollTop + offsetHeight) <= sensitiveArea;\n let isUpdated = false;\n\n if (isNearTop) {\n const nextAnchor = listItemElements[0];\n if (nextAnchor) {\n const nextAnchorTop = nextAnchor.getBoundingClientRect().top;\n const newAnchorTop = currentAnchor && currentAnchor.offsetParent && currentAnchor !== nextAnchor\n ? currentAnchor.getBoundingClientRect().top\n : nextAnchorTop;\n const isMovingUp = (\n currentAnchor && currentAnchorTop !== undefined && newAnchorTop > currentAnchorTop\n );\n\n if (isMovingUp) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchorTop;\n isUpdated = true;\n resetScroll(container);\n loadMoreForwards();\n }\n }\n }\n\n if (isNearBottom) {\n const nextAnchor = listItemElements[listLength - 1];\n if (nextAnchor) {\n const nextAnchorTop = nextAnchor.getBoundingClientRect().top;\n const newAnchorTop = currentAnchor && currentAnchor.offsetParent && currentAnchor !== nextAnchor\n ? currentAnchor.getBoundingClientRect().top\n : nextAnchorTop;\n const isMovingDown = (\n currentAnchor && currentAnchorTop !== undefined && newAnchorTop < currentAnchorTop\n );\n\n if (isMovingDown) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchorTop;\n isUpdated = true;\n resetScroll(container);\n loadMoreBackwards();\n }\n }\n }\n\n if (!isUpdated) {\n if (currentAnchor && currentAnchor.offsetParent) {\n stateRef.current.currentAnchorTop = currentAnchor.getBoundingClientRect().top;\n } else {\n const nextAnchor = listItemElements[0];\n\n if (nextAnchor) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchor.getBoundingClientRect().top;\n }\n }\n }\n }\n\n if (onScroll) {\n onScroll(e);\n }\n }, [loadMoreBackwards, loadMoreForwards, onScroll, sensitiveArea]);\n\n return (\n \n {children}\n
\n );\n};\n\nexport default InfiniteScroll;\n","import React, { FC } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Button, { OwnProps as ButtonProps } from './Button';\n\nimport './FloatingActionButton.scss';\n\ntype OwnProps = {\n isShown: boolean;\n className?: string;\n color?: ButtonProps['color'];\n ariaLabel?: ButtonProps['ariaLabel'];\n disabled?: boolean;\n onClick: () => void;\n children: any;\n};\n\nconst FloatingActionButton: FC = ({\n isShown,\n className,\n color = 'primary',\n ariaLabel,\n disabled,\n onClick,\n children,\n}) => {\n const buttonClassName = buildClassName(\n 'FloatingActionButton',\n isShown && 'revealed',\n className,\n );\n\n return (\n \n {children}\n \n );\n};\n\nexport default FloatingActionButton;\n","import { useEffect, useRef, useState } from '../lib/teact/teact';\n\nimport useShowTransition from './useShowTransition';\n\nconst SPEED = {\n fast: 200,\n slow: 350,\n};\n\nexport default (mediaData?: any, speed: keyof typeof SPEED = 'fast', noAnimate = false) => {\n const isMediaLoaded = Boolean(mediaData);\n const willAnimate = !useRef(isMediaLoaded).current && !noAnimate;\n const [shouldRenderThumb, setShouldRenderThumb] = useState(!isMediaLoaded);\n\n const {\n shouldRender: shouldRenderFullMedia,\n transitionClassNames,\n } = useShowTransition(isMediaLoaded, undefined, !willAnimate, speed);\n\n useEffect(() => {\n if (shouldRenderFullMedia) {\n if (willAnimate) {\n setTimeout(() => {\n setShouldRenderThumb(false);\n }, SPEED[speed]);\n } else {\n setShouldRenderThumb(false);\n }\n }\n }, [willAnimate, shouldRenderFullMedia, speed]);\n\n return {\n shouldRenderThumb,\n shouldRenderFullMedia,\n transitionClassNames,\n };\n};\n","import {\n ApiPhoto, ApiVideo, ApiSticker, ApiDimensions,\n} from '../../../api/types';\n\nimport { STICKER_SIZE_INLINE_DESKTOP_FACTOR, STICKER_SIZE_INLINE_MOBILE_FACTOR } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport windowSize from '../../../util/windowSize';\nimport { getPhotoInlineDimensions, getVideoDimensions } from '../../../modules/helpers';\n\nexport const MEDIA_VIEWER_MEDIA_QUERY = '(max-height: 640px)';\nexport const REM = parseInt(getComputedStyle(document.documentElement).fontSize, 10);\nexport const ROUND_VIDEO_DIMENSIONS = 200;\nexport const AVATAR_FULL_DIMENSIONS = { width: 640, height: 640 };\nexport const LIKE_STICKER_ID = '1258816259753933';\n\nconst DEFAULT_MEDIA_DIMENSIONS: ApiDimensions = { width: 100, height: 100 };\nconst MOBILE_SCREEN_NO_AVATARS_MESSAGE_EXTRA_WIDTH_REM = 4.5;\nconst MOBILE_SCREEN_MESSAGE_EXTRA_WIDTH_REM = 7;\nconst MESSAGE_MAX_WIDTH_REM = 29;\nconst MESSAGE_OWN_MAX_WIDTH_REM = 30;\n\nlet cachedMaxWidthOwn: number | undefined;\nlet cachedMaxWidth: number | undefined;\nlet cachedMaxWidthNoAvatar: number | undefined;\n\nfunction getMaxMessageWidthRem(fromOwnMessage: boolean, noAvatars?: boolean) {\n const regularMaxWidth = fromOwnMessage ? MESSAGE_OWN_MAX_WIDTH_REM : MESSAGE_MAX_WIDTH_REM;\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n return regularMaxWidth;\n }\n\n const { width: windowWidth } = windowSize.get();\n\n // @optimization Limitation: changing device screen width not supported\n if (!cachedMaxWidthOwn) {\n cachedMaxWidthOwn = Math.min(\n MESSAGE_OWN_MAX_WIDTH_REM,\n windowWidth / REM - MOBILE_SCREEN_NO_AVATARS_MESSAGE_EXTRA_WIDTH_REM,\n );\n }\n if (!cachedMaxWidth) {\n cachedMaxWidth = Math.min(\n MESSAGE_MAX_WIDTH_REM,\n windowWidth / REM - MOBILE_SCREEN_MESSAGE_EXTRA_WIDTH_REM,\n );\n }\n if (!cachedMaxWidthNoAvatar) {\n cachedMaxWidthNoAvatar = Math.min(\n MESSAGE_MAX_WIDTH_REM,\n windowWidth / REM - MOBILE_SCREEN_NO_AVATARS_MESSAGE_EXTRA_WIDTH_REM,\n );\n }\n\n return fromOwnMessage\n ? cachedMaxWidthOwn\n : (noAvatars ? cachedMaxWidthNoAvatar : cachedMaxWidth);\n}\n\nexport function getAvailableWidth(\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n isWebPagePhoto?: boolean,\n noAvatars?: boolean,\n) {\n const extraPaddingRem = isForwarded || isWebPagePhoto ? 1.625 : 0;\n const availableWidthRem = getMaxMessageWidthRem(fromOwnMessage, noAvatars) - extraPaddingRem;\n\n return availableWidthRem * REM;\n}\n\nfunction getAvailableHeight(isGif?: boolean, aspectRatio?: number) {\n if (\n isGif && aspectRatio\n && aspectRatio >= 0.75 && aspectRatio <= 1.25\n ) {\n return 20 * REM;\n }\n\n return 27 * REM;\n}\n\nfunction calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isWebPagePhoto,\n isGif,\n noAvatars,\n}: {\n width: number;\n height: number;\n fromOwnMessage: boolean;\n isForwarded?: boolean;\n isWebPagePhoto?: boolean;\n isGif?: boolean;\n noAvatars?: boolean;\n}): ApiDimensions {\n const aspectRatio = height / width;\n const availableWidth = getAvailableWidth(fromOwnMessage, isForwarded, isWebPagePhoto, noAvatars);\n const availableHeight = getAvailableHeight(isGif, aspectRatio);\n\n return calculateDimensions(availableWidth, availableHeight, width, height);\n}\n\nexport function getMediaViewerAvailableDimensions(withFooter: boolean, isVideo: boolean): ApiDimensions {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n const { width: windowWidth, height: windowHeight } = windowSize.get();\n let occupiedHeightRem = isVideo && mql.matches ? 10 : 8.25;\n if (withFooter) {\n occupiedHeightRem = mql.matches ? 10 : 15;\n }\n\n return {\n width: windowWidth,\n height: windowHeight - occupiedHeightRem * REM,\n };\n}\n\nexport function calculateInlineImageDimensions(\n photo: ApiPhoto,\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n isWebPagePhoto?: boolean,\n noAvatars?: boolean,\n) {\n const { width, height } = getPhotoInlineDimensions(photo) || DEFAULT_MEDIA_DIMENSIONS;\n\n return calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isWebPagePhoto,\n noAvatars,\n });\n}\n\nexport function calculateVideoDimensions(\n video: ApiVideo,\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n noAvatars?: boolean,\n) {\n const { width, height } = getVideoDimensions(video) || DEFAULT_MEDIA_DIMENSIONS;\n\n return calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isGif: video.isGif,\n noAvatars,\n });\n}\n\nexport function getPictogramDimensions(): ApiDimensions {\n return {\n width: 2 * REM,\n height: 2 * REM,\n };\n}\n\nexport function getDocumentThumbnailDimensions(smaller?: boolean): ApiDimensions {\n if (smaller) {\n return {\n width: 3 * REM,\n height: 3 * REM,\n };\n }\n\n return {\n width: 3.375 * REM,\n height: 3.375 * REM,\n };\n}\n\nexport function getStickerDimensions(sticker: ApiSticker): ApiDimensions {\n const { width } = sticker;\n let { height } = sticker;\n\n // For some reason this sticker has some weird `height` value\n if (sticker.id === LIKE_STICKER_ID) {\n height = width;\n }\n\n const aspectRatio = (height && width) && height / width;\n const baseWidth = REM * (\n IS_SINGLE_COLUMN_LAYOUT\n ? STICKER_SIZE_INLINE_MOBILE_FACTOR\n : STICKER_SIZE_INLINE_DESKTOP_FACTOR\n );\n const calculatedHeight = aspectRatio ? baseWidth * aspectRatio : baseWidth;\n\n if (aspectRatio && calculatedHeight > baseWidth) {\n return {\n width: Math.round(baseWidth / aspectRatio),\n height: baseWidth,\n };\n }\n\n return {\n width: baseWidth,\n height: calculatedHeight,\n };\n}\n\nexport function calculateMediaViewerDimensions(\n { width, height }: ApiDimensions, withFooter: boolean, isVideo: boolean = false,\n): ApiDimensions {\n const { width: availableWidth, height: availableHeight } = getMediaViewerAvailableDimensions(withFooter, isVideo);\n\n return calculateDimensions(availableWidth, availableHeight, width, height);\n}\n\nexport function calculateDimensions(\n availableWidth: number,\n availableHeight: number,\n mediaWidth: number,\n mediaHeight: number,\n): ApiDimensions {\n const aspectRatio = mediaHeight / mediaWidth;\n const calculatedWidth = Math.min(mediaWidth, availableWidth);\n const calculatedHeight = Math.round(calculatedWidth * aspectRatio);\n\n if (calculatedHeight > availableHeight) {\n return {\n width: Math.round(availableHeight / aspectRatio),\n height: availableHeight,\n };\n }\n\n return {\n width: calculatedWidth,\n height: Math.round(calculatedWidth * aspectRatio),\n };\n}\n","import React, {\n FC, useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport useHeavyAnimationCheck from '../../hooks/useHeavyAnimationCheck';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\ntype OwnProps = {\n className?: string;\n id: string;\n animationData: AnyLiteral;\n play?: boolean | string;\n playSegment?: [number, number];\n speed?: number;\n noLoop?: boolean;\n size: number;\n quality?: number;\n isLowPriority?: boolean;\n onLoad?: NoneToVoidFunction;\n};\n\ntype RLottieClass = typeof import('../../lib/rlottie/RLottie').default;\ntype RLottieInstance = import('../../lib/rlottie/RLottie').default;\nlet lottiePromise: Promise;\nlet RLottie: RLottieClass;\n\n// Time supposed for judges to measure \"Transferred Size\" in Dev Tools\nconst LOTTIE_LOAD_DELAY = 5000;\n\nasync function ensureLottie() {\n if (!lottiePromise) {\n lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise;\n RLottie = (await lottiePromise as any).default;\n }\n\n return lottiePromise;\n}\n\nsetTimeout(ensureLottie, LOTTIE_LOAD_DELAY);\n\nconst AnimatedSticker: FC = ({\n className,\n id,\n animationData,\n play,\n playSegment,\n speed,\n noLoop,\n size,\n quality,\n isLowPriority,\n onLoad,\n}) => {\n const [animation, setAnimation] = useState();\n // eslint-disable-next-line no-null/no-null\n const container = useRef(null);\n const wasPlaying = useRef(false);\n const isFrozen = useRef(false);\n\n const playRef = useRef();\n playRef.current = play;\n const playSegmentRef = useRef<[number, number]>();\n playSegmentRef.current = playSegment;\n\n useEffect(() => {\n if (animation || !animationData) {\n return;\n }\n\n const exec = () => {\n if (!container.current) {\n return;\n }\n\n const newAnimation = new RLottie(\n id,\n container.current,\n animationData,\n {\n noLoop,\n size,\n quality,\n isLowPriority,\n },\n onLoad,\n );\n\n if (speed) {\n newAnimation.setSpeed(speed);\n }\n\n setAnimation(newAnimation);\n };\n\n if (RLottie) {\n exec();\n } else {\n ensureLottie().then(() => {\n fastRaf(() => {\n if (container.current) {\n exec();\n }\n });\n });\n }\n }, [animation, animationData, id, isLowPriority, noLoop, onLoad, quality, size, speed]);\n\n useEffect(() => {\n return () => {\n if (animation) {\n animation.destroy();\n }\n };\n }, [animation]);\n\n const playAnimation = useCallback((shouldRestart = false) => {\n if (animation && (playRef.current || playSegmentRef.current)) {\n if (playSegmentRef.current) {\n animation.playSegment(playSegmentRef.current);\n } else if (shouldRestart) {\n animation.goToAndPlay(0);\n } else {\n animation.play();\n }\n }\n }, [animation]);\n\n const pauseAnimation = useCallback(() => {\n if (!animation) {\n return;\n }\n\n animation.pause();\n }, [animation]);\n\n const freezeAnimation = useCallback(() => {\n isFrozen.current = true;\n\n if (!animation) {\n return;\n }\n\n if (!wasPlaying.current) {\n wasPlaying.current = animation.isPlaying();\n }\n\n pauseAnimation();\n }, [animation, pauseAnimation]);\n\n const unfreezeAnimation = useCallback(() => {\n if (wasPlaying.current) {\n playAnimation();\n }\n\n wasPlaying.current = false;\n isFrozen.current = false;\n }, [playAnimation]);\n\n const unfreezeAnimationOnRaf = useCallback(() => {\n fastRaf(unfreezeAnimation);\n }, [unfreezeAnimation]);\n\n useEffect(() => {\n if (!animation) {\n return;\n }\n\n if (play || playSegment) {\n if (isFrozen.current) {\n wasPlaying.current = true;\n } else {\n playAnimation(noLoop);\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (isFrozen.current) {\n wasPlaying.current = false;\n } else {\n pauseAnimation();\n }\n }\n }, [animation, play, playSegment, noLoop, playAnimation, pauseAnimation]);\n\n useHeavyAnimationCheck(freezeAnimation, unfreezeAnimation);\n // Pausing frame may not happen in background\n // so we need to make sure it happens right after focusing,\n // then we can play again.\n useBackgroundMode(freezeAnimation, unfreezeAnimationOnRaf);\n\n const fullClassName = buildClassName('AnimatedSticker', className);\n\n const style = size ? `width: ${size}px; height: ${size}px;` : undefined;\n\n return (\n \n );\n};\n\nexport default memo(AnimatedSticker);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\nimport { TextPart } from '../common/helpers/renderMessageText';\n\nimport Modal from './Modal';\nimport Button from './Button';\n\ntype OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n title?: string;\n header?: FC;\n textParts?: TextPart[];\n text?: string;\n confirmLabel?: string;\n confirmHandler: () => void;\n confirmIsDestructive?: boolean;\n isButtonsInOneRow?: boolean;\n};\n\nconst ConfirmDialog: FC = ({\n isOpen,\n onClose,\n onCloseAnimationEnd,\n title,\n header,\n text,\n textParts,\n confirmLabel = 'Confirm',\n confirmHandler,\n confirmIsDestructive,\n isButtonsInOneRow,\n}) => {\n const lang = useLang();\n\n return (\n \n {text && text.split('\\\\n').map((textPart) => (\n

{textPart}

\n ))}\n {textParts}\n
\n \n {confirmLabel}\n \n \n
\n \n );\n};\n\nexport default memo(ConfirmDialog);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport './NothingFound.scss';\n\ninterface OwnProps {\n text?: string;\n description?: string;\n}\n\nconst DEFAULT_TEXT = 'Nothing found.';\n\nconst NothingFound: FC = ({ text = DEFAULT_TEXT, description }) => {\n const lang = useLang();\n const { transitionClassNames } = useShowTransition(true);\n\n return (\n
\n {text}\n {description &&

{renderText(lang(description), ['br'])}

}\n
\n );\n};\n\nexport default memo(NothingFound);\n","import { useEffect, useRef } from '../../../lib/teact/teact';\n\nimport useOnChange from '../../../hooks/useOnChange';\nimport useForceUpdate from '../../../hooks/useForceUpdate';\n\nexport default function useAsyncRendering(dependencies: T, delay?: number) {\n const isDisabled = delay === undefined;\n const shouldRenderRef = useRef(isDisabled);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n if (isDisabled) {\n return;\n }\n\n shouldRenderRef.current = false;\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n }, dependencies);\n\n useEffect(() => {\n if (isDisabled || shouldRenderRef.current) {\n return;\n }\n\n const exec = () => {\n shouldRenderRef.current = true;\n forceUpdate();\n };\n\n if (delay! > 0) {\n timeoutRef.current = window.setTimeout(exec, delay);\n } else {\n exec();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n return shouldRenderRef.current;\n}\n","import {\n useEffect, useMemo, useRef, useState,\n} from '../lib/teact/teact';\n\nimport { IS_PROGRESSIVE_SUPPORTED } from '../util/environment';\nimport { ApiMediaFormat } from '../api/types';\nimport { throttle } from '../util/schedulers';\nimport * as mediaLoader from '../util/mediaLoader';\nimport useForceUpdate from './useForceUpdate';\n\nconst STREAMING_PROGRESS = 0.75;\nconst STREAMING_TIMEOUT = 1500;\nconst PROGRESS_THROTTLE = 500;\n\nexport default (\n mediaHash: string | undefined,\n noLoad = false,\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n mediaFormat: T = ApiMediaFormat.BlobUrl,\n cacheBuster?: number,\n delay?: number | false,\n) => {\n const mediaData = mediaHash ? mediaLoader.getFromMemory(mediaHash) : undefined;\n const isStreaming = mediaFormat === ApiMediaFormat.Stream || (\n IS_PROGRESSIVE_SUPPORTED && mediaFormat === ApiMediaFormat.Progressive\n );\n const forceUpdate = useForceUpdate();\n const [downloadProgress, setDownloadProgress] = useState(mediaData && !isStreaming ? 1 : 0);\n const startedAtRef = useRef();\n\n const handleProgress = useMemo(() => {\n return throttle((progress: number) => {\n if (!delay || (Date.now() - startedAtRef.current! > delay)) {\n setDownloadProgress(progress);\n }\n }, PROGRESS_THROTTLE, true);\n }, [delay]);\n\n useEffect(() => {\n if (!noLoad && mediaHash) {\n if (!mediaData) {\n setDownloadProgress(0);\n\n if (startedAtRef.current) {\n mediaLoader.cancelProgress(handleProgress);\n }\n\n startedAtRef.current = Date.now();\n\n mediaLoader.fetch(mediaHash, mediaFormat, handleProgress).then(() => {\n const spentTime = Date.now() - startedAtRef.current!;\n startedAtRef.current = undefined;\n\n if (!delay || spentTime >= delay) {\n forceUpdate();\n } else {\n setTimeout(forceUpdate, delay - spentTime);\n }\n });\n } else if (isStreaming) {\n setTimeout(() => {\n setDownloadProgress(STREAMING_PROGRESS);\n }, STREAMING_TIMEOUT);\n }\n }\n }, [noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, isStreaming, delay, handleProgress]);\n\n useEffect(() => {\n if (noLoad && startedAtRef.current) {\n mediaLoader.cancelProgress(handleProgress);\n setDownloadProgress(0);\n }\n }, [handleProgress, noLoad]);\n\n return { mediaData, downloadProgress };\n};\n","import React, {\n FC, useEffect, useRef, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './ProgressSpinner.scss';\n\nconst RADIUSES = {\n s: 22, m: 25, l: 28, xl: 20,\n};\nconst STROKE_WIDTH = 2;\nconst MIN_PROGRESS = 0.05;\nconst MAX_PROGRESS = 1;\n\nconst ProgressSpinner: FC<{\n progress?: number;\n size?: 's' | 'm' | 'l' | 'xl';\n square?: boolean;\n transparent?: boolean;\n noCross?: boolean;\n onClick?: (e: React.MouseEvent) => void;\n}> = ({\n progress = 0,\n size = 'l',\n square,\n transparent,\n noCross,\n onClick,\n}) => {\n const radius = RADIUSES[size];\n const circleRadius = radius - STROKE_WIDTH * 2;\n const borderRadius = radius - 1;\n const circumference = circleRadius * 2 * Math.PI;\n // eslint-disable-next-line no-null/no-null\n const container = useRef(null);\n\n useEffect(() => {\n if (!container.current) {\n return;\n }\n\n const svg = container.current.firstElementChild;\n const strokeDashOffset = circumference - Math.min(Math.max(MIN_PROGRESS, progress), MAX_PROGRESS) * circumference;\n\n if (!svg) {\n container.current.innerHTML = `\n \n `;\n } else {\n (svg.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', strokeDashOffset.toString());\n }\n }, [container, circumference, borderRadius, circleRadius, progress]);\n\n const className = buildClassName(\n `ProgressSpinner size-${size}`,\n transparent && 'transparent',\n square && 'square',\n noCross && 'no-cross',\n );\n\n return (\n \n );\n};\n\nexport default memo(ProgressSpinner);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { useIsIntersecting, ObserveFn } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useFlag from '../../hooks/useFlag';\nimport buildClassName from '../../util/buildClassName';\n\nimport AnimatedSticker from './AnimatedSticker';\nimport Button from '../ui/Button';\n\nimport './StickerButton.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n size: number;\n observeIntersection: ObserveFn;\n noAnimate?: boolean;\n title?: string;\n className?: string;\n onClick?: (arg: any) => void;\n clickArg?: any;\n onUnfaveClick?: (sticker: ApiSticker) => void;\n};\n\nconst StickerButton: FC = ({\n sticker, size, observeIntersection, noAnimate, title, className, onClick, clickArg, onUnfaveClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const localMediaHash = `sticker${sticker.id}`;\n const stickerSelector = `sticker-button-${sticker.id}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const thumbDataUri = sticker.thumbnail ? sticker.thumbnail.dataUri : undefined;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl);\n\n const shouldPlay = isIntersecting && !noAnimate;\n const lottieData = useMedia(sticker.isAnimated && localMediaHash, !shouldPlay, ApiMediaFormat.Lottie);\n const [isAnimationLoaded, markLoaded, unmarkLoaded] = useFlag(Boolean(lottieData));\n const canAnimatedPlay = isAnimationLoaded && shouldPlay;\n\n const {\n shouldRenderThumb,\n shouldRenderFullMedia: shouldRenderPreview,\n transitionClassNames: previewTransitionClassNames,\n } = useTransitionForMedia(previewBlobUrl || canAnimatedPlay, 'slow');\n\n // To avoid flickering\n useEffect(() => {\n if (!shouldPlay) {\n unmarkLoaded();\n }\n }, [unmarkLoaded, shouldPlay]);\n\n function handleClick() {\n if (onClick) {\n onClick(clickArg);\n }\n }\n\n function handleUnfaveClick(e: ReactMouseEvent) {\n e.stopPropagation();\n e.preventDefault();\n\n onUnfaveClick!(sticker);\n }\n\n const fullClassName = buildClassName(\n 'StickerButton',\n sticker.isAnimated && 'animated',\n stickerSelector,\n className,\n );\n\n const style = shouldRenderThumb && thumbDataUri ? `background-image: url('${thumbDataUri}');` : '';\n\n return (\n \n {shouldRenderPreview && !canAnimatedPlay && (\n // eslint-disable-next-line jsx-a11y/alt-text\n \n )}\n {shouldPlay && lottieData && (\n \n )}\n {onUnfaveClick && (\n \n \n \n )}\n
\n );\n};\n\nexport default memo(StickerButton);\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from './Spinner';\n\nimport './Radio.scss';\n\ntype OwnProps = {\n id?: string;\n name: string;\n label: string;\n subLabel?: string;\n value: string;\n checked: boolean;\n disabled?: boolean;\n hidden?: boolean;\n isLoading?: boolean;\n onChange: (e: ChangeEvent) => void;\n};\n\nconst Radio: FC = ({\n id,\n label,\n subLabel,\n value,\n name,\n checked,\n disabled,\n hidden,\n isLoading,\n onChange,\n}) => {\n const lang = useLang();\n const className = buildClassName(\n 'Radio',\n disabled && 'disabled',\n hidden && 'hidden-widget',\n isLoading && 'loading',\n );\n\n return (\n \n );\n};\n\nexport default memo(Radio);\n","import { ChangeEvent } from 'react';\nimport React, { FC, useCallback, memo } from '../../lib/teact/teact';\n\nimport Radio from './Radio';\n\ntype IRadioOption = {\n label: string;\n subLabel?: string;\n value: string;\n hidden?: boolean;\n};\n\ntype OwnProps = {\n id?: string;\n name: string;\n options: IRadioOption[];\n selected?: string;\n disabled?: boolean;\n loadingOption?: string;\n onChange: (value: string) => void;\n};\n\nconst RadioGroup: FC = ({\n id,\n name,\n options,\n selected,\n disabled,\n loadingOption,\n onChange,\n}) => {\n const handleChange = useCallback((event: ChangeEvent) => {\n const { value } = event.currentTarget;\n onChange(value);\n }, [onChange]);\n\n return (\n
\n {options.map((option) => (\n
\n );\n};\n\nexport default memo(RadioGroup);\n","import { useEffect } from '../lib/teact/teact';\n\nexport default function useBackgroundMode(\n onBlur?: AnyToVoidFunction,\n onFocus?: AnyToVoidFunction,\n) {\n useEffect(() => {\n if (onBlur && !document.hasFocus()) {\n onBlur();\n }\n\n if (onBlur) {\n window.addEventListener('blur', onBlur);\n }\n\n if (onFocus) {\n window.addEventListener('focus', onFocus);\n }\n\n return () => {\n if (onFocus) {\n window.removeEventListener('focus', onFocus);\n }\n\n if (onBlur) {\n window.removeEventListener('blur', onBlur);\n }\n };\n }, [onBlur, onFocus]);\n}\n","import { FC, useRef, useLayoutEffect } from '../../lib/teact/teact';\nimport TeactDOM from '../../lib/teact/teact-dom';\n\ntype OwnProps = {\n containerId?: string;\n className?: string;\n children: any;\n};\n\nconst Portal: FC = ({ containerId, className, children }) => {\n const elementRef = useRef(document.createElement('div'));\n\n useLayoutEffect(() => {\n const container = document.querySelector(containerId || '#portals');\n if (!container) {\n return undefined;\n }\n\n const element = elementRef.current;\n if (className) {\n element.classList.add(className);\n }\n\n container.appendChild(element);\n\n return () => {\n TeactDOM.render(undefined, element);\n container.removeChild(element);\n };\n }, [className, containerId]);\n\n return TeactDOM.render(children, elementRef.current);\n};\n\nexport default Portal;\n","import React, {\n FC, useCallback, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { LIKE_STICKER_ID } from './helpers/mediaDimensions';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useFlag from '../../hooks/useFlag';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './AnimatedEmoji.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n observeIntersection?: ObserveFn;\n size?: 'large' | 'medium' | 'small';\n lastSyncTime?: number;\n forceLoadPreview?: boolean;\n};\n\nconst QUALITY = 1;\nconst WIDTH = {\n large: 160,\n medium: 128,\n small: 104,\n};\n\nconst AnimatedEmoji: FC = ({\n sticker,\n size = 'medium',\n observeIntersection,\n lastSyncTime,\n forceLoadPreview,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isAnimationLoaded, markAnimationLoaded] = useFlag();\n const localMediaHash = `sticker${sticker.id}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const thumbDataUri = sticker.thumbnail && sticker.thumbnail.dataUri;\n const previewBlobUrl = useMedia(\n `${localMediaHash}?size=m`,\n !isIntersecting && !forceLoadPreview,\n ApiMediaFormat.BlobUrl,\n lastSyncTime,\n );\n const { transitionClassNames } = useTransitionForMedia(previewBlobUrl, 'slow');\n\n const mediaData = useMedia(localMediaHash, !isIntersecting, ApiMediaFormat.Lottie, lastSyncTime);\n const isMediaLoaded = Boolean(mediaData);\n\n const [playKey, setPlayKey] = useState(String(Math.random()));\n const handleClick = useCallback(() => {\n setPlayKey(String(Math.random()));\n }, []);\n\n const width = WIDTH[size];\n const style = `width: ${width}px; height: ${width}px;`;\n\n return (\n \n {!isAnimationLoaded && thumbDataUri && (\n \"\"\n )}\n {!isAnimationLoaded && previewBlobUrl && (\n \"\"\n )}\n {isMediaLoaded && (\n \n )}\n
\n );\n};\n\nexport default AnimatedEmoji;\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat, ApiTypingStatus } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport {\n getChatTypeString,\n getChatTitle,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport { selectChat, selectChatMessages, selectChatOnlineCount } from '../../modules/selectors';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\nimport VerifiedIcon from './VerifiedIcon';\nimport TypingStatus from './TypingStatus';\n\ntype OwnProps = {\n chatId: number;\n typingStatus?: ApiTypingStatus;\n avatarSize?: 'small' | 'medium' | 'large' | 'jumbo';\n withMediaViewer?: boolean;\n withUsername?: boolean;\n withFullInfo?: boolean;\n withUpdatingStatus?: boolean;\n withChatType?: boolean;\n noRtl?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n onlineCount?: number;\n areMessagesLoaded: boolean;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst GroupChatInfo: FC = ({\n typingStatus,\n avatarSize = 'medium',\n withMediaViewer,\n withUsername,\n withFullInfo,\n withUpdatingStatus,\n withChatType,\n noRtl,\n chat,\n onlineCount,\n areMessagesLoaded,\n lastSyncTime,\n loadFullChat,\n openMediaViewer,\n}) => {\n const isSuperGroup = chat && isChatSuperGroup(chat);\n const { id: chatId, isMin, isRestricted } = chat || {};\n\n useEffect(() => {\n if (chatId && !isMin && withFullInfo && lastSyncTime) {\n loadFullChat({ chatId });\n }\n }, [chatId, isMin, lastSyncTime, withFullInfo, loadFullChat, isSuperGroup]);\n\n const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => {\n if (chat && hasPhoto) {\n e.stopPropagation();\n openMediaViewer({\n avatarOwnerId: chat.id,\n origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar,\n });\n }\n }, [chat, avatarSize, openMediaViewer]);\n\n const lang = useLang();\n\n if (!chat) {\n return undefined;\n }\n\n function renderStatusOrTyping() {\n if (withUpdatingStatus && !areMessagesLoaded && !isRestricted) {\n return (\n {lang('Updating')}\n );\n }\n\n if (!chat) {\n return undefined;\n }\n\n if (typingStatus) {\n return ;\n }\n\n if (withChatType) {\n return (\n
{lang(getChatTypeString(chat))}
\n );\n }\n\n const handle = withUsername ? chat.username : undefined;\n const groupStatus = getGroupStatus(lang, chat);\n const onlineStatus = onlineCount ? `, ${lang('OnlineCount', onlineCount, 'i')}` : undefined;\n\n return (\n
\n {handle && {handle}}\n {groupStatus}\n {onlineStatus && {onlineStatus}}\n
\n );\n }\n\n return (\n
\n \n
\n
\n

{renderText(getChatTitle(lang, chat))}

\n {chat.isVerified && }\n
\n {renderStatusOrTyping()}\n
\n
\n );\n};\n\nfunction getGroupStatus(lang: LangFn, chat: ApiChat) {\n const chatTypeString = lang(getChatTypeString(chat));\n const { membersCount } = chat;\n\n if (chat.isRestricted) {\n return chatTypeString === 'Channel' ? 'channel is inaccessible' : 'group is inaccessible';\n }\n\n if (!membersCount) {\n return chatTypeString;\n }\n\n return chatTypeString === 'Channel'\n ? lang('Subscribers', membersCount, 'i')\n : lang('Members', membersCount, 'i');\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const { lastSyncTime } = global;\n const chat = selectChat(global, chatId);\n const onlineCount = chat ? selectChatOnlineCount(global, chat) : undefined;\n const areMessagesLoaded = Boolean(selectChatMessages(global, chatId));\n\n return {\n lastSyncTime, chat, onlineCount, areMessagesLoaded,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullChat', 'openMediaViewer']),\n)(GroupChatInfo));\n","import { getGlobal } from '../lib/teact/teactn';\n\nimport { FocusDirection } from '../types';\n\nimport {\n ANIMATION_LEVEL_MIN,\n FAST_SMOOTH_MAX_DISTANCE, FAST_SMOOTH_MAX_DURATION, FAST_SMOOTH_MIN_DURATION,\n FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE,\n} from '../config';\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\nimport { animateSingle } from './animation';\n\nlet isAnimating = false;\n\nexport default function fastSmoothScroll(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition | 'centerOrTop',\n margin = 0,\n maxDistance = FAST_SMOOTH_MAX_DISTANCE,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n forceCurrentContainerHeight?: boolean,\n) {\n const scrollFrom = calculateScrollFrom(container, element, maxDistance, forceDirection);\n\n if (forceDirection === FocusDirection.Static) {\n scrollWithJs(container, element, scrollFrom, position, margin, 0);\n return;\n }\n\n\n if (getGlobal().settings.byKey.animationLevel === ANIMATION_LEVEL_MIN) {\n forceDuration = 0;\n }\n\n scrollWithJs(container, element, scrollFrom, position, margin, forceDuration, forceCurrentContainerHeight);\n}\n\nexport function isAnimatingScroll() {\n return isAnimating;\n}\n\nfunction calculateScrollFrom(\n container: HTMLElement,\n element: HTMLElement,\n maxDistance = FAST_SMOOTH_MAX_DISTANCE,\n forceDirection?: FocusDirection,\n) {\n const { offsetTop: elementTop } = element;\n const { scrollTop } = container;\n\n if (forceDirection === undefined) {\n const offset = elementTop - container.scrollTop;\n\n if (offset < -maxDistance) {\n return scrollTop + (offset + maxDistance);\n } else if (offset > maxDistance) {\n return scrollTop + (offset - maxDistance);\n }\n } else if (forceDirection === FocusDirection.Up) {\n return elementTop + maxDistance;\n } else if (forceDirection === FocusDirection.Down) {\n return Math.max(0, elementTop - maxDistance);\n }\n\n return scrollTop;\n}\n\nfunction scrollWithJs(\n container: HTMLElement,\n element: HTMLElement,\n scrollFrom: number,\n position: ScrollLogicalPosition | 'centerOrTop',\n margin = 0,\n forceDuration?: number,\n forceCurrentContainerHeight?: boolean,\n) {\n const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const { scrollTop: currentScrollTop, offsetHeight: containerHeight, scrollHeight } = container;\n const targetContainerHeight = !forceCurrentContainerHeight && container.dataset.normalHeight\n ? Number(container.dataset.normalHeight)\n : containerHeight;\n\n if (currentScrollTop !== scrollFrom) {\n container.scrollTop = scrollFrom;\n }\n\n let path!: number;\n\n switch (position) {\n case 'start':\n path = (elementTop - margin) - scrollFrom;\n break;\n case 'end':\n path = (elementTop + elementHeight + margin) - (scrollFrom + targetContainerHeight);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n case 'centerOrTop':\n path = elementHeight < targetContainerHeight\n ? (elementTop + elementHeight / 2) - (scrollFrom + targetContainerHeight / 2)\n : (elementTop - margin) - scrollFrom;\n break;\n }\n\n if (path < 0) {\n const remainingPath = -scrollFrom;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollHeight - (scrollFrom + targetContainerHeight);\n path = Math.min(path, remainingPath);\n }\n\n if (path === 0) {\n return;\n }\n\n const target = scrollFrom + path;\n\n if (forceDuration === 0) {\n container.scrollTop = target;\n return;\n }\n\n isAnimating = true;\n\n const absPath = Math.abs(path);\n const transition = absPath < FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition;\n const duration = forceDuration || (\n FAST_SMOOTH_MIN_DURATION\n + (absPath / FAST_SMOOTH_MAX_DISTANCE) * (FAST_SMOOTH_MAX_DURATION - FAST_SMOOTH_MIN_DURATION)\n );\n const startAt = Date.now();\n const onHeavyAnimationStop = dispatchHeavyAnimationEvent();\n\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / duration, 1);\n const currentPath = path * (1 - transition(t));\n\n container.scrollTop = Math.round(target - currentPath);\n\n isAnimating = t < 1;\n\n if (!isAnimating) {\n onHeavyAnimationStop();\n }\n\n return isAnimating;\n });\n}\n\nfunction longTransition(t: number) {\n return 1 - ((1 - t) ** 5);\n}\n\nfunction shortTransition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\nimport { LoadMoreDirection } from '../types';\n\nimport { areSortedArraysEqual } from '../util/iteratees';\nimport useForceUpdate from './useForceUpdate';\nimport usePrevious from './usePrevious';\n\ntype GetMore = (args: { direction: LoadMoreDirection }) => void;\ntype LoadMoreBackwards = (args: { offsetId?: number }) => void;\n\nconst DEFAULT_LIST_SLICE = 30;\n\nexport default (\n loadMoreBackwards?: LoadMoreBackwards,\n listIds?: number[],\n isDisabled = false,\n listSlice = DEFAULT_LIST_SLICE,\n forceFullPreload = false,\n): [number[]?, GetMore?] => {\n const lastParamsRef = useRef<{\n direction?: LoadMoreDirection;\n offsetId?: number;\n }>();\n\n const viewportIdsRef = useRef((() => {\n // Only run once to initialize\n if (!listIds || lastParamsRef.current) {\n return undefined;\n }\n\n const { newViewportIds } = getViewportSlice(listIds, listIds[0], LoadMoreDirection.Forwards, listSlice);\n return newViewportIds;\n })());\n\n const forceUpdate = useForceUpdate();\n\n const prevListIds = usePrevious(listIds);\n const prevIsDisabled = usePrevious(isDisabled);\n if (listIds && !isDisabled && (listIds !== prevListIds || isDisabled !== prevIsDisabled)) {\n const { offsetId = listIds[0], direction = LoadMoreDirection.Forwards } = lastParamsRef.current || {};\n const { newViewportIds } = getViewportSlice(listIds, offsetId, direction, listSlice);\n\n if (!viewportIdsRef.current || !areSortedArraysEqual(viewportIdsRef.current, newViewportIds)) {\n viewportIdsRef.current = newViewportIds;\n }\n }\n\n useEffect(() => {\n if (listIds && !isDisabled && loadMoreBackwards && forceFullPreload) {\n const viewportIds = viewportIdsRef.current!;\n loadMoreBackwards({ offsetId: viewportIds[viewportIds.length - 1] });\n }\n }, [listIds, isDisabled, loadMoreBackwards, forceFullPreload]);\n\n const getMore: GetMore = useCallback(({\n direction,\n noScroll,\n }: { direction: LoadMoreDirection; noScroll?: boolean }) => {\n const viewportIds = viewportIdsRef.current;\n\n const offsetId = viewportIds\n ? direction === LoadMoreDirection.Backwards ? viewportIds[viewportIds.length - 1] : viewportIds[0]\n : undefined;\n\n if (!listIds) {\n if (loadMoreBackwards) {\n loadMoreBackwards({ offsetId });\n }\n\n return;\n }\n\n if (!noScroll) {\n lastParamsRef.current = { ...lastParamsRef.current, direction, offsetId };\n }\n\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(listIds, offsetId, direction, listSlice);\n\n if (areSomeLocal && !(viewportIds && areSortedArraysEqual(viewportIds, newViewportIds))) {\n viewportIdsRef.current = newViewportIds;\n forceUpdate();\n }\n\n if (!areAllLocal && loadMoreBackwards) {\n loadMoreBackwards({ offsetId });\n }\n }, [listIds, listSlice, loadMoreBackwards, forceUpdate]);\n\n return isDisabled ? [listIds] : [viewportIdsRef.current, getMore];\n};\n\nfunction getViewportSlice(\n sourceIds: number[],\n offsetId = 0,\n direction: LoadMoreDirection,\n listSlice: number,\n) {\n const { length } = sourceIds;\n const index = sourceIds.indexOf(offsetId);\n const isForwards = direction === LoadMoreDirection.Forwards;\n const indexForDirection = isForwards ? index : (index + 1) || length;\n const from = Math.max(0, indexForDirection - listSlice);\n const to = indexForDirection + listSlice - 1;\n const newViewportIds = sourceIds.slice(Math.max(0, from), to + 1);\n\n let areSomeLocal;\n let areAllLocal;\n switch (direction) {\n case LoadMoreDirection.Forwards:\n areSomeLocal = indexForDirection > 0;\n areAllLocal = from >= 0;\n break;\n case LoadMoreDirection.Backwards:\n areSomeLocal = indexForDirection < length;\n areAllLocal = to <= length - 1;\n break;\n }\n\n return { newViewportIds, areSomeLocal, areAllLocal };\n}\n","export default function cycleRestrict(length: number, index: number) {\n return index - Math.floor(index / length) * length;\n}\n","import { IS_TOUCH_ENV } from './environment';\n\nexport default function focusEditableElement(element: HTMLElement, force?: boolean) {\n if (!force && element === document.activeElement) {\n return;\n }\n\n const selection = window.getSelection()!;\n const range = document.createRange();\n const lastChild = element.lastChild || element;\n\n if (!IS_TOUCH_ENV && (!lastChild || !lastChild.nodeValue)) {\n element.focus();\n return;\n }\n\n range.selectNodeContents(lastChild);\n // `false` means collapse to the end rather than the start\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n","export enum SwipeDirection {\n Up,\n Down,\n Left,\n Right,\n}\n\ninterface CaptureOptions {\n onCapture?: (e: MouseEvent | TouchEvent) => void;\n onRelease?: (e: MouseEvent | TouchEvent) => void;\n onDrag?: (\n e: MouseEvent | TouchEvent,\n captureEvent: MouseEvent | TouchEvent,\n params: {\n dragOffsetX: number;\n dragOffsetY: number;\n },\n ) => void;\n onSwipe?: (e: Event, direction: SwipeDirection) => void;\n onClick?: (e: MouseEvent | TouchEvent) => void;\n excludedClosestSelector?: string;\n withCursor?: boolean;\n}\n\n// https://stackoverflow.com/questions/11287877/how-can-i-get-e-offsetx-on-mobile-ipad\n// Android does not have this value, and iOS has it but as read-only\nexport interface RealTouchEvent extends TouchEvent {\n pageX?: number;\n pageY?: number;\n}\n\ntype TSwipeAxis = 'x' | 'y' | undefined;\n\nconst MOVED_THRESHOLD = 15;\nconst SWIPE_THRESHOLD = 50;\n\nexport function captureEvents(element: HTMLElement, options: CaptureOptions) {\n let captureEvent: MouseEvent | RealTouchEvent | undefined;\n let hasMoved = false;\n let currentSwipeAxis: TSwipeAxis;\n\n function onCapture(e: MouseEvent | RealTouchEvent) {\n if (options.excludedClosestSelector && (\n (e.target as HTMLElement).matches(options.excludedClosestSelector)\n || (e.target as HTMLElement).closest(options.excludedClosestSelector)\n )) {\n return;\n }\n\n captureEvent = e;\n\n if (e.type === 'mousedown') {\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onRelease);\n } else if (e.type === 'touchstart') {\n document.addEventListener('touchmove', onMove);\n document.addEventListener('touchend', onRelease);\n document.addEventListener('touchcancel', onRelease);\n\n if ('touches' in e) {\n if (e.pageX === undefined) {\n e.pageX = e.touches[0].pageX;\n }\n\n if (e.pageY === undefined) {\n e.pageY = e.touches[0].pageY;\n }\n }\n }\n\n document.body.classList.add('no-selection');\n if (options.withCursor) {\n document.body.classList.add('cursor-grabbing');\n }\n\n if (options.onCapture) {\n options.onCapture(e);\n }\n }\n\n function onRelease(e: MouseEvent | TouchEvent) {\n if (captureEvent) {\n if (options.withCursor) {\n document.body.classList.remove('cursor-grabbing');\n }\n document.body.classList.remove('no-selection');\n\n document.removeEventListener('mouseup', onRelease);\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('touchcancel', onRelease);\n document.removeEventListener('touchend', onRelease);\n document.removeEventListener('touchmove', onMove);\n\n captureEvent = undefined;\n\n if (hasMoved) {\n if (options.onRelease) {\n options.onRelease(e);\n }\n } else if (options.onClick && (!('button' in e) || e.button === 0)) {\n options.onClick(e);\n }\n }\n\n hasMoved = false;\n currentSwipeAxis = undefined;\n }\n\n function onMove(e: MouseEvent | RealTouchEvent) {\n if (captureEvent) {\n if (e.type === 'touchmove' && ('touches' in e)) {\n if (e.pageX === undefined) {\n e.pageX = e.touches[0].pageX;\n }\n\n if (e.pageY === undefined) {\n e.pageY = e.touches[0].pageY;\n }\n }\n\n const dragOffsetX = e.pageX! - captureEvent.pageX!;\n const dragOffsetY = e.pageY! - captureEvent.pageY!;\n\n if (Math.abs(dragOffsetX) >= MOVED_THRESHOLD || Math.abs(dragOffsetY) >= MOVED_THRESHOLD) {\n hasMoved = true;\n }\n\n if (options.onDrag) {\n e.preventDefault();\n options.onDrag(e, captureEvent, { dragOffsetX, dragOffsetY });\n }\n\n if (options.onSwipe) {\n onSwipe(e, dragOffsetX, dragOffsetY);\n }\n }\n }\n\n function onSwipe(e: Event, dragOffsetX: number, dragOffsetY: number) {\n if (!currentSwipeAxis) {\n const xAbs = Math.abs(dragOffsetX);\n const yAbs = Math.abs(dragOffsetY);\n\n if (dragOffsetX && dragOffsetY) {\n const ratio = Math.max(xAbs, yAbs) / Math.min(xAbs, yAbs);\n // Diagonal swipe\n if (ratio < 2) {\n return;\n }\n }\n\n if (xAbs >= SWIPE_THRESHOLD) {\n currentSwipeAxis = 'x';\n } else if (yAbs >= SWIPE_THRESHOLD) {\n currentSwipeAxis = 'y';\n }\n }\n\n processSwipe(e, currentSwipeAxis, dragOffsetX, dragOffsetY, options.onSwipe!);\n }\n\n element.addEventListener('mousedown', onCapture);\n element.addEventListener('touchstart', onCapture, { passive: true });\n\n return () => {\n element.removeEventListener('mousedown', onCapture);\n element.removeEventListener('touchstart', onCapture);\n };\n}\n\nfunction processSwipe(\n e: Event,\n currentSwipeAxis:TSwipeAxis,\n dragOffsetX: number,\n dragOffsetY: number,\n onSwipe: (e: Event, direction: SwipeDirection) => void,\n) {\n if (currentSwipeAxis === 'x') {\n if (dragOffsetX < 0) {\n onSwipe(e, SwipeDirection.Left);\n } else {\n onSwipe(e, SwipeDirection.Right);\n }\n } else if (currentSwipeAxis === 'y') {\n if (dragOffsetY < 0) {\n onSwipe(e, SwipeDirection.Up);\n } else {\n onSwipe(e, SwipeDirection.Down);\n }\n }\n}\n","import React, { FC } from '../../lib/teact/teact';\n\nimport './VerifiedIcon.scss';\n\nconst VerifiedIcon: FC = () => {\n return (\n \n );\n};\n\nexport default VerifiedIcon;\n","import usePrevious from './usePrevious';\n\nexport default function useCurrentOrPrev(\n current: T, shouldSkipUndefined = false, shouldForceCurrent = false,\n): T | undefined {\n const prev = usePrevious(current, shouldSkipUndefined);\n\n // eslint-disable-next-line no-null/no-null\n return shouldForceCurrent || (current !== null && current !== undefined) ? current : prev;\n}\n","import { DEBUG } from '../config';\n\nexport default (mediaEl: HTMLMediaElement) => {\n mediaEl.play().catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err);\n }\n });\n};\n","import React, { useCallback, useMemo, useState } from '../lib/teact/teact';\nimport { debounce } from '../util/schedulers';\nimport { isSafariPatchInProgress } from '../util/patchSafariProgressiveAudio';\n\ntype BufferingEvent = (e: Event | React.SyntheticEvent) => void;\n\nconst MIN_READY_STATE = 3;\n// Avoid flickering when re-mounting previously buffered video\nconst DEBOUNCE = 200;\n\nexport default (noInitiallyBuffered = false) => {\n const [isBuffered, setIsBuffered] = useState(!noInitiallyBuffered);\n const [bufferedProgress, setBufferedProgress] = useState(0);\n\n const setIsBufferedDebounced = useMemo(() => {\n return debounce(setIsBuffered, DEBOUNCE, false, true);\n }, []);\n\n const handleBuffering = useCallback((e) => {\n const media = e.currentTarget as HTMLMediaElement;\n\n if (!isSafariPatchInProgress(media)) {\n if (media.buffered.length) {\n setBufferedProgress(media.buffered.end(0) / media.duration);\n }\n\n setIsBufferedDebounced(media.readyState >= MIN_READY_STATE || media.currentTime > 0);\n }\n }, [setIsBufferedDebounced]);\n\n const bufferingHandlers = {\n onLoadedData: handleBuffering,\n onPlaying: handleBuffering,\n onLoadStart: handleBuffering, // Needed for Safari to start\n onPause: handleBuffering, // Needed for Chrome when seeking\n onTimeUpdate: handleBuffering, // Needed for audio buffering progress\n onProgress: handleBuffering, // Needed for video buffering progress\n };\n\n return {\n isBuffered,\n bufferedProgress,\n bufferingHandlers,\n checkBuffering(element: HTMLMediaElement) {\n setIsBufferedDebounced(element.readyState >= MIN_READY_STATE);\n },\n };\n};\n","import { ApiMessageEntity, ApiMessageEntityTypes, ApiFormattedText } from '../../../../api/types';\nimport { IS_EMOJI_SUPPORTED } from '../../../../util/environment';\n\nconst ENTITY_CLASS_BY_NODE_NAME: Record = {\n B: ApiMessageEntityTypes.Bold,\n STRONG: ApiMessageEntityTypes.Bold,\n I: ApiMessageEntityTypes.Italic,\n EM: ApiMessageEntityTypes.Italic,\n U: ApiMessageEntityTypes.Underline,\n S: ApiMessageEntityTypes.Strike,\n STRIKE: ApiMessageEntityTypes.Strike,\n DEL: ApiMessageEntityTypes.Strike,\n CODE: ApiMessageEntityTypes.Code,\n PRE: ApiMessageEntityTypes.Pre,\n BLOCKQUOTE: ApiMessageEntityTypes.Blockquote,\n};\n\nconst MAX_TAG_DEEPNESS = 3;\nconst MAX_MESSAGE_LENGTH = 4096;\n\nexport default function parseMessageInput(html: string): ApiFormattedText {\n const fragment = document.createElement('div');\n fragment.innerHTML = parseMarkdown(html);\n const text = fragment.innerText.trim().replace(/\\u200b+/g, '').slice(0, MAX_MESSAGE_LENGTH);\n let textIndex = 0;\n let recursionDeepness = 0;\n const entities: ApiMessageEntity[] = [];\n\n function addEntity(node: ChildNode) {\n const { index, entity } = getEntityDataFromNode(node, text, textIndex);\n\n if (entity) {\n textIndex = index;\n entities.push(entity);\n } else if (node.textContent) {\n textIndex += node.textContent.length;\n }\n\n if (node.hasChildNodes() && recursionDeepness <= MAX_TAG_DEEPNESS) {\n recursionDeepness += 1;\n Array.from(node.childNodes).forEach(addEntity);\n }\n }\n\n Array.from(fragment.childNodes).forEach((node) => {\n recursionDeepness = 1;\n addEntity(node);\n });\n\n return {\n text,\n entities: entities.length ? entities : undefined,\n };\n}\n\nfunction parseMarkdown(html: string) {\n let parsedHtml = html.slice(0);\n\n if (!IS_EMOJI_SUPPORTED) {\n // Emojis\n parsedHtml = parsedHtml.replace(/]+alt=\"([^\"]+)\"[^>]*>/gm, '$1');\n }\n\n // Strip redundant tags\n parsedHtml = parsedHtml.replace(/<\\/?span([^>]*)?>/g, '');\n\n // Strip redundant nbsp's\n parsedHtml = parsedHtml.replace(/ /g, ' ');\n\n // Replace

with newline (new line in Safari)\n parsedHtml = parsedHtml.replace(/
]*)?><\\/div>/g, '\\n');\n // Replace
with newline\n parsedHtml = parsedHtml.replace(/]*)?>/g, '\\n');\n\n // Strip redundant
tags\n parsedHtml = parsedHtml.replace(/<\\/div>(\\s*)
/g, '\\n');\n parsedHtml = parsedHtml.replace(/
/g, '\\n');\n parsedHtml = parsedHtml.replace(/<\\/div>/g, '');\n\n // Pre\n parsedHtml = parsedHtml.replace(/^`{3}(.*[\\n\\r][^]*?^)`{3}/gm, '
$1
');\n parsedHtml = parsedHtml.replace(/[`]{3}([^`]+)[`]{3}/g, '
$1
');\n\n // Code\n parsedHtml = parsedHtml.replace(/[`]{1}([^`\\n]+)[`]{1}/g, '$1');\n\n // Other simple markdown\n parsedHtml = parsedHtml.replace(/[*]{2}([^*\\n]+)[*]{2}/g, '$1');\n parsedHtml = parsedHtml.replace(/[_]{2}([^*\\n]+)[_]{2}/g, '$1');\n parsedHtml = parsedHtml.replace(/[~]{2}([^~\\n]+)[~]{2}/g, '$1');\n\n return parsedHtml;\n}\n\nfunction getEntityDataFromNode(\n node: ChildNode,\n rawText: string,\n textIndex: number,\n): { index: number; entity?: ApiMessageEntity } {\n const type = getEntityTypeFromNode(node);\n if (!type || !node.textContent) {\n return {\n index: textIndex,\n entity: undefined,\n };\n }\n\n const rawIndex = rawText.indexOf(node.textContent, textIndex);\n // In some cases, last text entity ends with a newline (which gets trimmed from `rawText`).\n // In this case, `rawIndex` would return `-1`, so we use `textIndex` instead.\n const index = rawIndex >= 0 ? rawIndex : textIndex;\n const offset = rawText.substring(0, index).length;\n const { length } = rawText.substring(index, index + node.textContent.length);\n\n let url: string | undefined;\n let userId: number | undefined;\n if (type === ApiMessageEntityTypes.TextUrl) {\n url = (node as HTMLAnchorElement).href;\n }\n if (type === ApiMessageEntityTypes.MentionName) {\n userId = Number((node as HTMLAnchorElement).dataset.userId);\n }\n\n return {\n index,\n entity: {\n type,\n offset,\n length,\n ...(url && { url }),\n ...(userId && { userId }),\n },\n };\n}\n\nfunction getEntityTypeFromNode(node: ChildNode) {\n if (ENTITY_CLASS_BY_NODE_NAME[node.nodeName]) {\n return ENTITY_CLASS_BY_NODE_NAME[node.nodeName];\n }\n\n if (node.nodeName === 'A') {\n const anchor = node as HTMLAnchorElement;\n if (anchor.dataset.entityType === ApiMessageEntityTypes.MentionName) {\n return ApiMessageEntityTypes.MentionName;\n }\n if (anchor.dataset.entityType === ApiMessageEntityTypes.Url) {\n return ApiMessageEntityTypes.Url;\n }\n if (anchor.href.startsWith('mailto:')) {\n return ApiMessageEntityTypes.Email;\n }\n if (anchor.href.startsWith('tel:')) {\n return ApiMessageEntityTypes.Phone;\n }\n if (anchor.href !== anchor.textContent) {\n return ApiMessageEntityTypes.TextUrl;\n }\n\n return ApiMessageEntityTypes.Url;\n }\n\n if (node.nodeName === 'SPAN') {\n return (node as HTMLElement).dataset.entityType;\n }\n\n return undefined;\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\n\nimport './DropTarget.scss';\n\nexport type OwnProps = {\n isQuick?: boolean;\n onFileSelect: (e: React.DragEvent) => void;\n};\n\nconst DropTarget: FC = ({ isQuick, onFileSelect }) => {\n const [isHovered, markHovered, unmarkHovered] = useFlag();\n\n const handleDragEnter = () => { markHovered(); };\n const handleDragLeave = (e: React.DragEvent) => {\n const { relatedTarget: toTarget } = e;\n\n if (toTarget) {\n e.stopPropagation();\n }\n\n unmarkHovered();\n };\n\n const className = buildClassName(\n 'DropTarget',\n isHovered && 'hovered',\n );\n\n return (\n \n
\n
\n
Drop files here to send them
\n
{isQuick ? 'in a quick way' : 'without compression'}
\n
\n
\n );\n};\n\nexport default memo(DropTarget);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\n\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport DropTarget from './DropTarget';\n\nimport './DropArea.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n withQuick?: boolean;\n onHide: NoneToVoidFunction;\n onFileSelect: (files: File[], isQuick: boolean) => void;\n};\n\nexport enum DropAreaState {\n None = 'none',\n Document = 'document',\n QuickFile = 'quick_file',\n}\n\nconst DROP_LEAVE_TIMEOUT_MS = 150;\n\nconst DropArea: FC = ({\n isOpen, withQuick, onHide, onFileSelect,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const hideTimeoutRef = useRef(null);\n const prevWithQuick = usePrevious(withQuick);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen);\n\n useEffect(() => (isOpen ? captureEscKeyListener(onHide) : undefined), [isOpen, onHide]);\n\n const handleFilesDrop = useCallback((e: React.DragEvent) => {\n const { dataTransfer: dt } = e;\n\n if (dt.files && dt.files.length > 0) {\n onHide();\n onFileSelect(Array.from(dt.files), false);\n }\n }, [onFileSelect, onHide]);\n\n const handleQuickFilesDrop = useCallback((e: React.DragEvent) => {\n const { dataTransfer: dt } = e;\n\n if (dt.files && dt.files.length > 0) {\n onHide();\n onFileSelect(Array.from(dt.files), true);\n }\n }, [onFileSelect, onHide]);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.stopPropagation();\n\n const { target: fromTarget, relatedTarget: toTarget } = e;\n\n // Esc button pressed during drag event\n if ((fromTarget as HTMLDivElement).matches('.DropTarget, .DropArea') && !toTarget) {\n hideTimeoutRef.current = window.setTimeout(() => {\n onHide();\n }, DROP_LEAVE_TIMEOUT_MS);\n }\n }, [onHide]);\n\n const handleDragOver = () => {\n if (hideTimeoutRef.current) {\n window.clearTimeout(hideTimeoutRef.current);\n }\n };\n\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'DropArea',\n transitionClassNames,\n );\n\n return (\n
\n \n {(withQuick || prevWithQuick) && }\n
\n );\n};\n\nexport default memo(DropArea);\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { ApiChatFolder } from '../../api/types';\nimport { pick, omit } from '../../util/iteratees';\n\nexport type FolderChatType = {\n icon: string;\n title: string;\n key: keyof Pick;\n};\n\nexport const INCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'user', title: 'FilterContacts', key: 'contacts' },\n { icon: 'non-contacts', title: 'FilterNonContacts', key: 'nonContacts' },\n { icon: 'group', title: 'FilterGroups', key: 'groups' },\n { icon: 'channel', title: 'FilterChannels', key: 'channels' },\n { icon: 'bots', title: 'FilterBots', key: 'bots' },\n];\n\nexport const EXCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'mute', title: 'FilterMuted', key: 'excludeMuted' },\n { icon: 'archive', title: 'FilterArchived', key: 'excludeArchived' },\n { icon: 'readchats', title: 'FilterRead', key: 'excludeRead' },\n];\n\nconst INCLUDE_FILTER_FIELDS: Array = [\n 'includedChatIds', 'bots', 'channels', 'groups', 'contacts', 'nonContacts',\n];\nconst EXCLUDE_FILTER_FIELDS: Array = [\n 'excludedChatIds', 'excludeArchived', 'excludeMuted', 'excludeRead',\n];\n\nexport function selectChatFilters(state: FoldersState, mode: 'included' | 'excluded', selectTemp?: boolean) {\n let selectedChatIds: number[] = [];\n let selectedChatTypes: FolderChatType['key'][] = [];\n\n if (mode === 'included') {\n const {\n includedChatIds,\n ...includeFilters\n } = selectTemp\n ? state.includeFilters || {}\n : pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = includedChatIds || [];\n selectedChatTypes = (Object.keys(includeFilters) as Array)\n .filter((key) => Boolean(includeFilters[key]));\n } else {\n const {\n excludedChatIds,\n ...excludeFilters\n } = selectTemp\n ? state.excludeFilters || {}\n : pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = excludedChatIds || [];\n selectedChatTypes = (Object.keys(excludeFilters) as Array)\n .filter((key) => Boolean(excludeFilters[key]));\n }\n\n return {\n selectedChatIds,\n selectedChatTypes,\n };\n}\n\nfunction getSuggestedFolderName(includeFilters?: FolderIncludeFilters) {\n if (includeFilters) {\n const {\n includedChatIds,\n ...filters\n } = includeFilters;\n\n if (\n Object.values(filters).filter(Boolean).length > 1\n || (includedChatIds && includedChatIds.length)\n ) {\n return '';\n }\n\n if (filters.bots) {\n return 'Bots';\n } else if (filters.groups) {\n return 'Groups';\n } else if (filters.channels) {\n return 'Channels';\n } else if (filters.contacts) {\n return 'Contacts';\n } else if (filters.nonContacts) {\n return 'Non-Contacts';\n }\n }\n\n return '';\n}\n\ntype FolderIncludeFilters = Pick;\ntype FolderExcludeFilters = Pick;\n\nexport type FoldersState = {\n mode: 'create' | 'edit';\n isLoading?: boolean;\n isTouched?: boolean;\n error?: string;\n folderId?: number;\n chatFilter: string;\n folder: Omit;\n includeFilters?: FolderIncludeFilters;\n excludeFilters?: FolderExcludeFilters;\n};\nexport type FoldersActions = (\n 'setTitle' | 'saveFilters' | 'editFolder' | 'reset' | 'setChatFilter' | 'setIsLoading' | 'setError' |\n 'editIncludeFilters' | 'editExcludeFilters' | 'setIncludeFilters' | 'setExcludeFilters'\n);\nexport type FolderEditDispatch = Dispatch;\n\nconst INITIAL_STATE: FoldersState = {\n mode: 'create',\n chatFilter: '',\n folder: {\n title: '',\n includedChatIds: [],\n excludedChatIds: [],\n },\n};\n\nconst foldersReducer: StateReducer = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setTitle':\n return {\n ...state,\n folder: {\n ...state.folder,\n title: action.payload,\n },\n isTouched: true,\n };\n case 'editIncludeFilters':\n return {\n ...state,\n includeFilters: pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n ),\n };\n case 'editExcludeFilters':\n return {\n ...state,\n excludeFilters: pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n ),\n };\n case 'setIncludeFilters':\n return {\n ...state,\n includeFilters: action.payload,\n chatFilter: '',\n };\n case 'setExcludeFilters':\n return {\n ...state,\n excludeFilters: action.payload,\n chatFilter: '',\n };\n case 'saveFilters':\n if (state.includeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, INCLUDE_FILTER_FIELDS),\n title: state.folder.title ? state.folder.title : getSuggestedFolderName(state.includeFilters),\n ...state.includeFilters,\n },\n includeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else if (state.excludeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, EXCLUDE_FILTER_FIELDS),\n ...state.excludeFilters,\n },\n excludeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else {\n return state;\n }\n case 'editFolder': {\n const { id: folderId, description, ...folder } = action.payload;\n\n return {\n mode: 'edit',\n folderId,\n folder,\n chatFilter: '',\n };\n }\n case 'setChatFilter': {\n return {\n ...state,\n chatFilter: action.payload,\n };\n }\n case 'setIsLoading': {\n return {\n ...state,\n isLoading: action.payload,\n };\n }\n case 'setError': {\n return {\n ...state,\n error: action.payload,\n };\n }\n case 'reset':\n return INITIAL_STATE;\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(foldersReducer, INITIAL_STATE);\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport { selectChat, selectUser } from '../../modules/selectors';\nimport { getChatTitle, getUserFirstOrLastName, isChatPrivate } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\n\nimport './PickerSelectedItem.scss';\n\ntype OwnProps = {\n chatOrUserId?: number;\n icon?: string;\n title?: string;\n isMinimized?: boolean;\n canClose?: boolean;\n onClick: (arg: any) => void;\n clickArg: any;\n className?: string;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n user?: ApiUser;\n};\n\nconst PickerSelectedItem: FC = ({\n icon,\n title,\n isMinimized,\n canClose,\n onClick,\n clickArg,\n chat,\n user,\n className,\n}) => {\n const lang = useLang();\n\n let iconElement: any;\n let titleText: any;\n\n if (icon && title) {\n iconElement = (\n
\n \n
\n );\n\n titleText = title;\n } else if (chat || user) {\n iconElement = (\n \n );\n\n const name = !chat || (user && !user.isSelf)\n ? getUserFirstOrLastName(user)\n : getChatTitle(lang, chat, user);\n\n titleText = name ? renderText(name) : undefined;\n }\n\n const fullClassName = buildClassName(\n 'PickerSelectedItem',\n className,\n isMinimized && 'minimized',\n canClose && 'closeable',\n );\n\n return (\n onClick(clickArg)}\n title={isMinimized ? titleText : undefined}\n dir={lang.isRtl ? 'rtl' : undefined}\n >\n {iconElement}\n {!isMinimized && (\n
\n {titleText}\n
\n )}\n {canClose && (\n
\n \n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatOrUserId }): StateProps => {\n if (!chatOrUserId) {\n return {};\n }\n\n const chat = chatOrUserId ? selectChat(global, chatOrUserId) : undefined;\n const user = isChatPrivate(chatOrUserId) ? selectUser(global, chatOrUserId) : undefined;\n\n return {\n chat,\n user,\n };\n },\n)(PickerSelectedItem));\n","import { getGlobal } from '../lib/teact/teactn';\n\nimport { ANIMATION_LEVEL_MIN } from '../config';\nimport { IS_IOS } from './environment';\nimport { animate } from './animation';\n\nconst DEFAULT_DURATION = 300;\n\nexport default function fastSmoothScrollHorizontal(container: HTMLElement, left: number, duration = DEFAULT_DURATION) {\n if (getGlobal().settings.byKey.animationLevel === ANIMATION_LEVEL_MIN) {\n duration = 0;\n }\n\n // Native way seems to be smoother in Chrome\n if (!IS_IOS) {\n container.scrollTo({\n left,\n ...(duration && { behavior: 'smooth' }),\n });\n } else {\n scrollWithJs(container, left, duration);\n }\n}\n\nfunction scrollWithJs(container: HTMLElement, left: number, duration: number) {\n const { scrollLeft, offsetWidth: containerWidth, scrollWidth } = container;\n let path = left - scrollLeft;\n\n if (path < 0) {\n const remainingPath = -scrollLeft;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollWidth - (scrollLeft + containerWidth);\n path = Math.min(path, remainingPath);\n }\n\n if (path === 0) {\n return;\n }\n\n const target = scrollLeft + path;\n\n if (duration === 0) {\n container.scrollLeft = target;\n return;\n }\n\n const startAt = Date.now();\n\n animate(() => {\n const t = Math.min((Date.now() - startAt) / duration, 1);\n\n const currentPath = path * (1 - transition(t));\n container.scrollLeft = Math.round(target - currentPath);\n\n return t < 1;\n });\n}\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","import { useEffect } from '../lib/teact/teact';\n\nexport default (container: HTMLElement | null, isDisabled?: boolean) => {\n useEffect(() => {\n if (!container) {\n return undefined;\n }\n\n function handleScroll(e: WheelEvent) {\n // Ignore horizontal scroll and let it work natively (e.g. on touchpad)\n if (!e.deltaX) {\n container!.scrollLeft += e.deltaY / 4;\n }\n }\n\n container.addEventListener('wheel', handleScroll, { passive: true });\n\n return () => {\n container.removeEventListener('wheel', handleScroll);\n };\n }, [container, isDisabled]);\n};\n","import { useEffect, useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\n\nimport { ApiMessage } from '../api/types';\n\nimport { throttle } from '../util/schedulers';\n\nexport default (\n chatId: number,\n messageId?: number,\n message?: ApiMessage,\n replyOriginForId?: number,\n) => {\n const { loadMessage } = getDispatch();\n const loadMessageThrottled = useMemo(() => {\n const throttled = throttle(loadMessage, 500, true);\n return () => {\n throttled({ chatId, messageId, replyOriginForId });\n };\n }, [loadMessage, chatId, messageId, replyOriginForId]);\n\n useEffect(() => {\n if (messageId && !message) {\n loadMessageThrottled();\n }\n });\n};\n","import { RefObject } from 'react';\nimport { useState, useEffect, useCallback } from '../lib/teact/teact';\n\nimport { IAnchorPosition } from '../types';\nimport { IS_TOUCH_ENV, IS_SINGLE_COLUMN_LAYOUT } from '../util/environment';\n\nconst LONG_TAP_DURATION_MS = 250;\nconst SELECTION_ANIMATION_DURATION_MS = 200;\n\nlet contextMenuCounter = 0;\n\nfunction checkIsDisabledForMobile() {\n return IS_SINGLE_COLUMN_LAYOUT\n && window.document.body.classList.contains('enable-symbol-menu-transforms');\n}\n\nexport default (\n elementRef: RefObject,\n isMenuDisabled?: boolean,\n shouldDisableOnLink?: boolean,\n shouldDisableOnLongTap?: boolean,\n) => {\n const [isContextMenuOpen, setIsContextMenuOpen] = useState(false);\n const [contextMenuPosition, setContextMenuPosition] = useState(undefined);\n\n const handleBeforeContextMenu = useCallback((e: React.MouseEvent) => {\n if (!isMenuDisabled && e.button === 2) {\n document.body.classList.add('no-selection');\n }\n }, [isMenuDisabled]);\n\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n document.body.classList.remove('no-selection');\n\n if (isMenuDisabled || (shouldDisableOnLink && (e.target as HTMLElement).matches('a.text-entity-link[href]'))) {\n return;\n }\n e.preventDefault();\n\n if (contextMenuPosition) {\n return;\n }\n document.body.classList.remove('no-selection');\n if (contextMenuCounter === 0) {\n document.body.classList.add('has-context-menu');\n }\n contextMenuCounter++;\n\n setIsContextMenuOpen(true);\n setContextMenuPosition({ x: e.clientX, y: e.clientY });\n }, [isMenuDisabled, shouldDisableOnLink, contextMenuPosition]);\n\n const handleContextMenuClose = useCallback(() => {\n setIsContextMenuOpen(false);\n }, []);\n\n const handleContextMenuHide = useCallback(() => {\n setContextMenuPosition(undefined);\n document.body.classList.remove('no-selection');\n\n setTimeout(() => {\n contextMenuCounter--;\n if (contextMenuCounter === 0) {\n document.body.classList.remove('has-context-menu');\n }\n }, SELECTION_ANIMATION_DURATION_MS);\n }, []);\n\n // Support context menu on touch-devices\n useEffect(() => {\n if (isMenuDisabled || !IS_TOUCH_ENV || shouldDisableOnLongTap) {\n return undefined;\n }\n\n const element = elementRef.current;\n if (!element) {\n return undefined;\n }\n\n let timer: number | undefined;\n\n const clearLongPressTimer = () => {\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n\n const emulateContextMenuEvent = (originalEvent: TouchEvent) => {\n clearLongPressTimer();\n\n const { clientX, clientY, target } = originalEvent.touches[0];\n\n if (contextMenuPosition || (shouldDisableOnLink && (target as HTMLElement).matches('a.text-entity-link[href]'))) {\n return;\n }\n\n // temporarily intercept and clear the next click\n element.addEventListener('touchend', function cancelClickOnce(e) {\n element.removeEventListener('touchend', cancelClickOnce, true);\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n }, true);\n\n document.body.classList.add('no-selection');\n setIsContextMenuOpen(true);\n setContextMenuPosition({ x: clientX, y: clientY });\n };\n\n const startLongPressTimer = (e: TouchEvent) => {\n if (isMenuDisabled || checkIsDisabledForMobile()) {\n return;\n }\n clearLongPressTimer();\n\n timer = window.setTimeout(() => emulateContextMenuEvent(e), LONG_TAP_DURATION_MS);\n };\n\n // @perf Consider event delegation\n element.addEventListener('touchstart', startLongPressTimer, { passive: true });\n element.addEventListener('touchcancel', clearLongPressTimer, true);\n element.addEventListener('touchend', clearLongPressTimer, true);\n element.addEventListener('touchmove', clearLongPressTimer, { passive: true });\n\n return () => {\n clearLongPressTimer();\n element.removeEventListener('touchstart', startLongPressTimer);\n element.removeEventListener('touchcancel', clearLongPressTimer, true);\n element.removeEventListener('touchend', clearLongPressTimer, true);\n element.removeEventListener('touchmove', clearLongPressTimer);\n };\n }, [contextMenuPosition, isMenuDisabled, shouldDisableOnLongTap, elementRef, shouldDisableOnLink]);\n\n return {\n isContextMenuOpen,\n contextMenuPosition,\n handleBeforeContextMenu,\n handleContextMenu,\n handleContextMenuClose,\n handleContextMenuHide,\n };\n};\n","import { MouseEvent } from 'react';\nimport React from '../../../lib/teact/teact';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiMessageEntity, ApiMessageEntityTypes, ApiMessage } from '../../../api/types';\n\nimport { getMessageText } from '../../../modules/helpers';\nimport renderText from './renderText';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\n\nexport type TextPart = string | Element;\n\nexport function renderMessageText(message: ApiMessage, highlight?: string, shouldRenderHqEmoji?: boolean) {\n const formattedText = message.content.text;\n\n if (!formattedText || !formattedText.text) {\n const rawText = getMessageText(message);\n return rawText ? [rawText] : undefined;\n }\n const { text, entities } = formattedText;\n\n return renderTextWithEntities(text, entities, highlight, shouldRenderHqEmoji);\n}\n\ninterface IOrganizedEntity {\n entity: ApiMessageEntity;\n organizedIndexes: Set;\n nestedEntities: IOrganizedEntity[];\n}\n\nfunction organizeEntity(\n entity: ApiMessageEntity,\n index: number,\n entities: ApiMessageEntity[],\n organizedEntityIndexes: Set,\n): IOrganizedEntity | undefined {\n const { offset, length } = entity;\n const organizedIndexes = new Set([index]);\n\n if (organizedEntityIndexes.has(index)) {\n return undefined;\n }\n\n // Determine any nested entities inside current entity\n const nestedEntities: IOrganizedEntity[] = [];\n const parsedNestedEntities = entities\n .filter((e, i) => i > index && e.offset >= offset && e.offset < offset + length)\n .map((e) => organizeEntity(e, entities.indexOf(e), entities, organizedEntityIndexes))\n .filter(Boolean as any);\n\n parsedNestedEntities.forEach((parsedEntity) => {\n let isChanged = false;\n\n parsedEntity.organizedIndexes.forEach((organizedIndex) => {\n if (!isChanged && !organizedIndexes.has(organizedIndex)) {\n isChanged = true;\n }\n\n organizedIndexes.add(organizedIndex);\n });\n\n if (isChanged) {\n nestedEntities.push(parsedEntity);\n }\n });\n\n return {\n entity,\n organizedIndexes,\n nestedEntities,\n };\n}\n\n// Organize entities in a tree-like structure to better represent how the text will be displayed\nfunction organizeEntities(entities: ApiMessageEntity[]) {\n const organizedEntityIndexes: Set = new Set();\n const organizedEntities: IOrganizedEntity[] = [];\n\n entities.forEach((entity, index) => {\n if (organizedEntityIndexes.has(index)) {\n return;\n }\n\n const organizedEntity = organizeEntity(entity, index, entities, organizedEntityIndexes);\n if (organizedEntity) {\n organizedEntity.organizedIndexes.forEach((organizedIndex) => {\n organizedEntityIndexes.add(organizedIndex);\n });\n\n organizedEntities.push(organizedEntity);\n }\n });\n\n return organizedEntities;\n}\n\nexport function renderTextWithEntities(\n text: string,\n entities?: ApiMessageEntity[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n) {\n if (!entities || !entities.length) {\n return renderMessagePart(text, highlight, shouldRenderHqEmoji, shouldRenderAsHtml);\n }\n\n const result: TextPart[] = [];\n let deleteLineBreakAfterPre = false;\n\n const organizedEntities = organizeEntities(entities);\n\n // Recursive function to render regular and nested entities\n function renderEntity(\n textPartStart: number,\n textPartEnd: number,\n organizedEntity: IOrganizedEntity,\n isLastEntity: boolean,\n ) {\n const renderResult: TextPart[] = [];\n const { entity, nestedEntities } = organizedEntity;\n const { offset, length, type } = entity;\n\n // Render text before the entity\n let textBefore = text.substring(textPartStart, offset);\n const textBeforeLength = textBefore.length;\n if (textBefore) {\n if (deleteLineBreakAfterPre && textBefore.length > 0 && textBefore[0] === '\\n') {\n textBefore = textBefore.substr(1);\n deleteLineBreakAfterPre = false;\n }\n if (textBefore) {\n renderResult.push(...renderMessagePart(\n textBefore, highlight, shouldRenderHqEmoji, shouldRenderAsHtml,\n ) as TextPart[]);\n }\n }\n\n const entityStartIndex = textPartStart + textBeforeLength;\n const entityEndIndex = entityStartIndex + length;\n\n let entityContent: TextPart = text.substring(offset, offset + length);\n const nestedEntityContent: TextPart[] = [];\n\n if (deleteLineBreakAfterPre && entityContent.length > 0 && entityContent[0] === '\\n') {\n entityContent = entityContent.substr(1);\n deleteLineBreakAfterPre = false;\n }\n\n if (type === ApiMessageEntityTypes.Pre) {\n deleteLineBreakAfterPre = true;\n }\n\n // Render nested entities, if any\n if (nestedEntities.length) {\n let nestedIndex = entityStartIndex;\n\n nestedEntities.forEach((nestedEntity, nestedEntityIndex) => {\n const {\n renderResult: nestedResult,\n entityEndIndex: nestedEntityEndIndex,\n } = renderEntity(\n nestedIndex,\n entityEndIndex,\n nestedEntity,\n nestedEntityIndex === nestedEntities.length - 1,\n );\n\n nestedEntityContent.push(...nestedResult);\n nestedIndex = nestedEntityEndIndex;\n });\n }\n\n // Render the entity itself\n const newEntity = shouldRenderAsHtml\n ? processEntityAsHtml(entity, entityContent, nestedEntityContent)\n : processEntity(entity, entityContent, nestedEntityContent);\n\n if (Array.isArray(newEntity)) {\n renderResult.push(...newEntity);\n } else {\n renderResult.push(newEntity);\n }\n\n // Render text after the entity, if it is the last entity in the text,\n // or the last nested entity inside of another entity\n if (isLastEntity && entityEndIndex < textPartEnd) {\n let textAfter = text.substring(entityEndIndex, textPartEnd);\n if (deleteLineBreakAfterPre && textAfter.length > 0 && textAfter[0] === '\\n') {\n textAfter = textAfter.substring(1);\n }\n if (textAfter) {\n renderResult.push(...renderMessagePart(\n textAfter, highlight, shouldRenderHqEmoji, shouldRenderAsHtml,\n ) as TextPart[]);\n }\n }\n\n return {\n renderResult,\n entityEndIndex,\n };\n }\n\n // Process highest-level entities\n let index = 0;\n\n organizedEntities.forEach((entity, arrayIndex) => {\n const { renderResult, entityEndIndex } = renderEntity(\n index,\n text.length,\n entity,\n arrayIndex === organizedEntities.length - 1,\n );\n\n result.push(...renderResult);\n index = entityEndIndex;\n });\n\n return result;\n}\n\nfunction processEntity(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n) {\n const entityText = typeof entityContent === 'string' && entityContent;\n const renderedContent = nestedEntityContent.length ? nestedEntityContent : entityContent;\n\n if (!entityText) {\n return renderMessagePart(renderedContent);\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.Blockquote:\n return
{renderMessagePart(renderedContent)}
;\n case ApiMessageEntityTypes.BotCommand:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Hashtag:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Cashtag:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Code:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.Email:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Italic:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.MentionName:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Mention:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Phone:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Pre:\n return
{renderMessagePart(renderedContent)}
;\n case ApiMessageEntityTypes.Strike:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.TextUrl:\n case ApiMessageEntityTypes.Url:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Underline:\n return {renderMessagePart(renderedContent)};\n default:\n return renderMessagePart(renderedContent);\n }\n}\n\nfunction renderMessagePart(\n content: TextPart | TextPart[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n) {\n if (Array.isArray(content)) {\n const result: TextPart[] = [];\n\n content.forEach((c) => {\n result.push(...renderMessagePart(c, highlight, shouldRenderHqEmoji, shouldRenderAsHtml));\n });\n\n return result;\n }\n\n if (shouldRenderAsHtml) {\n return renderText(content, ['escape_html', 'emoji_html', 'br_html']);\n }\n\n const emojiFilter = shouldRenderHqEmoji ? 'hq_emoji' : 'emoji';\n\n if (highlight) {\n return renderText(content, [emojiFilter, 'br', 'highlight'], { highlight });\n } else {\n return renderText(content, [emojiFilter, 'br']);\n }\n}\n\nfunction getLinkUrl(entityContent: string, entity: ApiMessageEntity) {\n const { type, url } = entity;\n return type === ApiMessageEntityTypes.TextUrl && url ? url : entityContent;\n}\n\nfunction handleBotCommandClick(e: MouseEvent) {\n getDispatch().sendBotCommand({ command: e.currentTarget.innerText });\n}\n\nfunction handleHashtagClick(e: MouseEvent) {\n getDispatch().setLocalTextSearchQuery({ query: e.currentTarget.innerText });\n getDispatch().searchTextMessagesLocal();\n}\n\nfunction processEntityAsHtml(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n) {\n const rawEntityText = typeof entityContent === 'string' && entityContent;\n\n const renderedContent = nestedEntityContent.length\n ? nestedEntityContent.join('')\n : renderText(entityContent, ['emoji_html', 'br_html']).join('');\n\n if (!rawEntityText) {\n return renderedContent;\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Italic:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Underline:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Code:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Pre:\n return `\\`\\`\\`
${renderedContent}
\\`\\`\\``;\n case ApiMessageEntityTypes.Strike:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.MentionName:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Url:\n case ApiMessageEntityTypes.TextUrl:\n return `${renderedContent}`;\n default:\n return renderedContent;\n }\n}\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\nimport { fastRaf } from '../util/schedulers';\n\n// Fix for memory leak when unmounting video element\nexport default function useVideoCleanup(videoRef: RefObject, dependencies: any[]) {\n useEffect(() => {\n const videoEl = videoRef.current;\n\n return () => {\n if (videoEl) {\n fastRaf(() => {\n videoEl.pause();\n videoEl.src = '';\n videoEl.load();\n });\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n}\n","import { useState, useCallback, useRef } from '../lib/teact/teact';\n\nexport type ReducerAction = { type: Actions; payload?: any };\nexport type StateReducer = (state: State, action: ReducerAction) => State;\nexport type Dispatch = (action: ReducerAction) => void;\n\nexport default function useReducer(\n reducer: StateReducer,\n initialState: State,\n) {\n const reducerRef = useRef(reducer);\n const [state, setState] = useState(initialState);\n\n const dispatch = useCallback((action: ReducerAction) => {\n setState((currentState) => reducerRef.current(currentState, action));\n }, []);\n\n return [\n state,\n dispatch,\n ] as [State, Dispatch];\n}\n","import { RefObject } from 'react';\nimport React, {\n FC, useRef, useEffect, memo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from './Loading';\nimport Button from './Button';\n\nimport './SearchInput.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n children?: any;\n parentContainerClassName?: string;\n className?: string;\n inputId?: string;\n value?: string;\n focused?: boolean;\n isLoading?: boolean;\n placeholder?: string;\n disabled?: boolean;\n autoComplete?: string;\n canClose?: boolean;\n onChange: (value: string) => void;\n onReset?: NoneToVoidFunction;\n onFocus?: NoneToVoidFunction;\n onBlur?: NoneToVoidFunction;\n};\n\nconst SearchInput: FC = ({\n ref,\n children,\n parentContainerClassName,\n value,\n inputId,\n className,\n focused,\n isLoading,\n placeholder,\n disabled,\n autoComplete,\n canClose,\n onChange,\n onReset,\n onFocus,\n onBlur,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let inputRef = useRef(null);\n if (ref) {\n inputRef = ref;\n }\n\n const [isInputFocused, markInputFocused, unmarkInputFocused] = useFlag(focused);\n\n useEffect(() => {\n if (!inputRef.current) {\n return;\n }\n\n if (focused) {\n inputRef.current.focus();\n } else {\n inputRef.current.blur();\n }\n }, [focused, placeholder]); // Trick for setting focus when selecting a contact to search for\n\n const lang = useLang();\n\n function handleChange(event: React.ChangeEvent) {\n const { currentTarget } = event;\n onChange(currentTarget.value);\n }\n\n function handleFocus() {\n markInputFocused();\n if (onFocus) {\n onFocus();\n }\n }\n\n function handleBlur() {\n unmarkInputFocused();\n if (onBlur) {\n onBlur();\n }\n }\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter') {\n const element = document.querySelector(`.${parentContainerClassName} .ListItem-button`) as HTMLElement;\n if (element) {\n element.focus();\n }\n }\n }, [parentContainerClassName]);\n\n return (\n \n {children}\n \n \n {isLoading && (\n \n )}\n {!isLoading && (value || canClose) && onReset && (\n \n \n \n )}\n
\n );\n};\n\nexport default memo(SearchInput);\n","import { IS_IOS } from './environment';\n\nexport default (container: HTMLDivElement, scrollTop?: number) => {\n if (IS_IOS) {\n container.style.overflow = 'hidden';\n }\n\n if (scrollTop !== undefined) {\n container.scrollTop = scrollTop;\n }\n\n if (IS_IOS) {\n container.style.overflow = '';\n }\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiTypingStatus } from '../../api/types';\n\nimport { selectUser } from '../../modules/selectors';\nimport { getUserFirstOrLastName } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport './TypingStatus.scss';\n\ntype OwnProps = {\n typingStatus: ApiTypingStatus;\n};\n\ntype StateProps = {\n typingUser?: ApiUser;\n};\n\nconst TypingStatus: FC = ({ typingStatus, typingUser }) => {\n const lang = useLang();\n const typingUserName = typingUser && !typingUser.isSelf && getUserFirstOrLastName(typingUser);\n\n return (\n

\n {typingUserName && (\n {renderText(typingUserName)}\n )}\n {/* fix for translation \"username _is_ typing\" */}\n {lang(typingStatus.action).replace('{user}', '').trim()}\n \n

\n );\n};\n\nexport default memo(withGlobal(\n (global, { typingStatus }): StateProps => {\n if (!typingStatus.userId) {\n return {};\n }\n\n const typingUser = selectUser(global, typingStatus.userId);\n\n return { typingUser };\n },\n)(TypingStatus));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { selectIsChatWithSelf, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n isUserBot,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n isChatChannel,\n getChatTitle,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport renderText from './helpers/renderText';\n\nimport Avatar from './Avatar';\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './DeleteChatModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n chat: ApiChat;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n};\n\ntype StateProps = {\n isChannel: boolean;\n isChatWithSelf?: boolean;\n isBot?: boolean;\n isPrivateChat: boolean;\n isBasicGroup: boolean;\n isSuperGroup: boolean;\n currentUserId: number | undefined;\n canDeleteForAll?: boolean;\n contactName?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteChatModal: FC = ({\n isOpen,\n chat,\n isChannel,\n isPrivateChat,\n isChatWithSelf,\n isBot,\n isBasicGroup,\n isSuperGroup,\n currentUserId,\n canDeleteForAll,\n contactName,\n onClose,\n onCloseAnimationEnd,\n leaveChannel,\n deleteHistory,\n deleteChannel,\n deleteChatUser,\n blockContact,\n}) => {\n const lang = useLang();\n const chatTitle = getChatTitle(lang, chat);\n\n const handleDeleteMessageForAll = useCallback(() => {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: true });\n\n onClose();\n }, [deleteHistory, chat.id, onClose]);\n\n const handleDeleteAndStop = useCallback(() => {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: true });\n blockContact({ contactId: chat.id, accessHash: chat.accessHash });\n\n onClose();\n }, [deleteHistory, chat.id, chat.accessHash, blockContact, onClose]);\n\n const handleDeleteChat = useCallback(() => {\n if (isPrivateChat) {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: false });\n } else if (isBasicGroup) {\n deleteChatUser({ chatId: chat.id, userId: currentUserId });\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: false });\n } else if ((isChannel || isSuperGroup) && !chat.isCreator) {\n leaveChannel({ chatId: chat.id });\n } else if ((isChannel || isSuperGroup) && chat.isCreator) {\n deleteChannel({ chatId: chat.id });\n }\n onClose();\n }, [\n isPrivateChat,\n isBasicGroup,\n isChannel,\n isSuperGroup,\n currentUserId,\n chat.isCreator,\n chat.id,\n onClose,\n deleteHistory,\n deleteChatUser,\n leaveChannel,\n deleteChannel,\n ]);\n\n function renderHeader() {\n return (\n
\n \n

{lang(renderTitle())}

\n
\n );\n }\n\n function renderTitle() {\n if (isChannel && !chat.isCreator) {\n return 'LeaveChannel';\n }\n\n if (isChannel && chat.isCreator) {\n return 'ChannelDelete';\n }\n\n if (isBasicGroup || isSuperGroup) {\n return 'Group.LeaveGroup';\n }\n\n return 'DeleteChatUser';\n }\n\n function renderMessage() {\n if (isChannel && chat.isCreator) {\n return

{renderText(lang('ChatList.DeleteAndLeaveGroupConfirmation', chatTitle), ['simple_markdown'])}

;\n }\n\n if ((isChannel && !chat.isCreator) || isBasicGroup || isSuperGroup) {\n return

{renderText(lang('ChannelLeaveAlertWithName', chatTitle), ['simple_markdown'])}

;\n }\n\n return

{renderText(lang('ChatList.DeleteChatConfirmation', contactName), ['simple_markdown'])}

;\n }\n\n function renderActionText() {\n if (isChannel && !chat.isCreator) {\n return 'LeaveChannel';\n }\n if (isChannel && chat.isCreator) {\n return 'Chat.Input.Delete';\n }\n\n if (isBasicGroup || isSuperGroup) {\n return 'Group.LeaveGroup';\n }\n\n return canDeleteForAll ? 'ChatList.DeleteForCurrentUser' : 'Delete';\n }\n\n return (\n \n {renderMessage()}\n {isBot && (\n \n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chat }): StateProps => {\n const isPrivateChat = isChatPrivate(chat.id);\n const isChatWithSelf = selectIsChatWithSelf(global, chat.id);\n const user = isPrivateChat && selectUser(global, getPrivateChatUserId(chat)!);\n const isBot = user && isUserBot(user) && !chat.isSupport;\n const canDeleteForAll = (isPrivateChat && !isChatWithSelf && !isBot);\n const contactName = isPrivateChat\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isBot,\n isChannel: isChatChannel(chat),\n isBasicGroup: isChatBasicGroup(chat),\n isSuperGroup: isChatSuperGroup(chat),\n currentUserId: global.currentUserId,\n canDeleteForAll,\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions,\n ['leaveChannel', 'deleteHistory', 'deleteChannel', 'deleteChatUser', 'blockContact']),\n)(DeleteChatModal));\n","import React, { FC, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport usePrevious from '../../hooks/usePrevious';\nimport buildClassName from '../../util/buildClassName';\n\ntype ChildrenFn = () => any;\n\ntype OwnProps = {\n isOpen: boolean;\n isCustom?: boolean;\n id?: string;\n className?: string;\n onClick?: (e: React.MouseEvent) => void;\n children: ChildrenFn;\n};\n\nconst ShowTransition: FC = ({\n isOpen, isCustom, id, className, onClick, children,\n}) => {\n const { shouldRender, transitionClassNames } = useShowTransition(\n isOpen, undefined, undefined, isCustom ? false : undefined,\n );\n const prevIsOpen = usePrevious(isOpen);\n const prevChildren = usePrevious(children);\n const fromChildrenRef = useRef();\n\n if (prevIsOpen && !isOpen) {\n fromChildrenRef.current = prevChildren;\n }\n\n return (\n shouldRender && (\n
\n {isOpen ? children() : fromChildrenRef.current!()}\n
\n )\n );\n};\n\nexport default ShowTransition;\n","/*\n * Thanks to Ace Monkey for this mind-blowing patch.\n */\n\nexport function patchSafariProgressiveAudio(audioEl: HTMLAudioElement) {\n if (audioEl.dataset.patchedForSafari) {\n return;\n }\n\n audioEl.addEventListener('play', () => {\n const t = audioEl.currentTime;\n\n function onProgress() {\n if (!audioEl.buffered.length) {\n return;\n }\n\n audioEl.dataset.patchForSafariInProgress = 'true';\n audioEl.currentTime = audioEl.duration - 1;\n audioEl.addEventListener('progress', () => {\n delete audioEl.dataset.patchForSafariInProgress;\n audioEl.currentTime = t;\n if (audioEl.paused) {\n audioEl.play();\n }\n }, { once: true });\n\n audioEl.removeEventListener('progress', onProgress);\n }\n\n audioEl.addEventListener('progress', onProgress);\n }, { once: true });\n\n audioEl.dataset.patchedForSafari = 'true';\n}\n\nexport function isSafariPatchInProgress(audioEl: HTMLAudioElement) {\n return Boolean(audioEl.dataset.patchForSafariInProgress);\n}\n","import { useLayoutEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T, debugKey?: string) => {\n const prevDeps = usePrevious(dependencies);\n return useLayoutEffect(() => {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n return cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies, debugKey);\n};\n","import React, {\n FC, useCallback, useEffect, useState, memo, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { getDocumentExtension, getDocumentHasPreview } from './helpers/documentInfo';\nimport {\n getMediaTransferState,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n isMessageDocumentVideo,\n} from '../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useMedia from '../../hooks/useMedia';\nimport download from '../../util/download';\n\nimport File from './File';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n smaller?: boolean;\n isSelected?: boolean;\n isSelectable?: boolean;\n uploadProgress?: number;\n withDate?: boolean;\n datetime?: number;\n className?: string;\n sender?: string;\n onCancelUpload?: () => void;\n onMediaClick?: () => void;\n onDateClick?: (messageId: number, chatId: number) => void;\n};\n\nconst Document: FC = ({\n message,\n observeIntersection,\n smaller,\n uploadProgress,\n withDate,\n datetime,\n className,\n sender,\n isSelected,\n isSelectable,\n onCancelUpload,\n onMediaClick,\n onDateClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const document = message.content.document!;\n const extension = getDocumentExtension(document) || '';\n const { fileName, size, timestamp } = document;\n const withMediaViewer = onMediaClick && Boolean(document.mediaType);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(false);\n const {\n mediaData, downloadProgress,\n } = useMediaWithDownloadProgress(getMessageMediaHash(message, 'download'), !isDownloadAllowed);\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, isDownloadAllowed);\n\n const hasPreview = getDocumentHasPreview(document);\n const thumbDataUri = hasPreview ? getMessageMediaThumbDataUri(message) : undefined;\n const localBlobUrl = hasPreview ? document.previewBlobUrl : undefined;\n const previewData = useMedia(getMessageMediaHash(message, 'pictogram'), !isIntersecting);\n\n const handleClick = useCallback(() => {\n if (withMediaViewer) {\n onMediaClick!();\n } else if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload();\n }\n } else {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n }\n }, [withMediaViewer, isUploading, onCancelUpload, onMediaClick]);\n\n const handleDateClick = useCallback(() => {\n onDateClick!(message.id, message.chatId);\n }, [onDateClick, message.id, message.chatId]);\n\n useEffect(() => {\n if (isDownloadAllowed && mediaData) {\n download(mediaData, fileName);\n setIsDownloadAllowed(false);\n }\n }, [fileName, mediaData, isDownloadAllowed]);\n\n return (\n \n );\n};\n\nexport default memo(Document);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './StickerSetModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst StickerSetModalAsync: FC = (props) => {\n const { isOpen } = props;\n const StickerSetModal = useModuleLoader(Bundles.Extra, 'StickerSetModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerSetModal ? : undefined;\n};\n\nexport default memo(StickerSetModalAsync);\n","import { useEffect, useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport useForceUpdate from './useForceUpdate';\nimport { IS_CANVAS_FILTER_SUPPORTED } from '../util/environment';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nexport default function useCanvasBlur(dataUri?: string, isDisabled = false, withRaf?: boolean) {\n // eslint-disable-next-line no-null/no-null\n const canvasRef = useRef(null);\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n const canvas = canvasRef.current;\n\n if (!dataUri || !canvas || isDisabled) {\n return;\n }\n\n const img = new Image();\n\n const processBlur = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d', { alpha: false })!;\n\n if (IS_CANVAS_FILTER_SUPPORTED) {\n ctx.filter = `blur(${RADIUS}px)`;\n }\n\n ctx.drawImage(img, -RADIUS * 2, -RADIUS * 2, canvas.width + RADIUS * 4, canvas.height + RADIUS * 4);\n\n if (!IS_CANVAS_FILTER_SUPPORTED) {\n fastBlur(ctx, 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n }\n };\n\n img.onload = () => {\n if (withRaf) {\n requestAnimationFrame(processBlur);\n } else {\n processBlur();\n }\n };\n\n img.src = dataUri;\n }, [canvasRef, dataUri, forceUpdate, isDisabled, withRaf]);\n\n return canvasRef;\n}\n","/* eslint-disable no-nested-ternary */\n/* eslint-disable no-bitwise */\n/* eslint-disable no-multi-assign */\n/* eslint-disable no-cond-assign */\n/* eslint-disable no-param-reassign */\n/* eslint-disable prefer-const */\n/* eslint-disable eqeqeq */\n\n/*\nSuperfast Blur - a fast Box Blur For Canvas\n\nVersion: 0.5\nAuthor: Mario Klingemann\nContact: mario@quasimondo.com\nWebsite: http://www.quasimondo.com/BoxBlurForCanvas\nTwitter: @quasimondo\n\nIn case you find this class useful - especially in commercial projects -\nI am not totally unhappy for a small donation to my PayPal account\nmario@quasimondo.de\n\nOr support me on flattr:\nhttps://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript\n\nCopyright (c) 2011 Mario Klingemann\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// eslint-disable-next-line max-len\nconst mul_table = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1];\n// eslint-disable-next-line max-len\nconst shg_table = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18];\n\nexport default function boxBlurCanvasRGB(context, top_x, top_y, width, height, radius, iterations) {\n if (Number.isNaN(radius) || radius < 1) return;\n\n radius |= 0;\n\n if (Number.isNaN(iterations)) iterations = 1;\n iterations |= 0;\n if (iterations > 3) iterations = 3;\n if (iterations < 1) iterations = 1;\n\n const imageData = context.getImageData(top_x, top_y, width, height);\n\n const pixels = imageData.data;\n\n let rsum;\n let gsum;\n let bsum;\n let x;\n let y;\n let i;\n let p;\n let p1;\n let p2;\n let yp;\n let yi;\n let yw;\n let wm = width - 1;\n let hm = height - 1;\n let rad1 = radius + 1;\n\n let r = [];\n let g = [];\n let b = [];\n\n let mul_sum = mul_table[radius];\n let shg_sum = shg_table[radius];\n\n let vmin = [];\n let vmax = [];\n\n while (iterations-- > 0) {\n yw = yi = 0;\n\n for (y = 0; y < height; y++) {\n rsum = pixels[yw] * rad1;\n gsum = pixels[yw + 1] * rad1;\n bsum = pixels[yw + 2] * rad1;\n\n for (i = 1; i <= radius; i++) {\n p = yw + (((i > wm ? wm : i)) << 2);\n rsum += pixels[p++];\n gsum += pixels[p++];\n bsum += pixels[p++];\n }\n\n for (x = 0; x < width; x++) {\n r[yi] = rsum;\n g[yi] = gsum;\n b[yi] = bsum;\n\n if (y == 0) {\n vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\n vmax[x] = ((p = x - radius) > 0 ? p << 2 : 0);\n }\n\n p1 = yw + vmin[x];\n p2 = yw + vmax[x];\n\n rsum += pixels[p1++] - pixels[p2++];\n gsum += pixels[p1++] - pixels[p2++];\n bsum += pixels[p1++] - pixels[p2++];\n\n yi++;\n }\n yw += (width << 2);\n }\n\n for (x = 0; x < width; x++) {\n yp = x;\n rsum = r[yp] * rad1;\n gsum = g[yp] * rad1;\n bsum = b[yp] * rad1;\n\n for (i = 1; i <= radius; i++) {\n yp += (i > hm ? 0 : width);\n rsum += r[yp];\n gsum += g[yp];\n bsum += b[yp];\n }\n\n yi = x << 2;\n for (y = 0; y < height; y++) {\n pixels[yi] = (rsum * mul_sum) >>> shg_sum;\n pixels[yi + 1] = (gsum * mul_sum) >>> shg_sum;\n pixels[yi + 2] = (bsum * mul_sum) >>> shg_sum;\n\n if (x == 0) {\n vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\n vmax[y] = ((p = y - radius) > 0 ? p * width : 0);\n }\n\n p1 = x + vmin[y];\n p2 = x + vmax[y];\n\n rsum += r[p1] - r[p2];\n gsum += g[p1] - g[p2];\n bsum += b[p1] - b[p2];\n\n yi += width << 2;\n }\n }\n }\n\n context.putImageData(imageData, top_x, top_y);\n}\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { IAnchorPosition } from '../../../types';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport buildClassName from '../../../util/buildClassName';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useVirtualBackdrop from '../../../hooks/useVirtualBackdrop';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\n\nimport './TextFormatter.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n anchorPosition?: IAnchorPosition;\n selectedRange?: Range;\n onClose: () => void;\n};\n\ninterface ISelectedTextFormats {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n monospace?: boolean;\n}\n\nconst TEXT_FORMAT_BY_TAG_NAME: Record = {\n B: 'bold',\n STRONG: 'bold',\n I: 'italic',\n EM: 'italic',\n U: 'underline',\n DEL: 'strikethrough',\n CODE: 'monospace',\n};\n\nconst TextFormatter: FC = ({\n isOpen,\n anchorPosition,\n selectedRange,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const linkUrlInputRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen);\n const [isLinkControlOpen, openLinkControl, closeLinkControl] = useFlag();\n const [linkUrl, setLinkUrl] = useState('');\n const [isEditingLink, setIsEditingLink] = useState(false);\n const [inputClassName, setInputClassName] = useState();\n const [selectedTextFormats, setSelectedTextFormats] = useState({});\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClose) : undefined), [isOpen, onClose]);\n useVirtualBackdrop(\n isOpen,\n containerRef,\n onClose,\n );\n\n useEffect(() => {\n if (isLinkControlOpen) {\n linkUrlInputRef.current!.focus();\n } else {\n setLinkUrl('');\n setIsEditingLink(false);\n }\n }, [isLinkControlOpen]);\n\n useEffect(() => {\n if (!shouldRender) {\n closeLinkControl();\n setSelectedTextFormats({});\n setInputClassName(undefined);\n }\n }, [closeLinkControl, shouldRender]);\n\n useEffect(() => {\n if (!isOpen || !selectedRange) {\n return;\n }\n\n const selectedFormats: ISelectedTextFormats = {};\n let { parentElement } = selectedRange.commonAncestorContainer;\n while (parentElement && parentElement.id !== EDITABLE_INPUT_ID) {\n const textFormat = TEXT_FORMAT_BY_TAG_NAME[parentElement.tagName];\n if (textFormat) {\n selectedFormats[textFormat] = true;\n }\n\n parentElement = parentElement.parentElement;\n }\n\n setSelectedTextFormats(selectedFormats);\n }, [isOpen, selectedRange, openLinkControl]);\n\n function restoreSelection() {\n if (!selectedRange) {\n return;\n }\n\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(selectedRange);\n }\n }\n\n const getSelectedText = useCallback(() => {\n if (!selectedRange) {\n return undefined;\n }\n\n return selectedRange.toString();\n }, [selectedRange]);\n\n const getSelectedElement = useCallback(() => {\n if (!selectedRange) {\n return undefined;\n }\n\n return selectedRange.commonAncestorContainer.parentElement;\n }, [selectedRange]);\n\n function updateInputStyles() {\n const input = linkUrlInputRef.current;\n if (!input) {\n return;\n }\n\n const { offsetWidth, scrollWidth, scrollLeft } = input;\n if (scrollWidth <= offsetWidth) {\n setInputClassName(undefined);\n return;\n }\n\n let className = '';\n if (scrollLeft < scrollWidth - offsetWidth) {\n className = 'mask-right';\n }\n if (scrollLeft > 0) {\n className += ' mask-left';\n }\n\n setInputClassName(className);\n }\n\n function handleLinkUrlChange(e: React.ChangeEvent) {\n setLinkUrl(e.target.value);\n updateInputStyles();\n }\n\n function getFormatButtonClassName(key: keyof ISelectedTextFormats) {\n if (selectedTextFormats[key]) {\n return 'active';\n }\n\n if (key === 'monospace' || key === 'strikethrough') {\n if (Object.keys(selectedTextFormats).some(\n (fKey) => fKey !== key && !!selectedTextFormats[fKey as keyof ISelectedTextFormats],\n )) {\n return 'disabled';\n }\n } else if (selectedTextFormats.monospace || selectedTextFormats.strikethrough) {\n return 'disabled';\n }\n\n return undefined;\n }\n\n const handleBoldText = useCallback(() => {\n setSelectedTextFormats((selectedFormats) => {\n // Somehow re-applying 'bold' command to already bold text doesn't work\n document.execCommand(selectedFormats.bold ? 'removeFormat' : 'bold');\n Object.keys(selectedFormats).forEach((key) => {\n if ((key === 'italic' || key === 'underline') && !!selectedFormats[key]) {\n document.execCommand(key);\n }\n });\n\n return {\n ...selectedFormats,\n bold: !selectedFormats.bold,\n };\n });\n }, []);\n\n const handleItalicText = useCallback(() => {\n document.execCommand('italic');\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n italic: !selectedFormats.italic,\n }));\n }, []);\n\n const handleUnderlineText = useCallback(() => {\n document.execCommand('underline');\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n underline: !selectedFormats.underline,\n }));\n }, []);\n\n const handleStrikethroughText = useCallback(() => {\n if (selectedTextFormats.strikethrough) {\n const element = getSelectedElement();\n if (\n !selectedRange\n || !element\n || element.tagName !== 'DEL'\n || !element.textContent\n ) {\n return;\n }\n\n element.replaceWith(element.textContent);\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n strikethrough: false,\n }));\n\n return;\n }\n\n const text = getSelectedText();\n document.execCommand('insertHTML', false, `${text}`);\n onClose();\n }, [\n getSelectedElement, getSelectedText, onClose,\n selectedRange, selectedTextFormats.strikethrough,\n ]);\n\n const handleMonospaceText = useCallback(() => {\n if (selectedTextFormats.monospace) {\n const element = getSelectedElement();\n if (\n !selectedRange\n || !element\n || element.tagName !== 'CODE'\n || !element.textContent\n ) {\n return;\n }\n\n element.replaceWith(element.textContent);\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n monospace: false,\n }));\n return;\n }\n\n const text = getSelectedText();\n document.execCommand('insertHTML', false, `${text}`);\n onClose();\n }, [\n getSelectedElement, getSelectedText, onClose,\n selectedRange, selectedTextFormats.monospace,\n ]);\n\n function handleLinkUrlConfirm() {\n const formattedLinkUrl = linkUrl.includes('://') ? linkUrl : `http://${linkUrl}`;\n\n if (isEditingLink) {\n const element = getSelectedElement();\n if (!element || element.tagName !== 'A') {\n return;\n }\n\n (element as HTMLAnchorElement).href = formattedLinkUrl;\n\n onClose();\n return;\n }\n\n const text = getSelectedText();\n restoreSelection();\n document.execCommand(\n 'insertHTML',\n false,\n `${text}`,\n );\n onClose();\n }\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n const HANDLERS_BY_KEY_CODE: Record = {\n KeyK: openLinkControl,\n KeyB: handleBoldText,\n KeyU: handleUnderlineText,\n KeyI: handleItalicText,\n KeyM: handleMonospaceText,\n KeyS: handleStrikethroughText,\n };\n\n const handler = HANDLERS_BY_KEY_CODE[e.code];\n\n if (\n e.altKey\n || !(e.ctrlKey || e.metaKey)\n || !handler\n ) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n handler();\n }, [\n handleBoldText, handleItalicText, handleUnderlineText,\n handleMonospaceText, handleStrikethroughText,\n openLinkControl,\n ]);\n\n useEffect(() => {\n if (isOpen) {\n document.addEventListener('keydown', handleKeyDown);\n }\n\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, handleKeyDown]);\n\n const lang = useLang();\n\n function handleContainerKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter' && isLinkControlOpen) {\n handleLinkUrlConfirm();\n e.preventDefault();\n }\n }\n\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'TextFormatter',\n transitionClassNames,\n isLinkControlOpen && 'link-control-shown',\n );\n\n const linkUrlConfirmClassName = buildClassName(\n 'TextFormatter-link-url-confirm',\n !!linkUrl.length && 'shown',\n );\n\n const style = anchorPosition\n ? `left: ${anchorPosition.x}px; top: ${anchorPosition.y}px;--text-formatter-left: ${anchorPosition.x}px;`\n : '';\n\n return (\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n\n
\n
\n \n
\n\n \n \n
\n\n
\n
\n \n \n \n
\n
\n
\n
\n );\n};\n\nexport default memo(TextFormatter);\n","import { DEBUG } from '../config';\n\nexport const CLIPBOARD_ITEM_SUPPORTED = navigator.clipboard && window.ClipboardItem;\n\nconst textCopyEl = document.createElement('textarea');\ntextCopyEl.setAttribute('readonly', '');\ntextCopyEl.tabIndex = -1;\ntextCopyEl.className = 'visually-hidden';\n\nexport const copyTextToClipboard = (str: string): void => {\n textCopyEl.value = str;\n document.body.appendChild(textCopyEl);\n const selection = document.getSelection();\n\n if (selection) {\n // Store previous selection\n const rangeToRestore = selection.rangeCount > 0 && selection.getRangeAt(0);\n textCopyEl.select();\n document.execCommand('copy');\n // Restore the original selection\n if (rangeToRestore) {\n selection.removeAllRanges();\n selection.addRange(rangeToRestore);\n }\n }\n\n document.body.removeChild(textCopyEl);\n};\n\nexport const copyImageToClipboard = (imageUrl?: string) => {\n if (!imageUrl) return;\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const imageEl = new Image();\n imageEl.onload = (e: Event) => {\n if (ctx && e.currentTarget) {\n const img = e.currentTarget as HTMLImageElement;\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, img.width, img.height);\n canvas.toBlob(copyBlobToClipboard, 'image/png', 1);\n }\n };\n\n imageEl.src = imageUrl;\n};\n\nasync function copyBlobToClipboard(pngBlob: Blob | null) {\n if (!pngBlob || !CLIPBOARD_ITEM_SUPPORTED) {\n return;\n }\n\n try {\n await navigator.clipboard.write([\n new window.ClipboardItem({\n [pngBlob.type]: pngBlob,\n }),\n ]);\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n }\n}\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { formatMediaDuration } from '../../util/dateFormat';\nimport {\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n} from '../../modules/helpers';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\n\nimport './Media.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n idPrefix?: string;\n onClick?: (messageId: number, chatId: number) => void;\n};\n\nconst Media: FC = ({ message, idPrefix = 'shared-media', onClick }) => {\n const handleClick = useCallback(() => {\n onClick!(message.id, message.chatId);\n }, [message.id, message.chatId, onClick]);\n\n const thumbDataUri = getMessageMediaThumbDataUri(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram'));\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(mediaBlobUrl, 'slow');\n\n const video = getMessageVideo(message);\n\n return (\n
\n {shouldRenderThumb && (\n \"\"\n )}\n {shouldRenderFullMedia && (\n \"\"\n )}\n {video && {video.isGif ? 'GIF' : formatMediaDuration(video.duration)}}\n
\n );\n};\n\nexport default memo(Media);\n","import React, {\n FC, useCallback, useRef, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { isChatPrivate } from '../../modules/helpers';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport Checkbox from '../ui/Checkbox';\nimport InputText from '../ui/InputText';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from './PrivateChatInfo';\nimport GroupChatInfo from './GroupChatInfo';\nimport PickerSelectedItem from './PickerSelectedItem';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from '../ui/Loading';\n\nimport './Picker.scss';\n\ntype OwnProps = {\n itemIds: number[];\n selectedIds: number[];\n filterValue?: string;\n filterPlaceholder?: string;\n notFoundText?: string;\n searchInputId?: string;\n isLoading?: boolean;\n noScrollRestore?: boolean;\n onSelectedIdsChange: (ids: number[]) => void;\n onFilterChange: (value: string) => void;\n onLoadMore?: () => void;\n};\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\n\nconst MAX_FULL_ITEMS = 10;\nconst ALWAYS_FULL_ITEMS_COUNT = 5;\n\nconst Picker: FC = ({\n itemIds,\n selectedIds,\n filterValue,\n filterPlaceholder,\n notFoundText,\n searchInputId,\n isLoading,\n noScrollRestore,\n onSelectedIdsChange,\n onFilterChange,\n onLoadMore,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const shouldMinimize = selectedIds.length > MAX_FULL_ITEMS;\n\n useEffect(() => {\n setTimeout(() => {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n });\n }, FOCUS_DELAY_MS);\n }, []);\n\n const handleItemClick = useCallback((id: number) => {\n const newSelectedIds = [...selectedIds];\n if (newSelectedIds.includes(id)) {\n newSelectedIds.splice(newSelectedIds.indexOf(id), 1);\n } else {\n newSelectedIds.push(id);\n }\n onSelectedIdsChange(newSelectedIds);\n onFilterChange('');\n }, [selectedIds, onSelectedIdsChange, onFilterChange]);\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n onFilterChange(value);\n }, [onFilterChange]);\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, itemIds, Boolean(filterValue));\n\n const lang = useLang();\n\n return (\n
\n
\n {selectedIds.map((id, i) => (\n \n ))}\n \n
\n\n {viewportIds && viewportIds.length ? (\n \n {viewportIds.map((id) => (\n handleItemClick(id)}\n ripple\n >\n \n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : !isLoading && viewportIds && !viewportIds.length ? (\n

{notFoundText || 'Sorry, nothing found.'}

\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(Picker);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport {\n ApiAudio, ApiMessage, ApiVoice,\n} from '../../api/types';\nimport { ISettings } from '../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { formatMediaDateTime, formatMediaDuration, formatPastTimeShort } from '../../util/dateFormat';\nimport {\n getMediaDuration,\n getMediaTransferState,\n getMessageAudioCaption,\n getMessageKey,\n getMessageMediaFormat,\n getMessageMediaHash,\n isMessageLocal,\n isOwnMessage,\n} from '../../modules/helpers';\nimport { renderWaveformToDataUri } from './helpers/waveform';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from './helpers/renderText';\nimport { decodeWaveform, interpolateArray } from '../../util/waveform';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBuffering from '../../hooks/useBuffering';\nimport useAudioPlayer from '../../hooks/useAudioPlayer';\nimport useMediaDownload from '../../hooks/useMediaDownload';\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Link from '../ui/Link';\n\nimport './Audio.scss';\n\ntype OwnProps = {\n theme: ISettings['theme'];\n message: ApiMessage;\n senderTitle?: string;\n uploadProgress?: number;\n target?: 'searchResult' | 'sharedMedia';\n date?: number;\n lastSyncTime?: number;\n className?: string;\n isSelectable?: boolean;\n isSelected?: boolean;\n onPlay: (messageId: number, chatId: number) => void;\n onReadMedia?: () => void;\n onCancelUpload?: () => void;\n onDateClick?: (messageId: number, chatId: number) => void;\n};\n\ninterface ISeekMethods {\n handleStartSeek: (e: React.MouseEvent) => void;\n handleSeek: (e: React.MouseEvent) => void;\n handleStopSeek: () => void;\n}\n\nconst AVG_VOICE_DURATION = 30;\nconst MIN_SPIKES = IS_SINGLE_COLUMN_LAYOUT ? 20 : 25;\nconst MAX_SPIKES = IS_SINGLE_COLUMN_LAYOUT ? 50 : 75;\n// This is needed for browsers requiring user interaction before playing.\nconst PRELOAD = true;\n\nconst Audio: FC = ({\n theme,\n message,\n senderTitle,\n uploadProgress,\n target,\n date,\n lastSyncTime,\n className,\n isSelectable,\n isSelected,\n onPlay,\n onReadMedia,\n onCancelUpload,\n onDateClick,\n}) => {\n const { content: { audio, voice }, isMediaUnread } = message;\n const isVoice = Boolean(voice);\n const isSeeking = useRef(false);\n const lang = useLang();\n\n const [isActivated, setIsActivated] = useState(false);\n const shouldDownload = (isActivated || PRELOAD) && lastSyncTime;\n\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n );\n\n function handleForcePlay() {\n setIsActivated(true);\n onPlay(message.id, message.chatId);\n }\n\n const {\n isBuffered, bufferedProgress, bufferingHandlers, checkBuffering,\n } = useBuffering();\n\n const {\n isPlaying, playProgress, playPause, setCurrentTime, duration,\n } = useAudioPlayer(\n getMessageKey(message),\n getMediaDuration(message)!,\n mediaData,\n bufferingHandlers,\n checkBuffering,\n isActivated,\n handleForcePlay,\n isMessageLocal(message),\n );\n\n useEffect(() => {\n setIsActivated(isPlaying);\n }, [isPlaying]);\n\n const {\n isDownloadStarted,\n downloadProgress: directDownloadProgress,\n handleDownloadClick,\n } = useMediaDownload(getMessageMediaHash(message, 'download'), getMessageAudioCaption(message));\n\n const isLoadingForPlaying = isActivated && !isBuffered;\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(\n message,\n isDownloadStarted ? directDownloadProgress : (uploadProgress || downloadProgress),\n isLoadingForPlaying || isDownloadStarted,\n );\n\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring);\n\n const handleButtonClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload();\n }\n\n return;\n }\n\n if (!isPlaying) {\n onPlay(message.id, message.chatId);\n }\n\n setIsActivated(!isActivated);\n playPause();\n }, [isPlaying, isUploading, message.id, message.chatId, onCancelUpload, onPlay, playPause, isActivated]);\n\n useEffect(() => {\n if (isPlaying && onReadMedia && isMediaUnread) {\n onReadMedia();\n }\n }, [isPlaying, isMediaUnread, onReadMedia]);\n\n const handleSeek = useCallback((e: React.MouseEvent) => {\n if (isSeeking.current) {\n const seekBar = e.currentTarget.closest('.seekline,.waveform');\n if (seekBar) {\n const { width, left } = seekBar.getBoundingClientRect();\n setCurrentTime(duration * ((e.clientX - left) / width));\n }\n }\n }, [duration, setCurrentTime]);\n\n const handleStartSeek = useCallback((e: React.MouseEvent) => {\n isSeeking.current = true;\n handleSeek(e);\n }, [handleSeek]);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n }, []);\n\n const handleDateClick = useCallback(() => {\n onDateClick!(message.id, message.chatId);\n }, [onDateClick, message.id, message.chatId]);\n\n function getFirstLine() {\n if (isVoice) {\n return senderTitle || 'Voice';\n }\n\n const { title, fileName } = audio!;\n\n return title || fileName;\n }\n\n function getSecondLine() {\n if (isVoice) {\n return formatMediaDuration(voice!.duration);\n }\n\n const { performer } = audio!;\n\n return (\n <>\n {performer && renderText(performer)}\n {performer && senderTitle && }\n {senderTitle && renderText(senderTitle)}\n \n );\n }\n\n const seekHandlers = { handleStartSeek, handleSeek, handleStopSeek };\n const isOwn = isOwnMessage(message);\n const renderedWaveform = useMemo(\n () => voice && renderWaveform(voice, playProgress, isOwn, seekHandlers, theme),\n [voice, playProgress, isOwn, seekHandlers, theme],\n );\n\n const fullClassName = buildClassName(\n 'Audio media-inner',\n className,\n isOwn && !target && 'own',\n target && 'bigger',\n isSelected && 'audio-is-selected',\n );\n\n const buttonClassNames = ['toggle-play'];\n if (isLoadingForPlaying) {\n buttonClassNames.push('loading');\n } else if (isPlaying) {\n buttonClassNames.push('pause');\n } else if (!isPlaying) {\n buttonClassNames.push('play');\n }\n\n const showSeekline = isPlaying || (playProgress > 0 && playProgress < 1);\n const contentClassName = buildClassName('content', showSeekline && 'with-seekline');\n\n function renderSearchResult() {\n return (\n <>\n
\n
\n

{renderText(getFirstLine())}

\n\n
\n {date && (\n \n {formatPastTimeShort(lang, date * 1000)}\n \n )}\n
\n
\n\n {showSeekline && renderSeekline(playProgress, bufferedProgress, seekHandlers)}\n {!showSeekline && (\n

\n {playProgress > 0 ? `${formatMediaDuration(duration * playProgress)} / ` : undefined}\n {getSecondLine()}\n

\n )}\n
\n \n );\n }\n\n return (\n
\n {isSelectable && (\n
\n {isSelected && }\n
\n )}\n \n \n \n \n {shouldRenderSpinner && (\n
\n \n
\n )}\n {audio && (\n \n \n \n )}\n {target === 'searchResult' && renderSearchResult()}\n {target !== 'searchResult' && audio && renderAudio(\n lang, audio, isPlaying, playProgress, bufferedProgress, seekHandlers, date,\n onDateClick ? handleDateClick : undefined,\n )}\n {target !== 'searchResult' && voice && renderVoice(voice, renderedWaveform, isMediaUnread)}\n
\n );\n};\n\nfunction renderAudio(\n lang: LangFn,\n audio: ApiAudio,\n isPlaying: boolean,\n playProgress: number,\n bufferedProgress: number,\n seekHandlers: ISeekMethods,\n date?: number,\n handleDateClick?: NoneToVoidFunction,\n) {\n const {\n title, performer, duration, fileName,\n } = audio;\n const showSeekline = isPlaying || (playProgress > 0 && playProgress < 1);\n\n return (\n
\n

{renderText(title || fileName)}

\n {showSeekline && renderSeekline(playProgress, bufferedProgress, seekHandlers)}\n {!showSeekline && (\n
\n {renderText(performer || 'Unknown')}\n {date && (\n <>\n {' '}\n •\n {' '}\n {formatMediaDateTime(lang, date * 1000)}\n \n )}\n
\n )}\n

\n {playProgress > 0 ? `${formatMediaDuration(duration * playProgress)} / ` : undefined}\n {formatMediaDuration(duration)}\n

\n
\n );\n}\n\nfunction renderVoice(voice: ApiVoice, renderedWaveform: any, isMediaUnread?: boolean) {\n return (\n
\n {renderedWaveform}\n

\n {formatMediaDuration(voice.duration)}\n {isMediaUnread && }\n

\n
\n );\n}\n\nfunction renderWaveform(\n voice: ApiVoice,\n playProgress = 0,\n isOwn = false,\n { handleStartSeek, handleSeek, handleStopSeek }: ISeekMethods,\n theme: ISettings['theme'],\n) {\n const { waveform, duration } = voice;\n\n if (!waveform) {\n return undefined;\n }\n\n const fillColor = theme === 'dark' ? '#494B75' : '#CBCBCB';\n const fillOwnColor = theme === 'dark' ? '#C0BBED' : '#B0DEA6';\n const progressFillColor = theme === 'dark' ? '#868DF5' : '#54a3e6';\n const progressFillOwnColor = theme === 'dark' ? '#FFFFFF' : '#53ad53';\n const durationFactor = Math.min(duration / AVG_VOICE_DURATION, 1);\n const spikesCount = Math.round(MIN_SPIKES + (MAX_SPIKES - MIN_SPIKES) * durationFactor);\n const decodedWaveform = decodeWaveform(new Uint8Array(waveform));\n const { data: spikes, peak } = interpolateArray(decodedWaveform, spikesCount);\n const { src, width, height } = renderWaveformToDataUri(spikes, playProgress, {\n peak,\n fillStyle: isOwn ? fillOwnColor : fillColor,\n progressFillStyle: isOwn ? progressFillOwnColor : progressFillColor,\n });\n\n return (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions\n \n );\n}\n\nfunction renderSeekline(\n playProgress: number,\n bufferedProgress: number,\n { handleStartSeek, handleSeek, handleStopSeek }: ISeekMethods,\n) {\n return (\n \n \n \n \n \n \n \n \n \n \n
\n );\n}\n\nexport default memo(Audio);\n","/* eslint-disable no-bitwise */\n\n// eslint-disable-next-line max-len\n// Ref: https://github.com/telegramdesktop/tdesktop/blob/0743e71ab6b928d2ee5bae1aed991849b1e2b291/Telegram/SourceFiles/data/data_document.cpp#L1018\nexport function decodeWaveform(encoded5bit: Uint8Array) {\n const bitsCount = encoded5bit.length * 8;\n const valuesCount = Math.floor(bitsCount / 5);\n if (!valuesCount) {\n return [];\n }\n\n // Read each 5 bit of encoded5bit as 0-31 unsigned char.\n // We count the index of the byte in which the desired 5-bit sequence starts.\n // And then we read a uint16 starting from that byte to guarantee to get all of those 5 bits.\n //\n // BUT! if it is the last byte we have, we're not allowed to read a uint16 starting with it.\n // Because it will be an overflow (we'll access one byte after the available memory).\n // We see, that only the last 5 bits could start in the last available byte and be problematic.\n // So we read in a general way all the entries in a general way except the last one.\n const result = Array(valuesCount);\n const bitsData = encoded5bit;\n for (let i = 0, l = valuesCount - 1; i !== l; ++i) {\n const byteIndex = Math.floor((i * 5) / 8);\n const bitShift = Math.floor((i * 5) % 8);\n const value = bitsData[byteIndex] + (bitsData[byteIndex + 1] << 8);\n result[i] = ((value >> bitShift) & 0x1F);\n }\n const lastByteIndex = Math.floor(((valuesCount - 1) * 5) / 8);\n const lastBitShift = Math.floor(((valuesCount - 1) * 5) % 8);\n const lastValue = bitsData[lastByteIndex] + (bitsData[lastByteIndex + 1] << 8);\n result[valuesCount - 1] = (lastValue >> lastBitShift) & 0x1F;\n\n return result;\n}\n\nexport function interpolateArray(data: number[], fitCount: number) {\n let peak = 0;\n const newData = new Array(fitCount);\n const springFactor = data.length / fitCount;\n const leftFiller = data[0];\n const rightFiller = data[data.length - 1];\n for (let i = 0; i < fitCount; i++) {\n const idx = Math.floor(i * springFactor);\n const val = ((data[idx - 1] ?? leftFiller) + (data[idx] ?? leftFiller) + (data[idx + 1] ?? rightFiller)) / 3;\n newData[i] = val;\n if (peak < val) {\n peak = val;\n }\n }\n return { data: newData, peak };\n}\n","type IWaveformProps = {\n peak: number;\n fillStyle: string;\n progressFillStyle: string;\n};\n\nconst SPIKE_WIDTH = 2;\nconst SPIKE_STEP = 4;\nconst SPIKE_RADIUS = 1;\nconst HEIGHT = 23;\n\nexport function renderWaveformToDataUri(\n spikes: number[],\n progress: number,\n {\n peak, fillStyle, progressFillStyle,\n }: IWaveformProps,\n) {\n const width = spikes.length * SPIKE_STEP;\n const height = HEIGHT;\n\n const canvas = document.createElement('canvas');\n canvas.width = width * 2;\n canvas.height = height * 2;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n\n const ctx = canvas.getContext('2d')!;\n ctx.scale(2, 2);\n\n spikes.forEach((item, i) => {\n ctx.globalAlpha = (i / spikes.length >= progress) ? 0.5 : 1;\n ctx.fillStyle = progress > i / spikes.length ? progressFillStyle : fillStyle;\n const spikeHeight = Math.max(2, HEIGHT * (item / Math.max(1, peak)));\n roundedRectangle(ctx, i * SPIKE_STEP, height, SPIKE_WIDTH, spikeHeight, SPIKE_RADIUS);\n ctx.fill();\n });\n\n return {\n src: canvas.toDataURL(),\n width,\n height,\n };\n}\n\nfunction roundedRectangle(\n ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number,\n) {\n if (width < 2 * radius) {\n radius = width / 2;\n }\n if (height < 2 * radius) {\n radius = height / 2;\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + width, y, x + width, y - height, radius);\n ctx.arcTo(x + width, y - height, x, y - height, radius);\n ctx.arcTo(x, y - height, x, y, radius);\n ctx.arcTo(x, y, x + width, y, radius);\n ctx.closePath();\n}\n","import React, {\n FC, useLayoutEffect, useRef, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\n\nimport './Tab.scss';\n\ntype OwnProps = {\n className?: string;\n title: string;\n active?: boolean;\n badgeCount?: number;\n isBadgeActive?: boolean;\n previousActiveTab?: number;\n onClick: (arg: number) => void;\n clickArg: number;\n};\n\nconst Tab: FC = ({\n className,\n title,\n active,\n badgeCount,\n isBadgeActive,\n previousActiveTab,\n onClick,\n clickArg,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const tabRef = useRef(null);\n\n useLayoutEffect(() => {\n if (!active || previousActiveTab === undefined) {\n return;\n }\n\n const tab = tabRef.current!;\n const indicator = tab.querySelector('i')!;\n const prevTab = tab.parentElement!.children[previousActiveTab];\n if (!prevTab) {\n return;\n }\n const currentIndicator = prevTab.querySelector('i')!;\n\n currentIndicator.classList.remove('animate');\n indicator.classList.remove('animate');\n\n // We move and resize our indicator so it repeats the position and size of the previous one.\n const shiftLeft = currentIndicator.parentElement!.offsetLeft - indicator.parentElement!.offsetLeft;\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\n\n // 3 AFs needed here to synchronize animations with Transition component\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n // Now we remove the transform to let it animate to its own position and size.\n indicator.classList.add('animate');\n indicator.style.transform = 'none';\n });\n });\n });\n }, [active, previousActiveTab]);\n\n return (\n onClick(clickArg)}\n ref={tabRef}\n >\n \n {renderText(title)}\n {!!badgeCount && (\n {badgeCount}\n )}\n \n \n \n );\n};\n\nexport default memo(Tab);\n","import React, {\n FC, memo, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport fastSmoothScrollHorizontal from '../../util/fastSmoothScrollHorizontal';\nimport usePrevious from '../../hooks/usePrevious';\nimport useHorizontalScroll from '../../hooks/useHorizontalScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Tab from './Tab';\n\nimport './TabList.scss';\n\nexport type TabWithProperties = {\n title: string;\n badgeCount?: number;\n isBadgeActive?: boolean;\n};\n\ntype OwnProps = {\n tabs: readonly TabWithProperties[];\n activeTab: number;\n big?: boolean;\n onSwitchTab: (index: number) => void;\n};\n\nconst TAB_SCROLL_THRESHOLD_PX = 16;\n\nconst TabList: FC = ({\n tabs, activeTab, big, onSwitchTab,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const previousActiveTab = usePrevious(activeTab);\n\n useHorizontalScroll(containerRef.current);\n\n // Scroll container to place active tab in the center\n useEffect(() => {\n const container = containerRef.current!;\n if (container.scrollWidth <= container.offsetWidth) {\n return;\n }\n\n const activeTabElement = container.querySelector('.Tab.active') as HTMLElement | null;\n if (activeTabElement) {\n const newLeft = activeTabElement.offsetLeft - (container.offsetWidth / 2) + (activeTabElement.offsetWidth / 2);\n\n // Prevent scrolling by only a couple of pixels, which doesn't look smooth\n if (Math.abs(newLeft - container.scrollLeft) < TAB_SCROLL_THRESHOLD_PX) {\n return;\n }\n\n fastSmoothScrollHorizontal(container, newLeft);\n }\n }, [activeTab]);\n\n const lang = useLang();\n\n return (\n \n {tabs.map((tab, i) => (\n \n ))}\n
\n );\n};\n\nexport default memo(TabList);\n","import { ApiError } from '../api/types';\n\nconst READABLE_ERROR_MESSAGES: Record = {\n CHAT_RESTRICTED: 'You can\\'t send messages in this chat, you were restricted',\n CHAT_WRITE_FORBIDDEN: 'You can\\'t write in this chat',\n CHAT_SEND_POLL_FORBIDDEN: 'You can\\'t create polls in this chat',\n CHAT_SEND_STICKERS_FORBIDDEN: 'You can\\'t send stickers in this chat',\n CHAT_SEND_GIFS_FORBIDDEN: 'You can\\'t send gifs in this chat',\n CHAT_SEND_MEDIA_FORBIDDEN: 'You can\\'t send media in this chat',\n CHAT_LINK_EXISTS: 'The chat is public, you can\\'t hide the history to new users',\n // eslint-disable-next-line max-len\n SLOWMODE_WAIT_X: 'Slowmode is enabled in this chat: you must wait for the specified number of seconds before sending another message to the chat.',\n USER_BANNED_IN_CHANNEL: 'You\\'re banned from sending messages in supergroups / channels',\n USER_IS_BLOCKED: 'You were blocked by this user',\n YOU_BLOCKED_USER: 'You blocked this user',\n IMAGE_PROCESS_FAILED: 'Failure while processing image',\n MEDIA_EMPTY: 'The provided media object is invalid',\n MEDIA_INVALID: 'Media invalid',\n PHOTO_EXT_INVALID: 'The extension of the photo is invalid',\n PHOTO_INVALID_DIMENSIONS: 'The photo dimensions are invalid',\n PHOTO_SAVE_FILE_INVALID: 'Internal issues, try again later',\n // eslint-disable-next-line max-len\n MESSAGE_DELETE_FORBIDDEN: 'You can\\'t delete one of the messages you tried to delete, most likely because it is a service message.',\n MESSAGE_POLL_CLOSED: 'Poll closed',\n MESSAGE_EDIT_TIME_EXPIRED: 'You can\\'t edit this message anymore.',\n CHAT_ADMIN_REQUIRED: 'You must be an admin in this chat to do this',\n PINNED_DIALOGS_TOO_MUCH: 'Sorry, you can only pin 5 chats to the top',\n DIALOG_FILTERS_TOO_MUCH: 'Sorry, you can\\'t have more than 10 folders',\n CHANNEL_PRIVATE: 'This channel is private',\n MEDIA_CAPTION_TOO_LONG: 'The provided caption is too long',\n ADDRESS_STREET_LINE1_INVALID: 'The address you provided is not valid',\n ADDRESS_STREET_LINE2_INVALID: 'The address you provided is not valid',\n ADDRESS_CITY_INVALID: 'The city you provided is not valid',\n ADDRESS_COUNTRY_INVALID: 'The country you provided is not valid',\n ADDRESS_POSTCODE_INVALID: 'The postcode you provided is not valid',\n ADDRESS_STATE_INVALID: 'The state you provided is not valid',\n REQ_INFO_NAME_INVALID: 'The name you provided is not valid',\n REQ_INFO_PHONE_INVALID: 'The phone you provided is not valid',\n REQ_INFO_EMAIL_INVALID: 'The email you provided is not valid',\n // TODO Bring back after fixing the weird bug\n // CHANNEL_INVALID: 'An error occurred. Please try again later',\n LINK_NOT_MODIFIED: 'This discussion is already linked to the channel',\n\n // Non-API errors\n SERVICE_WORKER_DISABLED: 'Service Worker is disabled. Please reload the page without holding key.',\n // eslint-disable-next-line max-len\n CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS: 'The provided caption is too long. Please remove {EXTRA_CHARS_COUNT} character{PLURAL_S}.',\n // eslint-disable-next-line max-len\n FRESH_RESET_AUTHORISATION_FORBIDDEN: 'You can’t logout other sessions if less than 24 hours have passed since you logged on the current session',\n\n BOTS_TOO_MUCH: 'There are too many bots in this chat/channel',\n BOT_GROUPS_BLOCKED: 'This bot can\\'t be added to groups',\n USERS_TOO_MUCH: 'The maximum number of users has been exceeded',\n USER_CHANNELS_TOO_MUCH: 'One of the users you tried to add is already in too many channels/supergroups',\n USER_KICKED: 'This user was kicked from this supergroup/channel',\n USER_NOT_MUTUAL_CONTACT: 'The provided user is not a mutual contact',\n USER_PRIVACY_RESTRICTED: 'The user\\'s privacy settings do not allow you to do this',\n INVITE_HASH_EMPTY: 'The invite hash is empty',\n INVITE_HASH_EXPIRED: 'The invite link has expired',\n INVITE_HASH_INVALID: 'The invite hash is invalid',\n CHANNELS_TOO_MUCH: 'You have joined too many channels/supergroups',\n USER_ALREADY_PARTICIPANT: 'You already in the group',\n SCHEDULE_DATE_INVALID: 'Invalid schedule date provided',\n WALLPAPER_DIMENSIONS_INVALID: 'The wallpaper dimensions are invalid, please select another file',\n};\n\nexport default function getReadableErrorText(error: ApiError) {\n const { message, isSlowMode, textParams } = error;\n // Currently, Telegram API doesn't return `SLOWMODE_WAIT_X` error as described in the docs\n if (isSlowMode) {\n const extraPartIndex = message.indexOf(' (caused by');\n return extraPartIndex > 0 ? message.substring(0, extraPartIndex) : message;\n }\n let errorMessage = READABLE_ERROR_MESSAGES[message];\n if (errorMessage && textParams) {\n errorMessage = Object.keys(textParams).reduce((acc, current) => {\n return acc.replace(current, textParams[current]);\n }, errorMessage as string);\n }\n return errorMessage;\n}\n","// Sometimes event is fired earlier than animation completes\nconst ANIMATION_END_DELAY = 50;\n\nexport function waitForTransitionEnd(node: Node, handler: NoneToVoidFunction, propertyName?: string) {\n waitForEndEvent('transitionend', node, handler, propertyName);\n}\n\nexport function waitForAnimationEnd(node: Node, handler: NoneToVoidFunction, animationName?: string) {\n waitForEndEvent('animationend', node, handler, animationName);\n}\n\nfunction waitForEndEvent(\n eventType: 'transitionend' | 'animationend',\n node: Node,\n handler: NoneToVoidFunction,\n detailedName?: string,\n) {\n let isHandled = false;\n\n node.addEventListener(eventType, function handleAnimationEnd(e: TransitionEvent | AnimationEvent) {\n if (isHandled || e.target !== e.currentTarget) {\n return;\n }\n\n if (detailedName && (\n (e instanceof TransitionEvent && e.propertyName === detailedName)\n || (e instanceof AnimationEvent && e.animationName === detailedName)\n )) {\n return;\n }\n\n isHandled = true;\n\n node.removeEventListener(eventType, handleAnimationEnd as EventListener);\n\n setTimeout(() => {\n handler();\n }, ANIMATION_END_DELAY);\n } as EventListener);\n}\n","import { useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../api/types';\n\nimport {\n isChatArchived, getCanDeleteChat, isChatPrivate, isChatChannel,\n} from '../modules/helpers';\nimport useLang from './useLang';\n\nexport default ({\n chat,\n privateChatUser,\n handleDelete,\n folderId,\n isPinned,\n isMuted,\n}: {\n chat: ApiChat | undefined;\n privateChatUser: ApiUser | undefined;\n handleDelete: () => void;\n folderId?: number;\n isPinned?: boolean;\n isMuted?: boolean;\n}) => {\n const lang = useLang();\n\n const {\n toggleChatPinned,\n updateChatMutedState,\n toggleChatArchived,\n toggleChatUnread,\n } = getDispatch();\n\n return useMemo(() => {\n if (!chat) {\n return undefined;\n }\n\n const isChatWithSelf = privateChatUser && privateChatUser.isSelf;\n\n const actionUnreadMark = chat.unreadCount || chat.hasUnreadMark\n ? { title: lang('MarkAsRead'), icon: 'readchats', handler: () => toggleChatUnread({ id: chat.id }) }\n : { title: lang('MarkAsUnread'), icon: 'unread', handler: () => toggleChatUnread({ id: chat.id }) };\n\n const actionPin = isPinned\n ? {\n title: lang('UnpinFromTop'),\n icon: 'unpin',\n handler: () => toggleChatPinned({ id: chat.id, folderId }),\n }\n : { title: lang('PinToTop'), icon: 'pin', handler: () => toggleChatPinned({ id: chat.id, folderId }) };\n\n const actionMute = isMuted\n ? {\n title: lang('ChatList.Unmute'),\n icon: 'unmute',\n handler: () => updateChatMutedState({ chatId: chat.id, isMuted: false }),\n }\n : {\n title: lang('ChatList.Mute'),\n icon: 'mute',\n handler: () => updateChatMutedState({ chatId: chat.id, isMuted: true }),\n };\n\n const actionArchive = isChatArchived(chat)\n ? { title: lang('Unarchive'), icon: 'unarchive', handler: () => toggleChatArchived({ id: chat.id }) }\n : { title: lang('Archive'), icon: 'archive', handler: () => toggleChatArchived({ id: chat.id }) };\n\n const actionDelete = {\n title: isChatPrivate(chat.id)\n ? lang('Delete')\n : lang(getCanDeleteChat(chat)\n ? 'DeleteChat'\n : (isChatChannel(chat) ? 'LeaveChannel' : 'Group.LeaveGroup')),\n icon: 'delete',\n destructive: true,\n handler: handleDelete,\n };\n\n return [\n actionUnreadMark,\n actionPin,\n ...(!isChatWithSelf ? [\n actionMute,\n actionArchive,\n ] : []),\n actionDelete,\n ];\n }, [\n chat, privateChatUser, lang, isPinned, handleDelete, toggleChatUnread, toggleChatPinned, folderId,\n updateChatMutedState, toggleChatArchived, isMuted,\n ]);\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { ApiMessage, ApiMessageOutgoingStatus } from '../../api/types';\n\nimport { formatPastTimeShort } from '../../util/dateFormat';\nimport useLang from '../../hooks/useLang';\n\nimport MessageOutgoingStatus from './MessageOutgoingStatus';\n\nimport './LastMessageMeta.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n outgoingStatus?: ApiMessageOutgoingStatus;\n};\n\nconst LastMessageMeta: FC = ({ message, outgoingStatus }) => {\n const lang = useLang();\n return (\n
\n {outgoingStatus && (\n \n )}\n {formatPastTimeShort(lang, message.date * 1000)}\n
\n );\n};\n\nexport default memo(LastMessageMeta);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { ApiMessageOutgoingStatus } from '../../api/types';\n\nimport Transition from '../ui/Transition';\n\nimport './MessageOutgoingStatus.scss';\n\ntype OwnProps = {\n status: ApiMessageOutgoingStatus;\n};\n\nenum Keys {\n failed, pending, succeeded, read,\n}\n\nconst MessageOutgoingStatus: FC = ({ status }) => {\n return (\n
\n \n {() => (\n \n )}\n \n
\n );\n};\n\nexport default memo(MessageOutgoingStatus);\n","import { useState, useEffect } from '../lib/teact/teact';\nimport { IAnchorPosition } from '../types';\n\nconst MENU_POSITION_VISUAL_COMFORT_SPACE_PX = 16;\n\nexport default (\n anchor: IAnchorPosition | undefined,\n getTriggerElement: () => HTMLElement | null,\n getRootElement: () => HTMLElement | null,\n getMenuElement: () => HTMLElement | null,\n extraPaddingX = 0,\n extraTopPadding = 0,\n) => {\n const [positionX, setPositionX] = useState<'right' | 'left'>('right');\n const [positionY, setPositionY] = useState<'top' | 'bottom'>('bottom');\n const [style, setStyle] = useState('');\n\n useEffect(() => {\n const triggerEl = getTriggerElement();\n if (!anchor || !triggerEl) {\n return;\n }\n\n let { x, y } = anchor;\n const emptyRect = {\n width: 0, left: 0, height: 0, top: 0,\n };\n\n const menuEl = getMenuElement();\n const rootEl = getRootElement();\n\n const triggerRect = triggerEl.getBoundingClientRect();\n const menuRect = menuEl ? { width: menuEl.offsetWidth, height: menuEl.offsetHeight } : emptyRect;\n const rootRect = rootEl ? rootEl.getBoundingClientRect() : emptyRect;\n\n let horizontalPostition: 'left' | 'right';\n if (x + menuRect.width + extraPaddingX < rootRect.width + rootRect.left) {\n x += 3;\n horizontalPostition = 'left';\n } else if (x - menuRect.width > 0) {\n horizontalPostition = 'right';\n x -= 3;\n } else {\n horizontalPostition = 'left';\n x = 16;\n }\n setPositionX(horizontalPostition);\n\n if (y + menuRect.height < rootRect.height + rootRect.top) {\n setPositionY('top');\n } else {\n setPositionY('bottom');\n\n if (y - menuRect.height < rootRect.top + extraTopPadding) {\n y = rootRect.top + extraTopPadding + menuRect.height;\n }\n }\n\n const left = horizontalPostition === 'left'\n ? Math.min(x - triggerRect.left, rootRect.width - menuRect.width - MENU_POSITION_VISUAL_COMFORT_SPACE_PX)\n : Math.max((x - triggerRect.left), menuRect.width + MENU_POSITION_VISUAL_COMFORT_SPACE_PX);\n\n setStyle(`left: ${left}px; top: ${y - triggerRect.top}px;`);\n }, [\n anchor, extraPaddingX, extraTopPadding,\n getMenuElement, getRootElement, getTriggerElement,\n ]);\n\n return {\n positionX,\n positionY,\n style,\n };\n};\n","import { useRef } from '../lib/teact/teact';\n\nimport usePrevious from './usePrevious';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport default function usePrevDuringAnimation(current: any, duration?: number) {\n const prev = usePrevious(current, true);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n // eslint-disable-next-line no-null/no-null\n const isCurrentPresent = current !== undefined && current !== null;\n // eslint-disable-next-line no-null/no-null\n const isPrevPresent = prev !== undefined && prev !== null;\n\n if (isCurrentPresent && timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n\n useOnChange(() => {\n // When `current` becomes empty\n if (duration && !isCurrentPresent && isPrevPresent && !timeoutRef.current) {\n timeoutRef.current = window.setTimeout(() => {\n timeoutRef.current = undefined;\n forceUpdate();\n }, duration);\n }\n }, [current]);\n\n return !timeoutRef.current || !duration || isCurrentPresent ? current : prev;\n}\n","import {\n useCallback, useEffect, useRef, useState,\n} from '../lib/teact/teact';\n\nimport { register } from '../util/audioPlayer';\nimport useEffectWithPrevDeps from './useEffectWithPrevDeps';\nimport { isSafariPatchInProgress } from '../util/patchSafariProgressiveAudio';\nimport useOnChange from './useOnChange';\n\ntype Handler = (e: Event) => void;\n\nexport default (\n trackId: string,\n originalDuration: number, // Sometimes incorrect for voice messages\n src?: string,\n handlers?: Record,\n onInit?: (element: HTMLAudioElement) => void,\n shouldPlay = false,\n onForcePlay?: NoneToVoidFunction,\n noPlaylist = false,\n) => {\n // eslint-disable-next-line no-null/no-null\n const controllerRef = useRef>(null);\n\n const [isPlaying, setIsPlaying] = useState(false);\n let isPlayingSync = isPlaying;\n\n const [playProgress, setPlayProgress] = useState(0);\n\n useOnChange(() => {\n controllerRef.current = register(trackId, (eventName, e) => {\n switch (eventName) {\n case 'onPlay':\n setIsPlaying(true);\n break;\n case 'onPause':\n setIsPlaying(false);\n break;\n case 'onTimeUpdate': {\n const { proxy } = controllerRef.current!;\n const duration = proxy.duration && Number.isFinite(proxy.duration) ? proxy.duration : originalDuration;\n setPlayProgress(proxy.currentTime / duration);\n break;\n }\n }\n\n if (handlers && handlers[eventName]) {\n handlers[eventName](e);\n }\n }, onForcePlay);\n\n const { proxy } = controllerRef.current!;\n\n if (!isPlaying && !proxy.paused) {\n setIsPlaying(true);\n isPlayingSync = true;\n }\n\n if (onInit) {\n onInit(proxy);\n }\n }, [trackId]);\n\n const {\n play, pause, setCurrentTime, proxy, destroy,\n } = controllerRef.current!;\n const duration = proxy.duration && Number.isFinite(proxy.duration) ? proxy.duration : originalDuration;\n\n // RAF progress\n useEffect(() => {\n if (duration && !isSafariPatchInProgress(proxy)) {\n setPlayProgress(proxy.currentTime / duration);\n }\n }, [duration, playProgress, proxy]);\n\n // Cleanup\n useEffect(() => () => {\n destroy(noPlaylist);\n }, [destroy, noPlaylist]);\n\n // Autoplay once `src` is present\n useEffectWithPrevDeps(([prevShouldPlay, prevSrc]) => {\n if (prevShouldPlay === shouldPlay && src === prevSrc) {\n return;\n }\n\n // When paused by another player\n if (proxy.src && proxy.paused) {\n return;\n }\n\n if (shouldPlay && src && !isPlaying) {\n play(src);\n }\n }, [shouldPlay, src, isPlaying, play, proxy.src, proxy.paused]);\n\n const playPause = useCallback(() => {\n if (isPlaying) {\n pause();\n } else if (src) {\n play(src);\n }\n }, [src, pause, play, isPlaying]);\n\n return {\n isPlaying: isPlayingSync,\n playProgress,\n playPause,\n setCurrentTime,\n audioProxy: proxy,\n duration,\n };\n};\n","import { IS_SAFARI } from './environment';\nimport safePlay from './safePlay';\nimport { patchSafariProgressiveAudio, isSafariPatchInProgress } from './patchSafariProgressiveAudio';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { parseMessageKey } from '../modules/helpers';\n\ntype Handler = (eventName: string, e: Event) => void;\n\ninterface Track {\n audio: HTMLAudioElement;\n proxy: HTMLAudioElement;\n handlers: Handler[];\n onForcePlay?: NoneToVoidFunction;\n}\n\nconst tracks = new Map();\nlet queue: string[] = [];\n\nlet currentTrackId: string | undefined;\n\nfunction createAudio(trackId: string, onForcePlay?: NoneToVoidFunction) {\n const audio = new Audio();\n\n function handleEvent(eventName: string) {\n return (e: Event) => {\n if (!tracks.has(trackId)) {\n return;\n }\n\n if (isSafariPatchInProgress(audio)) {\n return;\n }\n\n tracks.get(trackId)!.handlers.forEach((handler) => {\n handler(eventName, e);\n });\n };\n }\n\n audio.addEventListener('timeupdate', handleEvent('onTimeUpdate'));\n audio.addEventListener('play', handleEvent('onPlay'));\n audio.addEventListener('pause', handleEvent('onPause'));\n audio.addEventListener('loadstart', handleEvent('onLoadStart'));\n audio.addEventListener('loadeddata', handleEvent('onLoadedData'));\n audio.addEventListener('playing', handleEvent('onPlaying'));\n audio.addEventListener('ended', () => {\n if (isSafariPatchInProgress(audio)) {\n return;\n }\n\n const nextTrackId = queue[queue.indexOf(trackId) + 1];\n if (!nextTrackId) {\n return;\n }\n\n if (!tracks.has(nextTrackId)) {\n // A bit hacky way to continue playlist when switching chat\n getDispatch().openAudioPlayer(parseMessageKey(nextTrackId));\n\n return;\n }\n\n const nextTrack = tracks.get(nextTrackId)!;\n\n if (nextTrack.onForcePlay) {\n nextTrack.onForcePlay();\n }\n\n currentTrackId = nextTrackId;\n\n if (nextTrack.audio.src) {\n safePlay(nextTrack.audio);\n }\n });\n\n return {\n audio,\n proxy: new Proxy(audio, {\n get: (origin, key: keyof HTMLAudioElement) => origin[key],\n }),\n handlers: [],\n onForcePlay,\n };\n}\n\nexport function stopCurrentAudio() {\n const currentTrack = currentTrackId && tracks.get(currentTrackId);\n if (currentTrack) {\n currentTrack.audio.pause();\n }\n}\n\nexport function register(trackId: string, handler: Handler, onForcePlay?: NoneToVoidFunction) {\n if (!tracks.has(trackId)) {\n tracks.set(trackId, createAudio(trackId, onForcePlay));\n\n if (!queue.includes(trackId)) {\n queue.push(trackId);\n }\n }\n\n const { audio, proxy, handlers } = tracks.get(trackId)!;\n\n handlers.push(handler);\n\n return {\n play(src: string) {\n if (currentTrackId && currentTrackId !== trackId) {\n tracks.get(currentTrackId)!.audio.pause();\n }\n\n currentTrackId = trackId;\n\n if (!audio.src) {\n audio.src = src;\n audio.preload = 'auto';\n\n if (src.includes('/progressive/') && IS_SAFARI) {\n patchSafariProgressiveAudio(audio);\n }\n }\n\n safePlay(audio);\n },\n\n pause() {\n if (currentTrackId === trackId) {\n audio.pause();\n }\n },\n\n setCurrentTime(time: number) {\n if (currentTrackId === trackId) {\n audio.currentTime = time;\n }\n },\n\n proxy,\n\n destroy(shouldRemoveFromQueue = false) {\n const track = tracks.get(trackId);\n if (!track) {\n return;\n }\n\n track.handlers = track.handlers.filter((h) => h !== handler);\n\n if (!track.handlers.length) {\n track.audio.pause();\n tracks.delete(trackId);\n\n if (shouldRemoveFromQueue) {\n queue = queue.filter((id) => id !== trackId);\n }\n\n if (trackId === currentTrackId) {\n currentTrackId = undefined;\n }\n }\n },\n };\n}\n","export default function download(url: string, filename: string) {\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n link.click();\n}\n","import { RefObject } from 'react';\nimport React, { FC, memo, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport buildClassName from '../../util/buildClassName';\nimport { formatMediaDateTime, formatPastTimeShort } from '../../util/dateFormat';\nimport { getColorFromExtension, getFileSizeString } from './helpers/documentInfo';\nimport { getDocumentThumbnailDimensions } from './helpers/mediaDimensions';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Link from '../ui/Link';\n\nimport './File.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n name: string;\n extension?: string;\n size: number;\n timestamp?: number;\n sender?: string;\n thumbnailDataUri?: string;\n previewData?: string;\n className?: string;\n smaller?: boolean;\n isTransferring?: boolean;\n isUploading?: boolean;\n isSelectable?: boolean;\n isSelected?: boolean;\n transferProgress?: number;\n actionIcon?: string;\n onClick?: () => void;\n onDateClick?: (e: React.MouseEvent) => void;\n};\n\nconst File: FC = ({\n ref,\n name,\n size,\n extension = '',\n timestamp,\n sender,\n thumbnailDataUri,\n previewData,\n className,\n smaller,\n isTransferring,\n isUploading,\n isSelectable,\n isSelected,\n transferProgress,\n actionIcon,\n onClick,\n onDateClick,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef(null);\n if (ref) {\n elementRef = ref;\n }\n\n const {\n shouldRender: shouldSpinnerRender,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, true);\n const color = getColorFromExtension(extension);\n const sizeString = getFileSizeString(size);\n\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(previewData, 'slow');\n const { width, height } = getDocumentThumbnailDimensions(smaller);\n\n const fullClassName = buildClassName(\n 'File',\n className,\n smaller && 'smaller',\n onClick && !isUploading && 'interactive',\n isSelected && 'file-is-selected',\n );\n\n return (\n
\n {isSelectable && (\n
\n {isSelected && }\n
\n )}\n
\n {thumbnailDataUri || previewData ? (\n
\n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n
\n ) : (\n
\n {extension.length <= 4 && (\n {extension}\n )}\n
\n )}\n {shouldSpinnerRender && (\n
\n \n
\n )}\n {onClick && (\n \n )}\n
\n
\n
{renderText(name)}
\n
\n \n {isTransferring && transferProgress ? `${Math.round(transferProgress * 100)}%` : sizeString}\n \n {sender && {renderText(sender)}}\n {!sender && timestamp && (\n <>\n {' '}\n {formatMediaDateTime(lang, timestamp * 1000)}\n \n )}\n
\n
\n {sender && timestamp && (\n {formatPastTimeShort(lang, timestamp * 1000)}\n )}\n
\n );\n};\n\nexport default memo(File);\n","import React, { useCallback, useEffect, useState } from '../lib/teact/teact';\n\nimport useMediaWithDownloadProgress from './useMediaWithDownloadProgress';\nimport download from '../util/download';\n\nexport default function useMediaDownload(\n mediaHash?: string,\n fileName?: string,\n) {\n const [isDownloadStarted, setIsDownloadStarted] = useState(false);\n\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(mediaHash, !isDownloadStarted);\n\n // Download with browser when fully loaded\n useEffect(() => {\n if (isDownloadStarted && mediaData) {\n download(mediaData, fileName!);\n setIsDownloadStarted(false);\n }\n }, [fileName, mediaData, isDownloadStarted]);\n\n // Cancel download on source change\n useEffect(() => {\n setIsDownloadStarted(false);\n }, [mediaHash]);\n\n const handleDownloadClick = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n setIsDownloadStarted((isAllowed) => !isAllowed);\n }, []);\n\n return {\n isDownloadStarted,\n downloadProgress,\n handleDownloadClick,\n };\n}\n","import React, {\n FC,\n memo,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from '../../lib/teact/teact';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport buildClassName from '../../util/buildClassName';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\n\nimport Portal from './Portal';\n\nimport './Notification.scss';\n\ntype OwnProps = {\n containerId?: string;\n message: TextPart[];\n duration?: number;\n onDismiss: () => void;\n};\n\nconst DEFAULT_DURATION = 3000;\nconst ANIMATION_DURATION = 150;\n\nconst Notification: FC = ({\n message, duration = DEFAULT_DURATION, containerId, onDismiss,\n}) => {\n const [isOpen, setIsOpen] = useState(true);\n // eslint-disable-next-line no-null/no-null\n const timerRef = useRef(null);\n\n const { transitionClassNames } = useShowTransition(isOpen);\n\n const closeAndDismiss = useCallback(() => {\n setIsOpen(false);\n setTimeout(onDismiss, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }, [onDismiss]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(closeAndDismiss) : undefined), [isOpen, closeAndDismiss]);\n\n useEffect(() => {\n timerRef.current = window.setTimeout(closeAndDismiss, duration);\n\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n }\n };\n }, [duration, closeAndDismiss]);\n\n const handleMouseEnter = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n }\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n timerRef.current = window.setTimeout(closeAndDismiss, duration);\n }, [duration, closeAndDismiss]);\n\n return (\n \n \n
\n {message}\n
\n
\n \n );\n};\n\nexport default memo(Notification);\n","const MAX_NESTING_PARENTS = 5;\n\nexport function isSelectionInsideInput(selectionRange: Range, inputId: string) {\n const { commonAncestorContainer } = selectionRange;\n let parentNode: HTMLElement | null = commonAncestorContainer as HTMLElement;\n let iterations = 1;\n while (parentNode && parentNode.id !== inputId && iterations < MAX_NESTING_PARENTS) {\n parentNode = parentNode.parentElement;\n iterations++;\n }\n\n return Boolean(parentNode && parentNode.id === inputId);\n}\n","import {\n useCallback, useEffect, useMemo, useState,\n} from '../../../../lib/teact/teact';\n\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../../util/memo';\nimport {\n EmojiData, EmojiModule, EmojiRawData, uncompressEmoji,\n} from '../../../../util/emoji';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport {\n buildCollectionByKey, flatten, mapValues, pickTruthy, unique,\n} from '../../../../util/iteratees';\nimport useFlag from '../../../../hooks/useFlag';\n\nlet emojiDataPromise: Promise;\nlet emojiRawData: EmojiRawData;\nlet emojiData: EmojiData;\n\nlet RE_EMOJI_SEARCH: RegExp;\nconst EMOJIS_LIMIT = 36;\nconst FILTER_MIN_LENGTH = 2;\nconst RE_BR = /(
|)/g;\nconst RE_SPACE = / /g;\nconst RE_CLEAN_HTML = /(
|<\\/div>)/gi;\n\ntry {\n RE_EMOJI_SEARCH = new RegExp('(^|\\\\s):[-+_:\\\\p{L}\\\\p{N}]*$', 'gui');\n} catch (e) {\n // Support for older versions of firefox\n RE_EMOJI_SEARCH = new RegExp('(^|\\\\s):[-+_:\\\\d\\\\wа-яё]*$', 'gi');\n}\n\nexport default function useEmojiTooltip(\n isAllowed: boolean,\n html: string,\n recentEmojiIds: string[],\n inputId = EDITABLE_INPUT_ID,\n onUpdateHtml: (html: string) => void,\n baseEmojiKeywords?: Record,\n emojiKeywords?: Record,\n isDisabled = false,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n\n const [byId, setById] = useState | undefined>();\n const [keywords, setKeywords] = useState();\n const [byKeyword, setByKeyword] = useState>({});\n const [names, setNames] = useState();\n const [byName, setByName] = useState>({});\n const [shouldForceInsertEmoji, setShouldForceInsertEmoji] = useState(false);\n\n const [filteredEmojis, setFilteredEmojis] = useState(MEMO_EMPTY_ARRAY);\n\n const recentEmojis = useMemo(\n () => {\n if (!byId || !recentEmojiIds.length) {\n return [];\n }\n\n return Object.values(pickTruthy(byId, recentEmojiIds));\n },\n [byId, recentEmojiIds],\n );\n\n // Initialize data on first render.\n useEffect(() => {\n if (isDisabled) return;\n const exec = () => {\n setById(emojiData.emojis);\n };\n\n if (emojiData) {\n exec();\n } else {\n ensureEmojiData()\n .then(exec);\n }\n }, [isDisabled]);\n\n useEffect(() => {\n if (!byId || isDisabled) {\n return;\n }\n\n const emojis = Object.values(byId);\n\n const byNative = buildCollectionByKey(emojis, 'native');\n const baseEmojisByKeyword = baseEmojiKeywords\n ? mapValues(baseEmojiKeywords, (natives) => {\n return Object.values(pickTruthy(byNative, natives));\n })\n : {};\n const emojisByKeyword = emojiKeywords\n ? mapValues(emojiKeywords, (natives) => {\n return Object.values(pickTruthy(byNative, natives));\n })\n : {};\n\n setByKeyword({ ...baseEmojisByKeyword, ...emojisByKeyword });\n setKeywords([...Object.keys(baseEmojisByKeyword), ...Object.keys(emojisByKeyword)]);\n\n const emojisByName = emojis.reduce((result, emoji) => {\n emoji.names.forEach((name) => {\n if (!result[name]) {\n result[name] = [];\n }\n\n result[name].push(emoji);\n });\n\n return result;\n }, {} as Record);\n setByName(emojisByName);\n setNames(Object.keys(emojisByName));\n }, [isDisabled, baseEmojiKeywords, byId, emojiKeywords]);\n\n useEffect(() => {\n if (!isAllowed || !html || !byId || !keywords || !keywords.length) {\n unmarkIsOpen();\n return;\n }\n\n const code = html.includes(':') && getEmojiCode(html);\n if (!code) {\n setFilteredEmojis(MEMO_EMPTY_ARRAY);\n unmarkIsOpen();\n return;\n }\n\n const forceSend = code.length > 2 && code.endsWith(':');\n const filter = code.substr(1, forceSend ? code.length - 2 : undefined);\n let matched: Emoji[] = [];\n\n setShouldForceInsertEmoji(forceSend);\n\n if (!filter) {\n matched = recentEmojis;\n } else if (filter.length >= FILTER_MIN_LENGTH) {\n const matchedKeywords = keywords.filter((keyword) => keyword.startsWith(filter)).sort();\n matched = matched.concat(flatten(Object.values(pickTruthy(byKeyword, matchedKeywords))));\n\n // Also search by names, which is useful for non-English languages\n const matchedNames = names.filter((name) => name.startsWith(filter));\n matched = matched.concat(flatten(Object.values(pickTruthy(byName, matchedNames))));\n\n matched = unique(matched);\n }\n\n if (matched.length) {\n if (!forceSend) {\n markIsOpen();\n }\n setFilteredEmojis(matched.slice(0, EMOJIS_LIMIT));\n } else {\n unmarkIsOpen();\n }\n }, [\n byId, byKeyword, keywords, byName, names, html, isAllowed, markIsOpen,\n recentEmojis, unmarkIsOpen, setShouldForceInsertEmoji,\n ]);\n\n const insertEmoji = useCallback((textEmoji: string, isForce?: boolean) => {\n const atIndex = html.lastIndexOf(':', isForce ? html.lastIndexOf(':') - 1 : undefined);\n if (atIndex !== -1) {\n onUpdateHtml(`${html.substr(0, atIndex)}${textEmoji}`);\n const messageInput = document.getElementById(inputId)!;\n requestAnimationFrame(() => {\n focusEditableElement(messageInput, true);\n });\n }\n\n unmarkIsOpen();\n }, [html, inputId, onUpdateHtml, unmarkIsOpen]);\n\n useEffect(() => {\n if (isOpen && shouldForceInsertEmoji && filteredEmojis.length) {\n insertEmoji(filteredEmojis[0].native, true);\n }\n }, [filteredEmojis, insertEmoji, isOpen, shouldForceInsertEmoji]);\n\n return {\n isEmojiTooltipOpen: isOpen,\n closeEmojiTooltip: unmarkIsOpen,\n filteredEmojis,\n insertEmoji,\n };\n}\n\nfunction getEmojiCode(html: string) {\n const emojis = html\n .replace(RE_SPACE, ' ')\n .replace(RE_BR, '\\n')\n .replace(RE_CLEAN_HTML, '')\n .match(RE_EMOJI_SEARCH);\n\n return emojis ? emojis[0].trim() : undefined;\n}\n\nasync function ensureEmojiData() {\n if (!emojiDataPromise) {\n emojiDataPromise = import('emoji-data-ios/emoji-data.json') as unknown as Promise;\n emojiRawData = (await emojiDataPromise).default;\n\n emojiData = uncompressEmoji(emojiRawData);\n }\n\n return emojiDataPromise;\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './EmojiTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst EmojiTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const EmojiTooltip = useModuleLoader(Bundles.Extra, 'EmojiTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return EmojiTooltip ? : undefined;\n};\n\nexport default memo(EmojiTooltipAsync);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useEffect, useRef, memo, useState, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { IAnchorPosition, ISettings } from '../../../types';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport { selectCurrentMessageList, selectReplyingToId } from '../../../modules/selectors';\nimport { debounce } from '../../../util/schedulers';\nimport focusEditableElement from '../../../util/focusEditableElement';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport {\n IS_ANDROID, IS_IOS, IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport useLayoutEffectWithPrevDeps from '../../../hooks/useLayoutEffectWithPrevDeps';\nimport useFlag from '../../../hooks/useFlag';\nimport parseEmojiOnlyString from '../../common/helpers/parseEmojiOnlyString';\nimport { isSelectionInsideInput } from './helpers/selection';\nimport useLang from '../../../hooks/useLang';\nimport renderText from '../../common/helpers/renderText';\n\nimport TextFormatter from './TextFormatter';\n\nconst CONTEXT_MENU_CLOSE_DELAY_MS = 100;\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 350;\nconst TRANSITION_DURATION_FACTOR = 50;\n\ntype OwnProps = {\n id: string;\n isAttachmentModalInput?: boolean;\n editableInputId?: string;\n html: string;\n placeholder: string;\n forcedPlaceholder?: string;\n shouldSetFocus: boolean;\n shouldSuppressFocus?: boolean;\n shouldSuppressTextFormatter?: boolean;\n onUpdate: (html: string) => void;\n onSuppressedFocus?: () => void;\n onSend: () => void;\n};\n\ntype StateProps = {\n currentChatId?: number;\n replyingToId?: number;\n noTabCapture?: boolean;\n messageSendKeyCombo?: ISettings['messageSendKeyCombo'];\n};\n\ntype DispatchProps = Pick;\n\nconst MAX_INPUT_HEIGHT = IS_SINGLE_COLUMN_LAYOUT ? 256 : 416;\nconst TAB_INDEX_PRIORITY_TIMEOUT = 2000;\nconst TEXT_FORMATTER_SAFE_AREA_PX = 90;\n// For some reason Safari inserts `
` after user removes text from input\nconst SAFARI_BR = '
';\n\nfunction clearSelection() {\n const selection = window.getSelection();\n if (!selection) {\n return;\n }\n\n if (selection.removeAllRanges) {\n selection.removeAllRanges();\n } else if (selection.empty) {\n selection.empty();\n }\n}\n\nconst MessageInput: FC = ({\n id,\n isAttachmentModalInput,\n editableInputId,\n html,\n placeholder,\n forcedPlaceholder,\n shouldSetFocus,\n shouldSuppressFocus,\n shouldSuppressTextFormatter,\n onUpdate,\n onSuppressedFocus,\n onSend,\n currentChatId,\n replyingToId,\n noTabCapture,\n messageSendKeyCombo,\n editLastMessage,\n replyToNextMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const cloneRef = useRef(null);\n\n const lang = useLang();\n const isContextMenuOpenRef = useRef(false);\n const [isTextFormatterOpen, openTextFormatter, closeTextFormatter] = useFlag();\n const [textFormatterAnchorPosition, setTextFormatterAnchorPosition] = useState();\n const [selectedRange, setSelectedRange] = useState();\n\n useEffect(() => {\n if (!isAttachmentModalInput) return;\n updateInputHeight(false);\n }, [isAttachmentModalInput]);\n\n useLayoutEffectWithPrevDeps(([prevHtml]) => {\n if (html !== inputRef.current!.innerHTML) {\n inputRef.current!.innerHTML = html;\n }\n\n if (html !== cloneRef.current!.innerHTML) {\n cloneRef.current!.innerHTML = html;\n }\n\n if (prevHtml !== undefined && prevHtml !== html) {\n updateInputHeight(!html.length);\n }\n }, [html]);\n\n const focusInput = useCallback(() => {\n // Avoid focusing during animation\n if (inputRef.current!.closest('.from, .to')) {\n setTimeout(focusInput, FOCUS_DELAY_MS);\n return;\n }\n\n focusEditableElement(inputRef.current!);\n }, []);\n\n const handleCloseTextFormatter = useCallback(() => {\n closeTextFormatter();\n clearSelection();\n }, [closeTextFormatter]);\n\n function checkSelection() {\n // Disable the formatter on iOS devices for now.\n if (IS_IOS) {\n return;\n }\n\n const selection = window.getSelection();\n if (!selection || !selection.rangeCount || isContextMenuOpenRef.current) {\n closeTextFormatter();\n return;\n }\n\n const selectionRange = selection.getRangeAt(0);\n const selectedText = selectionRange.toString().trim();\n if (\n shouldSuppressTextFormatter\n || !isSelectionInsideInput(selectionRange, editableInputId || EDITABLE_INPUT_ID)\n || !selectedText\n || parseEmojiOnlyString(selectedText)\n || !selectionRange.START_TO_END\n ) {\n closeTextFormatter();\n return;\n }\n\n const selectionRect = selectionRange.getBoundingClientRect();\n const inputRect = inputRef.current!.getBoundingClientRect();\n\n let x = (selectionRect.left + selectionRect.width / 2) - inputRect.left;\n\n if (x < TEXT_FORMATTER_SAFE_AREA_PX) {\n x = TEXT_FORMATTER_SAFE_AREA_PX;\n } else if (x > inputRect.width - TEXT_FORMATTER_SAFE_AREA_PX) {\n x = inputRect.width - TEXT_FORMATTER_SAFE_AREA_PX;\n }\n\n setTextFormatterAnchorPosition({\n x,\n y: selectionRect.top - inputRect.top,\n });\n\n setSelectedRange(selectionRange);\n openTextFormatter();\n }\n\n function handleMouseDown(event: React.MouseEvent) {\n function handleMouseUp() {\n checkSelection();\n\n event.target.removeEventListener('mouseup', handleMouseUp);\n }\n\n if (event.button !== 2) {\n event.target.addEventListener('mouseup', handleMouseUp);\n return;\n }\n\n if (isContextMenuOpenRef.current === true) {\n return;\n }\n\n isContextMenuOpenRef.current = true;\n\n function closeContextMenuMouseListener() {\n setTimeout(() => {\n isContextMenuOpenRef.current = false;\n }, CONTEXT_MENU_CLOSE_DELAY_MS);\n\n window.removeEventListener('mouseup', closeContextMenuMouseListener);\n }\n\n function closeContextMenuKeyListener(e: KeyboardEvent) {\n if (e.key !== 'Esc' && e.key !== 'Escape') {\n return;\n }\n\n setTimeout(() => {\n isContextMenuOpenRef.current = false;\n }, CONTEXT_MENU_CLOSE_DELAY_MS);\n\n window.removeEventListener('keydown', closeContextMenuKeyListener);\n }\n\n document.addEventListener('mousedown', closeContextMenuMouseListener);\n document.addEventListener('keydown', closeContextMenuKeyListener);\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n function handleKeyUp() {\n checkSelection();\n\n e.target.removeEventListener('keyup', handleKeyUp);\n }\n\n if (e.metaKey && !html.length) {\n const targetIndexDelta = e.key === 'ArrowDown' ? 1 : e.key === 'ArrowUp' ? -1 : undefined;\n if (targetIndexDelta) {\n e.preventDefault();\n\n replyToNextMessage({ targetIndexDelta });\n return;\n }\n }\n\n if (e.key === 'Enter' && !e.shiftKey) {\n if (\n !(IS_IOS || IS_ANDROID)\n && (\n (messageSendKeyCombo === 'enter' && !e.shiftKey)\n || (messageSendKeyCombo === 'ctrl-enter' && (e.ctrlKey || e.metaKey))\n )\n ) {\n e.preventDefault();\n\n closeTextFormatter();\n onSend();\n }\n } else if (e.key === 'ArrowUp' && !html.length && !e.metaKey) {\n e.preventDefault();\n editLastMessage();\n } else {\n e.target.addEventListener('keyup', handleKeyUp);\n }\n }\n\n function handleTouchSelection() {\n if (!IS_ANDROID) {\n return;\n }\n\n checkSelection();\n }\n\n function handleChange(e: ChangeEvent) {\n const { innerHTML, textContent } = e.currentTarget;\n\n onUpdate(innerHTML === SAFARI_BR ? '' : innerHTML);\n\n // Reset focus on the input to remove any active styling when input is cleared\n if (!IS_TOUCH_ENV && (!textContent || !textContent.length)) {\n const selection = window.getSelection()!;\n if (selection) {\n inputRef.current!.blur();\n selection.removeAllRanges();\n focusEditableElement(inputRef.current!, true);\n }\n }\n }\n\n function stopEvent(e: React.MouseEvent) {\n if (!IS_ANDROID) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n function updateInputHeight(willSend = false) {\n const input = inputRef.current!;\n const clone = cloneRef.current!;\n const currentHeight = Number(input.style.height.replace('px', ''));\n const newHeight = Math.min(clone.scrollHeight, MAX_INPUT_HEIGHT);\n if (newHeight === currentHeight) {\n return;\n }\n\n const transitionDuration = Math.round(\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\n );\n\n const exec = () => {\n input.style.height = `${newHeight}px`;\n input.style.transitionDuration = `${transitionDuration}ms`;\n input.classList.toggle('overflown', clone.scrollHeight > MAX_INPUT_HEIGHT);\n };\n\n if (willSend) {\n // Sync with sending animation\n requestAnimationFrame(exec);\n } else {\n exec();\n }\n }\n\n useEffect(() => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n focusInput();\n }, [currentChatId, focusInput, replyingToId, shouldSetFocus]);\n\n useEffect(() => {\n if (noTabCapture) {\n return undefined;\n }\n\n const captureFirstTab = debounce((e: KeyboardEvent) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n requestAnimationFrame(focusInput);\n }\n }, TAB_INDEX_PRIORITY_TIMEOUT, true, false);\n\n return captureKeyboardListeners({ onTab: captureFirstTab });\n }, [focusInput, noTabCapture]);\n\n useEffect(() => {\n const input = inputRef.current!;\n\n function suppressFocus() {\n input.blur();\n }\n\n if (shouldSuppressFocus) {\n input.addEventListener('focus', suppressFocus);\n }\n\n return () => {\n input.removeEventListener('focus', suppressFocus);\n };\n }, [shouldSuppressFocus]);\n\n const className = buildClassName(\n 'form-control custom-scroll',\n html.length > 0 && 'touched',\n shouldSuppressFocus && 'focus-disabled',\n );\n\n return (\n
\n \n
\n {!forcedPlaceholder && {placeholder}}\n \n {forcedPlaceholder && {renderText(forcedPlaceholder!)}}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId: currentChatId, threadId } = selectCurrentMessageList(global) || {};\n const { messageSendKeyCombo } = global.settings.byKey;\n\n return {\n currentChatId,\n messageSendKeyCombo,\n replyingToId: currentChatId && threadId ? selectReplyingToId(global, currentChatId, threadId) : undefined,\n noTabCapture: global.isPollModalOpen || global.payment.isPaymentModalOpen,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['editLastMessage', 'replyToNextMessage']),\n)(MessageInput));\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage, ApiWebPage } from '../../api/types';\n\nimport { getFirstLinkInMessage, getMessageSummaryText, getMessageWebPage } from '../../modules/helpers';\nimport buildClassName from '../../util/buildClassName';\nimport trimText from '../../util/trimText';\nimport renderText from './helpers/renderText';\nimport { formatPastTimeShort } from '../../util/dateFormat';\nimport useLang from '../../hooks/useLang';\n\nimport Media from './Media';\nimport Link from '../ui/Link';\nimport SafeLink from './SafeLink';\n\nimport './WebLink.scss';\n\nconst MAX_TEXT_LENGTH = 170; // symbols\n\ntype OwnProps = {\n message: ApiMessage;\n senderTitle?: string;\n onMessageClick: (messageId: number, chatId: number) => void;\n};\n\nconst WebLink: FC = ({ message, senderTitle, onMessageClick }) => {\n const lang = useLang();\n\n let linkData: ApiWebPage | undefined = getMessageWebPage(message);\n\n if (!linkData) {\n const link = getFirstLinkInMessage(message);\n if (link) {\n const { url, domain } = link;\n const messageText = getMessageSummaryText(lang, message);\n\n linkData = {\n siteName: domain.replace(/^www./, ''),\n url: url.includes('://') ? url : url.includes('@') ? `mailto:${url}` : `http://${url}`,\n description: messageText !== url ? messageText : undefined,\n } as ApiWebPage;\n }\n }\n\n const handleMessageClick = useCallback(() => {\n onMessageClick(message.id, message.chatId);\n }, [onMessageClick, message.id, message.chatId]);\n\n if (!linkData) {\n return undefined;\n }\n\n const {\n siteName,\n url,\n displayUrl,\n title,\n description,\n photo,\n video,\n } = linkData;\n\n const truncatedDescription = !senderTitle && trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebLink scroll-item',\n (!photo && !video) && 'without-media',\n );\n\n return (\n \n {photo && (\n \n )}\n
\n \n {renderText(title || siteName || displayUrl)}\n \n {truncatedDescription && (\n \n {renderText(truncatedDescription)}\n \n )}\n \n {url.replace('mailto:', '') || displayUrl}\n \n {senderTitle &&
{renderText(senderTitle)}
}\n
\n {senderTitle && (\n
\n \n {formatPastTimeShort(lang, message.date * 1000)}\n \n
\n )}\n
\n );\n};\n\nexport default memo(WebLink);\n","import { useCallback } from '../../../../lib/teact/teact';\n\nexport enum ChatAnimationTypes {\n Move,\n Opacity,\n None,\n}\n\nexport function useChatAnimationType(orderDiffById: Record) {\n const movesUp = useCallback((id: number) => orderDiffById[id] < 0, [orderDiffById]);\n const movesDown = useCallback((id: number) => orderDiffById[id] > 0, [orderDiffById]);\n\n const orderDiffIds = Object.keys(orderDiffById).map(Number);\n const numberOfUp = orderDiffIds.filter(movesUp).length;\n const numberOfDown = orderDiffIds.filter(movesDown).length;\n\n return useCallback((chatId: number): ChatAnimationTypes => {\n const orderDiff = orderDiffById[chatId];\n\n if (orderDiff === 0) {\n return ChatAnimationTypes.None;\n }\n\n if (\n orderDiff === Infinity\n || orderDiff === -Infinity\n || (movesUp(chatId) && numberOfUp <= numberOfDown)\n || (movesDown(chatId) && numberOfDown < numberOfUp)\n ) {\n return ChatAnimationTypes.Opacity;\n }\n\n return ChatAnimationTypes.Move;\n }, [movesDown, movesUp, numberOfDown, numberOfUp, orderDiffById]);\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiChat } from '../../../api/types';\n\nimport { formatIntegerCompact } from '../../../util/textFormat';\nimport buildClassName from '../../../util/buildClassName';\n\nimport ShowTransition from '../../ui/ShowTransition';\n\nimport './Badge.scss';\n\ntype OwnProps = {\n chat: ApiChat;\n isPinned?: boolean;\n isMuted?: boolean;\n};\n\nconst Badge: FC = ({ chat, isPinned, isMuted }) => {\n const isShown = Boolean(chat.unreadCount || chat.hasUnreadMark || isPinned);\n const className = buildClassName(\n 'Badge',\n isMuted && 'muted',\n isPinned && 'pinned',\n Boolean(chat.unreadCount || chat.hasUnreadMark) && 'unread',\n );\n\n function renderContent() {\n if (chat.unreadCount) {\n if (chat.unreadMentionsCount) {\n return (\n
\n
\n \n
\n
\n {formatIntegerCompact(chat.unreadCount)}\n
\n
\n );\n }\n\n return (\n
\n {formatIntegerCompact(chat.unreadCount)}\n
\n );\n } else if (chat.hasUnreadMark) {\n return (\n
\n );\n } else if (isPinned) {\n return (\n
\n \n
\n );\n }\n\n return undefined;\n }\n\n return (\n \n {renderContent}\n \n );\n};\n\nexport default memo(Badge);\n","import React, {\n FC, memo, useCallback, useLayoutEffect, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport useLang, { LangFn } from '../../../hooks/useLang';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus, ApiFormattedText, MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport {\n getChatTitle,\n isChatPrivate,\n isActionMessage,\n getPrivateChatUserId,\n getMessageAction,\n getMessageSenderName,\n isChatChannel,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n getMessageSticker,\n selectIsChatMuted,\n getMessageRoundVideo,\n} from '../../../modules/helpers';\nimport {\n selectChat, selectUser, selectChatMessage, selectOutgoingStatus, selectDraft, selectCurrentMessageList,\n selectNotifySettings, selectNotifyExceptions,\n} from '../../../modules/selectors';\nimport { renderActionMessageText } from '../../common/helpers/renderActionMessageText';\nimport renderText from '../../common/helpers/renderText';\nimport { fastRaf } from '../../../util/schedulers';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport useEnsureMessage from '../../../hooks/useEnsureMessage';\nimport useChatContextActions from '../../../hooks/useChatContextActions';\nimport useFlag from '../../../hooks/useFlag';\nimport useMedia from '../../../hooks/useMedia';\nimport { ChatAnimationTypes } from './hooks';\n\nimport Avatar from '../../common/Avatar';\nimport VerifiedIcon from '../../common/VerifiedIcon';\nimport TypingStatus from '../../common/TypingStatus';\nimport LastMessageMeta from '../../common/LastMessageMeta';\nimport DeleteChatModal from '../../common/DeleteChatModal';\nimport ListItem from '../../ui/ListItem';\nimport Badge from './Badge';\n\nimport './Chat.scss';\n\ntype OwnProps = {\n style?: string;\n chatId: number;\n folderId?: number;\n orderDiff: number;\n animationType: ChatAnimationTypes;\n isPinned?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isMuted?: boolean;\n privateChatUser?: ApiUser;\n actionTargetUserIds?: number[];\n usersById?: Record;\n actionTargetMessage?: ApiMessage;\n actionTargetChatId?: number;\n lastMessageSender?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n draft?: ApiFormattedText;\n animationLevel?: number;\n isSelected?: boolean;\n canScrollDown?: boolean;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_DURATION = 200;\n\nconst Chat: FC = ({\n style,\n chatId,\n folderId,\n orderDiff,\n animationType,\n isPinned,\n chat,\n isMuted,\n privateChatUser,\n actionTargetUserIds,\n usersById,\n lastMessageSender,\n lastMessageOutgoingStatus,\n actionTargetMessage,\n actionTargetChatId,\n draft,\n animationLevel,\n isSelected,\n canScrollDown,\n lastSyncTime,\n openChat,\n focusLastMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n const [shouldRenderDeleteModal, markRenderDeleteModal, unmarkRenderDeleteModal] = useFlag();\n\n const { lastMessage, typingStatus } = chat || {};\n const isAction = lastMessage && isActionMessage(lastMessage);\n\n useEnsureMessage(chatId, isAction ? lastMessage!.replyToMessageId : undefined, actionTargetMessage);\n\n const mediaThumbnail = lastMessage && !getMessageSticker(lastMessage)\n ? getMessageMediaThumbDataUri(lastMessage)\n : undefined;\n const mediaBlobUrl = useMedia(lastMessage ? getMessageMediaHash(lastMessage, 'micro') : undefined);\n const isRoundVideo = Boolean(lastMessage && getMessageRoundVideo(lastMessage));\n\n const actionTargetUsers = useMemo(() => {\n return actionTargetUserIds\n ? actionTargetUserIds.map((userId) => usersById && usersById[userId]).filter(Boolean as any)\n : undefined;\n }, [actionTargetUserIds, usersById]);\n\n // Sets animation excess values when `orderDiff` changes and then resets excess values to animate.\n useLayoutEffect(() => {\n const element = ref.current;\n\n if (animationLevel === 0 || !element) {\n return;\n }\n\n // TODO Refactor animation: create `useListAnimation` that owns `orderDiff` and `animationType`\n if (animationType === ChatAnimationTypes.Opacity) {\n element.style.opacity = '0';\n\n fastRaf(() => {\n element.classList.add('animate-opacity');\n element.style.opacity = '1';\n });\n } else if (animationType === ChatAnimationTypes.Move) {\n element.style.transform = `translate3d(0, ${-orderDiff * 100}%, 0)`;\n\n fastRaf(() => {\n element.classList.add('animate-transform');\n element.style.transform = '';\n });\n } else {\n return;\n }\n\n setTimeout(() => {\n fastRaf(() => {\n element.classList.remove('animate-opacity', 'animate-transform');\n element.style.opacity = '';\n element.style.transform = '';\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }, [animationLevel, orderDiff, animationType]);\n\n const handleClick = useCallback(() => {\n openChat({ id: chatId, shouldReplaceHistory: true });\n\n if (isSelected && canScrollDown) {\n focusLastMessage();\n }\n }, [\n isSelected,\n canScrollDown,\n openChat,\n chatId,\n focusLastMessage,\n ]);\n\n function handleDelete() {\n markRenderDeleteModal();\n openDeleteModal();\n }\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n handleDelete,\n folderId,\n isPinned,\n isMuted,\n });\n\n const lang = useLang();\n\n if (!chat) {\n return undefined;\n }\n\n function renderLastMessageOrTyping() {\n if (typingStatus && lastMessage && typingStatus.timestamp > lastMessage.date * 1000) {\n return ;\n }\n\n if (draft && draft.text.length) {\n return (\n

\n {lang('Draft')}\n {renderText(draft.text)}\n

\n );\n }\n\n if (!lastMessage) {\n return undefined;\n }\n\n if (isAction) {\n const actionOrigin = chat && (isChatChannel(chat) || lastMessage.senderId === lastMessage.chatId)\n ? chat\n : lastMessageSender;\n\n return (\n

\n {renderText(renderActionMessageText(\n lang,\n lastMessage,\n actionOrigin,\n actionTargetUsers,\n actionTargetMessage,\n actionTargetChatId,\n { asPlain: true },\n ) as string)}\n

\n );\n }\n\n const senderName = getMessageSenderName(lang, chatId, lastMessageSender);\n\n return (\n

\n {senderName && (\n <>\n {renderText(senderName)}\n :\n \n )}\n {renderMessageSummary(lang, lastMessage!, mediaBlobUrl || mediaThumbnail, isRoundVideo)}\n

\n );\n }\n\n const className = buildClassName(\n 'Chat chat-item-clickable',\n isChatPrivate(chatId) ? 'private' : 'group',\n isSelected && 'selected',\n );\n\n return (\n \n
\n \n
\n
\n
\n

{renderText(getChatTitle(lang, chat, privateChatUser))}

\n {chat.isVerified && }\n {isMuted && }\n {chat.lastMessage && (\n \n )}\n
\n
\n {renderLastMessageOrTyping()}\n \n
\n
\n {shouldRenderDeleteModal && (\n \n )}\n \n );\n};\n\nfunction renderMessageSummary(lang: LangFn, message: ApiMessage, blobUrl?: string, isRoundVideo?: boolean) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(lang, message));\n }\n\n return (\n \n \"\"\n {getMessageVideo(message) && }\n {renderText(getMessageSummaryText(lang, message, true))}\n \n );\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.lastMessage) {\n return {};\n }\n\n const { senderId, replyToMessageId, isOutgoing } = chat.lastMessage;\n const lastMessageSender = senderId ? selectUser(global, senderId) : undefined;\n const lastMessageAction = getMessageAction(chat.lastMessage);\n const actionTargetMessage = lastMessageAction && replyToMessageId\n ? selectChatMessage(global, chat.id, replyToMessageId)\n : undefined;\n const { targetUserIds: actionTargetUserIds, targetChatId: actionTargetChatId } = lastMessageAction || {};\n const privateChatUserId = getPrivateChatUserId(chat);\n const { byId: usersById } = global.users;\n const {\n chatId: currentChatId,\n threadId: currentThreadId,\n type: messageListType,\n } = selectCurrentMessageList(global) || {};\n const isSelected = chatId === currentChatId && currentThreadId === MAIN_THREAD_ID;\n\n return {\n chat,\n isMuted: selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)),\n lastMessageSender,\n actionTargetUserIds,\n actionTargetChatId,\n actionTargetMessage,\n draft: selectDraft(global, chatId, MAIN_THREAD_ID),\n animationLevel: global.settings.byKey.animationLevel,\n isSelected,\n canScrollDown: isSelected && messageListType === 'thread',\n lastSyncTime: global.lastSyncTime,\n ...(isOutgoing && { lastMessageOutgoingStatus: selectOutgoingStatus(global, chat.lastMessage) }),\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n ...(actionTargetUserIds && { usersById }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'focusLastMessage',\n ]),\n)(Chat));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatFolder, ApiSticker } from '../../../api/types';\nimport { SettingsScreens } from '../../../types';\nimport { FolderEditDispatch } from '../../../hooks/reducers/useFoldersReducer';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { selectAnimatedEmoji, selectChatFolder } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport AnimatedEmoji from '../../common/AnimatedEmoji';\n\nimport './EmptyFolder.scss';\n\ntype OwnProps = {\n folderId?: number;\n folderType: 'all' | 'archived' | 'folder';\n foldersDispatch?: FolderEditDispatch;\n onScreenSelect?: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n chatFolder?: ApiChatFolder;\n animatedEmoji?: ApiSticker;\n};\n\nconst EmptyFolder: FC = ({\n chatFolder, animatedEmoji, foldersDispatch, onScreenSelect,\n}) => {\n const lang = useLang();\n\n const handleEditFolder = useCallback(() => {\n foldersDispatch!({ type: 'editFolder', payload: chatFolder });\n onScreenSelect!(SettingsScreens.FoldersEditFolderFromChatList);\n }, [chatFolder, foldersDispatch, onScreenSelect]);\n\n return (\n
\n
{animatedEmoji && }
\n

{lang('FilterNoChatsToDisplay')}

\n

\n {lang(chatFolder ? 'ChatList.EmptyChatListFilterText' : 'Chat.EmptyChat')}\n

\n {chatFolder && foldersDispatch && onScreenSelect && (\n \n \n {lang('ChatList.EmptyChatListEditFilter')}\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal((global, { folderId, folderType }): StateProps => {\n const chatFolder = folderId && folderType === 'folder' ? selectChatFolder(global, folderId) : undefined;\n\n return {\n chatFolder,\n animatedEmoji: selectAnimatedEmoji(global, '📂'),\n };\n})(EmptyFolder));\n","import React, {\n FC, memo, useMemo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiChat, ApiChatFolder, ApiUser,\n} from '../../../api/types';\nimport { NotifyException, NotifySettings, SettingsScreens } from '../../../types';\nimport { FolderEditDispatch } from '../../../hooks/reducers/useFoldersReducer';\n\nimport { ALL_CHATS_PRELOAD_DISABLED, CHAT_HEIGHT_PX, CHAT_LIST_SLICE } from '../../../config';\nimport { IS_ANDROID, IS_MAC_OS, IS_PWA } from '../../../util/environment';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { mapValues, pick } from '../../../util/iteratees';\nimport { getChatOrder, prepareChatList, prepareFolderListIds } from '../../../modules/helpers';\nimport {\n selectChatFolder, selectNotifyExceptions, selectNotifySettings,\n} from '../../../modules/selectors';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\nimport { useChatAnimationType } from './hooks';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Loading from '../../ui/Loading';\nimport Chat from './Chat';\nimport EmptyFolder from './EmptyFolder';\n\ntype OwnProps = {\n folderType: 'all' | 'archived' | 'folder';\n folderId?: number;\n isActive: boolean;\n onScreenSelect?: (screen: SettingsScreens) => void;\n foldersDispatch?: FolderEditDispatch;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n chatFolder?: ApiChatFolder;\n listIds?: number[];\n orderedPinnedIds?: number[];\n lastSyncTime?: number;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n};\n\ntype DispatchProps = Pick;\n\nenum FolderTypeToListType {\n 'all' = 'active',\n 'archived' = 'archived'\n}\n\nconst ChatList: FC = ({\n folderType,\n folderId,\n isActive,\n chatFolder,\n chatsById,\n usersById,\n listIds,\n orderedPinnedIds,\n lastSyncTime,\n foldersDispatch,\n notifySettings,\n notifyExceptions,\n onScreenSelect,\n loadMoreChats,\n preloadTopChatMessages,\n openChat,\n openNextChat,\n}) => {\n const [currentListIds, currentPinnedIds] = useMemo(() => {\n return folderType === 'folder' && chatFolder\n ? prepareFolderListIds(chatsById, usersById, chatFolder, notifySettings, notifyExceptions)\n : [listIds, orderedPinnedIds];\n }, [folderType, chatFolder, chatsById, usersById, notifySettings, notifyExceptions, listIds, orderedPinnedIds]);\n\n const [orderById, orderedIds] = useMemo(() => {\n if (!currentListIds || (folderType === 'folder' && !chatFolder)) {\n return [];\n }\n const newChatArrays = prepareChatList(chatsById, currentListIds, currentPinnedIds, folderType);\n const singleList = [...newChatArrays.pinnedChats, ...newChatArrays.otherChats];\n const newOrderedIds = singleList.map(({ id }) => id);\n const newOrderById = singleList.reduce((acc, chat, i) => {\n acc[chat.id] = i;\n return acc;\n }, {} as Record);\n\n return [newOrderById, newOrderedIds];\n }, [currentListIds, currentPinnedIds, folderType, chatFolder, chatsById]);\n\n const prevOrderById = usePrevious(orderById);\n\n const orderDiffById = useMemo(() => {\n if (!orderById || !prevOrderById) {\n return {};\n }\n\n return mapValues(orderById, (order, id) => {\n return order - (prevOrderById[id] !== undefined ? prevOrderById[id] : Infinity);\n });\n }, [orderById, prevOrderById]);\n\n const loadMoreOfType = useCallback(() => {\n loadMoreChats({ listType: folderType === 'archived' ? 'archived' : 'active' });\n }, [loadMoreChats, folderType]);\n\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? loadMoreOfType : undefined,\n orderedIds,\n undefined,\n CHAT_LIST_SLICE,\n folderType === 'all' && !ALL_CHATS_PRELOAD_DISABLED,\n );\n\n // TODO Refactor to not call `prepareChatList` twice\n const chatArrays = viewportIds && prepareChatList(chatsById, viewportIds, currentPinnedIds, folderType);\n\n useEffect(() => {\n if (lastSyncTime && folderType === 'all') {\n preloadTopChatMessages();\n }\n }, [lastSyncTime, folderType, preloadTopChatMessages]);\n\n const getAnimationType = useChatAnimationType(orderDiffById);\n\n function renderChats() {\n const viewportOffset = orderedIds!.indexOf(viewportIds![0]);\n const pinnedOffset = viewportOffset + chatArrays!.pinnedChats.length;\n\n return (\n \n {chatArrays!.pinnedChats.map(({ id }, i) => (\n \n ))}\n {chatArrays!.otherChats.map((chat, i) => (\n \n ))}\n
\n );\n }\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (isActive && orderedIds) {\n if (IS_PWA && ((IS_MAC_OS && e.metaKey) || (!IS_MAC_OS && e.ctrlKey)) && e.code.startsWith('Digit')) {\n const [, digit] = e.code.match(/Digit(\\d)/) || [];\n if (!digit) return;\n\n const position = Number(digit) - 1;\n if (position > orderedIds.length - 1) return;\n\n openChat({ id: orderedIds[position], shouldReplaceHistory: true });\n }\n\n if (e.altKey) {\n const targetIndexDelta = e.key === 'ArrowDown' ? 1 : e.key === 'ArrowUp' ? -1 : undefined;\n if (!targetIndexDelta) return;\n\n e.preventDefault();\n openNextChat({ targetIndexDelta, orderedIds });\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n });\n\n return (\n \n {viewportIds && viewportIds.length && chatArrays ? (\n renderChats()\n ) : viewportIds && !viewportIds.length ? (\n (\n \n )\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { folderType, folderId }): StateProps => {\n const {\n chats: {\n listIds,\n byId: chatsById,\n orderedPinnedIds,\n },\n users: { byId: usersById },\n lastSyncTime,\n } = global;\n const listType = folderType !== 'folder' ? FolderTypeToListType[folderType] : undefined;\n const chatFolder = folderId ? selectChatFolder(global, folderId) : undefined;\n\n return {\n chatsById,\n usersById,\n lastSyncTime,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n ...(listType ? {\n listIds: listIds[listType],\n orderedPinnedIds: orderedPinnedIds[listType],\n } : {\n chatFolder,\n }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadMoreChats',\n 'preloadTopChatMessages',\n 'openChat',\n 'openNextChat',\n ]),\n)(ChatList));\n","import { ApiUser } from '../../../../api/types';\nimport { getUserFullName } from '../../../../modules/helpers';\nimport searchWords from '../../../../util/searchWords';\n\n// TODO: Support cyrillic translit search\nexport default function searchUserName(filter: string, user: ApiUser) {\n const usernameLowered = user.username.toLowerCase();\n const fullName = getUserFullName(user);\n const fullNameLowered = fullName && fullName.toLowerCase();\n const filterLowered = filter.toLowerCase();\n\n return usernameLowered.startsWith(filterLowered) || (\n fullNameLowered && searchWords(fullNameLowered, filterLowered)\n );\n}\n","import {\n useCallback, useEffect, useState, useMemo,\n} from '../../../../lib/teact/teact';\n\nimport { ApiMessageEntityTypes, ApiChatMember, ApiUser } from '../../../../api/types';\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport { getUserFirstOrLastName } from '../../../../modules/helpers';\nimport searchUserName from '../helpers/searchUserName';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport useFlag from '../../../../hooks/useFlag';\nimport { unique } from '../../../../util/iteratees';\nimport { throttle } from '../../../../util/schedulers';\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\nconst RE_BR = /(
|)/g;\nconst RE_SPACE = / /g;\nconst RE_CLEAN_HTML = /(
|<\\/div>)/gi;\nconst RE_USERNAME_SEARCH = new RegExp('(^|\\\\s)@[\\\\w\\\\d_-]*$', 'gi');\n\nexport default function useMentionTooltip(\n canSuggestMembers: boolean | undefined,\n html: string,\n onUpdateHtml: (html: string) => void,\n inputId: string = EDITABLE_INPUT_ID,\n groupChatMembers?: ApiChatMember[],\n topInlineBotIds?: number[],\n currentUserId?: number,\n usersById?: Record,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const [currentFilter, setCurrentFilter] = useState('');\n const [usersToMention, setUsersToMention] = useState();\n\n const topInlineBots = useMemo(() => {\n return (topInlineBotIds || []).map((id) => usersById && usersById[id]).filter(Boolean as any);\n }, [topInlineBotIds, usersById]);\n\n const getFilteredUsers = useCallback((filter, withInlineBots: boolean) => {\n if (!(groupChatMembers || topInlineBotIds) || !usersById) {\n setUsersToMention(undefined);\n\n return;\n }\n runThrottled(() => {\n const inlineBots = (withInlineBots ? topInlineBots : []).filter((inlineBot) => {\n return !filter || searchUserName(filter, inlineBot);\n });\n\n const chatMembers = (groupChatMembers || [])\n .map(({ userId }) => usersById[userId])\n .filter((user) => {\n if (!user || user.id === currentUserId) {\n return false;\n }\n\n return !filter || searchUserName(filter, user);\n });\n\n setUsersToMention(unique(inlineBots.concat(chatMembers)));\n });\n }, [currentUserId, groupChatMembers, topInlineBotIds, topInlineBots, usersById]);\n\n useEffect(() => {\n if (!canSuggestMembers || !html.length) {\n unmarkIsOpen();\n return;\n }\n\n const usernameFilter = html.includes('@') && getUsernameFilter(html);\n\n if (usernameFilter) {\n const filter = usernameFilter ? usernameFilter.substr(1) : '';\n setCurrentFilter(filter);\n getFilteredUsers(filter, canSuggestInlineBots(html));\n } else {\n unmarkIsOpen();\n }\n }, [canSuggestMembers, html, getFilteredUsers, markIsOpen, unmarkIsOpen]);\n\n useEffect(() => {\n if (usersToMention && usersToMention.length) {\n markIsOpen();\n } else {\n unmarkIsOpen();\n }\n }, [markIsOpen, unmarkIsOpen, usersToMention]);\n\n const insertMention = useCallback((user: ApiUser, forceFocus = false) => {\n if (!user.username && !getUserFirstOrLastName(user)) {\n return;\n }\n\n const insertedHtml = user.username\n ? `@${user.username}`\n : `${getUserFirstOrLastName(user)}`;\n\n const atIndex = html.lastIndexOf('@');\n if (atIndex !== -1) {\n onUpdateHtml(`${html.substr(0, atIndex)}${insertedHtml} `);\n const messageInput = document.getElementById(inputId)!;\n requestAnimationFrame(() => {\n focusEditableElement(messageInput, forceFocus);\n });\n }\n\n unmarkIsOpen();\n }, [html, inputId, onUpdateHtml, unmarkIsOpen]);\n\n return {\n isMentionTooltipOpen: isOpen,\n mentionFilter: currentFilter,\n closeMentionTooltip: unmarkIsOpen,\n insertMention,\n mentionFilteredUsers: usersToMention,\n };\n}\n\nfunction getUsernameFilter(html: string) {\n const username = html\n .replace(RE_SPACE, ' ')\n .replace(RE_BR, '\\n')\n .replace(RE_CLEAN_HTML, '')\n .replace(/\\n$/i, '')\n .match(RE_USERNAME_SEARCH);\n\n return username ? username[0].trim() : undefined;\n}\n\nfunction canSuggestInlineBots(html: string) {\n return html.startsWith('@');\n}\n","import { useEffect, useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport { imgToCanvas } from '../util/files';\nimport useForceUpdate from './useForceUpdate';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\nconst MAX_CACHE_SIZE = 1000;\n\nconst cache = new Map();\n\nexport default function useBlur(dataUri?: string, isDisabled = false, delay?: number) {\n const blurredRef = useRef(dataUri ? cache.get(dataUri) : undefined);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n if (timeoutRef.current && isDisabled) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n\n useEffect(() => {\n if (!dataUri || blurredRef.current || isDisabled) {\n return;\n }\n\n const img = new Image();\n\n img.onload = () => {\n const canvas = imgToCanvas(img);\n fastBlur(canvas.getContext('2d'), 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n const blurredDataUri = canvas.toDataURL();\n\n blurredRef.current = blurredDataUri;\n forceUpdate();\n\n if (cache.size >= MAX_CACHE_SIZE) {\n cache.clear();\n }\n cache.set(dataUri, blurredDataUri);\n };\n\n if (delay) {\n timeoutRef.current = window.setTimeout(() => {\n img.src = dataUri;\n }, delay);\n } else {\n img.src = dataUri;\n }\n }, [dataUri, delay, forceUpdate, isDisabled]);\n\n return blurredRef.current;\n}\n","import { useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport useOnChange from './useOnChange';\nimport useBlur from './useBlur';\nimport { imgToCanvas } from '../util/files';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nexport default function useBlurSync(dataUri: string | false | undefined) {\n const blurredRef = useRef();\n\n let isChanged = false;\n\n useOnChange(() => {\n isChanged = true;\n\n blurredRef.current = undefined;\n\n if (!dataUri) {\n return;\n }\n\n const img = new Image();\n img.src = dataUri;\n if (!img.width) {\n return;\n }\n\n const canvas = imgToCanvas(img);\n fastBlur(canvas.getContext('2d'), 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n\n blurredRef.current = canvas.toDataURL();\n }, [dataUri]);\n\n // Sometimes `Image` do not manage to load synchronously,\n // so we fall back the non-blurred variant and prepare the async one at least for the next time\n const blurredAsync = useBlur(dataUri || undefined, Boolean(blurredRef.current));\n\n return blurredRef.current || (!isChanged && blurredAsync) || dataUri || undefined;\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/0.e48232bc26b8d2aff6ea.css.map b/dist/0.e48232bc26b8d2aff6ea.css.map deleted file mode 100644 index 30e511460..000000000 --- a/dist/0.e48232bc26b8d2aff6ea.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/ui/Transition.scss","webpack:///./src/components/common/Avatar.scss","webpack:///./src/components/ui/ProgressSpinner.scss","webpack:///./src/components/ui/Modal.scss","webpack:///./src/components/ui/ListItem.scss","webpack:///./src/components/common/VerifiedIcon.scss","webpack:///./src/components/common/TypingStatus.scss","webpack:///./src/components/ui/Notification.scss","webpack:///./src/components/ui/Radio.scss","webpack:///./src/components/ui/Tab.scss","webpack:///./src/components/ui/TabList.scss","webpack:///./src/components/common/DeleteChatModal.scss","webpack:///./src/components/ui/SearchInput.scss","webpack:///./src/components/common/PickerSelectedItem.scss","webpack:///./src/components/common/MessageOutgoingStatus.scss","webpack:///./src/components/common/LastMessageMeta.scss","webpack:///./src/components/left/main/Badge.scss","webpack:///./src/components/left/main/Chat.scss","webpack:///./src/components/common/NothingFound.scss","webpack:///./src/components/common/Media.scss","webpack:///./src/components/common/WebLink.scss","webpack:///./src/components/common/File.scss","webpack:///./src/components/common/Audio.scss","webpack:///./src/components/middle/composer/DropTarget.scss","webpack:///./src/components/ui/FloatingActionButton.scss","webpack:///./src/components/middle/composer/DropArea.scss","webpack:///./src/components/common/AnimatedEmoji.scss","webpack:///./src/components/middle/composer/TextFormatter.scss","webpack:///./src/components/common/Picker.scss"],"names":[],"mappings":"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","file":"0.e48232bc26b8d2aff6ea.css","sourcesContent":[".Transition{position:relative}.Transition>*{width:100%;height:100%;animation-fill-mode:forwards !important;transition:background-color .2s}.Transition>*.from,.Transition>*.to{position:absolute;top:0;left:0}.Transition>*:not(.active):not(.from):not(.to){display:none !important}.Transition.skip-slide-transition{transition:none !important}.Transition.scroll-slide{width:100%;height:100%;overflow:hidden;display:flex;flex-wrap:nowrap}.Transition.scroll-slide>*{position:static;flex-shrink:0}.Transition.scroll-slide>*:not(.active):not(.from):not(.to){display:block !important;transform:scale(0)}.Transition.scroll-slide>*:not(.active):not(.from):not(.to).through{display:none !important}.Transition.slide>.to{transform:translateX(100%)}.Transition.slide.animating>.from{animation:slide-out var(--slide-transition)}.Transition.slide.animating>.to{animation:slide-in var(--slide-transition)}.Transition.slide.backwards>.to{transform:translateX(-100%)}.Transition.slide.backwards.animating>.from{animation:slide-in-backwards var(--slide-transition)}.Transition.slide.backwards.animating>.to{animation:slide-out-backwards var(--slide-transition)}.Transition.slide-reversed>.to{transform:translateX(-100%)}.Transition.slide-reversed.animating>.from{animation:slide-out var(--slide-transition)}.Transition.slide-reversed.animating>.to{animation:slide-in var(--slide-transition)}.Transition.slide-reversed.backwards>.to{transform:translateX(100%)}.Transition.slide-reversed.backwards.animating>.from{animation:slide-in-backwards var(--slide-transition)}.Transition.slide-reversed.backwards.animating>.to{animation:slide-out-backwards var(--slide-transition)}.Transition.mv-slide>*>div{animation-fill-mode:forwards !important}.Transition.mv-slide>.to>div{transform:translateX(100vw)}.Transition.mv-slide.animating>.from>div{animation:mv-slide-out .4s ease}.Transition.mv-slide.animating>.to>div{animation:mv-slide-in .4s ease}.Transition.mv-slide.backwards>.to>div{transform:translateX(-100vw)}.Transition.mv-slide.backwards.animating>.from>div{animation:mv-slide-in-backwards .4s ease}.Transition.mv-slide.backwards.animating>.to>div{animation:mv-slide-out-backwards .4s ease}.Transition.slide-fade>.from{transform-origin:left;transform:translateX(0);opacity:1}.Transition.slide-fade>.to{transform-origin:left;transform:translateX(1.5rem);opacity:0}.Transition.slide-fade.animating>.from{animation:fade-out-opacity var(--slide-transition),slide-fade-out-move var(--slide-transition)}.Transition.slide-fade.animating>.to{animation:fade-in-opacity var(--slide-transition),slide-fade-in-move var(--slide-transition)}.Transition.slide-fade.backwards>.from{transform:translateX(0);opacity:1}.Transition.slide-fade.backwards>.to{transform:translateX(-1.5rem);opacity:0}.Transition.slide-fade.backwards.animating>.from{animation:fade-in-backwards-opacity var(--slide-transition),slide-fade-in-backwards-move var(--slide-transition)}.Transition.slide-fade.backwards.animating>.to{animation:fade-out-backwards-opacity var(--slide-transition),slide-fade-out-backwards-move var(--slide-transition)}.Transition.zoom-fade>.from{transform-origin:center;transform:scale(1);opacity:1}.Transition.zoom-fade>.to{transform-origin:center;opacity:0}.Transition.zoom-fade.animating>.from{animation:fade-out-opacity .15s ease}.Transition.zoom-fade.animating>.to{animation:fade-in-opacity .15s ease, zoom-fade-in-move .15s ease}.Transition.zoom-fade.backwards>.from{transform:scale(1)}.Transition.zoom-fade.backwards>.to{transform:scale(0.95)}.Transition.zoom-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .1s ease, zoom-fade-in-backwards-move .15s ease}.Transition.zoom-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .15s ease, zoom-fade-out-backwards-move .15s ease}.Transition.fade>.from{opacity:1}.Transition.fade>.to{opacity:0}.Transition.fade.animating>.from{animation:fade-out-opacity .15s ease}.Transition.fade.animating>.to{animation:fade-in-opacity .15s ease}.Transition.slide-layers{--background-color: var(--color-background);background:black}.Transition.slide-layers>div{background:var(--background-color)}.Transition.slide-layers>.to{transform:translateX(100%)}.Transition.slide-layers.animating>.from{animation:slide-layers-out var(--layer-transition)}.Transition.slide-layers.animating>.to{animation:slide-in var(--layer-transition)}.Transition.slide-layers.backwards>.to{transform:translateX(-20%);opacity:0.75}.Transition.slide-layers.backwards.animating>.from{animation:slide-in-backwards var(--layer-transition)}.Transition.slide-layers.backwards.animating>.to{animation:slide-layers-out-backwards var(--layer-transition)}.Transition.push-slide>div{background:var(--color-background)}.Transition.push-slide>.from{transform-origin:center;transform:scale(1);opacity:1}.Transition.push-slide>.from .custom-scroll{scrollbar-color:transparent !important}.Transition.push-slide>.from .custom-scroll::-webkit-scrollbar-thumb{background-color:transparent !important}.Transition.push-slide>.to{transform:translateX(100%)}.Transition.push-slide.animating>.from{animation:push-out .3s ease-in-out}.Transition.push-slide.animating>.to{animation:slide-in-200 .3s ease-in-out}.Transition.push-slide.backwards>.to{transform:scale(0.7)}.Transition.push-slide.backwards.animating>.from{animation:slide-in-200-backwards .3s ease-in-out}.Transition.push-slide.backwards.animating>.to{animation:push-out-backwards .3s ease-in-out}.Transition.reveal>.to{-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0)}.Transition.reveal.animating>.to{animation:reveal-in 350ms ease-in}.Transition.reveal.backwards>.from{-webkit-clip-path:inset(0 0 0 0);clip-path:inset(0 0 0 0)}.Transition.reveal.backwards>.to{-webkit-clip-path:none;clip-path:none}.Transition.reveal.backwards.animating>.from{animation:reveal-in-backwards 350ms ease-out}.Transition.reveal.backwards.animating>.to{animation:none}@keyframes fade-in-opacity{0%{opacity:0}100%{opacity:1}}@keyframes fade-out-opacity{0%{opacity:1}100%{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@keyframes slide-in{0%{transform:translateX(100%)}100%{transform:translateX(0)}}@keyframes slide-out{0%{transform:translateX(0)}100%{transform:translateX(-100%)}}@keyframes slide-in-backwards{0%{transform:translateX(0)}100%{transform:translateX(100%)}}@keyframes slide-out-backwards{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes mv-slide-in{0%{transform:translateX(100vw)}100%{transform:translateX(0)}}@keyframes mv-slide-out{0%{transform:translateX(0)}100%{transform:translateX(-100vw)}}@keyframes mv-slide-in-backwards{0%{transform:translateX(0)}100%{transform:translateX(100vw)}}@keyframes mv-slide-out-backwards{0%{transform:translateX(-100vw)}100%{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes slide-layers-out{0%{transform:translateX(0);opacity:1}100%{transform:translateX(-20%);opacity:calc(1 - var(--layer-blackout-opacity))}}@keyframes slide-layers-out-backwards{0%{transform:translateX(-20%);opacity:calc(1 - var(--layer-blackout-opacity))}100%{transform:translateX(0);opacity:1}}@keyframes push-out{0%{transform:scale(1);opacity:1}100%{transform:scale(0.7);opacity:0}}@keyframes push-out-backwards{0%{transform:scale(0.7);opacity:0}100%{transform:scale(1);opacity:1}}@keyframes slide-in-200{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes slide-in-200-backwards{0%{transform:translateX(0)}100%{transform:translateX(200%)}}@keyframes reveal-in{0%{-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0)}100%{-webkit-clip-path:inset(0 0 0 0);clip-path:inset(0 0 0 0)}}@keyframes reveal-in-backwards{0%{-webkit-clip-path:inset(0 0 0 0);clip-path:inset(0 0 0 0)}100%{-webkit-clip-path:inset(0 100% 0 0);clip-path:inset(0 100% 0 0)}}\n",".Avatar{--color-user: var(--color-primary);flex:none;align-items:center;justify-content:center;width:3.375rem;height:3.375rem;border-radius:50%;background:linear-gradient(var(--color-white) -125%, var(--color-user));color:white;font-weight:bold;display:flex;white-space:nowrap}.Avatar img:not(.emoji){border-radius:50%}.Avatar .emoji{width:1rem;height:1rem}.Avatar i{font-size:2.5rem}.Avatar.size-micro{width:1rem;height:1rem;font-size:0.5125rem}.Avatar.size-micro .emoji{width:.5625rem;height:.5625rem}.Avatar.size-tiny{width:2rem;height:2rem;font-size:.875rem}.Avatar.size-tiny .emoji{width:.875rem;height:.875rem}.Avatar.size-small{width:2.125rem;height:2.125rem;font-size:0.875rem}.Avatar.size-small .emoji{width:.875rem;height:.875rem}.Avatar.size-medium{width:2.75rem;height:2.75rem;font-size:1.1875rem}.Avatar.size-medium .emoji{width:1rem;height:1rem}.Avatar.size-large{font-size:1.3125rem}.Avatar.size-large i{font-size:3.5rem}.Avatar.size-large .emoji{width:1.3125rem;height:1.3125rem}.Avatar.size-jumbo{width:7.5rem;height:7.5rem;font-size:3.5rem}.Avatar.size-jumbo i{font-size:6rem}.Avatar.size-jumbo .emoji{width:3.5rem;height:3.5rem}.Avatar.online{position:relative}.Avatar.online::after{content:'';display:block;position:absolute;bottom:0.05rem;right:0.05rem;width:0.875rem;height:0.875rem;border-radius:50%;border:2px solid var(--color-background);background-color:#0ac630;flex-shrink:0}.Avatar.interactive{cursor:pointer}.Avatar img:not(.emoji){width:100%;height:100%}\n",".ProgressSpinner{position:relative;z-index:1;width:3.375rem;height:3.375rem;background:rgba(0,0,0,0.25) url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkiIGhlaWdodD0iMTkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjcxNyA5Ljc1TDE4LjMgMi4xNjdhLjY4NC42ODQgMCAxMC0uOTY3LS45NjdMOS43NSA4Ljc4MyAyLjE2NyAxLjJhLjY4NC42ODQgMCAxMC0uOTY3Ljk2N0w4Ljc4MyA5Ljc1IDEuMiAxNy4zMzNhLjY4NC42ODQgMCAxMC45NjcuOTY3bDcuNTgzLTcuNTgzIDcuNTgzIDcuNTgzYS42ODEuNjgxIDAgMDAuOTY3IDAgLjY4NC42ODQgMCAwMDAtLjk2N0wxMC43MTcgOS43NXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjRkZGIiBzdHJva2Utd2lkdGg9Ii43NSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==) no-repeat 49% 49%;border-radius:50%;cursor:pointer}.ProgressSpinner.no-cross{background:transparent !important;pointer-events:none}.ProgressSpinner.square{background-image:none}.ProgressSpinner.square::after{content:'';position:absolute;width:.8125rem;height:.8125rem;border-radius:.125rem;background-color:#fff;left:50%;top:50%;transform:translate3d(-50%, -50%, 0)}.ProgressSpinner.size-s,.ProgressSpinner.size-m{width:auto;height:auto;background:transparent url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjRkZGIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+) no-repeat 49% 49%}.ProgressSpinner.size-s.square,.ProgressSpinner.size-m.square{background-image:none;width:.75rem;height:.75rem}.ProgressSpinner.size-xl{width:3.25rem;height:3.25rem}.ProgressSpinner.size-xl svg{width:3rem;height:3rem;margin:.125rem}.ProgressSpinner.size-xl circle{stroke-width:3px}.ProgressSpinner.transparent{background-color:transparent !important}.ProgressSpinner svg{display:block;transform:rotate(-90deg);transform-origin:50% 50%;animation:4s linear 0s infinite ProgressSpinnerAnimation}.ProgressSpinner circle{transition:stroke-dashoffset .5s}@keyframes ProgressSpinnerAnimation{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}\n",".Modal{position:relative;z-index:var(--z-modal)}.Modal.delete .modal-dialog,.Modal.error .modal-dialog,.Modal.confirm .modal-dialog,.Modal.pin .modal-dialog,.Modal.unpin-all .modal-dialog{max-width:23rem}.Modal.error .modal-content>div{margin-top:1rem}.Modal.narrow .modal-dialog{max-width:20rem}.Modal.report .modal-dialog{max-width:15rem}.Modal .modal-container{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;justify-content:center;align-items:center}.Modal .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:-1;background-color:rgba(0,0,0,0.25)}.Modal.transparent-backdrop .modal-backdrop{background-color:transparent}.Modal .modal-dialog{position:relative;display:inline-flex;flex-direction:column;width:100%;max-width:35rem;min-width:17.5rem;margin:2rem auto;background-color:var(--color-background);box-shadow:0 0.25rem 0.5rem 0.125rem var(--color-default-shadow);border-radius:var(--border-radius-default);transform:translate3d(0, -1rem, 0);transition:transform .2s ease, opacity .2s ease}body.animation-level-0 .Modal .modal-dialog{transition:none;transform:none !important}@media (max-width: 450px){.Modal .modal-dialog{max-width:calc(100vw - 3rem) !important}}.Modal.open .modal-dialog{transform:translate3d(0, 0, 0)}.Modal.closing .modal-dialog{transform:translate3d(0, 1rem, 0)}.Modal .modal-header,.Modal .modal-header-condensed{padding:1rem 1rem 0;display:flex;align-items:center;flex-shrink:0}.Modal .modal-title{font-size:1.25rem;font-weight:500;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis}.Modal .modal-title:not(:only-child){margin:0 1.3125rem}.Modal .modal-header-condensed{padding:.5rem 1.25rem 0 .9375rem !important}.Modal .modal-header-condensed .modal-action-button{font-size:0.875rem;height:2.25rem;width:auto;line-height:1.625rem;margin-left:auto;padding-left:1.25rem;padding-right:1.25rem;min-width:5rem}.Modal .modal-content{width:100%;flex-grow:1;padding:1rem;overflow-y:auto}.Modal .modal-content b,.Modal .modal-content strong{word-break:break-word}.Modal .modal-title,.Modal .modal-content,.Modal .modal-content>p{unicode-bidi:plaintext;text-align:initial}.Modal .dialog-buttons{display:flex;align-items:flex-end}.Modal .dialog-buttons .confirm-dialog-button+.confirm-dialog-button{margin-left:1rem}.Modal .confirm-dialog-button{width:auto;height:auto;margin-left:auto;text-align:right;font-weight:500;white-space:pre-wrap}\n",".ListItem{position:relative}.ListItem .ListItem-button{width:100%;background-color:var(--background-color);border:none !important;box-shadow:none !important;outline:none !important;display:flex;padding:1rem;position:relative;overflow:hidden;line-height:1.5rem;white-space:nowrap;color:var(--color-text);border-radius:var(--border-radius-default);--ripple-color: rgba(0, 0, 0, .08)}.ListItem .ListItem-button>i{font-size:1.5rem;margin-right:2rem;color:var(--color-text-secondary)}.ListItem .user-status,.ListItem .group-status,.ListItem .title,.ListItem .subtitle{text-align:initial;unicode-bidi:plaintext}.ListItem.multiline .ListItem-button>i{position:relative;top:.25rem}.ListItem.disabled{pointer-events:none}.ListItem.disabled .ListItem-button{opacity:0.5}.ListItem:not(.disabled):not(.is-static) .ListItem-button{cursor:pointer}@media (hover: hover){.ListItem:not(.disabled):not(.is-static) .ListItem-button:hover,.ListItem:not(.disabled):not(.is-static) .ListItem-button:focus{--background-color: var(--color-chat-hover)}}@media (max-width: 600px){.ListItem:not(.disabled):not(.is-static) .ListItem-button.active{--background-color: var(--color-chat-hover)}}@media (min-width: 600px){.ListItem:not(.has-ripple):not(.is-static) .ListItem-button:active,body.animation-level-0 .ListItem .ListItem-button:active{--background-color: var(--color-item-active) !important}}.ListItem.has-menu-open .ListItem-button{--background-color: var(--color-chat-hover)}.ListItem.narrow{margin-bottom:0.75rem}.ListItem.narrow .ListItem-button{padding:0.5rem 1rem}.ListItem.inactive{pointer-events:none}.ListItem.focus{--background-color: var(--color-chat-hover)}.ListItem.destructive .ListItem-button{color:var(--color-error)}.ListItem.destructive .ListItem-button i{color:inherit}.ListItem-context-menu{position:absolute}.ListItem-context-menu .bubble{width:auto}.ListItem-context-menu .bubble .MenuItem button{padding-left:1rem !important;padding-right:2rem !important}.ListItem.chat-item-clickable{margin:0 -0.5rem}body.is-ios .ListItem.chat-item-clickable,body.is-macos .ListItem.chat-item-clickable{--color-text-secondary: var(--color-text-secondary-apple)}.ListItem.chat-item-clickable .ListItem-button{padding:.5625rem .6975rem .5625rem .5625rem}.ListItem.chat-item-clickable .Avatar{flex-shrink:0;margin-right:0.5rem}.ListItem.chat-item-clickable .info{flex-grow:1;overflow:hidden}.ListItem.chat-item-clickable .title,.ListItem.chat-item-clickable .subtitle{overflow:hidden;display:flex;justify-content:flex-start;align-items:center}.ListItem.chat-item-clickable h3,.ListItem.chat-item-clickable .last-message,.ListItem.chat-item-clickable .status,.ListItem.chat-item-clickable .typing-status{font-size:1rem;line-height:1.6875rem;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:initial}.ListItem.chat-item-clickable .title h3{font-weight:500}.ListItem.chat-item-clickable .title .VerifiedIcon{width:1.25rem;height:1.25rem;margin-left:0.25rem}.ListItem.chat-item-clickable .title .emoji{vertical-align:text-bottom;background-position:0 0;flex-shrink:0}.ListItem.chat-item-clickable .contact-phone,.ListItem.chat-item-clickable .contact-username{font-size:0.875rem;line-height:1.25rem;color:var(--color-text-secondary)}.ListItem.chat-item-clickable .ChatInfo{display:flex;align-items:center;flex-grow:1;overflow:hidden}.ListItem.chat-item-clickable .ChatInfo .status,.ListItem.chat-item-clickable .ChatInfo .typing-status{font-size:0.875rem;line-height:1.25rem;color:var(--color-text-secondary);display:inline-block}.ListItem.chat-item-clickable .ChatInfo .status.online,.ListItem.chat-item-clickable .ChatInfo .typing-status.online{color:var(--color-primary)}.ListItem.chat-item-clickable .ChatInfo .status[dir=rtl],.ListItem.chat-item-clickable .ChatInfo .status[dir=auto],.ListItem.chat-item-clickable .ChatInfo .typing-status[dir=rtl],.ListItem.chat-item-clickable .ChatInfo .typing-status[dir=auto]{text-align:initial;width:100%}.ListItem.chat-item-clickable .ChatInfo .status .group-status:only-child,.ListItem.chat-item-clickable .ChatInfo .status .user-status:only-child,.ListItem.chat-item-clickable .ChatInfo .typing-status .group-status:only-child,.ListItem.chat-item-clickable .ChatInfo .typing-status .user-status:only-child{display:flow-root}.ListItem.chat-item-clickable .contact-phone,.ListItem.chat-item-clickable .contact-username,.ListItem.chat-item-clickable h3,.ListItem.chat-item-clickable .last-message,.ListItem.chat-item-clickable .status,.ListItem.chat-item-clickable .typing-status{text-align:initial;unicode-bidi:plaintext}body.is-ios .ListItem.chat-item-clickable .last-message,body.is-macos .ListItem.chat-item-clickable .last-message,body.is-ios .ListItem.chat-item-clickable .status,body.is-macos .ListItem.chat-item-clickable .status,body.is-ios .ListItem.chat-item-clickable .typing-status,body.is-macos .ListItem.chat-item-clickable .typing-status{font-size:.9375rem}.ListItem.chat-item-clickable[dir=rtl] .ListItem-button{padding:.5625rem .5625rem .5625rem .6975rem}.ListItem.chat-item-clickable[dir=rtl] .Avatar{margin-left:0.5rem;margin-right:0}.ListItem.chat-item-clickable[dir=rtl] .info>.status{width:100%}.ListItem.search-result-message .title{padding-right:.15rem}.ListItem.search-result-message h3{max-width:80%}.ListItem.search-result-message h3,.ListItem.search-result-message .subtitle{font-size:1rem;line-height:1.5rem;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:left}.ListItem.search-result-message .LastMessageMeta{margin-left:auto;margin-right:0}.ListItem.search-result-message .subtitle{color:var(--color-text-secondary);margin-right:2rem}.ListItem.search-result-message .subtitle .matching-text-highlight{color:var(--color-text);background:#CAE3F7;border-radius:0.25rem;padding:0 0.125rem}.ListItem.search-result-message[dir=rtl] .LastMessageMeta{margin-left:0;margin-right:auto}.ListItem.search-result-message[dir=rtl] .subtitle{margin-right:0;display:block}.ListItem.picker-list-item{margin:0}.ListItem.picker-list-item .ListItem-button{padding-left:0;display:flex;align-items:center}.ListItem.picker-list-item .Avatar{width:3rem;height:3rem}.ListItem.picker-list-item .Checkbox{flex-shrink:0;height:1.5rem;margin:0;padding-left:4rem}.ListItem.picker-list-item[dir=rtl] .Checkbox{padding-left:0;padding-right:4rem}.ListItem .multiline-item{white-space:initial;overflow:hidden}.ListItem .multiline-item .title,.ListItem .multiline-item .subtitle{display:block;text-align:initial}.ListItem .multiline-item .title{line-height:1.25rem;overflow:hidden;text-overflow:ellipsis}.ListItem .multiline-item .subtitle{font-size:0.875rem;line-height:1.5rem;color:var(--color-text-secondary)}.ListItem .multiline-item .subtitle+.subtitle{margin-top:-0.25rem}.ListItem .multiline-item .subtitle.black{color:var(--color-text)}.ListItem[dir=rtl] .ListItem-button>i{margin-left:2rem;margin-right:0}\n",".VerifiedIcon{display:inline-block;flex-shrink:0;width:1.5rem;height:1.5rem;background-image:url(icon-verified.a2a4fb48197a45cb301b64e39d1a8427.svg);background-repeat:no-repeat;background-size:100%;background-position:center}\n",".typing-status{display:flex;align-items:baseline}.typing-status .sender-name::after{content:'\\00a0';color:var(--color-text-secondary)}.typing-status .ellipsis{display:flex;width:1rem;overflow:hidden}.typing-status .ellipsis::after{content:'...';animation:typing-animation 1s steps(4, start) infinite}html[lang=ar] .typing-status .ellipsis::after,html[lang=fa] .typing-status .ellipsis::after{animation-name:typing-animation-rtl}@keyframes typing-animation{from{transform:translateX(-1rem)}}@keyframes typing-animation-rtl{from{transform:translateX(1rem)}}\n",".Notification-container{position:relative;width:24rem;max-width:100vw;margin:.25rem auto;z-index:var(--z-notification)}@media (min-width: 1276px){.Notification-container{transition:transform var(--layer-transition)}}.Notification-container:first-of-type{margin-top:4.25rem}.has-header-tools .Notification-container:first-of-type{margin-top:7.375rem}.Notification{background:rgba(32,32,32,0.8) url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48Y2lyY2xlIGZpbGw9IiNGRkYiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPjxjaXJjbGUgZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJub256ZXJvIiBjeD0iMTIiIGN5PSI2LjUiIHI9IjEuNSIvPjxwYXRoIGQ9Ik0xMiA5LjVjLS41NTIgMC0xIC4zNy0xIC44MjZ2Ny4zNDhjMCAuNDU2LjQ0OC44MjYgMSAuODI2czEtLjM3IDEtLjgyNnYtNy4zNDhjMC0uNDU2LS40NDgtLjgyNi0xLS44MjZ6IiBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L2c+PC9zdmc+\") no-repeat 0.9375rem 50%;background-size:1.5rem;border-radius:var(--border-radius-default);padding:.9375rem .9375rem .9375rem 3.375rem;color:#fff;margin:0 .5rem}.Notification .text-entity-link,.Notification .text-entity-link:hover,.Notification .text-entity-link:active{color:#fff !important;text-decoration:underline}.Notification .content{line-height:1.25;word-break:break-word;font-size:.9375rem}\n",".Radio{display:block;position:relative;padding-left:4.5rem;text-align:left;margin-bottom:1.5rem;line-height:1.5rem;cursor:pointer}.Radio.disabled{pointer-events:none;opacity:0.5}.Radio.hidden-widget{cursor:default}.Radio.hidden-widget .Radio-main::before,.Radio.hidden-widget .Radio-main::after{visibility:hidden}.Radio>input{position:absolute;z-index:var(--z-below);opacity:0}.Radio .Radio-main::before,.Radio .Radio-main::after{content:'';display:block;position:absolute;left:1.0625rem;top:50%;width:1.25rem;height:1.25rem;transform:translateY(-50%)}.Radio .Radio-main::before{border:2px solid var(--color-borders-input);border-radius:50%;background-color:var(--color-background);opacity:1;transition:border-color .1s ease, opacity .1s ease}.Radio .Radio-main::after{left:1.375rem;width:0.625rem;height:0.625rem;border-radius:50%;background:var(--color-primary);opacity:0;transition:opacity .1s ease}.Radio .Radio-main .label{display:block;word-break:break-word;unicode-bidi:plaintext;text-align:left}.Radio .Radio-main .subLabel{display:block;font-size:0.875rem;line-height:1rem;color:var(--color-text-secondary);unicode-bidi:plaintext}.Radio input:checked ~ .Radio-main::before{border-color:var(--color-primary)}.Radio input:checked ~ .Radio-main::after{opacity:1}.Radio.loading .Radio-main::before,.Radio.loading .Radio-main::after{opacity:0 !important}.Radio.loading .Spinner{position:absolute;left:1.0625rem;top:50%;transform:translateY(-50%);opacity:0;animation:fade-in .2s ease forwards;--spinner-size: 1.25rem}.Radio[dir=rtl]{padding-left:0;padding-right:4.5rem}.Radio[dir=rtl] .Radio-main{text-align:right}.Radio[dir=rtl] .Radio-main::before{left:auto;right:1.0625rem}.Radio[dir=rtl] .Radio-main::after{left:auto;right:1.375rem}.Radio[dir=rtl] .label,.Radio[dir=rtl] .subLabel{text-align:right}.Radio[dir=rtl].loading .Spinner{left:auto;right:1.0625rem}@keyframes fade-in{from{opacity:0}to{opacity:1}}\n",".Tab{flex:1 1 auto;-webkit-appearance:none;appearance:none;background:none;width:auto;margin:0;border:none;padding:.625rem .25rem;font-weight:500;color:var(--color-text-secondary);cursor:pointer;border-top-left-radius:var(--border-radius-messages-small);border-top-right-radius:var(--border-radius-messages-small)}.Tab,.Tab:active,.Tab:focus{outline:none}.Tab.active{cursor:default;color:var(--color-primary)}.Tab.active i{opacity:1}.Tab:not(.active):hover{background:var(--color-interactive-element-hover)}.Tab>span{position:relative;display:inline-flex;align-items:center}.Tab .badge{min-width:1.25rem;height:1.25rem;margin-inline-start:0.5rem;background:var(--color-gray);border-radius:0.75rem;padding:0 .3125rem;color:white;font-size:0.875rem;line-height:1.3125rem;font-weight:500;text-align:center;flex-shrink:0}body.is-ios .Tab .badge,body.is-macos .Tab .badge{line-height:1.25rem}.Tab .badge.active{background:var(--color-primary)}.Tab i{position:absolute;bottom:calc(-.625rem - 1px);left:0;opacity:0;background-color:var(--color-primary);height:.1875rem;width:100%;border-radius:.1875rem .1875rem 0 0;pointer-events:none;box-sizing:content-box;transform-origin:left}.Tab i.animate{transition:transform var(--slide-transition)}body.animation-level-0 .Tab i.animate{transition:none !important}\n",".TabList{position:sticky;top:0;flex-shrink:0;display:flex;justify-content:space-between;align-items:flex-end;font-size:.875rem;flex-wrap:nowrap;box-shadow:0 2px 2px var(--color-light-shadow);background-color:var(--color-background);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;scrollbar-color:rgba(0,0,0,0)}.TabList.big{font-size:1rem;--border-radius-messages-small: 0}.TabList::-webkit-scrollbar{height:0}.TabList::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0)}\n",".DeleteChatModal .modal-dialog{max-width:20rem}.DeleteChatModal .modal-header{padding:1.125rem 1.25rem 0}.DeleteChatModal .modal-title:not(:only-child){margin:0 0 0 .75rem}.DeleteChatModal .modal-content{padding:.5rem 1.25rem}.DeleteChatModal .confirm-dialog-button{margin-right:-.625rem}\n",".SearchInput{position:relative;width:100%;color:rgba(var(--color-text-secondary-rgb), 0.5);background-color:var(--color-chat-hover);border:2px solid var(--color-chat-hover);border-radius:1.375rem;transition:border-color 0.15s ease}.SearchInput.with-picker-item{display:flex}.SearchInput.with-picker-item .icon-search{display:none}.SearchInput.with-picker-item input{padding-left:.5rem}.SearchInput.with-picker-item[dir=rtl] input{padding-right:.5rem;padding-left:0}.SearchInput.has-focus{border-color:var(--color-primary);caret-color:var(--color-primary);background-color:var(--color-background)}.SearchInput.has-focus input+i{color:var(--color-primary)}.SearchInput input{height:2.5rem;margin-bottom:0;border:none !important;border-radius:1.375rem;background-color:transparent !important;box-shadow:none !important;padding:calc(0.4375rem - var(--border-width)) calc(2.625rem - var(--border-width)) calc(0.5rem - var(--border-width)) calc(2.625rem - var(--border-width))}.SearchInput input::placeholder{color:var(--color-placeholders)}.SearchInput>i{position:absolute;top:.5rem;left:.75rem;font-size:1.5rem}.SearchInput .Loading{position:absolute;top:.5rem;right:.5rem;height:1.5rem}.SearchInput .Loading .Spinner{--spinner-size: 1.5rem}.SearchInput .Button{position:absolute;top:.125rem;right:.125rem;font-size:1rem}@media (max-width: 600px){.SearchInput input{height:2.5rem;border-radius:1.25rem;padding-left:calc(2.625rem - var(--border-width))}.SearchInput i{top:0.5rem}}.SearchInput[dir=rtl] input{direction:rtl}.SearchInput[dir=rtl]>i{left:auto;right:.75rem}.SearchInput[dir=rtl] .Loading{left:.5rem;right:auto}.SearchInput[dir=rtl] .Button{left:.125rem;right:auto}\n",".PickerSelectedItem{display:flex;align-items:center;background:var(--color-chat-hover);height:2rem;min-width:2rem;margin-left:0.5rem;margin-bottom:0.5rem;padding-right:1rem;border-radius:1rem;cursor:pointer;position:relative;overflow:hidden;flex-shrink:1;transition:background-color .15s ease;max-width:calc(50% - 0.5rem)}.PickerSelectedItem.minimized{padding-right:0}.PickerSelectedItem:hover{background-color:var(--color-item-active)}.PickerSelectedItem.closeable:hover{background-color:rgba(var(--color-error-rgb), 0.16)}.PickerSelectedItem.closeable:hover .item-remove{opacity:1}.PickerSelectedItem.closeable:hover .Avatar,.PickerSelectedItem.closeable:hover .item-icon{opacity:0}.PickerSelectedItem.search-date .item-remove{background:var(--color-primary)}.PickerSelectedItem.search-date:hover{background:var(--color-chat-hover)}.PickerSelectedItem.search-date .item-name{font-size:0.875rem}.SearchInput .PickerSelectedItem{flex:1 0 auto;position:relative;top:.25rem;left:-.125rem;color:var(--color-text-secondary)}.PickerSelectedItem .Avatar,.PickerSelectedItem .item-icon{width:2rem;height:2rem;opacity:1;flex-shrink:0;transition:opacity .15s ease}.PickerSelectedItem .Avatar i,.PickerSelectedItem .item-icon i{font-size:2rem}.PickerSelectedItem .item-icon{display:flex;align-items:center;justify-content:center;padding:0.375rem;border-radius:50%;background-color:var(--color-primary);color:white}.PickerSelectedItem .item-icon i{font-size:1.25rem;position:relative;top:-1px}.PickerSelectedItem .item-name{margin-left:0.5rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.PickerSelectedItem .item-name .emoji.emoji-small{width:1.125rem;height:1.125rem;background-size:1.125rem;vertical-align:-2px}.PickerSelectedItem .item-remove{position:absolute;left:0;top:0;width:2rem;height:2rem;border-radius:50%;display:flex;align-items:center;justify-content:center;background-color:var(--color-error);font-size:1.5rem;color:white;opacity:0;transition:opacity .15s ease}.PickerSelectedItem[dir=rtl]{padding-left:1rem;padding-right:0}.PickerSelectedItem[dir=rtl].minimized{padding-right:0;padding-left:0}.SearchInput .PickerSelectedItem[dir=rtl]{left:auto;right:-.125rem}.PickerSelectedItem[dir=rtl] .item-name{margin-left:0;margin-right:0.5rem}.PickerSelectedItem[dir=rtl] .item-remove{left:auto;right:0}\n",".MessageOutgoingStatus{width:1.19rem;height:1.19rem;overflow:hidden;display:inline-block;line-height:1;font-size:1.1875rem}.MessageOutgoingStatus i{background:var(--background-color)}.MessageOutgoingStatus .icon-message-succeeded{padding-left:0.13rem}.MessageOutgoingStatus .Transition{width:100%;height:100%}\n",".LastMessageMeta{margin-right:.2rem;padding:.3rem 0 .15rem;flex-shrink:0;font-size:0.75rem;line-height:1;display:flex;align-items:center}.LastMessageMeta .MessageOutgoingStatus{color:var(--color-text-meta-colored);margin-right:0.1rem;font-size:1.15rem}body.is-ios .LastMessageMeta .MessageOutgoingStatus{margin-bottom:-.125rem}.LastMessageMeta .time{color:var(--color-text-meta);line-height:1.15rem}\n",".Badge-transition{opacity:1;transition:transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1)}.Badge-transition:not(.open){transform:scale(0);opacity:0}.Badge-transition:not(.shown){display:none}.Badge-transition.closing{transition:transform .2s ease-out, opacity .2s ease-out}.Badge-wrapper{display:flex}.Badge-wrapper .Badge{margin-inline-start:.5rem}.Badge{min-width:1.5rem;height:1.5rem;background:var(--color-gray);border-radius:0.75rem;padding:0 .4375rem;color:white;font-size:0.875rem;line-height:1.5625rem;font-weight:500;text-align:center;flex-shrink:0}body.is-macos .Badge{line-height:1.5rem}body.is-ios .Badge{line-height:1.375rem;min-width:1.375rem;height:1.375rem;padding:0 .375rem}.Badge.mention,.Badge.unread:not(.muted){background:var(--color-green);color:var(--color-white)}.Badge.pinned:not(.unread){color:var(--color-pinned);background:transparent;width:1.5rem;padding:0}.Badge.pinned:not(.unread) i{font-size:1.5rem}.Badge.mention{width:1.5rem;padding:0.25rem}.Badge.mention i{font-size:1rem;vertical-align:super}body.is-ios .Badge.mention{width:1.375rem;padding:0.25rem}body.is-ios .Badge.mention i{font-size:.875rem}\n",".Chat{--background-color: var(--color-background);position:absolute;top:0;left:0;margin:0;width:100%}body.is-ios .Chat,body.is-macos .Chat{--color-text-meta: var(--color-text-meta-apple)}.Chat.animate-opacity{will-change:opacity;transition:opacity .2s ease-out}.Chat.animate-transform{will-change:transform;transition:transform .2s ease-out}.Chat:hover .Avatar.online::after,.Chat.ListItem.has-menu-open .Avatar.online::after{border-color:var(--color-chat-hover)}@media (max-width: 600px){.Chat.selected{--background-color: var(--color-chat-hover) !important}.Chat.selected .Avatar.online::after{border-color:var(--color-chat-hover)}}@media (min-width: 600px){.Chat.selected,.Chat.selected:hover{--background-color: var(--color-chat-active) !important}.Chat.selected .Avatar.online::after,.Chat.selected:hover .Avatar.online::after{border-color:var(--color-chat-active) !important;background:var(--color-white)}.Chat.selected .ListItem-button,.Chat.selected:hover .ListItem-button{--background-color: var(--color-chat-active) !important;--color-text: var(--color-white);--color-text-meta-colored: var(--color-white);--color-text-meta: var(--color-white);--color-text-secondary: var(--color-white);--color-error: var(--color-white);--color-pinned: var(--color-white)}.Chat.selected .icon-muted-chat,.Chat.selected:hover .icon-muted-chat{color:var(--color-white) !important}.Chat.selected .Badge:not(.pinned),.Chat.selected:hover .Badge:not(.pinned){background:var(--color-white);color:var(--color-chat-active)}}.Chat .status{flex-shrink:0}.Chat .info .title,.Chat .info .subtitle{padding-right:.125rem}.Chat .info .subtitle{margin-top:-.125rem}.Chat .info h3{width:auto;max-width:80%}.Chat .info .icon-muted-chat{font-size:1.25rem;margin-left:0.25rem;margin-top:-.0625rem;color:#C6C8CA}body.is-ios .Chat .info .icon-muted-chat{margin-top:0;margin-right:.5rem}.Chat .info .LastMessageMeta{margin-left:auto}body.is-ios .Chat .info .LastMessageMeta{font-size:.875rem;margin-right:0}.Chat .info .last-message,.Chat .info .typing-status{padding-right:0.25rem;flex-grow:1;color:var(--color-text-secondary);unicode-bidi:plaintext}.Chat .info .last-message[dir=ltr],.Chat .info .typing-status[dir=ltr]{text-align:left}.Chat .info .last-message .sender-name,.Chat .info .typing-status .sender-name{color:var(--color-text)}.Chat .info .last-message .draft,.Chat .info .typing-status .draft{color:var(--color-error)}.Chat .info .last-message .draft::after{content:': '}.Chat .info .last-message .colon{margin-inline-end:.25rem}.Chat .info .last-message img{width:1.25rem;height:1.25rem;object-fit:cover;border-radius:.125rem;vertical-align:-.25rem;margin-inline-end:.25rem}body.is-ios .Chat .info .last-message img{width:1.125rem;height:1.125rem;vertical-align:-.1875rem}.Chat .info .last-message img.round{border-radius:.625rem}.Chat .info .last-message .emoji-small{width:1rem;height:1rem;vertical-align:-.125rem}.Chat .info .last-message .icon-play{position:relative;display:inline-block;font-size:.75rem;color:#fff;margin-inline-start:-1.25rem;margin-inline-end:0.5rem;bottom:0.0625rem}body.is-ios .Chat .info .last-message .icon-play{margin-inline-start:-1.125rem;bottom:0}.Chat[dir=rtl] .info .LastMessageMeta{margin-left:0;margin-right:auto}.Chat[dir=rtl] .info .title,.Chat[dir=rtl] .info .subtitle{padding-left:.15rem;padding-right:0}.Chat[dir=rtl] .info .icon-muted-chat{margin-left:0;margin-right:0.25rem}.Chat[dir=rtl] .info .last-message,.Chat[dir=rtl] .info .typing-status{padding-left:0.5rem;padding-right:0;text-align:right;unicode-bidi:plaintext}\n",".NothingFound{display:flex;align-items:center;justify-content:center;color:var(--color-text-meta)}.NothingFound.with-description{flex-direction:column}.NothingFound .AnimatedSticker{margin:0 auto}.NothingFound .description{color:var(--color-text-secondary);font-size:.875rem;text-align:center;margin:1rem 0 0;unicode-bidi:plaintext}\n",".Media{height:0;padding-bottom:100%;overflow:hidden;position:relative;cursor:pointer}.Media .video-duration{position:absolute;left:.25rem;top:.25rem;background:rgba(0,0,0,0.25);color:#fff;font-size:.75rem;padding:0 .3125rem;border-radius:.1875rem;line-height:1.125rem}.Media img{position:absolute;left:0;top:0;width:100%;height:100%;object-fit:cover}\n",".WebLink{min-height:3rem;padding:.25rem 0 0 3.75rem;font-size:0.875rem;line-height:1.125rem;position:relative}.WebLink+.WebLink{margin-top:1.5rem}.WebLink.without-media::before{content:attr(data-initial);width:3rem;height:3rem;position:absolute;left:0;top:0;background-color:var(--color-webpage-initial-background);color:#fff;display:flex;align-items:center;justify-content:center;border-radius:var(--border-radius-messages-small);text-transform:uppercase;font-weight:500;font-size:1.5rem}.WebLink .Media{position:absolute;left:0;top:0;width:3rem;height:3rem;cursor:default !important;padding-bottom:unset !important;border-radius:var(--border-radius-messages-small) !important}.WebLink .site-name,.WebLink .site-description,.WebLink .site-title{word-break:break-word;text-align:initial}.WebLink .site-name{display:block;color:var(--color-links);font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.WebLink .site-title{font-size:1rem;font-weight:400;margin-bottom:.0625rem;line-height:1.3125rem}.WebLink .sender-name,.WebLink .site-description{margin-bottom:0;color:var(--color-text-secondary);line-height:1.125rem;max-height:2.25rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.WebLink .sender-name{margin-top:.25rem}.WebLink .site-description .emoji{width:1rem !important;height:1rem !important}.WebLink[dir=rtl]{padding:.25rem 3.75rem 0 0}.WebLink[dir=rtl] .Media,.WebLink[dir=rtl].without-media::before{left:auto;right:0}.WebLink[dir=rtl] .content{text-align:right}\n",".File{--secondary-color: var(--color-text-secondary);display:flex;align-items:center}.Message.own .File{--secondary-color: var(--color-text-green)}.content-inner .File{min-width:14rem}@media (max-width: 340px){.content-inner .File{min-width:11rem}}.File .file-icon-container{position:relative}.File .file-progress,.File .file-icon,.File .file-preview{width:3.375rem;height:3.375rem;margin-inline-end:.75rem;border-radius:var(--border-radius-messages-small);background:var(--color-primary);display:flex;align-items:center;justify-content:center}.File .file-progress{position:absolute;top:0;left:0}.File .file-icon{padding:1rem .75rem .5rem;align-items:flex-end;flex-shrink:0;position:relative;color:white}.File .file-icon .file-ext{font-size:1rem;font-weight:500;transition:opacity .15s}.File .file-icon::after{content:\"\";display:block;position:absolute;top:0;right:0;border-bottom-left-radius:0.25rem;background:rgba(0,0,0,0.25);border-color:transparent var(--background-color) transparent var(--background-color);border-width:0 1.125rem 1.125rem 0;border-style:solid;transition:border-width .15s ease-in}.File .file-preview{background:transparent;overflow:hidden}.File .file-preview+.action-icon,.File .file-preview+.file-progress{background:rgba(0,0,0,0.5);border-radius:var(--border-radius-messages-small)}.File .file-preview img{object-fit:cover}.File .action-icon{color:#fff;font-size:1.5rem;position:absolute;top:0;start:0;width:3.375rem;height:3.375rem;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .25s}.File.interactive .file-icon-container{cursor:pointer}.File.interactive .file-icon-container:hover .file-icon::after{border-width:0}.File.interactive .file-icon-container:hover .action-icon{opacity:1}.File.interactive .file-icon-container:hover .action-icon.hidden{opacity:0}.File.interactive .file-icon-container:hover .file-ext{opacity:0}.File .file-info{margin-top:.1875rem;margin-right:.125rem;white-space:nowrap;overflow:hidden;flex-grow:1}.File .file-info+.Link{font-size:.75rem;color:var(--color-text-secondary);padding-left:1rem;white-space:nowrap}.File .file-title{font-size:1rem;line-height:1.5rem;font-weight:500;overflow:hidden;text-overflow:ellipsis}.File .file-title .emoji{vertical-align:-4px}.File .file-subtitle{font-size:.875rem;line-height:.9375rem;color:var(--secondary-color);max-width:100%;overflow:hidden;text-overflow:ellipsis}.File .file-subtitle span+span::before{content:'\\00a0\\2022\\00a0'}.File.smaller{--background-color: var(--color-background);--border-radius-messages-small: .3125rem}.File.smaller .action-icon,.File.smaller .file-progress,.File.smaller .file-icon,.File.smaller .file-preview{width:3rem;height:3rem}.File.smaller .file-icon{padding-bottom:.375rem}.File.smaller .file-icon::after{border-width:0 1rem 1rem 0}.File.smaller .file-info{margin-top:-.125rem}.File.smaller .file-title{font-weight:400}.File.smaller .file-subtitle{line-height:1rem}.File:dir(rtl) .file-progress,.File:dir(rtl) .file-icon,.File:dir(rtl) .file-preview,.File[dir=rtl] .file-progress,.File[dir=rtl] .file-icon,.File[dir=rtl] .file-preview{margin-left:.75rem;margin-right:0}.File:dir(rtl) .file-info,.File[dir=rtl] .file-info{text-align:right}.File:dir(rtl) .file-info+.Link,.File[dir=rtl] .file-info+.Link{padding-left:0;padding-right:1rem}.File:dir(rtl) .action-icon,.File[dir=rtl] .action-icon{left:auto;right:0}.File .file-progress.red,.File .file-icon.red{background-color:var(--color-error)}.File .file-progress.orange,.File .file-icon.orange{background-color:var(--color-warning)}.File .file-progress.green,.File .file-icon.green{background-color:var(--color-text-green)}\n",".Audio{display:flex;align-items:flex-start}.Audio.media-inner{overflow:visible}.Audio.own{--color-text-secondary: var(--accent-color);--color-interactive-active: var(--color-text-green);--color-interactive-inactive: rgba(var(--color-text-green-rgb), 0.4);--color-interactive-buffered: rgba(var(--color-text-green-rgb), 0.4)}.theme-dark .Audio.own{--color-text-green-rgb: 255, 255, 255;--color-text-green: var(--color-white)}.Audio.own .Button{--color-primary: var(--color-text-green);--color-primary-shade: var(--color-green);--color-primary-shade-darker: var(--color-green-darker);--color-white: var(--color-background-own)}.theme-dark .Audio.own .Button{--color-primary-shade: #fff;--color-primary-shade-darker: #fff}.Audio .toggle-play{margin-inline-end:.5rem}.Audio .toggle-play.smaller{width:3rem;height:3rem;margin-inline-end:.75rem}.Audio .toggle-play.smaller i{font-size:1.625rem;margin-top:-.025rem}.Audio .toggle-play i{position:absolute}.Audio .toggle-play i.icon-play{margin-left:.125rem}@media (max-width: 600px){.Audio .toggle-play i.icon-play{margin-left:.0625rem}}.Audio .toggle-play .icon-play,.Audio .toggle-play .icon-pause{opacity:1;transform:scale(1);transition:opacity 0.4s,transform 0.6s cubic-bezier(0.34, 1.56, 0.64, 1)}.Audio .toggle-play.play .icon-pause,.Audio .toggle-play.pause .icon-play,.Audio .toggle-play.loading .icon-play,.Audio .toggle-play.loading .icon-pause{opacity:0;transform:scale(0.5)}.Audio .media-loading{pointer-events:none}.Audio .media-loading .interactive{pointer-events:auto}.Audio .download-button{position:absolute;width:1.125rem !important;height:1.125rem !important;padding:0;left:1.5rem;top:1.5rem;border:0.125rem solid var(--background-color);z-index:1}.Audio .download-button i{font-size:0.8125rem}.Audio.bigger .download-button{left:2rem;top:2rem;border:0.125rem solid var(--color-background)}.Audio .content{align-self:center;min-width:0;flex-grow:1;text-align:initial}.Audio .content-row{display:flex;justify-content:space-between}.Audio .title{font-weight:500;margin:0;line-height:1.25;overflow:hidden;text-overflow:ellipsis}.Audio .voice-duration{margin:.25rem 0 0;font-size:.875rem;color:var(--color-text-secondary)}.Audio .voice-duration span{margin-left:0.25rem;font-size:1.5rem;line-height:.875rem;vertical-align:middle}.Audio:not(.own) .voice-duration span{color:var(--color-primary)}.Audio .waveform{cursor:pointer;margin-left:1px}.Audio .meta,.Audio .performer,.Audio .date{font-size:.875rem;line-height:1;color:var(--color-text-secondary);margin:0}.Audio .duration{margin:.1875rem 0 0;font-size:.875rem;color:var(--color-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.Audio .seekline{width:calc(100% - 2px);padding-left:6px;margin-bottom:.3125rem;height:12px;position:relative;margin-left:-6px;top:1px;cursor:pointer}.Audio .seekline::before{content:'';position:absolute;width:100%;left:6px;top:6px;height:2px;background-color:var(--color-interactive-inactive);border-radius:2px}.Audio .seekline-buffered-progress,.Audio .seekline-play-progress{position:absolute;height:2px;border-radius:2px;overflow:hidden;width:100%;top:6px;left:6px}.Audio .seekline-buffered-progress i,.Audio .seekline-play-progress i{position:absolute;width:100%;background-color:var(--color-interactive-active);height:2px;border-radius:2px;right:100%}.Audio .seekline-buffered-progress i{background-color:var(--color-interactive-buffered) !important}.Audio .seekline-thumb{position:absolute;width:100%;top:7px;left:0}.Audio .seekline-thumb i{pointer-events:none;position:absolute;width:100%;right:100%}.Audio .seekline-thumb i::after{content:'';position:absolute;top:-6px;right:-12px;width:12px;height:12px;border-radius:6px;background:var(--color-interactive-active)}.Audio.bigger .content{margin-top:.1875rem}.Audio.bigger .title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:400;line-height:1.5rem}.Audio.bigger .meta,.Audio.bigger .performer,.Audio.bigger .date{line-height:1.0625rem}.Audio.bigger .seekline{top:2px;margin-bottom:.5rem}.Audio.bigger .duration{line-height:1rem}.Audio.bigger .media-loading{top:0.1875rem;left:0.1875rem}.Audio.bigger[dir=rtl] .media-loading{left:auto !important;right:0}.Audio .ProgressSpinner.size-s svg{width:2.25rem;height:2.25rem}.Audio[dir=rtl] .toggle-play{margin-left:.5rem;margin-right:0}.Audio[dir=rtl] .toggle-play.smaller{margin-left:.75rem;margin-right:0}.Audio[dir=rtl] .content,.Audio[dir=rtl] .duration{text-align:right}.Audio[dir=rtl] .download-button{left:auto;right:1.5rem}\n",".DropTarget{border-radius:var(--border-radius-default);background:var(--color-background);padding:1.25rem;flex:1 1 auto;width:100%;max-width:43.75rem;margin-left:auto;margin-right:auto;margin-bottom:.3125rem;display:flex;color:#A4ACB3;box-shadow:0 1px 2px var(--color-default-shadow)}@media (max-height: 350px){.DropTarget{padding:.75rem}}.DropTarget.hovered .target-content{color:var(--color-primary);background-image:var(--drag-target-border-hovered)}.DropTarget+.DropTarget{margin-top:.3125rem}.DropTarget:last-child{margin-bottom:0}.DropTarget .target-content{pointer-events:none;background-image:var(--drag-target-border);border-radius:.5rem;flex:1 1 100%;display:flex;flex-direction:column;align-items:center;justify-content:center;transition:.2s color, .2s background}.DropTarget .icon{font-size:6.25rem;line-height:4.6875rem;margin-bottom:2.25rem}@media (max-height: 520px){.DropTarget .icon{font-size:4.25rem;line-height:3.5rem;margin-bottom:1rem}}@media (max-height: 450px){.DropTarget .icon{font-size:2rem;line-height:1rem;margin-bottom:.5rem;margin-top:.25rem}}.DropTarget .title{font-size:1.3125rem;font-weight:500;letter-spacing:-.18px}@media (max-height: 450px){.DropTarget .title{font-size:1rem}}.DropTarget .description{font-size:1rem;letter-spacing:.3px}@media (max-height: 450px){.DropTarget .description{font-size:.875rem}}\n",".FloatingActionButton{position:absolute;right:1rem;bottom:1rem;transform:translateY(5rem);transition:transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1)}body.animation-level-0 .FloatingActionButton{transition:none !important}.FloatingActionButton.revealed{transform:translateY(0)}\n",".DropArea{position:absolute;top:0;right:0;left:0;height:100vh;z-index:var(--z-drop-area);padding:80px 20px 20px;display:flex;flex-direction:column}#Main.right-column-open .DropArea{max-width:calc(100% - var(--right-column-width))}\n",".AnimatedEmoji{margin-bottom:0.75rem}.AnimatedEmoji img{position:absolute;width:100%;height:100%}.AnimatedEmoji img.like-sticker-thumb{transform:scale(0.8)}\n",".TextFormatter{transform:translate(-50%, -3.25rem)}.TextFormatter,.TextFormatter-link-control{position:absolute;background:var(--color-background);border-radius:var(--border-radius-messages);padding:0.5rem 0.375rem;box-shadow:0 1px 2px var(--color-default-shadow)}.TextFormatter-link-control{left:0;top:0;opacity:0;pointer-events:none;transition:opacity .3s ease}.Modal .TextFormatter-link-control{max-width:100%}@media (max-width: 600px){.TextFormatter-link-control{max-width:calc(100vw - var(--text-formatter-left) + 3rem)}}.TextFormatter-link-control input{border:none !important;outline:none !important;width:100%;color:var(--color-text);background-color:var(--color-background)}.TextFormatter-buttons,.TextFormatter-link-url-confirm{display:flex;flex-wrap:nowrap;align-items:center}.TextFormatter-divider{width:1px;height:1.75rem;margin:0 0.25rem;background-color:var(--color-borders)}.TextFormatter-link-url-input-wrapper{width:20rem;position:relative;max-width:100%}@media (max-width: 600px){.TextFormatter-link-url-input-wrapper{max-width:90vw}}.TextFormatter-link-url-input-wrapper::before,.TextFormatter-link-url-input-wrapper::after{content:\"\";display:block;position:absolute;top:0;bottom:0;width:1rem;z-index:2;opacity:0;transition:opacity .2s ease}.TextFormatter-link-url-input-wrapper::before{left:0;background:linear-gradient(to right, var(--color-background) 0.25rem, transparent 1rem)}.TextFormatter-link-url-input-wrapper::after{right:0;background:linear-gradient(to left, var(--color-background) 0.25rem, transparent 1rem)}.TextFormatter-link-url-input-wrapper.mask-left::before{opacity:1}.TextFormatter-link-url-input-wrapper.mask-right::after{opacity:1}.TextFormatter-link-url-confirm{flex-shrink:0;opacity:0;transition:opacity .3s ease}.TextFormatter-link-url-confirm.shown{opacity:1}.TextFormatter.link-control-shown .TextFormatter-link-control{opacity:1;pointer-events:all}.TextFormatter .Button{width:2rem;height:2rem;padding:0.25rem;font-size:1.5rem;margin:0 0.125rem;border-radius:var(--border-radius-messages-small);flex-shrink:0;cursor:pointer}.TextFormatter .Button.active{background-color:var(--color-primary) !important;color:white}.TextFormatter .Button.disabled{opacity:.5;pointer-events:none}\n",".Picker{height:100%;display:flex;flex-direction:column;overflow:hidden}.Picker .picker-header{padding:0 1rem 0.25rem 0.75rem;border-bottom:1px solid var(--color-borders);display:flex;flex-flow:row wrap;flex-shrink:0;overflow-y:auto;max-height:20rem}.Picker .picker-header .input-group{margin-bottom:0.5rem;margin-left:0.5rem;flex-grow:1}.Picker .picker-header .form-control{height:2rem;border:none;border-radius:0;padding:0;box-shadow:none}.Picker .picker-list{flex-grow:1;overflow-y:auto;overflow-x:hidden;padding:0.5rem}@media (max-width: 600px){.Picker .picker-list{padding-left:0 !important;padding-right:0 !important}}.Picker .no-results{height:100%;margin:0;padding:1rem 1rem;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary)}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/0.e48232bc26b8d2aff6ea.js b/dist/0.e48232bc26b8d2aff6ea.js deleted file mode 100644 index ad1d8e8c7..000000000 --- a/dist/0.e48232bc26b8d2aff6ea.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],Array(108).concat([function(e,t,n){"use strict";var a=n(0),r=n(6),c=n(10),s=n(9),i=n(148),o=n(179),l=n(25),d=n(16),u=n(44),m=n(55),b=n(43);n(213);t.a=e=>{const{ref:t,buttonRef:n,icon:h,className:f,style:p,children:O,disabled:g,ripple:v,narrow:j,inactive:E,focus:y,destructive:C,multiline:N,isStatic:T,contextActions:w,onClick:M}=e;let I=Object(a.q)(null);t&&(I=t);const[S,L,k]=Object(l.a)(),{isContextMenuOpen:A,contextMenuPosition:x,handleBeforeContextMenu:D,handleContextMenu:R,handleContextMenuClose:_,handleContextMenuHide:P}=Object(i.a)(I,!w),F=Object(a.m)(()=>I.current,[]),U=Object(a.m)(()=>I.current.closest(".custom-scroll"),[]),B=Object(a.m)(()=>I.current.querySelector(".ListItem-context-menu .bubble"),[]),{positionX:q,positionY:H,style:$}=Object(o.a)(x,F,U,B),K=Object(a.m)(e=>{!g&&M&&(M(e),r.n&&!v&&(L(),Object(c.b)(k)))},[g,L,M,v,k]),V=Object(a.m)(e=>{E||r.n||(!w||2!==e.button&&M||D(e),0===e.button&&(M?K(e):R(e)))},[E,w,M,D,R,K]),z=Object(d.a)(),Y=Object(s.a)("ListItem",f,!T&&"no-selection",v&&"has-ripple",j&&"narrow",g&&"disabled",E&&"inactive",x&&"has-menu-open",y&&"focus",C&&"destructive",N&&"multiline",T&&"is-static");return a.a.createElement("div",{ref:I,className:Y,dir:z.isRtl?"rtl":void 0,style:p},a.a.createElement("div",{className:Object(s.a)("ListItem-button",S&&"active"),role:"button",ref:n,tabIndex:0,onClick:!E&&r.n?K:void 0,onMouseDown:V,onContextMenu:!E&&w?R:void 0},h&&a.a.createElement("i",{className:"icon-"+h}),N&&a.a.createElement("div",{className:"multiline-item"},O),!N&&O,!g&&!E&&v&&a.a.createElement(u.a,null)),w&&void 0!==x&&a.a.createElement(m.a,{isOpen:A,positionX:q,positionY:H,style:$,className:"ListItem-context-menu",autoClose:!0,onClose:_,onCloseAnimationEnd:P},w.map(e=>a.a.createElement(b.a,{key:e.title,icon:e.icon,destructive:e.destructive,disabled:!e.handler,onClick:e.handler},e.title))))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"c",(function(){return i})),n.d(t,"b",(function(){return o}));var a=n(0),r=n(10),c=n(37);function s({rootRef:e,throttleMs:t,debounceMs:n,shouldSkipFirst:s,margin:i,threshold:o,isDisabled:l},d){const u=Object(a.q)(),m=Object(a.q)(),b=Object(a.q)(0),h=Object(a.q)();m.current=d;const f=Object(a.m)(()=>{b.current++},[]),p=Object(a.m)(()=>{b.current&&(b.current--,!b.current&&h.current&&(h.current(),h.current=void 0))},[]);Object(c.c)(f,p),Object(a.n)(()=>{if(!l)return()=>{u.current&&(u.current.observer.disconnect(),u.current.callbacks.clear(),u.current=void 0)}},[l]);return{observe:Object(a.m)((a,c)=>{u.current||function(){const a=new Map,c=new Map,l=()=>{const e=Array.from(c.values());e.forEach(t=>{const n=a.get(t.target);n&&n(t,e)}),m.current&&m.current(e),c.clear()},d=t?r.h:n?r.a:void 0,f=d?d(l,t||n,!s):l,p=new IntersectionObserver(e=>{e.forEach(e=>{c.set(e.target,e)}),b.current?h.current=()=>{f()}:f()},{root:e.current,rootMargin:i?i+"px":void 0,threshold:o});u.current={observer:p,callbacks:a}}();const l=u.current;return l.observer.observe(a),c&&l.callbacks.set(a,c),()=>{c&&l.callbacks.delete(a),l.observer.unobserve(a)}},[l]),freeze:f,unfreeze:p}}function i(e,t,n){Object(a.n)(()=>t?t(e.current,n):void 0,[])}function o(e,t,n){const[r,c]=Object(a.r)(!t);return i(e,t,e=>{c(e.isIntersecting),n&&n(e)}),r}},function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(57),s=n(31);t.a=(e,t=!1,n=r.ApiMediaFormat.BlobUrl,i,o)=>{const l=e?c.c(e):void 0,d=Object(s.a)();return Object(a.n)(()=>{if(!t&&e&&!l){const t=Date.now();c.b(e,n).then(()=>{const e=Date.now()-t;!o||e>=o?d():setTimeout(d,o-e)})}},[t,e,l,n,i,d,o]),l}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(13),s=n(7),i=n(4),o=n(22),l=n(3),d=n(16),u=n(114),m=n(137),b=n(158);t.a=Object(a.h)(Object(r.h)((e,{userId:t,forceShowSelf:n})=>{const{lastSyncTime:a,serverTimeOffset:r}=e,c=Object(s.Jb)(e,t);return{lastSyncTime:a,user:c,isSavedMessages:!n&&c&&c.isSelf,areMessagesLoaded:Boolean(Object(s.n)(e,t)),serverTimeOffset:r}},(e,t)=>Object(l.l)(t,["loadFullUser","openMediaViewer"]))(({typingStatus:e,avatarSize:t="medium",status:n,withMediaViewer:r,withUsername:s,withFullInfo:l,withUpdatingStatus:h,noStatusOrTyping:f,noRtl:p,user:O,isSavedMessages:g,areMessagesLoaded:v,lastSyncTime:j,loadFullUser:E,openMediaViewer:y,serverTimeOffset:C})=>{const{id:N}=O||{},T=Object(i.bb)(O);Object(a.n)(()=>{l&&j&&N&&E({userId:N})},[N,E,j,l]);const w=Object(a.m)((e,n)=>{O&&n&&(e.stopPropagation(),y({avatarOwnerId:O.id,origin:"jumbo"===t?c.h.ProfileAvatar:c.h.MiddleHeaderAvatar}))},[O,t,y]),M=Object(d.a)();if(O)return a.a.createElement("div",{className:"ChatInfo",dir:!p&&M.isRtl?"rtl":void 0},a.a.createElement(u.a,{key:O.id,size:t,user:O,isSavedMessages:g,onClick:r?w:void 0}),a.a.createElement("div",{className:"info"},g?a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,M("SavedMessages"))):a.a.createElement("div",{className:"title"},a.a.createElement("h3",{dir:"auto"},T&&Object(o.a)(T)),O&&O.isVerified&&a.a.createElement(m.a,null)),(n||!g&&!f)&&(n?a.a.createElement("span",{className:"status",dir:"auto"},n):h&&!v?a.a.createElement("span",{className:"status",dir:"auto"},M("Updating")):O?e?a.a.createElement(b.a,{typingStatus:e}):a.a.createElement("div",{className:"status "+(Object(i.Cb)(O)?"online":"")},s&&O.username&&a.a.createElement("span",{className:"handle"},O.username),a.a.createElement("span",{className:"user-status",dir:"auto"},Object(i.cb)(M,O,C))):void 0)))}))},function(e,t,n){"use strict";var a=n(0),r=n(56);var c=n(9),s=n(37),i=n(40),o=n(58),l=n(16),d=n(39),u=n(21),m=n(127);n(153);t.a=({title:e,className:t,isOpen:n,header:b,hasCloseButton:h,noBackdrop:f,children:p,onClose:O,onCloseAnimationEnd:g,onEnter:v,shouldSkipHistoryAnimations:j})=>{const{shouldRender:E,transitionClassNames:y}=Object(i.a)(n,g,j,void 0,j),C=Object(a.q)(null);Object(a.n)(()=>n?Object(r.a)({onEsc:O,onEnter:v}):void 0,[n,O,v]),Object(a.n)(()=>n&&C.current?function(e){function t(t){if("Tab"!==t.key)return;t.preventDefault(),t.stopPropagation();const n=Array.from(e.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'));if(!n.length)return;const a=n.findIndex(e=>e.isSameNode(document.activeElement));let r=0;a>=0&&(r=t.shiftKey?a>0?a-1:n.length-1:a{document.removeEventListener("keydown",t,!1)}}(C.current):void 0,[n]);const{forceClose:N}=Object(d.a)(n,O);Object(a.n)(()=>()=>{n&&N()},[]),Object(o.a)(([e])=>(document.body.classList.toggle("has-open-dialog",n),(n||!n&&void 0!==e)&&Object(s.d)(200),()=>{document.body.classList.remove("has-open-dialog")}),[n]);const T=Object(l.a)();if(!E)return;const w=Object(c.a)("Modal",t,y,f&&"transparent-backdrop");return a.a.createElement(m.a,null,a.a.createElement("div",{ref:C,className:w,tabIndex:-1,role:"dialog"},a.a.createElement("div",{className:"modal-container"},a.a.createElement("div",{className:"modal-backdrop",onClick:O}),a.a.createElement("div",{className:"modal-dialog"},b||(e?a.a.createElement("div",{className:"modal-header"},h&&a.a.createElement(u.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:T("Close"),onClick:O},a.a.createElement("i",{className:"icon-close"})),a.a.createElement("div",{className:"modal-title"},e)):void 0),a.a.createElement("div",{className:"modal-content custom-scroll"},p)))))}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(31),s=n(29),i=n(9),o=n(37),l=n(175);n(199);const d=Symbol("CLEANED_UP");t.a=({ref:e,activeKey:t,name:n,direction:u="auto",renderCount:m,shouldRestoreHeight:b,shouldCleanup:h,cleanupExceptionKey:f,id:p,className:O,onStart:g,onStop:v,children:j})=>{const{animationLevel:E}=Object(r.e)().settings.byKey;let y=Object(a.q)(null);e&&(y=e);const C=Object(a.q)({}),N=Object(s.a)(t),T=Object(c.a)(),w=void 0!==N&&t!==N;!m&&w&&(C.current={[N]:C.current[N]}),C.current[t]=j,Object(a.o)(()=>{function e(){!h||void 0!==f&&f===N||(C.current={[N]:d},T())}const a=y.current,r=a.children;if(1===r.length&&!w)return void r[0].classList.add("active");const c=Array.from(a.childNodes);if(!w||!c.length)return;const s=-1===u||"auto"===u&&N>t||"inverse"===u&&N{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===O))}),void e();let j;c.forEach((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("active"),e.classList.toggle("from",t===p),e.classList.toggle("through",t>p&&tO),e.classList.toggle("to",t===O))}),E>0&&(j=Object(o.d)()),requestAnimationFrame(()=>{function t(){requestAnimationFrame(()=>{if(a.classList.remove("animating","backwards"),c.forEach((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle("active",t===O))}),b){const e=a.querySelector(".active");e&&(e.style.height="auto",a.style.height=e.clientHeight+"px")}j&&j(),e(),v&&v()})}if(a.classList.add("animating"),E>0){const e="mv-slide"===n?c[O].firstChild:c[O];Object(l.a)(e,t)}else t();g&&g()})},[t,N,w,u,n,g,v,m,b,h,f,E,T]),Object(a.o)(()=>{if(b){const e=y.current,t=e.querySelector(".active")||e.querySelector(".from");t&&(t.style.height="auto",e.style.height=t.clientHeight+"px",e.style.flexBasis=t.clientHeight+"px")}},[b,j]);const M=C.current,I=Object.keys(m?new Array(m).fill(void 0):M).map(Number).map(e=>{const n=M[e];return"function"==typeof n?a.a.createElement("div",{key:e},n(e===t,e===N,t)):void 0}),S=Object(i.a)("Transition",O,n);return a.a.createElement("div",{ref:y,id:p,className:S},I)}},function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(2),s=n(4),i=n(50),o=n(9),l=n(22),d=n(110),u=n(117),m=n(16);n(201);t.a=Object(a.h)(({className:e,size:t="large",chat:n,user:b,text:h,withOnlineStatus:f,isSavedMessages:p,lastSyncTime:O,onClick:g})=>{const v=b&&Object(s.sb)(b);let j;p||v||(b?j=Object(s.e)(b):n&&(j=Object(s.e)(n)));const E=Object(d.a)(j,!1,r.ApiMediaFormat.DataUri,O),{shouldRenderFullMedia:y,transitionClassNames:C}=Object(u.a)(E,"slow"),N=Object(m.a)();let T="";if(p)T=a.a.createElement("i",{className:"icon-avatar-saved-messages"});else if(v)T=a.a.createElement("i",{className:"icon-avatar-deleted-account"});else if(y)T=a.a.createElement("img",{src:E,className:C+" avatar-media",alt:"",decoding:"async"});else if(b){const e=Object(s.bb)(b);T=e?Object(i.c)(e,2):void 0}else if(n){const e=Object(s.k)(N,n);T=e&&Object(i.c)(e,Object(s.ob)(n.id)?2:1)}else h&&(T=Object(i.c)(h,2));const w=!p&&b&&Object(s.Cb)(b),M=Object(o.a)("Avatar size-"+t,e,"color-bg-"+Object(s.Z)(b||n),p&&"saved-messages",v&&"deleted-account",f&&w&&"online",g&&"interactive",!p&&!y&&"no-photo"),I=Object(a.m)(e=>{g&&g(e,p||y)},[g,p,y]),S=(b||n)&&(b||n).id;return a.a.createElement("div",{className:M,onClick:I,"data-test-sender-id":c.N?S:void 0},"string"==typeof T?Object(l.a)(T,["jumbo"===t?"hq_emoji":"emoji"]):T)})},function(e,t,n){"use strict";var a=n(13),r=n(0),c=n(10),s=n(157);t.a=({ref:e,className:t,onLoadMore:n,onScroll:i,onKeyDown:o,items:l,itemSelector:d=".ListItem",preloadBackwards:u=20,sensitiveArea:m=800,noScrollRestore:b=!1,noScrollRestoreOnTop:h=!1,noFastList:f,cacheBuster:p,children:O})=>{let g=Object(r.q)(null);e&&(g=e);const v=Object(r.q)({}),[j,E]=Object(r.p)(()=>n?[Object(c.a)((e=!1)=>{n({direction:a.e.Backwards,noScroll:e})},1e3,!0,!1),Object(c.a)(()=>{n({direction:a.e.Forwards})},1e3,!0,!1)]:[],[n,l]);Object(r.n)(()=>{if(!j)return;if(u>0&&(!l||l.length{const e=g.current,t=v.current;let n;if(t.listItemElements=e.querySelectorAll(d),t.currentAnchor&&Array.from(t.listItemElements).includes(t.currentAnchor)){const{scrollTop:a}=e;n=a+(t.currentAnchor.getBoundingClientRect().top-t.currentAnchorTop)}else{const e=t.listItemElements[0];e&&(t.currentAnchor=e,t.currentAnchorTop=e.getBoundingClientRect().top)}b||h&&0===e.scrollTop||(Object(s.a)(e,n),t.isScrollTopJustUpdated=!0)},[l,d,b,h,p]);const y=Object(r.m)(e=>{if(E&&j){const{listItemElements:e,isScrollTopJustUpdated:t,currentAnchor:n,currentAnchorTop:a}=v.current;if(t)return void(v.current.isScrollTopJustUpdated=!1);const r=e.length,c=g.current,{scrollTop:i,scrollHeight:o,offsetHeight:l}=c,d=i<=(r?e[0].offsetTop:0)+m,u=(r?e[r-1].offsetTop+e[r-1].offsetHeight:o)-(i+l)<=m;let b=!1;if(d){const t=e[0];if(t){const e=t.getBoundingClientRect().top,r=n&&n.offsetParent&&n!==t?n.getBoundingClientRect().top:e;n&&void 0!==a&&r>a&&(v.current.currentAnchor=t,v.current.currentAnchorTop=e,b=!0,Object(s.a)(c),E())}}if(u){const t=e[r-1];if(t){const e=t.getBoundingClientRect().top,r=n&&n.offsetParent&&n!==t?n.getBoundingClientRect().top:e;n&&void 0!==a&&r{const d=Object(r.a)("FloatingActionButton",e&&"revealed",t);return a.a.createElement(c.a,{className:d,color:n,round:!0,disabled:i,onClick:e&&!i?o:void 0,ariaLabel:s,tabIndex:-1},l)}},function(e,t,n){"use strict";var a=n(0),r=n(40);const c={fast:200,slow:350};t.a=(e,t="fast",n=!1)=>{const s=Boolean(e),i=!Object(a.q)(s).current&&!n,[o,l]=Object(a.r)(!s),{shouldRender:d,transitionClassNames:u}=Object(r.a)(s,void 0,!i,t);return Object(a.n)(()=>{d&&(i?setTimeout(()=>{l(!1)},c[t]):l(!1))},[i,d,t]),{shouldRenderThumb:o,shouldRenderFullMedia:d,transitionClassNames:u}}},function(e,t,n){"use strict";n.d(t,"c",(function(){return i})),n.d(t,"d",(function(){return o})),n.d(t,"e",(function(){return l})),n.d(t,"a",(function(){return d})),n.d(t,"b",(function(){return u})),n.d(t,"j",(function(){return p})),n.d(t,"l",(function(){return g})),n.d(t,"g",(function(){return v})),n.d(t,"i",(function(){return j})),n.d(t,"m",(function(){return E})),n.d(t,"k",(function(){return y})),n.d(t,"n",(function(){return C})),n.d(t,"h",(function(){return N})),n.d(t,"f",(function(){return T}));var a=n(2),r=n(6),c=n(54),s=n(4);const i="(max-height: 640px)",o=parseInt(getComputedStyle(document.documentElement).fontSize,10),l=200,d={width:640,height:640},u="1258816259753933",m={width:100,height:100};let b,h,f;function p(e,t,n,a){const s=t||n?1.625:0;return(function(e,t){const n=e?30:29;if(!r.l)return n;const{width:a}=c.a.get();return b||(b=Math.min(30,a/o-4.5)),h||(h=Math.min(29,a/o-7)),f||(f=Math.min(29,a/o-4.5)),e?b:t?f:h}(e,a)-s)*o}function O({width:e,height:t,fromOwnMessage:n,isForwarded:a,isWebPagePhoto:r,isGif:c,noAvatars:s}){const i=t/e;return T(p(n,a,r,s),function(e,t){return e&&t&&t>=.75&&t<=1.25?20*o:27*o}(c,i),e,t)}function g(e,t){const n=window.matchMedia(i),{width:a,height:r}=c.a.get();let s=t&&n.matches?10:8.25;return e&&(s=n.matches?10:15),{width:a,height:r-s*o}}function v(e,t,n,a,r){const{width:c,height:i}=Object(s.V)(e)||m;return O({width:c,height:i,fromOwnMessage:t,isForwarded:n,isWebPagePhoto:a,noAvatars:r})}function j(e,t,n,a){const{width:r,height:c}=Object(s.db)(e)||m;return O({width:r,height:c,fromOwnMessage:t,isForwarded:n,isGif:e.isGif,noAvatars:a})}function E(){return{width:2*o,height:2*o}}function y(e){return e?{width:3*o,height:3*o}:{width:3.375*o,height:3.375*o}}function C(e){const{width:t}=e;let{height:n}=e;e.id===u&&(n=t);const c=n&&t&&n/t,s=o*(r.l?a.Jb:a.Ib),i=c?s*c:s;return c&&i>s?{width:Math.round(s/c),height:s}:{width:s,height:i}}function N({width:e,height:t},n,a=!1){const{width:r,height:c}=g(n,a);return T(r,c,e,t)}function T(e,t,n,a){const r=a/n,c=Math.min(n,e);return Math.round(c*r)>t?{width:Math.round(t/r),height:t}:{width:c,height:Math.round(c*r)}}},function(e,t,n){"use strict";var a=n(0),r=n(10),c=n(9),s=n(37),i=n(126);let o,l;async function d(){return o||(o=n.e(7).then(n.bind(null,198)),l=(await o).default),o}setTimeout(d,5e3);t.a=Object(a.h)(({className:e,id:t,animationData:n,play:o,playSegment:u,speed:m,noLoop:b,size:h,quality:f,isLowPriority:p,onLoad:O})=>{const[g,v]=Object(a.r)(),j=Object(a.q)(null),E=Object(a.q)(!1),y=Object(a.q)(!1),C=Object(a.q)();C.current=o;const N=Object(a.q)();N.current=u,Object(a.n)(()=>{if(g||!n)return;const e=()=>{if(!j.current)return;const e=new l(t,j.current,n,{noLoop:b,size:h,quality:f,isLowPriority:p},O);m&&e.setSpeed(m),v(e)};l?e():d().then(()=>{Object(r.b)(()=>{j.current&&e()})})},[g,n,t,p,b,O,f,h,m]),Object(a.n)(()=>()=>{g&&g.destroy()},[g]);const T=Object(a.m)((e=!1)=>{g&&(C.current||N.current)&&(N.current?g.playSegment(N.current):e?g.goToAndPlay(0):g.play())},[g]),w=Object(a.m)(()=>{g&&g.pause()},[g]),M=Object(a.m)(()=>{y.current=!0,g&&(E.current||(E.current=g.isPlaying()),w())},[g,w]),I=Object(a.m)(()=>{E.current&&T(),E.current=!1,y.current=!1},[T]),S=Object(a.m)(()=>{Object(r.b)(I)},[I]);Object(a.n)(()=>{g&&(o||u?y.current?E.current=!0:T(b):y.current?E.current=!1:w())},[g,o,u,b,T,w]),Object(s.c)(M,I),Object(i.a)(M,S);const L=Object(c.a)("AnimatedSticker",e),k=h?`width: ${h}px; height: ${h}px;`:void 0;return a.a.createElement("div",{ref:j,className:L,style:k})})},function(e,t,n){"use strict";var a=n(0),r=n(16),c=n(112),s=n(21);t.a=Object(a.h)(({isOpen:e,onClose:t,onCloseAnimationEnd:n,title:i,header:o,text:l,textParts:d,confirmLabel:u="Confirm",confirmHandler:m,confirmIsDestructive:b,isButtonsInOneRow:h})=>{const f=Object(r.a)();return a.a.createElement(c.a,{className:"confirm",title:i,header:o,isOpen:e,onClose:t,onCloseAnimationEnd:n,onEnter:m},l&&l.split("\\n").map(e=>a.a.createElement("p",null,e)),d,a.a.createElement("div",{className:h?"dialog-buttons mt-2":""},a.a.createElement(s.a,{className:"confirm-dialog-button",isText:!0,onClick:m,color:b?"danger":"primary"},u),a.a.createElement(s.a,{className:"confirm-dialog-button",isText:!0,onClick:t},f("Cancel"))))})},function(e,t,n){"use strict";var a=n(0),r=n(9),c=n(40),s=n(22),i=n(16);n(254);t.a=Object(a.h)(({text:e="Nothing found.",description:t})=>{const n=Object(i.a)(),{transitionClassNames:o}=Object(c.a)(!0);return a.a.createElement("div",{className:Object(r.a)("NothingFound",o,t&&"with-description")},e,t&&a.a.createElement("p",{className:"description"},Object(s.a)(n(t),["br"])))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(0),r=n(52),c=n(31);function s(e,t){const n=void 0===t,s=Object(a.q)(n),i=Object(a.q)(),o=Object(c.a)();return Object(r.a)(()=>{n||(s.current=!1,i.current&&(clearTimeout(i.current),i.current=void 0))},e),Object(a.n)(()=>{if(n||s.current)return;const e=()=>{s.current=!0,o()};t>0?i.current=window.setTimeout(e,t):e()},e),s.current}},function(e,t,n){"use strict";var a=n(0),r=n(6),c=n(8),s=n(10),i=n(57),o=n(31);t.a=(e,t=!1,n=c.ApiMediaFormat.BlobUrl,l,d)=>{const u=e?i.c(e):void 0,m=n===c.ApiMediaFormat.Stream||r.h&&n===c.ApiMediaFormat.Progressive,b=Object(o.a)(),[h,f]=Object(a.r)(u&&!m?1:0),p=Object(a.q)(),O=Object(a.p)(()=>Object(s.h)(e=>{(!d||Date.now()-p.current>d)&&f(e)},500,!0),[d]);return Object(a.n)(()=>{!t&&e&&(u?m&&setTimeout(()=>{f(.75)},1500):(f(0),p.current&&i.a(O),p.current=Date.now(),i.b(e,n,O).then(()=>{const e=Date.now()-p.current;p.current=void 0,!d||e>=d?b():setTimeout(b,d-e)})))},[t,e,u,n,l,b,m,d,O]),Object(a.n)(()=>{t&&p.current&&(i.a(O),f(0))},[O,t]),{mediaData:u,downloadProgress:h}}},function(e,t,n){"use strict";var a=n(0),r=n(9);n(224);const c={s:22,m:25,l:28,xl:20};t.a=Object(a.h)(({progress:e=0,size:t="l",square:n,transparent:s,noCross:i,onClick:o})=>{const l=c[t],d=l-4,u=l-1,m=2*d*Math.PI,b=Object(a.q)(null);Object(a.n)(()=>{if(!b.current)return;const t=b.current.firstElementChild,n=m-Math.min(Math.max(.05,e),1)*m;t?t.firstElementChild.setAttribute("stroke-dashoffset",n.toString()):b.current.innerHTML=`\n \n `},[b,m,u,d,e]);const h=Object(r.a)("ProgressSpinner size-"+t,s&&"transparent",n&&"square",i&&"no-cross");return a.a.createElement("div",{ref:b,className:h,onClick:o})})},function(e,t,n){"use strict";var a=n(0),r=n(9),c=n(16),s=n(26);n(231);var i=Object(a.h)(({id:e,label:t,subLabel:n,value:i,name:o,checked:l,disabled:d,hidden:u,isLoading:m,onChange:b})=>{const h=Object(c.a)(),f=Object(r.a)("Radio",d&&"disabled",u&&"hidden-widget",m&&"loading");return a.a.createElement("label",{className:f,dir:h.isRtl?"rtl":void 0},a.a.createElement("input",{type:"radio",name:o,value:i,id:e,checked:l,onChange:b,disabled:d||u}),a.a.createElement("div",{className:"Radio-main"},a.a.createElement("span",{className:"label",dir:h.isRtl?"auto":void 0},t),n&&a.a.createElement("span",{className:"subLabel",dir:h.isRtl?"auto":void 0},n)),m&&a.a.createElement(s.a,null))});t.a=Object(a.h)(({id:e,name:t,options:n,selected:r,disabled:c,loadingOption:s,onChange:o})=>{const l=Object(a.m)(e=>{const{value:t}=e.currentTarget;o(t)},[o]);return a.a.createElement("div",{id:e,className:"radio-group"},n.map(e=>a.a.createElement(i,{name:t,label:e.label,subLabel:e.subLabel,value:e.value,checked:e.value===r,hidden:e.hidden,disabled:c,isLoading:s?s===e.value:void 0,onChange:l})))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(0);function r(e,t){Object(a.n)(()=>(e&&!document.hasFocus()&&e(),e&&window.addEventListener("blur",e),t&&window.addEventListener("focus",t),()=>{t&&window.removeEventListener("focus",t),e&&window.removeEventListener("blur",e)}),[e,t])}},function(e,t,n){"use strict";var a=n(0),r=n(67);t.a=({containerId:e,className:t,children:n})=>{const c=Object(a.q)(document.createElement("div"));return Object(a.o)(()=>{const n=document.querySelector(e||"#portals");if(!n)return;const a=c.current;return t&&a.classList.add(t),n.appendChild(a),()=>{r.a.render(void 0,a),n.removeChild(a)}},[t,e]),r.a.render(n,c.current)}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(13),s=n(4),i=n(7),o=n(22),l=n(3),d=n(16),u=n(114),m=n(137),b=n(158);t.a=Object(a.h)(Object(r.h)((e,{chatId:t})=>{const{lastSyncTime:n}=e,a=Object(i.g)(e,t);return{lastSyncTime:n,chat:a,onlineCount:a?Object(i.o)(e,a):void 0,areMessagesLoaded:Boolean(Object(i.n)(e,t))}},(e,t)=>Object(l.l)(t,["loadFullChat","openMediaViewer"]))(({typingStatus:e,avatarSize:t="medium",withMediaViewer:n,withUsername:r,withFullInfo:i,withUpdatingStatus:l,withChatType:h,noRtl:f,chat:p,onlineCount:O,areMessagesLoaded:g,lastSyncTime:v,loadFullChat:j,openMediaViewer:E})=>{const y=p&&Object(s.qb)(p),{id:C,isMin:N,isRestricted:T}=p||{};Object(a.n)(()=>{C&&!N&&i&&v&&j({chatId:C})},[C,N,v,i,j,y]);const w=Object(a.m)((e,n)=>{p&&n&&(e.stopPropagation(),E({avatarOwnerId:p.id,origin:"jumbo"===t?c.h.ProfileAvatar:c.h.MiddleHeaderAvatar}))},[p,t,E]),M=Object(d.a)();if(p)return a.a.createElement("div",{className:"ChatInfo",dir:!f&&M.isRtl?"rtl":void 0},a.a.createElement(u.a,{key:p.id,size:t,chat:p,onClick:n?w:void 0}),a.a.createElement("div",{className:"info"},a.a.createElement("div",{className:"title"},a.a.createElement("h3",{dir:"auto"},Object(o.a)(Object(s.k)(M,p))),p.isVerified&&a.a.createElement(m.a,null)),function(){if(l&&!g&&!T)return a.a.createElement("span",{className:"status",dir:"auto"},M("Updating"));if(!p)return;if(e)return a.a.createElement(b.a,{typingStatus:e});if(h)return a.a.createElement("div",{className:"status",dir:"auto"},M(Object(s.l)(p)));const t=r?p.username:void 0,n=function(e,t){const n=e(Object(s.l)(t)),{membersCount:a}=t;if(t.isRestricted)return"Channel"===n?"channel is inaccessible":"group is inaccessible";if(!a)return n;return e("Channel"===n?"Subscribers":"Members",a,"i")}(M,p),c=O?", "+M("OnlineCount",O,"i"):void 0;return a.a.createElement("div",{className:"status"},t&&a.a.createElement("span",{className:"handle"},t),a.a.createElement("span",{className:"group-status"},n),c&&a.a.createElement("span",{className:"online-status"},c))}()))}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return l})),n.d(t,"b",(function(){return d}));var a=n(1),r=n(13),c=n(2),s=n(37),i=n(62);let o=!1;function l(e,t,n,s=0,i=c.B,o,l,d){const m=function(e,t,n=c.B,a){const{offsetTop:s}=t,{scrollTop:i}=e;if(void 0===a){const t=s-e.scrollTop;if(t<-n)return i+(t+n);if(t>n)return i+(t-n)}else{if(a===r.b.Up)return s+n;if(a===r.b.Down)return Math.max(0,s-n)}return i}(e,t,i,o);o!==r.b.Static?(Object(a.e)().settings.byKey.animationLevel===c.f&&(l=0),u(e,t,m,n,s,l,d)):u(e,t,m,n,s,0)}function d(){return o}function u(e,t,n,a,r=0,l,d){const{offsetTop:u,offsetHeight:h}=t,{scrollTop:f,offsetHeight:p,scrollHeight:O}=e,g=!d&&e.dataset.normalHeight?Number(e.dataset.normalHeight):p;let v;switch(f!==n&&(e.scrollTop=n),a){case"start":v=u-r-n;break;case"end":v=u+h+r-(n+g);break;case"nearest":case"center":case"centerOrTop":v=h0){const e=O-(n+g);v=Math.min(v,e)}if(0===v)return;const j=n+v;if(0===l)return void(e.scrollTop=j);o=!0;const E=Math.abs(v),y=E{const t=Math.min((Date.now()-N)/C,1),n=v*(1-y(t));return e.scrollTop=Math.round(j-n),o=t<1,o||T(),o})}function m(e){return 1-(1-e)**5}function b(e){return 1-(1-e)**3.5}},,function(e,t,n){"use strict";var a=n(0),r=n(13),c=n(3),s=n(31),i=n(29);function o(e,t=0,n,a){const{length:c}=e,s=e.indexOf(t),i=n===r.e.Forwards?s:s+1||c,o=Math.max(0,i-a),l=i+a-1,d=e.slice(Math.max(0,o),l+1);let u,m;switch(n){case r.e.Forwards:u=i>0,m=o>=0;break;case r.e.Backwards:u=i{const u=Object(a.q)(),m=Object(a.q)((()=>{if(!t||u.current)return;const{newViewportIds:e}=o(t,t[0],r.e.Forwards,l);return e})()),b=Object(s.a)(),h=Object(i.a)(t),f=Object(i.a)(n);if(t&&!n&&(t!==h||n!==f)){const{offsetId:e=t[0],direction:n=r.e.Forwards}=u.current||{},{newViewportIds:a}=o(t,e,n,l);m.current&&Object(c.a)(m.current,a)||(m.current=a)}Object(a.n)(()=>{if(t&&!n&&e&&d){const t=m.current;e({offsetId:t[t.length-1]})}},[t,n,e,d]);const p=Object(a.m)(({direction:n,noScroll:a})=>{const s=m.current,i=s?n===r.e.Backwards?s[s.length-1]:s[0]:void 0;if(!t)return void(e&&e({offsetId:i}));a||(u.current={...u.current,direction:n,offsetId:i});const{newViewportIds:d,areSomeLocal:h,areAllLocal:f}=o(t,i,n,l);!h||s&&Object(c.a)(s,d)||(m.current=d,b()),!f&&e&&e({offsetId:i})},[t,l,e,b]);return n?[t]:[m.current,p]}},function(e,t,n){"use strict";function a(e,t){return t-Math.floor(t/e)*e}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";var a=n(0),r=n(8),c=n(2),s=n(118),i=n(109),o=n(110),l=n(117),d=n(25),u=n(119);n(229);t.a=({sticker:e,isInline:t=!1,observeIntersection:n,lastSyncTime:m,forceLoadPreview:b})=>{const h=Object(a.q)(null),[f,p]=Object(d.a)(),O="sticker"+e.id,g=Object(i.b)(h,n),v=e.thumbnail&&e.thumbnail.dataUri,j=Object(o.a)(O+"?size=m",!g&&!b,r.ApiMediaFormat.BlobUrl,m),{transitionClassNames:E}=Object(l.a)(j,"slow"),y=Object(o.a)(O,!g,r.ApiMediaFormat.Lottie,m),C=Boolean(y),[N,T]=Object(a.r)(String(Math.random())),w=Object(a.m)(()=>{T(String(Math.random()))},[]);let M;M=t?.5*Object(s.n)(e).width:c.Ob;const I=`width: ${M}px; height: ${M}px;`;return a.a.createElement("div",{ref:h,className:"AnimatedEmoji media-inner",style:I,onClick:w},!f&&v&&a.a.createElement("img",{src:v,className:e.id===s.b?"like-sticker-thumb":void 0,alt:""}),!f&&j&&a.a.createElement("img",{src:j,className:E,alt:""}),C&&a.a.createElement(u.a,{key:O,id:O,animationData:y,size:M,quality:1,play:g&&N,noLoop:!0,onLoad:p}))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(6);function r(e,t){if(!t&&e===document.activeElement)return;const n=window.getSelection(),r=document.createRange(),c=e.lastChild||e;a.n||c&&c.nodeValue?(r.selectNodeContents(c),r.collapse(!1),n.removeAllRanges(),n.addRange(r)):e.focus()}},,function(e,t,n){"use strict";let a;n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return r})),function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Left=2]="Left",e[e.Right=3]="Right"}(a||(a={}));function r(e,t){let n,r,c=!1;function s(e){t.excludedClosestSelector&&(e.target.matches(t.excludedClosestSelector)||e.target.closest(t.excludedClosestSelector))||(n=e,"mousedown"===e.type?(document.addEventListener("mousemove",o),document.addEventListener("mouseup",i)):"touchstart"===e.type&&(document.addEventListener("touchmove",o),document.addEventListener("touchend",i),document.addEventListener("touchcancel",i),"touches"in e&&(void 0===e.pageX&&(e.pageX=e.touches[0].pageX),void 0===e.pageY&&(e.pageY=e.touches[0].pageY))),document.body.classList.add("no-selection"),t.withCursor&&document.body.classList.add("cursor-grabbing"),t.onCapture&&t.onCapture(e))}function i(e){n&&(t.withCursor&&document.body.classList.remove("cursor-grabbing"),document.body.classList.remove("no-selection"),document.removeEventListener("mouseup",i),document.removeEventListener("mousemove",o),document.removeEventListener("touchcancel",i),document.removeEventListener("touchend",i),document.removeEventListener("touchmove",o),n=void 0,c?t.onRelease&&t.onRelease(e):!t.onClick||"button"in e&&0!==e.button||t.onClick(e)),c=!1,r=void 0}function o(e){if(n){"touchmove"===e.type&&"touches"in e&&(void 0===e.pageX&&(e.pageX=e.touches[0].pageX),void 0===e.pageY&&(e.pageY=e.touches[0].pageY));const s=e.pageX-n.pageX,i=e.pageY-n.pageY;(Math.abs(s)>=15||Math.abs(i)>=15)&&(c=!0),t.onDrag&&(e.preventDefault(),t.onDrag(e,n,{dragOffsetX:s,dragOffsetY:i})),t.onSwipe&&function(e,n,c){if(!r){const e=Math.abs(n),t=Math.abs(c);if(n&&c){if(Math.max(e,t)/Math.min(e,t)<2)return}e>=50?r="x":t>=50&&(r="y")}!function(e,t,n,r,c){"x"===t?c(e,n<0?a.Left:a.Right):"y"===t&&c(e,r<0?a.Up:a.Down)}(e,r,n,c,t.onSwipe)}(e,s,i)}}return e.addEventListener("mousedown",s),e.addEventListener("touchstart",s,{passive:!0}),()=>{e.removeEventListener("mousedown",s),e.removeEventListener("touchstart",s)}}},function(e,t,n){"use strict";var a=n(0);n(208);t.a=()=>a.a.createElement("span",{className:"VerifiedIcon"})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var a=n(29);function r(e,t=!1,n=!1){const r=Object(a.a)(e,t);return n||null!=e?e:r}},function(e,t,n){"use strict";var a=n(2);t.a=e=>{e.play().catch(e=>{a.r&&console.warn(e)})}},function(e,t,n){"use strict";var a=n(0),r=n(10),c=n(161);t.a=(e=!1)=>{const[t,n]=Object(a.r)(!e),[s,i]=Object(a.r)(0),o=Object(a.p)(()=>Object(r.a)(n,200,!1,!0),[]),l=Object(a.m)(e=>{const t=e.currentTarget;Object(c.a)(t)||(t.buffered.length&&i(t.buffered.end(0)/t.duration),o(t.readyState>=3||t.currentTime>0))},[o]);return{isBuffered:t,bufferedProgress:s,bufferingHandlers:{onLoadedData:l,onPlaying:l,onLoadStart:l,onPause:l,onTimeUpdate:l,onProgress:l},checkBuffering(e){o(e.readyState>=3)}}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(8),r=n(6);const c={B:a.ApiMessageEntityTypes.Bold,STRONG:a.ApiMessageEntityTypes.Bold,I:a.ApiMessageEntityTypes.Italic,EM:a.ApiMessageEntityTypes.Italic,U:a.ApiMessageEntityTypes.Underline,S:a.ApiMessageEntityTypes.Strike,STRIKE:a.ApiMessageEntityTypes.Strike,DEL:a.ApiMessageEntityTypes.Strike,CODE:a.ApiMessageEntityTypes.Code,PRE:a.ApiMessageEntityTypes.Pre,BLOCKQUOTE:a.ApiMessageEntityTypes.Blockquote};function s(e){const t=document.createElement("div");t.innerHTML=function(e){let t=e.slice(0);r.d||(t=t.replace(/]+alt="([^"]+)"[^>]*>/gm,"$1"));return t=t.replace(/<\/?span([^>]*)?>/g,""),t=t.replace(/ /g," "),t=t.replace(/
]*)?><\/div>/g,"\n"),t=t.replace(/]*)?>/g,"\n"),t=t.replace(/<\/div>(\s*)
/g,"\n"),t=t.replace(/
/g,"\n"),t=t.replace(/<\/div>/g,""),t=t.replace(/^`{3}(.*[\n\r][^]*?^)`{3}/gm,"
$1
"),t=t.replace(/[`]{3}([^`]+)[`]{3}/g,"
$1
"),t=t.replace(/[`]{1}([^`\n]+)[`]{1}/g,"$1"),t=t.replace(/[*]{2}([^*\n]+)[*]{2}/g,"$1"),t=t.replace(/[_]{2}([^*\n]+)[_]{2}/g,"$1"),t=t.replace(/[~]{2}([^~\n]+)[~]{2}/g,"$1"),t}(e);const n=t.innerText.trim().replace(/\u200b+/g,"").slice(0,4096);let s=0,i=0;const o=[];function l(e){const{index:t,entity:r}=function(e,t,n){const r=function(e){if(c[e.nodeName])return c[e.nodeName];if("A"===e.nodeName){const t=e;return t.dataset.entityType===a.ApiMessageEntityTypes.MentionName?a.ApiMessageEntityTypes.MentionName:t.dataset.entityType===a.ApiMessageEntityTypes.Url?a.ApiMessageEntityTypes.Url:t.href.startsWith("mailto:")?a.ApiMessageEntityTypes.Email:t.href.startsWith("tel:")?a.ApiMessageEntityTypes.Phone:t.href!==t.textContent?a.ApiMessageEntityTypes.TextUrl:a.ApiMessageEntityTypes.Url}if("SPAN"===e.nodeName)return e.dataset.entityType;return}(e);if(!r||!e.textContent)return{index:n,entity:void 0};const s=t.indexOf(e.textContent,n),i=s>=0?s:n,o=t.substring(0,i).length,{length:l}=t.substring(i,i+e.textContent.length);let d,u;r===a.ApiMessageEntityTypes.TextUrl&&(d=e.href);r===a.ApiMessageEntityTypes.MentionName&&(u=Number(e.dataset.userId));return{index:i,entity:{type:r,offset:o,length:l,...d&&{url:d},...u&&{userId:u}}}}(e,n,s);r?(s=t,o.push(r)):e.textContent&&(s+=e.textContent.length),e.hasChildNodes()&&i<=3&&(i+=1,Array.from(e.childNodes).forEach(l))}return Array.from(t.childNodes).forEach(e=>{i=1,l(e)}),{text:n,entities:o.length?o:void 0}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return d}));var a=n(0),r=n(40),c=n(9),s=n(49),i=n(29),o=n(25);n(219);var l=Object(a.h)(({isQuick:e,onFileSelect:t})=>{const[n,r,s]=Object(o.a)(),i=Object(c.a)("DropTarget",n&&"hovered");return a.a.createElement("div",{className:i,onDrop:t,onDragEnter:()=>{r()},onDragLeave:e=>{const{relatedTarget:t}=e;t&&e.stopPropagation(),s()}},a.a.createElement("div",{className:"target-content"},a.a.createElement("div",{className:"icon icon-"+(e?"photo":"document")}),a.a.createElement("div",{className:"title"},"Drop files here to send them"),a.a.createElement("div",{className:"description"},e?"in a quick way":"without compression")))});n(220);let d;!function(e){e.None="none",e.Document="document",e.QuickFile="quick_file"}(d||(d={}));t.b=Object(a.h)(({isOpen:e,withQuick:t,onHide:n,onFileSelect:o})=>{const d=Object(a.q)(null),u=Object(i.a)(t),{shouldRender:m,transitionClassNames:b}=Object(r.a)(e);Object(a.n)(()=>e?Object(s.a)(n):void 0,[e,n]);const h=Object(a.m)(e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),o(Array.from(t.files),!1))},[o,n]),f=Object(a.m)(e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),o(Array.from(t.files),!0))},[o,n]),p=Object(a.m)(e=>{e.stopPropagation();const{target:t,relatedTarget:a}=e;t.matches(".DropTarget, .DropArea")&&!a&&(d.current=window.setTimeout(()=>{n()},150))},[n]);if(!m)return;const O=Object(c.a)("DropArea",b);return a.a.createElement("div",{className:O,onDragLeave:p,onDragOver:()=>{d.current&&window.clearTimeout(d.current)},onDrop:n},a.a.createElement(l,{onFileSelect:h}),(t||u)&&a.a.createElement(l,{onFileSelect:f,isQuick:!0}))})},,function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(7),s=n(4),i=n(22),o=n(9),l=n(16),d=n(114);n(202);t.a=Object(a.h)(Object(r.h)((e,{chatOrUserId:t})=>{if(!t)return{};return{chat:t?Object(c.g)(e,t):void 0,user:Object(s.ob)(t)?Object(c.Jb)(e,t):void 0}})(({icon:e,title:t,isMinimized:n,canClose:r,onClick:c,clickArg:u,chat:m,user:b,className:h})=>{const f=Object(l.a)();let p,O;if(e&&t)p=a.a.createElement("div",{className:"item-icon"},a.a.createElement("i",{className:"icon-"+e})),O=t;else if(m||b){p=a.a.createElement(d.a,{chat:m,user:b,size:"small",isSavedMessages:b&&b.isSelf});const e=!m||b&&!b.isSelf?Object(s.ab)(b):Object(s.k)(f,m,b);O=e?Object(i.a)(e):void 0}const g=Object(o.a)("PickerSelectedItem",h,n&&"minimized",r&&"closeable");return a.a.createElement("div",{className:g,onClick:()=>c(u),title:n?O:void 0,dir:f.isRtl?"rtl":void 0},p,!n&&a.a.createElement("div",{className:"item-name",dir:"auto"},O),r&&a.a.createElement("div",{className:"item-remove"},a.a.createElement("i",{className:"icon-close"})))}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(1),r=n(2),c=n(6),s=n(62);function i(e,t,n=300){Object(a.e)().settings.byKey.animationLevel===r.f&&(n=0),c.e?function(e,t,n){const{scrollLeft:a,offsetWidth:r,scrollWidth:c}=e;let i=t-a;if(i<0){const e=-a;i=Math.max(i,e)}else if(i>0){const e=c-(a+r);i=Math.min(i,e)}if(0===i)return;const o=a+i;if(0===n)return void(e.scrollLeft=o);const l=Date.now();Object(s.a)(()=>{const t=Math.min((Date.now()-l)/n,1),a=i*(1-function(e){return 1-(1-e)**3.5}(t));return e.scrollLeft=Math.round(o-a),t<1})}(e,t,n):e.scrollTo({left:t,...n&&{behavior:"smooth"}})}},function(e,t,n){"use strict";var a=n(0);t.a=(e,t)=>{Object(a.n)(()=>{if(e)return e.addEventListener("wheel",t,{passive:!0}),()=>{e.removeEventListener("wheel",t)};function t(t){t.deltaX||(e.scrollLeft+=t.deltaY/4)}},[e,t])}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(10);t.a=(e,t,n,s)=>{const{loadMessage:i}=Object(r.d)(),o=Object(a.p)(()=>{const n=Object(c.h)(i,500,!0);return()=>{n({chatId:e,messageId:t,replyOriginForId:s})}},[i,e,t,s]);Object(a.n)(()=>{t&&!n&&o()})}},function(e,t,n){"use strict";var a=n(0),r=n(6);let c=0;t.a=(e,t,n,s)=>{const[i,o]=Object(a.r)(!1),[l,d]=Object(a.r)(void 0),u=Object(a.m)(e=>{t||2!==e.button||document.body.classList.add("no-selection")},[t]),m=Object(a.m)(e=>{document.body.classList.remove("no-selection"),t||n&&e.target.matches("a.text-entity-link[href]")||(e.preventDefault(),l||(document.body.classList.remove("no-selection"),0===c&&document.body.classList.add("has-context-menu"),c++,o(!0),d({x:e.clientX,y:e.clientY})))},[t,n,l]),b=Object(a.m)(()=>{o(!1)},[]),h=Object(a.m)(()=>{d(void 0),document.body.classList.remove("no-selection"),setTimeout(()=>{c--,0===c&&document.body.classList.remove("has-context-menu")},200)},[]);return Object(a.n)(()=>{if(t||!r.n||s)return;const a=e.current;if(!a)return;let c;const i=()=>{c&&(clearTimeout(c),c=void 0)},u=e=>{t||r.l&&window.document.body.classList.contains("enable-symbol-menu-transforms")||(i(),c=window.setTimeout(()=>(e=>{i();const{clientX:t,clientY:r,target:c}=e.touches[0];l||n&&c.matches("a.text-entity-link[href]")||(a.addEventListener("touchend",(function e(t){a.removeEventListener("touchend",e,!0),t.stopImmediatePropagation(),t.preventDefault(),t.stopPropagation()}),!0),document.body.classList.add("no-selection"),o(!0),d({x:t,y:r}))})(e),250))};return a.addEventListener("touchstart",u,{passive:!0}),a.addEventListener("touchcancel",i,!0),a.addEventListener("touchend",i,!0),a.addEventListener("touchmove",i,{passive:!0}),()=>{i(),a.removeEventListener("touchstart",u),a.removeEventListener("touchcancel",i,!0),a.removeEventListener("touchend",i,!0),a.removeEventListener("touchmove",i)}},[l,t,s,e,n]),{isContextMenuOpen:i,contextMenuPosition:l,handleBeforeContextMenu:u,handleContextMenu:m,handleContextMenuClose:b,handleContextMenuHide:h}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return d})),n.d(t,"b",(function(){return m}));var a=n(0),r=n(1),c=n(8),s=n(4),i=n(22),o=n(78),l=n(59);function d(e,t,n){const a=e.content.text;if(!a||!a.text){const t=Object(s.P)(e);return t?[t]:void 0}const{text:r,entities:c}=a;return m(r,c,t,n)}function u(e){const t=new Set,n=[];return e.forEach((a,r)=>{if(t.has(r))return;const c=function e(t,n,a,r){const{offset:c,length:s}=t,i=new Set([n]);if(r.has(n))return;const o=[];return a.filter((e,t)=>t>n&&e.offset>=c&&e.offsete(t,a.indexOf(t),a,r)).filter(Boolean).forEach(e=>{let t=!1;e.organizedIndexes.forEach(e=>{t||i.has(e)||(t=!0),i.add(e)}),t&&o.push(e)}),{entity:t,organizedIndexes:i,nestedEntities:o}}(a,r,e,t);c&&(c.organizedIndexes.forEach(e=>{t.add(e)}),n.push(c))}),n}function m(e,t,n,r,s){if(!t||!t.length)return b(e,n,r,s);const d=[];let m=!1;const O=u(t);function g(t,d,u,O){const v=[],{entity:j,nestedEntities:E}=u,{offset:y,length:C,type:N}=j;let T=e.substring(t,y);const w=T.length;T&&(m&&T.length>0&&"\n"===T[0]&&(T=T.substr(1),m=!1),T&&v.push(...b(T,n,r,s)));const M=t+w,I=M+C;let S=e.substring(y,y+C);const L=[];if(m&&S.length>0&&"\n"===S[0]&&(S=S.substr(1),m=!1),N===c.ApiMessageEntityTypes.Pre&&(m=!0),E.length){let e=M;E.forEach((t,n)=>{const{renderResult:a,entityEndIndex:r}=g(e,I,t,n===E.length-1);L.push(...a),e=r})}const k=s?function(e,t,n){const a="string"==typeof t&&t,r=n.length?n.join(""):Object(i.a)(t,["emoji_html","br_html"]).join("");if(!a)return r;switch(e.type){case c.ApiMessageEntityTypes.Bold:return`${r}`;case c.ApiMessageEntityTypes.Italic:return`${r}`;case c.ApiMessageEntityTypes.Underline:return`${r}`;case c.ApiMessageEntityTypes.Code:return`${r}`;case c.ApiMessageEntityTypes.Pre:return`\`\`\`
${r}
\`\`\``;case c.ApiMessageEntityTypes.Strike:return`${r}`;case c.ApiMessageEntityTypes.MentionName:return`${r}`;case c.ApiMessageEntityTypes.Url:case c.ApiMessageEntityTypes.TextUrl:return`${r}`;default:return r}}(j,S,L):function(e,t,n){const r="string"==typeof t&&t,s=n.length?n:t;if(!r)return b(s);switch(e.type){case c.ApiMessageEntityTypes.Bold:return a.a.createElement("strong",null,b(s));case c.ApiMessageEntityTypes.Blockquote:return a.a.createElement("blockquote",null,b(s));case c.ApiMessageEntityTypes.BotCommand:return a.a.createElement("a",{onClick:f,className:"text-entity-link",dir:"auto"},b(s));case c.ApiMessageEntityTypes.Hashtag:case c.ApiMessageEntityTypes.Cashtag:return a.a.createElement("a",{onClick:p,className:"text-entity-link",dir:"auto"},b(s));case c.ApiMessageEntityTypes.Code:return a.a.createElement("code",{className:"text-entity-code"},b(s));case c.ApiMessageEntityTypes.Email:return a.a.createElement("a",{href:"mailto:"+r,target:"_blank",rel:"noopener noreferrer",className:"text-entity-link",dir:"auto"},b(s));case c.ApiMessageEntityTypes.Italic:return a.a.createElement("em",null,b(s));case c.ApiMessageEntityTypes.MentionName:return a.a.createElement(o.a,{userId:e.userId},b(s));case c.ApiMessageEntityTypes.Mention:return a.a.createElement(o.a,{username:r},b(s));case c.ApiMessageEntityTypes.Phone:return a.a.createElement("a",{href:"tel:"+r,className:"text-entity-link",dir:"auto"},b(s));case c.ApiMessageEntityTypes.Pre:return a.a.createElement("pre",{className:"text-entity-pre"},b(s));case c.ApiMessageEntityTypes.Strike:return a.a.createElement("del",null,b(s));case c.ApiMessageEntityTypes.TextUrl:case c.ApiMessageEntityTypes.Url:return a.a.createElement(l.a,{url:h(r,e),text:r},b(s));case c.ApiMessageEntityTypes.Underline:return a.a.createElement("ins",null,b(s));default:return b(s)}}(j,S,L);if(Array.isArray(k)?v.push(...k):v.push(k),O&&I0&&"\n"===t[0]&&(t=t.substring(1)),t&&v.push(...b(t,n,r,s))}return{renderResult:v,entityEndIndex:I}}let v=0;return O.forEach((t,n)=>{const{renderResult:a,entityEndIndex:r}=g(v,e.length,t,n===O.length-1);d.push(...a),v=r}),d}function b(e,t,n,a){if(Array.isArray(e)){const r=[];return e.forEach(e=>{r.push(...b(e,t,n,a))}),r}if(a)return Object(i.a)(e,["escape_html","emoji_html","br_html"]);const r=n?"hq_emoji":"emoji";return t?Object(i.a)(e,[r,"br","highlight"],{highlight:t}):Object(i.a)(e,[r,"br"])}function h(e,t){const{type:n,url:a}=t;return n===c.ApiMessageEntityTypes.TextUrl&&a?a:e}function f(e){Object(r.d)().sendBotCommand({command:e.currentTarget.innerText})}function p(e){Object(r.d)().setLocalTextSearchQuery({query:e.currentTarget.innerText}),Object(r.d)().searchTextMessagesLocal()}},function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var a=n(0),r=n(10);function c(e,t){Object(a.n)(()=>{const t=e.current;return()=>{t&&Object(r.b)(()=>{t.pause(),t.src="",t.load()})}},t)}},,,function(e,t,n){},,,function(e,t,n){"use strict";var a=n(0),r=n(9),c=n(25),s=n(16),i=n(20),o=n(21);n(200);t.a=Object(a.h)(({ref:e,children:t,parentContainerClassName:n,value:l,inputId:d,className:u,focused:m,isLoading:b,placeholder:h,disabled:f,autoComplete:p,canClose:O,onChange:g,onReset:v,onFocus:j,onBlur:E})=>{let y=Object(a.q)(null);e&&(y=e);const[C,N,T]=Object(c.a)(m);Object(a.n)(()=>{y.current&&(m?y.current.focus():y.current.blur())},[m,h]);const w=Object(s.a)();const M=Object(a.m)(e=>{if("ArrowDown"===e.key||"Enter"===e.key){const e=document.querySelector(`.${n} .ListItem-button`);e&&e.focus()}},[n]);return a.a.createElement("div",{className:Object(r.a)("SearchInput",u,C&&"has-focus"),dir:w.isRtl?"rtl":void 0},t,a.a.createElement("input",{ref:y,id:d,type:"text",dir:"auto",placeholder:h||w("Search"),className:"form-control",value:l,disabled:f,autoComplete:p,onChange:function(e){const{currentTarget:t}=e;g(t.value)},onFocus:function(){N(),j&&j()},onBlur:function(){T(),E&&E()},onKeyDown:M}),a.a.createElement("i",{className:"icon-search"}),b&&a.a.createElement(i.a,null),!b&&(l||O)&&v&&a.a.createElement(o.a,{round:!0,size:"tiny",color:"translucent",onClick:v},a.a.createElement("span",{className:"icon-close"})))})},function(e,t,n){"use strict";var a=n(6);t.a=(e,t)=>{a.e&&(e.style.overflow="hidden"),void 0!==t&&(e.scrollTop=t),a.e&&(e.style.overflow="")}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(7),s=n(4),i=n(22),o=n(16);n(209);t.a=Object(a.h)(Object(r.h)((e,{typingStatus:t})=>{if(!t.userId)return{};return{typingUser:Object(c.Jb)(e,t.userId)}})(({typingStatus:e,typingUser:t})=>{const n=Object(o.a)(),r=t&&!t.isSelf&&Object(s.ab)(t);return a.a.createElement("p",{className:"typing-status",dir:n.isRtl?"rtl":"auto"},r&&a.a.createElement("span",{className:"sender-name",dir:"auto"},Object(i.a)(r)),n(e.action).replace("{user}","").trim(),a.a.createElement("span",{className:"ellipsis"}))}))},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(7),s=n(4),i=n(3),o=n(16),l=n(22),d=n(114),u=n(112),m=n(21);n(212);t.a=Object(a.h)(Object(r.h)((e,{chat:t})=>{const n=Object(s.ob)(t.id),a=Object(c.P)(e,t.id),r=n&&Object(c.Jb)(e,Object(s.W)(t)),i=r&&Object(s.Bb)(r)&&!t.isSupport,o=n&&!a&&!i,l=n?Object(s.ab)(Object(c.Jb)(e,Object(s.W)(t))):void 0;return{isPrivateChat:n,isChatWithSelf:a,isBot:i,isChannel:Object(s.mb)(t),isBasicGroup:Object(s.lb)(t),isSuperGroup:Object(s.qb)(t),currentUserId:e.currentUserId,canDeleteForAll:o,contactName:l}},(e,t)=>Object(i.l)(t,["leaveChannel","deleteHistory","deleteChannel","deleteChatUser","blockContact"]))(({isOpen:e,chat:t,isChannel:n,isPrivateChat:r,isChatWithSelf:c,isBot:i,isBasicGroup:b,isSuperGroup:h,currentUserId:f,canDeleteForAll:p,contactName:O,onClose:g,onCloseAnimationEnd:v,leaveChannel:j,deleteHistory:E,deleteChannel:y,deleteChatUser:C,blockContact:N})=>{const T=Object(o.a)(),w=Object(s.k)(T,t),M=Object(a.m)(()=>{E({chatId:t.id,shouldDeleteForAll:!0}),g()},[E,t.id,g]),I=Object(a.m)(()=>{E({chatId:t.id,shouldDeleteForAll:!0}),N({contactId:t.id,accessHash:t.accessHash}),g()},[E,t.id,t.accessHash,N,g]),S=Object(a.m)(()=>{r?E({chatId:t.id,shouldDeleteForAll:!1}):b?(C({chatId:t.id,userId:f}),E({chatId:t.id,shouldDeleteForAll:!1})):!n&&!h||t.isCreator?(n||h)&&t.isCreator&&y({chatId:t.id}):j({chatId:t.id}),g()},[r,b,n,h,f,t.isCreator,t.id,g,E,C,j,y]);return a.a.createElement(u.a,{isOpen:e,className:"DeleteChatModal",header:a.a.createElement("div",{className:"modal-header",dir:T.isRtl?"rtl":void 0},a.a.createElement(d.a,{size:"tiny",chat:t,isSavedMessages:c}),a.a.createElement("h3",{className:"modal-title"},T(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"ChannelDelete":b||h?"Group.LeaveGroup":"DeleteChatUser"))),onClose:g,onCloseAnimationEnd:v},n&&t.isCreator?a.a.createElement("p",null,Object(l.a)(T("ChatList.DeleteAndLeaveGroupConfirmation",w),["simple_markdown"])):n&&!t.isCreator||b||h?a.a.createElement("p",null,Object(l.a)(T("ChannelLeaveAlertWithName",w),["simple_markdown"])):a.a.createElement("p",null,Object(l.a)(T("ChatList.DeleteChatConfirmation",O),["simple_markdown"])),i&&a.a.createElement(m.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:I},T("DeleteAndStop")),p&&a.a.createElement(m.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:M},O?Object(l.a)(T("ChatList.DeleteForEveryone",O)):T("DeleteForAll")),a.a.createElement(m.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:S},T(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"Chat.Input.Delete":b||h?"Group.LeaveGroup":p?"ChatList.DeleteForCurrentUser":"Delete")),a.a.createElement(m.a,{className:"confirm-dialog-button",isText:!0,onClick:g},T("Cancel")))}))},function(e,t,n){"use strict";var a=n(0),r=n(40),c=n(29),s=n(9);t.a=({isOpen:e,isCustom:t,id:n,className:i,onClick:o,children:l})=>{const{shouldRender:d,transitionClassNames:u}=Object(r.a)(e,void 0,void 0,!t&&void 0),m=Object(c.a)(e),b=Object(c.a)(l),h=Object(a.q)();return m&&!e&&(h.current=b),d&&a.a.createElement("div",{id:n,className:Object(s.a)(i,u),onClick:o},e?l():h.current())}},function(e,t,n){"use strict";function a(e){e.dataset.patchedForSafari||(e.addEventListener("play",()=>{const t=e.currentTime;e.addEventListener("progress",(function n(){e.buffered.length&&(e.dataset.patchForSafariInProgress="true",e.currentTime=e.duration-1,e.addEventListener("progress",()=>{delete e.dataset.patchForSafariInProgress,e.currentTime=t,e.paused&&e.play()},{once:!0}),e.removeEventListener("progress",n))}))},{once:!0}),e.dataset.patchedForSafari="true")}function r(e){return Boolean(e.dataset.patchForSafariInProgress)}n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";var a=n(0),r=n(29);t.a=(e,t,n)=>{const c=Object(r.a)(t);return Object(a.o)(()=>e(c||[]),t,n)}},function(e,t,n){"use strict";var a=n(0),r=n(60),c=n(4),s=n(109),i=n(123),o=n(110),l=n(183),d=n(184);t.a=Object(a.h)(({message:e,observeIntersection:t,smaller:n,uploadProgress:u,withDate:m,datetime:b,className:h,sender:f,isSelected:p,isSelectable:O,onCancelUpload:g,onMediaClick:v,onDateClick:j})=>{const E=Object(a.q)(null),y=e.content.document,C=Object(r.b)(y)||"",{fileName:N,size:T,timestamp:w}=y,M=v&&Boolean(y.mediaType),I=Object(s.b)(E,t),[S,L]=Object(a.r)(!1),{mediaData:k,downloadProgress:A}=Object(i.a)(Object(c.E)(e,"download"),!S),{isUploading:x,isTransferring:D,transferProgress:R}=Object(c.r)(e,u||A,S),_=Object(r.c)(y),P=_?Object(c.F)(e):void 0,F=_?y.previewBlobUrl:void 0,U=Object(o.a)(Object(c.E)(e,"pictogram"),!I),B=Object(a.m)(()=>{M?v():x?g&&g():L(e=>!e)},[M,x,g,v]),q=Object(a.m)(()=>{j(e.id,e.chatId)},[j,e.id,e.chatId]);return Object(a.n)(()=>{S&&k&&(Object(l.a)(k,N),L(!1))},[N,k,S]),a.a.createElement(d.a,{ref:E,name:N,extension:C,size:T,timestamp:m?b||w:void 0,thumbnailDataUri:P,previewData:F||U,smaller:n,isTransferring:D,isUploading:x,transferProgress:R,className:h,sender:f,isSelectable:O,isSelected:p,actionIcon:M?Object(c.wb)(e)?"icon-play":"icon-eye":"icon-download",onClick:B,onDateClick:j?q:void 0})})},function(e,t,n){"use strict";var a=n(0),r=n(15),c=n(24);t.a=Object(a.h)(e=>{const{isOpen:t}=e,n=Object(c.a)(r.a.Extra,"StickerSetModal",!t);return n?a.a.createElement(n,e):void 0})},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var a=n(0),r=n(166),c=n(31),s=n(6);function i(e,t=!1,n){const i=Object(a.q)(null),o=Object(c.a)();return Object(a.n)(()=>{const a=i.current;if(!e||!a||t)return;const c=new Image,o=()=>{a.width=c.width,a.height=c.height;const e=a.getContext("2d",{alpha:!1});s.c&&(e.filter="blur(2px)"),e.drawImage(c,-4,-4,a.width+8,a.height+8),s.c||Object(r.a)(e,0,0,a.width,a.height,2,2)};c.onload=()=>{n?requestAnimationFrame(o):o()},c.src=e},[i,e,o,t,n]),i}},function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));const a=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],r=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];function c(e,t,n,c,s,i,o){if(Number.isNaN(i)||i<1)return;i|=0,Number.isNaN(o)&&(o=1),(o|=0)>3&&(o=3),o<1&&(o=1);const l=e.getImageData(t,n,c,s),d=l.data;let u,m,b,h,f,p,O,g,v,j,E,y,C=c-1,N=s-1,T=i+1,w=[],M=[],I=[],S=a[i],L=r[i],k=[],A=[];for(;o-- >0;){for(y=E=0,f=0;fC?C:p)<<2),u+=d[O++],m+=d[O++],b+=d[O++];for(h=0;h0?O<<2:0),g=y+k[h],v=y+A[h],u+=d[g++]-d[v++],m+=d[g++]-d[v++],b+=d[g++]-d[v++],E++;y+=c<<2}for(h=0;hN?0:c,u+=w[j],m+=M[j],b+=I[j];for(E=h<<2,f=0;f>>L,d[E+1]=m*S>>>L,d[E+2]=b*S>>>L,0==h&&(k[f]=((O=f+T)0?O*c:0),g=h+k[f],v=h+A[f],u+=w[g]-w[v],m+=M[g]-M[v],b+=I[g]-I[v],E+=c<<2}}e.putImageData(l,t,n)}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(9),s=n(49),i=n(40),o=n(80),l=n(25),d=n(16),u=n(21);n(244);const m={B:"bold",STRONG:"bold",I:"italic",EM:"italic",U:"underline",DEL:"strikethrough",CODE:"monospace"};t.a=Object(a.h)(({isOpen:e,anchorPosition:t,selectedRange:n,onClose:b})=>{const h=Object(a.q)(null),f=Object(a.q)(null),{shouldRender:p,transitionClassNames:O}=Object(i.a)(e),[g,v,j]=Object(l.a)(),[E,y]=Object(a.r)(""),[C,N]=Object(a.r)(!1),[T,w]=Object(a.r)(),[M,I]=Object(a.r)({});Object(a.n)(()=>e?Object(s.a)(b):void 0,[e,b]),Object(o.a)(e,h,b),Object(a.n)(()=>{g?f.current.focus():(y(""),N(!1))},[g]),Object(a.n)(()=>{p||(j(),I({}),w(void 0))},[j,p]),Object(a.n)(()=>{if(!e||!n)return;const t={};let{parentElement:a}=n.commonAncestorContainer;for(;a&&a.id!==r.z;){const e=m[a.tagName];e&&(t[e]=!0),a=a.parentElement}I(t)},[e,n,v]);const S=Object(a.m)(()=>{if(n)return n.toString()},[n]),L=Object(a.m)(()=>{if(n)return n.commonAncestorContainer.parentElement},[n]);function k(){const e=f.current;if(!e)return;const{offsetWidth:t,scrollWidth:n,scrollLeft:a}=e;if(n<=t)return void w(void 0);let r="";a0&&(r+=" mask-left"),w(r)}function A(e){if(M[e])return"active";if("monospace"===e||"strikethrough"===e){if(Object.keys(M).some(t=>t!==e&&!!M[t]))return"disabled"}else if(M.monospace||M.strikethrough)return"disabled"}const x=Object(a.m)(()=>{I(e=>(document.execCommand(e.bold?"removeFormat":"bold"),Object.keys(e).forEach(t=>{"italic"!==t&&"underline"!==t||!e[t]||document.execCommand(t)}),{...e,bold:!e.bold}))},[]),D=Object(a.m)(()=>{document.execCommand("italic"),I(e=>({...e,italic:!e.italic}))},[]),R=Object(a.m)(()=>{document.execCommand("underline"),I(e=>({...e,underline:!e.underline}))},[]),_=Object(a.m)(()=>{if(M.strikethrough){const e=L();if(!n||!e||"DEL"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void I(e=>({...e,strikethrough:!1}))}const e=S();document.execCommand("insertHTML",!1,`${e}`),b()},[L,S,b,n,M.strikethrough]),P=Object(a.m)(()=>{if(M.monospace){const e=L();if(!n||!e||"CODE"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void I(e=>({...e,monospace:!1}))}const e=S();document.execCommand("insertHTML",!1,`${e}`),b()},[L,S,b,n,M.monospace]);function F(){const e=E.includes("://")?E:"http://"+E;if(C){const t=L();if(!t||"A"!==t.tagName)return;return t.href=e,void b()}const t=S();!function(){if(!n)return;const e=window.getSelection();e&&(e.removeAllRanges(),e.addRange(n))}(),document.execCommand("insertHTML",!1,`${t}`),b()}const U=Object(a.m)(e=>{const t={KeyK:v,KeyB:x,KeyU:R,KeyI:D,KeyM:P,KeyS:_}[e.code];!e.altKey&&(e.ctrlKey||e.metaKey)&&t&&(e.preventDefault(),e.stopPropagation(),t())},[x,D,R,P,_,v]);Object(a.n)(()=>(e&&document.addEventListener("keydown",U),()=>document.removeEventListener("keydown",U)),[e,U]);const B=Object(d.a)();if(!p)return;const q=Object(c.a)("TextFormatter",O,g&&"link-control-shown"),H=Object(c.a)("TextFormatter-link-url-confirm",!!E.length&&"shown"),$=t?`left: ${t.x}px; top: ${t.y}px;--text-formatter-left: ${t.x}px;`:"";return a.a.createElement("div",{ref:h,className:q,style:$,onKeyDown:function(e){"Enter"===e.key&&g&&(F(),e.preventDefault())}},a.a.createElement("div",{className:"TextFormatter-buttons"},a.a.createElement(u.a,{color:"translucent",ariaLabel:"Bold text",className:A("bold"),onClick:x},a.a.createElement("i",{className:"icon-bold"})),a.a.createElement(u.a,{color:"translucent",ariaLabel:"Italic text",className:A("italic"),onClick:D},a.a.createElement("i",{className:"icon-italic"})),a.a.createElement(u.a,{color:"translucent",ariaLabel:"Underlined text",className:A("underline"),onClick:R},a.a.createElement("i",{className:"icon-underlined"})),a.a.createElement(u.a,{color:"translucent",ariaLabel:"Strikethrough text",className:A("strikethrough"),onClick:_},a.a.createElement("i",{className:"icon-strikethrough"})),a.a.createElement(u.a,{color:"translucent",ariaLabel:"Monospace text",className:A("monospace"),onClick:P},a.a.createElement("i",{className:"icon-monospace"})),a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement(u.a,{color:"translucent",ariaLabel:B("TextFormat.AddLinkTitle"),onClick:v},a.a.createElement("i",{className:"icon-link"}))),a.a.createElement("div",{className:"TextFormatter-link-control"},a.a.createElement("div",{className:"TextFormatter-buttons"},a.a.createElement(u.a,{color:"translucent",ariaLabel:B("Cancel"),onClick:j},a.a.createElement("i",{className:"icon-arrow-left"})),a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement("div",{className:Object(c.a)("TextFormatter-link-url-input-wrapper",T)},a.a.createElement("input",{ref:f,className:"TextFormatter-link-url-input",type:"text",value:E,placeholder:"Enter URL...",autoComplete:"off",inputMode:"url",dir:"auto",onChange:function(e){y(e.target.value),k()},onScroll:k})),a.a.createElement("div",{className:H},a.a.createElement("div",{className:"TextFormatter-divider"}),a.a.createElement(u.a,{color:"translucent",ariaLabel:B("Save"),className:"color-primary",onClick:F},a.a.createElement("i",{className:"icon-check"}))))))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r})),n.d(t,"c",(function(){return s})),n.d(t,"b",(function(){return i}));var a=n(2);const r=navigator.clipboard&&window.ClipboardItem,c=document.createElement("textarea");c.setAttribute("readonly",""),c.tabIndex=-1,c.className="visually-hidden";const s=e=>{c.value=e,document.body.appendChild(c);const t=document.getSelection();if(t){const e=t.rangeCount>0&&t.getRangeAt(0);c.select(),document.execCommand("copy"),e&&(t.removeAllRanges(),t.addRange(e))}document.body.removeChild(c)},i=e=>{if(!e)return;const t=document.createElement("canvas"),n=t.getContext("2d"),a=new Image;a.onload=e=>{if(n&&e.currentTarget){const a=e.currentTarget;t.width=a.width,t.height=a.height,n.drawImage(a,0,0,a.width,a.height),t.toBlob(o,"image/png",1)}},a.src=e};async function o(e){if(e&&r)try{await navigator.clipboard.write([new window.ClipboardItem({[e.type]:e})])}catch(e){a.r&&console.error(e)}}},function(e,t,n){"use strict";var a=n(0),r=n(30),c=n(4),s=n(110),i=n(117);n(252);t.a=Object(a.h)(({message:e,idPrefix:t="shared-media",onClick:n})=>{const o=Object(a.m)(()=>{n(e.id,e.chatId)},[e.id,e.chatId,n]),l=Object(c.F)(e),d=Object(s.a)(Object(c.E)(e,"pictogram")),{shouldRenderThumb:u,shouldRenderFullMedia:m,transitionClassNames:b}=Object(i.a)(d,"slow"),h=Object(c.Q)(e);return a.a.createElement("div",{id:`${t}${e.id}`,className:"Media scroll-item",onClick:n?o:void 0},u&&a.a.createElement("img",{src:l,alt:""}),m&&a.a.createElement("img",{src:d,className:b+" full-media",alt:""}),h&&a.a.createElement("span",{className:"video-duration"},h.isGif?"GIF":Object(r.e)(h.duration)))})},function(e,t,n){"use strict";var a=n(0),r=n(4),c=n(115),s=n(48),i=n(47),o=n(108),l=n(111),d=n(128),u=n(144),m=n(131),b=n(16),h=n(20);n(192);t.a=Object(a.h)(({itemIds:e,selectedIds:t,filterValue:n,filterPlaceholder:f,notFoundText:p,searchInputId:O,isLoading:g,noScrollRestore:v,onSelectedIdsChange:j,onFilterChange:E,onLoadMore:y})=>{const C=Object(a.q)(null),N=t.length>10;Object(a.n)(()=>{setTimeout(()=>{requestAnimationFrame(()=>{C.current.focus()})},500)},[]);const T=Object(a.m)(e=>{const n=[...t];n.includes(e)?n.splice(n.indexOf(e),1):n.push(e),j(n),E("")},[t,j,E]),w=Object(a.m)(e=>{const{value:t}=e.currentTarget;E(t)},[E]),[M,I]=Object(m.a)(y,e,Boolean(n)),S=Object(b.a)();return a.a.createElement("div",{className:"Picker"},a.a.createElement("div",{className:"picker-header custom-scroll",dir:S.isRtl?"rtl":void 0},t.map((e,n)=>a.a.createElement(u.a,{chatOrUserId:e,isMinimized:N&&na.a.createElement(o.a,{key:e,className:"chat-item-clickable picker-list-item",onClick:()=>T(e),ripple:!0},a.a.createElement(s.a,{label:"",checked:t.includes(e)}),Object(r.ob)(e)?a.a.createElement(l.a,{userId:e}):a.a.createElement(d.a,{chatId:e})))):g||!M||M.length?a.a.createElement(h.a,null):a.a.createElement("p",{className:"no-results"},p||"Sorry, nothing found."))})},,function(e,t,n){"use strict";var a=n(0),r=n(6),c=n(30),s=n(4);var i=n(9),o=n(22);var l=n(123),d=n(40),u=n(140),m=n(181),b=n(185),h=n(16),f=n(21),p=n(124),O=n(32);n(226);const g=r.l?20:25,v=r.l?50:75;function j(e,t,{handleStartSeek:n,handleSeek:r,handleStopSeek:c}){return a.a.createElement("div",{className:"seekline no-selection",onMouseDown:n,onMouseMove:r,onMouseUp:c},a.a.createElement("span",{className:"seekline-buffered-progress"},a.a.createElement("i",{style:`transform: translateX(${100*t}%)`})),a.a.createElement("span",{className:"seekline-play-progress"},a.a.createElement("i",{style:`transform: translateX(${100*e}%)`})),a.a.createElement("span",{className:"seekline-thumb"},a.a.createElement("i",{style:`transform: translateX(${100*e}%)`})))}t.a=Object(a.h)(({theme:e,message:t,senderTitle:n,uploadProgress:E,target:y,date:C,lastSyncTime:N,className:T,isSelectable:w,isSelected:M,onPlay:I,onReadMedia:S,onCancelUpload:L,onDateClick:k})=>{const{content:{audio:A,voice:x},isMediaUnread:D}=t,R=Boolean(x),_=Object(a.q)(!1),P=Object(h.a)(),[F,U]=Object(a.r)(!1),B=N,{mediaData:q,downloadProgress:H}=Object(l.a)(Object(s.E)(t,"inline"),!B,Object(s.D)(t,"inline"));const{isBuffered:$,bufferedProgress:K,bufferingHandlers:V,checkBuffering:z}=Object(u.a)(),{isPlaying:Y,playProgress:W,playPause:G,setCurrentTime:X,duration:J}=Object(m.a)(Object(s.C)(t),Object(s.q)(t),q,V,z,F,(function(){U(!0),I(t.id,t.chatId)}),Object(s.xb)(t));Object(a.n)(()=>{U(Y)},[Y]);const{isDownloadStarted:Q,downloadProgress:Z,handleDownloadClick:ee}=Object(b.a)(Object(s.E)(t,"download"),Object(s.u)(t)),te=F&&!$,{isUploading:ne,isTransferring:ae,transferProgress:re}=Object(s.r)(t,Q?Z:E||H,te||Q),{shouldRender:ce,transitionClassNames:se}=Object(d.a)(ae),ie=Object(a.m)(()=>{ne?L&&L():(Y||I(t.id,t.chatId),U(!F),G())},[Y,ne,t.id,t.chatId,L,I,G,F]);Object(a.n)(()=>{Y&&S&&D&&S()},[Y,D,S]);const oe=Object(a.m)(e=>{if(_.current){const t=e.currentTarget.closest(".seekline,.waveform");if(t){const{width:n,left:a}=t.getBoundingClientRect();X(J*((e.clientX-a)/n))}}},[J,X]),le=Object(a.m)(e=>{_.current=!0,oe(e)},[oe]),de=Object(a.m)(()=>{_.current=!1},[]),ue=Object(a.m)(()=>{k(t.id,t.chatId)},[k,t.id,t.chatId]);const me={handleStartSeek:le,handleSeek:oe,handleStopSeek:de},be=Object(s.yb)(t),he=Object(a.p)(()=>x&&function(e,t=0,n=!1,{handleStartSeek:r,handleSeek:c,handleStopSeek:s},i){const{waveform:o,duration:l}=e;if(!o)return;const d="dark"===i?"#494B75":"#CBCBCB",u="dark"===i?"#C0BBED":"#B0DEA6",m="dark"===i?"#868DF5":"#54a3e6",b="dark"===i?"#FFFFFF":"#53ad53",h=Math.min(l/30,1),f=Math.round(g+(v-g)*h),p=function(e){const t=8*e.length,n=Math.floor(t/5);if(!n)return[];const a=Array(n),r=e;for(let e=0,t=n-1;e!==t;++e){const t=Math.floor(5*e/8),n=Math.floor(5*e%8),c=r[t]+(r[t+1]<<8);a[e]=c>>n&31}const c=Math.floor(5*(n-1)/8),s=Math.floor(5*(n-1)%8),i=r[c]+(r[c+1]<<8);return a[n-1]=i>>s&31,a}(new Uint8Array(o)),{data:O,peak:j}=function(e,t){let n=0;const a=new Array(t),r=e.length/t,c=e[0],s=e[e.length-1];for(let d=0;d{i.globalAlpha=s/e.length>=t?.5:1,i.fillStyle=t>s/e.length?r:a;const o=Math.max(2,c/Math.max(1,n)*23);!function(e,t,n,a,r,c){a<2*c&&(c=a/2);r<2*c&&(c=r/2);e.beginPath(),e.moveTo(t+c,n),e.arcTo(t+a,n,t+a,n-r,c),e.arcTo(t+a,n-r,t,n-r,c),e.arcTo(t,n-r,t,n,c),e.arcTo(t,n,t+a,n,c),e.closePath()}(i,4*s,23,2,o,1),i.fill()}),{src:s.toDataURL(),width:c,height:23}}(O,t,{peak:j,fillStyle:n?u:d,progressFillStyle:n?b:m});return a.a.createElement("img",{src:E,alt:"",width:y,height:C,className:"waveform",draggable:!1,onMouseDown:r,onMouseMove:c,onMouseUp:s})}(x,W,be,me,e),[x,W,be,me,e]),fe=Object(i.a)("Audio media-inner",T,be&&!y&&"own",y&&"bigger",M&&"audio-is-selected"),pe=["toggle-play"];te?pe.push("loading"):Y?pe.push("pause"):Y||pe.push("play");const Oe=Y||W>0&&W<1,ge=Object(i.a)("content",Oe&&"with-seekline");return a.a.createElement("div",{className:fe,dir:P.isRtl?"rtl":void 0},w&&a.a.createElement("div",{className:"message-select-control"},M&&a.a.createElement("i",{className:"icon-select"})),a.a.createElement(f.a,{round:!0,ripple:!r.l,size:y?"smaller":"tiny",className:pe.join(" "),ariaLabel:Y?"Pause audio":"Play audio",onClick:ie,isRtl:P.isRtl},a.a.createElement("i",{className:"icon-play"}),a.a.createElement("i",{className:"icon-pause"})),ce&&a.a.createElement("div",{className:Object(i.a)("media-loading",se,te&&"interactive")},a.a.createElement(p.a,{progress:re,transparent:!0,size:y?"m":"s",onClick:te?ie:void 0,noCross:!te})),A&&a.a.createElement(f.a,{round:!0,size:"tiny",className:"download-button",ariaLabel:Q?"Cancel download":"Download",onClick:ee},a.a.createElement("i",{className:Q?"icon-close":"icon-arrow-down"})),"searchResult"===y&&a.a.createElement(a.a.Fragment,null,a.a.createElement("div",{className:ge},a.a.createElement("div",{className:"content-row"},a.a.createElement("p",{className:"title",dir:"auto"},Object(o.a)(function(){if(R)return n||"Voice";const{title:e,fileName:t}=A;return e||t}())),a.a.createElement("div",{className:"message-date"},C&&a.a.createElement(O.a,{className:"date",onClick:ue},Object(c.g)(P,1e3*C)))),Oe&&j(W,K,me),!Oe&&a.a.createElement("p",{className:"duration",dir:"auto"},W>0?Object(c.e)(J*W)+" / ":void 0,function(){if(R)return Object(c.e)(x.duration);const{performer:e}=A;return a.a.createElement(a.a.Fragment,null,e&&Object(o.a)(e),e&&n&&a.a.createElement("span",null,"•"),n&&Object(o.a)(n))}()))),"searchResult"!==y&&A&&function(e,t,n,r,s,i,l,d){const{title:u,performer:m,duration:b,fileName:h}=t,f=n||r>0&&r<1;return a.a.createElement("div",{className:"content"},a.a.createElement("p",{className:"title",dir:"auto"},Object(o.a)(u||h)),f&&j(r,s,i),!f&&a.a.createElement("div",{className:"meta",dir:"auto"},a.a.createElement("span",{className:"performer"},Object(o.a)(m||"Unknown")),l&&a.a.createElement(a.a.Fragment,null," ","•"," ",a.a.createElement(O.a,{className:"date",onClick:d},Object(c.d)(e,1e3*l)))),a.a.createElement("p",{className:"duration",dir:"auto"},r>0?Object(c.e)(b*r)+" / ":void 0,Object(c.e)(b)))}(P,A,Y,W,K,me,C,k?ue:void 0),"searchResult"!==y&&x&&function(e,t,n){return a.a.createElement("div",{className:"content"},t,a.a.createElement("p",{className:"voice-duration",dir:"auto"},Object(c.e)(e.duration),n&&a.a.createElement("span",null,"•")))}(x,he,D))})},function(e,t,n){"use strict";var a=n(0),r=n(145),c=n(29),s=n(146),i=n(16),o=n(9),l=n(22);n(206);var d=Object(a.h)(({className:e,title:t,active:n,badgeCount:r,isBadgeActive:c,previousActiveTab:s,onClick:i,clickArg:d})=>{const u=Object(a.q)(null);return Object(a.o)(()=>{if(!n||void 0===s)return;const e=u.current,t=e.querySelector("i"),a=e.parentElement.children[s].querySelector("i");a.classList.remove("animate"),t.classList.remove("animate");const r=a.parentElement.offsetLeft-t.parentElement.offsetLeft,c=a.clientWidth/t.clientWidth;t.style.transform=`translate3d(${r}px, 0, 0) scale3d(${c}, 1, 1)`,requestAnimationFrame(()=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{t.classList.add("animate"),t.style.transform="none"})})})},[n,s]),a.a.createElement("button",{type:"button",className:Object(o.a)("Tab",e,n&&"active"),onClick:()=>i(d),ref:u},a.a.createElement("span",null,Object(l.a)(t),!!r&&a.a.createElement("span",{className:Object(o.a)("badge",c&&"active")},r),a.a.createElement("i",null)))});n(207);t.a=Object(a.h)(({tabs:e,activeTab:t,big:n,onSwitchTab:o})=>{const l=Object(a.q)(null),u=Object(c.a)(t);Object(s.a)(l.current),Object(a.n)(()=>{const e=l.current;if(e.scrollWidth<=e.offsetWidth)return;const t=e.querySelector(".Tab.active");if(t){const n=t.offsetLeft-e.offsetWidth/2+t.offsetWidth/2;if(Math.abs(n-e.scrollLeft)<16)return;Object(r.a)(e,n)}},[t]);const m=Object(i.a)();return a.a.createElement("div",{className:"TabList no-selection no-scrollbar "+(n?"big":""),ref:l,dir:m.isRtl?"rtl":void 0},e.map((e,n)=>a.a.createElement(d,{key:e.title,title:m(e.title),active:n===t,badgeCount:e.badgeCount,isBadgeActive:e.isBadgeActive,previousActiveTab:u,onClick:o,clickArg:n})))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));const a={CHAT_RESTRICTED:"You can't send messages in this chat, you were restricted",CHAT_WRITE_FORBIDDEN:"You can't write in this chat",CHAT_SEND_POLL_FORBIDDEN:"You can't create polls in this chat",CHAT_SEND_STICKERS_FORBIDDEN:"You can't send stickers in this chat",CHAT_SEND_GIFS_FORBIDDEN:"You can't send gifs in this chat",CHAT_SEND_MEDIA_FORBIDDEN:"You can't send media in this chat",CHAT_LINK_EXISTS:"The chat is public, you can't hide the history to new users",SLOWMODE_WAIT_X:"Slowmode is enabled in this chat: you must wait for the specified number of seconds before sending another message to the chat.",USER_BANNED_IN_CHANNEL:"You're banned from sending messages in supergroups / channels",USER_IS_BLOCKED:"You were blocked by this user",YOU_BLOCKED_USER:"You blocked this user",IMAGE_PROCESS_FAILED:"Failure while processing image",MEDIA_EMPTY:"The provided media object is invalid",MEDIA_INVALID:"Media invalid",PHOTO_EXT_INVALID:"The extension of the photo is invalid",PHOTO_INVALID_DIMENSIONS:"The photo dimensions are invalid",PHOTO_SAVE_FILE_INVALID:"Internal issues, try again later",MESSAGE_DELETE_FORBIDDEN:"You can't delete one of the messages you tried to delete, most likely because it is a service message.",MESSAGE_POLL_CLOSED:"Poll closed",MESSAGE_EDIT_TIME_EXPIRED:"You can't edit this message anymore.",CHAT_ADMIN_REQUIRED:"You must be an admin in this chat to do this",PINNED_DIALOGS_TOO_MUCH:"Sorry, you can only pin 5 chats to the top",DIALOG_FILTERS_TOO_MUCH:"Sorry, you can't have more than 10 folders",CHANNEL_PRIVATE:"This channel is private",MEDIA_CAPTION_TOO_LONG:"The provided caption is too long",ADDRESS_STREET_LINE1_INVALID:"The address you provided is not valid",ADDRESS_STREET_LINE2_INVALID:"The address you provided is not valid",ADDRESS_CITY_INVALID:"The city you provided is not valid",ADDRESS_COUNTRY_INVALID:"The country you provided is not valid",ADDRESS_POSTCODE_INVALID:"The postcode you provided is not valid",ADDRESS_STATE_INVALID:"The state you provided is not valid",REQ_INFO_NAME_INVALID:"The name you provided is not valid",REQ_INFO_PHONE_INVALID:"The phone you provided is not valid",REQ_INFO_EMAIL_INVALID:"The email you provided is not valid",LINK_NOT_MODIFIED:"This discussion is already linked to the channel",SERVICE_WORKER_DISABLED:"Service Worker is disabled. Please reload the page without holding key.",CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS:"The provided caption is too long. Please remove {EXTRA_CHARS_COUNT} character{PLURAL_S}.",FRESH_RESET_AUTHORISATION_FORBIDDEN:"You can’t logout other sessions if less than 24 hours have passed since you logged on the current session",BOTS_TOO_MUCH:"There are too many bots in this chat/channel",BOT_GROUPS_BLOCKED:"This bot can't be added to groups",USERS_TOO_MUCH:"The maximum number of users has been exceeded",USER_CHANNELS_TOO_MUCH:"One of the users you tried to add is already in too many channels/supergroups",USER_KICKED:"This user was kicked from this supergroup/channel",USER_NOT_MUTUAL_CONTACT:"The provided user is not a mutual contact",USER_PRIVACY_RESTRICTED:"The user's privacy settings do not allow you to do this",INVITE_HASH_EMPTY:"The invite hash is empty",INVITE_HASH_EXPIRED:"The invite link has expired",INVITE_HASH_INVALID:"The invite hash is invalid",CHANNELS_TOO_MUCH:"You have joined too many channels/supergroups",USER_ALREADY_PARTICIPANT:"You already in the group",SCHEDULE_DATE_INVALID:"Invalid schedule date provided",WALLPAPER_DIMENSIONS_INVALID:"The wallpaper dimensions are invalid, please select another file"};function r(e){const{message:t,isSlowMode:n,textParams:r}=e;if(n){const e=t.indexOf(" (caused by");return e>0?t.substring(0,e):t}let c=a[t];return c&&r&&(c=Object.keys(r).reduce((e,t)=>e.replace(t,r[t]),c)),c}},function(e,t,n){"use strict";n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return r}));function a(e,t,n){c("transitionend",e,t,n)}function r(e,t,n){c("animationend",e,t,n)}function c(e,t,n,a){let r=!1;t.addEventListener(e,(function c(s){r||s.target!==s.currentTarget||a&&(s instanceof TransitionEvent&&s.propertyName===a||s instanceof AnimationEvent&&s.animationName===a)||(r=!0,t.removeEventListener(e,c),setTimeout(()=>{n()},50))}))}},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(4),s=n(16);t.a=({chat:e,privateChatUser:t,handleDelete:n,folderId:i,isPinned:o,isMuted:l})=>{const d=Object(s.a)(),{toggleChatPinned:u,updateChatMutedState:m,toggleChatArchived:b,toggleChatUnread:h}=Object(r.d)();return Object(a.p)(()=>{if(!e)return;const a=t&&t.isSelf,r=e.unreadCount||e.hasUnreadMark?{title:d("MarkAsRead"),icon:"readchats",handler:()=>h({id:e.id})}:{title:d("MarkAsUnread"),icon:"unread",handler:()=>h({id:e.id})},s=o?{title:d("UnpinFromTop"),icon:"unpin",handler:()=>u({id:e.id,folderId:i})}:{title:d("PinToTop"),icon:"pin",handler:()=>u({id:e.id,folderId:i})},f=l?{title:d("ChatList.Unmute"),icon:"unmute",handler:()=>m({chatId:e.id,isMuted:!1})}:{title:d("ChatList.Mute"),icon:"mute",handler:()=>m({chatId:e.id,isMuted:!0})},p=Object(c.kb)(e)?{title:d("Unarchive"),icon:"unarchive",handler:()=>b({id:e.id})}:{title:d("Archive"),icon:"archive",handler:()=>b({id:e.id})};return[r,s,...a?[]:[f,p],{title:Object(c.ob)(e.id)?d("Delete"):d(Object(c.c)(e)?"DeleteChat":Object(c.mb)(e)?"LeaveChannel":"Group.LeaveGroup"),icon:"delete",destructive:!0,handler:n}]},[e,t,d,o,n,h,u,i,m,b,l])}},function(e,t,n){"use strict";var a=n(0),r=n(30),c=n(16),s=n(178);n(211);t.a=Object(a.h)(({message:e,outgoingStatus:t})=>{const n=Object(c.a)();return a.a.createElement("div",{className:"LastMessageMeta"},t&&a.a.createElement(s.a,{status:t}),a.a.createElement("span",{className:"time"},Object(r.g)(n,1e3*e.date)))})},function(e,t,n){"use strict";var a,r=n(0),c=n(113);n(210);!function(e){e[e.failed=0]="failed",e[e.pending=1]="pending",e[e.succeeded=2]="succeeded",e[e.read=3]="read"}(a||(a={}));t.a=Object(r.h)(({status:e})=>r.a.createElement("div",{className:"MessageOutgoingStatus"},r.a.createElement(c.a,{name:"reveal",activeKey:a[e]},()=>r.a.createElement("i",{className:"icon-message-"+e}))))},function(e,t,n){"use strict";var a=n(0);t.a=(e,t,n,r,c=0,s=0)=>{const[i,o]=Object(a.r)("right"),[l,d]=Object(a.r)("bottom"),[u,m]=Object(a.r)("");return Object(a.n)(()=>{const a=t();if(!e||!a)return;let{x:i,y:l}=e;const u={width:0,left:0,height:0,top:0},b=r(),h=n(),f=a.getBoundingClientRect(),p=b?{width:b.offsetWidth,height:b.offsetHeight}:u,O=h?h.getBoundingClientRect():u;let g;i+p.width+c0?(g="right",i-=3):(g="left",i=16),o(g),l+p.height{t&&!l&&d&&!i.current&&(i.current=window.setTimeout(()=>{i.current=void 0,o()},t))},[e]),i.current&&t&&!l?n:e}},function(e,t,n){"use strict";var a=n(0),r=n(182),c=n(58),s=n(161),i=n(52);t.a=(e,t,n,o,l,d=!1,u,m=!1)=>{const b=Object(a.q)(null),[h,f]=Object(a.r)(!1);let p=h;const[O,g]=Object(a.r)(0);Object(i.a)(()=>{b.current=Object(r.a)(e,(e,n)=>{switch(e){case"onPlay":f(!0);break;case"onPause":f(!1);break;case"onTimeUpdate":{const{proxy:e}=b.current,n=e.duration&&Number.isFinite(e.duration)?e.duration:t;g(e.currentTime/n);break}}o&&o[e]&&o[e](n)},u);const{proxy:n}=b.current;h||n.paused||(f(!0),p=!0),l&&l(n)},[e]);const{play:v,pause:j,setCurrentTime:E,proxy:y,destroy:C}=b.current,N=y.duration&&Number.isFinite(y.duration)?y.duration:t;Object(a.n)(()=>{N&&!Object(s.a)(y)&&g(y.currentTime/N)},[N,O,y]),Object(a.n)(()=>()=>{C(m)},[C,m]),Object(c.a)(([e,t])=>{e===d&&n===t||y.src&&y.paused||d&&n&&!h&&v(n)},[d,n,h,v,y.src,y.paused]);const T=Object(a.m)(()=>{h?j():n&&v(n)},[n,j,v,h]);return{isPlaying:p,playProgress:O,playPause:T,setCurrentTime:E,audioProxy:y,duration:N}}},function(e,t,n){"use strict";n.d(t,"b",(function(){return u})),n.d(t,"a",(function(){return m}));var a=n(6),r=n(139),c=n(161),s=n(1),i=n(4);const o=new Map;let l,d=[];function u(){const e=l&&o.get(l);e&&e.audio.pause()}function m(e,t,n){o.has(e)||(o.set(e,function(e,t){const n=new Audio;function a(t){return a=>{o.has(e)&&(Object(c.a)(n)||o.get(e).handlers.forEach(e=>{e(t,a)}))}}return n.addEventListener("timeupdate",a("onTimeUpdate")),n.addEventListener("play",a("onPlay")),n.addEventListener("pause",a("onPause")),n.addEventListener("loadstart",a("onLoadStart")),n.addEventListener("loadeddata",a("onLoadedData")),n.addEventListener("playing",a("onPlaying")),n.addEventListener("ended",()=>{if(Object(c.a)(n))return;const t=d[d.indexOf(e)+1];if(!t)return;if(!o.has(t))return void Object(s.d)().openAudioPlayer(Object(i.Eb)(t));const a=o.get(t);a.onForcePlay&&a.onForcePlay(),l=t,a.audio.src&&Object(r.a)(a.audio)}),{audio:n,proxy:new Proxy(n,{get:(e,t)=>e[t]}),handlers:[],onForcePlay:t}}(e,n)),d.includes(e)||d.push(e));const{audio:u,proxy:m,handlers:b}=o.get(e);return b.push(t),{play(t){l&&l!==e&&o.get(l).audio.pause(),l=e,u.src||(u.src=t,u.preload="auto",t.includes("/progressive/")&&a.j&&Object(c.b)(u)),Object(r.a)(u)},pause(){l===e&&u.pause()},setCurrentTime(t){l===e&&(u.currentTime=t)},proxy:m,destroy(n=!1){const a=o.get(e);a&&(a.handlers=a.handlers.filter(e=>e!==t),a.handlers.length||(a.audio.pause(),o.delete(e),n&&(d=d.filter(t=>t!==e)),e===l&&(l=void 0)))}}}},function(e,t,n){"use strict";function a(e,t){const n=document.createElement("a");n.href=e,n.download=t,n.click()}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";var a=n(0),r=n(40),c=n(117),s=n(9),i=n(30),o=n(60),l=n(118),d=n(22),u=n(16),m=n(124),b=n(32);n(225);t.a=Object(a.h)(({ref:e,name:t,size:n,extension:h="",timestamp:f,sender:p,thumbnailDataUri:O,previewData:g,className:v,smaller:j,isTransferring:E,isUploading:y,isSelectable:C,isSelected:N,transferProgress:T,actionIcon:w,onClick:M,onDateClick:I})=>{const S=Object(u.a)();let L=Object(a.q)(null);e&&(L=e);const{shouldRender:k,transitionClassNames:A}=Object(r.a)(E,void 0,!0),x=Object(o.a)(h),D=Object(o.e)(n),{shouldRenderThumb:R,shouldRenderFullMedia:_,transitionClassNames:P}=Object(c.a)(g,"slow"),{width:F,height:U}=Object(l.k)(j),B=Object(s.a)("File",v,j&&"smaller",M&&!y&&"interactive",N&&"file-is-selected");return a.a.createElement("div",{ref:L,className:B,dir:S.isRtl?"rtl":void 0},C&&a.a.createElement("div",{className:"message-select-control"},N&&a.a.createElement("i",{className:"icon-select"})),a.a.createElement("div",{className:"file-icon-container",onClick:y?void 0:M},O||g?a.a.createElement("div",{className:"file-preview media-inner"},R&&a.a.createElement("img",{src:O,width:F,height:U,className:"thumbnail",alt:""}),_&&a.a.createElement("img",{src:g,className:"full-media "+P,width:F,height:U,alt:""})):a.a.createElement("div",{className:"file-icon "+x},h.length<=4&&a.a.createElement("span",{className:"file-ext",dir:"auto"},h)),k&&a.a.createElement("div",{className:Object(s.a)("file-progress",x,A)},a.a.createElement(m.a,{progress:T,size:j?"s":"m",onClick:y?M:void 0})),M&&a.a.createElement("i",{className:Object(s.a)("action-icon",w||"icon-download",k&&"hidden")})),a.a.createElement("div",{className:"file-info"},a.a.createElement("div",{className:"file-title",dir:"auto"},Object(d.a)(t)),a.a.createElement("div",{className:"file-subtitle",dir:"auto"},a.a.createElement("span",null,E&&T?Math.round(100*T)+"%":D),p&&a.a.createElement("span",{className:"file-sender"},Object(d.a)(p)),!p&&f&&a.a.createElement(a.a.Fragment,null," ",a.a.createElement(b.a,{onClick:I},Object(i.d)(S,1e3*f))))),p&&f&&a.a.createElement(b.a,{onClick:I},Object(i.g)(S,1e3*f)))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(0),r=n(123),c=n(183);function s(e,t){const[n,s]=Object(a.r)(!1),{mediaData:i,downloadProgress:o}=Object(r.a)(e,!n);Object(a.n)(()=>{n&&i&&(Object(c.a)(i,t),s(!1))},[t,i,n]),Object(a.n)(()=>{s(!1)},[e]);const l=Object(a.m)(e=>{e.stopPropagation(),s(e=>!e)},[]);return{isDownloadStarted:n,downloadProgress:o,handleDownloadClick:l}}},function(e,t,n){"use strict";var a=n(0),r=n(2),c=n(40),s=n(9),i=n(49),o=n(127);n(232);t.a=Object(a.h)(({message:e,duration:t=3e3,containerId:n,onDismiss:l})=>{const[d,u]=Object(a.r)(!0),m=Object(a.q)(null),{transitionClassNames:b}=Object(c.a)(d),h=Object(a.m)(()=>{u(!1),setTimeout(l,150+r.c)},[l]);Object(a.n)(()=>d?Object(i.a)(h):void 0,[d,h]),Object(a.n)(()=>(m.current=window.setTimeout(h,t),()=>{m.current&&(clearTimeout(m.current),m.current=void 0)}),[t,h]);const f=Object(a.m)(()=>{m.current&&(clearTimeout(m.current),m.current=void 0)},[]),p=Object(a.m)(()=>{m.current=window.setTimeout(h,t)},[t,h]);return a.a.createElement(o.a,{className:"Notification-container",containerId:n},a.a.createElement("div",{className:Object(s.a)("Notification",b),onClick:h,onMouseEnter:f,onMouseLeave:p},a.a.createElement("div",{className:"content"},e)))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));function a(e,t){const{commonAncestorContainer:n}=e;let a=n,r=1;for(;a&&a.id!==t&&r<5;)a=a.parentElement,r++;return Boolean(a&&a.id===t)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return O}));var a=n(0),r=n(2),c=n(51),s=n(66),i=n(134),o=n(3),l=n(25);let d,u,m,b;const h=/(
|)/g,f=/ /g,p=/(
|<\/div>)/gi;try{b=new RegExp("(^|\\s):[-+_:\\p{L}\\p{N}]*$","gui")}catch(e){b=new RegExp("(^|\\s):[-+_:\\d\\wа-яё]*$","gi")}function O(e,t,O,g=r.z,v,j,E,y=!1){const[C,N,T]=Object(l.a)(),[w,M]=Object(a.r)(),[I,S]=Object(a.r)(),[L,k]=Object(a.r)({}),[A,x]=Object(a.r)(),[D,R]=Object(a.r)({}),[_,P]=Object(a.r)(!1),[F,U]=Object(a.r)(c.a),B=Object(a.p)(()=>w&&O.length?Object.values(Object(o.m)(w,O)):[],[w,O]);Object(a.n)(()=>{if(y)return;const e=()=>{M(m.emojis)};m?e():async function(){d||(d=n.e(1).then(n.t.bind(null,325,3)),u=(await d).default,m=Object(s.b)(u));return d}().then(e)},[y]),Object(a.n)(()=>{if(!w||y)return;const e=Object.values(w),t=Object(o.c)(e,"native"),n=j?Object(o.i)(j,e=>Object.values(Object(o.m)(t,e))):{},a=E?Object(o.i)(E,e=>Object.values(Object(o.m)(t,e))):{};k({...n,...a}),S([...Object.keys(n),...Object.keys(a)]);const r=e.reduce((e,t)=>(t.names.forEach(n=>{e[n]||(e[n]=[]),e[n].push(t)}),e),{});R(r),x(Object.keys(r))},[y,j,w,E]),Object(a.n)(()=>{if(!(e&&t&&w&&I&&I.length))return void T();const n=t.includes(":")&&function(e){const t=e.replace(f," ").replace(h,"\n").replace(p,"").match(b);return t?t[0].trim():void 0}(t);if(!n)return U(c.a),void T();const a=n.length>2&&n.endsWith(":"),r=n.substr(1,a?n.length-2:void 0);let s=[];if(P(a),r){if(r.length>=2){const e=I.filter(e=>e.startsWith(r)).sort();s=s.concat(Object(o.h)(Object.values(Object(o.m)(L,e))));const t=A.filter(e=>e.startsWith(r));s=s.concat(Object(o.h)(Object.values(Object(o.m)(D,t)))),s=Object(o.o)(s)}}else s=B;s.length?(a||N(),U(s.slice(0,36))):T()},[w,L,I,D,A,t,e,N,B,T,P]);const q=Object(a.m)((e,n)=>{const a=t.lastIndexOf(":",n?t.lastIndexOf(":")-1:void 0);if(-1!==a){v(`${t.substr(0,a)}${e}`);const n=document.getElementById(g);requestAnimationFrame(()=>{Object(i.a)(n,!0)})}T()},[t,g,v,T]);return Object(a.n)(()=>{C&&_&&F.length&&q(F[0].native,!0)},[F,q,C,_]),{isEmojiTooltipOpen:C,closeEmojiTooltip:T,filteredEmojis:F,insertEmoji:q}}},function(e,t,n){"use strict";var a=n(0),r=n(15),c=n(24);t.a=Object(a.h)(e=>{const{isOpen:t}=e,n=Object(c.a)(r.a.Extra,"EmojiTooltip",!t);return n?a.a.createElement(n,e):void 0})},function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(2),s=n(7),i=n(10),o=n(134),l=n(9),d=n(3),u=n(6),m=n(56),b=n(162),h=n(25),f=n(65),p=n(187),O=n(16),g=n(22),v=n(167);const j=u.l?256:416;t.a=Object(a.h)(Object(r.h)(e=>{const{chatId:t,threadId:n}=Object(s.z)(e)||{},{messageSendKeyCombo:a}=e.settings.byKey;return{currentChatId:t,messageSendKeyCombo:a,replyingToId:t&&n?Object(s.ob)(e,t,n):void 0,noTabCapture:e.isPollModalOpen||e.payment.isPaymentModalOpen}},(e,t)=>Object(d.l)(t,["editLastMessage","replyToNextMessage"]))(({id:e,isAttachmentModalInput:t,editableInputId:n,html:r,placeholder:s,forcedPlaceholder:d,shouldSetFocus:E,shouldSuppressFocus:y,shouldSuppressTextFormatter:C,onUpdate:N,onSuppressedFocus:T,onSend:w,currentChatId:M,replyingToId:I,noTabCapture:S,messageSendKeyCombo:L,editLastMessage:k,replyToNextMessage:A})=>{const x=Object(a.q)(null),D=Object(a.q)(null),R=Object(O.a)(),_=Object(a.q)(!1),[P,F,U]=Object(h.a)(),[B,q]=Object(a.r)(),[H,$]=Object(a.r)();Object(a.n)(()=>{t&&Y(!1)},[t]),Object(b.a)(([e])=>{r!==x.current.innerHTML&&(x.current.innerHTML=r),r!==D.current.innerHTML&&(D.current.innerHTML=r),void 0!==e&&e!==r&&Y(!r.length)},[r]);const K=Object(a.m)(()=>{x.current.closest(".from, .to")?setTimeout(K,350):Object(o.a)(x.current)},[]),V=Object(a.m)(()=>{U(),function(){const e=window.getSelection();e&&(e.removeAllRanges?e.removeAllRanges():e.empty&&e.empty())}()},[U]);function z(){if(u.e)return;const e=window.getSelection();if(!e||!e.rangeCount||_.current)return void U();const t=e.getRangeAt(0),a=t.toString().trim();if(C||!Object(p.a)(t,n||c.z)||!a||Object(f.a)(a)||!t.START_TO_END)return void U();const r=t.getBoundingClientRect(),s=x.current.getBoundingClientRect();let i=r.left+r.width/2-s.left;i<90?i=90:i>s.width-90&&(i=s.width-90),q({x:i,y:r.top-s.top}),$(t),F()}function Y(e=!1){const t=x.current,n=D.current,a=Number(t.style.height.replace("px","")),r=Math.min(n.scrollHeight,j);if(r===a)return;const c=Math.round(50*Math.log(Math.abs(r-a))),s=()=>{t.style.height=r+"px",t.style.transitionDuration=c+"ms",t.classList.toggle("overflown",n.scrollHeight>j)};e?requestAnimationFrame(s):s()}Object(a.n)(()=>{u.n||K()},[M,K,I,E]),Object(a.n)(()=>{if(S)return;const e=Object(i.a)(e=>{"Tab"===e.key&&(e.preventDefault(),requestAnimationFrame(K))},2e3,!0,!1);return Object(m.a)({onTab:e})},[K,S]),Object(a.n)(()=>{const e=x.current;function t(){e.blur()}return y&&e.addEventListener("focus",t),()=>{e.removeEventListener("focus",t)}},[y]);const W=Object(l.a)("form-control custom-scroll",r.length>0&&"touched",y&&"focus-disabled");return a.a.createElement("div",{id:e,onClick:y?T:void 0,dir:R.isRtl?"rtl":void 0},a.a.createElement("div",{ref:x,id:n||c.z,className:W,contentEditable:!0,dir:"auto",onClick:K,onChange:function(e){const{innerHTML:t,textContent:n}=e.currentTarget;if(N("
"===t?"":t),!(u.n||n&&n.length)){const e=window.getSelection();e&&(x.current.blur(),e.removeAllRanges(),Object(o.a)(x.current,!0))}},onKeyDown:function(e){if(e.metaKey&&!r.length){const t="ArrowDown"===e.key?1:"ArrowUp"===e.key?-1:void 0;if(t)return e.preventDefault(),void A({targetIndexDelta:t})}"Enter"!==e.key||e.shiftKey?"ArrowUp"!==e.key||r.length||e.metaKey?e.target.addEventListener("keyup",(function t(){z(),e.target.removeEventListener("keyup",t)})):(e.preventDefault(),k()):u.e||u.b||!("enter"===L&&!e.shiftKey||"ctrl-enter"===L&&(e.ctrlKey||e.metaKey))||(e.preventDefault(),U(),w())},onMouseDown:function(e){2===e.button?!0!==_.current&&(_.current=!0,document.addEventListener("mousedown",(function e(){setTimeout(()=>{_.current=!1},100),window.removeEventListener("mouseup",e)})),document.addEventListener("keydown",(function e(t){"Esc"!==t.key&&"Escape"!==t.key||(setTimeout(()=>{_.current=!1},100),window.removeEventListener("keydown",e))}))):e.target.addEventListener("mouseup",(function t(){z(),e.target.removeEventListener("mouseup",t)}))},onContextMenu:function(e){u.b&&(e.preventDefault(),e.stopPropagation())},onTouchCancel:function(){u.b&&z()}}),a.a.createElement("div",{ref:D,className:Object(l.a)(W,"clone"),dir:"auto"}),!d&&a.a.createElement("span",{className:"placeholder-text",dir:"auto"},s),a.a.createElement(v.a,{isOpen:P,anchorPosition:B,selectedRange:H,onClose:V}),d&&a.a.createElement("span",{className:"forced-placeholder"},Object(g.a)(d)))}))},function(e,t,n){"use strict";var a=n(0),r=n(4),c=n(9),s=n(41),i=n(22),o=n(30),l=n(16),d=n(169),u=n(32),m=n(59);n(253);t.a=Object(a.h)(({message:e,senderTitle:t,onMessageClick:n})=>{const b=Object(l.a)();let h=Object(r.R)(e);if(!h){const t=Object(r.m)(e);if(t){const{url:n,domain:a}=t,c=Object(r.O)(b,e);h={siteName:a.replace(/^www./,""),url:n.includes("://")?n:n.includes("@")?"mailto:"+n:"http://"+n,description:c!==n?c:void 0}}}const f=Object(a.m)(()=>{n(e.id,e.chatId)},[n,e.id,e.chatId]);if(!h)return;const{siteName:p,url:O,displayUrl:g,title:v,description:j,photo:E,video:y}=h,C=!t&&Object(s.a)(j,170),N=Object(c.a)("WebLink scroll-item",!E&&!y&&"without-media");return a.a.createElement("div",{className:N,"data-initial":(p||g)[0],dir:b.isRtl?"rtl":void 0},E&&a.a.createElement(d.a,{message:e}),a.a.createElement("div",{className:"content"},a.a.createElement(u.a,{isRtl:b.isRtl,className:"site-title",onClick:f},Object(i.a)(v||p||g)),C&&a.a.createElement(u.a,{isRtl:b.isRtl,className:"site-description",onClick:f},Object(i.a)(C)),a.a.createElement(m.a,{url:O,className:"site-name",text:"",isRtl:b.isRtl},O.replace("mailto:","")||g),t&&a.a.createElement("div",{className:"sender-name"},Object(i.a)(t))),t&&a.a.createElement("div",{className:"message-date"},a.a.createElement(u.a,{className:"date",onClick:f,isRtl:b.isRtl},Object(o.g)(b,1e3*e.date))))})},function(e,t,n){},,,function(e,t,n){"use strict";var a=n(0),r=n(1),c=n(2),s=n(6),i=n(29),o=n(3),l=n(4),d=n(7),u=n(131);let m;!function(e){e[e.Move=0]="Move",e[e.Opacity=1]="Opacity",e[e.None=2]="None"}(m||(m={}));var b=n(115),h=n(20),f=n(16),p=n(8),O=n(68),g=n(22),v=n(10),j=n(9),E=n(147),y=n(176),C=n(25),N=n(110),T=n(114),w=n(137),M=n(158),I=n(177),S=n(159),L=n(108),k=n(50),A=n(160);n(214);var x=Object(a.h)(({chat:e,isPinned:t,isMuted:n})=>{const r=Boolean(e.unreadCount||e.hasUnreadMark||t),c=Object(j.a)("Badge",n&&"muted",t&&"pinned",Boolean(e.unreadCount||e.hasUnreadMark)&&"unread");function s(){return e.unreadCount?e.unreadMentionsCount?a.a.createElement("div",{className:"Badge-wrapper"},a.a.createElement("div",{className:"Badge mention"},a.a.createElement("i",{className:"icon-mention"})),a.a.createElement("div",{className:c},Object(k.b)(e.unreadCount))):a.a.createElement("div",{className:c},Object(k.b)(e.unreadCount)):e.hasUnreadMark?a.a.createElement("div",{className:c}):t?a.a.createElement("div",{className:c},a.a.createElement("i",{className:"icon-pinned-chat"})):void 0}return a.a.createElement(A.a,{isCustom:!0,className:"Badge-transition",isOpen:r},s)});n(215);var D,R=Object(a.h)(Object(r.h)((e,{chatId:t})=>{const n=Object(d.g)(e,t);if(!n||!n.lastMessage)return{};const{senderId:a,replyToMessageId:r,isOutgoing:c}=n.lastMessage,s=a?Object(d.Jb)(e,a):void 0,i=Object(l.s)(n.lastMessage),o=i&&r?Object(d.l)(e,n.id,r):void 0,{targetUserIds:u,targetChatId:m}=i||{},b=Object(l.W)(n),{byId:h}=e.users,{chatId:f,threadId:O,type:g}=Object(d.z)(e)||{},v=t===f&&O===p.MAIN_THREAD_ID;return{chat:n,isMuted:Object(l.Hb)(n,Object(d.fb)(e),Object(d.eb)(e)),lastMessageSender:s,actionTargetUserIds:u,actionTargetChatId:m,actionTargetMessage:o,draft:Object(d.C)(e,t,p.MAIN_THREAD_ID),animationLevel:e.settings.byKey.animationLevel,isSelected:v,canScrollDown:v&&"thread"===g,lastSyncTime:e.lastSyncTime,...c&&{lastMessageOutgoingStatus:Object(d.gb)(e,n.lastMessage)},...b&&{privateChatUser:Object(d.Jb)(e,b)},...u&&{usersById:h}}},(e,t)=>Object(o.l)(t,["openChat","focusLastMessage"]))(({style:e,chatId:t,folderId:n,orderDiff:r,animationType:i,isPinned:o,chat:d,isMuted:u,privateChatUser:b,actionTargetUserIds:h,usersById:p,lastMessageSender:k,lastMessageOutgoingStatus:A,actionTargetMessage:D,actionTargetChatId:R,draft:_,animationLevel:P,isSelected:F,canScrollDown:U,lastSyncTime:B,openChat:q,focusLastMessage:H})=>{const $=Object(a.q)(null),[K,V,z]=Object(C.a)(),[Y,W,G]=Object(C.a)(),{lastMessage:X,typingStatus:J}=d||{},Q=X&&Object(l.gb)(X);Object(E.a)(t,Q?X.replyToMessageId:void 0,D);const Z=X&&!Object(l.N)(X)?Object(l.F)(X):void 0,ee=Object(N.a)(X?Object(l.E)(X,"micro"):void 0),te=Boolean(X&&Object(l.J)(X)),ne=Object(a.p)(()=>h?h.map(e=>p&&p[e]).filter(Boolean):void 0,[h,p]);Object(a.o)(()=>{const e=$.current;if(0!==P&&e){if(i===m.Opacity)e.style.opacity="0",Object(v.b)(()=>{e.classList.add("animate-opacity"),e.style.opacity="1"});else{if(i!==m.Move)return;e.style.transform=`translate3d(0, ${100*-r}%, 0)`,Object(v.b)(()=>{e.classList.add("animate-transform"),e.style.transform=""})}setTimeout(()=>{Object(v.b)(()=>{e.classList.remove("animate-opacity","animate-transform"),e.style.opacity="",e.style.transform=""})},200+c.c)}},[P,r,i]);const ae=Object(a.m)(()=>{q({id:t,shouldReplaceHistory:!0}),F&&U&&H()},[F,U,q,t,H]);const re=Object(y.a)({chat:d,privateChatUser:b,handleDelete:function(){W(),V()},folderId:n,isPinned:o,isMuted:u}),ce=Object(f.a)();if(!d)return;const se=Object(j.a)("Chat chat-item-clickable",Object(l.ob)(t)?"private":"group",F&&"selected");return a.a.createElement(L.a,{ref:$,className:se,style:e,ripple:!s.l,contextActions:re,onClick:ae},a.a.createElement("div",{className:"status"},a.a.createElement(T.a,{chat:d,user:b,withOnlineStatus:!0,isSavedMessages:b&&b.isSelf,lastSyncTime:B})),a.a.createElement("div",{className:"info"},a.a.createElement("div",{className:"title"},a.a.createElement("h3",null,Object(g.a)(Object(l.k)(ce,d,b))),d.isVerified&&a.a.createElement(w.a,null),u&&a.a.createElement("i",{className:"icon-muted-chat"}),d.lastMessage&&a.a.createElement(I.a,{message:d.lastMessage,outgoingStatus:A})),a.a.createElement("div",{className:"subtitle"},function(){if(J&&X&&J.timestamp>1e3*X.date)return a.a.createElement(M.a,{typingStatus:J});if(_&&_.text.length)return a.a.createElement("p",{className:"last-message",dir:ce.isRtl?"auto":"ltr"},a.a.createElement("span",{className:"draft"},ce("Draft")),Object(g.a)(_.text));if(!X)return;if(Q){const e=d&&(Object(l.mb)(d)||X.senderId===X.chatId)?d:k;return a.a.createElement("p",{className:"last-message",dir:ce.isRtl?"auto":"ltr"},Object(g.a)(Object(O.a)(ce,X,e,ne,D,R,{asPlain:!0})))}const e=Object(l.K)(ce,t,k);return a.a.createElement("p",{className:"last-message",dir:ce.isRtl?"auto":"ltr"},e&&a.a.createElement(a.a.Fragment,null,a.a.createElement("span",{className:"sender-name"},Object(g.a)(e)),a.a.createElement("span",{className:"colon"},":")),function(e,t,n,r){if(!n)return Object(g.a)(Object(l.O)(e,t));return a.a.createElement("span",{className:"media-preview"},a.a.createElement("img",{src:n,alt:"",className:r?"round":void 0}),Object(l.Q)(t)&&a.a.createElement("i",{className:"icon-play"}),Object(g.a)(Object(l.O)(e,t,!0)))}(ce,X,ee||Z,te))}(),a.a.createElement(x,{chat:d,isPinned:o,isMuted:u}))),Y&&a.a.createElement(S.a,{isOpen:K,onClose:z,onCloseAnimationEnd:G,chat:d}))}));!function(e){e.all="active",e.archived="archived"}(D||(D={}));t.a=Object(a.h)(Object(r.h)((e,{folderType:t,folderId:n})=>{const{chats:{listIds:a,byId:r,orderedPinnedIds:c},users:{byId:s},lastSyncTime:i}=e,o="folder"!==t?D[t]:void 0,l=n?Object(d.j)(e,n):void 0;return{chatsById:r,usersById:s,lastSyncTime:i,notifySettings:Object(d.fb)(e),notifyExceptions:Object(d.eb)(e),...o?{listIds:a[o],orderedPinnedIds:c[o]}:{chatFolder:l}}},(e,t)=>Object(o.l)(t,["loadMoreChats","preloadTopChatMessages","openChat","openNextChat"]))(({folderType:e,folderId:t,noChatsText:n="Chat list is empty.",isActive:r,chatFolder:d,chatsById:f,usersById:p,listIds:O,orderedPinnedIds:g,lastSyncTime:v,notifySettings:j,notifyExceptions:E,loadMoreChats:y,preloadTopChatMessages:C,openChat:N,openNextChat:T})=>{const[w,M]=Object(a.p)(()=>"folder"===e&&d?Object(l.Gb)(f,p,d,j,E):[O,g],[e,d,f,p,j,E,O,g]),[I,S]=Object(a.p)(()=>{if(!w||"folder"===e&&!d)return[];const t=Object(l.Fb)(f,w,M,e),n=[...t.pinnedChats,...t.otherChats],a=n.map(({id:e})=>e);return[n.reduce((e,t,n)=>(e[t.id]=n,e),{}),a]},[w,M,e,d,f]),L=Object(i.a)(I),k=Object(a.p)(()=>I&&L?Object(o.i)(I,(e,t)=>e-(void 0!==L[t]?L[t]:1/0)):{},[I,L]),A=Object(a.m)(()=>{y({listType:"archived"===e?"archived":"active"})},[y,e]),[x,D]=Object(u.a)(v?A:void 0,S,void 0,c.m,"all"===e&&!c.a),_=x&&Object(l.Fb)(f,x,M,e);Object(a.n)(()=>{v&&"all"===e&&C()},[v,e,C]);const P=function(e){const t=Object(a.m)(t=>e[t]<0,[e]),n=Object(a.m)(t=>e[t]>0,[e]),r=Object.keys(e).map(Number),c=r.filter(t).length,s=r.filter(n).length;return Object(a.m)(a=>{const r=e[a];return 0===r?m.None:r===1/0||r===-1/0||t(a)&&c<=s||n(a)&&s{const e=e=>{if(r&&S){if(s.i&&(s.f&&e.metaKey||!s.f&&e.ctrlKey)&&e.code.startsWith("Digit")){const[,t]=e.code.match(/Digit(\d)/)||[];if(!t)return;const n=Number(t)-1;if(n>S.length-1)return;N({id:S[n],shouldReplaceHistory:!0})}if(e.altKey){const t="ArrowDown"===e.key?1:"ArrowUp"===e.key?-1:void 0;if(!t)return;e.preventDefault(),T({targetIndexDelta:t,orderedIds:S})}}};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}}),a.a.createElement(b.a,{className:"chat-list custom-scroll",items:x,onLoadMore:D,preloadBackwards:c.m,noFastList:!0,noScrollRestore:!0},x&&x.length&&_?function(){const e=S.indexOf(x[0]),n=e+_.pinnedChats.length;return a.a.createElement("div",{className:"scroll-container",style:s.b?`height: ${S.length*c.k}px`:void 0,teactFastList:!0},_.pinnedChats.map(({id:n},r)=>a.a.createElement(R,{key:n,teactOrderKey:r,chatId:n,isPinned:!0,folderId:t,animationType:P(n),orderDiff:k[n],style:`top: ${(e+r)*c.k}px;`})),_.otherChats.map((e,r)=>a.a.createElement(R,{key:e.id,teactOrderKey:Object(l.i)(e),chatId:e.id,folderId:t,animationType:P(e.id),orderDiff:k[e.id],style:`top: ${(n+r)*c.k}px;`})))}():x&&!x.length?a.a.createElement("div",{className:"no-results"},n):a.a.createElement(h.a,{key:"loading"}))}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return g}));var a=n(0),r=n(8),c=n(2),s=n(4),i=n(53);function o(e,t){const n=t.username.toLowerCase(),a=Object(s.bb)(t),r=a&&a.toLowerCase(),c=e.toLowerCase();return n.startsWith(c)||r&&Object(i.a)(r,c)}var l=n(134),d=n(25),u=n(3),m=n(10);const b=Object(m.h)(e=>e(),500,!0),h=/(
|)/g,f=/ /g,p=/(
|<\/div>)/gi,O=new RegExp("(^|\\s)@[\\w\\d_-]*$","gi");function g(e,t,n,i=c.z,m,g,v,j){const[E,y,C]=Object(d.a)(),[N,T]=Object(a.r)(""),[w,M]=Object(a.r)(),I=Object(a.p)(()=>(g||[]).map(e=>j&&j[e]).filter(Boolean),[g,j]),S=Object(a.m)((e,t)=>{(m||g)&&j?b(()=>{const n=(t?I:[]).filter(t=>!e||o(e,t)),a=(m||[]).map(({userId:e})=>j[e]).filter(t=>!(!t||t.id===v)&&(!e||o(e,t)));M(Object(u.o)(n.concat(a)))}):M(void 0)},[v,m,g,I,j]);Object(a.n)(()=>{if(!e||!t.length)return void C();const n=t.includes("@")&&function(e){const t=e.replace(f," ").replace(h,"\n").replace(p,"").replace(/\n$/i,"").match(O);return t?t[0].trim():void 0}(t);if(n){const e=n?n.substr(1):"";T(e),S(e,function(e){return e.startsWith("@")}(t))}else C()},[e,t,S,y,C]),Object(a.n)(()=>{w&&w.length?y():C()},[y,C,w]);const L=Object(a.m)((e,a=!1)=>{if(!e.username&&!Object(s.ab)(e))return;const c=e.username?"@"+e.username:`${Object(s.ab)(e)}`,o=t.lastIndexOf("@");if(-1!==o){n(`${t.substr(0,o)}${c} `);const e=document.getElementById(i);requestAnimationFrame(()=>{Object(l.a)(e,a)})}C()},[t,i,n,C]);return{isMentionTooltipOpen:E,mentionFilter:N,closeMentionTooltip:C,insertMention:L,mentionFilteredUsers:w}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var a=n(0),r=n(166),c=n(52),s=n(17),i=n(31);const o=new Map;function l(e){const t=Object(a.q)();let n=!1;Object(c.a)(()=>{if(n=!0,t.current=void 0,!e)return;const a=new Image;if(a.src=e,!a.width)return;const c=Object(s.f)(a);Object(r.a)(c.getContext("2d"),0,0,c.width,c.height,2,2),t.current=c.toDataURL()},[e]);const l=function(e,t=!1,n){const c=Object(a.q)(e?o.get(e):void 0),l=Object(a.q)(),d=Object(i.a)();return l.current&&t&&(clearTimeout(l.current),l.current=void 0),Object(a.n)(()=>{if(!e||c.current||t)return;const a=new Image;a.onload=()=>{const t=Object(s.f)(a);Object(r.a)(t.getContext("2d"),0,0,t.width,t.height,2,2);const n=t.toDataURL();c.current=n,d(),o.size>=1e3&&o.clear(),o.set(e,n)},n?l.current=window.setTimeout(()=>{a.src=e},n):a.src=e},[e,n,d,t]),c.current}(e||void 0,Boolean(t.current));return t.current||!n&&l||e||void 0}},,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},,,,function(e,t,n){},function(e,t,n){},function(e,t,n){},,,function(e,t,n){},,function(e,t,n){},function(e,t,n){},,,,,,,,,,,,function(e,t,n){},,,,,,,,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){}])]); -//# sourceMappingURL=0.e48232bc26b8d2aff6ea.js.map \ No newline at end of file diff --git a/dist/0.e48232bc26b8d2aff6ea.js.map b/dist/0.e48232bc26b8d2aff6ea.js.map deleted file mode 100644 index 3de473136..000000000 --- a/dist/0.e48232bc26b8d2aff6ea.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///0.6b9384abe07b5cc77e08.js"],"names":["window","push","Array","concat","module","__webpack_exports__","__webpack_require__","_lib_teact_teact__WEBPACK_IMPORTED_MODULE_0__","_util_environment__WEBPACK_IMPORTED_MODULE_1__","_util_schedulers__WEBPACK_IMPORTED_MODULE_2__","_util_buildClassName__WEBPACK_IMPORTED_MODULE_3__","_hooks_useContextMenuHandlers__WEBPACK_IMPORTED_MODULE_4__","_hooks_useContextMenuPosition__WEBPACK_IMPORTED_MODULE_5__","_hooks_useFlag__WEBPACK_IMPORTED_MODULE_6__","_hooks_useLang__WEBPACK_IMPORTED_MODULE_7__","_RippleEffect__WEBPACK_IMPORTED_MODULE_8__","_Menu__WEBPACK_IMPORTED_MODULE_9__","_MenuItem__WEBPACK_IMPORTED_MODULE_10__","props","ref","buttonRef","icon","className","style","children","disabled","ripple","narrow","inactive","focus","destructive","multiline","isStatic","contextActions","onClick","containerRef","Object","isTouched","markIsTouched","unmarkIsTouched","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","getTriggerElement","current","getRootElement","closest","getMenuElement","querySelector","positionX","positionY","menuStyle","handleClick","e","handleMouseDown","button","lang","fullClassName","createElement","dir","isRtl","undefined","role","tabIndex","onMouseDown","onContextMenu","isOpen","autoClose","onClose","onCloseAnimationEnd","map","action","key","title","handler","d","useIntersectionObserver","useOnIntersect","useIsIntersecting","_util_schedulers__WEBPACK_IMPORTED_MODULE_1__","_useHeavyAnimationCheck__WEBPACK_IMPORTED_MODULE_2__","rootRef","throttleMs","debounceMs","shouldSkipFirst","margin","threshold","isDisabled","rootCallback","controllerRef","rootCallbackRef","freezeFlagsRef","onUnfreezeRef","freeze","unfreeze","observer","disconnect","callbacks","clear","observe","target","targetCallback","Map","entriesAccumulator","observerCallbackSync","entries","from","values","forEach","entry","callback","get","scheduler","observerCallback","IntersectionObserver","set","root","rootMargin","initController","controller","delete","unobserve","targetRef","isIntersecting","setIsIntersecting","_api_types__WEBPACK_IMPORTED_MODULE_1__","_util_mediaLoader__WEBPACK_IMPORTED_MODULE_2__","_useForceUpdate__WEBPACK_IMPORTED_MODULE_3__","mediaHash","noLoad","mediaFormat","BlobUrl","cacheBuster","delay","mediaData","forceUpdate","startedAt","Date","now","then","spentTime","setTimeout","_lib_teact_teactn__WEBPACK_IMPORTED_MODULE_1__","_types__WEBPACK_IMPORTED_MODULE_2__","_modules_selectors__WEBPACK_IMPORTED_MODULE_3__","_modules_helpers__WEBPACK_IMPORTED_MODULE_4__","_helpers_renderText__WEBPACK_IMPORTED_MODULE_5__","_util_iteratees__WEBPACK_IMPORTED_MODULE_6__","_Avatar__WEBPACK_IMPORTED_MODULE_8__","_VerifiedIcon__WEBPACK_IMPORTED_MODULE_9__","_TypingStatus__WEBPACK_IMPORTED_MODULE_10__","global","userId","forceShowSelf","lastSyncTime","serverTimeOffset","user","isSavedMessages","isSelf","areMessagesLoaded","Boolean","setGlobal","actions","typingStatus","avatarSize","status","withMediaViewer","withUsername","withFullInfo","withUpdatingStatus","noStatusOrTyping","noRtl","loadFullUser","openMediaViewer","id","fullName","handleAvatarViewerOpen","hasPhoto","stopPropagation","avatarOwnerId","origin","ProfileAvatar","MiddleHeaderAvatar","size","isVerified","username","teact","captureKeyboardListeners","buildClassName","useHeavyAnimationCheck","useShowTransition","useEffectWithPrevDeps","useLang","useHistoryBack","Button","Portal","header","hasCloseButton","noBackdrop","onEnter","shouldSkipHistoryAnimations","shouldRender","transitionClassNames","modalRef","onEsc","element","handleKeyDown","preventDefault","focusableElements","querySelectorAll","length","currentFocusedIndex","findIndex","em","isSameNode","document","activeElement","newFocusedIndex","shiftKey","addEventListener","removeEventListener","trapFocus","forceClose","prevIsOpen","body","classList","toggle","remove","round","color","ariaLabel","_hooks_useForceUpdate__WEBPACK_IMPORTED_MODULE_2__","_hooks_usePrevious__WEBPACK_IMPORTED_MODULE_3__","_util_buildClassName__WEBPACK_IMPORTED_MODULE_4__","_hooks_useHeavyAnimationCheck__WEBPACK_IMPORTED_MODULE_5__","_util_cssAnimationEndListeners__WEBPACK_IMPORTED_MODULE_6__","CLEANED_UP","Symbol","activeKey","name","direction","renderCount","shouldRestoreHeight","shouldCleanup","cleanupExceptionKey","onStart","onStop","animationLevel","settings","byKey","rendersRef","prevActiveKey","activeKeyChanged","[object Object]","cleanup","container","childElements","add","childNodes","isBackwards","keys","Number","prevActiveIndex","indexOf","activeIndex","node","i","HTMLElement","dispatchHeavyAnimationStop","requestAnimationFrame","onAnimationEnd","height","clientHeight","toNode","firstChild","flexBasis","renders","contents","fill","render","_config__WEBPACK_IMPORTED_MODULE_2__","_modules_helpers__WEBPACK_IMPORTED_MODULE_3__","_util_textFormat__WEBPACK_IMPORTED_MODULE_4__","_util_buildClassName__WEBPACK_IMPORTED_MODULE_5__","_helpers_renderText__WEBPACK_IMPORTED_MODULE_6__","_hooks_useMedia__WEBPACK_IMPORTED_MODULE_7__","_hooks_useTransitionForMedia__WEBPACK_IMPORTED_MODULE_8__","_hooks_useLang__WEBPACK_IMPORTED_MODULE_9__","chat","text","withOnlineStatus","isDeleted","imageHash","dataUri","DataUri","shouldRenderFullMedia","content","src","alt","decoding","userFullName","isOnline","senderId","data-test-sender-id","_types__WEBPACK_IMPORTED_MODULE_0__","_lib_teact_teact__WEBPACK_IMPORTED_MODULE_1__","_util_resetScroll__WEBPACK_IMPORTED_MODULE_3__","onLoadMore","onScroll","onKeyDown","items","itemSelector","preloadBackwards","sensitiveArea","noScrollRestore","noScrollRestoreOnTop","noFastList","stateRef","loadMoreBackwards","loadMoreForwards","noScroll","Backwards","Forwards","scrollHeight","state","newScrollTop","listItemElements","currentAnchor","includes","scrollTop","getBoundingClientRect","top","currentAnchorTop","nextAnchor","isScrollTopJustUpdated","handleScroll","listLength","offsetHeight","isNearTop","offsetTop","isNearBottom","isUpdated","nextAnchorTop","newAnchorTop","offsetParent","teactFastList","_util_buildClassName__WEBPACK_IMPORTED_MODULE_1__","_Button__WEBPACK_IMPORTED_MODULE_2__","isShown","buttonClassName","_useShowTransition__WEBPACK_IMPORTED_MODULE_1__","SPEED","fast","slow","speed","noAnimate","isMediaLoaded","willAnimate","shouldRenderThumb","setShouldRenderThumb","MEDIA_VIEWER_MEDIA_QUERY","REM","ROUND_VIDEO_DIMENSIONS","AVATAR_FULL_DIMENSIONS","LIKE_STICKER_ID","getAvailableWidth","getMediaViewerAvailableDimensions","calculateInlineImageDimensions","calculateVideoDimensions","getPictogramDimensions","getDocumentThumbnailDimensions","getStickerDimensions","calculateMediaViewerDimensions","calculateDimensions","_config__WEBPACK_IMPORTED_MODULE_0__","_util_windowSize__WEBPACK_IMPORTED_MODULE_2__","parseInt","getComputedStyle","documentElement","fontSize","width","DEFAULT_MEDIA_DIMENSIONS","cachedMaxWidthOwn","cachedMaxWidth","cachedMaxWidthNoAvatar","fromOwnMessage","isForwarded","isWebPagePhoto","noAvatars","extraPaddingRem","regularMaxWidth","windowWidth","Math","min","getMaxMessageWidthRem","calculateDimensionsForMessageMedia","isGif","aspectRatio","getAvailableHeight","withFooter","isVideo","mql","matchMedia","windowHeight","occupiedHeightRem","matches","photo","video","smaller","sticker","baseWidth","calculatedHeight","availableWidth","availableHeight","mediaWidth","mediaHeight","calculatedWidth","_util_buildClassName__WEBPACK_IMPORTED_MODULE_2__","_hooks_useHeavyAnimationCheck__WEBPACK_IMPORTED_MODULE_3__","_hooks_useBackgroundMode__WEBPACK_IMPORTED_MODULE_4__","lottiePromise","RLottie","async","ensureLottie","bind","default","animationData","play","playSegment","noLoop","quality","isLowPriority","onLoad","animation","setAnimation","wasPlaying","isFrozen","playRef","playSegmentRef","exec","newAnimation","setSpeed","destroy","playAnimation","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","_hooks_useLang__WEBPACK_IMPORTED_MODULE_1__","_Modal__WEBPACK_IMPORTED_MODULE_2__","_Button__WEBPACK_IMPORTED_MODULE_3__","textParts","confirmLabel","confirmHandler","confirmIsDestructive","isButtonsInOneRow","split","textPart","isText","_hooks_useShowTransition__WEBPACK_IMPORTED_MODULE_2__","_helpers_renderText__WEBPACK_IMPORTED_MODULE_3__","_hooks_useLang__WEBPACK_IMPORTED_MODULE_4__","description","useAsyncRendering","_hooks_useOnChange__WEBPACK_IMPORTED_MODULE_1__","dependencies","shouldRenderRef","timeoutRef","clearTimeout","_api_types__WEBPACK_IMPORTED_MODULE_2__","_util_schedulers__WEBPACK_IMPORTED_MODULE_3__","_util_mediaLoader__WEBPACK_IMPORTED_MODULE_4__","_useForceUpdate__WEBPACK_IMPORTED_MODULE_5__","isStreaming","Stream","Progressive","downloadProgress","setDownloadProgress","startedAtRef","handleProgress","progress","RADIUSES","s","m","l","xl","square","transparent","noCross","radius","circleRadius","STROKE_WIDTH","borderRadius","circumference","PI","svg","firstElementChild","strokeDashOffset","max","setAttribute","toString","innerHTML","Spinner","ui_Radio","label","subLabel","value","checked","hidden","isLoading","onChange","type","options","selected","loadingOption","handleChange","event","currentTarget","option","useBackgroundMode","onBlur","onFocus","hasFocus","_lib_teact_teact_dom__WEBPACK_IMPORTED_MODULE_1__","containerId","elementRef","appendChild","removeChild","_modules_selectors__WEBPACK_IMPORTED_MODULE_4__","chatId","onlineCount","withChatType","loadFullChat","isSuperGroup","isMin","isRestricted","handle","groupStatus","chatTypeString","membersCount","getGroupStatus","onlineStatus","renderStatusOrTyping","fastSmoothScroll","isAnimatingScroll","_lib_teact_teactn__WEBPACK_IMPORTED_MODULE_0__","_types__WEBPACK_IMPORTED_MODULE_1__","_animation__WEBPACK_IMPORTED_MODULE_4__","isAnimating","position","maxDistance","forceDirection","forceDuration","forceCurrentContainerHeight","scrollFrom","elementTop","offset","Up","Down","calculateScrollFrom","Static","scrollWithJs","elementHeight","currentScrollTop","containerHeight","targetContainerHeight","dataset","normalHeight","path","remainingPath","absPath","abs","transition","shortTransition","longTransition","duration","startAt","onHeavyAnimationStop","t","currentPath","_util_iteratees__WEBPACK_IMPORTED_MODULE_2__","_usePrevious__WEBPACK_IMPORTED_MODULE_4__","getViewportSlice","sourceIds","offsetId","listSlice","index","indexForDirection","to","newViewportIds","slice","areSomeLocal","areAllLocal","listIds","forceFullPreload","lastParamsRef","viewportIdsRef","prevListIds","prevIsDisabled","viewportIds","getMore","cycleRestrict","floor","_helpers_mediaDimensions__WEBPACK_IMPORTED_MODULE_3__","_hooks_useIntersectionObserver__WEBPACK_IMPORTED_MODULE_4__","_hooks_useMedia__WEBPACK_IMPORTED_MODULE_5__","_hooks_useTransitionForMedia__WEBPACK_IMPORTED_MODULE_6__","_hooks_useFlag__WEBPACK_IMPORTED_MODULE_7__","_AnimatedSticker__WEBPACK_IMPORTED_MODULE_8__","isInline","observeIntersection","forceLoadPreview","isAnimationLoaded","markAnimationLoaded","localMediaHash","thumbDataUri","thumbnail","previewBlobUrl","Lottie","playKey","setPlayKey","String","random","focusEditableElement","_environment__WEBPACK_IMPORTED_MODULE_0__","force","selection","getSelection","range","createRange","lastChild","nodeValue","selectNodeContents","collapse","removeAllRanges","addRange","SwipeDirection","captureEvents","captureEvent","currentSwipeAxis","hasMoved","onCapture","excludedClosestSelector","onMove","onRelease","pageX","touches","pageY","withCursor","dragOffsetX","dragOffsetY","onDrag","onSwipe","xAbs","yAbs","Left","Right","processSwipe","passive","useCurrentOrPrev","_usePrevious__WEBPACK_IMPORTED_MODULE_0__","shouldSkipUndefined","shouldForceCurrent","prev","mediaEl","catch","err","console","warn","_util_patchSafariProgressiveAudio__WEBPACK_IMPORTED_MODULE_2__","noInitiallyBuffered","isBuffered","setIsBuffered","bufferedProgress","setBufferedProgress","setIsBufferedDebounced","handleBuffering","media","buffered","end","readyState","currentTime","bufferingHandlers","onLoadedData","onPlaying","onLoadStart","onPause","onTimeUpdate","onProgress","parseMessageInput","_api_types__WEBPACK_IMPORTED_MODULE_0__","ENTITY_CLASS_BY_NODE_NAME","B","Bold","STRONG","I","Italic","EM","U","Underline","S","Strike","STRIKE","DEL","CODE","Code","PRE","Pre","BLOCKQUOTE","Blockquote","html","fragment","parsedHtml","replace","parseMarkdown","innerText","trim","textIndex","recursionDeepness","entities","addEntity","entity","rawText","nodeName","anchor","entityType","MentionName","Url","href","startsWith","Email","Phone","textContent","TextUrl","getEntityTypeFromNode","rawIndex","substring","url","getEntityDataFromNode","hasChildNodes","DropAreaState","captureEscKeyListener","usePrevious","useFlag","composer_DropTarget","isQuick","onFileSelect","isHovered","markHovered","unmarkHovered","onDrop","onDragEnter","onDragLeave","relatedTarget","toTarget","withQuick","onHide","hideTimeoutRef","prevWithQuick","handleFilesDrop","dataTransfer","dt","files","handleQuickFilesDrop","handleDragLeave","fromTarget","onDragOver","_modules_selectors__WEBPACK_IMPORTED_MODULE_2__","_helpers_renderText__WEBPACK_IMPORTED_MODULE_4__","_hooks_useLang__WEBPACK_IMPORTED_MODULE_6__","_Avatar__WEBPACK_IMPORTED_MODULE_7__","chatOrUserId","isMinimized","canClose","clickArg","iconElement","titleText","fastSmoothScrollHorizontal","_config__WEBPACK_IMPORTED_MODULE_1__","_environment__WEBPACK_IMPORTED_MODULE_2__","_animation__WEBPACK_IMPORTED_MODULE_3__","left","scrollLeft","offsetWidth","containerWidth","scrollWidth","scrollTo","behavior","deltaX","deltaY","messageId","message","replyOriginForId","loadMessage","loadMessageThrottled","throttled","contextMenuCounter","isMenuDisabled","shouldDisableOnLink","shouldDisableOnLongTap","setIsContextMenuOpen","setContextMenuPosition","x","clientX","y","clientY","timer","clearLongPressTimer","startLongPressTimer","contains","originalEvent","cancelClickOnce","stopImmediatePropagation","emulateContextMenuEvent","renderMessageText","renderTextWithEntities","_renderText__WEBPACK_IMPORTED_MODULE_4__","_middle_message_MentionLink__WEBPACK_IMPORTED_MODULE_5__","_SafeLink__WEBPACK_IMPORTED_MODULE_6__","highlight","shouldRenderHqEmoji","formattedText","organizeEntities","organizedEntityIndexes","Set","organizedEntities","has","organizedEntity","organizeEntity","organizedIndexes","nestedEntities","filter","parsedEntity","isChanged","organizedIndex","shouldRenderAsHtml","renderMessagePart","result","deleteLineBreakAfterPre","renderEntity","textPartStart","textPartEnd","isLastEntity","renderResult","textBefore","textBeforeLength","substr","entityStartIndex","entityEndIndex","entityContent","nestedEntityContent","nestedIndex","nestedEntity","nestedEntityIndex","nestedResult","nestedEntityEndIndex","newEntity","rawEntityText","renderedContent","join","getLinkUrl","processEntityAsHtml","entityText","BotCommand","handleBotCommandClick","Hashtag","Cashtag","handleHashtagClick","rel","Mention","processEntity","isArray","textAfter","arrayIndex","c","emojiFilter","sendBotCommand","command","setLocalTextSearchQuery","query","searchTextMessagesLocal","useVideoCleanup","videoRef","videoEl","load","exports","_hooks_useFlag__WEBPACK_IMPORTED_MODULE_2__","_hooks_useLang__WEBPACK_IMPORTED_MODULE_3__","_Loading__WEBPACK_IMPORTED_MODULE_4__","_Button__WEBPACK_IMPORTED_MODULE_5__","parentContainerClassName","inputId","focused","placeholder","autoComplete","onReset","inputRef","isInputFocused","markInputFocused","unmarkInputFocused","blur","overflow","_hooks_useLang__WEBPACK_IMPORTED_MODULE_5__","typingUser","typingUserName","_util_iteratees__WEBPACK_IMPORTED_MODULE_4__","_ui_Modal__WEBPACK_IMPORTED_MODULE_8__","_ui_Button__WEBPACK_IMPORTED_MODULE_9__","isPrivateChat","isChatWithSelf","isBot","isSupport","canDeleteForAll","contactName","isChannel","isBasicGroup","currentUserId","leaveChannel","deleteHistory","deleteChannel","deleteChatUser","blockContact","chatTitle","handleDeleteMessageForAll","shouldDeleteForAll","handleDeleteAndStop","contactId","accessHash","handleDeleteChat","isCreator","_hooks_useShowTransition__WEBPACK_IMPORTED_MODULE_1__","_hooks_usePrevious__WEBPACK_IMPORTED_MODULE_2__","isCustom","prevChildren","fromChildrenRef","patchSafariProgressiveAudio","audioEl","patchedForSafari","patchForSafariInProgress","paused","once","isSafariPatchInProgress","_usePrevious__WEBPACK_IMPORTED_MODULE_1__","cb","debugKey","prevDeps","_helpers_documentInfo__WEBPACK_IMPORTED_MODULE_1__","_modules_helpers__WEBPACK_IMPORTED_MODULE_2__","_hooks_useIntersectionObserver__WEBPACK_IMPORTED_MODULE_3__","_hooks_useMediaWithDownloadProgress__WEBPACK_IMPORTED_MODULE_4__","_util_download__WEBPACK_IMPORTED_MODULE_6__","_File__WEBPACK_IMPORTED_MODULE_7__","uploadProgress","withDate","datetime","sender","isSelected","isSelectable","onCancelUpload","onMediaClick","onDateClick","extension","fileName","timestamp","mediaType","isDownloadAllowed","setIsDownloadAllowed","isUploading","isTransferring","transferProgress","hasPreview","localBlobUrl","previewData","isAllowed","handleDateClick","thumbnailDataUri","actionIcon","_util_moduleLoader__WEBPACK_IMPORTED_MODULE_1__","_hooks_useModuleLoader__WEBPACK_IMPORTED_MODULE_2__","StickerSetModal","Extra","useCanvasBlur","_lib_fastBlur__WEBPACK_IMPORTED_MODULE_1__","_useForceUpdate__WEBPACK_IMPORTED_MODULE_2__","_util_environment__WEBPACK_IMPORTED_MODULE_3__","withRaf","canvasRef","canvas","img","Image","processBlur","ctx","getContext","alpha","drawImage","RADIUS","onload","boxBlurCanvasRGB","mul_table","shg_table","context","top_x","top_y","iterations","isNaN","imageData","getImageData","pixels","data","rsum","gsum","bsum","p","p1","p2","yp","yi","yw","wm","hm","rad1","r","g","b","mul_sum","shg_sum","vmin","vmax","putImageData","_util_captureEscKeyListener__WEBPACK_IMPORTED_MODULE_3__","_hooks_useShowTransition__WEBPACK_IMPORTED_MODULE_4__","_hooks_useVirtualBackdrop__WEBPACK_IMPORTED_MODULE_5__","_ui_Button__WEBPACK_IMPORTED_MODULE_8__","TEXT_FORMAT_BY_TAG_NAME","anchorPosition","selectedRange","linkUrlInputRef","isLinkControlOpen","openLinkControl","closeLinkControl","linkUrl","setLinkUrl","isEditingLink","setIsEditingLink","inputClassName","setInputClassName","selectedTextFormats","setSelectedTextFormats","selectedFormats","parentElement","commonAncestorContainer","textFormat","tagName","getSelectedText","getSelectedElement","updateInputStyles","input","getFormatButtonClassName","some","fKey","monospace","strikethrough","handleBoldText","execCommand","bold","handleItalicText","italic","handleUnderlineText","underline","handleStrikethroughText","replaceWith","handleMonospaceText","handleLinkUrlConfirm","formattedLinkUrl","restoreSelection","KeyK","KeyB","KeyU","KeyI","KeyM","KeyS","code","altKey","ctrlKey","metaKey","linkUrlConfirmClassName","inputMode","CLIPBOARD_ITEM_SUPPORTED","copyTextToClipboard","copyImageToClipboard","navigator","clipboard","ClipboardItem","textCopyEl","str","rangeToRestore","rangeCount","getRangeAt","select","imageUrl","imageEl","toBlob","copyBlobToClipboard","pngBlob","write","error","_util_dateFormat__WEBPACK_IMPORTED_MODULE_1__","_hooks_useMedia__WEBPACK_IMPORTED_MODULE_3__","_hooks_useTransitionForMedia__WEBPACK_IMPORTED_MODULE_4__","idPrefix","mediaBlobUrl","_modules_helpers__WEBPACK_IMPORTED_MODULE_1__","_ui_InfiniteScroll__WEBPACK_IMPORTED_MODULE_2__","_ui_Checkbox__WEBPACK_IMPORTED_MODULE_3__","_ui_InputText__WEBPACK_IMPORTED_MODULE_4__","_ui_ListItem__WEBPACK_IMPORTED_MODULE_5__","_PrivateChatInfo__WEBPACK_IMPORTED_MODULE_6__","_GroupChatInfo__WEBPACK_IMPORTED_MODULE_7__","_PickerSelectedItem__WEBPACK_IMPORTED_MODULE_8__","_hooks_useInfiniteScroll__WEBPACK_IMPORTED_MODULE_9__","_hooks_useLang__WEBPACK_IMPORTED_MODULE_10__","_ui_Loading__WEBPACK_IMPORTED_MODULE_11__","itemIds","selectedIds","filterValue","filterPlaceholder","notFoundText","searchInputId","onSelectedIdsChange","onFilterChange","shouldMinimize","handleItemClick","newSelectedIds","splice","handleFilterChange","environment","dateFormat","helpers","renderText","useMediaWithDownloadProgress","useBuffering","useAudioPlayer","useMediaDownload","ProgressSpinner","Link","MIN_SPIKES","MAX_SPIKES","renderSeekline","playProgress","handleStartSeek","handleSeek","handleStopSeek","onMouseMove","onMouseUp","theme","senderTitle","date","onPlay","onReadMedia","audio","voice","isMediaUnread","isVoice","isSeeking","isActivated","setIsActivated","shouldDownload","checkBuffering","playPause","setCurrentTime","isDownloadStarted","directDownloadProgress","handleDownloadClick","isLoadingForPlaying","shouldRenderSpinner","spinnerClassNames","handleButtonClick","seekBar","seekHandlers","isOwn","renderedWaveform","waveform","fillColor","fillOwnColor","progressFillColor","progressFillOwnColor","durationFactor","spikesCount","decodedWaveform","encoded5bit","bitsCount","valuesCount","bitsData","byteIndex","bitShift","lastByteIndex","lastBitShift","lastValue","decodeWaveform","Uint8Array","spikes","peak","fitCount","newData","springFactor","leftFiller","rightFiller","_data","_data$idx","_data2","idx","val","interpolateArray","fillStyle","progressFillStyle","scale","item","globalAlpha","spikeHeight","beginPath","moveTo","arcTo","closePath","roundedRectangle","toDataURL","renderWaveformToDataUri","draggable","renderWaveform","buttonClassNames","showSeekline","contentClassName","Fragment","getFirstLine","performer","getSecondLine","renderAudio","renderVoice","useHorizontalScroll","ui_Tab","active","badgeCount","isBadgeActive","previousActiveTab","tabRef","tab","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","transform","tabs","activeTab","big","onSwitchTab","activeTabElement","newLeft","getReadableErrorText","READABLE_ERROR_MESSAGES","CHAT_RESTRICTED","CHAT_WRITE_FORBIDDEN","CHAT_SEND_POLL_FORBIDDEN","CHAT_SEND_STICKERS_FORBIDDEN","CHAT_SEND_GIFS_FORBIDDEN","CHAT_SEND_MEDIA_FORBIDDEN","CHAT_LINK_EXISTS","SLOWMODE_WAIT_X","USER_BANNED_IN_CHANNEL","USER_IS_BLOCKED","YOU_BLOCKED_USER","IMAGE_PROCESS_FAILED","MEDIA_EMPTY","MEDIA_INVALID","PHOTO_EXT_INVALID","PHOTO_INVALID_DIMENSIONS","PHOTO_SAVE_FILE_INVALID","MESSAGE_DELETE_FORBIDDEN","MESSAGE_POLL_CLOSED","MESSAGE_EDIT_TIME_EXPIRED","CHAT_ADMIN_REQUIRED","PINNED_DIALOGS_TOO_MUCH","DIALOG_FILTERS_TOO_MUCH","CHANNEL_PRIVATE","MEDIA_CAPTION_TOO_LONG","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_CITY_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_POSTCODE_INVALID","ADDRESS_STATE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_PHONE_INVALID","REQ_INFO_EMAIL_INVALID","LINK_NOT_MODIFIED","SERVICE_WORKER_DISABLED","CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS","FRESH_RESET_AUTHORISATION_FORBIDDEN","BOTS_TOO_MUCH","BOT_GROUPS_BLOCKED","USERS_TOO_MUCH","USER_CHANNELS_TOO_MUCH","USER_KICKED","USER_NOT_MUTUAL_CONTACT","USER_PRIVACY_RESTRICTED","INVITE_HASH_EMPTY","INVITE_HASH_EXPIRED","INVITE_HASH_INVALID","CHANNELS_TOO_MUCH","USER_ALREADY_PARTICIPANT","SCHEDULE_DATE_INVALID","WALLPAPER_DIMENSIONS_INVALID","isSlowMode","textParams","extraPartIndex","errorMessage","reduce","acc","waitForTransitionEnd","waitForAnimationEnd","propertyName","waitForEndEvent","animationName","eventType","detailedName","isHandled","handleAnimationEnd","TransitionEvent","AnimationEvent","_useLang__WEBPACK_IMPORTED_MODULE_3__","privateChatUser","handleDelete","folderId","isPinned","isMuted","toggleChatPinned","updateChatMutedState","toggleChatArchived","toggleChatUnread","actionUnreadMark","unreadCount","hasUnreadMark","actionPin","actionMute","actionArchive","_hooks_useLang__WEBPACK_IMPORTED_MODULE_2__","_MessageOutgoingStatus__WEBPACK_IMPORTED_MODULE_3__","outgoingStatus","Keys","_ui_Transition__WEBPACK_IMPORTED_MODULE_1__","extraPaddingX","extraTopPadding","setPositionX","setPositionY","setStyle","triggerEl","emptyRect","menuEl","rootEl","triggerRect","menuRect","rootRect","horizontalPostition","usePrevDuringAnimation","_useOnChange__WEBPACK_IMPORTED_MODULE_3__","isCurrentPresent","isPrevPresent","_util_audioPlayer__WEBPACK_IMPORTED_MODULE_1__","_useEffectWithPrevDeps__WEBPACK_IMPORTED_MODULE_2__","_util_patchSafariProgressiveAudio__WEBPACK_IMPORTED_MODULE_3__","_useOnChange__WEBPACK_IMPORTED_MODULE_4__","trackId","originalDuration","handlers","onInit","shouldPlay","onForcePlay","noPlaylist","setIsPlaying","isPlayingSync","setPlayProgress","eventName","proxy","isFinite","prevShouldPlay","prevSrc","audioProxy","stopCurrentAudio","register","_safePlay__WEBPACK_IMPORTED_MODULE_1__","_patchSafariProgressiveAudio__WEBPACK_IMPORTED_MODULE_2__","_lib_teact_teactn__WEBPACK_IMPORTED_MODULE_3__","tracks","currentTrackId","queue","currentTrack","Audio","handleEvent","nextTrackId","openAudioPlayer","nextTrack","Proxy","createAudio","preload","time","shouldRemoveFromQueue","track","h","download","filename","link","click","_hooks_useTransitionForMedia__WEBPACK_IMPORTED_MODULE_2__","_util_dateFormat__WEBPACK_IMPORTED_MODULE_4__","_helpers_documentInfo__WEBPACK_IMPORTED_MODULE_5__","_helpers_mediaDimensions__WEBPACK_IMPORTED_MODULE_6__","_helpers_renderText__WEBPACK_IMPORTED_MODULE_7__","_hooks_useLang__WEBPACK_IMPORTED_MODULE_8__","_ui_ProgressSpinner__WEBPACK_IMPORTED_MODULE_9__","_ui_Link__WEBPACK_IMPORTED_MODULE_10__","shouldSpinnerRender","sizeString","_useMediaWithDownloadProgress__WEBPACK_IMPORTED_MODULE_1__","_util_download__WEBPACK_IMPORTED_MODULE_2__","setIsDownloadStarted","_util_captureEscKeyListener__WEBPACK_IMPORTED_MODULE_4__","_Portal__WEBPACK_IMPORTED_MODULE_5__","onDismiss","setIsOpen","timerRef","closeAndDismiss","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","isSelectionInsideInput","selectionRange","parentNode","useEmojiTooltip","_util_memo__WEBPACK_IMPORTED_MODULE_2__","_util_emoji__WEBPACK_IMPORTED_MODULE_3__","_util_focusEditableElement__WEBPACK_IMPORTED_MODULE_4__","_util_iteratees__WEBPACK_IMPORTED_MODULE_5__","emojiDataPromise","emojiRawData","emojiData","RE_EMOJI_SEARCH","RE_BR","RE_SPACE","RE_CLEAN_HTML","RegExp","recentEmojiIds","onUpdateHtml","baseEmojiKeywords","emojiKeywords","markIsOpen","unmarkIsOpen","byId","setById","keywords","setKeywords","byKeyword","setByKeyword","names","setNames","byName","setByName","shouldForceInsertEmoji","setShouldForceInsertEmoji","filteredEmojis","setFilteredEmojis","recentEmojis","emojis","ensureEmojiData","byNative","baseEmojisByKeyword","natives","emojisByKeyword","emojisByName","emoji","match","getEmojiCode","forceSend","endsWith","matched","matchedKeywords","keyword","sort","matchedNames","insertEmoji","textEmoji","isForce","atIndex","lastIndexOf","messageInput","getElementById","native","isEmojiTooltipOpen","closeEmojiTooltip","EmojiTooltip","_util_schedulers__WEBPACK_IMPORTED_MODULE_4__","_util_focusEditableElement__WEBPACK_IMPORTED_MODULE_5__","_util_buildClassName__WEBPACK_IMPORTED_MODULE_6__","_util_iteratees__WEBPACK_IMPORTED_MODULE_7__","_util_environment__WEBPACK_IMPORTED_MODULE_8__","_util_captureKeyboardListeners__WEBPACK_IMPORTED_MODULE_9__","_hooks_useLayoutEffectWithPrevDeps__WEBPACK_IMPORTED_MODULE_10__","_hooks_useFlag__WEBPACK_IMPORTED_MODULE_11__","_common_helpers_parseEmojiOnlyString__WEBPACK_IMPORTED_MODULE_12__","_helpers_selection__WEBPACK_IMPORTED_MODULE_13__","_hooks_useLang__WEBPACK_IMPORTED_MODULE_14__","_common_helpers_renderText__WEBPACK_IMPORTED_MODULE_15__","_TextFormatter__WEBPACK_IMPORTED_MODULE_16__","MAX_INPUT_HEIGHT","currentChatId","threadId","messageSendKeyCombo","replyingToId","noTabCapture","isPollModalOpen","payment","isPaymentModalOpen","isAttachmentModalInput","editableInputId","forcedPlaceholder","shouldSetFocus","shouldSuppressFocus","shouldSuppressTextFormatter","onUpdate","onSuppressedFocus","onSend","editLastMessage","replyToNextMessage","cloneRef","isContextMenuOpenRef","isTextFormatterOpen","openTextFormatter","closeTextFormatter","textFormatterAnchorPosition","setTextFormatterAnchorPosition","setSelectedRange","updateInputHeight","prevHtml","focusInput","handleCloseTextFormatter","empty","clearSelection","checkSelection","selectedText","START_TO_END","selectionRect","inputRect","willSend","clone","currentHeight","newHeight","transitionDuration","log","captureFirstTab","onTab","suppressFocus","contentEditable","targetIndexDelta","handleKeyUp","closeContextMenuMouseListener","closeContextMenuKeyListener","handleMouseUp","onTouchCancel","_util_trimText__WEBPACK_IMPORTED_MODULE_3__","_util_dateFormat__WEBPACK_IMPORTED_MODULE_5__","_Media__WEBPACK_IMPORTED_MODULE_7__","_ui_Link__WEBPACK_IMPORTED_MODULE_8__","_SafeLink__WEBPACK_IMPORTED_MODULE_9__","onMessageClick","linkData","domain","messageText","siteName","handleMessageClick","displayUrl","truncatedDescription","data-initial","teactn","config","iteratees","selectors","useInfiniteScroll","ChatAnimationTypes","InfiniteScroll","Loading","types","renderActionMessageText","schedulers","useEnsureMessage","useChatContextActions","useMedia","Avatar","VerifiedIcon","TypingStatus","LastMessageMeta","DeleteChatModal","ListItem","ShowTransition","main_Badge","renderContent","unreadMentionsCount","FolderTypeToListType","main_Chat","lastMessage","replyToMessageId","isOutgoing","lastMessageSender","lastMessageAction","actionTargetMessage","targetUserIds","actionTargetUserIds","targetChatId","actionTargetChatId","privateChatUserId","usersById","users","currentThreadId","messageListType","draft","canScrollDown","lastMessageOutgoingStatus","orderDiff","animationType","openChat","focusLastMessage","isDeleteModalOpen","openDeleteModal","closeDeleteModal","shouldRenderDeleteModal","markRenderDeleteModal","unmarkRenderDeleteModal","isAction","mediaThumbnail","isRoundVideo","actionTargetUsers","Opacity","opacity","Move","shouldReplaceHistory","actionOrigin","asPlain","senderName","blobUrl","renderMessageSummary","renderLastMessageOrTyping","folderType","chats","chatsById","orderedPinnedIds","listType","chatFolder","notifySettings","notifyExceptions","noChatsText","isActive","loadMoreChats","preloadTopChatMessages","openNextChat","currentListIds","currentPinnedIds","orderById","orderedIds","newChatArrays","singleList","pinnedChats","otherChats","newOrderedIds","prevOrderById","orderDiffById","order","Infinity","loadMoreOfType","chatArrays","getAnimationType","movesUp","movesDown","orderDiffIds","numberOfUp","numberOfDown","None","useChatAnimationType","digit","viewportOffset","pinnedOffset","teactOrderKey","renderChats","useMentionTooltip","searchWords","searchUserName","usernameLowered","toLowerCase","fullNameLowered","filterLowered","runThrottled","RE_USERNAME_SEARCH","canSuggestMembers","groupChatMembers","topInlineBotIds","currentFilter","setCurrentFilter","usersToMention","setUsersToMention","topInlineBots","getFilteredUsers","withInlineBots","inlineBots","inlineBot","chatMembers","usernameFilter","getUsernameFilter","canSuggestInlineBots","insertMention","forceFocus","insertedHtml","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","mentionFilteredUsers","useBlurSync","fastBlur","useOnChange","useForceUpdate","cache","blurredRef","blurredAsync","blurredDataUri","useBlur"],"mappings":"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AK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAE5qCC,EAAY,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI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t3B,KAM3B,SAAUF,EAAQw3B,EAASt3B,KAKxB,CACA,CACA,CAEH,SAAUF,EAAQw3B,EAASt3B,KAM3B,SAAUF,EAAQw3B,EAASt3B,KAM3B,SAAUF,EAAQw3B,EAASt3B,KAM3B,SAAUF,EAAQw3B,EAASt3B,KAM3B,SAAUF,EAAQw3B,EAASt3B,KAM3B,SAAUF,EAAQw3B,EAASt3B,KAM3B,SAAUF,EAAQw3B,EAASt3B,KAM3B,SAAUF,EAAQw3B,EAASt3B,KAM3B,SAAUF,EAAQw3B,EAASt3B,KAM3B,SAAUF,EAAQw3B,EAASt3B,KAKxB,CACA,CACA,CAEH,SAAUF,EAAQw3B,EAASt3B,KAM3B,SAAUF,EAAQw3B,EAASt3B,KAKxB,CACA,CACA,CAEH,SAAUF,EAAQw3B,EAASt3B,KAM3B,SAAUF,EAAQw3B,EAASt3B,KAM3B,SAAUF,EAAQw3B,EAASt3B,KAKxB,CACA,CAEH,SAAUF,EAAQw3B,EAASt3B,KAKxB,CAEH,SAAUF,EAAQw3B,EAASt3B,KAM3B,SAAUF,EAAQw3B,EAASt3B,KAKxB,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CACA,CAEH,SAAUF,EAAQw3B,EAASt3B,KAKxB,CACA,CACA,CACA,CACA,CACA,CACA,CAEH,SAAUF,EAAQw3B,EAASt3B,KAM3B,SAAUF,EAAQw3B,EAASt3B,KAM3B,SAAUF,EAAQw3B,EAASt3B,KAM3B,SAAUF,EAAQw3B,EAASt3B","file":"0.e48232bc26b8d2aff6ea.js","sourceRoot":""} \ No newline at end of file diff --git a/dist/1.db575d71a0009d78423e.js b/dist/1.6110220c0cd22a07afe2.js similarity index 99% rename from dist/1.db575d71a0009d78423e.js rename to dist/1.6110220c0cd22a07afe2.js index e9ce99d93..55a836c9f 100644 --- a/dist/1.db575d71a0009d78423e.js +++ b/dist/1.6110220c0cd22a07afe2.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{325:function(F){F.exports=JSON.parse('[["people",["Smileys & People"]],[["1F600",["grinning"]],["1F603",["smiley"]],["1F604",["smile"]],["1F601",["grin"]],["1F606",["laughing","satisfied"]],["1F605",["sweat_smile"]],["1F923",["rolling_on_the_floor_laughing"]],["1F602",["joy"]],["1F642",["slightly_smiling_face"]],["1F643",["upside_down_face"]],["1F609",["wink"]],["1F60A",["blush"]],["1F607",["innocent"]],["1F970",["smiling_face_with_3_hearts"]],["1F60D",["heart_eyes"]],["1F929",["star-struck","grinning_face_with_star_eyes"]],["1F618",["kissing_heart"]],["1F617",["kissing"]],["263A-FE0F",["relaxed"]],["1F61A",["kissing_closed_eyes"]],["1F619",["kissing_smiling_eyes"]],["1F60B",["yum"]],["1F61B",["stuck_out_tongue"]],["1F61C",["stuck_out_tongue_winking_eye"]],["1F92A",["zany_face","grinning_face_with_one_large_and_one_small_eye"]],["1F61D",["stuck_out_tongue_closed_eyes"]],["1F911",["money_mouth_face"]],["1F917",["hugging_face"]],["1F92D",["face_with_hand_over_mouth","smiling_face_with_smiling_eyes_and_hand_covering_mouth"]],["1F92B",["shushing_face","face_with_finger_covering_closed_lips"]],["1F914",["thinking_face"]],["1F910",["zipper_mouth_face"]],["1F928",["face_with_raised_eyebrow","face_with_one_eyebrow_raised"]],["1F610",["neutral_face"]],["1F611",["expressionless"]],["1F636",["no_mouth"]],["1F60F",["smirk"]],["1F612",["unamused"]],["1F644",["face_with_rolling_eyes"]],["1F62C",["grimacing"]],["1F925",["lying_face"]],["1F60C",["relieved"]],["1F614",["pensive"]],["1F62A",["sleepy"]],["1F924",["drooling_face"]],["1F634",["sleeping"]],["1F637",["mask"]],["1F912",["face_with_thermometer"]],["1F915",["face_with_head_bandage"]],["1F922",["nauseated_face"]],["1F92E",["face_vomiting","face_with_open_mouth_vomiting"]],["1F927",["sneezing_face"]],["1F975",["hot_face"]],["1F976",["cold_face"]],["1F974",["woozy_face"]],["1F635",["dizzy_face"]],["1F92F",["exploding_head","shocked_face_with_exploding_head"]],["1F920",["face_with_cowboy_hat"]],["1F973",["partying_face"]],["1F60E",["sunglasses"]],["1F913",["nerd_face"]],["1F9D0",["face_with_monocle"]],["1F615",["confused"]],["1F61F",["worried"]],["1F641",["slightly_frowning_face"]],["2639-FE0F",["white_frowning_face"]],["1F62E",["open_mouth"]],["1F62F",["hushed"]],["1F632",["astonished"]],["1F633",["flushed"]],["1F97A",["pleading_face"]],["1F626",["frowning"]],["1F627",["anguished"]],["1F628",["fearful"]],["1F630",["cold_sweat"]],["1F625",["disappointed_relieved"]],["1F622",["cry"]],["1F62D",["sob"]],["1F631",["scream"]],["1F616",["confounded"]],["1F623",["persevere"]],["1F61E",["disappointed"]],["1F613",["sweat"]],["1F629",["weary"]],["1F62B",["tired_face"]],["1F971",["yawning_face"]],["1F624",["triumph"]],["1F621",["rage"]],["1F620",["angry"]],["1F92C",["face_with_symbols_on_mouth","serious_face_with_symbols_covering_mouth"]],["1F608",["smiling_imp"]],["1F47F",["imp"]],["1F480",["skull"]],["2620-FE0F",["skull_and_crossbones"]],["1F4A9",["hankey","poop","shit"]],["1F921",["clown_face"]],["1F479",["japanese_ogre"]],["1F47A",["japanese_goblin"]],["1F47B",["ghost"]],["1F47D",["alien"]],["1F47E",["space_invader"]],["1F916",["robot_face"]],["1F63A",["smiley_cat"]],["1F638",["smile_cat"]],["1F639",["joy_cat"]],["1F63B",["heart_eyes_cat"]],["1F63C",["smirk_cat"]],["1F63D",["kissing_cat"]],["1F640",["scream_cat"]],["1F63F",["crying_cat_face"]],["1F63E",["pouting_cat"]],["1F648",["see_no_evil"]],["1F649",["hear_no_evil"]],["1F64A",["speak_no_evil"]],["1F48B",["kiss"]],["1F48C",["love_letter"]],["1F498",["cupid"]],["1F49D",["gift_heart"]],["1F496",["sparkling_heart"]],["1F497",["heartpulse"]],["1F493",["heartbeat"]],["1F49E",["revolving_hearts"]],["1F495",["two_hearts"]],["1F49F",["heart_decoration"]],["2763-FE0F",["heavy_heart_exclamation_mark_ornament"]],["1F494",["broken_heart"]],["2764-FE0F",["heart"]],["1F9E1",["orange_heart"]],["1F49B",["yellow_heart"]],["1F49A",["green_heart"]],["1F499",["blue_heart"]],["1F49C",["purple_heart"]],["1F90E",["brown_heart"]],["1F5A4",["black_heart"]],["1F90D",["white_heart"]],["1F4AF",["100"]],["1F4A2",["anger"]],["1F4A5",["boom","collision"]],["1F4AB",["dizzy"]],["1F4A6",["sweat_drops"]],["1F4A8",["dash"]],["1F573-FE0F",["hole"]],["1F4A3",["bomb"]],["1F4AC",["speech_balloon"]],["1F441-FE0F-200D-1F5E8-FE0F",["eye-in-speech-bubble"]],["1F5E8-FE0F",["left_speech_bubble"]],["1F5EF-FE0F",["right_anger_bubble"]],["1F4AD",["thought_balloon"]],["1F4A4",["zzz"]],["1F44B",["wave"]],["1F91A",["raised_back_of_hand"]],["1F590-FE0F",["raised_hand_with_fingers_splayed"]],["270B",["hand","raised_hand"]],["1F596",["spock-hand"]],["1F44C",["ok_hand"]],["1F90F",["pinching_hand"]],["270C-FE0F",["v"]],["1F91E",["crossed_fingers","hand_with_index_and_middle_fingers_crossed"]],["1F91F",["i_love_you_hand_sign"]],["1F918",["the_horns","sign_of_the_horns"]],["1F919",["call_me_hand"]],["1F448",["point_left"]],["1F449",["point_right"]],["1F446",["point_up_2"]],["1F595",["middle_finger","reversed_hand_with_middle_finger_extended"]],["1F447",["point_down"]],["261D-FE0F",["point_up"]],["1F44D",["+1","thumbsup"]],["1F44E",["-1","thumbsdown"]],["270A",["fist"]],["1F44A",["facepunch","punch"]],["1F91B",["left-facing_fist"]],["1F91C",["right-facing_fist"]],["1F44F",["clap"]],["1F64C",["raised_hands"]],["1F450",["open_hands"]],["1F932",["palms_up_together"]],["1F91D",["handshake"]],["1F64F",["pray"]],["270D-FE0F",["writing_hand"]],["1F485",["nail_care"]],["1F933",["selfie"]],["1F4AA",["muscle"]],["1F9BE",["mechanical_arm"]],["1F9BF",["mechanical_leg"]],["1F9B5",["leg"]],["1F9B6",["foot"]],["1F442",["ear"]],["1F9BB",["ear_with_hearing_aid"]],["1F443",["nose"]],["1F9E0",["brain"]],["1F9B7",["tooth"]],["1F9B4",["bone"]],["1F440",["eyes"]],["1F441-FE0F",["eye"]],["1F445",["tongue"]],["1F444",["lips"]],["1F476",["baby"]],["1F9D2",["child"]],["1F466",["boy"]],["1F467",["girl"]],["1F9D1",["adult"]],["1F471",["person_with_blond_hair"]],["1F468",["man"]],["1F9D4",["bearded_person"]],["1F468-200D-1F9B0",["red_haired_man"]],["1F468-200D-1F9B1",["curly_haired_man"]],["1F468-200D-1F9B3",["white_haired_man"]],["1F468-200D-1F9B2",["bald_man"]],["1F469",["woman"]],["1F469-200D-1F9B0",["red_haired_woman"]],["1F9D1-200D-1F9B0",["red_haired_person"]],["1F469-200D-1F9B1",["curly_haired_woman"]],["1F9D1-200D-1F9B1",["curly_haired_person"]],["1F469-200D-1F9B3",["white_haired_woman"]],["1F9D1-200D-1F9B3",["white_haired_person"]],["1F469-200D-1F9B2",["bald_woman"]],["1F9D1-200D-1F9B2",["bald_person"]],["1F471-200D-2640-FE0F",["blond-haired-woman"]],["1F471-200D-2642-FE0F",["blond-haired-man"]],["1F9D3",["older_adult"]],["1F474",["older_man"]],["1F475",["older_woman"]],["1F64D",["person_frowning"]],["1F64D-200D-2642-FE0F",["man-frowning"]],["1F64D-200D-2640-FE0F",["woman-frowning"]],["1F64E",["person_with_pouting_face"]],["1F64E-200D-2642-FE0F",["man-pouting"]],["1F64E-200D-2640-FE0F",["woman-pouting"]],["1F645",["no_good"]],["1F645-200D-2642-FE0F",["man-gesturing-no"]],["1F645-200D-2640-FE0F",["woman-gesturing-no"]],["1F646",["ok_woman"]],["1F646-200D-2642-FE0F",["man-gesturing-ok"]],["1F646-200D-2640-FE0F",["woman-gesturing-ok"]],["1F481",["information_desk_person"]],["1F481-200D-2642-FE0F",["man-tipping-hand"]],["1F481-200D-2640-FE0F",["woman-tipping-hand"]],["1F64B",["raising_hand"]],["1F64B-200D-2642-FE0F",["man-raising-hand"]],["1F64B-200D-2640-FE0F",["woman-raising-hand"]],["1F9CF",["deaf_person"]],["1F9CF-200D-2642-FE0F",["deaf_man"]],["1F9CF-200D-2640-FE0F",["deaf_woman"]],["1F647",["bow"]],["1F647-200D-2642-FE0F",["man-bowing"]],["1F647-200D-2640-FE0F",["woman-bowing"]],["1F926",["face_palm"]],["1F926-200D-2642-FE0F",["man-facepalming"]],["1F926-200D-2640-FE0F",["woman-facepalming"]],["1F937",["shrug"]],["1F937-200D-2642-FE0F",["man-shrugging"]],["1F937-200D-2640-FE0F",["woman-shrugging"]],["1F9D1-200D-2695-FE0F",["health_worker"]],["1F468-200D-2695-FE0F",["male-doctor"]],["1F469-200D-2695-FE0F",["female-doctor"]],["1F9D1-200D-1F393",["student"]],["1F468-200D-1F393",["male-student"]],["1F469-200D-1F393",["female-student"]],["1F9D1-200D-1F3EB",["teacher"]],["1F468-200D-1F3EB",["male-teacher"]],["1F469-200D-1F3EB",["female-teacher"]],["1F9D1-200D-2696-FE0F",["judge"]],["1F468-200D-2696-FE0F",["male-judge"]],["1F469-200D-2696-FE0F",["female-judge"]],["1F9D1-200D-1F33E",["farmer"]],["1F468-200D-1F33E",["male-farmer"]],["1F469-200D-1F33E",["female-farmer"]],["1F9D1-200D-1F373",["cook"]],["1F468-200D-1F373",["male-cook"]],["1F469-200D-1F373",["female-cook"]],["1F9D1-200D-1F527",["mechanic"]],["1F468-200D-1F527",["male-mechanic"]],["1F469-200D-1F527",["female-mechanic"]],["1F9D1-200D-1F3ED",["factory_worker"]],["1F468-200D-1F3ED",["male-factory-worker"]],["1F469-200D-1F3ED",["female-factory-worker"]],["1F9D1-200D-1F4BC",["office_worker"]],["1F468-200D-1F4BC",["male-office-worker"]],["1F469-200D-1F4BC",["female-office-worker"]],["1F9D1-200D-1F52C",["scientist"]],["1F468-200D-1F52C",["male-scientist"]],["1F469-200D-1F52C",["female-scientist"]],["1F9D1-200D-1F4BB",["technologist"]],["1F468-200D-1F4BB",["male-technologist"]],["1F469-200D-1F4BB",["female-technologist"]],["1F9D1-200D-1F3A4",["singer"]],["1F468-200D-1F3A4",["male-singer"]],["1F469-200D-1F3A4",["female-singer"]],["1F9D1-200D-1F3A8",["artist"]],["1F468-200D-1F3A8",["male-artist"]],["1F469-200D-1F3A8",["female-artist"]],["1F9D1-200D-2708-FE0F",["pilot"]],["1F468-200D-2708-FE0F",["male-pilot"]],["1F469-200D-2708-FE0F",["female-pilot"]],["1F9D1-200D-1F680",["astronaut"]],["1F468-200D-1F680",["male-astronaut"]],["1F469-200D-1F680",["female-astronaut"]],["1F9D1-200D-1F692",["firefighter"]],["1F468-200D-1F692",["male-firefighter"]],["1F469-200D-1F692",["female-firefighter"]],["1F46E",["cop"]],["1F46E-200D-2642-FE0F",["male-police-officer"]],["1F46E-200D-2640-FE0F",["female-police-officer"]],["1F575-FE0F",["sleuth_or_spy"]],["1F575-FE0F-200D-2642-FE0F",["male-detective"]],["1F575-FE0F-200D-2640-FE0F",["female-detective"]],["1F482",["guardsman"]],["1F482-200D-2642-FE0F",["male-guard"]],["1F482-200D-2640-FE0F",["female-guard"]],["1F477",["construction_worker"]],["1F477-200D-2642-FE0F",["male-construction-worker"]],["1F477-200D-2640-FE0F",["female-construction-worker"]],["1F934",["prince"]],["1F478",["princess"]],["1F473",["man_with_turban"]],["1F473-200D-2642-FE0F",["man-wearing-turban"]],["1F473-200D-2640-FE0F",["woman-wearing-turban"]],["1F472",["man_with_gua_pi_mao"]],["1F9D5",["person_with_headscarf"]],["1F935",["man_in_tuxedo"]],["1F470",["bride_with_veil"]],["1F930",["pregnant_woman"]],["1F931",["breast-feeding"]],["1F47C",["angel"]],["1F385",["santa"]],["1F936",["mrs_claus","mother_christmas"]],["1F9B8",["superhero"]],["1F9B8-200D-2642-FE0F",["male_superhero"]],["1F9B8-200D-2640-FE0F",["female_superhero"]],["1F9B9",["supervillain"]],["1F9B9-200D-2642-FE0F",["male_supervillain"]],["1F9B9-200D-2640-FE0F",["female_supervillain"]],["1F9D9",["mage"]],["1F9D9-200D-2642-FE0F",["male_mage"]],["1F9D9-200D-2640-FE0F",["female_mage"]],["1F9DA",["fairy"]],["1F9DA-200D-2642-FE0F",["male_fairy"]],["1F9DA-200D-2640-FE0F",["female_fairy"]],["1F9DB",["vampire"]],["1F9DB-200D-2642-FE0F",["male_vampire"]],["1F9DB-200D-2640-FE0F",["female_vampire"]],["1F9DC",["merperson"]],["1F9DC-200D-2642-FE0F",["merman"]],["1F9DC-200D-2640-FE0F",["mermaid"]],["1F9DD",["elf"]],["1F9DD-200D-2642-FE0F",["male_elf"]],["1F9DD-200D-2640-FE0F",["female_elf"]],["1F9DE",["genie"]],["1F9DE-200D-2642-FE0F",["male_genie"]],["1F9DE-200D-2640-FE0F",["female_genie"]],["1F9DF",["zombie"]],["1F9DF-200D-2642-FE0F",["male_zombie"]],["1F9DF-200D-2640-FE0F",["female_zombie"]],["1F486",["massage"]],["1F486-200D-2642-FE0F",["man-getting-massage"]],["1F486-200D-2640-FE0F",["woman-getting-massage"]],["1F487",["haircut"]],["1F487-200D-2642-FE0F",["man-getting-haircut"]],["1F487-200D-2640-FE0F",["woman-getting-haircut"]],["1F6B6",["walking"]],["1F6B6-200D-2642-FE0F",["man-walking"]],["1F6B6-200D-2640-FE0F",["woman-walking"]],["1F9CD",["standing_person"]],["1F9CD-200D-2642-FE0F",["man_standing"]],["1F9CD-200D-2640-FE0F",["woman_standing"]],["1F9CE",["kneeling_person"]],["1F9CE-200D-2642-FE0F",["man_kneeling"]],["1F9CE-200D-2640-FE0F",["woman_kneeling"]],["1F9D1-200D-1F9AF",["person_with_probing_cane"]],["1F468-200D-1F9AF",["man_with_probing_cane"]],["1F469-200D-1F9AF",["woman_with_probing_cane"]],["1F9D1-200D-1F9BC",["person_in_motorized_wheelchair"]],["1F468-200D-1F9BC",["man_in_motorized_wheelchair"]],["1F469-200D-1F9BC",["woman_in_motorized_wheelchair"]],["1F9D1-200D-1F9BD",["person_in_manual_wheelchair"]],["1F468-200D-1F9BD",["man_in_manual_wheelchair"]],["1F469-200D-1F9BD",["woman_in_manual_wheelchair"]],["1F3C3",["runner","running"]],["1F3C3-200D-2642-FE0F",["man-running"]],["1F3C3-200D-2640-FE0F",["woman-running"]],["1F483",["dancer"]],["1F57A",["man_dancing"]],["1F574-FE0F",["man_in_business_suit_levitating"]],["1F46F",["dancers"]],["1F46F-200D-2642-FE0F",["man-with-bunny-ears-partying"]],["1F46F-200D-2640-FE0F",["woman-with-bunny-ears-partying"]],["1F9D6",["person_in_steamy_room"]],["1F9D6-200D-2642-FE0F",["man_in_steamy_room"]],["1F9D6-200D-2640-FE0F",["woman_in_steamy_room"]],["1F9D7",["person_climbing"]],["1F9D7-200D-2642-FE0F",["man_climbing"]],["1F9D7-200D-2640-FE0F",["woman_climbing"]],["1F93A",["fencer"]],["1F3C7",["horse_racing"]],["26F7-FE0F",["skier"]],["1F3C2",["snowboarder"]],["1F3CC-FE0F",["golfer"]],["1F3CC-FE0F-200D-2642-FE0F",["man-golfing"]],["1F3CC-FE0F-200D-2640-FE0F",["woman-golfing"]],["1F3C4",["surfer"]],["1F3C4-200D-2642-FE0F",["man-surfing"]],["1F3C4-200D-2640-FE0F",["woman-surfing"]],["1F6A3",["rowboat"]],["1F6A3-200D-2642-FE0F",["man-rowing-boat"]],["1F6A3-200D-2640-FE0F",["woman-rowing-boat"]],["1F3CA",["swimmer"]],["1F3CA-200D-2642-FE0F",["man-swimming"]],["1F3CA-200D-2640-FE0F",["woman-swimming"]],["26F9-FE0F",["person_with_ball"]],["26F9-FE0F-200D-2642-FE0F",["man-bouncing-ball"]],["26F9-FE0F-200D-2640-FE0F",["woman-bouncing-ball"]],["1F3CB-FE0F",["weight_lifter"]],["1F3CB-FE0F-200D-2642-FE0F",["man-lifting-weights"]],["1F3CB-FE0F-200D-2640-FE0F",["woman-lifting-weights"]],["1F6B4",["bicyclist"]],["1F6B4-200D-2642-FE0F",["man-biking"]],["1F6B4-200D-2640-FE0F",["woman-biking"]],["1F6B5",["mountain_bicyclist"]],["1F6B5-200D-2642-FE0F",["man-mountain-biking"]],["1F6B5-200D-2640-FE0F",["woman-mountain-biking"]],["1F938",["person_doing_cartwheel"]],["1F938-200D-2642-FE0F",["man-cartwheeling"]],["1F938-200D-2640-FE0F",["woman-cartwheeling"]],["1F93C",["wrestlers"]],["1F93C-200D-2642-FE0F",["man-wrestling"]],["1F93C-200D-2640-FE0F",["woman-wrestling"]],["1F93D",["water_polo"]],["1F93D-200D-2642-FE0F",["man-playing-water-polo"]],["1F93D-200D-2640-FE0F",["woman-playing-water-polo"]],["1F93E",["handball"]],["1F93E-200D-2642-FE0F",["man-playing-handball"]],["1F93E-200D-2640-FE0F",["woman-playing-handball"]],["1F939",["juggling"]],["1F939-200D-2642-FE0F",["man-juggling"]],["1F939-200D-2640-FE0F",["woman-juggling"]],["1F9D8",["person_in_lotus_position"]],["1F9D8-200D-2642-FE0F",["man_in_lotus_position"]],["1F9D8-200D-2640-FE0F",["woman_in_lotus_position"]],["1F6C0",["bath"]],["1F6CC",["sleeping_accommodation"]],["1F9D1-200D-1F91D-200D-1F9D1",["people_holding_hands"]],["1F46D",["two_women_holding_hands","women_holding_hands"]],["1F46B",["couple","man_and_woman_holding_hands","woman_and_man_holding_hands"]],["1F46C",["two_men_holding_hands","men_holding_hands"]],["1F48F",["couplekiss"]],["1F469-200D-2764-FE0F-200D-1F48B-200D-1F468",["woman-kiss-man"]],["1F468-200D-2764-FE0F-200D-1F48B-200D-1F468",["man-kiss-man"]],["1F469-200D-2764-FE0F-200D-1F48B-200D-1F469",["woman-kiss-woman"]],["1F491",["couple_with_heart"]],["1F469-200D-2764-FE0F-200D-1F468",["woman-heart-man"]],["1F468-200D-2764-FE0F-200D-1F468",["man-heart-man"]],["1F469-200D-2764-FE0F-200D-1F469",["woman-heart-woman"]],["1F46A",["family","man-woman-boy"]],["1F468-200D-1F469-200D-1F466",["man-woman-boy","family"]],["1F468-200D-1F469-200D-1F467",["man-woman-girl"]],["1F468-200D-1F469-200D-1F467-200D-1F466",["man-woman-girl-boy"]],["1F468-200D-1F469-200D-1F466-200D-1F466",["man-woman-boy-boy"]],["1F468-200D-1F469-200D-1F467-200D-1F467",["man-woman-girl-girl"]],["1F468-200D-1F468-200D-1F466",["man-man-boy"]],["1F468-200D-1F468-200D-1F467",["man-man-girl"]],["1F468-200D-1F468-200D-1F467-200D-1F466",["man-man-girl-boy"]],["1F468-200D-1F468-200D-1F466-200D-1F466",["man-man-boy-boy"]],["1F468-200D-1F468-200D-1F467-200D-1F467",["man-man-girl-girl"]],["1F469-200D-1F469-200D-1F466",["woman-woman-boy"]],["1F469-200D-1F469-200D-1F467",["woman-woman-girl"]],["1F469-200D-1F469-200D-1F467-200D-1F466",["woman-woman-girl-boy"]],["1F469-200D-1F469-200D-1F466-200D-1F466",["woman-woman-boy-boy"]],["1F469-200D-1F469-200D-1F467-200D-1F467",["woman-woman-girl-girl"]],["1F468-200D-1F466",["man-boy"]],["1F468-200D-1F466-200D-1F466",["man-boy-boy"]],["1F468-200D-1F467",["man-girl"]],["1F468-200D-1F467-200D-1F466",["man-girl-boy"]],["1F468-200D-1F467-200D-1F467",["man-girl-girl"]],["1F469-200D-1F466",["woman-boy"]],["1F469-200D-1F466-200D-1F466",["woman-boy-boy"]],["1F469-200D-1F467",["woman-girl"]],["1F469-200D-1F467-200D-1F466",["woman-girl-boy"]],["1F469-200D-1F467-200D-1F467",["woman-girl-girl"]],["1F5E3-FE0F",["speaking_head_in_silhouette"]],["1F464",["bust_in_silhouette"]],["1F465",["busts_in_silhouette"]],["1F463",["footprints"]]],["nature",["Animals & Nature"]],[["1F435",["monkey_face"]],["1F412",["monkey"]],["1F98D",["gorilla"]],["1F9A7",["orangutan"]],["1F436",["dog"]],["1F415",["dog2"]],["1F9AE",["guide_dog"]],["1F415-200D-1F9BA",["service_dog"]],["1F429",["poodle"]],["1F43A",["wolf"]],["1F98A",["fox_face"]],["1F99D",["raccoon"]],["1F431",["cat"]],["1F408",["cat2"]],["1F981",["lion_face"]],["1F42F",["tiger"]],["1F405",["tiger2"]],["1F406",["leopard"]],["1F434",["horse"]],["1F40E",["racehorse"]],["1F984",["unicorn_face"]],["1F993",["zebra_face"]],["1F98C",["deer"]],["1F42E",["cow"]],["1F402",["ox"]],["1F403",["water_buffalo"]],["1F404",["cow2"]],["1F437",["pig"]],["1F416",["pig2"]],["1F417",["boar"]],["1F43D",["pig_nose"]],["1F40F",["ram"]],["1F411",["sheep"]],["1F410",["goat"]],["1F42A",["dromedary_camel"]],["1F42B",["camel"]],["1F999",["llama"]],["1F992",["giraffe_face"]],["1F418",["elephant"]],["1F98F",["rhinoceros"]],["1F99B",["hippopotamus"]],["1F42D",["mouse"]],["1F401",["mouse2"]],["1F400",["rat"]],["1F439",["hamster"]],["1F430",["rabbit"]],["1F407",["rabbit2"]],["1F43F-FE0F",["chipmunk"]],["1F994",["hedgehog"]],["1F987",["bat"]],["1F43B",["bear"]],["1F428",["koala"]],["1F43C",["panda_face"]],["1F9A5",["sloth"]],["1F9A6",["otter"]],["1F9A8",["skunk"]],["1F998",["kangaroo"]],["1F9A1",["badger"]],["1F43E",["feet","paw_prints"]],["1F983",["turkey"]],["1F414",["chicken"]],["1F413",["rooster"]],["1F423",["hatching_chick"]],["1F424",["baby_chick"]],["1F425",["hatched_chick"]],["1F426",["bird"]],["1F427",["penguin"]],["1F54A-FE0F",["dove_of_peace"]],["1F985",["eagle"]],["1F986",["duck"]],["1F9A2",["swan"]],["1F989",["owl"]],["1F9A9",["flamingo"]],["1F99A",["peacock"]],["1F99C",["parrot"]],["1F438",["frog"]],["1F40A",["crocodile"]],["1F422",["turtle"]],["1F98E",["lizard"]],["1F40D",["snake"]],["1F432",["dragon_face"]],["1F409",["dragon"]],["1F995",["sauropod"]],["1F996",["t-rex"]],["1F433",["whale"]],["1F40B",["whale2"]],["1F42C",["dolphin","flipper"]],["1F41F",["fish"]],["1F420",["tropical_fish"]],["1F421",["blowfish"]],["1F988",["shark"]],["1F419",["octopus"]],["1F41A",["shell"]],["1F40C",["snail"]],["1F98B",["butterfly"]],["1F41B",["bug"]],["1F41C",["ant"]],["1F41D",["bee","honeybee"]],["1F41E",["beetle"]],["1F997",["cricket"]],["1F577-FE0F",["spider"]],["1F578-FE0F",["spider_web"]],["1F982",["scorpion"]],["1F99F",["mosquito"]],["1F9A0",["microbe"]],["1F490",["bouquet"]],["1F338",["cherry_blossom"]],["1F4AE",["white_flower"]],["1F3F5-FE0F",["rosette"]],["1F339",["rose"]],["1F940",["wilted_flower"]],["1F33A",["hibiscus"]],["1F33B",["sunflower"]],["1F33C",["blossom"]],["1F337",["tulip"]],["1F331",["seedling"]],["1F332",["evergreen_tree"]],["1F333",["deciduous_tree"]],["1F334",["palm_tree"]],["1F335",["cactus"]],["1F33E",["ear_of_rice"]],["1F33F",["herb"]],["2618-FE0F",["shamrock"]],["1F340",["four_leaf_clover"]],["1F341",["maple_leaf"]],["1F342",["fallen_leaf"]],["1F343",["leaves"]]],["foods",["Food & Drink"]],[["1F347",["grapes"]],["1F348",["melon"]],["1F349",["watermelon"]],["1F34A",["tangerine"]],["1F34B",["lemon"]],["1F34C",["banana"]],["1F34D",["pineapple"]],["1F96D",["mango"]],["1F34E",["apple"]],["1F34F",["green_apple"]],["1F350",["pear"]],["1F351",["peach"]],["1F352",["cherries"]],["1F353",["strawberry"]],["1F95D",["kiwifruit"]],["1F345",["tomato"]],["1F965",["coconut"]],["1F951",["avocado"]],["1F346",["eggplant"]],["1F954",["potato"]],["1F955",["carrot"]],["1F33D",["corn"]],["1F336-FE0F",["hot_pepper"]],["1F952",["cucumber"]],["1F96C",["leafy_green"]],["1F966",["broccoli"]],["1F9C4",["garlic"]],["1F9C5",["onion"]],["1F344",["mushroom"]],["1F95C",["peanuts"]],["1F330",["chestnut"]],["1F35E",["bread"]],["1F950",["croissant"]],["1F956",["baguette_bread"]],["1F968",["pretzel"]],["1F96F",["bagel"]],["1F95E",["pancakes"]],["1F9C7",["waffle"]],["1F9C0",["cheese_wedge"]],["1F356",["meat_on_bone"]],["1F357",["poultry_leg"]],["1F969",["cut_of_meat"]],["1F953",["bacon"]],["1F354",["hamburger"]],["1F35F",["fries"]],["1F355",["pizza"]],["1F32D",["hotdog"]],["1F96A",["sandwich"]],["1F32E",["taco"]],["1F32F",["burrito"]],["1F959",["stuffed_flatbread"]],["1F9C6",["falafel"]],["1F95A",["egg"]],["1F373",["fried_egg","cooking"]],["1F958",["shallow_pan_of_food"]],["1F372",["stew"]],["1F963",["bowl_with_spoon"]],["1F957",["green_salad"]],["1F37F",["popcorn"]],["1F9C8",["butter"]],["1F9C2",["salt"]],["1F96B",["canned_food"]],["1F371",["bento"]],["1F358",["rice_cracker"]],["1F359",["rice_ball"]],["1F35A",["rice"]],["1F35B",["curry"]],["1F35C",["ramen"]],["1F35D",["spaghetti"]],["1F360",["sweet_potato"]],["1F362",["oden"]],["1F363",["sushi"]],["1F364",["fried_shrimp"]],["1F365",["fish_cake"]],["1F96E",["moon_cake"]],["1F361",["dango"]],["1F95F",["dumpling"]],["1F960",["fortune_cookie"]],["1F961",["takeout_box"]],["1F980",["crab"]],["1F99E",["lobster"]],["1F990",["shrimp"]],["1F991",["squid"]],["1F9AA",["oyster"]],["1F366",["icecream"]],["1F367",["shaved_ice"]],["1F368",["ice_cream"]],["1F369",["doughnut"]],["1F36A",["cookie"]],["1F382",["birthday"]],["1F370",["cake"]],["1F9C1",["cupcake"]],["1F967",["pie"]],["1F36B",["chocolate_bar"]],["1F36C",["candy"]],["1F36D",["lollipop"]],["1F36E",["custard"]],["1F36F",["honey_pot"]],["1F37C",["baby_bottle"]],["1F95B",["glass_of_milk"]],["2615",["coffee"]],["1F375",["tea"]],["1F376",["sake"]],["1F37E",["champagne"]],["1F377",["wine_glass"]],["1F378",["cocktail"]],["1F379",["tropical_drink"]],["1F37A",["beer"]],["1F37B",["beers"]],["1F942",["clinking_glasses"]],["1F943",["tumbler_glass"]],["1F964",["cup_with_straw"]],["1F9C3",["beverage_box"]],["1F9C9",["mate_drink"]],["1F9CA",["ice_cube"]],["1F962",["chopsticks"]],["1F37D-FE0F",["knife_fork_plate"]],["1F374",["fork_and_knife"]],["1F944",["spoon"]],["1F52A",["hocho","knife"]],["1F3FA",["amphora"]]],["activity",["Activities"]],[["1F383",["jack_o_lantern"]],["1F384",["christmas_tree"]],["1F386",["fireworks"]],["1F387",["sparkler"]],["1F9E8",["firecracker"]],["2728",["sparkles"]],["1F388",["balloon"]],["1F389",["tada"]],["1F38A",["confetti_ball"]],["1F38B",["tanabata_tree"]],["1F38D",["bamboo"]],["1F38E",["dolls"]],["1F38F",["flags"]],["1F390",["wind_chime"]],["1F391",["rice_scene"]],["1F9E7",["red_envelope"]],["1F380",["ribbon"]],["1F381",["gift"]],["1F397-FE0F",["reminder_ribbon"]],["1F39F-FE0F",["admission_tickets"]],["1F3AB",["ticket"]],["1F396-FE0F",["medal"]],["1F3C6",["trophy"]],["1F3C5",["sports_medal"]],["1F947",["first_place_medal"]],["1F948",["second_place_medal"]],["1F949",["third_place_medal"]],["26BD",["soccer"]],["26BE",["baseball"]],["1F94E",["softball"]],["1F3C0",["basketball"]],["1F3D0",["volleyball"]],["1F3C8",["football"]],["1F3C9",["rugby_football"]],["1F3BE",["tennis"]],["1F94F",["flying_disc"]],["1F3B3",["bowling"]],["1F3CF",["cricket_bat_and_ball"]],["1F3D1",["field_hockey_stick_and_ball"]],["1F3D2",["ice_hockey_stick_and_puck"]],["1F94D",["lacrosse"]],["1F3D3",["table_tennis_paddle_and_ball"]],["1F3F8",["badminton_racquet_and_shuttlecock"]],["1F94A",["boxing_glove"]],["1F94B",["martial_arts_uniform"]],["1F945",["goal_net"]],["26F3",["golf"]],["26F8-FE0F",["ice_skate"]],["1F3A3",["fishing_pole_and_fish"]],["1F93F",["diving_mask"]],["1F3BD",["running_shirt_with_sash"]],["1F3BF",["ski"]],["1F6F7",["sled"]],["1F94C",["curling_stone"]],["1F3AF",["dart"]],["1FA80",["yo-yo"]],["1FA81",["kite"]],["1F3B1",["8ball"]],["1F52E",["crystal_ball"]],["1F9FF",["nazar_amulet"]],["1F3AE",["video_game"]],["1F579-FE0F",["joystick"]],["1F3B0",["slot_machine"]],["1F3B2",["game_die"]],["1F9E9",["jigsaw"]],["1F9F8",["teddy_bear"]],["2660-FE0F",["spades"]],["2665-FE0F",["hearts"]],["2666-FE0F",["diamonds"]],["2663-FE0F",["clubs"]],["265F-FE0F",["chess_pawn"]],["1F0CF",["black_joker"]],["1F004",["mahjong"]],["1F3B4",["flower_playing_cards"]],["1F3AD",["performing_arts"]],["1F5BC-FE0F",["frame_with_picture"]],["1F3A8",["art"]],["1F9F5",["thread"]],["1F9F6",["yarn"]]],["places",["Travel & Places"]],[["1F30D",["earth_africa"]],["1F30E",["earth_americas"]],["1F30F",["earth_asia"]],["1F310",["globe_with_meridians"]],["1F5FA-FE0F",["world_map"]],["1F5FE",["japan"]],["1F9ED",["compass"]],["1F3D4-FE0F",["snow_capped_mountain"]],["26F0-FE0F",["mountain"]],["1F30B",["volcano"]],["1F5FB",["mount_fuji"]],["1F3D5-FE0F",["camping"]],["1F3D6-FE0F",["beach_with_umbrella"]],["1F3DC-FE0F",["desert"]],["1F3DD-FE0F",["desert_island"]],["1F3DE-FE0F",["national_park"]],["1F3DF-FE0F",["stadium"]],["1F3DB-FE0F",["classical_building"]],["1F3D7-FE0F",["building_construction"]],["1F9F1",["bricks"]],["1F3D8-FE0F",["house_buildings"]],["1F3DA-FE0F",["derelict_house_building"]],["1F3E0",["house"]],["1F3E1",["house_with_garden"]],["1F3E2",["office"]],["1F3E3",["post_office"]],["1F3E4",["european_post_office"]],["1F3E5",["hospital"]],["1F3E6",["bank"]],["1F3E8",["hotel"]],["1F3E9",["love_hotel"]],["1F3EA",["convenience_store"]],["1F3EB",["school"]],["1F3EC",["department_store"]],["1F3ED",["factory"]],["1F3EF",["japanese_castle"]],["1F3F0",["european_castle"]],["1F492",["wedding"]],["1F5FC",["tokyo_tower"]],["1F5FD",["statue_of_liberty"]],["26EA",["church"]],["1F54C",["mosque"]],["1F6D5",["hindu_temple"]],["1F54D",["synagogue"]],["26E9-FE0F",["shinto_shrine"]],["1F54B",["kaaba"]],["26F2",["fountain"]],["26FA",["tent"]],["1F301",["foggy"]],["1F303",["night_with_stars"]],["1F3D9-FE0F",["cityscape"]],["1F304",["sunrise_over_mountains"]],["1F305",["sunrise"]],["1F306",["city_sunset"]],["1F307",["city_sunrise"]],["1F309",["bridge_at_night"]],["2668-FE0F",["hotsprings"]],["1F3A0",["carousel_horse"]],["1F3A1",["ferris_wheel"]],["1F3A2",["roller_coaster"]],["1F488",["barber"]],["1F3AA",["circus_tent"]],["1F682",["steam_locomotive"]],["1F683",["railway_car"]],["1F684",["bullettrain_side"]],["1F685",["bullettrain_front"]],["1F686",["train2"]],["1F687",["metro"]],["1F688",["light_rail"]],["1F689",["station"]],["1F68A",["tram"]],["1F69D",["monorail"]],["1F69E",["mountain_railway"]],["1F68B",["train"]],["1F68C",["bus"]],["1F68D",["oncoming_bus"]],["1F68E",["trolleybus"]],["1F690",["minibus"]],["1F691",["ambulance"]],["1F692",["fire_engine"]],["1F693",["police_car"]],["1F694",["oncoming_police_car"]],["1F695",["taxi"]],["1F696",["oncoming_taxi"]],["1F697",["car","red_car"]],["1F698",["oncoming_automobile"]],["1F699",["blue_car"]],["1F69A",["truck"]],["1F69B",["articulated_lorry"]],["1F69C",["tractor"]],["1F3CE-FE0F",["racing_car"]],["1F3CD-FE0F",["racing_motorcycle"]],["1F6F5",["motor_scooter"]],["1F9BD",["manual_wheelchair"]],["1F9BC",["motorized_wheelchair"]],["1F6FA",["auto_rickshaw"]],["1F6B2",["bike"]],["1F6F4",["scooter"]],["1F6F9",["skateboard"]],["1F68F",["busstop"]],["1F6E3-FE0F",["motorway"]],["1F6E4-FE0F",["railway_track"]],["1F6E2-FE0F",["oil_drum"]],["26FD",["fuelpump"]],["1F6A8",["rotating_light"]],["1F6A5",["traffic_light"]],["1F6A6",["vertical_traffic_light"]],["1F6D1",["octagonal_sign"]],["1F6A7",["construction"]],["2693",["anchor"]],["26F5",["boat","sailboat"]],["1F6F6",["canoe"]],["1F6A4",["speedboat"]],["1F6F3-FE0F",["passenger_ship"]],["26F4-FE0F",["ferry"]],["1F6E5-FE0F",["motor_boat"]],["1F6A2",["ship"]],["2708-FE0F",["airplane"]],["1F6E9-FE0F",["small_airplane"]],["1F6EB",["airplane_departure"]],["1F6EC",["airplane_arriving"]],["1FA82",["parachute"]],["1F4BA",["seat"]],["1F681",["helicopter"]],["1F69F",["suspension_railway"]],["1F6A0",["mountain_cableway"]],["1F6A1",["aerial_tramway"]],["1F6F0-FE0F",["satellite"]],["1F680",["rocket"]],["1F6F8",["flying_saucer"]],["1F6CE-FE0F",["bellhop_bell"]],["1F9F3",["luggage"]],["231B",["hourglass"]],["23F3",["hourglass_flowing_sand"]],["231A",["watch"]],["23F0",["alarm_clock"]],["23F1-FE0F",["stopwatch"]],["23F2-FE0F",["timer_clock"]],["1F570-FE0F",["mantelpiece_clock"]],["1F55B",["clock12"]],["1F567",["clock1230"]],["1F550",["clock1"]],["1F55C",["clock130"]],["1F551",["clock2"]],["1F55D",["clock230"]],["1F552",["clock3"]],["1F55E",["clock330"]],["1F553",["clock4"]],["1F55F",["clock430"]],["1F554",["clock5"]],["1F560",["clock530"]],["1F555",["clock6"]],["1F561",["clock630"]],["1F556",["clock7"]],["1F562",["clock730"]],["1F557",["clock8"]],["1F563",["clock830"]],["1F558",["clock9"]],["1F564",["clock930"]],["1F559",["clock10"]],["1F565",["clock1030"]],["1F55A",["clock11"]],["1F566",["clock1130"]],["1F311",["new_moon"]],["1F312",["waxing_crescent_moon"]],["1F313",["first_quarter_moon"]],["1F314",["moon","waxing_gibbous_moon"]],["1F315",["full_moon"]],["1F316",["waning_gibbous_moon"]],["1F317",["last_quarter_moon"]],["1F318",["waning_crescent_moon"]],["1F319",["crescent_moon"]],["1F31A",["new_moon_with_face"]],["1F31B",["first_quarter_moon_with_face"]],["1F31C",["last_quarter_moon_with_face"]],["1F321-FE0F",["thermometer"]],["2600-FE0F",["sunny"]],["1F31D",["full_moon_with_face"]],["1F31E",["sun_with_face"]],["1FA90",["ringed_planet"]],["2B50",["star"]],["1F31F",["star2"]],["1F320",["stars"]],["1F30C",["milky_way"]],["2601-FE0F",["cloud"]],["26C5",["partly_sunny"]],["26C8-FE0F",["thunder_cloud_and_rain"]],["1F324-FE0F",["mostly_sunny","sun_small_cloud"]],["1F325-FE0F",["barely_sunny","sun_behind_cloud"]],["1F326-FE0F",["partly_sunny_rain","sun_behind_rain_cloud"]],["1F327-FE0F",["rain_cloud"]],["1F328-FE0F",["snow_cloud"]],["1F329-FE0F",["lightning","lightning_cloud"]],["1F32A-FE0F",["tornado","tornado_cloud"]],["1F32B-FE0F",["fog"]],["1F32C-FE0F",["wind_blowing_face"]],["1F300",["cyclone"]],["1F308",["rainbow"]],["1F302",["closed_umbrella"]],["2602-FE0F",["umbrella"]],["2614",["umbrella_with_rain_drops"]],["26F1-FE0F",["umbrella_on_ground"]],["26A1",["zap"]],["2744-FE0F",["snowflake"]],["2603-FE0F",["snowman"]],["26C4",["snowman_without_snow"]],["2604-FE0F",["comet"]],["1F525",["fire"]],["1F4A7",["droplet"]],["1F30A",["ocean"]]],["objects",["Objects"]],[["1F453",["eyeglasses"]],["1F576-FE0F",["dark_sunglasses"]],["1F97D",["goggles"]],["1F97C",["lab_coat"]],["1F9BA",["safety_vest"]],["1F454",["necktie"]],["1F455",["shirt","tshirt"]],["1F456",["jeans"]],["1F9E3",["scarf"]],["1F9E4",["gloves"]],["1F9E5",["coat"]],["1F9E6",["socks"]],["1F457",["dress"]],["1F458",["kimono"]],["1F97B",["sari"]],["1FA71",["one-piece_swimsuit"]],["1FA72",["briefs"]],["1FA73",["shorts"]],["1F459",["bikini"]],["1F45A",["womans_clothes"]],["1F45B",["purse"]],["1F45C",["handbag"]],["1F45D",["pouch"]],["1F6CD-FE0F",["shopping_bags"]],["1F392",["school_satchel"]],["1F45E",["mans_shoe","shoe"]],["1F45F",["athletic_shoe"]],["1F97E",["hiking_boot"]],["1F97F",["womans_flat_shoe"]],["1F460",["high_heel"]],["1F461",["sandal"]],["1FA70",["ballet_shoes"]],["1F462",["boot"]],["1F451",["crown"]],["1F452",["womans_hat"]],["1F3A9",["tophat"]],["1F393",["mortar_board"]],["1F9E2",["billed_cap"]],["26D1-FE0F",["helmet_with_white_cross"]],["1F4FF",["prayer_beads"]],["1F484",["lipstick"]],["1F48D",["ring"]],["1F48E",["gem"]],["1F507",["mute"]],["1F508",["speaker"]],["1F509",["sound"]],["1F50A",["loud_sound"]],["1F4E2",["loudspeaker"]],["1F4E3",["mega"]],["1F4EF",["postal_horn"]],["1F514",["bell"]],["1F515",["no_bell"]],["1F3BC",["musical_score"]],["1F3B5",["musical_note"]],["1F3B6",["notes"]],["1F399-FE0F",["studio_microphone"]],["1F39A-FE0F",["level_slider"]],["1F39B-FE0F",["control_knobs"]],["1F3A4",["microphone"]],["1F3A7",["headphones"]],["1F4FB",["radio"]],["1F3B7",["saxophone"]],["1F3B8",["guitar"]],["1F3B9",["musical_keyboard"]],["1F3BA",["trumpet"]],["1F3BB",["violin"]],["1FA95",["banjo"]],["1F941",["drum_with_drumsticks"]],["1F4F1",["iphone"]],["1F4F2",["calling"]],["260E-FE0F",["phone","telephone"]],["1F4DE",["telephone_receiver"]],["1F4DF",["pager"]],["1F4E0",["fax"]],["1F50B",["battery"]],["1F50C",["electric_plug"]],["1F4BB",["computer"]],["1F5A5-FE0F",["desktop_computer"]],["1F5A8-FE0F",["printer"]],["2328-FE0F",["keyboard"]],["1F5B1-FE0F",["three_button_mouse"]],["1F5B2-FE0F",["trackball"]],["1F4BD",["minidisc"]],["1F4BE",["floppy_disk"]],["1F4BF",["cd"]],["1F4C0",["dvd"]],["1F9EE",["abacus"]],["1F3A5",["movie_camera"]],["1F39E-FE0F",["film_frames"]],["1F4FD-FE0F",["film_projector"]],["1F3AC",["clapper"]],["1F4FA",["tv"]],["1F4F7",["camera"]],["1F4F8",["camera_with_flash"]],["1F4F9",["video_camera"]],["1F4FC",["vhs"]],["1F50D",["mag"]],["1F50E",["mag_right"]],["1F56F-FE0F",["candle"]],["1F4A1",["bulb"]],["1F526",["flashlight"]],["1F3EE",["izakaya_lantern","lantern"]],["1FA94",["diya_lamp"]],["1F4D4",["notebook_with_decorative_cover"]],["1F4D5",["closed_book"]],["1F4D6",["book","open_book"]],["1F4D7",["green_book"]],["1F4D8",["blue_book"]],["1F4D9",["orange_book"]],["1F4DA",["books"]],["1F4D3",["notebook"]],["1F4D2",["ledger"]],["1F4C3",["page_with_curl"]],["1F4DC",["scroll"]],["1F4C4",["page_facing_up"]],["1F4F0",["newspaper"]],["1F5DE-FE0F",["rolled_up_newspaper"]],["1F4D1",["bookmark_tabs"]],["1F516",["bookmark"]],["1F3F7-FE0F",["label"]],["1F4B0",["moneybag"]],["1F4B4",["yen"]],["1F4B5",["dollar"]],["1F4B6",["euro"]],["1F4B7",["pound"]],["1F4B8",["money_with_wings"]],["1F4B3",["credit_card"]],["1F9FE",["receipt"]],["1F4B9",["chart"]],["1F4B1",["currency_exchange"]],["1F4B2",["heavy_dollar_sign"]],["2709-FE0F",["email","envelope"]],["1F4E7",["e-mail"]],["1F4E8",["incoming_envelope"]],["1F4E9",["envelope_with_arrow"]],["1F4E4",["outbox_tray"]],["1F4E5",["inbox_tray"]],["1F4E6",["package"]],["1F4EB",["mailbox"]],["1F4EA",["mailbox_closed"]],["1F4EC",["mailbox_with_mail"]],["1F4ED",["mailbox_with_no_mail"]],["1F4EE",["postbox"]],["1F5F3-FE0F",["ballot_box_with_ballot"]],["270F-FE0F",["pencil2"]],["2712-FE0F",["black_nib"]],["1F58B-FE0F",["lower_left_fountain_pen"]],["1F58A-FE0F",["lower_left_ballpoint_pen"]],["1F58C-FE0F",["lower_left_paintbrush"]],["1F58D-FE0F",["lower_left_crayon"]],["1F4DD",["memo","pencil"]],["1F4BC",["briefcase"]],["1F4C1",["file_folder"]],["1F4C2",["open_file_folder"]],["1F5C2-FE0F",["card_index_dividers"]],["1F4C5",["date"]],["1F4C6",["calendar"]],["1F5D2-FE0F",["spiral_note_pad"]],["1F5D3-FE0F",["spiral_calendar_pad"]],["1F4C7",["card_index"]],["1F4C8",["chart_with_upwards_trend"]],["1F4C9",["chart_with_downwards_trend"]],["1F4CA",["bar_chart"]],["1F4CB",["clipboard"]],["1F4CC",["pushpin"]],["1F4CD",["round_pushpin"]],["1F4CE",["paperclip"]],["1F587-FE0F",["linked_paperclips"]],["1F4CF",["straight_ruler"]],["1F4D0",["triangular_ruler"]],["2702-FE0F",["scissors"]],["1F5C3-FE0F",["card_file_box"]],["1F5C4-FE0F",["file_cabinet"]],["1F5D1-FE0F",["wastebasket"]],["1F512",["lock"]],["1F513",["unlock"]],["1F50F",["lock_with_ink_pen"]],["1F510",["closed_lock_with_key"]],["1F511",["key"]],["1F5DD-FE0F",["old_key"]],["1F528",["hammer"]],["1FA93",["axe"]],["26CF-FE0F",["pick"]],["2692-FE0F",["hammer_and_pick"]],["1F6E0-FE0F",["hammer_and_wrench"]],["1F5E1-FE0F",["dagger_knife"]],["2694-FE0F",["crossed_swords"]],["1F52B",["gun"]],["1F3F9",["bow_and_arrow"]],["1F6E1-FE0F",["shield"]],["1F527",["wrench"]],["1F529",["nut_and_bolt"]],["2699-FE0F",["gear"]],["1F5DC-FE0F",["compression"]],["2696-FE0F",["scales"]],["1F9AF",["probing_cane"]],["1F517",["link"]],["26D3-FE0F",["chains"]],["1F9F0",["toolbox"]],["1F9F2",["magnet"]],["2697-FE0F",["alembic"]],["1F9EA",["test_tube"]],["1F9EB",["petri_dish"]],["1F9EC",["dna"]],["1F52C",["microscope"]],["1F52D",["telescope"]],["1F4E1",["satellite_antenna"]],["1F489",["syringe"]],["1FA78",["drop_of_blood"]],["1F48A",["pill"]],["1FA79",["adhesive_bandage"]],["1FA7A",["stethoscope"]],["1F6AA",["door"]],["1F6CF-FE0F",["bed"]],["1F6CB-FE0F",["couch_and_lamp"]],["1FA91",["chair"]],["1F6BD",["toilet"]],["1F6BF",["shower"]],["1F6C1",["bathtub"]],["1FA92",["razor"]],["1F9F4",["lotion_bottle"]],["1F9F7",["safety_pin"]],["1F9F9",["broom"]],["1F9FA",["basket"]],["1F9FB",["roll_of_paper"]],["1F9FC",["soap"]],["1F9FD",["sponge"]],["1F9EF",["fire_extinguisher"]],["1F6D2",["shopping_trolley"]],["1F6AC",["smoking"]],["26B0-FE0F",["coffin"]],["26B1-FE0F",["funeral_urn"]],["1F5FF",["moyai"]]],["symbols",["Symbols"]],[["1F3E7",["atm"]],["1F6AE",["put_litter_in_its_place"]],["1F6B0",["potable_water"]],["267F",["wheelchair"]],["1F6B9",["mens"]],["1F6BA",["womens"]],["1F6BB",["restroom"]],["1F6BC",["baby_symbol"]],["1F6BE",["wc"]],["1F6C2",["passport_control"]],["1F6C3",["customs"]],["1F6C4",["baggage_claim"]],["1F6C5",["left_luggage"]],["26A0-FE0F",["warning"]],["1F6B8",["children_crossing"]],["26D4",["no_entry"]],["1F6AB",["no_entry_sign"]],["1F6B3",["no_bicycles"]],["1F6AD",["no_smoking"]],["1F6AF",["do_not_litter"]],["1F6B1",["non-potable_water"]],["1F6B7",["no_pedestrians"]],["1F4F5",["no_mobile_phones"]],["1F51E",["underage"]],["2622-FE0F",["radioactive_sign"]],["2623-FE0F",["biohazard_sign"]],["2B06-FE0F",["arrow_up"]],["2197-FE0F",["arrow_upper_right"]],["27A1-FE0F",["arrow_right"]],["2198-FE0F",["arrow_lower_right"]],["2B07-FE0F",["arrow_down"]],["2199-FE0F",["arrow_lower_left"]],["2B05-FE0F",["arrow_left"]],["2196-FE0F",["arrow_upper_left"]],["2195-FE0F",["arrow_up_down"]],["2194-FE0F",["left_right_arrow"]],["21A9-FE0F",["leftwards_arrow_with_hook"]],["21AA-FE0F",["arrow_right_hook"]],["2934-FE0F",["arrow_heading_up"]],["2935-FE0F",["arrow_heading_down"]],["1F503",["arrows_clockwise"]],["1F504",["arrows_counterclockwise"]],["1F519",["back"]],["1F51A",["end"]],["1F51B",["on"]],["1F51C",["soon"]],["1F51D",["top"]],["1F6D0",["place_of_worship"]],["269B-FE0F",["atom_symbol"]],["1F549-FE0F",["om_symbol"]],["2721-FE0F",["star_of_david"]],["2638-FE0F",["wheel_of_dharma"]],["262F-FE0F",["yin_yang"]],["271D-FE0F",["latin_cross"]],["2626-FE0F",["orthodox_cross"]],["262A-FE0F",["star_and_crescent"]],["262E-FE0F",["peace_symbol"]],["1F54E",["menorah_with_nine_branches"]],["1F52F",["six_pointed_star"]],["2648",["aries"]],["2649",["taurus"]],["264A",["gemini"]],["264B",["cancer"]],["264C",["leo"]],["264D",["virgo"]],["264E",["libra"]],["264F",["scorpius"]],["2650",["sagittarius"]],["2651",["capricorn"]],["2652",["aquarius"]],["2653",["pisces"]],["26CE",["ophiuchus"]],["1F500",["twisted_rightwards_arrows"]],["1F501",["repeat"]],["1F502",["repeat_one"]],["25B6-FE0F",["arrow_forward"]],["23E9",["fast_forward"]],["23ED-FE0F",["black_right_pointing_double_triangle_with_vertical_bar"]],["23EF-FE0F",["black_right_pointing_triangle_with_double_vertical_bar"]],["25C0-FE0F",["arrow_backward"]],["23EA",["rewind"]],["23EE-FE0F",["black_left_pointing_double_triangle_with_vertical_bar"]],["1F53C",["arrow_up_small"]],["23EB",["arrow_double_up"]],["1F53D",["arrow_down_small"]],["23EC",["arrow_double_down"]],["23F8-FE0F",["double_vertical_bar"]],["23F9-FE0F",["black_square_for_stop"]],["23FA-FE0F",["black_circle_for_record"]],["23CF-FE0F",["eject"]],["1F3A6",["cinema"]],["1F505",["low_brightness"]],["1F506",["high_brightness"]],["1F4F6",["signal_strength"]],["1F4F3",["vibration_mode"]],["1F4F4",["mobile_phone_off"]],["2640-FE0F",["female_sign"]],["2642-FE0F",["male_sign"]],["2695-FE0F",["medical_symbol","staff_of_aesculapius"]],["267E-FE0F",["infinity"]],["267B-FE0F",["recycle"]],["269C-FE0F",["fleur_de_lis"]],["1F531",["trident"]],["1F4DB",["name_badge"]],["1F530",["beginner"]],["2B55",["o"]],["2705",["white_check_mark"]],["2611-FE0F",["ballot_box_with_check"]],["2714-FE0F",["heavy_check_mark"]],["2716-FE0F",["heavy_multiplication_x"]],["274C",["x"]],["274E",["negative_squared_cross_mark"]],["2795",["heavy_plus_sign"]],["2796",["heavy_minus_sign"]],["2797",["heavy_division_sign"]],["27B0",["curly_loop"]],["27BF",["loop"]],["303D-FE0F",["part_alternation_mark"]],["2733-FE0F",["eight_spoked_asterisk"]],["2734-FE0F",["eight_pointed_black_star"]],["2747-FE0F",["sparkle"]],["203C-FE0F",["bangbang"]],["2049-FE0F",["interrobang"]],["2753",["question"]],["2754",["grey_question"]],["2755",["grey_exclamation"]],["2757",["exclamation","heavy_exclamation_mark"]],["3030-FE0F",["wavy_dash"]],["00A9-FE0F",["copyright"]],["00AE-FE0F",["registered"]],["2122-FE0F",["tm"]],["0023-FE0F-20E3",["hash"]],["002A-FE0F-20E3",["keycap_star"]],["0030-FE0F-20E3",["zero"]],["0031-FE0F-20E3",["one"]],["0032-FE0F-20E3",["two"]],["0033-FE0F-20E3",["three"]],["0034-FE0F-20E3",["four"]],["0035-FE0F-20E3",["five"]],["0036-FE0F-20E3",["six"]],["0037-FE0F-20E3",["seven"]],["0038-FE0F-20E3",["eight"]],["0039-FE0F-20E3",["nine"]],["1F51F",["keycap_ten"]],["1F520",["capital_abcd"]],["1F521",["abcd"]],["1F522",["1234"]],["1F523",["symbols"]],["1F524",["abc"]],["1F170-FE0F",["a"]],["1F18E",["ab"]],["1F171-FE0F",["b"]],["1F191",["cl"]],["1F192",["cool"]],["1F193",["free"]],["2139-FE0F",["information_source"]],["1F194",["id"]],["24C2-FE0F",["m"]],["1F195",["new"]],["1F196",["ng"]],["1F17E-FE0F",["o2"]],["1F197",["ok"]],["1F17F-FE0F",["parking"]],["1F198",["sos"]],["1F199",["up"]],["1F19A",["vs"]],["1F201",["koko"]],["1F202-FE0F",["sa"]],["1F237-FE0F",["u6708"]],["1F236",["u6709"]],["1F22F",["u6307"]],["1F250",["ideograph_advantage"]],["1F239",["u5272"]],["1F21A",["u7121"]],["1F232",["u7981"]],["1F251",["accept"]],["1F238",["u7533"]],["1F234",["u5408"]],["1F233",["u7a7a"]],["3297-FE0F",["congratulations"]],["3299-FE0F",["secret"]],["1F23A",["u55b6"]],["1F235",["u6e80"]],["1F534",["red_circle"]],["1F7E0",["large_orange_circle"]],["1F7E1",["large_yellow_circle"]],["1F7E2",["large_green_circle"]],["1F535",["large_blue_circle"]],["1F7E3",["large_purple_circle"]],["1F7E4",["large_brown_circle"]],["26AB",["black_circle"]],["26AA",["white_circle"]],["1F7E5",["large_red_square"]],["1F7E7",["large_orange_square"]],["1F7E8",["large_yellow_square"]],["1F7E9",["large_green_square"]],["1F7E6",["large_blue_square"]],["1F7EA",["large_purple_square"]],["1F7EB",["large_brown_square"]],["2B1B",["black_large_square"]],["2B1C",["white_large_square"]],["25FC-FE0F",["black_medium_square"]],["25FB-FE0F",["white_medium_square"]],["25FE",["black_medium_small_square"]],["25FD",["white_medium_small_square"]],["25AA-FE0F",["black_small_square"]],["25AB-FE0F",["white_small_square"]],["1F536",["large_orange_diamond"]],["1F537",["large_blue_diamond"]],["1F538",["small_orange_diamond"]],["1F539",["small_blue_diamond"]],["1F53A",["small_red_triangle"]],["1F53B",["small_red_triangle_down"]],["1F4A0",["diamond_shape_with_a_dot_inside"]],["1F518",["radio_button"]],["1F533",["white_square_button"]],["1F532",["black_square_button"]]],["flags",["Flags"]],[["1F3C1",["checkered_flag"]],["1F6A9",["triangular_flag_on_post"]],["1F38C",["crossed_flags"]],["1F3F4",["waving_black_flag"]],["1F3F3-FE0F",["waving_white_flag"]],["1F3F3-FE0F-200D-1F308",["rainbow-flag"]],["1F3F4-200D-2620-FE0F",["pirate_flag"]],["1F1E6-1F1E8",["flag-ac"]],["1F1E6-1F1E9",["flag-ad"]],["1F1E6-1F1EA",["flag-ae"]],["1F1E6-1F1EB",["flag-af"]],["1F1E6-1F1EC",["flag-ag"]],["1F1E6-1F1EE",["flag-ai"]],["1F1E6-1F1F1",["flag-al"]],["1F1E6-1F1F2",["flag-am"]],["1F1E6-1F1F4",["flag-ao"]],["1F1E6-1F1F6",["flag-aq"]],["1F1E6-1F1F7",["flag-ar"]],["1F1E6-1F1F8",["flag-as"]],["1F1E6-1F1F9",["flag-at"]],["1F1E6-1F1FA",["flag-au"]],["1F1E6-1F1FC",["flag-aw"]],["1F1E6-1F1FD",["flag-ax"]],["1F1E6-1F1FF",["flag-az"]],["1F1E7-1F1E6",["flag-ba"]],["1F1E7-1F1E7",["flag-bb"]],["1F1E7-1F1E9",["flag-bd"]],["1F1E7-1F1EA",["flag-be"]],["1F1E7-1F1EB",["flag-bf"]],["1F1E7-1F1EC",["flag-bg"]],["1F1E7-1F1ED",["flag-bh"]],["1F1E7-1F1EE",["flag-bi"]],["1F1E7-1F1EF",["flag-bj"]],["1F1E7-1F1F1",["flag-bl"]],["1F1E7-1F1F2",["flag-bm"]],["1F1E7-1F1F3",["flag-bn"]],["1F1E7-1F1F4",["flag-bo"]],["1F1E7-1F1F6",["flag-bq"]],["1F1E7-1F1F7",["flag-br"]],["1F1E7-1F1F8",["flag-bs"]],["1F1E7-1F1F9",["flag-bt"]],["1F1E7-1F1FB",["flag-bv"]],["1F1E7-1F1FC",["flag-bw"]],["1F1E7-1F1FE",["flag-by"]],["1F1E7-1F1FF",["flag-bz"]],["1F1E8-1F1E6",["flag-ca"]],["1F1E8-1F1E8",["flag-cc"]],["1F1E8-1F1E9",["flag-cd"]],["1F1E8-1F1EB",["flag-cf"]],["1F1E8-1F1EC",["flag-cg"]],["1F1E8-1F1ED",["flag-ch"]],["1F1E8-1F1EE",["flag-ci"]],["1F1E8-1F1F0",["flag-ck"]],["1F1E8-1F1F1",["flag-cl"]],["1F1E8-1F1F2",["flag-cm"]],["1F1E8-1F1F3",["cn","flag-cn"]],["1F1E8-1F1F4",["flag-co"]],["1F1E8-1F1F5",["flag-cp"]],["1F1E8-1F1F7",["flag-cr"]],["1F1E8-1F1FA",["flag-cu"]],["1F1E8-1F1FB",["flag-cv"]],["1F1E8-1F1FC",["flag-cw"]],["1F1E8-1F1FD",["flag-cx"]],["1F1E8-1F1FE",["flag-cy"]],["1F1E8-1F1FF",["flag-cz"]],["1F1E9-1F1EA",["de","flag-de"]],["1F1E9-1F1EC",["flag-dg"]],["1F1E9-1F1EF",["flag-dj"]],["1F1E9-1F1F0",["flag-dk"]],["1F1E9-1F1F2",["flag-dm"]],["1F1E9-1F1F4",["flag-do"]],["1F1E9-1F1FF",["flag-dz"]],["1F1EA-1F1E6",["flag-ea"]],["1F1EA-1F1E8",["flag-ec"]],["1F1EA-1F1EA",["flag-ee"]],["1F1EA-1F1EC",["flag-eg"]],["1F1EA-1F1ED",["flag-eh"]],["1F1EA-1F1F7",["flag-er"]],["1F1EA-1F1F8",["es","flag-es"]],["1F1EA-1F1F9",["flag-et"]],["1F1EA-1F1FA",["flag-eu"]],["1F1EB-1F1EE",["flag-fi"]],["1F1EB-1F1EF",["flag-fj"]],["1F1EB-1F1F0",["flag-fk"]],["1F1EB-1F1F2",["flag-fm"]],["1F1EB-1F1F4",["flag-fo"]],["1F1EB-1F1F7",["fr","flag-fr"]],["1F1EC-1F1E6",["flag-ga"]],["1F1EC-1F1E7",["gb","uk","flag-gb"]],["1F1EC-1F1E9",["flag-gd"]],["1F1EC-1F1EA",["flag-ge"]],["1F1EC-1F1EB",["flag-gf"]],["1F1EC-1F1EC",["flag-gg"]],["1F1EC-1F1ED",["flag-gh"]],["1F1EC-1F1EE",["flag-gi"]],["1F1EC-1F1F1",["flag-gl"]],["1F1EC-1F1F2",["flag-gm"]],["1F1EC-1F1F3",["flag-gn"]],["1F1EC-1F1F5",["flag-gp"]],["1F1EC-1F1F6",["flag-gq"]],["1F1EC-1F1F7",["flag-gr"]],["1F1EC-1F1F8",["flag-gs"]],["1F1EC-1F1F9",["flag-gt"]],["1F1EC-1F1FA",["flag-gu"]],["1F1EC-1F1FC",["flag-gw"]],["1F1EC-1F1FE",["flag-gy"]],["1F1ED-1F1F0",["flag-hk"]],["1F1ED-1F1F2",["flag-hm"]],["1F1ED-1F1F3",["flag-hn"]],["1F1ED-1F1F7",["flag-hr"]],["1F1ED-1F1F9",["flag-ht"]],["1F1ED-1F1FA",["flag-hu"]],["1F1EE-1F1E8",["flag-ic"]],["1F1EE-1F1E9",["flag-id"]],["1F1EE-1F1EA",["flag-ie"]],["1F1EE-1F1F1",["flag-il"]],["1F1EE-1F1F2",["flag-im"]],["1F1EE-1F1F3",["flag-in"]],["1F1EE-1F1F4",["flag-io"]],["1F1EE-1F1F6",["flag-iq"]],["1F1EE-1F1F7",["flag-ir"]],["1F1EE-1F1F8",["flag-is"]],["1F1EE-1F1F9",["it","flag-it"]],["1F1EF-1F1EA",["flag-je"]],["1F1EF-1F1F2",["flag-jm"]],["1F1EF-1F1F4",["flag-jo"]],["1F1EF-1F1F5",["jp","flag-jp"]],["1F1F0-1F1EA",["flag-ke"]],["1F1F0-1F1EC",["flag-kg"]],["1F1F0-1F1ED",["flag-kh"]],["1F1F0-1F1EE",["flag-ki"]],["1F1F0-1F1F2",["flag-km"]],["1F1F0-1F1F3",["flag-kn"]],["1F1F0-1F1F5",["flag-kp"]],["1F1F0-1F1F7",["kr","flag-kr"]],["1F1F0-1F1FC",["flag-kw"]],["1F1F0-1F1FE",["flag-ky"]],["1F1F0-1F1FF",["flag-kz"]],["1F1F1-1F1E6",["flag-la"]],["1F1F1-1F1E7",["flag-lb"]],["1F1F1-1F1E8",["flag-lc"]],["1F1F1-1F1EE",["flag-li"]],["1F1F1-1F1F0",["flag-lk"]],["1F1F1-1F1F7",["flag-lr"]],["1F1F1-1F1F8",["flag-ls"]],["1F1F1-1F1F9",["flag-lt"]],["1F1F1-1F1FA",["flag-lu"]],["1F1F1-1F1FB",["flag-lv"]],["1F1F1-1F1FE",["flag-ly"]],["1F1F2-1F1E6",["flag-ma"]],["1F1F2-1F1E8",["flag-mc"]],["1F1F2-1F1E9",["flag-md"]],["1F1F2-1F1EA",["flag-me"]],["1F1F2-1F1EB",["flag-mf"]],["1F1F2-1F1EC",["flag-mg"]],["1F1F2-1F1ED",["flag-mh"]],["1F1F2-1F1F0",["flag-mk"]],["1F1F2-1F1F1",["flag-ml"]],["1F1F2-1F1F2",["flag-mm"]],["1F1F2-1F1F3",["flag-mn"]],["1F1F2-1F1F4",["flag-mo"]],["1F1F2-1F1F5",["flag-mp"]],["1F1F2-1F1F6",["flag-mq"]],["1F1F2-1F1F7",["flag-mr"]],["1F1F2-1F1F8",["flag-ms"]],["1F1F2-1F1F9",["flag-mt"]],["1F1F2-1F1FA",["flag-mu"]],["1F1F2-1F1FB",["flag-mv"]],["1F1F2-1F1FC",["flag-mw"]],["1F1F2-1F1FD",["flag-mx"]],["1F1F2-1F1FE",["flag-my"]],["1F1F2-1F1FF",["flag-mz"]],["1F1F3-1F1E6",["flag-na"]],["1F1F3-1F1E8",["flag-nc"]],["1F1F3-1F1EA",["flag-ne"]],["1F1F3-1F1EB",["flag-nf"]],["1F1F3-1F1EC",["flag-ng"]],["1F1F3-1F1EE",["flag-ni"]],["1F1F3-1F1F1",["flag-nl"]],["1F1F3-1F1F4",["flag-no"]],["1F1F3-1F1F5",["flag-np"]],["1F1F3-1F1F7",["flag-nr"]],["1F1F3-1F1FA",["flag-nu"]],["1F1F3-1F1FF",["flag-nz"]],["1F1F4-1F1F2",["flag-om"]],["1F1F5-1F1E6",["flag-pa"]],["1F1F5-1F1EA",["flag-pe"]],["1F1F5-1F1EB",["flag-pf"]],["1F1F5-1F1EC",["flag-pg"]],["1F1F5-1F1ED",["flag-ph"]],["1F1F5-1F1F0",["flag-pk"]],["1F1F5-1F1F1",["flag-pl"]],["1F1F5-1F1F2",["flag-pm"]],["1F1F5-1F1F3",["flag-pn"]],["1F1F5-1F1F7",["flag-pr"]],["1F1F5-1F1F8",["flag-ps"]],["1F1F5-1F1F9",["flag-pt"]],["1F1F5-1F1FC",["flag-pw"]],["1F1F5-1F1FE",["flag-py"]],["1F1F6-1F1E6",["flag-qa"]],["1F1F7-1F1EA",["flag-re"]],["1F1F7-1F1F4",["flag-ro"]],["1F1F7-1F1F8",["flag-rs"]],["1F1F7-1F1FA",["ru","flag-ru"]],["1F1F7-1F1FC",["flag-rw"]],["1F1F8-1F1E6",["flag-sa"]],["1F1F8-1F1E7",["flag-sb"]],["1F1F8-1F1E8",["flag-sc"]],["1F1F8-1F1E9",["flag-sd"]],["1F1F8-1F1EA",["flag-se"]],["1F1F8-1F1EC",["flag-sg"]],["1F1F8-1F1ED",["flag-sh"]],["1F1F8-1F1EE",["flag-si"]],["1F1F8-1F1EF",["flag-sj"]],["1F1F8-1F1F0",["flag-sk"]],["1F1F8-1F1F1",["flag-sl"]],["1F1F8-1F1F2",["flag-sm"]],["1F1F8-1F1F3",["flag-sn"]],["1F1F8-1F1F4",["flag-so"]],["1F1F8-1F1F7",["flag-sr"]],["1F1F8-1F1F8",["flag-ss"]],["1F1F8-1F1F9",["flag-st"]],["1F1F8-1F1FB",["flag-sv"]],["1F1F8-1F1FD",["flag-sx"]],["1F1F8-1F1FE",["flag-sy"]],["1F1F8-1F1FF",["flag-sz"]],["1F1F9-1F1E6",["flag-ta"]],["1F1F9-1F1E8",["flag-tc"]],["1F1F9-1F1E9",["flag-td"]],["1F1F9-1F1EB",["flag-tf"]],["1F1F9-1F1EC",["flag-tg"]],["1F1F9-1F1ED",["flag-th"]],["1F1F9-1F1EF",["flag-tj"]],["1F1F9-1F1F0",["flag-tk"]],["1F1F9-1F1F1",["flag-tl"]],["1F1F9-1F1F2",["flag-tm"]],["1F1F9-1F1F3",["flag-tn"]],["1F1F9-1F1F4",["flag-to"]],["1F1F9-1F1F7",["flag-tr"]],["1F1F9-1F1F9",["flag-tt"]],["1F1F9-1F1FB",["flag-tv"]],["1F1F9-1F1FC",["flag-tw"]],["1F1F9-1F1FF",["flag-tz"]],["1F1FA-1F1E6",["flag-ua"]],["1F1FA-1F1EC",["flag-ug"]],["1F1FA-1F1F2",["flag-um"]],["1F1FA-1F1F3",["flag-un"]],["1F1FA-1F1F8",["us","flag-us"]],["1F1FA-1F1FE",["flag-uy"]],["1F1FA-1F1FF",["flag-uz"]],["1F1FB-1F1E6",["flag-va"]],["1F1FB-1F1E8",["flag-vc"]],["1F1FB-1F1EA",["flag-ve"]],["1F1FB-1F1EC",["flag-vg"]],["1F1FB-1F1EE",["flag-vi"]],["1F1FB-1F1F3",["flag-vn"]],["1F1FB-1F1FA",["flag-vu"]],["1F1FC-1F1EB",["flag-wf"]],["1F1FC-1F1F8",["flag-ws"]],["1F1FD-1F1F0",["flag-xk"]],["1F1FE-1F1EA",["flag-ye"]],["1F1FE-1F1F9",["flag-yt"]],["1F1FF-1F1E6",["flag-za"]],["1F1FF-1F1F2",["flag-zm"]],["1F1FF-1F1FC",["flag-zw"]],["1F3F4-E0067-E0062-E0065-E006E-E0067-E007F",["flag-england"]],["1F3F4-E0067-E0062-E0073-E0063-E0074-E007F",["flag-scotland"]],["1F3F4-E0067-E0062-E0077-E006C-E0073-E007F",["flag-wales"]]]]')}}]); -//# sourceMappingURL=1.db575d71a0009d78423e.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{331:function(F){F.exports=JSON.parse('[["people",["Smileys & People"]],[["1F600",["grinning"]],["1F603",["smiley"]],["1F604",["smile"]],["1F601",["grin"]],["1F606",["laughing","satisfied"]],["1F605",["sweat_smile"]],["1F923",["rolling_on_the_floor_laughing"]],["1F602",["joy"]],["1F642",["slightly_smiling_face"]],["1F643",["upside_down_face"]],["1F609",["wink"]],["1F60A",["blush"]],["1F607",["innocent"]],["1F970",["smiling_face_with_3_hearts"]],["1F60D",["heart_eyes"]],["1F929",["star-struck","grinning_face_with_star_eyes"]],["1F618",["kissing_heart"]],["1F617",["kissing"]],["263A-FE0F",["relaxed"]],["1F61A",["kissing_closed_eyes"]],["1F619",["kissing_smiling_eyes"]],["1F60B",["yum"]],["1F61B",["stuck_out_tongue"]],["1F61C",["stuck_out_tongue_winking_eye"]],["1F92A",["zany_face","grinning_face_with_one_large_and_one_small_eye"]],["1F61D",["stuck_out_tongue_closed_eyes"]],["1F911",["money_mouth_face"]],["1F917",["hugging_face"]],["1F92D",["face_with_hand_over_mouth","smiling_face_with_smiling_eyes_and_hand_covering_mouth"]],["1F92B",["shushing_face","face_with_finger_covering_closed_lips"]],["1F914",["thinking_face"]],["1F910",["zipper_mouth_face"]],["1F928",["face_with_raised_eyebrow","face_with_one_eyebrow_raised"]],["1F610",["neutral_face"]],["1F611",["expressionless"]],["1F636",["no_mouth"]],["1F60F",["smirk"]],["1F612",["unamused"]],["1F644",["face_with_rolling_eyes"]],["1F62C",["grimacing"]],["1F925",["lying_face"]],["1F60C",["relieved"]],["1F614",["pensive"]],["1F62A",["sleepy"]],["1F924",["drooling_face"]],["1F634",["sleeping"]],["1F637",["mask"]],["1F912",["face_with_thermometer"]],["1F915",["face_with_head_bandage"]],["1F922",["nauseated_face"]],["1F92E",["face_vomiting","face_with_open_mouth_vomiting"]],["1F927",["sneezing_face"]],["1F975",["hot_face"]],["1F976",["cold_face"]],["1F974",["woozy_face"]],["1F635",["dizzy_face"]],["1F92F",["exploding_head","shocked_face_with_exploding_head"]],["1F920",["face_with_cowboy_hat"]],["1F973",["partying_face"]],["1F60E",["sunglasses"]],["1F913",["nerd_face"]],["1F9D0",["face_with_monocle"]],["1F615",["confused"]],["1F61F",["worried"]],["1F641",["slightly_frowning_face"]],["2639-FE0F",["white_frowning_face"]],["1F62E",["open_mouth"]],["1F62F",["hushed"]],["1F632",["astonished"]],["1F633",["flushed"]],["1F97A",["pleading_face"]],["1F626",["frowning"]],["1F627",["anguished"]],["1F628",["fearful"]],["1F630",["cold_sweat"]],["1F625",["disappointed_relieved"]],["1F622",["cry"]],["1F62D",["sob"]],["1F631",["scream"]],["1F616",["confounded"]],["1F623",["persevere"]],["1F61E",["disappointed"]],["1F613",["sweat"]],["1F629",["weary"]],["1F62B",["tired_face"]],["1F971",["yawning_face"]],["1F624",["triumph"]],["1F621",["rage"]],["1F620",["angry"]],["1F92C",["face_with_symbols_on_mouth","serious_face_with_symbols_covering_mouth"]],["1F608",["smiling_imp"]],["1F47F",["imp"]],["1F480",["skull"]],["2620-FE0F",["skull_and_crossbones"]],["1F4A9",["hankey","poop","shit"]],["1F921",["clown_face"]],["1F479",["japanese_ogre"]],["1F47A",["japanese_goblin"]],["1F47B",["ghost"]],["1F47D",["alien"]],["1F47E",["space_invader"]],["1F916",["robot_face"]],["1F63A",["smiley_cat"]],["1F638",["smile_cat"]],["1F639",["joy_cat"]],["1F63B",["heart_eyes_cat"]],["1F63C",["smirk_cat"]],["1F63D",["kissing_cat"]],["1F640",["scream_cat"]],["1F63F",["crying_cat_face"]],["1F63E",["pouting_cat"]],["1F648",["see_no_evil"]],["1F649",["hear_no_evil"]],["1F64A",["speak_no_evil"]],["1F48B",["kiss"]],["1F48C",["love_letter"]],["1F498",["cupid"]],["1F49D",["gift_heart"]],["1F496",["sparkling_heart"]],["1F497",["heartpulse"]],["1F493",["heartbeat"]],["1F49E",["revolving_hearts"]],["1F495",["two_hearts"]],["1F49F",["heart_decoration"]],["2763-FE0F",["heavy_heart_exclamation_mark_ornament"]],["1F494",["broken_heart"]],["2764-FE0F",["heart"]],["1F9E1",["orange_heart"]],["1F49B",["yellow_heart"]],["1F49A",["green_heart"]],["1F499",["blue_heart"]],["1F49C",["purple_heart"]],["1F90E",["brown_heart"]],["1F5A4",["black_heart"]],["1F90D",["white_heart"]],["1F4AF",["100"]],["1F4A2",["anger"]],["1F4A5",["boom","collision"]],["1F4AB",["dizzy"]],["1F4A6",["sweat_drops"]],["1F4A8",["dash"]],["1F573-FE0F",["hole"]],["1F4A3",["bomb"]],["1F4AC",["speech_balloon"]],["1F441-FE0F-200D-1F5E8-FE0F",["eye-in-speech-bubble"]],["1F5E8-FE0F",["left_speech_bubble"]],["1F5EF-FE0F",["right_anger_bubble"]],["1F4AD",["thought_balloon"]],["1F4A4",["zzz"]],["1F44B",["wave"]],["1F91A",["raised_back_of_hand"]],["1F590-FE0F",["raised_hand_with_fingers_splayed"]],["270B",["hand","raised_hand"]],["1F596",["spock-hand"]],["1F44C",["ok_hand"]],["1F90F",["pinching_hand"]],["270C-FE0F",["v"]],["1F91E",["crossed_fingers","hand_with_index_and_middle_fingers_crossed"]],["1F91F",["i_love_you_hand_sign"]],["1F918",["the_horns","sign_of_the_horns"]],["1F919",["call_me_hand"]],["1F448",["point_left"]],["1F449",["point_right"]],["1F446",["point_up_2"]],["1F595",["middle_finger","reversed_hand_with_middle_finger_extended"]],["1F447",["point_down"]],["261D-FE0F",["point_up"]],["1F44D",["+1","thumbsup"]],["1F44E",["-1","thumbsdown"]],["270A",["fist"]],["1F44A",["facepunch","punch"]],["1F91B",["left-facing_fist"]],["1F91C",["right-facing_fist"]],["1F44F",["clap"]],["1F64C",["raised_hands"]],["1F450",["open_hands"]],["1F932",["palms_up_together"]],["1F91D",["handshake"]],["1F64F",["pray"]],["270D-FE0F",["writing_hand"]],["1F485",["nail_care"]],["1F933",["selfie"]],["1F4AA",["muscle"]],["1F9BE",["mechanical_arm"]],["1F9BF",["mechanical_leg"]],["1F9B5",["leg"]],["1F9B6",["foot"]],["1F442",["ear"]],["1F9BB",["ear_with_hearing_aid"]],["1F443",["nose"]],["1F9E0",["brain"]],["1F9B7",["tooth"]],["1F9B4",["bone"]],["1F440",["eyes"]],["1F441-FE0F",["eye"]],["1F445",["tongue"]],["1F444",["lips"]],["1F476",["baby"]],["1F9D2",["child"]],["1F466",["boy"]],["1F467",["girl"]],["1F9D1",["adult"]],["1F471",["person_with_blond_hair"]],["1F468",["man"]],["1F9D4",["bearded_person"]],["1F468-200D-1F9B0",["red_haired_man"]],["1F468-200D-1F9B1",["curly_haired_man"]],["1F468-200D-1F9B3",["white_haired_man"]],["1F468-200D-1F9B2",["bald_man"]],["1F469",["woman"]],["1F469-200D-1F9B0",["red_haired_woman"]],["1F9D1-200D-1F9B0",["red_haired_person"]],["1F469-200D-1F9B1",["curly_haired_woman"]],["1F9D1-200D-1F9B1",["curly_haired_person"]],["1F469-200D-1F9B3",["white_haired_woman"]],["1F9D1-200D-1F9B3",["white_haired_person"]],["1F469-200D-1F9B2",["bald_woman"]],["1F9D1-200D-1F9B2",["bald_person"]],["1F471-200D-2640-FE0F",["blond-haired-woman"]],["1F471-200D-2642-FE0F",["blond-haired-man"]],["1F9D3",["older_adult"]],["1F474",["older_man"]],["1F475",["older_woman"]],["1F64D",["person_frowning"]],["1F64D-200D-2642-FE0F",["man-frowning"]],["1F64D-200D-2640-FE0F",["woman-frowning"]],["1F64E",["person_with_pouting_face"]],["1F64E-200D-2642-FE0F",["man-pouting"]],["1F64E-200D-2640-FE0F",["woman-pouting"]],["1F645",["no_good"]],["1F645-200D-2642-FE0F",["man-gesturing-no"]],["1F645-200D-2640-FE0F",["woman-gesturing-no"]],["1F646",["ok_woman"]],["1F646-200D-2642-FE0F",["man-gesturing-ok"]],["1F646-200D-2640-FE0F",["woman-gesturing-ok"]],["1F481",["information_desk_person"]],["1F481-200D-2642-FE0F",["man-tipping-hand"]],["1F481-200D-2640-FE0F",["woman-tipping-hand"]],["1F64B",["raising_hand"]],["1F64B-200D-2642-FE0F",["man-raising-hand"]],["1F64B-200D-2640-FE0F",["woman-raising-hand"]],["1F9CF",["deaf_person"]],["1F9CF-200D-2642-FE0F",["deaf_man"]],["1F9CF-200D-2640-FE0F",["deaf_woman"]],["1F647",["bow"]],["1F647-200D-2642-FE0F",["man-bowing"]],["1F647-200D-2640-FE0F",["woman-bowing"]],["1F926",["face_palm"]],["1F926-200D-2642-FE0F",["man-facepalming"]],["1F926-200D-2640-FE0F",["woman-facepalming"]],["1F937",["shrug"]],["1F937-200D-2642-FE0F",["man-shrugging"]],["1F937-200D-2640-FE0F",["woman-shrugging"]],["1F9D1-200D-2695-FE0F",["health_worker"]],["1F468-200D-2695-FE0F",["male-doctor"]],["1F469-200D-2695-FE0F",["female-doctor"]],["1F9D1-200D-1F393",["student"]],["1F468-200D-1F393",["male-student"]],["1F469-200D-1F393",["female-student"]],["1F9D1-200D-1F3EB",["teacher"]],["1F468-200D-1F3EB",["male-teacher"]],["1F469-200D-1F3EB",["female-teacher"]],["1F9D1-200D-2696-FE0F",["judge"]],["1F468-200D-2696-FE0F",["male-judge"]],["1F469-200D-2696-FE0F",["female-judge"]],["1F9D1-200D-1F33E",["farmer"]],["1F468-200D-1F33E",["male-farmer"]],["1F469-200D-1F33E",["female-farmer"]],["1F9D1-200D-1F373",["cook"]],["1F468-200D-1F373",["male-cook"]],["1F469-200D-1F373",["female-cook"]],["1F9D1-200D-1F527",["mechanic"]],["1F468-200D-1F527",["male-mechanic"]],["1F469-200D-1F527",["female-mechanic"]],["1F9D1-200D-1F3ED",["factory_worker"]],["1F468-200D-1F3ED",["male-factory-worker"]],["1F469-200D-1F3ED",["female-factory-worker"]],["1F9D1-200D-1F4BC",["office_worker"]],["1F468-200D-1F4BC",["male-office-worker"]],["1F469-200D-1F4BC",["female-office-worker"]],["1F9D1-200D-1F52C",["scientist"]],["1F468-200D-1F52C",["male-scientist"]],["1F469-200D-1F52C",["female-scientist"]],["1F9D1-200D-1F4BB",["technologist"]],["1F468-200D-1F4BB",["male-technologist"]],["1F469-200D-1F4BB",["female-technologist"]],["1F9D1-200D-1F3A4",["singer"]],["1F468-200D-1F3A4",["male-singer"]],["1F469-200D-1F3A4",["female-singer"]],["1F9D1-200D-1F3A8",["artist"]],["1F468-200D-1F3A8",["male-artist"]],["1F469-200D-1F3A8",["female-artist"]],["1F9D1-200D-2708-FE0F",["pilot"]],["1F468-200D-2708-FE0F",["male-pilot"]],["1F469-200D-2708-FE0F",["female-pilot"]],["1F9D1-200D-1F680",["astronaut"]],["1F468-200D-1F680",["male-astronaut"]],["1F469-200D-1F680",["female-astronaut"]],["1F9D1-200D-1F692",["firefighter"]],["1F468-200D-1F692",["male-firefighter"]],["1F469-200D-1F692",["female-firefighter"]],["1F46E",["cop"]],["1F46E-200D-2642-FE0F",["male-police-officer"]],["1F46E-200D-2640-FE0F",["female-police-officer"]],["1F575-FE0F",["sleuth_or_spy"]],["1F575-FE0F-200D-2642-FE0F",["male-detective"]],["1F575-FE0F-200D-2640-FE0F",["female-detective"]],["1F482",["guardsman"]],["1F482-200D-2642-FE0F",["male-guard"]],["1F482-200D-2640-FE0F",["female-guard"]],["1F477",["construction_worker"]],["1F477-200D-2642-FE0F",["male-construction-worker"]],["1F477-200D-2640-FE0F",["female-construction-worker"]],["1F934",["prince"]],["1F478",["princess"]],["1F473",["man_with_turban"]],["1F473-200D-2642-FE0F",["man-wearing-turban"]],["1F473-200D-2640-FE0F",["woman-wearing-turban"]],["1F472",["man_with_gua_pi_mao"]],["1F9D5",["person_with_headscarf"]],["1F935",["man_in_tuxedo"]],["1F470",["bride_with_veil"]],["1F930",["pregnant_woman"]],["1F931",["breast-feeding"]],["1F47C",["angel"]],["1F385",["santa"]],["1F936",["mrs_claus","mother_christmas"]],["1F9B8",["superhero"]],["1F9B8-200D-2642-FE0F",["male_superhero"]],["1F9B8-200D-2640-FE0F",["female_superhero"]],["1F9B9",["supervillain"]],["1F9B9-200D-2642-FE0F",["male_supervillain"]],["1F9B9-200D-2640-FE0F",["female_supervillain"]],["1F9D9",["mage"]],["1F9D9-200D-2642-FE0F",["male_mage"]],["1F9D9-200D-2640-FE0F",["female_mage"]],["1F9DA",["fairy"]],["1F9DA-200D-2642-FE0F",["male_fairy"]],["1F9DA-200D-2640-FE0F",["female_fairy"]],["1F9DB",["vampire"]],["1F9DB-200D-2642-FE0F",["male_vampire"]],["1F9DB-200D-2640-FE0F",["female_vampire"]],["1F9DC",["merperson"]],["1F9DC-200D-2642-FE0F",["merman"]],["1F9DC-200D-2640-FE0F",["mermaid"]],["1F9DD",["elf"]],["1F9DD-200D-2642-FE0F",["male_elf"]],["1F9DD-200D-2640-FE0F",["female_elf"]],["1F9DE",["genie"]],["1F9DE-200D-2642-FE0F",["male_genie"]],["1F9DE-200D-2640-FE0F",["female_genie"]],["1F9DF",["zombie"]],["1F9DF-200D-2642-FE0F",["male_zombie"]],["1F9DF-200D-2640-FE0F",["female_zombie"]],["1F486",["massage"]],["1F486-200D-2642-FE0F",["man-getting-massage"]],["1F486-200D-2640-FE0F",["woman-getting-massage"]],["1F487",["haircut"]],["1F487-200D-2642-FE0F",["man-getting-haircut"]],["1F487-200D-2640-FE0F",["woman-getting-haircut"]],["1F6B6",["walking"]],["1F6B6-200D-2642-FE0F",["man-walking"]],["1F6B6-200D-2640-FE0F",["woman-walking"]],["1F9CD",["standing_person"]],["1F9CD-200D-2642-FE0F",["man_standing"]],["1F9CD-200D-2640-FE0F",["woman_standing"]],["1F9CE",["kneeling_person"]],["1F9CE-200D-2642-FE0F",["man_kneeling"]],["1F9CE-200D-2640-FE0F",["woman_kneeling"]],["1F9D1-200D-1F9AF",["person_with_probing_cane"]],["1F468-200D-1F9AF",["man_with_probing_cane"]],["1F469-200D-1F9AF",["woman_with_probing_cane"]],["1F9D1-200D-1F9BC",["person_in_motorized_wheelchair"]],["1F468-200D-1F9BC",["man_in_motorized_wheelchair"]],["1F469-200D-1F9BC",["woman_in_motorized_wheelchair"]],["1F9D1-200D-1F9BD",["person_in_manual_wheelchair"]],["1F468-200D-1F9BD",["man_in_manual_wheelchair"]],["1F469-200D-1F9BD",["woman_in_manual_wheelchair"]],["1F3C3",["runner","running"]],["1F3C3-200D-2642-FE0F",["man-running"]],["1F3C3-200D-2640-FE0F",["woman-running"]],["1F483",["dancer"]],["1F57A",["man_dancing"]],["1F574-FE0F",["man_in_business_suit_levitating"]],["1F46F",["dancers"]],["1F46F-200D-2642-FE0F",["man-with-bunny-ears-partying"]],["1F46F-200D-2640-FE0F",["woman-with-bunny-ears-partying"]],["1F9D6",["person_in_steamy_room"]],["1F9D6-200D-2642-FE0F",["man_in_steamy_room"]],["1F9D6-200D-2640-FE0F",["woman_in_steamy_room"]],["1F9D7",["person_climbing"]],["1F9D7-200D-2642-FE0F",["man_climbing"]],["1F9D7-200D-2640-FE0F",["woman_climbing"]],["1F93A",["fencer"]],["1F3C7",["horse_racing"]],["26F7-FE0F",["skier"]],["1F3C2",["snowboarder"]],["1F3CC-FE0F",["golfer"]],["1F3CC-FE0F-200D-2642-FE0F",["man-golfing"]],["1F3CC-FE0F-200D-2640-FE0F",["woman-golfing"]],["1F3C4",["surfer"]],["1F3C4-200D-2642-FE0F",["man-surfing"]],["1F3C4-200D-2640-FE0F",["woman-surfing"]],["1F6A3",["rowboat"]],["1F6A3-200D-2642-FE0F",["man-rowing-boat"]],["1F6A3-200D-2640-FE0F",["woman-rowing-boat"]],["1F3CA",["swimmer"]],["1F3CA-200D-2642-FE0F",["man-swimming"]],["1F3CA-200D-2640-FE0F",["woman-swimming"]],["26F9-FE0F",["person_with_ball"]],["26F9-FE0F-200D-2642-FE0F",["man-bouncing-ball"]],["26F9-FE0F-200D-2640-FE0F",["woman-bouncing-ball"]],["1F3CB-FE0F",["weight_lifter"]],["1F3CB-FE0F-200D-2642-FE0F",["man-lifting-weights"]],["1F3CB-FE0F-200D-2640-FE0F",["woman-lifting-weights"]],["1F6B4",["bicyclist"]],["1F6B4-200D-2642-FE0F",["man-biking"]],["1F6B4-200D-2640-FE0F",["woman-biking"]],["1F6B5",["mountain_bicyclist"]],["1F6B5-200D-2642-FE0F",["man-mountain-biking"]],["1F6B5-200D-2640-FE0F",["woman-mountain-biking"]],["1F938",["person_doing_cartwheel"]],["1F938-200D-2642-FE0F",["man-cartwheeling"]],["1F938-200D-2640-FE0F",["woman-cartwheeling"]],["1F93C",["wrestlers"]],["1F93C-200D-2642-FE0F",["man-wrestling"]],["1F93C-200D-2640-FE0F",["woman-wrestling"]],["1F93D",["water_polo"]],["1F93D-200D-2642-FE0F",["man-playing-water-polo"]],["1F93D-200D-2640-FE0F",["woman-playing-water-polo"]],["1F93E",["handball"]],["1F93E-200D-2642-FE0F",["man-playing-handball"]],["1F93E-200D-2640-FE0F",["woman-playing-handball"]],["1F939",["juggling"]],["1F939-200D-2642-FE0F",["man-juggling"]],["1F939-200D-2640-FE0F",["woman-juggling"]],["1F9D8",["person_in_lotus_position"]],["1F9D8-200D-2642-FE0F",["man_in_lotus_position"]],["1F9D8-200D-2640-FE0F",["woman_in_lotus_position"]],["1F6C0",["bath"]],["1F6CC",["sleeping_accommodation"]],["1F9D1-200D-1F91D-200D-1F9D1",["people_holding_hands"]],["1F46D",["two_women_holding_hands","women_holding_hands"]],["1F46B",["couple","man_and_woman_holding_hands","woman_and_man_holding_hands"]],["1F46C",["two_men_holding_hands","men_holding_hands"]],["1F48F",["couplekiss"]],["1F469-200D-2764-FE0F-200D-1F48B-200D-1F468",["woman-kiss-man"]],["1F468-200D-2764-FE0F-200D-1F48B-200D-1F468",["man-kiss-man"]],["1F469-200D-2764-FE0F-200D-1F48B-200D-1F469",["woman-kiss-woman"]],["1F491",["couple_with_heart"]],["1F469-200D-2764-FE0F-200D-1F468",["woman-heart-man"]],["1F468-200D-2764-FE0F-200D-1F468",["man-heart-man"]],["1F469-200D-2764-FE0F-200D-1F469",["woman-heart-woman"]],["1F46A",["family","man-woman-boy"]],["1F468-200D-1F469-200D-1F466",["man-woman-boy","family"]],["1F468-200D-1F469-200D-1F467",["man-woman-girl"]],["1F468-200D-1F469-200D-1F467-200D-1F466",["man-woman-girl-boy"]],["1F468-200D-1F469-200D-1F466-200D-1F466",["man-woman-boy-boy"]],["1F468-200D-1F469-200D-1F467-200D-1F467",["man-woman-girl-girl"]],["1F468-200D-1F468-200D-1F466",["man-man-boy"]],["1F468-200D-1F468-200D-1F467",["man-man-girl"]],["1F468-200D-1F468-200D-1F467-200D-1F466",["man-man-girl-boy"]],["1F468-200D-1F468-200D-1F466-200D-1F466",["man-man-boy-boy"]],["1F468-200D-1F468-200D-1F467-200D-1F467",["man-man-girl-girl"]],["1F469-200D-1F469-200D-1F466",["woman-woman-boy"]],["1F469-200D-1F469-200D-1F467",["woman-woman-girl"]],["1F469-200D-1F469-200D-1F467-200D-1F466",["woman-woman-girl-boy"]],["1F469-200D-1F469-200D-1F466-200D-1F466",["woman-woman-boy-boy"]],["1F469-200D-1F469-200D-1F467-200D-1F467",["woman-woman-girl-girl"]],["1F468-200D-1F466",["man-boy"]],["1F468-200D-1F466-200D-1F466",["man-boy-boy"]],["1F468-200D-1F467",["man-girl"]],["1F468-200D-1F467-200D-1F466",["man-girl-boy"]],["1F468-200D-1F467-200D-1F467",["man-girl-girl"]],["1F469-200D-1F466",["woman-boy"]],["1F469-200D-1F466-200D-1F466",["woman-boy-boy"]],["1F469-200D-1F467",["woman-girl"]],["1F469-200D-1F467-200D-1F466",["woman-girl-boy"]],["1F469-200D-1F467-200D-1F467",["woman-girl-girl"]],["1F5E3-FE0F",["speaking_head_in_silhouette"]],["1F464",["bust_in_silhouette"]],["1F465",["busts_in_silhouette"]],["1F463",["footprints"]]],["nature",["Animals & Nature"]],[["1F435",["monkey_face"]],["1F412",["monkey"]],["1F98D",["gorilla"]],["1F9A7",["orangutan"]],["1F436",["dog"]],["1F415",["dog2"]],["1F9AE",["guide_dog"]],["1F415-200D-1F9BA",["service_dog"]],["1F429",["poodle"]],["1F43A",["wolf"]],["1F98A",["fox_face"]],["1F99D",["raccoon"]],["1F431",["cat"]],["1F408",["cat2"]],["1F981",["lion_face"]],["1F42F",["tiger"]],["1F405",["tiger2"]],["1F406",["leopard"]],["1F434",["horse"]],["1F40E",["racehorse"]],["1F984",["unicorn_face"]],["1F993",["zebra_face"]],["1F98C",["deer"]],["1F42E",["cow"]],["1F402",["ox"]],["1F403",["water_buffalo"]],["1F404",["cow2"]],["1F437",["pig"]],["1F416",["pig2"]],["1F417",["boar"]],["1F43D",["pig_nose"]],["1F40F",["ram"]],["1F411",["sheep"]],["1F410",["goat"]],["1F42A",["dromedary_camel"]],["1F42B",["camel"]],["1F999",["llama"]],["1F992",["giraffe_face"]],["1F418",["elephant"]],["1F98F",["rhinoceros"]],["1F99B",["hippopotamus"]],["1F42D",["mouse"]],["1F401",["mouse2"]],["1F400",["rat"]],["1F439",["hamster"]],["1F430",["rabbit"]],["1F407",["rabbit2"]],["1F43F-FE0F",["chipmunk"]],["1F994",["hedgehog"]],["1F987",["bat"]],["1F43B",["bear"]],["1F428",["koala"]],["1F43C",["panda_face"]],["1F9A5",["sloth"]],["1F9A6",["otter"]],["1F9A8",["skunk"]],["1F998",["kangaroo"]],["1F9A1",["badger"]],["1F43E",["feet","paw_prints"]],["1F983",["turkey"]],["1F414",["chicken"]],["1F413",["rooster"]],["1F423",["hatching_chick"]],["1F424",["baby_chick"]],["1F425",["hatched_chick"]],["1F426",["bird"]],["1F427",["penguin"]],["1F54A-FE0F",["dove_of_peace"]],["1F985",["eagle"]],["1F986",["duck"]],["1F9A2",["swan"]],["1F989",["owl"]],["1F9A9",["flamingo"]],["1F99A",["peacock"]],["1F99C",["parrot"]],["1F438",["frog"]],["1F40A",["crocodile"]],["1F422",["turtle"]],["1F98E",["lizard"]],["1F40D",["snake"]],["1F432",["dragon_face"]],["1F409",["dragon"]],["1F995",["sauropod"]],["1F996",["t-rex"]],["1F433",["whale"]],["1F40B",["whale2"]],["1F42C",["dolphin","flipper"]],["1F41F",["fish"]],["1F420",["tropical_fish"]],["1F421",["blowfish"]],["1F988",["shark"]],["1F419",["octopus"]],["1F41A",["shell"]],["1F40C",["snail"]],["1F98B",["butterfly"]],["1F41B",["bug"]],["1F41C",["ant"]],["1F41D",["bee","honeybee"]],["1F41E",["beetle"]],["1F997",["cricket"]],["1F577-FE0F",["spider"]],["1F578-FE0F",["spider_web"]],["1F982",["scorpion"]],["1F99F",["mosquito"]],["1F9A0",["microbe"]],["1F490",["bouquet"]],["1F338",["cherry_blossom"]],["1F4AE",["white_flower"]],["1F3F5-FE0F",["rosette"]],["1F339",["rose"]],["1F940",["wilted_flower"]],["1F33A",["hibiscus"]],["1F33B",["sunflower"]],["1F33C",["blossom"]],["1F337",["tulip"]],["1F331",["seedling"]],["1F332",["evergreen_tree"]],["1F333",["deciduous_tree"]],["1F334",["palm_tree"]],["1F335",["cactus"]],["1F33E",["ear_of_rice"]],["1F33F",["herb"]],["2618-FE0F",["shamrock"]],["1F340",["four_leaf_clover"]],["1F341",["maple_leaf"]],["1F342",["fallen_leaf"]],["1F343",["leaves"]]],["foods",["Food & Drink"]],[["1F347",["grapes"]],["1F348",["melon"]],["1F349",["watermelon"]],["1F34A",["tangerine"]],["1F34B",["lemon"]],["1F34C",["banana"]],["1F34D",["pineapple"]],["1F96D",["mango"]],["1F34E",["apple"]],["1F34F",["green_apple"]],["1F350",["pear"]],["1F351",["peach"]],["1F352",["cherries"]],["1F353",["strawberry"]],["1F95D",["kiwifruit"]],["1F345",["tomato"]],["1F965",["coconut"]],["1F951",["avocado"]],["1F346",["eggplant"]],["1F954",["potato"]],["1F955",["carrot"]],["1F33D",["corn"]],["1F336-FE0F",["hot_pepper"]],["1F952",["cucumber"]],["1F96C",["leafy_green"]],["1F966",["broccoli"]],["1F9C4",["garlic"]],["1F9C5",["onion"]],["1F344",["mushroom"]],["1F95C",["peanuts"]],["1F330",["chestnut"]],["1F35E",["bread"]],["1F950",["croissant"]],["1F956",["baguette_bread"]],["1F968",["pretzel"]],["1F96F",["bagel"]],["1F95E",["pancakes"]],["1F9C7",["waffle"]],["1F9C0",["cheese_wedge"]],["1F356",["meat_on_bone"]],["1F357",["poultry_leg"]],["1F969",["cut_of_meat"]],["1F953",["bacon"]],["1F354",["hamburger"]],["1F35F",["fries"]],["1F355",["pizza"]],["1F32D",["hotdog"]],["1F96A",["sandwich"]],["1F32E",["taco"]],["1F32F",["burrito"]],["1F959",["stuffed_flatbread"]],["1F9C6",["falafel"]],["1F95A",["egg"]],["1F373",["fried_egg","cooking"]],["1F958",["shallow_pan_of_food"]],["1F372",["stew"]],["1F963",["bowl_with_spoon"]],["1F957",["green_salad"]],["1F37F",["popcorn"]],["1F9C8",["butter"]],["1F9C2",["salt"]],["1F96B",["canned_food"]],["1F371",["bento"]],["1F358",["rice_cracker"]],["1F359",["rice_ball"]],["1F35A",["rice"]],["1F35B",["curry"]],["1F35C",["ramen"]],["1F35D",["spaghetti"]],["1F360",["sweet_potato"]],["1F362",["oden"]],["1F363",["sushi"]],["1F364",["fried_shrimp"]],["1F365",["fish_cake"]],["1F96E",["moon_cake"]],["1F361",["dango"]],["1F95F",["dumpling"]],["1F960",["fortune_cookie"]],["1F961",["takeout_box"]],["1F980",["crab"]],["1F99E",["lobster"]],["1F990",["shrimp"]],["1F991",["squid"]],["1F9AA",["oyster"]],["1F366",["icecream"]],["1F367",["shaved_ice"]],["1F368",["ice_cream"]],["1F369",["doughnut"]],["1F36A",["cookie"]],["1F382",["birthday"]],["1F370",["cake"]],["1F9C1",["cupcake"]],["1F967",["pie"]],["1F36B",["chocolate_bar"]],["1F36C",["candy"]],["1F36D",["lollipop"]],["1F36E",["custard"]],["1F36F",["honey_pot"]],["1F37C",["baby_bottle"]],["1F95B",["glass_of_milk"]],["2615",["coffee"]],["1F375",["tea"]],["1F376",["sake"]],["1F37E",["champagne"]],["1F377",["wine_glass"]],["1F378",["cocktail"]],["1F379",["tropical_drink"]],["1F37A",["beer"]],["1F37B",["beers"]],["1F942",["clinking_glasses"]],["1F943",["tumbler_glass"]],["1F964",["cup_with_straw"]],["1F9C3",["beverage_box"]],["1F9C9",["mate_drink"]],["1F9CA",["ice_cube"]],["1F962",["chopsticks"]],["1F37D-FE0F",["knife_fork_plate"]],["1F374",["fork_and_knife"]],["1F944",["spoon"]],["1F52A",["hocho","knife"]],["1F3FA",["amphora"]]],["activity",["Activities"]],[["1F383",["jack_o_lantern"]],["1F384",["christmas_tree"]],["1F386",["fireworks"]],["1F387",["sparkler"]],["1F9E8",["firecracker"]],["2728",["sparkles"]],["1F388",["balloon"]],["1F389",["tada"]],["1F38A",["confetti_ball"]],["1F38B",["tanabata_tree"]],["1F38D",["bamboo"]],["1F38E",["dolls"]],["1F38F",["flags"]],["1F390",["wind_chime"]],["1F391",["rice_scene"]],["1F9E7",["red_envelope"]],["1F380",["ribbon"]],["1F381",["gift"]],["1F397-FE0F",["reminder_ribbon"]],["1F39F-FE0F",["admission_tickets"]],["1F3AB",["ticket"]],["1F396-FE0F",["medal"]],["1F3C6",["trophy"]],["1F3C5",["sports_medal"]],["1F947",["first_place_medal"]],["1F948",["second_place_medal"]],["1F949",["third_place_medal"]],["26BD",["soccer"]],["26BE",["baseball"]],["1F94E",["softball"]],["1F3C0",["basketball"]],["1F3D0",["volleyball"]],["1F3C8",["football"]],["1F3C9",["rugby_football"]],["1F3BE",["tennis"]],["1F94F",["flying_disc"]],["1F3B3",["bowling"]],["1F3CF",["cricket_bat_and_ball"]],["1F3D1",["field_hockey_stick_and_ball"]],["1F3D2",["ice_hockey_stick_and_puck"]],["1F94D",["lacrosse"]],["1F3D3",["table_tennis_paddle_and_ball"]],["1F3F8",["badminton_racquet_and_shuttlecock"]],["1F94A",["boxing_glove"]],["1F94B",["martial_arts_uniform"]],["1F945",["goal_net"]],["26F3",["golf"]],["26F8-FE0F",["ice_skate"]],["1F3A3",["fishing_pole_and_fish"]],["1F93F",["diving_mask"]],["1F3BD",["running_shirt_with_sash"]],["1F3BF",["ski"]],["1F6F7",["sled"]],["1F94C",["curling_stone"]],["1F3AF",["dart"]],["1FA80",["yo-yo"]],["1FA81",["kite"]],["1F3B1",["8ball"]],["1F52E",["crystal_ball"]],["1F9FF",["nazar_amulet"]],["1F3AE",["video_game"]],["1F579-FE0F",["joystick"]],["1F3B0",["slot_machine"]],["1F3B2",["game_die"]],["1F9E9",["jigsaw"]],["1F9F8",["teddy_bear"]],["2660-FE0F",["spades"]],["2665-FE0F",["hearts"]],["2666-FE0F",["diamonds"]],["2663-FE0F",["clubs"]],["265F-FE0F",["chess_pawn"]],["1F0CF",["black_joker"]],["1F004",["mahjong"]],["1F3B4",["flower_playing_cards"]],["1F3AD",["performing_arts"]],["1F5BC-FE0F",["frame_with_picture"]],["1F3A8",["art"]],["1F9F5",["thread"]],["1F9F6",["yarn"]]],["places",["Travel & Places"]],[["1F30D",["earth_africa"]],["1F30E",["earth_americas"]],["1F30F",["earth_asia"]],["1F310",["globe_with_meridians"]],["1F5FA-FE0F",["world_map"]],["1F5FE",["japan"]],["1F9ED",["compass"]],["1F3D4-FE0F",["snow_capped_mountain"]],["26F0-FE0F",["mountain"]],["1F30B",["volcano"]],["1F5FB",["mount_fuji"]],["1F3D5-FE0F",["camping"]],["1F3D6-FE0F",["beach_with_umbrella"]],["1F3DC-FE0F",["desert"]],["1F3DD-FE0F",["desert_island"]],["1F3DE-FE0F",["national_park"]],["1F3DF-FE0F",["stadium"]],["1F3DB-FE0F",["classical_building"]],["1F3D7-FE0F",["building_construction"]],["1F9F1",["bricks"]],["1F3D8-FE0F",["house_buildings"]],["1F3DA-FE0F",["derelict_house_building"]],["1F3E0",["house"]],["1F3E1",["house_with_garden"]],["1F3E2",["office"]],["1F3E3",["post_office"]],["1F3E4",["european_post_office"]],["1F3E5",["hospital"]],["1F3E6",["bank"]],["1F3E8",["hotel"]],["1F3E9",["love_hotel"]],["1F3EA",["convenience_store"]],["1F3EB",["school"]],["1F3EC",["department_store"]],["1F3ED",["factory"]],["1F3EF",["japanese_castle"]],["1F3F0",["european_castle"]],["1F492",["wedding"]],["1F5FC",["tokyo_tower"]],["1F5FD",["statue_of_liberty"]],["26EA",["church"]],["1F54C",["mosque"]],["1F6D5",["hindu_temple"]],["1F54D",["synagogue"]],["26E9-FE0F",["shinto_shrine"]],["1F54B",["kaaba"]],["26F2",["fountain"]],["26FA",["tent"]],["1F301",["foggy"]],["1F303",["night_with_stars"]],["1F3D9-FE0F",["cityscape"]],["1F304",["sunrise_over_mountains"]],["1F305",["sunrise"]],["1F306",["city_sunset"]],["1F307",["city_sunrise"]],["1F309",["bridge_at_night"]],["2668-FE0F",["hotsprings"]],["1F3A0",["carousel_horse"]],["1F3A1",["ferris_wheel"]],["1F3A2",["roller_coaster"]],["1F488",["barber"]],["1F3AA",["circus_tent"]],["1F682",["steam_locomotive"]],["1F683",["railway_car"]],["1F684",["bullettrain_side"]],["1F685",["bullettrain_front"]],["1F686",["train2"]],["1F687",["metro"]],["1F688",["light_rail"]],["1F689",["station"]],["1F68A",["tram"]],["1F69D",["monorail"]],["1F69E",["mountain_railway"]],["1F68B",["train"]],["1F68C",["bus"]],["1F68D",["oncoming_bus"]],["1F68E",["trolleybus"]],["1F690",["minibus"]],["1F691",["ambulance"]],["1F692",["fire_engine"]],["1F693",["police_car"]],["1F694",["oncoming_police_car"]],["1F695",["taxi"]],["1F696",["oncoming_taxi"]],["1F697",["car","red_car"]],["1F698",["oncoming_automobile"]],["1F699",["blue_car"]],["1F69A",["truck"]],["1F69B",["articulated_lorry"]],["1F69C",["tractor"]],["1F3CE-FE0F",["racing_car"]],["1F3CD-FE0F",["racing_motorcycle"]],["1F6F5",["motor_scooter"]],["1F9BD",["manual_wheelchair"]],["1F9BC",["motorized_wheelchair"]],["1F6FA",["auto_rickshaw"]],["1F6B2",["bike"]],["1F6F4",["scooter"]],["1F6F9",["skateboard"]],["1F68F",["busstop"]],["1F6E3-FE0F",["motorway"]],["1F6E4-FE0F",["railway_track"]],["1F6E2-FE0F",["oil_drum"]],["26FD",["fuelpump"]],["1F6A8",["rotating_light"]],["1F6A5",["traffic_light"]],["1F6A6",["vertical_traffic_light"]],["1F6D1",["octagonal_sign"]],["1F6A7",["construction"]],["2693",["anchor"]],["26F5",["boat","sailboat"]],["1F6F6",["canoe"]],["1F6A4",["speedboat"]],["1F6F3-FE0F",["passenger_ship"]],["26F4-FE0F",["ferry"]],["1F6E5-FE0F",["motor_boat"]],["1F6A2",["ship"]],["2708-FE0F",["airplane"]],["1F6E9-FE0F",["small_airplane"]],["1F6EB",["airplane_departure"]],["1F6EC",["airplane_arriving"]],["1FA82",["parachute"]],["1F4BA",["seat"]],["1F681",["helicopter"]],["1F69F",["suspension_railway"]],["1F6A0",["mountain_cableway"]],["1F6A1",["aerial_tramway"]],["1F6F0-FE0F",["satellite"]],["1F680",["rocket"]],["1F6F8",["flying_saucer"]],["1F6CE-FE0F",["bellhop_bell"]],["1F9F3",["luggage"]],["231B",["hourglass"]],["23F3",["hourglass_flowing_sand"]],["231A",["watch"]],["23F0",["alarm_clock"]],["23F1-FE0F",["stopwatch"]],["23F2-FE0F",["timer_clock"]],["1F570-FE0F",["mantelpiece_clock"]],["1F55B",["clock12"]],["1F567",["clock1230"]],["1F550",["clock1"]],["1F55C",["clock130"]],["1F551",["clock2"]],["1F55D",["clock230"]],["1F552",["clock3"]],["1F55E",["clock330"]],["1F553",["clock4"]],["1F55F",["clock430"]],["1F554",["clock5"]],["1F560",["clock530"]],["1F555",["clock6"]],["1F561",["clock630"]],["1F556",["clock7"]],["1F562",["clock730"]],["1F557",["clock8"]],["1F563",["clock830"]],["1F558",["clock9"]],["1F564",["clock930"]],["1F559",["clock10"]],["1F565",["clock1030"]],["1F55A",["clock11"]],["1F566",["clock1130"]],["1F311",["new_moon"]],["1F312",["waxing_crescent_moon"]],["1F313",["first_quarter_moon"]],["1F314",["moon","waxing_gibbous_moon"]],["1F315",["full_moon"]],["1F316",["waning_gibbous_moon"]],["1F317",["last_quarter_moon"]],["1F318",["waning_crescent_moon"]],["1F319",["crescent_moon"]],["1F31A",["new_moon_with_face"]],["1F31B",["first_quarter_moon_with_face"]],["1F31C",["last_quarter_moon_with_face"]],["1F321-FE0F",["thermometer"]],["2600-FE0F",["sunny"]],["1F31D",["full_moon_with_face"]],["1F31E",["sun_with_face"]],["1FA90",["ringed_planet"]],["2B50",["star"]],["1F31F",["star2"]],["1F320",["stars"]],["1F30C",["milky_way"]],["2601-FE0F",["cloud"]],["26C5",["partly_sunny"]],["26C8-FE0F",["thunder_cloud_and_rain"]],["1F324-FE0F",["mostly_sunny","sun_small_cloud"]],["1F325-FE0F",["barely_sunny","sun_behind_cloud"]],["1F326-FE0F",["partly_sunny_rain","sun_behind_rain_cloud"]],["1F327-FE0F",["rain_cloud"]],["1F328-FE0F",["snow_cloud"]],["1F329-FE0F",["lightning","lightning_cloud"]],["1F32A-FE0F",["tornado","tornado_cloud"]],["1F32B-FE0F",["fog"]],["1F32C-FE0F",["wind_blowing_face"]],["1F300",["cyclone"]],["1F308",["rainbow"]],["1F302",["closed_umbrella"]],["2602-FE0F",["umbrella"]],["2614",["umbrella_with_rain_drops"]],["26F1-FE0F",["umbrella_on_ground"]],["26A1",["zap"]],["2744-FE0F",["snowflake"]],["2603-FE0F",["snowman"]],["26C4",["snowman_without_snow"]],["2604-FE0F",["comet"]],["1F525",["fire"]],["1F4A7",["droplet"]],["1F30A",["ocean"]]],["objects",["Objects"]],[["1F453",["eyeglasses"]],["1F576-FE0F",["dark_sunglasses"]],["1F97D",["goggles"]],["1F97C",["lab_coat"]],["1F9BA",["safety_vest"]],["1F454",["necktie"]],["1F455",["shirt","tshirt"]],["1F456",["jeans"]],["1F9E3",["scarf"]],["1F9E4",["gloves"]],["1F9E5",["coat"]],["1F9E6",["socks"]],["1F457",["dress"]],["1F458",["kimono"]],["1F97B",["sari"]],["1FA71",["one-piece_swimsuit"]],["1FA72",["briefs"]],["1FA73",["shorts"]],["1F459",["bikini"]],["1F45A",["womans_clothes"]],["1F45B",["purse"]],["1F45C",["handbag"]],["1F45D",["pouch"]],["1F6CD-FE0F",["shopping_bags"]],["1F392",["school_satchel"]],["1F45E",["mans_shoe","shoe"]],["1F45F",["athletic_shoe"]],["1F97E",["hiking_boot"]],["1F97F",["womans_flat_shoe"]],["1F460",["high_heel"]],["1F461",["sandal"]],["1FA70",["ballet_shoes"]],["1F462",["boot"]],["1F451",["crown"]],["1F452",["womans_hat"]],["1F3A9",["tophat"]],["1F393",["mortar_board"]],["1F9E2",["billed_cap"]],["26D1-FE0F",["helmet_with_white_cross"]],["1F4FF",["prayer_beads"]],["1F484",["lipstick"]],["1F48D",["ring"]],["1F48E",["gem"]],["1F507",["mute"]],["1F508",["speaker"]],["1F509",["sound"]],["1F50A",["loud_sound"]],["1F4E2",["loudspeaker"]],["1F4E3",["mega"]],["1F4EF",["postal_horn"]],["1F514",["bell"]],["1F515",["no_bell"]],["1F3BC",["musical_score"]],["1F3B5",["musical_note"]],["1F3B6",["notes"]],["1F399-FE0F",["studio_microphone"]],["1F39A-FE0F",["level_slider"]],["1F39B-FE0F",["control_knobs"]],["1F3A4",["microphone"]],["1F3A7",["headphones"]],["1F4FB",["radio"]],["1F3B7",["saxophone"]],["1F3B8",["guitar"]],["1F3B9",["musical_keyboard"]],["1F3BA",["trumpet"]],["1F3BB",["violin"]],["1FA95",["banjo"]],["1F941",["drum_with_drumsticks"]],["1F4F1",["iphone"]],["1F4F2",["calling"]],["260E-FE0F",["phone","telephone"]],["1F4DE",["telephone_receiver"]],["1F4DF",["pager"]],["1F4E0",["fax"]],["1F50B",["battery"]],["1F50C",["electric_plug"]],["1F4BB",["computer"]],["1F5A5-FE0F",["desktop_computer"]],["1F5A8-FE0F",["printer"]],["2328-FE0F",["keyboard"]],["1F5B1-FE0F",["three_button_mouse"]],["1F5B2-FE0F",["trackball"]],["1F4BD",["minidisc"]],["1F4BE",["floppy_disk"]],["1F4BF",["cd"]],["1F4C0",["dvd"]],["1F9EE",["abacus"]],["1F3A5",["movie_camera"]],["1F39E-FE0F",["film_frames"]],["1F4FD-FE0F",["film_projector"]],["1F3AC",["clapper"]],["1F4FA",["tv"]],["1F4F7",["camera"]],["1F4F8",["camera_with_flash"]],["1F4F9",["video_camera"]],["1F4FC",["vhs"]],["1F50D",["mag"]],["1F50E",["mag_right"]],["1F56F-FE0F",["candle"]],["1F4A1",["bulb"]],["1F526",["flashlight"]],["1F3EE",["izakaya_lantern","lantern"]],["1FA94",["diya_lamp"]],["1F4D4",["notebook_with_decorative_cover"]],["1F4D5",["closed_book"]],["1F4D6",["book","open_book"]],["1F4D7",["green_book"]],["1F4D8",["blue_book"]],["1F4D9",["orange_book"]],["1F4DA",["books"]],["1F4D3",["notebook"]],["1F4D2",["ledger"]],["1F4C3",["page_with_curl"]],["1F4DC",["scroll"]],["1F4C4",["page_facing_up"]],["1F4F0",["newspaper"]],["1F5DE-FE0F",["rolled_up_newspaper"]],["1F4D1",["bookmark_tabs"]],["1F516",["bookmark"]],["1F3F7-FE0F",["label"]],["1F4B0",["moneybag"]],["1F4B4",["yen"]],["1F4B5",["dollar"]],["1F4B6",["euro"]],["1F4B7",["pound"]],["1F4B8",["money_with_wings"]],["1F4B3",["credit_card"]],["1F9FE",["receipt"]],["1F4B9",["chart"]],["1F4B1",["currency_exchange"]],["1F4B2",["heavy_dollar_sign"]],["2709-FE0F",["email","envelope"]],["1F4E7",["e-mail"]],["1F4E8",["incoming_envelope"]],["1F4E9",["envelope_with_arrow"]],["1F4E4",["outbox_tray"]],["1F4E5",["inbox_tray"]],["1F4E6",["package"]],["1F4EB",["mailbox"]],["1F4EA",["mailbox_closed"]],["1F4EC",["mailbox_with_mail"]],["1F4ED",["mailbox_with_no_mail"]],["1F4EE",["postbox"]],["1F5F3-FE0F",["ballot_box_with_ballot"]],["270F-FE0F",["pencil2"]],["2712-FE0F",["black_nib"]],["1F58B-FE0F",["lower_left_fountain_pen"]],["1F58A-FE0F",["lower_left_ballpoint_pen"]],["1F58C-FE0F",["lower_left_paintbrush"]],["1F58D-FE0F",["lower_left_crayon"]],["1F4DD",["memo","pencil"]],["1F4BC",["briefcase"]],["1F4C1",["file_folder"]],["1F4C2",["open_file_folder"]],["1F5C2-FE0F",["card_index_dividers"]],["1F4C5",["date"]],["1F4C6",["calendar"]],["1F5D2-FE0F",["spiral_note_pad"]],["1F5D3-FE0F",["spiral_calendar_pad"]],["1F4C7",["card_index"]],["1F4C8",["chart_with_upwards_trend"]],["1F4C9",["chart_with_downwards_trend"]],["1F4CA",["bar_chart"]],["1F4CB",["clipboard"]],["1F4CC",["pushpin"]],["1F4CD",["round_pushpin"]],["1F4CE",["paperclip"]],["1F587-FE0F",["linked_paperclips"]],["1F4CF",["straight_ruler"]],["1F4D0",["triangular_ruler"]],["2702-FE0F",["scissors"]],["1F5C3-FE0F",["card_file_box"]],["1F5C4-FE0F",["file_cabinet"]],["1F5D1-FE0F",["wastebasket"]],["1F512",["lock"]],["1F513",["unlock"]],["1F50F",["lock_with_ink_pen"]],["1F510",["closed_lock_with_key"]],["1F511",["key"]],["1F5DD-FE0F",["old_key"]],["1F528",["hammer"]],["1FA93",["axe"]],["26CF-FE0F",["pick"]],["2692-FE0F",["hammer_and_pick"]],["1F6E0-FE0F",["hammer_and_wrench"]],["1F5E1-FE0F",["dagger_knife"]],["2694-FE0F",["crossed_swords"]],["1F52B",["gun"]],["1F3F9",["bow_and_arrow"]],["1F6E1-FE0F",["shield"]],["1F527",["wrench"]],["1F529",["nut_and_bolt"]],["2699-FE0F",["gear"]],["1F5DC-FE0F",["compression"]],["2696-FE0F",["scales"]],["1F9AF",["probing_cane"]],["1F517",["link"]],["26D3-FE0F",["chains"]],["1F9F0",["toolbox"]],["1F9F2",["magnet"]],["2697-FE0F",["alembic"]],["1F9EA",["test_tube"]],["1F9EB",["petri_dish"]],["1F9EC",["dna"]],["1F52C",["microscope"]],["1F52D",["telescope"]],["1F4E1",["satellite_antenna"]],["1F489",["syringe"]],["1FA78",["drop_of_blood"]],["1F48A",["pill"]],["1FA79",["adhesive_bandage"]],["1FA7A",["stethoscope"]],["1F6AA",["door"]],["1F6CF-FE0F",["bed"]],["1F6CB-FE0F",["couch_and_lamp"]],["1FA91",["chair"]],["1F6BD",["toilet"]],["1F6BF",["shower"]],["1F6C1",["bathtub"]],["1FA92",["razor"]],["1F9F4",["lotion_bottle"]],["1F9F7",["safety_pin"]],["1F9F9",["broom"]],["1F9FA",["basket"]],["1F9FB",["roll_of_paper"]],["1F9FC",["soap"]],["1F9FD",["sponge"]],["1F9EF",["fire_extinguisher"]],["1F6D2",["shopping_trolley"]],["1F6AC",["smoking"]],["26B0-FE0F",["coffin"]],["26B1-FE0F",["funeral_urn"]],["1F5FF",["moyai"]]],["symbols",["Symbols"]],[["1F3E7",["atm"]],["1F6AE",["put_litter_in_its_place"]],["1F6B0",["potable_water"]],["267F",["wheelchair"]],["1F6B9",["mens"]],["1F6BA",["womens"]],["1F6BB",["restroom"]],["1F6BC",["baby_symbol"]],["1F6BE",["wc"]],["1F6C2",["passport_control"]],["1F6C3",["customs"]],["1F6C4",["baggage_claim"]],["1F6C5",["left_luggage"]],["26A0-FE0F",["warning"]],["1F6B8",["children_crossing"]],["26D4",["no_entry"]],["1F6AB",["no_entry_sign"]],["1F6B3",["no_bicycles"]],["1F6AD",["no_smoking"]],["1F6AF",["do_not_litter"]],["1F6B1",["non-potable_water"]],["1F6B7",["no_pedestrians"]],["1F4F5",["no_mobile_phones"]],["1F51E",["underage"]],["2622-FE0F",["radioactive_sign"]],["2623-FE0F",["biohazard_sign"]],["2B06-FE0F",["arrow_up"]],["2197-FE0F",["arrow_upper_right"]],["27A1-FE0F",["arrow_right"]],["2198-FE0F",["arrow_lower_right"]],["2B07-FE0F",["arrow_down"]],["2199-FE0F",["arrow_lower_left"]],["2B05-FE0F",["arrow_left"]],["2196-FE0F",["arrow_upper_left"]],["2195-FE0F",["arrow_up_down"]],["2194-FE0F",["left_right_arrow"]],["21A9-FE0F",["leftwards_arrow_with_hook"]],["21AA-FE0F",["arrow_right_hook"]],["2934-FE0F",["arrow_heading_up"]],["2935-FE0F",["arrow_heading_down"]],["1F503",["arrows_clockwise"]],["1F504",["arrows_counterclockwise"]],["1F519",["back"]],["1F51A",["end"]],["1F51B",["on"]],["1F51C",["soon"]],["1F51D",["top"]],["1F6D0",["place_of_worship"]],["269B-FE0F",["atom_symbol"]],["1F549-FE0F",["om_symbol"]],["2721-FE0F",["star_of_david"]],["2638-FE0F",["wheel_of_dharma"]],["262F-FE0F",["yin_yang"]],["271D-FE0F",["latin_cross"]],["2626-FE0F",["orthodox_cross"]],["262A-FE0F",["star_and_crescent"]],["262E-FE0F",["peace_symbol"]],["1F54E",["menorah_with_nine_branches"]],["1F52F",["six_pointed_star"]],["2648",["aries"]],["2649",["taurus"]],["264A",["gemini"]],["264B",["cancer"]],["264C",["leo"]],["264D",["virgo"]],["264E",["libra"]],["264F",["scorpius"]],["2650",["sagittarius"]],["2651",["capricorn"]],["2652",["aquarius"]],["2653",["pisces"]],["26CE",["ophiuchus"]],["1F500",["twisted_rightwards_arrows"]],["1F501",["repeat"]],["1F502",["repeat_one"]],["25B6-FE0F",["arrow_forward"]],["23E9",["fast_forward"]],["23ED-FE0F",["black_right_pointing_double_triangle_with_vertical_bar"]],["23EF-FE0F",["black_right_pointing_triangle_with_double_vertical_bar"]],["25C0-FE0F",["arrow_backward"]],["23EA",["rewind"]],["23EE-FE0F",["black_left_pointing_double_triangle_with_vertical_bar"]],["1F53C",["arrow_up_small"]],["23EB",["arrow_double_up"]],["1F53D",["arrow_down_small"]],["23EC",["arrow_double_down"]],["23F8-FE0F",["double_vertical_bar"]],["23F9-FE0F",["black_square_for_stop"]],["23FA-FE0F",["black_circle_for_record"]],["23CF-FE0F",["eject"]],["1F3A6",["cinema"]],["1F505",["low_brightness"]],["1F506",["high_brightness"]],["1F4F6",["signal_strength"]],["1F4F3",["vibration_mode"]],["1F4F4",["mobile_phone_off"]],["2640-FE0F",["female_sign"]],["2642-FE0F",["male_sign"]],["2695-FE0F",["medical_symbol","staff_of_aesculapius"]],["267E-FE0F",["infinity"]],["267B-FE0F",["recycle"]],["269C-FE0F",["fleur_de_lis"]],["1F531",["trident"]],["1F4DB",["name_badge"]],["1F530",["beginner"]],["2B55",["o"]],["2705",["white_check_mark"]],["2611-FE0F",["ballot_box_with_check"]],["2714-FE0F",["heavy_check_mark"]],["2716-FE0F",["heavy_multiplication_x"]],["274C",["x"]],["274E",["negative_squared_cross_mark"]],["2795",["heavy_plus_sign"]],["2796",["heavy_minus_sign"]],["2797",["heavy_division_sign"]],["27B0",["curly_loop"]],["27BF",["loop"]],["303D-FE0F",["part_alternation_mark"]],["2733-FE0F",["eight_spoked_asterisk"]],["2734-FE0F",["eight_pointed_black_star"]],["2747-FE0F",["sparkle"]],["203C-FE0F",["bangbang"]],["2049-FE0F",["interrobang"]],["2753",["question"]],["2754",["grey_question"]],["2755",["grey_exclamation"]],["2757",["exclamation","heavy_exclamation_mark"]],["3030-FE0F",["wavy_dash"]],["00A9-FE0F",["copyright"]],["00AE-FE0F",["registered"]],["2122-FE0F",["tm"]],["0023-FE0F-20E3",["hash"]],["002A-FE0F-20E3",["keycap_star"]],["0030-FE0F-20E3",["zero"]],["0031-FE0F-20E3",["one"]],["0032-FE0F-20E3",["two"]],["0033-FE0F-20E3",["three"]],["0034-FE0F-20E3",["four"]],["0035-FE0F-20E3",["five"]],["0036-FE0F-20E3",["six"]],["0037-FE0F-20E3",["seven"]],["0038-FE0F-20E3",["eight"]],["0039-FE0F-20E3",["nine"]],["1F51F",["keycap_ten"]],["1F520",["capital_abcd"]],["1F521",["abcd"]],["1F522",["1234"]],["1F523",["symbols"]],["1F524",["abc"]],["1F170-FE0F",["a"]],["1F18E",["ab"]],["1F171-FE0F",["b"]],["1F191",["cl"]],["1F192",["cool"]],["1F193",["free"]],["2139-FE0F",["information_source"]],["1F194",["id"]],["24C2-FE0F",["m"]],["1F195",["new"]],["1F196",["ng"]],["1F17E-FE0F",["o2"]],["1F197",["ok"]],["1F17F-FE0F",["parking"]],["1F198",["sos"]],["1F199",["up"]],["1F19A",["vs"]],["1F201",["koko"]],["1F202-FE0F",["sa"]],["1F237-FE0F",["u6708"]],["1F236",["u6709"]],["1F22F",["u6307"]],["1F250",["ideograph_advantage"]],["1F239",["u5272"]],["1F21A",["u7121"]],["1F232",["u7981"]],["1F251",["accept"]],["1F238",["u7533"]],["1F234",["u5408"]],["1F233",["u7a7a"]],["3297-FE0F",["congratulations"]],["3299-FE0F",["secret"]],["1F23A",["u55b6"]],["1F235",["u6e80"]],["1F534",["red_circle"]],["1F7E0",["large_orange_circle"]],["1F7E1",["large_yellow_circle"]],["1F7E2",["large_green_circle"]],["1F535",["large_blue_circle"]],["1F7E3",["large_purple_circle"]],["1F7E4",["large_brown_circle"]],["26AB",["black_circle"]],["26AA",["white_circle"]],["1F7E5",["large_red_square"]],["1F7E7",["large_orange_square"]],["1F7E8",["large_yellow_square"]],["1F7E9",["large_green_square"]],["1F7E6",["large_blue_square"]],["1F7EA",["large_purple_square"]],["1F7EB",["large_brown_square"]],["2B1B",["black_large_square"]],["2B1C",["white_large_square"]],["25FC-FE0F",["black_medium_square"]],["25FB-FE0F",["white_medium_square"]],["25FE",["black_medium_small_square"]],["25FD",["white_medium_small_square"]],["25AA-FE0F",["black_small_square"]],["25AB-FE0F",["white_small_square"]],["1F536",["large_orange_diamond"]],["1F537",["large_blue_diamond"]],["1F538",["small_orange_diamond"]],["1F539",["small_blue_diamond"]],["1F53A",["small_red_triangle"]],["1F53B",["small_red_triangle_down"]],["1F4A0",["diamond_shape_with_a_dot_inside"]],["1F518",["radio_button"]],["1F533",["white_square_button"]],["1F532",["black_square_button"]]],["flags",["Flags"]],[["1F3C1",["checkered_flag"]],["1F6A9",["triangular_flag_on_post"]],["1F38C",["crossed_flags"]],["1F3F4",["waving_black_flag"]],["1F3F3-FE0F",["waving_white_flag"]],["1F3F3-FE0F-200D-1F308",["rainbow-flag"]],["1F3F4-200D-2620-FE0F",["pirate_flag"]],["1F1E6-1F1E8",["flag-ac"]],["1F1E6-1F1E9",["flag-ad"]],["1F1E6-1F1EA",["flag-ae"]],["1F1E6-1F1EB",["flag-af"]],["1F1E6-1F1EC",["flag-ag"]],["1F1E6-1F1EE",["flag-ai"]],["1F1E6-1F1F1",["flag-al"]],["1F1E6-1F1F2",["flag-am"]],["1F1E6-1F1F4",["flag-ao"]],["1F1E6-1F1F6",["flag-aq"]],["1F1E6-1F1F7",["flag-ar"]],["1F1E6-1F1F8",["flag-as"]],["1F1E6-1F1F9",["flag-at"]],["1F1E6-1F1FA",["flag-au"]],["1F1E6-1F1FC",["flag-aw"]],["1F1E6-1F1FD",["flag-ax"]],["1F1E6-1F1FF",["flag-az"]],["1F1E7-1F1E6",["flag-ba"]],["1F1E7-1F1E7",["flag-bb"]],["1F1E7-1F1E9",["flag-bd"]],["1F1E7-1F1EA",["flag-be"]],["1F1E7-1F1EB",["flag-bf"]],["1F1E7-1F1EC",["flag-bg"]],["1F1E7-1F1ED",["flag-bh"]],["1F1E7-1F1EE",["flag-bi"]],["1F1E7-1F1EF",["flag-bj"]],["1F1E7-1F1F1",["flag-bl"]],["1F1E7-1F1F2",["flag-bm"]],["1F1E7-1F1F3",["flag-bn"]],["1F1E7-1F1F4",["flag-bo"]],["1F1E7-1F1F6",["flag-bq"]],["1F1E7-1F1F7",["flag-br"]],["1F1E7-1F1F8",["flag-bs"]],["1F1E7-1F1F9",["flag-bt"]],["1F1E7-1F1FB",["flag-bv"]],["1F1E7-1F1FC",["flag-bw"]],["1F1E7-1F1FE",["flag-by"]],["1F1E7-1F1FF",["flag-bz"]],["1F1E8-1F1E6",["flag-ca"]],["1F1E8-1F1E8",["flag-cc"]],["1F1E8-1F1E9",["flag-cd"]],["1F1E8-1F1EB",["flag-cf"]],["1F1E8-1F1EC",["flag-cg"]],["1F1E8-1F1ED",["flag-ch"]],["1F1E8-1F1EE",["flag-ci"]],["1F1E8-1F1F0",["flag-ck"]],["1F1E8-1F1F1",["flag-cl"]],["1F1E8-1F1F2",["flag-cm"]],["1F1E8-1F1F3",["cn","flag-cn"]],["1F1E8-1F1F4",["flag-co"]],["1F1E8-1F1F5",["flag-cp"]],["1F1E8-1F1F7",["flag-cr"]],["1F1E8-1F1FA",["flag-cu"]],["1F1E8-1F1FB",["flag-cv"]],["1F1E8-1F1FC",["flag-cw"]],["1F1E8-1F1FD",["flag-cx"]],["1F1E8-1F1FE",["flag-cy"]],["1F1E8-1F1FF",["flag-cz"]],["1F1E9-1F1EA",["de","flag-de"]],["1F1E9-1F1EC",["flag-dg"]],["1F1E9-1F1EF",["flag-dj"]],["1F1E9-1F1F0",["flag-dk"]],["1F1E9-1F1F2",["flag-dm"]],["1F1E9-1F1F4",["flag-do"]],["1F1E9-1F1FF",["flag-dz"]],["1F1EA-1F1E6",["flag-ea"]],["1F1EA-1F1E8",["flag-ec"]],["1F1EA-1F1EA",["flag-ee"]],["1F1EA-1F1EC",["flag-eg"]],["1F1EA-1F1ED",["flag-eh"]],["1F1EA-1F1F7",["flag-er"]],["1F1EA-1F1F8",["es","flag-es"]],["1F1EA-1F1F9",["flag-et"]],["1F1EA-1F1FA",["flag-eu"]],["1F1EB-1F1EE",["flag-fi"]],["1F1EB-1F1EF",["flag-fj"]],["1F1EB-1F1F0",["flag-fk"]],["1F1EB-1F1F2",["flag-fm"]],["1F1EB-1F1F4",["flag-fo"]],["1F1EB-1F1F7",["fr","flag-fr"]],["1F1EC-1F1E6",["flag-ga"]],["1F1EC-1F1E7",["gb","uk","flag-gb"]],["1F1EC-1F1E9",["flag-gd"]],["1F1EC-1F1EA",["flag-ge"]],["1F1EC-1F1EB",["flag-gf"]],["1F1EC-1F1EC",["flag-gg"]],["1F1EC-1F1ED",["flag-gh"]],["1F1EC-1F1EE",["flag-gi"]],["1F1EC-1F1F1",["flag-gl"]],["1F1EC-1F1F2",["flag-gm"]],["1F1EC-1F1F3",["flag-gn"]],["1F1EC-1F1F5",["flag-gp"]],["1F1EC-1F1F6",["flag-gq"]],["1F1EC-1F1F7",["flag-gr"]],["1F1EC-1F1F8",["flag-gs"]],["1F1EC-1F1F9",["flag-gt"]],["1F1EC-1F1FA",["flag-gu"]],["1F1EC-1F1FC",["flag-gw"]],["1F1EC-1F1FE",["flag-gy"]],["1F1ED-1F1F0",["flag-hk"]],["1F1ED-1F1F2",["flag-hm"]],["1F1ED-1F1F3",["flag-hn"]],["1F1ED-1F1F7",["flag-hr"]],["1F1ED-1F1F9",["flag-ht"]],["1F1ED-1F1FA",["flag-hu"]],["1F1EE-1F1E8",["flag-ic"]],["1F1EE-1F1E9",["flag-id"]],["1F1EE-1F1EA",["flag-ie"]],["1F1EE-1F1F1",["flag-il"]],["1F1EE-1F1F2",["flag-im"]],["1F1EE-1F1F3",["flag-in"]],["1F1EE-1F1F4",["flag-io"]],["1F1EE-1F1F6",["flag-iq"]],["1F1EE-1F1F7",["flag-ir"]],["1F1EE-1F1F8",["flag-is"]],["1F1EE-1F1F9",["it","flag-it"]],["1F1EF-1F1EA",["flag-je"]],["1F1EF-1F1F2",["flag-jm"]],["1F1EF-1F1F4",["flag-jo"]],["1F1EF-1F1F5",["jp","flag-jp"]],["1F1F0-1F1EA",["flag-ke"]],["1F1F0-1F1EC",["flag-kg"]],["1F1F0-1F1ED",["flag-kh"]],["1F1F0-1F1EE",["flag-ki"]],["1F1F0-1F1F2",["flag-km"]],["1F1F0-1F1F3",["flag-kn"]],["1F1F0-1F1F5",["flag-kp"]],["1F1F0-1F1F7",["kr","flag-kr"]],["1F1F0-1F1FC",["flag-kw"]],["1F1F0-1F1FE",["flag-ky"]],["1F1F0-1F1FF",["flag-kz"]],["1F1F1-1F1E6",["flag-la"]],["1F1F1-1F1E7",["flag-lb"]],["1F1F1-1F1E8",["flag-lc"]],["1F1F1-1F1EE",["flag-li"]],["1F1F1-1F1F0",["flag-lk"]],["1F1F1-1F1F7",["flag-lr"]],["1F1F1-1F1F8",["flag-ls"]],["1F1F1-1F1F9",["flag-lt"]],["1F1F1-1F1FA",["flag-lu"]],["1F1F1-1F1FB",["flag-lv"]],["1F1F1-1F1FE",["flag-ly"]],["1F1F2-1F1E6",["flag-ma"]],["1F1F2-1F1E8",["flag-mc"]],["1F1F2-1F1E9",["flag-md"]],["1F1F2-1F1EA",["flag-me"]],["1F1F2-1F1EB",["flag-mf"]],["1F1F2-1F1EC",["flag-mg"]],["1F1F2-1F1ED",["flag-mh"]],["1F1F2-1F1F0",["flag-mk"]],["1F1F2-1F1F1",["flag-ml"]],["1F1F2-1F1F2",["flag-mm"]],["1F1F2-1F1F3",["flag-mn"]],["1F1F2-1F1F4",["flag-mo"]],["1F1F2-1F1F5",["flag-mp"]],["1F1F2-1F1F6",["flag-mq"]],["1F1F2-1F1F7",["flag-mr"]],["1F1F2-1F1F8",["flag-ms"]],["1F1F2-1F1F9",["flag-mt"]],["1F1F2-1F1FA",["flag-mu"]],["1F1F2-1F1FB",["flag-mv"]],["1F1F2-1F1FC",["flag-mw"]],["1F1F2-1F1FD",["flag-mx"]],["1F1F2-1F1FE",["flag-my"]],["1F1F2-1F1FF",["flag-mz"]],["1F1F3-1F1E6",["flag-na"]],["1F1F3-1F1E8",["flag-nc"]],["1F1F3-1F1EA",["flag-ne"]],["1F1F3-1F1EB",["flag-nf"]],["1F1F3-1F1EC",["flag-ng"]],["1F1F3-1F1EE",["flag-ni"]],["1F1F3-1F1F1",["flag-nl"]],["1F1F3-1F1F4",["flag-no"]],["1F1F3-1F1F5",["flag-np"]],["1F1F3-1F1F7",["flag-nr"]],["1F1F3-1F1FA",["flag-nu"]],["1F1F3-1F1FF",["flag-nz"]],["1F1F4-1F1F2",["flag-om"]],["1F1F5-1F1E6",["flag-pa"]],["1F1F5-1F1EA",["flag-pe"]],["1F1F5-1F1EB",["flag-pf"]],["1F1F5-1F1EC",["flag-pg"]],["1F1F5-1F1ED",["flag-ph"]],["1F1F5-1F1F0",["flag-pk"]],["1F1F5-1F1F1",["flag-pl"]],["1F1F5-1F1F2",["flag-pm"]],["1F1F5-1F1F3",["flag-pn"]],["1F1F5-1F1F7",["flag-pr"]],["1F1F5-1F1F8",["flag-ps"]],["1F1F5-1F1F9",["flag-pt"]],["1F1F5-1F1FC",["flag-pw"]],["1F1F5-1F1FE",["flag-py"]],["1F1F6-1F1E6",["flag-qa"]],["1F1F7-1F1EA",["flag-re"]],["1F1F7-1F1F4",["flag-ro"]],["1F1F7-1F1F8",["flag-rs"]],["1F1F7-1F1FA",["ru","flag-ru"]],["1F1F7-1F1FC",["flag-rw"]],["1F1F8-1F1E6",["flag-sa"]],["1F1F8-1F1E7",["flag-sb"]],["1F1F8-1F1E8",["flag-sc"]],["1F1F8-1F1E9",["flag-sd"]],["1F1F8-1F1EA",["flag-se"]],["1F1F8-1F1EC",["flag-sg"]],["1F1F8-1F1ED",["flag-sh"]],["1F1F8-1F1EE",["flag-si"]],["1F1F8-1F1EF",["flag-sj"]],["1F1F8-1F1F0",["flag-sk"]],["1F1F8-1F1F1",["flag-sl"]],["1F1F8-1F1F2",["flag-sm"]],["1F1F8-1F1F3",["flag-sn"]],["1F1F8-1F1F4",["flag-so"]],["1F1F8-1F1F7",["flag-sr"]],["1F1F8-1F1F8",["flag-ss"]],["1F1F8-1F1F9",["flag-st"]],["1F1F8-1F1FB",["flag-sv"]],["1F1F8-1F1FD",["flag-sx"]],["1F1F8-1F1FE",["flag-sy"]],["1F1F8-1F1FF",["flag-sz"]],["1F1F9-1F1E6",["flag-ta"]],["1F1F9-1F1E8",["flag-tc"]],["1F1F9-1F1E9",["flag-td"]],["1F1F9-1F1EB",["flag-tf"]],["1F1F9-1F1EC",["flag-tg"]],["1F1F9-1F1ED",["flag-th"]],["1F1F9-1F1EF",["flag-tj"]],["1F1F9-1F1F0",["flag-tk"]],["1F1F9-1F1F1",["flag-tl"]],["1F1F9-1F1F2",["flag-tm"]],["1F1F9-1F1F3",["flag-tn"]],["1F1F9-1F1F4",["flag-to"]],["1F1F9-1F1F7",["flag-tr"]],["1F1F9-1F1F9",["flag-tt"]],["1F1F9-1F1FB",["flag-tv"]],["1F1F9-1F1FC",["flag-tw"]],["1F1F9-1F1FF",["flag-tz"]],["1F1FA-1F1E6",["flag-ua"]],["1F1FA-1F1EC",["flag-ug"]],["1F1FA-1F1F2",["flag-um"]],["1F1FA-1F1F3",["flag-un"]],["1F1FA-1F1F8",["us","flag-us"]],["1F1FA-1F1FE",["flag-uy"]],["1F1FA-1F1FF",["flag-uz"]],["1F1FB-1F1E6",["flag-va"]],["1F1FB-1F1E8",["flag-vc"]],["1F1FB-1F1EA",["flag-ve"]],["1F1FB-1F1EC",["flag-vg"]],["1F1FB-1F1EE",["flag-vi"]],["1F1FB-1F1F3",["flag-vn"]],["1F1FB-1F1FA",["flag-vu"]],["1F1FC-1F1EB",["flag-wf"]],["1F1FC-1F1F8",["flag-ws"]],["1F1FD-1F1F0",["flag-xk"]],["1F1FE-1F1EA",["flag-ye"]],["1F1FE-1F1F9",["flag-yt"]],["1F1FF-1F1E6",["flag-za"]],["1F1FF-1F1F2",["flag-zm"]],["1F1FF-1F1FC",["flag-zw"]],["1F3F4-E0067-E0062-E0065-E006E-E0067-E007F",["flag-england"]],["1F3F4-E0067-E0062-E0073-E0063-E0074-E007F",["flag-scotland"]],["1F3F4-E0067-E0062-E0077-E006C-E0073-E007F",["flag-wales"]]]]')}}]); +//# sourceMappingURL=1.6110220c0cd22a07afe2.js.map \ No newline at end of file diff --git a/dist/1.6110220c0cd22a07afe2.js.map b/dist/1.6110220c0cd22a07afe2.js.map new file mode 100644 index 000000000..6b4b6bea8 --- /dev/null +++ b/dist/1.6110220c0cd22a07afe2.js.map @@ -0,0 +1 @@ +{"version":3,"sources":[],"names":[],"mappings":"","file":"1.6110220c0cd22a07afe2.js","sourceRoot":""} \ No newline at end of file diff --git a/dist/1.db575d71a0009d78423e.js.map b/dist/1.db575d71a0009d78423e.js.map deleted file mode 100644 index 249fd101b..000000000 --- a/dist/1.db575d71a0009d78423e.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":[],"names":[],"mappings":"","file":"1.db575d71a0009d78423e.js","sourceRoot":""} \ No newline at end of file diff --git a/dist/10.af7bed9ae098996acabc.js b/dist/10.0f031682109823f02d37.js similarity index 98% rename from dist/10.af7bed9ae098996acabc.js rename to dist/10.0f031682109823f02d37.js index 5b98383c3..348b21342 100644 --- a/dist/10.af7bed9ae098996acabc.js +++ b/dist/10.0f031682109823f02d37.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{328:function(e,t,o){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function o(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,o),i.l=!0,i.exports}return o.m=e,o.c=t,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)o.d(n,i,function(t){return e[t]}.bind(null,i));return n},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,o){"use strict";(function(t){var o=t.AudioContext||t.webkitAudioContext,n=function e(){var t=this,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!e.isRecordingSupported())throw new Error("Recording is not supported in this browser");this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,wavBitDepth:16,sourceNode:{context:null}},o),this.encodedSamplePosition=0,this.initAudioContext(),this.initialize=this.initWorklet().then((function(){return t.initEncoder()}))};n.isRecordingSupported=function(){var e=t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia;return o&&e&&t.WebAssembly},n.version="8.0.3",n.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){return e.stop()})):this.stream.stop())},n.prototype.close=function(){return this.monitorGainNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode&&this.sourceNode.disconnect(),this.clearStream(),this.encoder&&(this.encoderNode.disconnect(),this.encoder.postMessage({command:"close"})),this.config.sourceNode.context?Promise.resolve():this.audioContext.close()},n.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],o=0;o=0||(i[o]=e[o]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(i[o]=e[o])}return i}(n,["sourceNode"]));e.encoder.postMessage(Object.assign({command:"init",originalSampleRate:e.audioContext.sampleRate,wavSampleRate:e.audioContext.sampleRate},i))}))},n.prototype.initWorklet=function(){return this.audioContext.audioWorklet?this.audioContext.audioWorklet.addModule(this.config.encoderPath):Promise.resolve()},n.prototype.pause=function(e){var t=this;if("recording"===this.state)return this.state="paused",this.recordingGainNode.disconnect(),e&&this.config.streamPages?new Promise((function(e){t.encoder.addEventListener("message",(function o(n){"flushed"===n.data.message&&(t.encoder.removeEventListener("message",o),t.onpause(),e())})),t.encoder.start&&t.encoder.start(),t.encoder.postMessage({command:"flush"})})):(this.onpause(),Promise.resolve())},n.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.recordingGainNode.connect(this.encoderNode),this.onresume())},n.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},n.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},n.prototype.start=function(){var e=this;return"inactive"===this.state?(this.state="loading",this.encodedSamplePosition=0,this.audioContext.resume().then((function(){return e.initialize})).then((function(){return Promise.all([e.initSourceNode(),e.initWorker()])})).then((function(){e.state="recording",e.encoder.postMessage({command:"getHeaderPages"}),e.sourceNode.connect(e.monitorGainNode),e.sourceNode.connect(e.recordingGainNode),e.monitorGainNode.connect(e.audioContext.destination),e.recordingGainNode.connect(e.encoderNode),e.onstart()})).catch((function(t){throw e.state="inactive",t}))):Promise.resolve()},n.prototype.stop=function(){var e=this;return"paused"===this.state||"recording"===this.state?(this.state="inactive",this.recordingGainNode.connect(this.encoderNode),this.monitorGainNode.disconnect(),this.clearStream(),new Promise((function(t){e.encoder.addEventListener("message",(function o(n){"done"===n.data.message&&(e.encoder.removeEventListener("message",o),t())})),e.encoder.start&&e.encoder.start(),e.encoder.postMessage({command:"done"})}))):Promise.resolve()},n.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},n.prototype.streamPage=function(e){this.ondataavailable(e)},n.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop()},n.prototype.ondataavailable=function(){},n.prototype.onpause=function(){},n.prototype.onresume=function(){},n.prototype.onstart=function(){},n.prototype.onstop=function(){},e.exports=n}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function("return this")()}catch(e){"object"==typeof window&&(o=window)}e.exports=o}])}}]); -//# sourceMappingURL=10.af7bed9ae098996acabc.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{334:function(e,t,o){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function o(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,o),i.l=!0,i.exports}return o.m=e,o.c=t,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)o.d(n,i,function(t){return e[t]}.bind(null,i));return n},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,o){"use strict";(function(t){var o=t.AudioContext||t.webkitAudioContext,n=function e(){var t=this,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!e.isRecordingSupported())throw new Error("Recording is not supported in this browser");this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,wavBitDepth:16,sourceNode:{context:null}},o),this.encodedSamplePosition=0,this.initAudioContext(),this.initialize=this.initWorklet().then((function(){return t.initEncoder()}))};n.isRecordingSupported=function(){var e=t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia;return o&&e&&t.WebAssembly},n.version="8.0.3",n.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){return e.stop()})):this.stream.stop())},n.prototype.close=function(){return this.monitorGainNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode&&this.sourceNode.disconnect(),this.clearStream(),this.encoder&&(this.encoderNode.disconnect(),this.encoder.postMessage({command:"close"})),this.config.sourceNode.context?Promise.resolve():this.audioContext.close()},n.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],o=0;o=0||(i[o]=e[o]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(i[o]=e[o])}return i}(n,["sourceNode"]));e.encoder.postMessage(Object.assign({command:"init",originalSampleRate:e.audioContext.sampleRate,wavSampleRate:e.audioContext.sampleRate},i))}))},n.prototype.initWorklet=function(){return this.audioContext.audioWorklet?this.audioContext.audioWorklet.addModule(this.config.encoderPath):Promise.resolve()},n.prototype.pause=function(e){var t=this;if("recording"===this.state)return this.state="paused",this.recordingGainNode.disconnect(),e&&this.config.streamPages?new Promise((function(e){t.encoder.addEventListener("message",(function o(n){"flushed"===n.data.message&&(t.encoder.removeEventListener("message",o),t.onpause(),e())})),t.encoder.start&&t.encoder.start(),t.encoder.postMessage({command:"flush"})})):(this.onpause(),Promise.resolve())},n.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.recordingGainNode.connect(this.encoderNode),this.onresume())},n.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},n.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},n.prototype.start=function(){var e=this;return"inactive"===this.state?(this.state="loading",this.encodedSamplePosition=0,this.audioContext.resume().then((function(){return e.initialize})).then((function(){return Promise.all([e.initSourceNode(),e.initWorker()])})).then((function(){e.state="recording",e.encoder.postMessage({command:"getHeaderPages"}),e.sourceNode.connect(e.monitorGainNode),e.sourceNode.connect(e.recordingGainNode),e.monitorGainNode.connect(e.audioContext.destination),e.recordingGainNode.connect(e.encoderNode),e.onstart()})).catch((function(t){throw e.state="inactive",t}))):Promise.resolve()},n.prototype.stop=function(){var e=this;return"paused"===this.state||"recording"===this.state?(this.state="inactive",this.recordingGainNode.connect(this.encoderNode),this.monitorGainNode.disconnect(),this.clearStream(),new Promise((function(t){e.encoder.addEventListener("message",(function o(n){"done"===n.data.message&&(e.encoder.removeEventListener("message",o),t())})),e.encoder.start&&e.encoder.start(),e.encoder.postMessage({command:"done"})}))):Promise.resolve()},n.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},n.prototype.streamPage=function(e){this.ondataavailable(e)},n.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop()},n.prototype.ondataavailable=function(){},n.prototype.onpause=function(){},n.prototype.onresume=function(){},n.prototype.onstart=function(){},n.prototype.onstop=function(){},e.exports=n}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function("return this")()}catch(e){"object"==typeof window&&(o=window)}e.exports=o}])}}]); +//# sourceMappingURL=10.0f031682109823f02d37.js.map \ No newline at end of file diff --git a/dist/10.af7bed9ae098996acabc.js.map b/dist/10.0f031682109823f02d37.js.map similarity index 99% rename from dist/10.af7bed9ae098996acabc.js.map rename to dist/10.0f031682109823f02d37.js.map index 81cff2fb8..cee8ad83a 100644 --- a/dist/10.af7bed9ae098996acabc.js.map +++ b/dist/10.0f031682109823f02d37.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./node_modules/opus-recorder/dist/recorder.min.js"],"names":["self","module","exports","e","t","o","n","i","l","call","m","c","d","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","__esModule","create","bind","default","prototype","hasOwnProperty","p","s","AudioContext","webkitAudioContext","this","arguments","length","isRecordingSupported","Error","state","config","assign","bufferLength","encoderApplication","encoderFrameSize","encoderPath","encoderSampleRate","maxFramesPerPage","mediaTrackConstraints","monitorGain","numberOfChannels","recordingGain","resampleQuality","streamPages","wavBitDepth","sourceNode","context","encodedSamplePosition","initAudioContext","initialize","initWorklet","then","initEncoder","navigator","mediaDevices","getUserMedia","WebAssembly","version","clearStream","stream","getTracks","forEach","stop","close","monitorGainNode","disconnect","recordingGainNode","encoder","encoderNode","postMessage","command","Promise","resolve","audioContext","encodeBuffers","getChannelData","buffers","createGain","setMonitorGain","setRecordingGain","audioWorklet","AudioWorkletNode","numberOfOutputs","port","console","log","createScriptProcessor","onaudioprocess","inputBuffer","connect","destination","Worker","initSourceNode","audio","createMediaStreamSource","initWorker","streamPage","storePage","recordedPages","totalLength","addEventListener","data","message","samplePosition","page","removeEventListener","finish","start","keys","indexOf","getOwnPropertySymbols","propertyIsEnumerable","originalSampleRate","sampleRate","wavSampleRate","addModule","pause","onpause","resume","onresume","gain","setTargetAtTime","currentTime","all","onstart","catch","push","ondataavailable","Uint8Array","reduce","set","onstop","Function","window"],"mappings":"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","file":"10.af7bed9ae098996acabc.js","sourcesContent":["!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Recorder=t():e.Recorder=t()}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function o(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,o),i.l=!0,i.exports}return o.m=e,o.c=t,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},o.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var i in e)o.d(n,i,function(t){return e[t]}.bind(null,i));return n},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\"a\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\"\",o(o.s=0)}([function(e,t,o){\"use strict\";(function(t){function o(e,t){if(null==e)return{};var o,n,i=function(e,t){if(null==e)return{};var o,n,i={},r=Object.keys(e);for(n=0;n=0||(i[o]=e[o]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(i[o]=e[o])}return i}var n=t.AudioContext||t.webkitAudioContext,i=function e(){var t=this,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!e.isRecordingSupported())throw new Error(\"Recording is not supported in this browser\");this.state=\"inactive\",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:\"encoderWorker.min.js\",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,wavBitDepth:16,sourceNode:{context:null}},o),this.encodedSamplePosition=0,this.initAudioContext(),this.initialize=this.initWorklet().then((function(){return t.initEncoder()}))};i.isRecordingSupported=function(){var e=t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia;return n&&e&&t.WebAssembly},i.version=\"8.0.3\",i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){return e.stop()})):this.stream.stop())},i.prototype.close=function(){return this.monitorGainNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode&&this.sourceNode.disconnect(),this.clearStream(),this.encoder&&(this.encoderNode.disconnect(),this.encoder.postMessage({command:\"close\"})),this.config.sourceNode.context?Promise.resolve():this.audioContext.close()},i.prototype.encodeBuffers=function(e){if(\"recording\"===this.state){for(var t=[],o=0;o=0||(i[o]=e[o]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(i[o]=e[o])}return i}var n=t.AudioContext||t.webkitAudioContext,i=function e(){var t=this,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!e.isRecordingSupported())throw new Error(\"Recording is not supported in this browser\");this.state=\"inactive\",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:\"encoderWorker.min.js\",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,wavBitDepth:16,sourceNode:{context:null}},o),this.encodedSamplePosition=0,this.initAudioContext(),this.initialize=this.initWorklet().then((function(){return t.initEncoder()}))};i.isRecordingSupported=function(){var e=t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia;return n&&e&&t.WebAssembly},i.version=\"8.0.3\",i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){return e.stop()})):this.stream.stop())},i.prototype.close=function(){return this.monitorGainNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode&&this.sourceNode.disconnect(),this.clearStream(),this.encoder&&(this.encoderNode.disconnect(),this.encoder.postMessage({command:\"close\"})),this.config.sourceNode.context?Promise.resolve():this.audioContext.close()},i.prototype.encodeBuffers=function(e){if(\"recording\"===this.state){for(var t=[],o=0;odiv{width:100% !important;height:100% !important}#MediaViewer.zoomed .VideoPlayer video{max-height:none !important}@media (min-width: 601px){.VideoPlayer{z-index:1}}@media (max-width: 600px){.VideoPlayer{overflow:visible}}@media (max-height: 640px){.VideoPlayer{margin-bottom:1.75rem}.has-footer .VideoPlayer{margin-bottom:0}}.VideoPlayer video{display:block;max-height:calc(100vh - 8.25rem);margin:auto;object-fit:contain;outline:none;width:100%;height:100%;background:no-repeat 50% 50%;background-size:contain}@media (max-height: 640px){.VideoPlayer video{max-height:calc(100vh - 10rem)}}.has-footer .VideoPlayer video{max-height:calc(100vh - 15rem)}@media (max-height: 640px){.has-footer .VideoPlayer video{max-height:calc(100vh - 10rem)}}.VideoPlayer .play-button{position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);width:3.25rem;height:3.25rem;background-color:rgba(0,0,0,0.5) !important}body:not(.animation-level-0) .VideoPlayer .play-button{transition:opacity .3s ease !important}.VideoPlayer .play-button .icon-play{font-size:1.75rem;position:relative;left:.125rem}.VideoPlayer .spinner-container{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.VideoPlayer .spinner-container .buffering{background:rgba(0,0,0,0.25);color:#fff;font-size:0.75rem;position:absolute;left:0.1875rem;top:0.1875rem;z-index:1;padding:0 0.375rem;border-radius:0.75rem;line-height:1.125rem}.VideoPlayer .spinner-container .ProgressSpinner{cursor:pointer}\n",".ZoomControls{position:absolute;bottom:1.25rem;left:50%;background:rgba(0,0,0,0.5);border-radius:var(--border-radius-default);width:100%;height:3.375rem;max-width:274px;transform:translate3d(-50%, 0, 10px);transition:opacity .3s ease-in;pointer-events:none}.ZoomControls.open{z-index:var(--z-media-viewer);pointer-events:all}.ZoomControls .zoom-out,.ZoomControls .zoom-in{position:absolute;top:0.4375rem;width:2.5rem;height:2.5rem;color:#fff}.ZoomControls .zoom-out i,.ZoomControls .zoom-in i{font-size:1.5rem}.ZoomControls .zoom-out{left:.5rem}.ZoomControls .zoom-in{right:.5rem}.ZoomControls .seekline{position:absolute;left:3.25rem;right:3.25rem;top:1.125rem;height:1rem}.ZoomControls .seekline-track{position:absolute;top:50%;left:-.25rem;right:-.25rem;height:2px;transform:translateY(-50%);background-color:rgba(255,255,255,0.5);border-radius:var(--border-radius-default)}.ZoomControls .seekline-played,.ZoomControls .seekline-input{position:absolute;top:0;left:0;height:100%;border-radius:var(--border-radius-default)}.ZoomControls .seekline-played{background:#fff;transition:width 200ms}.ZoomControls .seekline-played::after{content:'';position:absolute;width:.75rem;height:.75rem;border-radius:50%;background-color:var(--color-white);right:0;top:50%;transform:translate(0.325rem, -50%)}.ZoomControls .seekline-input{width:100%;height:1rem;top:-.375rem;opacity:0;margin:0;padding:0;cursor:pointer;overflow:hidden}.ZoomControls .seekline-input::-webkit-slider-thumb{margin-top:-2rem}\n",".pan-wrapper,.pan-container{position:relative;width:100%;height:100%}.pan-wrapper{cursor:move;-webkit-user-select:none;user-select:none}.pan-container{transition:transform .2s ease-in}.pan-wrapper.move .pan-container{transition:none}.zoomed .pan-container{position:fixed;top:0;left:0}\n","#MediaViewer{position:fixed;top:0;left:0;width:100vw;height:100%;background:rgba(0,0,0,0.9);color:#fff;z-index:var(--z-media-viewer);padding:0.5rem 0;display:grid;grid-template-columns:auto;grid-template-rows:2.75rem 1fr;grid-column-gap:0;grid-row-gap:0;justify-items:stretch;align-items:center}#MediaViewer:not(.shown){display:block !important;transform:scale(0)}body.ghost-animating #MediaViewer>.pan-wrapper,body.ghost-animating #MediaViewer>.Transition,body.ghost-animating #MediaViewer>button{display:none}body.animation-level-2 #MediaViewer{transition-duration:.3s !important}#MediaViewer:not(.open) .SenderInfo,#MediaViewer .closing .SenderInfo{pointer-events:none;transition:none}#MediaViewer.zoomed .navigation{display:none}#MediaViewer.zoomed .media-viewer-head{z-index:2}#MediaViewer.zoomed .media-viewer-content{position:fixed;top:0;left:0;width:100vw;height:100vh;padding:0;z-index:1}#MediaViewer .media-viewer-head{display:flex;grid-area:1 / 1 / 2 / -2;padding:0 1.25rem;position:relative;z-index:var(--z-media-viewer-head);min-width:0}#MediaViewer .media-viewer-head>.Transition{width:100%;min-width:0}@media (max-width: 600px){#MediaViewer .media-viewer-head{padding:0 0.5rem}#MediaViewer .media-viewer-head .media-viewer-close{margin-right:1.5rem}}#MediaViewer>.Transition,#MediaViewer>.pan-wrapper{grid-area:1 / 1 / -1 / -1}#MediaViewer>.Transition,#MediaViewer>.pan-wrapper .Transition{position:relative;justify-self:center;text-align:center;width:100%;height:100%;display:flex;align-items:center;overflow:hidden}#MediaViewer .media-viewer-content{position:relative;z-index:1;padding:3.25rem 0;height:100%;display:inline-flex;justify-content:center;align-items:center}#MediaViewer .media-viewer-content.has-footer{padding:7rem 0}@media (min-width: 600px){#MediaViewer .media-viewer-content.has-footer{min-width:600px}}@media (max-height: 640px){#MediaViewer .media-viewer-content.has-footer{padding:4rem 0}}#MediaViewer .media-viewer-content.has-footer>img{max-height:calc(100vh - 15rem)}@media (max-height: 640px){#MediaViewer .media-viewer-content.has-footer>img{max-height:calc(100vh - 10rem)}}#MediaViewer .media-viewer-content .thumbnail{position:relative}#MediaViewer .media-viewer-content .thumbnail img{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}#MediaViewer .media-viewer-content>img{max-width:100vw;max-height:calc(100vh - 8.25rem);object-fit:contain;transition:transform .2s}#MediaViewer .media-viewer-content .spinner-wrapper{max-width:100vw;margin:auto}#MediaViewer .media-viewer-content .Spinner{margin:auto}#MediaViewer .navigation{position:fixed;top:4rem;width:10vw;bottom:0;border:none;padding:0;margin:0;-webkit-appearance:none;appearance:none;background:transparent no-repeat;background-size:1.25rem;opacity:0;transition:opacity .15s;outline:none;cursor:pointer;z-index:1}@media (max-width: 600px){#MediaViewer .navigation{width:20vw}}#MediaViewer .navigation:hover,.is-touch-env #MediaViewer .navigation{opacity:1}#MediaViewer .navigation.prev{left:0;background-image:url(media_navigation_previous.11f3cfece8fead5a78e6349db2545210.svg);background-position:1.25rem calc(50% - 2rem)}#MediaViewer .navigation.prev[dir=rtl]{left:auto;right:0;transform:scaleX(-1)}#MediaViewer .navigation.next{right:0;background-image:url(media_navigation_next.3d6e264d21e73ad725738beb8e9dbbb8.svg);background-position:calc(100% - 1.25rem) calc(50% - 2rem)}#MediaViewer .navigation.next[dir=rtl]{left:0;right:auto;transform:scaleX(-1)}#MediaViewer .navigation.inline{top:calc(50% - 3rem);bottom:unset;height:6rem;background-position-y:center}@media (max-width: 600px){#MediaViewer .navigation.inline{opacity:0;transition:opacity .15s ease-in;pointer-events:none}.video-controls-visible #MediaViewer .navigation.inline{opacity:1;pointer-events:all}}.ghost{position:absolute;z-index:var(--z-media-viewer);will-change:transform, opacity;overflow:hidden;border-radius:0;transition:transform .2s ease, opacity .2s ease}.ghost.rounded-corners{border-radius:var(--border-radius-messages)}.ghost.circle{border-radius:50%}body.is-ios .ghost{transition:transform .2s ease, opacity .2s ease, border-radius .2s ease !important}.ghost img,.ghost video{width:100%;height:100%;user-select:none;-webkit-user-select:none;object-fit:cover}\n",".ForwardPicker{z-index:var(--z-media-viewer)}.ForwardPicker .modal-dialog{height:70%;max-width:25rem}@media (max-width: 600px){.ForwardPicker .modal-dialog{height:90%}}.ForwardPicker .modal-header{display:flex;align-items:center;padding:0.25rem 0.5rem}.ForwardPicker .modal-header .Button{margin-right:0.5rem}.ForwardPicker .modal-header .input-group{margin:0}.ForwardPicker .modal-header .form-control{border:none;box-shadow:none !important;height:2.75rem;padding:0.5rem;font-size:1.25rem;line-height:1.75rem;unicode-bidi:plaintext}.ForwardPicker .modal-content{padding:0;overflow:hidden;display:flex;flex-direction:column}.ForwardPicker .modal-content .picker-list{height:100%;overflow-x:hidden;overflow-y:auto;padding:0 1rem 1rem}.ForwardPicker .no-results{height:100%;margin:0;padding:1rem 1rem;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary)}@media (max-width: 600px){.ForwardPicker .ListItem.chat-item-clickable:not(.force-rounded-corners){margin:0}.ForwardPicker .ListItem.chat-item-clickable:not(.force-rounded-corners) .ListItem-button{border-radius:0}}\n","#Dialogs{position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:var(--z-modal)}\n",".CalendarModal .modal-dialog{max-width:26.25rem}.CalendarModal .modal-dialog .modal-content{padding:.375rem 1rem 1rem}.CalendarModal .timepicker{display:flex;align-items:center;justify-content:center;margin-bottom:1.5rem}.CalendarModal .timepicker .form-control{max-width:5rem;text-align:center}.CalendarModal .timepicker .form-control:first-child{margin-right:1rem}.CalendarModal .timepicker .form-control:last-child{margin-left:1rem}.CalendarModal .footer{display:flex;justify-content:flex-end;flex-direction:column}.CalendarModal .footer .Button{text-transform:none}.CalendarModal .footer .Button+.Button{margin-top:.5rem}.CalendarModal .month-selector{display:flex;align-items:center}.CalendarModal .month-selector h4{flex:1;margin:0 0 0 1.25rem;font-size:1.25rem}@media (max-width: 600px){.CalendarModal .month-selector h4{margin-left:.75rem}}.CalendarModal .month-selector h4 ~ .Button{color:var(--color-primary)}.CalendarModal .month-selector .Button.hidden{opacity:0.5;pointer-events:none}.CalendarModal .day-button{position:relative;border-radius:4rem;outline:none !important;font-weight:500;margin:.125rem .625rem}@media (max-width: 600px){.CalendarModal .day-button{margin:.25rem .375rem}}.CalendarModal .day-button.weekday{margin-bottom:0;height:1rem}.CalendarModal .day-button.clickable{cursor:pointer}.CalendarModal .day-button.clickable:hover{background-color:var(--color-interactive-element-hover)}.CalendarModal .day-button.clickable.selected{background-color:var(--color-primary);color:white}.CalendarModal .day-button.disabled{opacity:0.25;pointer-events:none}.CalendarModal .day-button::before{content:\"\";display:block;padding-top:100%}.CalendarModal .day-button span{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:0.875rem}.CalendarModal .calendar-wrapper{display:flex;align-items:center;justify-content:center;min-height:17rem;margin:1.5rem -0.5rem 0.5rem}.CalendarModal .calendar-grid{display:grid;grid-template-columns:repeat(7, 1fr);width:100%}\n",".MessageSelectToolbar{position:absolute;bottom:0.5rem;left:0.5rem;right:0.5rem;width:auto;z-index:20;justify-content:center;margin:0;opacity:1}.mask-image-disabled .MessageSelectToolbar::before{left:auto !important;right:auto !important}.no-composer .MessageSelectToolbar{width:100%}@media (min-width: 601px){.MessageSelectToolbar{left:1rem;right:1rem;bottom:1.25rem}.no-composer .MessageSelectToolbar{top:-4.75rem}}.MessageSelectToolbar-inner{transform:scaleX(1);transition:transform var(--select-transition),opacity var(--select-transition)}.MessageSelectToolbar .MessageSelectToolbar-inner{transform:scaleX(1) translateX(0)}.no-composer .unpin-button-container+.MessageSelectToolbar,.no-composer .messaging-disabled+.MessageSelectToolbar{top:auto}body.animation-level-0 .MessageSelectToolbar{transition:none !important}.MessageSelectToolbar:not(.shown){opacity:0;pointer-events:none}.MessageSelectToolbar:not(.shown)-inner{transform:scaleX(var(--toolbar-hidden-scale, 1))}.MessageSelectToolbar:not(.shown).with-composer .MessageSelectToolbar-inner{transform:scaleX(var(--toolbar-hidden-scale, 1)) translateX(var(--toolbar-translate-x, 0))}.MessageSelectToolbar:not(.shown):not(.with-composer) .MessageSelectToolbar-inner{transform:scaleX(var(--toolbar-unpin-hidden-scale)) translateX(0)}.MessageSelectToolbar::before{z-index:-1;max-width:32rem;width:100%;left:auto;right:auto}.MessageSelectToolbar-inner{width:100%;max-width:32rem;display:flex;align-items:center;padding:0.25rem;background:var(--color-background);border-radius:var(--border-radius-messages);box-shadow:0 1px 2px var(--color-default-shadow);font-weight:500}@media (max-width: 600px){.MessageSelectToolbar-inner{padding:0;max-width:none}}.MessageSelectToolbar-inner>.Button{width:3rem;height:3rem}@media (max-width: 600px){.MessageSelectToolbar-inner>.Button{width:2.875rem;height:2.875rem}}.MessageSelectToolbar-count{margin-left:1rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex-grow:1}@media (max-width: 600px){.MessageSelectToolbar-count{margin-right:0.5rem}}.MessageSelectToolbar-actions{margin-left:auto;display:flex}.MessageSelectToolbar-actions .MenuItem{padding:0.6875rem;border-radius:50%}.MessageSelectToolbar-actions .MenuItem i{margin-right:0}.MessageSelectToolbar-actions .MenuItem .item-text{display:none}\n",".RecentContacts .Loading{min-height:75vh}.RecentContacts .top-peers-section{padding:.5rem 1rem}.RecentContacts .top-peers{height:6rem;margin:0 -1rem;overflow-x:auto;overflow-y:hidden;white-space:nowrap;scrollbar-width:none;scrollbar-color:rgba(0,0,0,0)}.RecentContacts .top-peers::-webkit-scrollbar{height:0}.RecentContacts .top-peers::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0)}.RecentContacts .top-peer-item{display:inline-block;width:4.5rem;height:6rem;padding:0.625rem 0.25rem;margin-left:0.5rem;border-radius:var(--border-radius-default);cursor:pointer;position:relative;overflow:hidden}.RecentContacts .top-peer-item:first-child{margin-left:0.125rem}.RecentContacts .top-peer-item:last-child{margin-right:0.125rem}.RecentContacts .top-peer-item .Avatar{margin:0 auto 0.375rem}.RecentContacts .top-peer-item:hover{background:var(--color-chat-hover)}.RecentContacts .top-peer-item .top-peer-name{text-align:center;white-space:nowrap;font-size:0.75rem;overflow:hidden;text-overflow:ellipsis}.RecentContacts .top-peer-item .top-peer-name .emoji-small{width:1rem;height:1rem;background-size:1rem;margin-inline-end:1px;vertical-align:-3px}.RecentContacts .recent-chats-header{display:flex;align-items:center}.RecentContacts .recent-chats-header .Button{margin-left:auto}.RecentContacts .recent-chats-header[dir=rtl] .Button{margin-left:0;margin-right:auto}\n",".ChatMessage:first-child{margin-top:.5rem}.ChatMessage:hover .Avatar.online::after,.ChatMessage.selected .Avatar.online::after{border-color:var(--color-chat-hover)}.ChatMessage .ListItem-button{padding:.25rem .5rem}.ChatMessage .info .title{flex-grow:1}.ChatMessage .info h3{font-size:1rem;width:auto}.ChatMessage .info .subtitle{color:var(--color-text-secondary)}.ChatMessage .info .subtitle .matching-text-highlight{color:var(--color-text);background:#CAE3F7;border-radius:0.25rem;padding:0 0.125rem}.ChatMessage .info .message{flex-grow:1;color:var(--color-text-secondary);overflow:hidden;text-overflow:ellipsis}.ChatMessage .info .message .sender-name{color:var(--color-text)}.ChatMessage .info .message .sender-name::after{content:': '}.ChatMessage .info .message img{width:1.25rem;height:1.25rem;object-fit:cover;border-radius:.125rem;vertical-align:-.25rem;margin-right:.25rem}.ChatMessage .info .message .icon-play{position:relative;display:inline-block;font-size:.75rem;color:#fff;margin-inline-start:-1.25rem;margin-inline-end:0.5rem;bottom:0.0625rem}.ChatMessage .info-row{display:flex;justify-content:space-between}.ChatMessage[dir=rtl] .subtitle{text-align:right}\n",".DateSuggest{display:flex;height:2rem;flex-direction:row;justify-content:space-between;margin-left:.5rem;margin-bottom:.5rem}.DateSuggest .date-item{display:flex;flex:1 1 auto;min-width:8rem;margin-top:.375rem;cursor:pointer;font-size:.875rem;font-weight:500;color:var(--color-text-secondary)}.DateSuggest .date-item .icon-calendar{font-size:1.25rem;margin-right:.25rem}\n",".LeftSearch{display:flex;flex-direction:column;height:100%;overflow:hidden}.LeftSearch>.Transition{flex:1;overflow:hidden}.LeftSearch .TabList{padding-bottom:1px;z-index:1}.LeftSearch .documents-list{padding:0 1.25rem 1.25rem}.LeftSearch .documents-list .ListItem+.ListItem{margin-top:1.25rem}.LeftSearch .section-heading{position:relative;padding-top:1.25rem;padding-left:1.25rem;margin:0 0 1rem -1.25rem !important;font-weight:500;font-size:.9375rem;color:var(--color-text-secondary)}.LeftSearch .section-heading::before{content:'';position:absolute;width:100%;height:1px;background:var(--color-borders);left:.625rem;top:-1px}.LeftSearch .section-heading[dir=rtl],.LeftSearch .section-heading[dir=auto]{padding-left:0;padding-right:1.25rem;margin:0 -1.25rem 0 1rem !important;text-align:initial}.LeftSearch .section-heading[dir=rtl]::before,.LeftSearch .section-heading[dir=auto]::before{left:auto;right:.625rem}.LeftSearch .LeftSearch .search-section .section-heading,.LeftSearch .RecentContacts .search-section .section-heading{margin-left:-1rem !important;width:calc(100% + 2rem);box-shadow:0 -1px 0 0 var(--color-borders)}.LeftSearch .LeftSearch .search-section .section-heading::before,.LeftSearch .RecentContacts .search-section .section-heading::before{display:none}.LeftSearch .WebLink{display:flex}.LeftSearch .content:not(.with-seekline){align-self:center;min-width:0;flex-grow:1;overflow:hidden;text-overflow:ellipsis;word-break:break-word}.LeftSearch .message-date{font-size:.75rem;color:var(--color-text-secondary);padding-left:1rem;white-space:nowrap}.LeftSearch .media-list{display:grid;padding:.5rem;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.LeftSearch .Audio .duration span{padding:0 .25rem}.LeftSearch .Audio .ProgressSpinner{margin:-.1875rem 0 0 -.1875rem}.LeftSearch .ListItem.search-result .ChatInfo .handle{unicode-bidi:plaintext;color:var(--color-primary);unicode-bidi:plaintext}.LeftSearch .ListItem.search-result .ChatInfo .handle::before{content:'@'}html[lang=ar] .LeftSearch .ListItem.search-result .ChatInfo .handle::before{content:' ،@';margin-inline-end:.25rem}.LeftSearch .ListItem.search-result .ChatInfo .handle::after{content:', ';color:var(--color-text-secondary)}html[lang=ar] .LeftSearch .ListItem.search-result .ChatInfo .handle::after{content:''}.LeftSearch .ListItem.search-result .ChatInfo[dir=rtl] .status{text-align:right}.LeftSearch .ListItem.search-result .ChatInfo[dir=rtl] .status .handle{float:right}.LeftSearch .ListItem.search-result-message .sender-name{color:var(--color-text)}.LeftSearch .ListItem.search-result-message .sender-name::after{content:': ';white-space:pre}@media (max-width: 600px){.LeftSearch .ListItem{margin:0 -0.625rem}}.LeftSearch .search-section{padding:0 1rem 0.5rem}.LeftSearch .search-section .section-heading{color:var(--color-text-secondary);font-size:.9375rem;font-weight:500;margin-bottom:0 !important;padding-top:.875rem}.LeftSearch .search-section .section-heading .Link{float:right;color:var(--color-links);font-weight:400;margin-right:1rem}.LeftSearch .search-section .section-heading .Link:focus,.LeftSearch .search-section .section-heading .Link:hover{color:var(--color-links-hover)}.LeftSearch .search-section .section-heading[dir=rtl] .Link,.LeftSearch .search-section .section-heading[dir=auto] .Link{float:left;margin-left:1rem;margin-right:0}.LeftSearch .search-section .Loading{height:4.5rem;margin-bottom:0.5rem}.LeftSearch .chat-selection{padding-top:.5rem;display:flex;flex-shrink:0;flex-wrap:nowrap;justify-content:space-between;align-items:flex-end;box-shadow:inset 0 -1px 0 0 var(--color-borders);background-color:var(--color-background);-webkit-overflow-scrolling:touch;overflow-x:auto;overflow-y:hidden;scrollbar-color:rgba(0,0,0,0)}.LeftSearch .chat-selection>.PickerSelectedItem{flex:0 0 auto}.LeftSearch .chat-selection>.PickerSelectedItem:last-child{margin-right:auto}.LeftSearch .chat-selection[dir=rtl]>.PickerSelectedItem:last-child{margin-left:auto;margin-right:0}.LeftSearch .NothingFound{height:100%}.LeftSearch [dir=rtl] .message-date{padding-left:0;padding-right:1rem}\n",".CropModal .modal-dialog{width:calc(100% - 2rem);max-width:35rem;height:calc(100% - 1rem);max-height:35rem;position:relative}.CropModal .modal-content,.CropModal #avatar-crop{overflow:hidden}.CropModal .confirm-button{position:absolute;bottom:1rem;right:1rem;box-shadow:0 1px 2px var(--color-default-shadow)}.CropModal #avatar-crop{max-width:25rem;margin:0 auto;position:relative}.CropModal #avatar-crop::before{content:'';display:block;padding-top:100%}.CropModal #avatar-crop .cr-boundary{position:absolute;top:0;left:0;border-radius:var(--border-radius-messages-small)}.CropModal #avatar-crop .cr-viewport{border:none;box-shadow:0 0 2000px 2000px rgba(255,255,255,0.5)}.CropModal #avatar-crop .cr-slider::-webkit-slider-runnable-track{background:var(--color-borders)}.CropModal #avatar-crop .cr-slider::-moz-range-track{background:var(--color-borders)}.CropModal #avatar-crop .cr-slider::-ms-track{background:var(--color-borders)}.CropModal #avatar-crop .cr-slider::-webkit-slider-thumb{background:var(--color-primary);cursor:pointer;transform:scale(1);-webkit-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.CropModal #avatar-crop .cr-slider::-webkit-slider-thumb:hover{transform:scale(1.2)}.CropModal #avatar-crop .cr-slider::-moz-range-thumb{background:var(--color-primary);cursor:pointer;transform:scale(1);-moz-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.CropModal #avatar-crop .cr-slider::-moz-range-thumb:hover{transform:scale(1.2)}.CropModal #avatar-crop .cr-slider::-ms-thumb{background:var(--color-primary);cursor:pointer;transform:scale(1);-ms-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.CropModal #avatar-crop .cr-slider::-ms-thumb:hover{transform:scale(1.2)}\n",".AvatarEditable label{margin-left:auto;margin-right:auto;width:7.5rem;height:7.5rem;margin-bottom:2rem;display:flex !important;align-items:center;justify-content:center;background-color:var(--color-primary);border-radius:50%;color:white;font-size:3rem;cursor:pointer;position:relative;overflow:hidden;outline:none !important}.AvatarEditable label input{display:none}.AvatarEditable label img{position:absolute;top:0;left:0;width:100%;height:100%}.AvatarEditable label i{transform:scale(1);transition:transform .15s linear;z-index:var(--z-register-add-avatar)}.Transition>div:not(.active) .AvatarEditable label input,.Transition>div:not(.active) .AvatarEditable label i,.Transition>div:not(.active) .AvatarEditable label::after,body.animating-right-column .AvatarEditable label input,body.animating-right-column .AvatarEditable label i,body.animating-right-column .AvatarEditable label::after{display:none !important}.Transition>div:not(.active) .AvatarEditable label img,body.animating-right-column .AvatarEditable label img{position:static !important}.AvatarEditable label:hover i{transform:scale(1.2)}.AvatarEditable label.filled{background-color:var(--color-background)}.AvatarEditable label.filled::after{content:'';display:block;position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4)}.AvatarEditable label.disabled{pointer-events:none}.AvatarEditable label.disabled i{display:none}.AvatarEditable label.disabled::after{display:none}\n",".ShowMoreButton{color:var(--text-color) !important;display:flex;align-items:center;text-align:left;text-transform:none;padding-left:.75rem !important;opacity:1 !important}.ShowMoreButton i{font-size:1.5rem;margin-right:2rem;color:var(--color-text-secondary)}.ShowMoreButton .Spinner{top:0.4375rem}\n",".SettingsFoldersChatsPicker{height:calc(100% - var(--header-height))}.SettingsFoldersChatsPicker .picker-header{box-shadow:0 0 2px var(--color-default-shadow)}.SettingsFoldersChatsPicker .picker-header .max-items-reached{margin-bottom:0.5rem;margin-left:0.5rem;flex-grow:1}.SettingsFoldersChatsPicker .picker-header .max-items-reached{color:var(--color-text-secondary)}.SettingsFoldersChatsPicker .picker-list{padding:0 0.5rem 0.5rem}.SettingsFoldersChatsPicker .picker-list .no-results{height:10rem}.SettingsFoldersChatsPicker .ListItem.picker-list-item.chat-type-item .ListItem-button{padding:0.875rem 0.75rem}.SettingsFoldersChatsPicker .ListItem.picker-list-item.chat-item .ListItem-button{padding:0.5rem 0.75rem}.SettingsFoldersChatsPicker .ListItem.picker-list-item .Checkbox{margin-left:auto;padding-left:3.25rem}.SettingsFoldersChatsPicker .ListItem.picker-list-item .chat-type{font-size:1rem;font-weight:400;margin:0}.SettingsFoldersChatsPicker .ListItem.picker-list-item[dir=rtl] .Checkbox{margin-left:0;margin-right:auto;padding-left:0;padding-right:3.25rem}.SettingsFoldersChatsPicker .settings-item-header{margin-left:0.75rem;margin-top:1rem;margin-bottom:0.5rem}.SettingsFoldersChatsPicker .picker-list-divider{margin:0.5rem -0.5rem 0;border-bottom:1px solid var(--color-borders)}\n",".settings-folders-recommended-item{width:100%;display:flex;align-items:center;justify-content:space-between}.settings-folders-list-item .ChatInfo{display:flex;align-items:center}.settings-folders-list-item .ChatInfo .Avatar{margin-left:-0.25rem;margin-right:1.5rem}.settings-folders-list-item .ChatInfo .title{display:flex;justify-content:flex-start;align-items:center}.settings-folders-list-item .ChatInfo .title h3{font-size:1rem;font-weight:500;line-height:1.3125;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:left}.settings-folders-list-item .ChatInfo .status{display:none}.settings-folders-list-item .ChatInfo[dir=rtl] .title h3{text-align:right}.settings-folders-list-item .ListItem-button i{opacity:0.9}.settings-folders-list-item.color-primary .ListItem-button{color:var(--color-primary)}.settings-folders-list-item.color-primary .ListItem-button i{opacity:1;color:inherit}.settings-folders-list-item[dir=rtl] .Avatar{margin-left:1.5rem;margin-right:-0.25rem}.settings-item .ShowMoreButton{margin:0 -1rem;width:calc(100% + 2rem);padding-left:1rem !important}\n",".RangeSlider{--slider-color: var(--color-primary);margin-bottom:1rem}.RangeSlider.disabled{pointer-events:none;--slider-color: var(--color-text-secondary)}.RangeSlider .slider-top-row{display:flex;justify-content:space-between;margin-bottom:0.625rem}.RangeSlider .slider-top-row .value{flex-shrink:0;margin-left:1rem;color:var(--color-text-secondary)}.RangeSlider .slider-top-row[dir=rtl] .value{margin-left:0;margin-right:1rem}.RangeSlider .slider-main{position:relative;z-index:1}.RangeSlider .slider-main::before{content:'';position:absolute;width:100%;left:0;top:0.3125rem;height:0.125rem;background-color:var(--color-borders);border-radius:0.125rem;opacity:0.5;z-index:-1}.RangeSlider .slider-fill-track{position:absolute;width:100%;left:0;top:0.3125rem;height:0.125rem;background-color:var(--slider-color);border-radius:0.125rem;pointer-events:none}.RangeSlider input[type=\"range\"]{-webkit-appearance:none;display:block;width:100%;height:0.75rem;margin-bottom:0.5rem;background:transparent}.RangeSlider input[type=\"range\"]:focus{outline:none}.RangeSlider input[type=\"range\"]::-ms-track{width:100%;cursor:pointer;background:transparent;border-color:transparent;color:transparent}.RangeSlider input[type=\"range\"]::-webkit-slider-thumb{-webkit-appearance:none}.RangeSlider input[type=\"range\"]::-webkit-slider-thumb{background:var(--slider-color);border:none;height:0.75rem;width:0.75rem;border-radius:50%;cursor:pointer;transform:scale(1);-webkit-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.RangeSlider input[type=\"range\"]::-webkit-slider-thumb:hover{transform:scale(1.2)}.RangeSlider input[type=\"range\"]::-moz-range-thumb{background:var(--slider-color);border:none;height:0.75rem;width:0.75rem;border-radius:50%;cursor:pointer;transform:scale(1);-moz-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.RangeSlider input[type=\"range\"]::-moz-range-thumb:hover{transform:scale(1.2)}.RangeSlider input[type=\"range\"]::-ms-thumb{background:var(--slider-color);border:none;height:0.75rem;width:0.75rem;border-radius:50%;cursor:pointer;transform:scale(1);-ms-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.RangeSlider input[type=\"range\"]::-ms-thumb:hover{transform:scale(1.2)}.RangeSlider .slider-options{display:grid;grid-template-rows:auto;grid-auto-columns:1fr;grid-auto-flow:column}.RangeSlider .slider-option{font-size:0.825rem;text-align:center;cursor:pointer;color:var(--color-text-secondary);transition:color .2s ease}.RangeSlider .slider-option:hover,.RangeSlider .slider-option.active{color:var(--color-text)}.RangeSlider .slider-option.active{font-weight:500}.RangeSlider .slider-option:first-child{text-align:left}.RangeSlider .slider-option:last-child{text-align:right}\n",".settings-item .SettingsStickerSet.ListItem{margin-bottom:.5rem}.SettingsStickerSet .StickerButton,.SettingsStickerSet .Button{width:3rem;height:3rem;margin:0 .5rem 0 0;padding:0;flex:0 0 3rem}.SettingsStickerSet img{max-width:100%;max-height:100%}.SettingsStickerSet .multiline-menu-item{display:flex;flex-direction:column;justify-content:center}.SettingsStickerSet[dir=rtl] .StickerButton,.SettingsStickerSet[dir=rtl] .Button{margin:0 0 0 .5rem}\n",".WallpaperTile{height:0;padding-bottom:100%;cursor:pointer;position:relative}.WallpaperTile .media-inner,.WallpaperTile::after{position:absolute;left:0;top:0;width:100%;height:100%}.WallpaperTile .media-inner{overflow:hidden;transform:scale(1);transition:transform .15s ease}.WallpaperTile .media-inner img,.WallpaperTile .media-inner canvas{position:absolute;left:0;top:0;width:100%;height:100%;object-fit:cover}.WallpaperTile::after{content:\"\";display:block;border:2px solid var(--color-primary);opacity:0;transition:opacity .15s ease}.WallpaperTile.selected::after{opacity:1}.WallpaperTile.selected .media-inner{transform:scale(0.9)}.WallpaperTile .spinner-container{height:100%;display:flex;align-items:center;justify-content:center}\n",".SettingsGeneralBackground .settings-wallpapers{display:grid;padding:.5rem;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.SettingsGeneralBackground .Loading{height:auto !important;margin-top:5rem}\n",".SettingsGeneralBackgroundColor:not(.is-dragging) .handle{transition:transform 300ms ease}.SettingsGeneralBackgroundColor .color-picker,.SettingsGeneralBackgroundColor .hue-picker{position:relative}.SettingsGeneralBackgroundColor .color-picker{margin-top:1rem;height:12rem;touch-action:none}.SettingsGeneralBackgroundColor .hue-picker{margin:2rem 0;height:0.5rem}.SettingsGeneralBackgroundColor canvas{display:block;width:100%;height:100%;border-radius:var(--border-radius-default);cursor:pointer}.SettingsGeneralBackgroundColor .handle{position:absolute;top:-0.75rem;left:-0.75rem;width:1.5rem;height:1.5rem;border:0.125rem solid var(--color-white);border-radius:0.75rem;cursor:grab}.SettingsGeneralBackgroundColor .hue-picker .handle{top:-0.5rem}.SettingsGeneralBackgroundColor .tools{margin-bottom:0.625rem;display:flex}.SettingsGeneralBackgroundColor .tools .input-group{margin-bottom:0}.SettingsGeneralBackgroundColor .tools .input-group[dir=rtl] label{transform:scale(0.75) translate(1.25rem, -2.25rem)}.SettingsGeneralBackgroundColor .tools .input-group:first-child{margin-right:0.5rem}.SettingsGeneralBackgroundColor .tools .input-group:last-child{margin-left:0.5rem}.SettingsGeneralBackgroundColor .predefined-colors{display:grid;padding:.5rem;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.SettingsGeneralBackgroundColor .predefined-colors div{cursor:pointer;box-shadow:inset 0 0 0 0 var(--color-background);transition:box-shadow 300ms ease}.SettingsGeneralBackgroundColor .predefined-colors div.active{border:0.125rem solid var(--color-primary);box-shadow:inset 0 0 0 0.3125rem var(--color-background)}.SettingsGeneralBackgroundColor .predefined-colors div:before{display:block;content:\"\";width:100%;padding-top:100%;pointer-events:none}\n","#monkey{position:relative;display:block;margin-left:auto;margin-right:auto;width:7.5rem;height:7.5rem;margin-bottom:1.75rem}@media (min-width: 600px) and (min-height: 450px){#monkey{width:10rem;height:10rem;margin-bottom:2.5rem}}#monkey.big{width:10rem;height:10rem}#monkey .AnimatedSticker{position:absolute;left:0;top:0;width:100%;height:100%}#monkey .AnimatedSticker.hidden{display:none}#monkey .monkey-preview{width:100%;height:100%;background-size:100%;background:url(monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg) center}\n","#Settings{height:100%}#Settings>div{display:flex;flex-direction:column;overflow:hidden}.settings-main-header{display:flex;flex-grow:1;justify-content:space-between;align-items:center}.settings-more-menu .bubble{width:auto}.settings-more-menu .bubble .MenuItem button{padding-left:1rem !important;padding-right:2rem !important}.settings-content{background:var(--color-background);height:calc(100% - var(--header-height));overflow-y:auto}.settings-content.infinite-scroll{display:flex;flex-direction:column}.settings-content.infinite-scroll>.custom-scroll{flex:1 1 auto;height:auto}.settings-content #monkey{margin-top:.5rem;margin-bottom:1rem}.settings-content .AnimatedEmoji{margin-top:.5rem;margin-bottom:1.5rem}.settings-content-header{display:flex;flex-direction:column;align-items:center;padding:0 1.5rem 1rem;text-align:center}.settings-content-header .input-group{width:100%}.settings-content-icon{width:5rem;height:5rem;margin-bottom:2.5rem;position:relative}.settings-content-icon .AnimatedSticker{position:absolute;left:0;top:0;width:100%;height:100%}.settings-content-icon .AnimatedSticker.hidden{display:none}.settings-main-menu{padding:0 0.5rem 1rem}.settings-current-user{margin-bottom:1.125rem;text-align:center}.settings-current-user .Avatar{margin:0 auto 1.5rem}.settings-current-user .name{display:flex;justify-content:center;align-items:center;font-weight:500;font-size:1.5rem;line-height:2rem;margin:0}.settings-current-user .name .VerifiedIcon{margin-left:0.25rem;margin-top:0.1rem}.settings-current-user .phone{font-size:0.875rem;color:#868e96;margin:0}.settings-item{border-top:1px solid var(--color-borders);padding:1.5rem 1.5rem 1rem}.settings-item.no-border{border-top:none}.settings-item-header{font-size:1rem;color:var(--color-text-secondary);margin-bottom:2rem;position:relative}.settings-item-header[dir=rtl]{text-align:right}.settings-item-description{font-size:0.875rem;color:var(--color-text-secondary);margin-top:-0.5rem;margin-bottom:1.5rem}.settings-content.two-fa .settings-item-description{font-size:1rem}.settings-item-description[dir=rtl]{text-align:right;unicode-bidi:plaintext}.settings-item-description-larger{font-size:1rem;line-height:1.3125rem;color:var(--color-text-secondary);margin-top:2rem;margin-bottom:0.75rem}.settings-item-description-larger[dir=rtl]{text-align:right}.settings-item .ListItem{margin:0 -1rem 1rem}.settings-item .ListItem:last-child{margin-bottom:0}.settings-item .ListItem .multiline-menu-item{white-space:initial}.settings-item .ListItem .multiline-menu-item.full-size{width:100%}.settings-item .ListItem .multiline-menu-item .date{float:right;font-size:0.75rem;margin-left:1rem;color:var(--color-text-secondary)}.settings-item .ListItem .multiline-menu-item .title,.settings-item .ListItem .multiline-menu-item .subtitle{display:block;text-align:left}.settings-item .ListItem .multiline-menu-item .title{line-height:1.25rem}.settings-item .ListItem .multiline-menu-item .subtitle{font-size:0.875rem;line-height:1.5rem;color:var(--color-text-secondary)}.settings-item .ListItem .multiline-menu-item .subtitle+.subtitle{margin-top:-0.25rem}.settings-item .ListItem .multiline-menu-item .subtitle.black{color:var(--color-text)}.settings-item .ListItem .multiline-menu-item .subtitle.tight{line-height:1.3125rem;margin-bottom:.1875rem}.settings-item .ListItem.destructive .ListItem-button{color:var(--color-error)}.settings-item .ListItem.destructive .ListItem-button i{color:inherit}.settings-item .ListItem.blocked-list-item{margin-bottom:0.5rem}.settings-item .ListItem.blocked-list-item .ListItem-button{align-items:center;text-align:left;padding:0.5rem}.settings-item .ListItem.blocked-list-item .Avatar{width:3rem;height:3rem;margin-right:1rem}.settings-item .ListItem.blocked-list-item .contact-name{font-size:1rem;line-height:1rem;margin-bottom:0.25rem;font-weight:500}.settings-item .ListItem.blocked-list-item .contact-phone{font-size:0.875rem;line-height:1rem;color:var(--color-text-secondary)}.settings-item .ListItem[dir=rtl] .multiline-menu-item .title,.settings-item .ListItem[dir=rtl] .multiline-menu-item .subtitle{text-align:right}.settings-item .ListItem[dir=rtl] .multiline-menu-item .date{float:left;margin-left:0;margin-right:1rem}.settings-item .RangeSlider{margin-bottom:1.0625rem}.settings-item .Checkbox,.settings-item .radio-group{margin:0 -1rem 0.5rem}.settings-item .radio-group .Radio:last-child{margin-bottom:0}.settings-item .Radio+.Radio,.settings-item .Checkbox+.Checkbox{margin-top:2rem}.settings-fab-wrapper{height:calc(100% - var(--header-height));position:relative;overflow:hidden}.settings-fab-wrapper .settings-content{height:100%}.settings-fab-wrapper .FloatingActionButton{right:1.5rem}.settings-edit-profile{padding:0 1.5rem}.username-link{color:var(--color-links)}\n",".NewChat{height:100%;overflow:hidden;position:relative}.NewChat-inner{height:calc(100% - var(--header-height));overflow:hidden}.NewChat-inner.step-2{padding:0 1.25rem;display:flex;flex-direction:column}.NewChat-inner.step-2 .note,.NewChat-inner.step-2 .error{font-size:0.875rem;line-height:1.25rem;margin:1.5rem 0.25rem}.NewChat-inner.step-2 .error{color:var(--color-error)}.NewChat-inner.step-2 .note{margin-top:-0.5625rem;color:var(--color-text-secondary)}.NewChat-inner.step-2 .chat-members-heading{color:var(--color-text-secondary);font-size:1rem;font-weight:500;margin:1rem 0.25rem}.NewChat-inner.step-2 .chat-members-list{margin:0 -1.25rem;padding:0 1rem 1rem;overflow-x:hidden;flex-grow:1}\n",".ArchivedChats{height:100%;overflow:hidden}.ArchivedChats .chat-list{height:calc(100% - var(--header-height))}\n",".MessageContextMenu{position:absolute;font-size:1rem}.MessageContextMenu .bubble{transform:scale(0.5);transition:opacity 0.15s cubic-bezier(0.2, 0, 0.2, 1),transform 0.15s cubic-bezier(0.2, 0, 0.2, 1) !important}.MessageContextMenu .backdrop{position:absolute;touch-action:none}\n",".StickerSetModal .modal-dialog{width:26.25rem;max-width:100%}@media (max-width: 600px){.StickerSetModal .modal-dialog{width:18.875rem}}.StickerSetModal .modal-header{padding:0.5rem 1rem}.StickerSetModal .modal-content{text-align:center;padding:0}.StickerSetModal .stickers{position:relative;width:100%;height:19rem;max-height:50vh;overflow-y:auto;padding:0 0.25rem;text-align:left}.StickerSetModal .button-wrapper{padding:0.5rem 0;border-top:1px solid var(--color-borders);box-shadow:0 0 2px var(--color-default-shadow)}.StickerSetModal .button-wrapper button{display:inline-block}.StickerSetModal .Loading{width:100%;height:22.8125rem;max-height:calc(50vh + 3.8125rem)}\n",".HeaderMenuContainer{position:fixed;top:0;left:0;right:0;height:100vh;z-index:var(--z-header-menu)}.HeaderMenuContainer .Menu{position:absolute;font-size:1rem}.HeaderMenuContainer .Menu .backdrop{z-index:var(--z-header-menu-backdrop)}.HeaderMenuContainer .Menu .bubble{z-index:var(--z-header-menu);--offset-y: calc(100% + 1rem)}\n","#MobileSearch>.header{position:absolute;top:0;left:0;z-index:var(--z-mobile-search);width:100%;height:3.5rem;background:var(--color-background);display:flex;align-items:center;padding:0 0.5rem 0 0.25rem}#MobileSearch>.header>.SearchInput{margin-left:0.25rem;flex:1}#MobileSearch>.footer{position:absolute;bottom:0;left:0;z-index:var(--z-mobile-search);width:100%;height:3.5rem;background:var(--color-background);display:flex;align-items:center;padding-left:1rem;padding-right:0.5rem}#MobileSearch>.footer>.counter{flex:1;color:var(--color-text-secondary)}#MobileSearch:not(.active) .header,#MobileSearch:not(.active) .footer{transform:translateX(-999rem)}\n",".MentionTooltip{width:calc(100% - 4rem);max-width:20rem;flex-direction:column;z-index:-1}@media (max-width: 600px){.MentionTooltip{width:calc(100% - 3rem)}}.MentionTooltip .ListItem.chat-item-clickable{margin:0}.MentionTooltip .ListItem.chat-item-clickable .ListItem-button{border-radius:0}.MentionTooltip .ListItem.chat-item-clickable .info{display:flex}.MentionTooltip .ListItem.chat-item-clickable .title{margin-inline-end:.625rem;max-width:70%}.MentionTooltip .ListItem.chat-item-clickable .handle{font-size:1rem}.MentionTooltip .ListItem.chat-item-clickable[dir=rtl] .status{width:auto}.MentionTooltip .ChatInfo .title h3{line-height:1.25}.MentionTooltip .ChatInfo .Avatar{margin-right:0.7em}.MentionTooltip .ChatInfo .handle::before{content:'@'}.MentionTooltip .ChatInfo .user-status{display:none !important}\n",".AttachmentModal{--border-radius-default: 0.625rem}.AttachmentModal .modal-dialog{max-width:26.25rem}@media (max-width: 600px){.AttachmentModal .modal-dialog{max-height:100%;padding-bottom:1.5rem}}.AttachmentModal .modal-content{padding:.5rem 1.25rem 1.875rem;max-height:calc(100vh - 3.25rem)}@media (max-width: 600px){.AttachmentModal .modal-content{padding-bottom:.25rem}}.AttachmentModal .media-wrapper{max-height:26rem;overflow:auto;display:flex;flex-wrap:wrap;margin-bottom:1.5rem}.AttachmentModal .media-wrapper video,.AttachmentModal .media-wrapper img{flex:1;width:calc(50% - 0.15rem);height:12rem;margin-bottom:0.3rem;border-radius:var(--border-radius-default);object-fit:cover}.AttachmentModal .media-wrapper video:only-child,.AttachmentModal .media-wrapper img:only-child{height:auto;max-height:25rem;margin-bottom:0}.AttachmentModal .media-wrapper video:nth-child(even),.AttachmentModal .media-wrapper img:nth-child(even){margin-left:0.3rem}.AttachmentModal .document-wrapper{max-height:25rem;overflow:auto;flex-shrink:0;display:flex;flex-direction:column;margin:.75rem 0 1.75rem}.AttachmentModal .document-wrapper .File:not(:last-child){margin-bottom:1.5rem}.AttachmentModal .document-wrapper .file-icon{cursor:default !important}.AttachmentModal .attachment-caption-wrapper{position:relative}.AttachmentModal .attachment-caption-wrapper .form-control{background:var(--color-background)}.AttachmentModal .attachment-caption-wrapper .MentionTooltip{right:0 !important;z-index:0}.AttachmentModal .drop-target{position:relative}.AttachmentModal .drop-target::before,.AttachmentModal .drop-target::after{content:'';position:absolute;left:0;top:0;right:0;bottom:0;border-radius:var(--border-radius-default);pointer-events:none;opacity:0;transition:250ms opacity;z-index:1}.AttachmentModal .drop-target::before{background-image:var(--drag-target-border-hovered);background-color:var(--color-background)}.AttachmentModal .drop-target::after{content:attr(data-attach-description);display:flex;justify-content:center;align-items:center;color:var(--color-primary)}.AttachmentModal.hovered .drop-target::before{opacity:.95}.AttachmentModal.hovered .drop-target::after{opacity:1}.AttachmentModal.hovered .attachment-caption-wrapper,.AttachmentModal.hovered .document-wrapper,.AttachmentModal.hovered .media-wrapper{pointer-events:none}.AttachmentModal.hovered .document-wrapper,.AttachmentModal.hovered .media-wrapper{border-radius:var(--border-radius-default)}\n",".PollModal .modal-dialog{max-width:26.25rem;max-height:calc(100vh - 5rem)}.PollModal .modal-content{padding:.5rem 1.25rem 1.875rem;min-height:4.875rem}.PollModal .modal-header-condensed{margin-bottom:1rem}.PollModal .options-header{color:var(--color-text-secondary);font-size:1rem;font-weight:500;margin:1.5rem 0.25rem}.PollModal .options-list{margin:1rem -0.75rem -0.5rem;padding:0 0.75rem;border-top:1px solid var(--color-chat-hover);max-height:20rem;overflow:auto}.PollModal .options-list.overflown{padding:0 0.4rem 0.5rem 0.75rem}@media (max-width: 600px){.PollModal .options-list{overflow:hidden;max-height:none}.PollModal .options-list,.PollModal .options-list.overflown{padding:0 0.75rem}}.PollModal .option-wrapper{position:relative}.PollModal .option-wrapper .form-control{padding-right:3rem}.PollModal .option-wrapper .option-remove-button{position:absolute;top:0.3125rem;right:0.3125rem}.PollModal .quiz-mode{margin-top:1.5rem}.PollModal .quiz-mode .options-header{margin-bottom:0.5rem}.PollModal .quiz-mode .note{margin-top:0.5rem}.PollModal .note{font-size:smaller;color:var(--color-text-secondary)}.PollModal .error{font-size:smaller;color:var(--color-error);margin:-1rem 0 1rem .25rem}.PollModal .input-group:last-child{margin-bottom:0.5rem}\n",".EmojiButton{display:inline-flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;margin:0.125rem;border-radius:var(--border-radius-messages-small);cursor:pointer;font-size:1.75rem;line-height:2.5rem;background-color:transparent;transition:background-color .15s ease}.mac-os-fix .EmojiButton{line-height:inherit}.EmojiButton.focus,.EmojiButton:hover{background-color:var(--color-background-selected)}.EmojiButton>img{width:2rem;height:2rem}\n",".EmojiPicker{height:100%}.EmojiPicker-main{height:calc(100% - 3rem);overflow-y:auto;padding:0.5rem}@media (max-width: 600px){.EmojiPicker-main{padding:0.5rem 0.25rem}}.EmojiPicker-main .symbol-set-container{display:flex;flex-wrap:wrap}.EmojiPicker-header{height:3rem;border-bottom:1px solid var(--color-borders);display:flex;align-items:center;justify-content:space-around;box-shadow:0 0 2px var(--color-default-shadow)}@media (max-width: 600px){.EmojiPicker-header{overflow-x:auto;overflow-y:hidden;display:block;white-space:nowrap;padding:0.4375rem 0;scrollbar-width:none;scrollbar-color:rgba(0,0,0,0)}.EmojiPicker-header::-webkit-scrollbar{height:0}.EmojiPicker-header::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0)}.EmojiPicker-header .symbol-set-button{display:inline-flex;vertical-align:middle}.EmojiPicker-header::after{content:\"\";display:block;flex-shrink:0;width:0.1px;height:1rem}}\n",".StickerPicker{height:100%}.StickerPicker-main{position:relative;height:calc(100% - 3rem);overflow-y:auto;padding:0.5rem}@media (max-width: 600px){.StickerPicker-main{padding:0.5rem 0.25rem}}.StickerPicker-header{height:3rem;border-bottom:1px solid var(--color-borders);padding:0.125rem 0;overflow-x:auto;overflow-y:hidden;white-space:nowrap;box-shadow:0 0 2px var(--color-default-shadow);scrollbar-width:none;scrollbar-color:rgba(0,0,0,0)}.StickerPicker-header::-webkit-scrollbar{height:0}.StickerPicker-header::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0)}.StickerPicker-header::after{content:\"\";display:block;flex-shrink:0;width:0.1px;height:1rem}.StickerPicker-header .sticker-set-button{display:inline-flex;vertical-align:middle}.StickerPicker-header .sticker-set-button.StickerButton{background-size:2rem}.StickerPicker-header .sticker-set-button.StickerButton img,.StickerPicker-header .sticker-set-button.StickerButton .AnimatedSticker{top:0.375rem;left:0.375rem;width:2rem;height:2rem}.StickerPicker-header .sticker-set-button .sticker-set-cover{width:2rem;height:2rem;position:relative;display:flex;align-items:center;justify-content:center}.StickerPicker-header .sticker-set-button .sticker-set-cover img,.StickerPicker-header .sticker-set-button .sticker-set-cover .AnimatedSticker{width:100%;height:100%;position:absolute;top:0;left:0}.StickerPicker .symbol-set-container{width:25rem;line-height:0}@media (max-width: 600px){.StickerPicker .symbol-set-container{width:100%}}.StickerPicker .sticker-set-button{width:2.75rem !important;height:2.75rem;margin:0 0.25rem;border-radius:var(--border-radius-messages-small)}\n",".GifButton{display:flex;align-items:center;justify-content:center;height:6.25rem;background-color:transparent;cursor:pointer;overflow:hidden;position:relative}.GifButton:last-child{margin-bottom:1rem}.GifButton.vertical{grid-column-end:span 1}.GifButton.horizontal{grid-column-end:span 2}.GifButton .thumbnail{background-size:cover !important;background:transparent no-repeat center}.GifButton .thumbnail ~ video{position:absolute}.GifButton .thumbnail,.GifButton video{width:100%;height:100%;object-fit:cover}.GifButton:not(.shown){display:block !important;visibility:hidden}.GifButton .Spinner{position:absolute;pointer-events:none}\n",".GifPicker{display:grid;grid-template-columns:repeat(6, 1fr);grid-auto-rows:6.25rem;grid-gap:0.25rem;grid-auto-flow:dense;height:100%;overflow-y:auto;padding:0.25rem}.GifPicker .Loading,.GifPicker .picker-disabled{grid-column:1 / -1;height:var(--menu-height)}\n",".SymbolMenu.mobile-menu{position:fixed;left:0;right:0;bottom:0;background:var(--color-background);transform:translate3d(0, calc(var(--symbol-menu-height) + var(--symbol-menu-footer-height)), 0);z-index:1;transition:transform var(--layer-transition)}.SymbolMenu.mobile-menu.open{transform:translate3d(0, 0, 0)}body.is-media-viewer-open .SymbolMenu.mobile-menu.open{transform:translate3d(0, calc(var(--symbol-menu-height) + var(--symbol-menu-footer-height)), 0)}body.animation-level-0 .SymbolMenu.mobile-menu{transition:none}.SymbolMenu.mobile-menu:not(.middle-column-open){transform:translate3d(100vw, 0, 0) !important}.SymbolMenu-main{width:var(--symbol-menu-width);height:var(--symbol-menu-height);max-height:calc(100vh - var(--symbol-menu-footer-height))}.SymbolMenu-footer{height:var(--symbol-menu-footer-height);border-top:1px solid var(--color-borders);display:flex;align-items:center;justify-content:center;box-shadow:0 0 2px var(--color-default-shadow);position:relative}.SymbolMenu-footer .Button{flex-shrink:0;width:2.125rem !important;height:2.125rem;margin:0 .25rem;padding:0}.SymbolMenu-footer .Button.activated{pointer-events:none}.SymbolMenu-footer .Button.symbol-tab-button{margin:0 0.75rem}.SymbolMenu-footer .Button.symbol-search-button{position:absolute;left:0.25rem}.SymbolMenu-footer .Button.symbol-delete-button{position:absolute;right:0.25rem}.SymbolMenu .Transition.slide{height:100%}.SymbolMenu .Transition.slide .Loading{height:var(--symbol-menu-height)}.is-pointer-env .SymbolMenu>.backdrop{position:absolute;top:-1rem;left:0;right:auto;width:3.5rem;height:4.5rem}.SymbolMenu .bubble{padding:0;width:var(--symbol-menu-width);overflow:hidden}.SymbolMenu .picker-disabled{height:var(--symbol-menu-height);display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary)}.SymbolMenu .symbol-close-button{display:none;position:absolute;right:.25rem;top:.25rem}@media (orientation: landscape){.SymbolMenu .symbol-close-button{display:block}}.symbol-set{margin-bottom:1rem}.symbol-set-name{font-size:1rem;line-height:1.6875rem;font-weight:500;margin:0;padding-left:0.5rem;color:rgba(var(--color-text-secondary-rgb), 0.75);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:initial;unicode-bidi:plaintext}.symbol-set-container{text-align:initial}.symbol-set-button{flex-shrink:0;width:2.125rem !important;height:2.125rem;margin:0 0.25rem;padding:0}.Transition>div:not(.active) .symbol-set,body.animating-right-column .symbol-set{overflow:hidden}.symbol-set .symbol-set-container:not(.shown){display:block}.symbol-set .symbol-set-container.closing{transition:none}\n",".AttachMenu{position:relative}.is-pointer-env .AttachMenu>.backdrop{position:absolute;top:-1rem;left:auto;right:0;width:3.5rem}.AttachMenu .media-disabled>button{white-space:normal}\n",".StickerTooltip{display:grid;grid-template-columns:repeat(auto-fill, minmax(5rem, 1fr));grid-auto-rows:auto;place-items:center}.StickerTooltip.hidden{display:none}\n",".KeyboardMenu .bubble{width:100% !important;max-width:27rem;border-radius:var(--border-radius-default-small)}.KeyboardMenu .content{display:flex;flex-direction:column;padding:.1875rem .625rem;max-height:80vh;overflow:auto}@media (max-width: 600px){.KeyboardMenu .content{max-height:75vh}}.KeyboardMenu .content .row{display:flex;flex-direction:row}.KeyboardMenu .content .row+.row{margin-top:.375rem}.KeyboardMenu .content .Button{flex:1;width:auto;height:auto;min-height:3.0625rem;border-radius:var(--border-radius-messages-small);border:2px solid var(--color-primary);background:var(--color-background);color:var(--color-primary);font-weight:500;text-transform:none}.KeyboardMenu .content .Button:hover{color:#fff;border-color:var(--color-primary-shade)}.KeyboardMenu .content .Button+.Button{margin-left:.375rem}\n",".CustomSendMenu{position:relative;bottom:3.5rem}.is-pointer-env .CustomSendMenu>.backdrop{position:absolute;top:-1rem;left:auto;right:0;width:3.5rem}.CustomSendMenu .media-disabled>button{white-space:normal}.CustomSendMenu .bubble{width:16rem}\n",".EmojiTooltip{display:flex;padding-left:.25rem;overflow-x:auto;overflow-x:overlay;overflow-y:hidden}.EmojiTooltip .EmojiButton{flex:0 0 2.5rem}\n",".BaseResult.chat-item-clickable>.ListItem-button{padding-left:1.25rem !important;padding-right:1.25rem !important}.BaseResult.chat-item-clickable>.ListItem-button .title{display:block;text-overflow:ellipsis}.BaseResult .thumb{background-color:var(--color-background-secondary);flex:0 0 3rem;width:3rem;height:3rem;line-height:3rem;border-radius:var(--border-radius-default-tiny);display:inline-flex;align-content:center;justify-content:center;margin-inline-end:.5rem;overflow:hidden;font-size:1.5rem}.BaseResult .thumb img:not(.emoji){width:100%;object-fit:cover}.BaseResult .thumb img.emoji{width:1.5rem;height:1.5rem;margin:.75rem 0 0}.BaseResult .content-inner{min-width:0}.BaseResult .title{font-weight:500;text-align:left;unicode-bidi:plaintext}.BaseResult .description{white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;text-align:left;unicode-bidi:plaintext}.BaseResult[dir=rtl] .title,.BaseResult[dir=rtl] .description{text-align:right}\n",".MediaResult{height:0;padding-bottom:100%;overflow:hidden;position:relative;cursor:pointer}.MediaResult img{position:absolute;left:0;top:0;width:100%;height:100%;object-fit:cover}\n",".InlineBotTooltip{--border-radius-default: 0}.InlineBotTooltip .switch-pm .title{margin:0 auto;font-weight:500}.InlineBotTooltip.gallery{display:grid;grid-template-columns:repeat(4, 1fr);grid-gap:1px;padding:0}@media (max-width: 600px){.InlineBotTooltip.gallery{grid-template-columns:repeat(3, 1fr)}}.InlineBotTooltip.gallery .switch-pm{grid-column:1 / -1}.InlineBotTooltip.gallery .switch-pm .ListItem-button{border-bottom-left-radius:0;border-bottom-right-radius:0}.InlineBotTooltip.gallery .GifButton{grid-column-end:initial}.InlineBotTooltip.gallery .StickerButton{width:initial;height:0;margin:0;padding-bottom:100%;border-radius:0}.InlineBotTooltip.gallery .StickerButton .AnimatedSticker,.InlineBotTooltip.gallery .StickerButton img,.InlineBotTooltip.gallery .StickerButton canvas{position:absolute;top:0;left:0;width:100% !important;height:100% !important}@media (min-width: 600px){.InlineBotTooltip.gallery .StickerButton .AnimatedSticker,.InlineBotTooltip.gallery .StickerButton img,.InlineBotTooltip.gallery .StickerButton canvas{top:.25rem;left:.25rem;width:calc(100% - .5rem) !important;height:calc(100% - .5rem) !important}}\n",".RightSearch{height:100%;padding:0 0.5rem;overflow-y:auto}.RightSearch .helper-text{padding:1rem;margin-bottom:0.125rem;font-weight:500;color:var(--color-text-secondary);unicode-bidi:plaintext;text-align:initial}\n",".StickerSearch{height:100%;padding:0 0.5rem;overflow-y:auto}.StickerSearch .helper-text{padding:1rem;margin-bottom:0.125rem;font-weight:500;color:var(--color-text-secondary)}.StickerSearch .sticker-set{margin-bottom:1rem}.StickerSearch .sticker-set-header{display:flex;justify-content:space-between;padding:0.5rem}.StickerSearch .sticker-set-header .title-wrapper{overflow:hidden}.StickerSearch .sticker-set-header .title{font-size:1rem;line-height:1.6875rem;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.StickerSearch .sticker-set-header .count{color:var(--color-text-secondary);margin:0}.StickerSearch .sticker-set-header .Button{flex-shrink:0;margin-left:1rem}.StickerSearch .sticker-set-header .Button.is-added{background:var(--color-chat-hover);color:var(--color-text-secondary)}.StickerSearch .sticker-set-header .Button.is-added:hover,.StickerSearch .sticker-set-header .Button.is-added:active{background:var(--color-item-active) !important}.StickerSearch .sticker-set-main{display:flex;flex-wrap:nowrap;overflow:hidden}.StickerSearch .sticker-set[dir=rtl] .title-wrapper{text-align:right}.StickerSearch .sticker-set[dir=rtl] .Button{margin-left:0;margin-right:1rem}.StickerSearch .StickerButton{margin:0.125rem}\n",".GifSearch{height:100%;padding:0.25rem}.GifSearch .gif-container{height:100%;overflow:auto}.GifSearch .gif-container.grid{display:grid;grid-template-columns:repeat(6, 1fr);grid-auto-rows:6.25rem;grid-gap:0.25rem;grid-auto-flow:dense}.GifSearch .helper-text{color:var(--color-text-meta);margin-top:2rem;text-align:center}\n",".PollAnswerResults{border-bottom:1px solid var(--color-borders);padding:0 .5rem .625rem;display:flex;flex-direction:column-reverse}.PollAnswerResults .answer-head{display:flex;align-items:center;font-size:.9375rem;line-height:1.3125rem;font-weight:500;color:var(--color-text-secondary);padding:1rem .75rem .5rem 1rem;position:sticky;top:0;background:var(--color-background)}@media (max-width: 600px){.PollAnswerResults .answer-head{padding:.5rem .25rem .5rem .5rem}}.PollAnswerResults .answer-percent{margin-left:auto}.PollAnswerResults .answer-percent[dir=auto]{margin-left:0;margin-right:auto}.PollAnswerResults .poll-voters{padding:0 .75rem;position:relative;min-height:3rem}@media (max-width: 600px){.PollAnswerResults .poll-voters{padding:0 .25rem}}.PollAnswerResults .poll-voters .Spinner{--spinner-size: 1.25rem}.PollAnswerResults .chat-item-clickable .ChatInfo .Avatar.size-tiny{margin-right:1.75rem}.PollAnswerResults .chat-item-clickable[dir=rtl] .ChatInfo .Avatar.size-tiny{margin-left:1.75rem;margin-right:0}.PollAnswerResults .ShowMoreButton{margin:.25rem 0 0 -0.5rem;width:calc(100% + 1rem)}.PollAnswerResults .ShowMoreButton[dir=rtl] .icon-down{margin-left:2rem;margin-right:0}.PollAnswerResults .icon-down{vertical-align:middle;margin-right:2rem;font-size:1.5rem}\n",".PollResults{height:100%;position:relative;display:flex;flex-direction:column;pointer-events:auto}.PollResults>.Loading{position:absolute;top:0;left:0;bottom:0;right:0;background:rgba(255,255,255,0.75)}.PollResults .poll-question{padding:.75rem 1.5rem;flex-shrink:0;font-size:1.25rem}@media (max-width: 600px){.PollResults .poll-question{padding:0 1rem}}.PollResults .poll-results-list{border-top:1px solid var(--color-borders);flex-grow:1;overflow:auto}\n",".Management{position:relative;height:100%}.Management>.custom-scroll{height:100%;overflow-y:scroll;overflow-x:hidden}.Management .section{padding:1rem 1.5rem;border-top:1px solid var(--color-borders)}.Management .section.wide{padding:1.5rem}.Management .section:first-of-type{border-top:none;padding-top:1rem}.Management .section.no-border{border-top:none}.Management .section>.ChatInfo{margin:0 0 2rem !important}.Management .section>.ChatInfo .title h3{margin-bottom:0}.Management .section .section-icon{width:8.75rem;height:8.75rem;margin:0 auto 2rem;position:relative}.Management .section .section-icon .AnimatedSticker{position:absolute;left:0;top:0;width:100%;height:100%}.Management .section .section-icon .AnimatedSticker.hidden{display:none}.Management .section .ListItem{margin:0 -.75rem}.Management .section .ListItem:last-child{margin-bottom:0}.Management .section .ListItem .multiline-item .subtitle{line-height:1.25rem}.Management .section .ListItem:not(.picker-list-item) .Checkbox{margin-top:2rem;margin-bottom:2rem}.Management .section .ListItem.narrow .Checkbox{margin-top:1rem;margin-bottom:1rem}.Management .section .ListItem.exceptions-member .ChatInfo .status{white-space:pre-wrap}.Management .section .section-heading{font-weight:500;font-size:.9375rem;color:var(--color-text-secondary)}.Management .section .section-heading[dir=auto]{text-align:initial}.Management .section .section-help{color:var(--color-text-secondary);line-height:1.375rem}.Management .section .section-help[dir=auto]{text-align:initial}.Management .section .section-info{color:var(--color-text-secondary);font-size:.875rem}.Management .section[dir=rtl]{text-align:right}.Management textarea.form-control{height:auto}.Management .group-link{color:var(--color-text)}.Management .radio-group{margin-top:2rem}.Management .radio-group .Radio{padding-left:3.5rem;margin-bottom:2rem}.Management .radio-group .Radio:last-child{margin-bottom:.625rem}.Management .radio-group .Radio-main::before{left:0.125rem;top:.25rem;transform:none}.Management .radio-group .Radio-main::after{left:0.4375rem;top:.5625rem;transform:none}.ManageGroupMembers{padding:0.5rem 1rem}\n",".ShippingInfo{padding:0.5rem 1rem}.ShippingInfo h5{font-size:0.9rem;color:var(--color-text-secondary);margin:1rem 0 1.1rem}\n",".Shipping{padding:0.5rem 1rem}.Shipping form p{color:var(--color-text-secondary);font-weight:500;margin:.5rem 0 2rem}.Shipping form .Radio{margin-bottom:2rem}\n",".Checkout{padding:0.5rem 0}.Checkout .description{display:flex;flex-direction:row;margin:0 1rem}.Checkout .description img{height:6rem;margin:.5rem}.Checkout .description .text h5{margin-top:.5rem;font-size:1.125rem}.Checkout .description .text p{font-size:0.8rem;line-height:1rem;color:var(--color-text-secondary)}.Checkout .price-info{margin:1rem}.Checkout .price-info .price-info-item{margin:1rem .5rem;display:flex;flex-direction:row;align-content:space-between;color:var(--color-text-secondary);font-weight:500}.Checkout .price-info .price-info-item-main{color:var(--color-text)}.Checkout .price-info .price-info-item .title{display:flex;flex:1 auto}.Checkout .invoice-info{border-top:1px var(--color-borders) solid;padding:1rem}.Checkout .invoice-info .checkout-info-item{display:flex;padding:.75rem .5rem 1rem;text-align:left}.Checkout .invoice-info .checkout-info-item i{font-size:1.5rem;color:var(--color-text-secondary);margin-right:2rem;width:1.5rem}.Checkout .invoice-info .checkout-info-item i.stripe-provider{background:url(stripe-logo.c0c5683dcd30037389c35a31040908ed.png) no-repeat center;background-size:2rem;border-radius:1rem;height:1.5rem}.Checkout .invoice-info .checkout-info-item .info .title{font-size:1rem;line-height:1.4375rem;margin-bottom:0;font-weight:400;word-break:break-word;color:var(--color-text);text-transform:capitalize}.Checkout .invoice-info .checkout-info-item .info .data{margin-bottom:0;font-size:0.875rem;color:var(--color-text-secondary)}\n",".CardInput{position:relative}.CardInput .input-group.has-left-addon .form-control{padding-left:4rem}.CardInput .left-addon{position:absolute;top:.8rem;left:1rem;z-index:8}.CardInput .left-addon img{max-width:2rem}\n",".PaymentInfo{padding:0.5rem 1rem}.PaymentInfo h5{font-size:0.9rem;color:var(--color-text-secondary);margin:1rem 0 1.1rem}.PaymentInfo .inline-inputs{display:flex;justify-content:space-between}.PaymentInfo .inline-inputs .input-group{flex:1 10rem;max-width:45%;display:flex}\n",".PaymentModal .modal-backdrop{pointer-events:none}.PaymentModal .header{position:relative;border-top-left-radius:10px;border-top-right-radius:10px;width:100%;padding:.25rem 1rem;display:flex;align-items:center;flex-direction:row;background:var(--color-background);border-bottom:1px var(--color-borders) solid}.PaymentModal .header h3{margin-bottom:0;margin-left:1.5rem;unicode-bidi:plaintext;text-align:initial}.PaymentModal .Transition{height:25rem}.PaymentModal .empty-content{height:25rem;max-height:90%;display:flex;align-items:center;justify-content:center}.PaymentModal .receipt-content{height:25rem;overflow-y:auto}.PaymentModal .content{overflow:auto;width:100%;height:100%;position:relative}.PaymentModal .footer{position:relative;border-bottom-left-radius:10px;border-bottom-right-radius:10px;width:100%;padding:.75rem 1rem;background:var(--color-background);border-top:1px var(--color-borders) solid}.PaymentModal .footer button{text-transform:none;font-weight:500}.PaymentModal .modal-dialog{width:25rem}.PaymentModal .modal-content{padding:0;overflow:hidden}@media screen and (max-device-width: 640px) and (max-height: 640px) and (orientation: landscape){.PaymentModal .modal-dialog{max-height:100%}.PaymentModal .Transition{height:10rem}}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/3.356913bd8f5c1b421f79.js b/dist/3.356913bd8f5c1b421f79.js new file mode 100644 index 000000000..a529fa223 --- /dev/null +++ b/dist/3.356913bd8f5c1b421f79.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{106:function(e,t,a){"use strict";a.r(t),a.d(t,"MediaViewer",(function(){return me})),a.d(t,"ForwardPicker",(function(){return Ce})),a.d(t,"Dialogs",(function(){return Ne})),a.d(t,"Notifications",(function(){return Se})),a.d(t,"SafeLinkModal",(function(){return Fe})),a.d(t,"HistoryCalendar",(function(){return Te})),a.d(t,"CalendarModal",(function(){return Re})),a.d(t,"DeleteMessageModal",(function(){return De})),a.d(t,"PinMessageModal",(function(){return Be})),a.d(t,"UnpinAllMessagesModal",(function(){return Ue})),a.d(t,"MessageSelectToolbar",(function(){return He})),a.d(t,"LeftSearch",(function(){return It})),a.d(t,"Settings",(function(){return mn})),a.d(t,"ContactList",(function(){return hn})),a.d(t,"NewChat",(function(){return On})),a.d(t,"NewChatStep1",(function(){return gn})),a.d(t,"NewChatStep2",(function(){return pn})),a.d(t,"ArchivedChats",(function(){return jn})),a.d(t,"ContextMenuContainer",(function(){return Ln})),a.d(t,"StickerSetModal",(function(){return An})),a.d(t,"HeaderMenuContainer",(function(){return Tn})),a.d(t,"MobileSearch",(function(){return Un})),a.d(t,"AttachmentModal",(function(){return Zn})),a.d(t,"PollModal",(function(){return Xn})),a.d(t,"SymbolMenu",(function(){return ks})),a.d(t,"AttachMenu",(function(){return Ns})),a.d(t,"MentionTooltip",(function(){return Yn})),a.d(t,"StickerTooltip",(function(){return ws})),a.d(t,"BotKeyboardMenu",(function(){return Ss})),a.d(t,"CustomSendMenu",(function(){return Is})),a.d(t,"DropArea",(function(){return Ps.b})),a.d(t,"TextFormatter",(function(){return Fs.a})),a.d(t,"EmojiTooltip",(function(){return Ls})),a.d(t,"InlineBotTooltip",(function(){return xs})),a.d(t,"RightSearch",(function(){return zs})),a.d(t,"StickerSearch",(function(){return $s})),a.d(t,"GifSearch",(function(){return Vs})),a.d(t,"PollResults",(function(){return Ks})),a.d(t,"Management",(function(){return ic})),a.d(t,"PaymentModal",(function(){return Rc})),a.d(t,"ReceiptModal",(function(){return Bc}));var n=a(0),s=a(1),c=a(8),r=a(13),o=a(2),l=a(6),i=a(54),d=a(118),m=a(7),u=a(4),h=a(3),b=a(137),g=a(49),p=a(185),v=a(31),O=a(110),E=a(123),j=a(200),f=a(29),C=a(37),y=a(151);function k(e,t,a,n,s,c){const{mediaEl:l}=P(t,c);if(!l)return;const{width:m}=i.a.get(),{width:u,height:h}=Object(d.l)(e,s),{width:b,height:g}=Object(d.f)(u,h,n.width,n.height),p=(m-b)/2,v=function(e){const t=window.matchMedia(d.c);let a=4.125;e&&(a+=t.matches?.875:3.375);return a*d.d}(e)+(h-g)/2;let{top:O,left:E,width:j,height:f}=l.getBoundingClientRect();if([r.h.SharedMedia,r.h.Album,r.h.ScheduledAlbum,r.h.SearchResult].includes(t)){const e=function(e,t,a,n,s,c){if(e===t){const r=Math.max(s,c)*(e/t);n-=(r-s)/2,a-=(r-c)/2,s=r,c=r}else if(e>t){const a=s;n-=((s=c*(e/t))-a)/2}else if(t>e){const n=c;a-=((c=s*(t/e))-n)/2}return{top:a,left:n,width:s,height:c}}(b,g,O,E,j,f);O=e.top,E=e.left,j=e.width,f=e.height}const C=E+j/2-(p+b/2),y=O+f/2-(v+g/2),k=j/b,N=f/g,S=w(a||l);I(S,{top:v+"px",left:p+"px",width:b+"px",height:g+"px",transform:`translate3d(${C}px, ${y}px, 0) scale(${k}, ${N})`}),F(S,t),document.body.classList.add("ghost-animating"),requestAnimationFrame(()=>{document.body.appendChild(S),requestAnimationFrame(()=>{S.style.transform="",function(e){e.firstChild.style.objectFit="default",e.classList.remove("rounded-corners","circle")}(S),setTimeout(()=>{requestAnimationFrame(()=>{document.body.contains(S)&&document.body.removeChild(S),document.body.classList.remove("ghost-animating")})},200+o.c)})})}function N(e,t,a){const{container:n,mediaEl:s}=P(e,a);if(!s)return;const c=document.getElementById("MediaViewer").querySelector(".active .media-viewer-content img, .active .media-viewer-content video");if(!c||!s)return;const{top:l,left:d,width:m,height:u}=c.getBoundingClientRect(),{top:h,left:b,width:g,height:p}=s.getBoundingClientRect();let v=h;if(!function(e){if("none"===e.style.display)return!1;const t=e.getBoundingClientRect(),{height:a}=i.a.get();return t.top<=a&&t.top+t.height>=0}(n)){const{height:e}=i.a.get();v=hf?j=f:f>j&&(f=j));const y=document.getElementsByClassName("ghost")[0],k=y||w(t||s,e===r.h.ProfileAvatar);y||I(k,{top:v+"px",left:b+"px",width:g+"px",height:p+"px",transform:`translate3d(${O}px, ${E}px, 0) scale(${j}, ${f})`}),requestAnimationFrame(()=>{if(y){const{top:e,left:t,width:a,height:n}=y.getBoundingClientRect();I(k,{transition:"none",top:v+"px",left:b+"px",transformOrigin:"top left",transform:`translate3d(${t-b}px, ${e-v}px, 0) scale(${a/g}, ${n/p})`,width:g+"px",height:p+"px"})}document.body.classList.add("ghost-animating"),y||document.body.appendChild(k),requestAnimationFrame(()=>{y&&(y.style.transition=""),k.style.transform="",C&&(k.style.opacity="0"),F(k,e),setTimeout(()=>{requestAnimationFrame(()=>{document.body.contains(k)&&document.body.removeChild(k),document.body.classList.remove("ghost-animating")})},200+o.c)})})}function w(e,t=!1){const a=document.createElement("div");a.classList.add("ghost");const n=new Image;if("string"==typeof e?n.src=e:e instanceof HTMLVideoElement?n.src=e.poster:n.src=e.src,a.appendChild(n),t){a.classList.add("ProfileInfo");const e=document.querySelector("#RightColumn .ProfileInfo .info");e&&a.appendChild(e.cloneNode(!0))}return a}function S(e,t){const a=document.querySelector(".active > .MessageList");let n=e.offsetTop+t.closest(".content-inner, .WebPage").offsetTop;return e.id.includes("album-media-")&&(n+=e.parentElement.offsetTop+e.closest(".Message").offsetTop),n>a.scrollTop&&n+t.offsetHeight{if(n&&t)return{sender:Object(u.ob)(t)?Object(m.Jb)(e,t):Object(m.g)(e,t)};if(!a||!t)return{};const s=Object(m.l)(e,t,a);return{message:s,sender:s&&Object(m.vb)(e,s)}},(e,t)=>Object(h.l)(t,["closeMediaViewer","focusMessage"]))(({chatId:e,messageId:t,sender:a,isAvatar:s,message:c,closeMediaViewer:r,focusMessage:o})=>{const l=Object(n.m)(()=>{r(),o({chatId:e,messageId:t})},[e,o,t,r]),i=Object(M.a)();if(!a||!c&&!s)return;const d=a.id<0,m=Object(u.X)(i,a);return n.a.createElement("div",{className:"SenderInfo",onClick:l},d?n.a.createElement(x.a,{key:a.id,size:"medium",chat:a}):n.a.createElement(x.a,{key:a.id,size:"medium",user:a}),n.a.createElement("div",{className:"meta"},n.a.createElement("div",{className:"title",dir:"auto"},m&&Object(U.a)(m)),n.a.createElement("div",{className:"date",dir:"auto"},s?i("lng_mediaview_profile_photo"):Object(B.d)(i,1e3*c.date))))}),z=a(188),q=a(63),_=a(43),H=a(124);a(268);var $=({mediaData:e,isVideo:t,isZoomed:a,message:s,fileName:c,isAvatar:r,onCloseMediaViewer:o,onForward:i,onZoomToggle:d})=>{const{isDownloadStarted:m,downloadProgress:h,handleDownloadClick:b}=Object(z.a)(s&&t?Object(u.E)(s,"download"):void 0,c),g=Object(M.a)(),p=Object(n.p)(()=>({onTrigger:e,isOpen:t})=>n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",className:t?"active":void 0,onClick:e,ariaLabel:"More actions"},n.a.createElement("i",{className:"icon-more"})),[]);return l.l?n.a.createElement("div",{className:"MediaViewerActions-mobile"},n.a.createElement(q.a,{trigger:p,positionX:"right"},!r&&n.a.createElement(_.a,{icon:"forward",onClick:i},g("Forward")),t?n.a.createElement(_.a,{icon:m?"close":"download",onClick:b},m?Math.round(100*h)+"% Downloading...":"Download"):n.a.createElement(_.a,{icon:"download",href:e,download:c},g("AccActionDownload"))),m&&n.a.createElement(H.a,{progress:h,size:"s",noCross:!0})):n.a.createElement("div",{className:"MediaViewerActions"},!r&&n.a.createElement(n.a.Fragment,null,n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:g("Forward"),onClick:i},n.a.createElement("i",{className:"icon-forward"}))),t?n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:g("AccActionDownload"),onClick:b},m?n.a.createElement(H.a,{progress:h,size:"s",onClick:b}):n.a.createElement("i",{className:"icon-download"})):n.a.createElement(D.a,{href:e,download:c,round:!0,size:"smaller",color:"translucent-white",ariaLabel:g("AccActionDownload")},n.a.createElement("i",{className:"icon-download"})),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:a?"Zoom Out":"Zoom In",onClick:d},n.a.createElement("i",{className:a?"icon-zoom-out":"icon-zoom-in"})),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:g("Close"),onClick:o},n.a.createElement("i",{className:"icon-close"})))},V=a(10),W=a(9);a(269);var K=({text:e="",isHidden:t,isForVideo:a,onClick:s})=>{const[c,r]=Object(n.r)(!1);Object(n.n)(()=>{const e=document.querySelector(".MediaViewerFooter .media-text"),t=()=>{const t=e?e.clientHeight:0;r(t>2*d.d)};t();const a=Object(V.h)(t,500,!0);return window.addEventListener("resize",a,!1),()=>{window.removeEventListener("resize",a,!1)}},[]);const o=Object(W.a)("MediaViewerFooter",a&&"is-for-video",t&&"is-hidden");return n.a.createElement("div",{className:o,onClick:function(t){e&&t.stopPropagation()}},e&&n.a.createElement("div",{className:"media-viewer-footer-content",onClick:l.l?void 0:s},n.a.createElement("p",{className:"media-text custom-scroll "+(c?"multiline":""),dir:"auto"},e)))},Y=a(40),Q=a(141);const Z=function(){if(void 0!==document.fullscreenElement)return"fullscreenElement";if(void 0!==document.mozFullScreenElement)return"mozFullScreenElement";if(void 0!==document.webkitFullscreenElement)return"webkitFullscreenElement";return""}();var J=a(152),X=a(140);const ee=["bytes","kB","MB","GB","TB","PB"];var te=e=>{const t=0===e?0:Math.floor(Math.log(e)/Math.log(1024));return`${(e/1024**Math.floor(t)).toFixed(1)} ${ee[t]}`};a(270);const ae=e=>{e.stopPropagation()};var ne=({bufferedProgress:e,currentTime:t,duration:a,fileSize:s,isForceVisible:c,isForceMobileVersion:r,isPlayed:o,isFullscreenSupported:i,isFullscreen:d,onChangeFullscreen:m,onPlayPause:u,onSeek:h})=>{const[b,g]=Object(n.r)(!0);Object(n.n)(()=>{c&&g(c)},[c]),Object(n.n)(()=>{let e;return c||(l.l?g(!1):e=window.setTimeout(()=>{g(!1)},800)),()=>{e&&window.clearTimeout(e)}},[c]),Object(n.n)(()=>((b||c)&&document.body.classList.add("video-controls-visible"),()=>{document.body.classList.remove("video-controls-visible")}),[c,b]);const p=Object(M.a)();var v,O;if(b||c)return n.a.createElement("div",{className:"VideoPlayerControls "+(r?"mobile":""),onClick:ae},function(e,t,a,s){const c=e/t*100,r=100*a;return n.a.createElement("div",{className:"player-seekline"},n.a.createElement("div",{className:"player-seekline-track"},n.a.createElement("div",{className:"player-seekline-buffered",style:`width: ${r||0}%`}),n.a.createElement("div",{className:"player-seekline-played",style:`width: ${c||0}%`}),n.a.createElement("input",{min:"0",max:"100",step:.01,type:"range",onInput:s,className:"player-seekline-input",value:c||0})))}(t,a,e,h),n.a.createElement(D.a,{ariaLabel:p("AccActionPlay"),size:"tiny",ripple:!l.l,color:"translucent-white",className:"play",onClick:u},n.a.createElement("i",{className:o?"icon-pause":"icon-play"})),function(e,t){return n.a.createElement("div",{className:"player-time"},`${Object(B.e)(e)} / ${Object(B.e)(t)}`)}(t,a),e<1&&(v=e,O=s,n.a.createElement("div",{className:"player-file-size"},`${te(O*v)} / ${te(O)}`)),i&&n.a.createElement(D.a,{ariaLabel:"Fullscreen",size:"tiny",color:"translucent-white",className:"fullscreen",onClick:m},n.a.createElement("i",{className:""+(d?"icon-smallscreen":"icon-fullscreen")})))};a(271);function se(){return(se=Object.assign||function(e){for(var t=1;t{const m=Object(n.q)(null),[u,h]=Object(n.r)(!l.n||!l.e),[b,g]=Object(n.r)(0),[p,v]=Object(n.r)(!0),[O,E,j]=function(e,t){const[a,s]=Object(n.r)(Boolean(Z&&document[Z]));return Object(n.o)(()=>{const a=()=>{s(Boolean(Z&&document[Z]))},n=()=>{s(!0)},c=()=>{s(!1),t(!1)},r=e.current;return document.addEventListener("fullscreenchange",a,!1),document.addEventListener("webkitfullscreenchange",a,!1),document.addEventListener("mozfullscreenchange",a,!1),r&&(r.addEventListener("webkitbeginfullscreen",n,!1),r.addEventListener("webkitendfullscreen",c,!1)),()=>{document.removeEventListener("fullscreenchange",a,!1),document.removeEventListener("webkitfullscreenchange",a,!1),document.removeEventListener("mozfullscreenchange",a,!1),r&&(r.removeEventListener("webkitbeginfullscreen",n,!1),r.removeEventListener("webkitendfullscreen",c,!1))}},[]),Z||"iOS"===l.r?[a,()=>{e.current&&(Z||"iOS"===l.r)&&(e.current.requestFullscreen?e.current.requestFullscreen():e.current.webkitRequestFullscreen?e.current.webkitRequestFullscreen():e.current.webkitEnterFullscreen?e.current.webkitEnterFullscreen():e.current.mozRequestFullScreen&&e.current.mozRequestFullScreen(),s(!0))},()=>{e.current&&(document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.webkitExitFullscreen&&document.webkitExitFullscreen(),s(!1))}]:[!1]}(m,h),{isBuffered:f,bufferedProgress:C,bufferingHandlers:y}=Object(Q.a)(),{shouldRender:k,transitionClassNames:N}=Object(Y.a)(!f,void 0,void 0,"slow"),{shouldRender:w,transitionClassNames:S}=Object(Y.a)(l.e&&!u&&!k,void 0,void 0,"slow");Object(n.n)(()=>{i||!o?m.current.pause():e&&!l.n&&Object(X.a)(m.current)},[i,o,e]),Object(n.n)(()=>{m.current.currentTime===m.current.duration?(g(0),h(!1)):g(m.current.currentTime)},[b]);const I=Object(n.m)(e=>{e.stopPropagation(),u?(m.current.pause(),h(!1)):(m.current.play(),h(!0))},[u]);Object(J.a)(m,[]);const P=Object(n.m)(()=>{v(!0)},[]),F=Object(n.m)(()=>{v(!1)},[]),M=Object(n.m)(e=>{g(e.currentTarget.currentTime)},[]),L=Object(n.m)(()=>{g(0),h(!1)},[]),A=Object(n.m)(()=>{O&&j?j():!O&&E&&E()},[j,O,E]),R=Object(n.m)(e=>{e.stopPropagation(),m.current.currentTime=Number(e.target.value)*m.current.duration/100},[]),T=Object(n.m)(e=>{e.stopPropagation(),v(!p)},[p]);Object(n.n)(()=>{const e=e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),I(e))};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}},[I]);const B=s&&`width: ${s.width}px; height: ${s.height}px`,U=`background-image: url(${a})`;return n.a.createElement("div",{className:"VideoPlayer",onClick:!t&&l.l?T:void 0,onMouseOver:t?void 0:P,onMouseOut:t?void 0:F},n.a.createElement("div",{style:B},n.a.createElement("video",se({ref:m,autoPlay:l.n,playsInline:!0,loop:t,muted:t,id:"media-viewer-video",style:U,onEnded:L,onClick:l.l?void 0:I,onDoubleClick:A},y,{onTimeUpdate:M}),e&&n.a.createElement("source",{src:e}))),w&&n.a.createElement(D.a,{round:!0,className:"play-button "+S,onClick:I},n.a.createElement("i",{className:"icon-play"})),k&&n.a.createElement("div",{className:["spinner-container",N].join(" ")},!f&&n.a.createElement("div",{className:"buffering"},"Buffering..."),n.a.createElement(H.a,{size:"xl",progress:f?1:c,square:!0,onClick:d})),!t&&!k&&n.a.createElement(ne,{isPlayed:u,bufferedProgress:C,currentTime:b,isFullscreenSupported:Boolean(E),isFullscreen:O,fileSize:r,duration:m.current?m.current.duration:0,isForceVisible:!u||p,isForceMobileVersion:s&&s.width<400,onSeek:R,onChangeFullscreen:A,onPlayPause:I}))});a(272);var re=Object(n.h)(({isShown:e,onChangeZoom:t})=>{const{transitionClassNames:a}=Object(Y.a)(e),s=Object(f.a)(e),c=Object(n.q)(null),[r,o]=Object(n.r)(1),i=Object(n.q)(!1);Object(n.n)(()=>{e&&!s&&o(1.5)},[e,s]);const d=Object(n.m)(()=>{i.current=!0},[]),m=Object(n.m)(()=>{i.current=!1,1===r&&t(r,!i.current)},[t,r]);Object(n.n)(()=>{t(r,!i.current)},[r,t]);const u=Object(M.a)(),h=Object(W.a)("ZoomControls",a);return n.a.createElement("div",{className:h},n.a.createElement(D.a,{disabled:1===r,size:"tiny",color:"translucent-white",ariaLabel:u("ZoomOut"),className:"zoom-out",ripple:!l.l,onClick:()=>{c.current&&o(Math.max(1,r-.5))}},n.a.createElement("i",{className:"icon-zoom-out"})),n.a.createElement(D.a,{disabled:3===r,size:"tiny",color:"translucent-white",ariaLabel:"Zoom In",className:"zoom-in",ripple:!l.l,onClick:()=>{c.current&&o(Math.min(3,r+.5))}},n.a.createElement("i",{className:"icon-zoom-in"})),n.a.createElement("div",{className:"seekline"},n.a.createElement("div",{className:"seekline-track"},n.a.createElement("div",{className:"seekline-played",style:`width: ${50*(r-1)}%`}),n.a.createElement("input",{ref:c,min:1,max:3,step:"0.5",value:r,type:"range",className:"seekline-input",onChange:e=>{o(Math.min(3,Math.max(Number(e.target.value),1)))},onMouseDown:d,onMouseUp:m}))))});a(273);const oe=[1,0,0,1,0,0],le={1:1,1.5:1.5,2:2.2,2.5:3.3,3:5.5};var ie=Object(n.h)(({children:e,className:t,noWrap:a,canPan:s,zoomLevel:c,panDeltaX:r,panDeltaY:o,onPan:l})=>{const i=le[c]||c,[d,m]=Object(n.r)(!1),[u,b]=Object(n.r)({dx:r,dy:o,x:0,y:0}),[g,p]=Object(n.r)(oe),v=Object(n.q)(null),O=Object(n.q)(null);Object(n.n)(()=>{const e=i||g[0],t=r||g[4],a=o||g[5],n=[...g];g[0]!==e&&(n[0]=e||n[0],n[3]=e||n[3]),g[4]!==t&&(n[4]=t),g[5]!==a&&(n[5]=a),Object(h.a)(g,n)||p(function(e,t,a){const n=a&&a.querySelector(".active img");if(!a||!n)return t;const s=a.getBoundingClientRect(),c=n.getBoundingClientRect(),r=c.width/e*t[0],o=c.height/e*t[3],l=(s.width-r)/2+t[4],i=(s.height-o)/2+t[5];return s.width&&s.width-150{s||p(oe)},[s]),Object(n.n)(()=>{O.current&&(O.current.style.transform=`matrix(${g.toString()})`)},[a,g]);return a?e:n.a.createElement("div",{ref:v,className:"pan-wrapper "+(t||""),onMouseDown:e=>{if(!s)return;e.stopPropagation(),e.preventDefault();const t={dx:g[4],dy:g[5],x:e.pageX,y:e.pageY};b(t),m(!0),v.current&&v.current.classList.add("move")},onMouseUp:()=>{m(!1),v.current&&v.current.classList.remove("move"),l&&l(g[4],g[5])},onMouseMove:e=>{if(d){const t=function(e,t){const a=[...g],n=u.x-e,s=u.y-t;return a[4]=u.dx-n,a[5]=u.dy-s,a}(e.pageX,e.pageY);p(t),O.current&&(O.current.style.transform=`matrix(${g.toString()})`)}}},n.a.createElement("div",{ref:O,className:"pan-container"},e))});a(274);function de(e,t,a){return e?n.a.createElement("img",{src:e,alt:"",style:t?`width: ${t.width}px`:"",draggable:Boolean(a)}):n.a.createElement("div",{className:"spinner-wrapper",style:t?`width: ${t.width}px`:""},n.a.createElement(A.a,{color:"white"}))}var me=Object(n.h)(Object(s.h)(e=>{const{chatId:t,threadId:a,messageId:n,avatarOwnerId:s,profilePhotoIndex:c,origin:o}=e.mediaViewer,{animationLevel:l}=e.settings.byKey;if(o===r.h.SearchResult){if(!t||!n)return{animationLevel:l};const a=Object(m.l)(e,t,n);return a?{chatId:t,messageId:n,senderId:a.senderId,origin:o,message:a,animationLevel:l}:{animationLevel:l}}if(s){return{messageId:-1,senderId:s,avatarOwner:Object(m.Jb)(e,s)||Object(m.g)(e,s),profilePhotoIndex:c||0,animationLevel:l,origin:o}}if(!(t&&a&&n))return{animationLevel:l};let i,d,u;if(i=o&&[r.h.ScheduledAlbum,r.h.ScheduledInline].includes(o)?Object(m.rb)(e,t,n):Object(m.l)(e,t,n),!i)return{animationLevel:l};if(d=o&&[r.h.ScheduledAlbum,r.h.ScheduledInline].includes(o)?Object(m.sb)(e,t):Object(m.n)(e,t),o===r.h.Inline||o===r.h.Album)u=Object(m.hb)(e,t,a)||Object(m.Z)(e,t,a);else if(o===r.h.SharedMedia){const t=Object(m.w)(e),{foundIds:a}=t&&t.resultsByType&&t.resultsByType.media||{};u=a}return{chatId:t,threadId:a,messageId:n,senderId:i.senderId,origin:o,message:i,chatMessages:d,collectionIds:u,animationLevel:l}},(e,t)=>Object(h.l)(t,["openMediaViewer","closeMediaViewer","openForwardMenu","focusMessage"]))(({chatId:e,threadId:t,messageId:a,senderId:s,origin:m,avatarOwner:h,profilePhotoIndex:w,message:S,chatMessages:I,collectionIds:P,openMediaViewer:F,closeMediaViewer:A,openForwardMenu:B,focusMessage:U,animationLevel:x})=>{const z=Boolean(h||a),q=m===r.h.SharedMedia,_=m===r.h.SearchResult,H=S?Object(u.H)(S):void 0,V=S?Object(u.Q)(S):void 0,W=S?Object(u.S)(S):void 0,Y=S?Object(u.T)(S):void 0,Q=!!S&&Object(u.vb)(S),Z=!!S&&Object(u.wb)(S),J=Boolean(V||Y||Z),X=Boolean(!J&&(H||W||Q)),{isGif:ee}=V||Y||{},te=Boolean(h),ae=Boolean(W||Y),ne=Object(n.p)(()=>ae&&a?[a]:Object(u.h)(I||{},P||[],q),[ae,a,I,P,q]),se=a?ne.indexOf(a):-1,oe=0===se||-1===se,le=se===ne.length-1||-1===se,me=Object(n.q)(),ue=Object(f.a)(s);!z||ue&&ue===s&&me.current||(me.current=se);const he=x>=1?"mv-slide":"none",be=2===x?"slide-fade":"none",ge=2===x,[pe,ve]=Object(n.r)(!1),[Oe,Ee]=Object(n.r)(!1),[je,fe]=Object(n.r)(!1),[Ce,ye]=Object(n.r)(1),[ke,Ne]=Object(n.r)({x:0,y:0});function we(e){if(te&&void 0!==w){const{photos:t}=h;return t&&t[w]?`photo${t[w].id}?size=c`:Object(u.e)(h,e?"big":"normal")}return S&&Object(u.E)(S,e?"viewerFull":"viewerPreview")}const Se=Object(O.a)(S&&(q||_)&&Object(u.E)(S,"pictogram"),void 0,c.ApiMediaFormat.BlobUrl,void 0,ge&&350),Ie=we(),Pe=Object(O.a)(Ie,void 0,te&&Ie&&Ie.startsWith("profilePhoto")?c.ApiMediaFormat.DataUri:c.ApiMediaFormat.BlobUrl,void 0,ge&&350),{mediaData:Fe,downloadProgress:Me}=Object(E.a)(we(!0),void 0,S&&Object(u.D)(S,"viewerFull"),void 0,ge&&350),Le=H||V?(H||V).blobUrl:void 0;let Ae=!J&&(Le||Fe)||Pe||Se;const Re=Object(j.a)(!Ae&&S&&Object(u.F)(S));Ae||m===r.h.SearchResult||(Ae=Re);const Te=S?Object(u.A)(S):void 0,De=S?Object(u.z)(S):te?`avatar${h.id}-${w}.jpg`:void 0;let Be;S?Q||Z?Be=Object(u.y)(S).mediaSize:H||W?Be=Object(u.U)(H||W):(V||Y)&&(Be=Object(u.db)(V||Y)):Be=d.a,Object(n.n)(()=>{l.l&&document.body.classList.toggle("is-media-viewer-open",z)},[z]);const Ue=Object(v.a)();Object(n.n)(()=>{const e=window.matchMedia(d.c);return"function"==typeof e.addEventListener?e.addEventListener("change",Ue):"function"==typeof e.addListener&&e.addListener(Ue),()=>{"function"==typeof e.removeEventListener?e.removeEventListener("change",Ue):"function"==typeof e.removeListener&&e.removeListener(Ue)}},[Ue]);const xe=Object(f.a)(S),Ge=Object(f.a)(m),ze=Object(f.a)(h),qe=Object(f.a)(Ae);Object(n.n)(()=>{if(ge&&z&&!xe&&!ze){Object(C.d)(350+o.c);const e=S?Object(y.a)(S):void 0;k(Boolean(e),m,Ae,Be,J,S)}ge&&!z&&(xe||ze)&&(Object(C.d)(350+o.c),N(Ge,qe,xe||void 0))},[ge,z,m,Ge,S,xe,ze,Ae,qe,Be,J]),Object(n.n)(()=>{let e;return je?Ee(!0):e=window.setTimeout(()=>{Ee(!1)},350),()=>{e&&window.clearTimeout(e)}},[je]);const _e=()=>{fe(!1),ye(1),Ne({x:0,y:0})},He=Object(n.m)(()=>{fe(!je),ye(je?1:1.5),je&&Ne({x:0,y:0})},[je]),$e=Object(n.m)((e,t=!1)=>{ye(e),1===e&&t&&_e()},[]),Ve=Object(n.m)(()=>{A(),_e()},[A]),We=Object(n.m)(()=>{Ve(),U({chatId:e,threadId:t,messageId:a})},[Ve,e,t,U,a]),Ke=Object(n.m)(()=>{B({fromChatId:e,messageIds:[a]}),_e()},[B,e,a]);Object(n.n)(()=>z?Object(g.a)(()=>{je?_e():Ve()}):void 0,[Ve,z,je]),Object(n.n)(()=>{J&&!ee&&Object(p.b)()},[ee,J]),Object(n.n)(()=>{if(z)return i.a.disableRefresh(),()=>{i.a.enableRefresh()}},[z]);const Ye=Object(n.m)((e,t)=>{let a=ne.indexOf(e);return(-1===t&&a>0||1===t&&a{oe||F({chatId:e,threadId:t,messageId:a?Ye(a,-1):void 0,origin:m})},[e,t,Ye,oe,a,F,m]),Ze=Object(n.m)(()=>{le||F({chatId:e,threadId:t,messageId:a?Ye(a,1):void 0,origin:m})},[e,t,Ye,le,a,F,m]);Object(n.n)(()=>{const e=e=>{switch(e.key){case"Left":case"ArrowLeft":Qe();break;case"Right":case"ArrowRight":Ze()}};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}}),Object(n.n)(()=>{const e=document.querySelector(".slide-container > .active, .slide-container > .to");if(!e)return;const t=ee&&!l.e;return Object(b.b)(e,{excludedClosestSelector:".backdrop, .navigation, .media-viewer-head, .media-viewer-footer"+(t?"":", .VideoPlayer"),onClick:()=>{je||l.n||Ve()},onSwipe:l.n?(e,t)=>{t===b.a.Right?Qe():t===b.a.Left?Ze():e.target&&e.target.closest(".MediaViewerFooter")||Ve()}:void 0})},[Ve,pe,ee,X,je,Ze,Qe]);const Je=Object(n.m)((e,t)=>{Ne({x:e,y:t})},[]),Xe=Object(n.m)(()=>{l.n&&(X||ee)&&ve(!pe)},[pe,ee,X]),et=Object(M.a)();function tt(t){if(te)return n.a.createElement("div",{key:e,className:"media-viewer-content"},de(Fe||Pe,Object(d.h)(d.a,!1),!l.l&&!je));if(S){const e=Object(y.a)(S),s=Boolean(e);return n.a.createElement("div",{key:a,className:"media-viewer-content "+(s?"has-footer":""),onClick:Xe},X&&de(Le||Fe||Pe||Se,S&&Object(d.h)(Be,s),!l.l&&!je),J&&n.a.createElement(ce,{key:a,url:Le||Fe,isGif:ee,posterData:Ae,posterSize:S&&Object(d.h)(Be,s,!0),downloadProgress:Me,fileSize:Te,isMediaViewerOpen:z,noPlay:!t,onClose:Ve}),e&&n.a.createElement(K,{text:e,onClick:We,isHidden:pe&&(!J||ee),isForVideo:J&&!ee}))}}function at(){return te?n.a.createElement(G,{key:h.id,chatId:h.id,isAvatar:!0}):n.a.createElement(G,{key:a,chatId:e,messageId:a})}return Object(L.a)(z,A,F,{chatId:e,threadId:t,messageId:a,origin:m,avatarOwnerId:h&&h.id}),n.a.createElement(R.a,{id:"MediaViewer",className:je?"zoomed":"",isOpen:z},()=>n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:"media-viewer-head",dir:et.isRtl?"rtl":void 0},l.l&&n.a.createElement(D.a,{className:"media-viewer-close",round:!0,size:"smaller",color:"translucent-white",ariaLabel:et("Close"),onClick:Ve},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(T.a,{activeKey:me.current,name:be},at),n.a.createElement($,{mediaData:Fe||Pe,isVideo:J,isZoomed:je,message:S,fileName:De,onCloseMediaViewer:Ve,onForward:Ke,onZoomToggle:He,isAvatar:te})),n.a.createElement(ie,{noWrap:!Oe,canPan:je,panDeltaX:ke.x,panDeltaY:ke.y,zoomLevel:Ce,onPan:Je},n.a.createElement(T.a,{className:"slide-container",activeKey:se,name:he},tt)),!oe&&n.a.createElement("button",{type:"button",className:"navigation prev "+(J&&!ee&&"inline"),"aria-label":et("AccDescrPrevious"),dir:et.isRtl?"rtl":void 0,onClick:Qe}),!le&&n.a.createElement("button",{type:"button",className:"navigation next "+(J&&!ee&&"inline"),"aria-label":et("Next"),dir:et.isRtl?"rtl":void 0,onClick:Ze}),n.a.createElement(re,{isShown:je,onChangeZoom:$e})))})),ue=a(53),he=a(133),be=a(64),ge=a(20),pe=a(112),ve=a(47),Oe=a(115),Ee=a(108),je=a(111),fe=a(130);a(275);var Ce=Object(n.h)(Object(s.h)(e=>{const{chats:{byId:t,listIds:a,orderedPinnedIds:n},currentUserId:s}=e;return{chatsById:t,pinnedIds:n.active,activeListIds:a.active,archivedListIds:a.archived,currentUserId:s}},(e,t)=>Object(h.l)(t,["setForwardChatId","exitForwardMode","loadMoreChats"]))(({chatsById:e,pinnedIds:t,activeListIds:a,archivedListIds:s,currentUserId:r,isOpen:o,setForwardChatId:i,exitForwardMode:d,loadMoreChats:m})=>{const[b,g]=Object(n.r)(""),p=Object(n.q)(null),v=Object(M.a)();Object(n.n)(()=>{o?l.l||setTimeout(()=>{requestAnimationFrame(()=>{p.current&&p.current.focus()})},500):(p.current&&p.current.blur(),setTimeout(()=>{g("")},300))},[o]);const O=Object(n.p)(()=>{const n=[...a||[],...s||[]];let o=t||[];return r&&(o=Object(h.o)([r,...o])),Object(u.Ib)([...n.filter(t=>{const a=e[t];return!a||!!Object(u.d)(a,c.MAIN_THREAD_ID)&&(!b||Object(ue.a)(Object(u.k)(v,e[t],void 0,t===r),b))})],e,void 0,o)},[a,s,e,r,b,v,t]),[E,j]=Object(he.a)(m,O,Boolean(b)),f=Object(n.m)(e=>{g(e.currentTarget.value)},[]),C=Object(n.q)(null),y=Object(be.a)(C,o,e=>{E&&E.length>0&&i({id:E[-1===e?0:e]})},".ListItem-button",!0),k=n.a.createElement("div",{className:"modal-header",dir:v.isRtl?"rtl":void 0},n.a.createElement(D.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:v("Close"),onClick:d},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(ve.a,{ref:p,value:b,onChange:f,onKeyDown:y,placeholder:v("ForwardTo")}));return n.a.createElement(pe.a,{isOpen:o,onClose:d,className:"ForwardPicker",header:k},E&&E.length?n.a.createElement(Oe.a,{className:"picker-list custom-scroll",items:E,onLoadMore:j,noScrollRestore:Boolean(b),ref:C,onKeyDown:y},E.map(e=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable force-rounded-corners",onClick:()=>i({id:e})},Object(u.ob)(e)?n.a.createElement(je.a,{status:e===r?v("SavedMessagesInfo"):void 0,userId:e}):n.a.createElement(fe.a,{chatId:e})))):E&&!E.length?n.a.createElement("p",{className:"no-results"},"Sorry, nothing found."):n.a.createElement(ge.a,null))})),ye=a(177);a(276);function ke(e){return e.isSlowMode?"Slowmode enabled":e.hasErrorKey?"Something went wrong":"Telegram"}var Ne=Object(n.h)(Object(s.h)(e=>Object(h.l)(e,["dialogs"]),(e,t)=>Object(h.l)(t,["dismissDialog","acceptInviteConfirmation"]))(({dialogs:e,dismissDialog:t,acceptInviteConfirmation:a})=>{const s=Object(M.a)();if(!e.length)return;return n.a.createElement("div",{id:"Dialogs"},e.map(e=>{return"hash"in e?(e=>{const{hash:c,title:r,participantsCount:o,isChannel:l}=e,i=s(l?"Subscribers":"Members",o,"i"),d=s(l?"ChannelJoin":"JoinGroup");return n.a.createElement(pe.a,{isOpen:!0,onClose:t,className:"error",title:r},void 0!==o&&n.a.createElement("p",null,i),n.a.createElement(D.a,{isText:!0,className:"confirm-dialog-button",onClick:()=>{a({hash:c}),t()}},d),n.a.createElement(D.a,{isText:!0,className:"confirm-dialog-button",onClick:t},s("Cancel")))})(e):(c=e,n.a.createElement(pe.a,{isOpen:!0,onClose:t,className:"error",title:ke(c)},c.hasErrorKey?Object(ye.a)(c):Object(U.a)(c.message,["emoji","br"]),n.a.createElement("div",null,n.a.createElement(D.a,{isText:!0,onClick:t},s("OK")))));var c}))})),we=a(189);var Se=Object(n.h)(Object(s.h)(e=>Object(h.l)(e,["notifications"]),(e,t)=>Object(h.l)(t,["dismissNotification"]))(({notifications:e,dismissNotification:t})=>{if(e.length)return n.a.createElement("div",{id:"Notifications"},e.map(({message:e})=>n.a.createElement(we.a,{message:Object(U.a)(e,["emoji","br","links","simple_markdown"]),onDismiss:t})))})),Ie=a(139),Pe=a(120);var Fe=Object(n.h)(Object(s.h)(void 0,(e,t)=>Object(h.l)(t,["toggleSafeLinkModal"]))(({url:e,toggleSafeLinkModal:t})=>{const a=Object(M.a)(),s=Object(n.m)(()=>{window.open(e),t({url:void 0})},[t,e]),c=Object(n.m)(()=>{t({url:void 0})},[t]),r=Object(Ie.a)(e);return n.a.createElement(Pe.a,{isOpen:Boolean(e),onClose:c,title:a("OpenUrlTitle"),textParts:Object(U.a)(a("OpenUrlAlert2",r),["links"]),confirmLabel:a("OpenUrlTitle"),confirmHandler:s})}));a(277);const Me=["lng_weekday1","lng_weekday2","lng_weekday3","lng_weekday4","lng_weekday5","lng_weekday6","lng_weekday7"];function Le(e,t,a,n,s){const c=new Date(e,t,a,0,0,0,0),r=n&&new Date(n.getFullYear(),n.getMonth(),n.getDate(),0,0,0,0),o=s&&new Date(s.getFullYear(),s.getMonth(),s.getDate(),0,0,0,0);return!!(o&&c>o)||!!(r&&c{const u=Object(M.a)(),h=new Date,b=Object(n.p)(()=>e?new Date(e):new Date,[e]),g=t?new Date(t):void 0,p=Object(f.a)(c),[v,O]=Object(n.r)(b),[E,j]=Object(n.r)(Ae(b.getHours())),[C,y]=Object(n.r)(Ae(b.getMinutes())),k=v.getFullYear(),N=v.getMonth(),w=v.getDate();Object(n.n)(()=>{!p&&c&&O(b)},[c,b,p]);const S=s&&k>=h.getFullYear()&&N>=h.getMonth()||g&&k>=g.getFullYear()&&N>=g.getMonth(),I=a&&k<=h.getFullYear()&&N<=h.getMonth(),P=Object(n.p)(()=>function(e,t){const a=[],n=new Date;n.setFullYear(e),n.setMonth(t),n.setDate(1);const s=n.getDay()||7;for(let e=1;e{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return j(""),void(e.target.value="");const a=Math.max(0,Math.min(Number(t),23)),n=new Date(v.getTime());n.setHours(a),O(n);const s=Ae(a);j(s),e.target.value=s},[v]),L=Object(n.m)(e=>{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return y(""),void(e.target.value="");const a=Math.max(0,Math.min(Number(t),59)),n=new Date(v.getTime());n.setMinutes(a),O(n);const s=Ae(a);y(s),e.target.value=s},[v]);return n.a.createElement(pe.a,{isOpen:c,onClose:i,className:"CalendarModal"},n.a.createElement("div",{className:"container"},n.a.createElement("div",{className:"month-selector"},n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:i},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h4",null,u("lng_month"+(v.getMonth()+1))," ",v.getFullYear()),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",disabled:I,onClick:I?void 0:function(){O(e=>{const t=new Date(e);return t.setMonth(t.getMonth()-1),t})}},n.a.createElement("i",{className:"icon-previous"})),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",disabled:S,onClick:S?void 0:function(){O(e=>{const t=new Date(e);return t.setMonth(t.getMonth()+1),t})}},n.a.createElement("i",{className:"icon-next"})))),n.a.createElement("div",{className:"calendar-wrapper"},n.a.createElement("div",{className:"calendar-grid"},Me.map(e=>n.a.createElement("div",{className:"day-button faded weekday"},n.a.createElement("span",null,u(e)))),P.map(e=>n.a.createElement("div",{role:"button",tabIndex:0,onClick:()=>{return t=e,void O(e=>{const a=new Date(e);return a.setDate(t),a});var t},className:Object(W.a)("day-button",Le(k,N,e,a?h:void 0,s?h:g)?"disabled":""+(e?"clickable":""),e===w&&"selected")},!!e&&n.a.createElement("span",null,e))))),r&&n.a.createElement("div",{className:"timepicker"},n.a.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:E,onChange:F}),":",n.a.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:C,onChange:L})),n.a.createElement("div",{className:"footer"},n.a.createElement(D.a,{onClick:function(){d(v)}},r?function(e,t){const a=Object(B.a)(t,e.code),n=Object(B.a)(new Date,e.code);if(a===n)return e("Conversation.ScheduleMessage.SendToday",Object(B.h)(t));return e("Conversation.ScheduleMessage.SendOn",[a,Object(B.h)(t)])}(u,v):o),l&&n.a.createElement(D.a,{onClick:m,isText:!0},l)))});var Te=Object(n.h)(Object(s.h)(e=>({selectedAt:e.historyCalendarSelectedAt}),(e,t)=>Object(h.l)(t,["searchMessagesByDate","closeHistoryCalendar"]))(({isOpen:e,selectedAt:t,searchMessagesByDate:a,closeHistoryCalendar:s})=>{const c=Object(n.m)(e=>{a({timestamp:e.valueOf()/1e3}),s()},[s,a]),r=Object(M.a)();return n.a.createElement(Re,{isOpen:e,selectedAt:t,isPastMode:!0,submitButtonLabel:r("JumpToDate"),onClose:s,onSubmit:c})}));var De=Object(n.h)(Object(s.h)((e,{message:t,isSchedule:a})=>{const{threadId:n}=Object(m.z)(e)||{},{canDeleteForAll:s}=n&&Object(m.b)(e,t,n)||{},c=Object(m.g)(e,t.chatId);return{canDeleteForAll:!a&&s,contactName:c&&Object(u.ob)(c.id)?Object(u.ab)(Object(m.Jb)(e,Object(u.W)(c))):void 0,willDeleteForCurrentUserOnly:c&&Object(u.lb)(c)&&!s,willDeleteForAll:c&&Object(u.qb)(c)}},(e,t)=>Object(h.l)(t,["deleteMessages","deleteScheduledMessages"]))(({isOpen:e,isSchedule:t,message:a,album:s,canDeleteForAll:c,contactName:r,willDeleteForCurrentUserOnly:o,willDeleteForAll:l,onClose:i,deleteMessages:d,deleteScheduledMessages:m})=>{const u=Object(n.m)(()=>{const e=s&&s.messages?s.messages.map(({id:e})=>e):[a.id];d({messageIds:e,shouldDeleteForAll:!0}),i()},[d,a.id,i,s]),h=Object(n.m)(()=>{const e=s&&s.messages?s.messages.map(({id:e})=>e):[a.id];t?m({messageIds:e}):d({messageIds:e,shouldDeleteForAll:!1}),i()},[s,a.id,t,i,m,d]),b=Object(M.a)();return n.a.createElement(pe.a,{isOpen:e,onClose:i,onEnter:e&&!c?h:void 0,className:"delete",title:b("DeleteSingleMessagesTitle")},n.a.createElement("p",null,b("AreYouSureDeleteSingleMessage")),o&&n.a.createElement("p",null,b("lng_delete_for_me_chat_hint",1,"i")),l&&n.a.createElement("p",null,b("lng_delete_for_everyone_hint",1,"i")),c&&n.a.createElement(D.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:u},r&&Object(U.a)(b("Conversation.DeleteMessagesFor",r)),!r&&b("Conversation.DeleteMessagesForEveryone")),n.a.createElement(D.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},b(c?"ChatList.DeleteForCurrentUser":"Delete")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:i},b("Cancel")))}));var Be=Object(n.h)(Object(s.h)((e,{chatId:t})=>{const a=Object(u.ob)(t),n=Object(m.P)(e,t),s=Object(m.g)(e,t),c=!!s&&Object(u.mb)(s),r=!!s&&Object(u.lb)(s),o=!!s&&Object(u.qb)(s);return{isPrivateChat:a,isChatWithSelf:n,isChannel:c,isGroup:r,isSuperGroup:o,canPinForAll:a&&!n||o||r,contactName:s&&Object(u.ob)(s.id)?Object(u.ab)(Object(m.Jb)(e,Object(u.W)(s))):void 0}},(e,t)=>Object(h.l)(t,["pinMessage"]))(({isOpen:e,messageId:t,chatId:a,isChannel:s,isGroup:c,isSuperGroup:r,canPinForAll:o,contactName:l,onClose:i,pinMessage:d})=>{const m=Object(n.m)(()=>{d({chatId:a,messageId:t,isUnpin:!1}),i()},[d,a,t,i]),u=Object(n.m)(()=>{d({chatId:a,messageId:t,isUnpin:!1,isOneSide:!0,isSilent:!0}),i()},[a,t,i,d]),h=Object(M.a)();return n.a.createElement(pe.a,{isOpen:e,onClose:i,className:"pin",title:h("PinMessageAlertTitle")},n.a.createElement("p",null,h(s?"PinMessageAlertChannel":c||r?"PinMessageAlert":"PinMessageAlertChat")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:u},h("DialogPin")),o&&n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:m},l?Object(U.a)(h("Conversation.PinMessagesFor",l)):h("Conversation.PinMessageAlert.PinAndNotifyMembers")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:i},h("Cancel")))}));var Ue=Object(n.h)(({isOpen:e,pinnedMessagesCount:t=0,onClose:a,onUnpin:s})=>{const c=Object(M.a)();return n.a.createElement(pe.a,{isOpen:e,onClose:a,className:"unpin-all",title:c("Chat.PanelUnpinAllMessages")},n.a.createElement("p",null,c("Chat.UnpinAllMessagesConfirmation",t,"i")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:s},c("DialogUnpin")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:a},c("Cancel")))}),xe=a(25),Ge=a(56);var ze=Object(n.h)(Object(s.h)((e,{isSchedule:t})=>{const{messageIds:a}=e.selectedMessages||{},{canDeleteForAll:n}=Object(m.e)(e),s=Object(m.s)(e);return{selectedMessageIds:a,canDeleteForAll:!t&&n,contactName:s&&Object(u.ob)(s.id)?Object(u.ab)(Object(m.Jb)(e,Object(u.W)(s))):void 0,willDeleteForCurrentUserOnly:s&&Object(u.lb)(s)&&!n,willDeleteForAll:s&&Object(u.qb)(s)}},(e,t)=>Object(h.l)(t,["deleteMessages","deleteScheduledMessages","exitMessageSelectMode"]))(({isOpen:e,isSchedule:t,selectedMessageIds:a,canDeleteForAll:s,contactName:c,willDeleteForCurrentUserOnly:r,willDeleteForAll:o,onClose:l,deleteMessages:i,deleteScheduledMessages:d,exitMessageSelectMode:m})=>{const u=Object(f.a)(e),h=Object(n.m)(()=>{l(),i({messageIds:a,shouldDeleteForAll:!0})},[i,a,l]),b=Object(n.m)(()=>{t?d({messageIds:a}):i({messageIds:a,shouldDeleteForAll:!1}),l()},[t,l,d,a,i]),g=Object(M.a)();if(Object(n.n)(()=>{!e&&u&&m()},[m,e,u]),a)return n.a.createElement(pe.a,{isOpen:e,onClose:l,onEnter:s?void 0:b,className:"delete",title:g("Conversation.DeleteManyMessages")},n.a.createElement("p",null,g("AreYouSureDeleteFewMessages")),r&&n.a.createElement("p",null,"This will delete them just for you, not for other participants in the chat."),o&&n.a.createElement("p",null,"This will delete them for everyone in this chat."),s&&n.a.createElement(D.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},c?Object(U.a)(g("ChatList.DeleteForEveryone",c)):g("Conversation.DeleteMessagesForEveryone")),n.a.createElement(D.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:b},g(s?"ChatList.DeleteForCurrentUser":"Delete")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:l},g("Cancel")))})),qe=a(126);var _e=Object(n.h)(Object(s.h)(void 0,(e,t)=>Object(h.l)(t,["reportMessages","exitMessageSelectMode"]))(({isOpen:e,messageIds:t,reportMessages:a,exitMessageSelectMode:s,onClose:c})=>{const[r,o]=Object(n.r)("spam"),[l,i]=Object(n.r)(""),d=()=>{a({messageIds:t,reason:r,description:l}),s(),c()},m=Object(n.m)(e=>{o(e)},[]),u=Object(n.m)(e=>{i(e.target.value)},[]),h=Object(M.a)(),b=[{value:"spam",label:h("lng_report_reason_spam")},{value:"violence",label:h("lng_report_reason_violence")},{value:"pornography",label:h("lng_report_reason_pornography")},{value:"childAbuse",label:h("lng_report_reason_child_abuse")},{value:"copyright",label:h("ReportPeer.ReasonCopyright")},{value:"other",label:h("lng_report_reason_other")}];if(t)return n.a.createElement(pe.a,{isOpen:e,onClose:c,onEnter:e?d:void 0,className:"report",title:h("lng_report_message_title")},n.a.createElement(qe.a,{name:"report-message",options:b,onChange:m,selected:r}),n.a.createElement(ve.a,{label:h("lng_report_reason_description"),value:l,onChange:u}),n.a.createElement(D.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:d},h("lng_report_button")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:c},h("Cancel")))}));a(278);var He=Object(n.h)(Object(s.h)(e=>{const{type:t}=Object(m.z)(e)||{},{canDelete:a}=Object(m.e)(e),n=Object(m.f)(e),{messageIds:s}=e.selectedMessages||{};return{isSchedule:"scheduled"===t,selectedMessagesCount:Object(m.ub)(e),canDeleteMessages:a,canReportMessages:n,selectedMessageIds:s}},(e,t)=>Object(h.l)(t,["exitMessageSelectMode","openForwardMenuForSelectedMessages"]))(({canPost:e,isActive:t,messageListType:a,isSchedule:s,selectedMessagesCount:c,canDeleteMessages:r,canReportMessages:o,selectedMessageIds:l,exitMessageSelectMode:i,openForwardMenuForSelectedMessages:d})=>{const[m,u,h]=Object(xe.a)(),[b,g,p]=Object(xe.a)();Object(n.n)(()=>!t||m||b?void 0:Object(Ge.a)({onBackspace:u,onDelete:u,onEsc:i}),[t,m,b,u,i]);const v=Object(f.a)(c||void 0,!0),O=t?c:v,E=Object(M.a)(),j=E("VoiceOver.Chat.MessagesSelected",O),C=Object(W.a)("MessageSelectToolbar",e&&"with-composer",t&&"shown");return n.a.createElement("div",{className:C},n.a.createElement("div",{className:"MessageSelectToolbar-inner"},n.a.createElement(D.a,{color:"translucent",round:!0,onClick:i,ariaLabel:"Exit select mode"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("span",{className:"MessageSelectToolbar-count",title:j},j),!!c&&n.a.createElement("div",{className:"MessageSelectToolbar-actions"},"scheduled"!==a&&n.a.createElement(_.a,{icon:"forward",ariaLabel:"Forward Messages",onClick:d},n.a.createElement("span",{className:"item-text"},E("Forward"))),o&&n.a.createElement(_.a,{icon:"flag",onClick:g,disabled:!o,ariaLabel:E("Conversation.ReportMessages")},n.a.createElement("span",{className:"item-text"},E("Report"))),n.a.createElement(_.a,{destructive:!0,icon:"delete",onClick:u,disabled:!r,ariaLabel:E("EditAdminGroupDeleteMessages")},n.a.createElement("span",{className:"item-text"},E("Delete"))))),n.a.createElement(ze,{isOpen:m,isSchedule:s,onClose:h}),n.a.createElement(_e,{isOpen:b,onClose:p,messageIds:l}))})),$e=a(176),Ve=a(51),We=a(179),Ke=e=>{const t=Object(n.q)(null),a=Object(n.m)(a=>{if("Enter"!==a.key)return;t.current===document.activeElement&&e()},[e]);return Object(n.n)(()=>(window.addEventListener("keydown",a,!1),()=>window.removeEventListener("keydown",a)),[a]),t},Ye=a(162);var Qe=Object(n.h)(Object(s.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),n=a&&Object(u.W)(a);return{chat:a,privateChatUser:n?Object(m.Jb)(e,n):void 0,isPinned:Object(m.N)(e,t),isMuted:a?Object(u.Hb)(a,Object(m.fb)(e),Object(m.eb)(e)):void 0}})(({chatId:e,chat:t,privateChatUser:a,isPinned:s,isMuted:c,withUsername:r,onClick:o})=>{const[l,i,d]=Object(xe.a)(),m=Object(We.a)({chat:t,privateChatUser:a,isPinned:s,isMuted:c,handleDelete:i}),h=()=>{o(e)},b=Ke(h);if(t)return n.a.createElement(Ee.a,{className:"chat-item-clickable search-result",onClick:h,contextActions:m,buttonRef:b},Object(u.ob)(e)?n.a.createElement(je.a,{userId:e,withUsername:r,avatarSize:"large"}):n.a.createElement(fe.a,{chatId:e,withUsername:r,avatarSize:"large"}),n.a.createElement(Ye.a,{isOpen:l,onClose:d,chat:t}))})),Ze=a(148);a(279);const Je=Object(V.h)(e=>e(),6e4,!0);var Xe=Object(n.h)(Object(s.h)(e=>{const{userIds:t}=e.topPeers,a=e.users.byId,{recentlyFoundChatIds:n}=e.globalSearch;return{topUserIds:t,usersById:a,recentlyFoundChatIds:n}},(e,t)=>Object(h.l)(t,["loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats"]))(({topUserIds:e,usersById:t,recentlyFoundChatIds:a,onReset:s,loadTopUsers:c,loadContactList:r,openChat:o,addRecentlyFoundChatId:l,clearRecentlyFoundChats:i})=>{const d=Object(n.q)(null);Object(n.n)(()=>{Je(()=>{c(),r()})},[c,r]),Object(Ze.a)(d.current,!e);const m=Object(n.m)(e=>{o({id:e,shouldReplaceHistory:!0}),s(),setTimeout(()=>{l({id:e})},250)},[o,l,s]),h=Object(M.a)();return n.a.createElement("div",{className:"RecentContacts custom-scroll"},e&&n.a.createElement("div",{className:"top-peers-section",dir:h.isRtl?"rtl":void 0},n.a.createElement("div",{ref:d,className:"top-peers no-selection"},e.map(e=>n.a.createElement("div",{className:"top-peer-item",onClick:()=>m(e),dir:h.isRtl?"rtl":void 0},n.a.createElement(x.a,{user:t[e]}),n.a.createElement("div",{className:"top-peer-name"},Object(U.a)(Object(u.ab)(t[e])||" ")))))),a&&n.a.createElement("div",{className:"search-section pt-1"},n.a.createElement("h3",{className:"section-heading mt-0 recent-chats-header",dir:h.isRtl?"rtl":void 0},h("Recent"),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",ariaLabel:"Clear recent chats",onClick:i,isRtl:h.isRtl},n.a.createElement("i",{className:"icon-close"}))),a.map(e=>n.a.createElement(Qe,{chatId:e,onClick:m}))))})),et=a(138),tt=a(32);a(280);var at=Object(n.h)(Object(s.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t);if(!a)return{};const n=Object(u.W)(a);return{chat:a,lastSyncTime:e.lastSyncTime,...n&&{privateChatUser:Object(m.Jb)(e,n)}}},(e,t)=>Object(h.l)(t,["focusMessage"]))(({message:e,searchQuery:t,chatId:a,chat:s,privateChatUser:c,focusMessage:r,lastSyncTime:o})=>{const i=Object(u.F)(e),d=Object(O.a)(Object(u.E)(e,"micro")),m=Boolean(Object(u.J)(e)),h=Object(n.m)(()=>{r({chatId:a,messageId:e.id})},[a,r,e.id]),b=Object(M.a)(),g=Ke(h);if(s)return n.a.createElement(Ee.a,{className:"ChatMessage chat-item-clickable",ripple:!l.l,onClick:h,buttonRef:g},n.a.createElement(x.a,{chat:s,user:c,withOnlineStatus:!0,isSavedMessages:c&&c.isSelf,lastSyncTime:o}),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"info-row"},n.a.createElement("div",{className:"title"},n.a.createElement("h3",{dir:"auto"},Object(U.a)(Object(u.k)(b,s,c))),s.isVerified&&n.a.createElement(et.a,null)),n.a.createElement("div",{className:"message-date"},n.a.createElement(tt.a,{className:"date"},Object(B.g)(b,1e3*e.date)))),n.a.createElement("div",{className:"subtitle"},n.a.createElement("div",{className:"message",dir:"auto"},function(e,t,a,s,c){if(!a)return Object(U.a)(Object(u.O)(e,t));return n.a.createElement("span",{className:"media-preview"},n.a.createElement("img",{src:a,alt:"",className:c?"round":void 0}),Object(u.Q)(t)&&n.a.createElement("i",{className:"icon-play"}),Object(U.a)(Object(u.O)(e,t,!0),["emoji","highlight"],{highlight:s}))}(b,e,d||i,t,m)))))}));a(281);var nt=Object(n.h)(({searchDate:e,onSelect:t})=>{const a=Object(n.p)(()=>function(e){if(e.match(/^\d{2,4}-\d{2}-\d{2}$/g)){const t=new Date(e);return[{date:t,text:Object(B.a)(t)}]}const t=[],a=new Date,n=a.getFullYear(),s=a.getTime()>new Date(`${n}-${e}`).getTime()?n:n-1;for(let a=0;a<8;a++){const n=new Date(`${s-a}-${e}`);t.push({date:n,text:Object(B.a)(n)})}return t}(e),[e]);return n.a.createElement("section",{className:"DateSuggest custom-scroll custom-scroll-x"},a.map(({date:e,text:a})=>n.a.createElement("div",{onClick:()=>t(e),className:"date-item",key:a},n.a.createElement("i",{className:"icon-calendar"}),n.a.createElement("span",null,a))))}),st=a(121),ct=a(146);const rt=Object(V.h)(e=>e(),500,!0);var ot=Object(n.h)(Object(s.h)(e=>{const{byId:t}=e.chats,{byId:a}=e.users,{userIds:n}=e.contactList||{};if(!n)return{chatsById:t,usersById:a};const{currentUserId:s,messages:c,lastSyncTime:r}=e,{fetchingStatus:o,globalResults:l,localResults:i,resultsByType:d}=e.globalSearch,{chatIds:m,userIds:u}=l||{},{chatIds:h,userIds:b}=i||{},{byChatId:g}=c,{foundIds:p}=d&&d.text||{};return{currentUserId:s,localContactIds:n,localChatIds:h,localUserIds:b,globalChatIds:m,globalUserIds:u,foundIds:p,globalMessagesByChatId:g,chatsById:t,usersById:a,fetchingStatus:o,lastSyncTime:r}},(e,t)=>Object(h.l)(t,["openChat","addRecentlyFoundChatId","searchMessagesGlobal","setGlobalSearchChatId"]))(({searchQuery:e,searchDate:t,dateSearchQuery:a,currentUserId:s,localContactIds:c,localChatIds:o,localUserIds:i,globalChatIds:d,globalUserIds:m,foundIds:b,globalMessagesByChatId:g,chatsById:p,usersById:v,fetchingStatus:O,lastSyncTime:E,onReset:j,onSearchDateSelect:f,openChat:C,addRecentlyFoundChatId:y,searchMessagesGlobal:k,setGlobalSearchChatId:N})=>{const w=Object(M.a)(),[S,I]=Object(n.r)(!1),[P,F]=Object(n.r)(!1),L=Object(n.m)(({direction:t})=>{E&&t===r.e.Backwards&&rt(()=>{k({type:"text",query:e})})},[E,k,e]),A=Object(n.m)(e=>{C({id:e,shouldReplaceHistory:!0}),e!==s&&y({id:e}),l.l||j()},[s,C,y,j]),R=Object(n.m)(e=>{N({id:e})},[N]),T=Object(n.p)(()=>{if(!e||e.startsWith("@")&&e.length<2)return Ve.a;const t=c?c.filter(t=>{const a=v[t];if(!a)return!1;const n=Object(u.bb)(a);return n&&Object(ue.a)(n,e)||Object(ue.a)(a.username,e)}):[];return[...s&&Object(ue.a)(w("SavedMessages"),e)?[s]:[],...Object(u.Ib)(Object(h.o)([...t,...o||[],...i||[]]),p)]},[e,c,s,w,o,i,p,v]),D=Object(n.p)(()=>!e||e.length<4||!d||!m?Ve.a:Object(u.Ib)(Object(h.o)([...d,...m]),p,!0),[p,d,m,e]),B=Object(n.p)(()=>(e||t)&&b&&0!==b.length?b.map(e=>{const[t,a]=e.split("_").map(Number);return g&&g[t]&&g[t].byId[a]}).filter(Boolean).sort((e,t)=>t.date-e.date):Ve.a,[b,g,e,t]),U=Object(n.m)(()=>{I(!S)},[S]),x=Object(n.m)(()=>{F(!P)},[P]);const G=O&&!O.chats&&!O.messages&&!T.length&&!D.length&&!B.length;return e||t?n.a.createElement(Oe.a,{className:"LeftSearch custom-scroll",items:B,onLoadMore:L,noScrollRestoreOnTop:!0,noFastList:!0},a&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar"},n.a.createElement(nt,{searchDate:a,onSelect:f})),G&&n.a.createElement(st.a,{text:w("ChatList.Search.NoResults"),description:w("ChatList.Search.NoResultsDescription")}),!!T.length&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar",dir:w.isRtl?"rtl":void 0},T.map(e=>n.a.createElement(ct.a,{chatOrUserId:e,onClick:R,clickArg:e}))),!!T.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading",dir:w.isRtl?"auto":void 0},T.length>3&&n.a.createElement(tt.a,{onClick:U},w(S?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),w("DialogList.SearchSectionDialogs")),T.map((e,t)=>{if(S||!(t>=3))return n.a.createElement(Qe,{chatId:e,onClick:A})})),!!D.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading",dir:w.isRtl?"auto":void 0},D.length>3&&n.a.createElement(tt.a,{onClick:x},w(P?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),w("DialogList.SearchSectionGlobal")),D.map((e,t)=>{if(P||!(t>=3))return n.a.createElement(Qe,{chatId:e,withUsername:!0,onClick:A})})),!!B.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading",dir:w.isRtl?"auto":void 0},w("SearchMessages")),B.map((function(t){const a=Object(u.O)(w,t),s=p[t.chatId];if(a&&s)return n.a.createElement(at,{chatId:t.chatId,message:t,searchQuery:e})})))):n.a.createElement(Xe,{onReset:j})}));const lt=Object(V.h)(e=>e(),500,!0);var it=Object(n.h)(Object(s.h)(e=>{const{byId:t}=e.chats,{currentUserId:a,messages:{byChatId:n},lastSyncTime:s}=e,{fetchingStatus:c,resultsByType:r}=e.globalSearch,{foundIds:o}=r&&r.text||{};return{currentUserId:a,foundIds:o,globalMessagesByChatId:n,chatsById:t,fetchingStatus:c,lastSyncTime:s}},(e,t)=>Object(h.l)(t,["searchMessagesGlobal"]))(({searchQuery:e,currentUserId:t,dateSearchQuery:a,foundIds:s,globalMessagesByChatId:c,chatsById:o,fetchingStatus:l,lastSyncTime:i,searchMessagesGlobal:d,onSearchDateSelect:m})=>{const h=Object(M.a)(),b=Object(n.m)(({direction:a})=>{i&&a===r.e.Backwards&<(()=>{d({type:"text",query:e,chatId:t})})},[t,i,d,e]),g=Object(n.p)(()=>s&&0!==s.length?s.map(e=>{const[t,a]=e.split("_").map(Number);return c&&c[t]&&c[t].byId[a]}).filter(Boolean).sort((e,t)=>t.date-e.date):Ve.a,[s,c]);const p=l&&!l.chats&&!l.messages&&!g.length;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(Oe.a,{className:"search-content custom-scroll chat-list",items:g,onLoadMore:b,noFastList:!0},a&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar"},n.a.createElement(nt,{searchDate:a,onSelect:m})),p&&n.a.createElement(st.a,{text:h("ChatList.Search.NoResults"),description:h("ChatList.Search.NoResultsDescription")}),!!g.length&&g.map((function(t){const a=Object(u.O)(h,t),s=o[t.chatId];if(a&&s)return n.a.createElement(at,{chatId:t.chatId,message:t,searchQuery:e})}))))}));function dt(e){return(t,a)=>{const{byId:n}=t.chats,{byId:s}=t.users,{fetchingStatus:c,resultsByType:r,chatId:o}=t.globalSearch,l="audio"!==e?e:a&&a.isVoice?"voice":"audio",{byChatId:i}=t.messages,{foundIds:d}=r&&r[l]||{};return{theme:Object(m.Db)(t),isLoading:void 0===d||!!c&&Boolean(c.chats||c.messages),chatsById:n,usersById:s,globalMessagesByChatId:i,foundIds:d,searchChatId:o,lastSyncTime:t.lastSyncTime}}}var mt=a(122),ut=a(172);const ht=Object(V.h)(e=>e(),500,!0);var bt=Object(n.h)(Object(s.h)(dt("media"),(e,t)=>Object(h.l)(t,["searchMessagesGlobal","openMediaViewer"]))(({searchQuery:e,searchChatId:t,isLoading:a,globalMessagesByChatId:s,foundIds:c,lastSyncTime:l,searchMessagesGlobal:i,openMediaViewer:d})=>{const m=Object(M.a)(),u=Object(n.m)(({direction:a})=>{l&&a===r.e.Backwards&&ht(()=>{i({type:"media",query:e,chatId:t})})},[l,i,e,t]),h=Object(n.p)(()=>c&&s?c.map(e=>{const[t,a]=e.split("_").map(Number);return s[t]&&s[t].byId[a]}).filter(Boolean):Ve.a,[s,c]),b=Object(n.m)((e,t)=>{d({chatId:t,messageId:e,origin:r.h.SearchResult})},[d]);const g=Object(mt.a)([e],o.Bb)&&!a,p=g&&c&&c.length>0&&!e,v=g&&c&&c.length>0&&e,O=Object(W.a)("search-content custom-scroll",v&&"chat-list");return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(Oe.a,{className:O,items:h,itemSelector:e?".ListItem":".Media",onLoadMore:u,noFastList:!0},!g&&n.a.createElement(ge.a,null),g&&(!c||0===c.length)&&n.a.createElement(st.a,{text:m("ChatList.Search.NoResults"),description:m("ChatList.Search.NoResultsDescription")}),p&&n.a.createElement("div",{className:"media-list",dir:m.isRtl?"rtl":void 0},h.map(e=>n.a.createElement(ut.a,{key:e.id,idPrefix:"search-media",message:e,onClick:b}))),v&&h.map(e=>n.a.createElement(at,{key:e.id,chatId:e.chatId,message:e}))))}));function gt(e,t,a,n){const{senderId:s}=t;if(!s)return;const c=Object(u.ob)(s)?n[s]:a[s];let r=Object(u.X)(e,c);const o=a[t.chatId];return o&&(Object(u.ob)(s)&&c.isSelf?r=`${e("FromYou")} → ${Object(u.k)(e,o)}`:Object(u.nb)(o)&&(r+=" → "+Object(u.k)(e,o))),r}var pt=a(194);const vt=Object(V.h)(e=>e(),500,!0);var Ot=Object(n.h)(Object(s.h)(dt("links"),(e,t)=>Object(h.l)(t,["searchMessagesGlobal","focusMessage"]))(({searchQuery:e,searchChatId:t,isLoading:a,chatsById:s,usersById:c,globalMessagesByChatId:l,foundIds:i,lastSyncTime:d,searchMessagesGlobal:m,focusMessage:u})=>{const h=Object(M.a)(),b=Object(n.m)(({direction:a})=>{d&&a===r.e.Backwards&&vt(()=>{m({type:"links",query:e,chatId:t})})},[d,m,e,t]),g=Object(n.p)(()=>i&&l?i.map(e=>{const[t,a]=e.split("_").map(Number);return l[t]&&l[t].byId[a]}).filter(Boolean):Ve.a,[l,i]),p=Object(n.m)((e,t)=>{u({chatId:t,messageId:e})},[u]);const v=Object(mt.a)([e],o.Bb)&&!a;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(Oe.a,{className:"search-content documents-list custom-scroll",items:g,onLoadMore:b,noFastList:!0},!v&&n.a.createElement(ge.a,null),v&&(!i||0===i.length)&&n.a.createElement(st.a,{text:h("ChatList.Search.NoResults"),description:h("ChatList.Search.NoResultsDescription")}),v&&i&&i.length>0&&g.map((e,t)=>{const a=0===t||Object(B.n)(e.date)!==Object(B.n)(g[t-1].date);return n.a.createElement("div",{className:"ListItem",dir:h.isRtl?"rtl":void 0,key:e.id},a&&n.a.createElement("p",{className:"section-heading",dir:h.isRtl?"rtl":void 0},Object(B.f)(h,new Date(1e3*e.date))),n.a.createElement(pt.a,{key:e.id,message:e,senderTitle:gt(h,e,s,c),onMessageClick:p}))})))})),Et=a(166);const jt=Object(V.h)(e=>e(),500,!0);var ft=Object(n.h)(Object(s.h)(dt("documents"),(e,t)=>Object(h.l)(t,["searchMessagesGlobal","focusMessage"]))(({searchQuery:e,searchChatId:t,isLoading:a,chatsById:s,usersById:c,globalMessagesByChatId:l,foundIds:i,lastSyncTime:d,searchMessagesGlobal:m,focusMessage:h})=>{const b=Object(M.a)(),g=Object(n.m)(({direction:a})=>{d&&a===r.e.Backwards&&jt(()=>{m({type:"documents",query:e,chatId:t})})},[d,m,e,t]),p=Object(n.p)(()=>i&&l?i.map(e=>{const[t,a]=e.split("_").map(Number),n=l[t]&&l[t].byId[a];return n&&Object(u.y)(n)?n:void 0}).filter(Boolean):Ve.a,[l,i]),v=Object(n.m)((e,t)=>{h({chatId:t,messageId:e})},[h]);const O=Object(mt.a)([e],o.Bb)&&!a;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(Oe.a,{className:"search-content documents-list custom-scroll",items:p,onLoadMore:g,noFastList:!0},!O&&n.a.createElement(ge.a,null),O&&(!i||0===i.length)&&n.a.createElement(st.a,{text:b("ChatList.Search.NoResults"),description:b("ChatList.Search.NoResultsDescription")}),O&&i&&i.length>0&&p.map((e,t)=>{const a=0===t||Object(B.n)(e.date)!==Object(B.n)(p[t-1].date);return n.a.createElement("div",{className:"ListItem",key:e.id},a&&n.a.createElement("p",{className:"section-heading"},Object(B.f)(b,new Date(1e3*e.date))),n.a.createElement(Et.a,{message:e,withDate:!0,datetime:e.date,smaller:!0,sender:gt(b,e,s,c),className:"scroll-item",onDateClick:v}))})))})),Ct=a(175);const yt=Object(V.h)(e=>e(),500,!0);var kt=Object(n.h)(Object(s.h)(dt("audio"),(e,t)=>Object(h.l)(t,["searchMessagesGlobal","focusMessage","openAudioPlayer"]))(({theme:e,isVoice:t,searchQuery:a,searchChatId:s,isLoading:c,chatsById:l,usersById:i,globalMessagesByChatId:d,foundIds:m,lastSyncTime:u,searchMessagesGlobal:h,focusMessage:b,openAudioPlayer:g})=>{const p=Object(M.a)(),v=t?"voice":"audio",O=Object(n.m)(({direction:e})=>{u&&e===r.e.Backwards&&yt(()=>{h({type:v,query:a,chatId:s})})},[v,u,h,a,s]),E=Object(n.p)(()=>m&&d?m.map(e=>{const[t,a]=e.split("_").map(Number);return d[t]&&d[t].byId[a]}).filter(Boolean):Ve.a,[d,m]),j=Object(n.m)((e,t)=>{b({chatId:t,messageId:e})},[b]),f=Object(n.m)((e,t)=>{g({chatId:t,messageId:e})},[g]);const C=Object(mt.a)([a],o.Bb)&&!c;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(Oe.a,{className:"search-content documents-list custom-scroll",items:E,onLoadMore:O,noFastList:!0},!C&&n.a.createElement(ge.a,null),C&&(!m||0===m.length)&&n.a.createElement(st.a,{text:p("ChatList.Search.NoResults"),description:p("ChatList.Search.NoResultsDescription")}),C&&m&&m.length>0&&E.map((t,a)=>{const s=0===a||Object(B.n)(t.date)!==Object(B.n)(E[a-1].date);return n.a.createElement("div",{className:"ListItem",key:t.id},s&&n.a.createElement("p",{className:"section-heading",dir:p.isRtl?"rtl":void 0},Object(B.f)(p,new Date(1e3*t.date))),n.a.createElement(Ct.a,{key:t.id,theme:e,message:t,target:"searchResult",senderTitle:gt(p,t,l,i),date:t.date,lastSyncTime:u,className:"scroll-item",onPlay:f,onDateClick:j}))})))}));a(282);const Nt=[{type:r.c.ChatList,title:"SearchAllChatsShort"},{type:r.c.Media,title:"SharedMediaTab2"},{type:r.c.Links,title:"SharedLinksTab2"},{type:r.c.Files,title:"SharedFilesTab2"},{type:r.c.Music,title:"SharedMusicTab2"},{type:r.c.Voice,title:"SharedVoiceTab2"}],wt=[{type:r.c.ChatList,title:"All Messages"},...Nt.slice(1)],St=Object.keys(r.c).length/2;var It=Object(n.h)(Object(s.h)(e=>{const{currentContent:t,chatId:a}=e.globalSearch;return{currentContent:t,chatId:a}},(e,t)=>Object(h.l)(t,["setGlobalSearchContent","setGlobalSearchDate"]))(({searchQuery:e,searchDate:t,isActive:a,currentContent:s=r.c.ChatList,chatId:c,setGlobalSearchContent:o,setGlobalSearchDate:l,onReset:i})=>{const d=Object(M.a)(),[m,u]=Object(n.r)(s),h=Object(n.p)(()=>Object(B.l)(e),[e]),b=Object(n.m)(e=>{const t=Nt[e];o({content:t.type}),u(e)},[o]),g=Object(n.m)(e=>{l({date:e.getTime()/1e3})},[l]);Object(L.a)(a,i,void 0,void 0,!0);const p=Object(n.q)(null),v=Object(be.a)(p,a,void 0,".ListItem-button",!0);return n.a.createElement("div",{className:"LeftSearch",ref:p,onKeyDown:v},n.a.createElement($e.a,{activeTab:m,tabs:c?wt:Nt,onSwitchTab:b}),n.a.createElement(T.a,{name:d.isRtl?"slide-reversed":"slide",renderCount:St,activeKey:s},()=>{switch(s){case r.c.ChatList:return c?n.a.createElement(it,{searchQuery:e,dateSearchQuery:h,onReset:i,onSearchDateSelect:g}):n.a.createElement(ot,{searchQuery:e,searchDate:t,dateSearchQuery:h,onReset:i,onSearchDateSelect:g});case r.c.Media:return n.a.createElement(bt,{searchQuery:e});case r.c.Links:return n.a.createElement(Ot,{searchQuery:e});case r.c.Files:return n.a.createElement(ft,{searchQuery:e});case r.c.Music:return n.a.createElement(kt,{key:"audio",searchQuery:e});case r.c.Voice:return n.a.createElement(kt,{key:"voice",isVoice:!0,searchQuery:e});default:return}}))})),Pt=a(158);const Ft={currentPassword:"",password:"",hint:"",email:""},Mt=(e,t)=>{switch(t.type){case"setCurrentPassword":return{...e,currentPassword:t.payload};case"setPassword":return{...e,password:t.payload};case"setHint":return{...e,hint:t.payload};case"setEmail":return{...e,email:t.payload};case"reset":return Ft;default:return e}};var Lt=Object(n.h)(Object(s.h)(void 0,(e,t)=>Object(h.l)(t,["signOut","deleteChatFolder"]))(({currentScreen:e,editedFolderId:t,onReset:a,onSaveFilter:s,signOut:c,deleteChatFolder:o})=>{const[i,d]=Object(n.r)(!1),[m,u]=Object(n.r)(!1),h=Object(n.m)(()=>{d(!0)},[]),b=Object(n.m)(()=>{d(!1)},[]),g=Object(n.m)(()=>{u(!0)},[]),p=Object(n.m)(()=>{u(!1)},[]),v=Object(n.m)(()=>{b(),c()},[b,c]),O=Object(n.m)(()=>{p(),o({id:t}),a()},[t,p,o,a]),E=Object(n.p)(()=>({onTrigger:e,isOpen:t})=>n.a.createElement(D.a,{round:!0,ripple:!l.l,size:"smaller",color:"translucent",className:t?"active":"",onClick:e,ariaLabel:"More actions"},n.a.createElement("i",{className:"icon-more"})),[]),j=Object(M.a)();return n.a.createElement("div",{className:"left-header"},n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:a,ariaLabel:j("AccDescrGoBack")},n.a.createElement("i",{className:"icon-arrow-left"})),function(){switch(e){case r.n.EditProfile:return n.a.createElement("h3",null,j("lng_settings_information"));case r.n.General:return n.a.createElement("h3",null,j("General"));case r.n.Notifications:return n.a.createElement("h3",null,j("Notifications"));case r.n.Privacy:return n.a.createElement("h3",null,j("PrivacySettings"));case r.n.Language:return n.a.createElement("h3",null,j("Language"));case r.n.GeneralChatBackground:return n.a.createElement("h3",null,j("ChatBackground"));case r.n.GeneralChatBackgroundColor:return n.a.createElement("h3",null,j("SetColor"));case r.n.PrivacyPhoneNumber:return n.a.createElement("h3",null,j("PrivacyPhone"));case r.n.PrivacyLastSeen:return n.a.createElement("h3",null,j("PrivacyLastSeen"));case r.n.PrivacyProfilePhoto:return n.a.createElement("h3",null,j("Privacy.ProfilePhoto"));case r.n.PrivacyForwarding:return n.a.createElement("h3",null,j("PrivacyForwards"));case r.n.PrivacyGroupChats:return n.a.createElement("h3",null,j("AutodownloadGroupChats"));case r.n.PrivacyPhoneNumberAllowedContacts:case r.n.PrivacyLastSeenAllowedContacts:case r.n.PrivacyProfilePhotoAllowedContacts:case r.n.PrivacyForwardingAllowedContacts:case r.n.PrivacyGroupChatsAllowedContacts:return n.a.createElement("h3",null,j("AlwaysShareWith"));case r.n.PrivacyPhoneNumberDeniedContacts:case r.n.PrivacyLastSeenDeniedContacts:case r.n.PrivacyProfilePhotoDeniedContacts:case r.n.PrivacyForwardingDeniedContacts:case r.n.PrivacyGroupChatsDeniedContacts:return n.a.createElement("h3",null,j("NeverShareWith"));case r.n.PrivacyActiveSessions:return n.a.createElement("h3",null,j("SessionsTitle"));case r.n.PrivacyBlockedUsers:return n.a.createElement("h3",null,j("BlockedUsers"));case r.n.TwoFaDisabled:case r.n.TwoFaEnabled:return n.a.createElement("h3",null,j("TwoStepVerification"));case r.n.TwoFaNewPassword:case r.n.TwoFaChangePasswordNew:case r.n.TwoFaChangePasswordConfirm:return n.a.createElement("h3",null,j("PleaseEnterCurrentPassword"));case r.n.TwoFaNewPasswordConfirm:return n.a.createElement("h3",null,j("PleaseReEnterPassword"));case r.n.TwoFaNewPasswordHint:case r.n.TwoFaChangePasswordHint:return n.a.createElement("h3",null,j("PasswordHint"));case r.n.TwoFaNewPasswordEmail:case r.n.TwoFaRecoveryEmail:return n.a.createElement("h3",null,j("RecoveryEmailTitle"));case r.n.TwoFaNewPasswordEmailCode:case r.n.TwoFaRecoveryEmailCode:return n.a.createElement("h3",null,"Recovery Email Code");case r.n.TwoFaCongratulations:return n.a.createElement("h3",null,j("TwoStepVerificationPasswordSet"));case r.n.TwoFaChangePasswordCurrent:case r.n.TwoFaTurnOff:case r.n.TwoFaRecoveryEmailCurrentPassword:return n.a.createElement("h3",null,j("PleaseEnterCurrentPassword"));case r.n.Folders:return n.a.createElement("h3",null,j("Filters"));case r.n.FoldersCreateFolder:return n.a.createElement("h3",null,j("FilterNew"));case r.n.FoldersEditFolder:case r.n.FoldersEditFolderFromChatList:return n.a.createElement("div",{className:"settings-main-header"},n.a.createElement("h3",null,j("FilterEdit")),t&&n.a.createElement(q.a,{className:"settings-more-menu",trigger:E,positionX:"right"},n.a.createElement(_.a,{icon:"delete",destructive:!0,onClick:g},j("Delete"))));case r.n.FoldersIncludedChats:case r.n.FoldersIncludedChatsFromChatList:case r.n.FoldersExcludedChats:case r.n.FoldersExcludedChatsFromChatList:return n.a.createElement("div",{className:"settings-main-header"},e===r.n.FoldersIncludedChats||e===r.n.FoldersIncludedChatsFromChatList?n.a.createElement("h3",null,j("FilterInclude")):n.a.createElement("h3",null,j("FilterExclude")),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",className:"color-primary",onClick:s,ariaLabel:j("AutoDeleteConfirm")},n.a.createElement("i",{className:"icon-check"})));default:return n.a.createElement("div",{className:"settings-main-header"},n.a.createElement("h3",null,j("SETTINGS")),n.a.createElement(q.a,{className:"settings-more-menu",trigger:E,positionX:"right"},n.a.createElement(_.a,{icon:"logout",onClick:h},j("LogOutTitle"))))}}(),n.a.createElement(Pe.a,{isOpen:i,onClose:b,text:j("lng_sure_logout"),confirmLabel:j("AccountSettings.Logout"),confirmHandler:v,confirmIsDestructive:!0}),n.a.createElement(Pe.a,{isOpen:m,onClose:p,text:j("FilterDeleteAlert"),confirmLabel:j("Delete"),confirmHandler:O,confirmIsDestructive:!0}))})),At=a(23);var Rt=Object(n.h)(Object(s.h)(e=>{const{currentUserId:t}=e;return{currentUser:t?Object(m.Jb)(e,t):void 0}})(({isActive:e,onScreenSelect:t,onReset:a,currentUser:s})=>{const c=Object(M.a)(),o=Object(u.bb)(s);return Object(L.a)(e,a,t,r.n.Main),n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-main-menu"},s&&n.a.createElement("div",{className:"settings-current-user"},n.a.createElement(x.a,{user:s,size:"jumbo"}),n.a.createElement("p",{className:"name"},o&&Object(U.a)(o)),n.a.createElement("p",{className:"phone"},Object(At.c)(s.phoneNumber))),n.a.createElement(Ee.a,{icon:"edit",onClick:()=>t(r.n.EditProfile)},c("lng_settings_information")),n.a.createElement(Ee.a,{icon:"folder",onClick:()=>t(r.n.Folders)},c("Filters")),n.a.createElement(Ee.a,{icon:"settings",onClick:()=>t(r.n.General)},c("Telegram.GeneralSettingsViewController")),n.a.createElement(Ee.a,{icon:"unmute",onClick:()=>t(r.n.Notifications)},c("Notifications")),n.a.createElement(Ee.a,{icon:"lock",onClick:()=>t(r.n.Privacy)},c("PrivacySettings")),n.a.createElement(Ee.a,{icon:"language",onClick:()=>t(r.n.Language)},c("Language"))))})),Tt=a(136),Dt=a(116);const Bt=/https:\/\/t\.me\/?/i,Ut=/^([a-zA-Z0-9_]+)$/,xt=Object(V.a)(e=>e(),250,!1);var Gt=Object(n.h)(({currentUsername:e,asLink:t,isLoading:a,isUsernameAvailable:s,checkUsername:c,onChange:r})=>{const[o,l]=Object(n.r)(e||""),i=Object(M.a)(),d=t?"SetUrl":"Username",m=i(t?"SetUrlPlaceholder":"Username"),[u,h]=Object(n.p)(()=>o.length?o.length<5?[void 0,m+" is too short"]:o.length>32?[void 0,m+" is too long"]:Ut.test(o)?void 0===s?[]:[s?i(d+"Available","Username"):void 0,!1===s?i(d+"InUse"):void 0]:[void 0,m+" contains invalid characters"]:[],[o,s,i,d,m]);Object(n.n)(()=>{l(e||"")},[t,e]);const b=Object(n.m)(e=>{const a=e.target.value.trim().replace(Bt,"");l(a),e.target.value=`${t?"https://t.me/":""}${a}`;const n=function(e){return e.length>=5&&e.length<=32&&Ut.test(e)}(a);n&&xt(()=>{c({username:a})}),r&&r(!!n&&a)},[t,c,r]);return n.a.createElement(ve.a,{value:`${t?"https://t.me/":""}${o}`,onChange:b,label:m,error:h,success:u,readOnly:a})});const zt=Object(V.h)(e=>e(),6e4,!0);var qt=Object(n.h)(Object(s.h)(e=>{const{currentUserId:t}=e,{progress:a,isUsernameAvailable:n}=e.profileEdit||{},s=t?Object(m.Jb)(e,t):void 0;if(!s)return{progress:a,isUsernameAvailable:n};const{firstName:c,lastName:r,username:o,fullInfo:l}=s,{bio:i}=l||{};return{currentAvatarHash:Object(u.e)(s),currentFirstName:c,currentLastName:r,currentBio:i,currentUsername:o,progress:a,isUsernameAvailable:n}},(e,t)=>Object(h.l)(t,["loadCurrentUser","updateProfile","checkUsername"]))(({isActive:e,onScreenSelect:t,onReset:a,currentAvatarHash:s,currentFirstName:o,currentLastName:l,currentBio:i,currentUsername:d,progress:m,isUsernameAvailable:u,loadCurrentUser:h,updateProfile:b,checkUsername:g})=>{const p=Object(M.a)(),[v,E]=Object(n.r)(!1),[j,f]=Object(n.r)(!1),[C,y]=Object(n.r)(),[k,N]=Object(n.r)(),[w,S]=Object(n.r)(o||""),[I,P]=Object(n.r)(l||""),[F,R]=Object(n.r)(i||""),[T,D]=Object(n.r)(d||""),B=Object(O.a)(s,!1,c.ApiMediaFormat.BlobUrl),x=m===r.k.InProgress,G=!1===T,z=Object(n.p)(()=>!G&&(Boolean(k)||j||!0===u),[k,j,G,u]);Object(L.a)(e,a,t,r.n.EditProfile),Object(n.n)(()=>{zt(()=>{h()})},[h]),Object(n.n)(()=>{N(void 0)},[B]),Object(n.n)(()=>{S(o||""),P(l||""),R(i||"")},[o,l,i]),Object(n.n)(()=>{D(d||"")},[d]),Object(n.n)(()=>{m===r.k.Complete&&(f(!1),E(!1),y(void 0))},[m]);const q=Object(n.m)(e=>{N(e)},[]),_=Object(n.m)(e=>{S(e.target.value),f(!0)},[]),H=Object(n.m)(e=>{P(e.target.value),f(!0)},[]),$=Object(n.m)(e=>{R(e.target.value),f(!0)},[]),V=Object(n.m)(e=>{D(e),E(!0)},[]),W=Object(n.m)(()=>{const e=w.trim(),t=I.trim(),a=F.trim();e.length?a.length>70?y("Bio can' be longer than 70 characters"):b({photo:k,...j&&{firstName:e,lastName:t,bio:a},...v&&{username:T}}):y("Please provide your first name")},[k,w,I,F,j,T,v,b]);return n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-edit-profile"},n.a.createElement(Tt.a,{currentAvatarBlobUrl:B,onChange:q,title:"Edit your profile photo",disabled:x}),n.a.createElement(ve.a,{value:w,onChange:_,label:p("FirstName"),disabled:x,error:"Please provide your first name"===C?C:void 0}),n.a.createElement(ve.a,{value:I,onChange:H,label:p("LastName"),disabled:x}),n.a.createElement(ve.a,{value:F,onChange:$,label:p("UserBio"),disabled:x,error:"Bio can' be longer than 70 characters"===C?C:void 0}),n.a.createElement("p",{className:"settings-item-description",dir:p.isRtl?"rtl":void 0},Object(U.a)(p("lng_settings_about_bio"),["br","simple_markdown"]))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:p.isRtl?"rtl":void 0},p("Username")),n.a.createElement(Gt,{currentUsername:T||"",isLoading:x,isUsernameAvailable:u,checkUsername:g,onChange:V}),n.a.createElement("p",{className:"settings-item-description",dir:p.isRtl?"rtl":void 0},Object(U.a)(p("UsernameHelp"),["br","simple_markdown"])),T&&n.a.createElement("p",{className:"settings-item-description",dir:p.isRtl?"rtl":void 0},p("lng_username_link"),n.a.createElement("br",null),n.a.createElement("span",{className:"username-link"},"https://t.me/",T)))),n.a.createElement(Dt.a,{isShown:z,onClick:W,disabled:x,ariaLabel:"Save changes"},x?n.a.createElement(A.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))})),_t=a(132),Ht=a(119);const $t=Object(V.h)(e=>e(),6e4,!0);var Vt=Object(n.h)(Object(s.h)(e=>{const{chats:{byId:t},users:{byId:a}}=e,{orderedIds:n,byId:s,recommended:c}=e.chatFolders;return{chatsById:t,usersById:a,orderedFolderIds:n,foldersById:s,recommendedChatFolders:c,notifySettings:Object(m.fb)(e),notifyExceptions:Object(m.eb)(e)}},(e,t)=>Object(h.l)(t,["loadRecommendedChatFolders","addChatFolder","showDialog"]))(({onCreateFolder:e,onEditFolder:t,isActive:a,onScreenSelect:s,onReset:c,chatsById:l,usersById:i,orderedFolderIds:d,foldersById:m,recommendedChatFolders:h,notifySettings:b,notifyExceptions:g,loadRecommendedChatFolders:p,addChatFolder:v,showDialog:O})=>{const[E,j]=Object(n.r)(),[f,C]=Object(n.r)(!1),y=Object(n.m)(()=>C(!0),[]);Object(n.n)(()=>{E||Object(_t.a)("FoldersAll").then(j)},[E]),Object(n.n)(()=>{$t(()=>{p()})},[p]);const k=Object(n.m)(()=>{Object.keys(m).length>=10?O({data:{message:"DIALOG_FILTERS_TOO_MUCH",hasErrorKey:!0}}):e()},[m,O,e]),N=Object(M.a)();Object(L.a)(a,c,s,r.n.Folders);const w=Object(n.p)(()=>{if(!d)return;const e=Object.keys(l).map(Number);return d.map(t=>{const a=m[t];return{id:a.id,title:a.title,subtitle:Object(u.n)(N,l,i,a,e,b,g)}})},[d,l,m,i,b,g,N]),S=Object(n.m)(e=>{Object.keys(m).length>=10?O({data:{message:"DIALOG_FILTERS_TOO_MUCH",hasErrorKey:!0}}):v({folder:e})},[m,v,O]);return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement("div",{className:"settings-content-icon"},E&&n.a.createElement(Ht.a,{id:"settingsFoldersMain",size:o.Fb,animationData:E,play:f,noLoop:!0,onLoad:y})),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},N("CreateNewFilterInfo")),n.a.createElement(D.a,{className:"with-icon mb-2",color:"primary",size:"smaller",pill:!0,fluid:!0,onClick:k,isRtl:N.isRtl},n.a.createElement("i",{className:"icon-add"}),N("CreateNewFilter"))),n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3",dir:N.isRtl?"rtl":void 0},N("Filters")),w&&w.length?w.map(e=>n.a.createElement(Ee.a,{className:"mb-2",narrow:!0,multiline:!0,onClick:()=>t(m[e.id])},n.a.createElement("span",{className:"title"},e.title),n.a.createElement("span",{className:"subtitle"},e.subtitle))):w&&!w.length?n.a.createElement("p",{className:"settings-item-description my-4",dir:"auto"},"You have no folders yet."):n.a.createElement(ge.a,null)),h&&!!h.length&&n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3",dir:N.isRtl?"rtl":void 0},N("FilterRecommended")),h.map(e=>n.a.createElement(Ee.a,{className:"mb-2",narrow:!0,onClick:()=>S(e)},n.a.createElement("div",{className:"settings-folders-recommended-item"},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},e.title),n.a.createElement("span",{className:"subtitle"},e.description)),n.a.createElement(D.a,{className:"px-3",color:"primary",size:"tiny",pill:!0,fluid:!0,isRtl:N.isRtl},N("Add")))))))})),Wt=a(145);a(283);var Kt=({count:e,itemName:t,itemPluralName:a,isLoading:s,onClick:c})=>{const r=Object(M.a)();return n.a.createElement(D.a,{className:"ShowMoreButton",color:"translucent",size:"smaller",isText:!0,isLoading:s,isRtl:r.isRtl,onClick:c},n.a.createElement("i",{className:"icon-down"}),"Show ",e," more ",e>1?a||t+"s":t)};const Yt="Please provide a title for this folder.";var Qt=Object(n.h)(Object(s.h)(e=>{const{listIds:t}=e.chats;return{loadedActiveChatIds:t.active,loadedArchivedChatIds:t.archived}},(e,t)=>Object(h.l)(t,["editChatFolder","addChatFolder","loadMoreChats"]))(({state:e,dispatch:t,onAddIncludedChats:a,onAddExcludedChats:s,isActive:c,onScreenSelect:l,onReset:i,onBack:d,loadedActiveChatIds:m,loadedArchivedChatIds:b,editChatFolder:g,addChatFolder:p,loadMoreChats:v})=>{const[O,E]=Object(n.r)(),[j,f]=Object(n.r)(!1),C=Object(n.m)(()=>f(!0),[]),[y,k]=Object(n.r)(!1),[N,w]=Object(n.r)(!1),{selectedChatIds:S,selectedChatTypes:I}=Object(Wt.d)(e,"included"),{selectedChatIds:P,selectedChatTypes:F}=Object(Wt.d)(e,"excluded");Object(n.n)(()=>{O||Object(_t.a)("FoldersNew").then(E)},[O]),Object(n.n)(()=>{k(!1),w(!1)},[e.folderId]);const[R,T]=Object(n.p)(()=>{const e=new Set([...m||[],...b||[]]),t=Object(h.f)(S,e),a=Object(h.f)(P,e);return[y?t:t.slice(0,5-I.length),N?a:a.slice(0,5-F.length)]},[P,S,I,F,N,y,m,b]);Object(n.n)(()=>{(R.lengthk(!0):()=>w(!0);return n.a.createElement(n.a.Fragment,null,t.map(t=>function(e,t){const a="included"===t?Wt.b.find(({key:t})=>t===e):Wt.a.find(({key:t})=>t===e);if(a)return n.a.createElement(Ee.a,{key:a.key,className:"settings-folders-list-item mb-1",icon:a.icon,narrow:!0,inactive:!0},D(a.title))}(t,e)),a.map(e=>n.a.createElement(Ee.a,{className:"settings-folders-list-item mb-1",narrow:!0,inactive:!0},Object(u.ob)(e)?n.a.createElement(je.a,{avatarSize:"small",userId:e}):n.a.createElement(fe.a,{avatarSize:"small",chatId:e}))),!s&&c>0&&n.a.createElement(Kt,{count:c,itemName:"chat",onClick:r}))}return Object(L.a)(c,d,l,"edit"===e.mode?r.n.FoldersEditFolder:r.n.FoldersCreateFolder),n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement("div",{className:"settings-content-icon"},O&&n.a.createElement(Ht.a,{id:"settingsFoldersEdit",size:o.Fb,animationData:O,play:j&&String(e.folderId),noLoop:!0,onLoad:C})),"create"===e.mode&&n.a.createElement("p",{className:"settings-item-description mb-3",dir:D.isRtl?"rtl":void 0},D("FilterIncludeInfo")),n.a.createElement(ve.a,{className:"mb-0",label:D("FilterNameHint"),value:e.folder.title,onChange:function(e){const{currentTarget:a}=e;t({type:"setTitle",payload:a.value.trim()})},error:e.error&&e.error===Yt?Yt:void 0})),n.a.createElement("div",{className:"settings-item no-border pt-3"},e.error&&"ChatList.Filter.Error.Empty"===e.error&&n.a.createElement("p",{className:"settings-item-description color-danger mb-2",dir:D.isRtl?"rtl":void 0},D(e.error)),n.a.createElement("h4",{className:"settings-item-header mb-3",dir:D.isRtl?"rtl":void 0},D("FilterInclude")),n.a.createElement(Ee.a,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:a},D("FilterAddChats")),B("included")),n.a.createElement("div",{className:"settings-item no-border pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3",dir:D.isRtl?"rtl":void 0},D("FilterExclude")),n.a.createElement(Ee.a,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:s},D("FilterAddChats")),B("excluded"))),n.a.createElement(Dt.a,{isShown:!!e.isTouched,disabled:e.isLoading,onClick:function(){const{title:a}=e.folder;a?S.length||Object.keys(I).length?(t({type:"setIsLoading",payload:!0}),"edit"===e.mode?g({id:e.folderId,folderUpdate:e.folder}):p({folder:e.folder}),setTimeout(()=>{i()},500)):t({type:"setError",payload:"ChatList.Filter.Error.Empty"}):t({type:"setError",payload:Yt})},ariaLabel:"edit"===e.mode?"Save changes":"Create folder"},e.isLoading?n.a.createElement(A.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))})),Zt=a(48);a(195),a(284);var Jt=Object(n.h)(({mode:e,chatIds:t,selectedIds:a,selectedChatTypes:s,filterValue:c,onSelectedIdsChange:r,onSelectedChatTypesChange:o,onFilterChange:l,onLoadMore:i})=>{const d=Object(n.q)(null),m="included"===e?Wt.b:Wt.a,h=a.length+s.length>10,b=a.length>=100;Object(n.n)(()=>{setTimeout(()=>{requestAnimationFrame(()=>{d.current.focus()})},500)},[]);const g=Object(n.m)(e=>{const t=[...a];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),r(t)},[a,r]),p=Object(n.m)(e=>{const t=[...s];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),o(t)},[s,o]),v=Object(n.m)(e=>{const{value:t}=e.currentTarget;l(t)},[l]),O=Object(M.a)();const[E,j]=Object(he.a)(i,t,Boolean(c));return n.a.createElement("div",{className:"Picker SettingsFoldersChatsPicker"},n.a.createElement("div",{className:"picker-header custom-scroll"},s.map((function(e){const t=m.find(({key:t})=>e===t);if(t)return n.a.createElement(ct.a,{icon:t.icon,title:O(t.title),isMinimized:h,canClose:!0,onClick:p,clickArg:t.key})})),a.map((e,t)=>n.a.createElement(ct.a,{chatOrUserId:e,isMinimized:h&&tp(e.key),ripple:!0},n.a.createElement("i",{className:"icon-"+e.icon}),n.a.createElement("h3",{className:"chat-type",dir:"auto"},O(e.title)),n.a.createElement(Zt.a,{label:"",checked:s.includes(e.key),round:!0}))})),n.a.createElement("div",{key:"divider",className:"picker-list-divider"}),n.a.createElement("h4",{key:"header2",className:"settings-item-header",dir:O.isRtl?"rtl":void 0},O("FilterChats"))),E&&E.length?E.map((function(e){const t=a.includes(e);return n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable picker-list-item chat-item",onClick:()=>g(e),ripple:!0,disabled:!t&&b},Object(u.ob)(e)?n.a.createElement(je.a,{userId:e}):n.a.createElement(fe.a,{chatId:e,withChatType:!0}),n.a.createElement(Zt.a,{label:"",checked:t,round:!0}))})):E&&!E.length?n.a.createElement("p",{className:"no-results",key:"no-results"},"Sorry, nothing found."):n.a.createElement(ge.a,{key:"loading"})))});var Xt=Object(n.h)(Object(s.h)(e=>{const{chats:{byId:t,listIds:a,orderedPinnedIds:n}}=e;return{chatsById:t,listIds:a.active,orderedPinnedIds:n.active,archivedPinnedIds:n.archived,archivedListIds:a.archived}},(e,t)=>Object(h.l)(t,["loadMoreChats"]))(({isActive:e,onScreenSelect:t,onReset:a,mode:s,state:c,dispatch:o,chatsById:l,listIds:i,orderedPinnedIds:d,archivedListIds:m,archivedPinnedIds:h,loadMoreChats:b})=>{const{chatFilter:g}=c,{selectedChatIds:p,selectedChatTypes:v}=Object(Wt.d)(c,s,!0),O=Object(M.a)(),E=Object(n.p)(()=>{const e=i?Object(u.Fb)(l,i,d,"all"):void 0,t=m?Object(u.Fb)(l,m,h,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]},[l,i,d,m,h]),j=Object(n.p)(()=>{if(E)return E.filter(e=>!g||Object(ue.a)(Object(u.k)(O,e),g)||p.includes(e.id)).map(({id:e})=>e)},[E,g,O,p]),f=Object(n.m)(e=>{o({type:"setChatFilter",payload:e})},[o]),C=Object(n.m)(e=>{o("included"===s?{type:"setIncludeFilters",payload:{...c.includeFilters,includedChatIds:e}}:{type:"setExcludeFilters",payload:{...c.excludeFilters,excludedChatIds:e}})},[s,c,o]),y=Object(n.m)(e=>{const t={};e.forEach(e=>{t[e]=!0}),o("included"===s?{type:"setIncludeFilters",payload:{includedChatIds:p,...t}}:{type:"setExcludeFilters",payload:{excludedChatIds:p,...t}})},[s,p,o]);return Object(L.a)(e,a,t,"included"===s?r.n.FoldersIncludedChats:r.n.FoldersExcludedChats),j?n.a.createElement(Jt,{mode:s,chatIds:j,selectedIds:p,selectedChatTypes:v,filterValue:g,onSelectedIdsChange:C,onSelectedChatTypesChange:y,onFilterChange:f,onLoadMore:b}):n.a.createElement(ge.a,null)}));a(285);var ea=Object(n.h)(({currentScreen:e,shownScreen:t,state:a,dispatch:s,isActive:c,onScreenSelect:o,onReset:l})=>{const i=Object(n.m)(()=>{e!==r.n.FoldersCreateFolder&&e!==r.n.FoldersEditFolder&&e!==r.n.FoldersEditFolderFromChatList||setTimeout(()=>{s({type:"reset"})},200),e!==r.n.FoldersIncludedChats&&e!==r.n.FoldersExcludedChats?l():"create"===a.mode?o(r.n.FoldersCreateFolder):o(r.n.FoldersEditFolder)},[a.mode,s,e,l,o]),d=Object(n.m)(()=>{s({type:"reset"}),o(r.n.FoldersCreateFolder)},[o,s]),m=Object(n.m)(e=>{s({type:"editFolder",payload:e}),o(r.n.FoldersEditFolder)},[s,o]),u=Object(n.m)(()=>{s({type:"editIncludeFilters"}),o(e===r.n.FoldersEditFolderFromChatList?r.n.FoldersIncludedChatsFromChatList:r.n.FoldersIncludedChats)},[e,s,o]),h=Object(n.m)(()=>{s({type:"editExcludeFilters"}),o(e===r.n.FoldersEditFolderFromChatList?r.n.FoldersExcludedChatsFromChatList:r.n.FoldersExcludedChats)},[e,s,o]);switch(e){case r.n.Folders:return n.a.createElement(Vt,{onCreateFolder:d,onEditFolder:m,onScreenSelect:o,isActive:c||[r.n.FoldersCreateFolder,r.n.FoldersEditFolder,r.n.FoldersIncludedChats,r.n.FoldersExcludedChats].includes(t),onReset:l});case r.n.FoldersCreateFolder:case r.n.FoldersEditFolder:case r.n.FoldersEditFolderFromChatList:return n.a.createElement(Qt,{state:a,dispatch:s,onAddIncludedChats:u,onAddExcludedChats:h,onReset:i,onScreenSelect:o,isActive:c||[r.n.FoldersIncludedChats,r.n.FoldersExcludedChats].includes(t),onBack:l});case r.n.FoldersIncludedChats:case r.n.FoldersIncludedChatsFromChatList:return n.a.createElement(Xt,{mode:"included",state:a,dispatch:s,onReset:i,onScreenSelect:o,isActive:c});case r.n.FoldersExcludedChats:case r.n.FoldersExcludedChatsFromChatList:return n.a.createElement(Xt,{mode:"excluded",state:a,dispatch:s,onReset:i,onScreenSelect:o,isActive:c});default:return}}),ta=a(109);a(286);var aa=Object(n.h)(({options:e,range:t,label:a,value:s,disabled:c,onChange:r})=>{const o=Object(M.a)(),l=Object(n.m)(e=>{r(Number(e.currentTarget.value))},[r]),i=Object(W.a)("RangeSlider",c&&"disabled"),d=Object(n.p)(()=>{if(e)return s/(e.length-1)*100;if(t){const e=(t.max-t.min)/(t.step||1);return(s-t.min)/e*100}return 0},[s,e,t]),[m,u,h]=Object(n.p)(()=>e?[0,e.length-1,1]:t?[t.min,t.max,t.step||1]:[0,0,0],[t,e]);return n.a.createElement("div",{className:i},a&&n.a.createElement("div",{className:"slider-top-row",dir:o.isRtl?"rtl":void 0},n.a.createElement("span",{className:"label",dir:"auto"},a),t&&n.a.createElement("span",{className:"value",dir:"auto"},s)),n.a.createElement("div",{className:"slider-main"},n.a.createElement("div",{className:"slider-fill-track",style:`width: ${d}%`}),n.a.createElement("input",{min:m,max:u,value:s,step:h,type:"range",onChange:l}),e&&n.a.createElement("div",{className:"slider-options"},e.map((e,t)=>n.a.createElement("div",{className:Object(W.a)("slider-option no-selection",t===s&&"active"),onClick:()=>r(t)},e)))))}),na=a(117),sa=a(50);var ca=Object(n.h)(({size:e=o.Mb,stickerSet:t,observeIntersection:a})=>{const s=Object(n.q)(null),r=Object(ta.b)(s,a),l="stickerSet"+t.id,i=Object(O.a)(l,!r,c.ApiMediaFormat.Lottie),{shouldRenderFullMedia:d,transitionClassNames:m}=Object(na.a)(i,"slow");return n.a.createElement("div",{ref:s,className:"sticker-set-cover"},!d&&Object(sa.c)(t.title,2),d&&i&&n.a.createElement(Ht.a,{id:l,size:e,animationData:i,className:m}))});var ra=Object(n.h)(({stickerSet:e,observeIntersection:t})=>{const a=Object(n.q)(null),s=Object(ta.b)(a,t),c=Object(O.a)(e.hasThumbnail&&"stickerSet"+e.id,!s),{shouldRenderFullMedia:r,transitionClassNames:o}=Object(na.a)(c,"slow");return n.a.createElement("div",{ref:a,className:"sticker-set-cover"},!r&&Object(sa.c)(e.title,2),r&&n.a.createElement("img",{src:c,className:o,alt:""}))}),oa=a(125);a(287);var la=Object(n.h)(({stickerSet:e,observeIntersection:t,onClick:a})=>{const s=Object(M.a)();if(!e||!e.stickers)return;const c=e.stickers&&e.stickers[0];return e.hasThumbnail||!c?n.a.createElement(Ee.a,{narrow:!0,className:"SettingsStickerSet",inactive:!c,onClick:()=>c&&a(c)},n.a.createElement(D.a,{ariaLabel:e.title,color:"translucent",isRtl:s.isRtl},e.isAnimated?n.a.createElement(ca,{size:o.Gb,stickerSet:e,observeIntersection:t}):n.a.createElement(ra,{stickerSet:e,observeIntersection:t})),n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("div",{className:"title"},e.title),n.a.createElement("div",{className:"subtitle"},s("StickerPack.StickerCount",e.count,"i")))):n.a.createElement(Ee.a,{narrow:!0,className:"SettingsStickerSet",onClick:()=>a(c)},n.a.createElement(oa.a,{sticker:c,size:o.Gb,title:e.title,observeIntersection:t}),n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("div",{className:"title"},e.title),n.a.createElement("div",{className:"subtitle"},s("StickerPack.StickerCount",e.count,"i"))))}),ia=a(167);const da=["Solid and Steady","Nice and Fast","Lots of Stuff"];var ma=Object(n.h)(Object(s.h)(e=>({...Object(h.l)(e.settings.byKey,["messageTextSize","animationLevel","messageSendKeyCombo","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayGifs","shouldAutoPlayVideos","shouldSuggestStickers","shouldLoopStickers","isSensitiveEnabled","canChangeSensitive"]),stickerSetIds:e.stickers.added.setIds,stickerSetsById:e.stickers.setsById}),(e,t)=>Object(h.l)(t,["setSettingOption","loadStickerSets","loadAddedStickers"]))(({isActive:e,onScreenSelect:t,onReset:a,stickerSetIds:s,stickerSetsById:c,messageTextSize:o,animationLevel:i,messageSendKeyCombo:d,shouldAutoDownloadMediaFromContacts:m,shouldAutoDownloadMediaInPrivateChats:u,shouldAutoDownloadMediaInGroups:h,shouldAutoDownloadMediaInChannels:b,shouldAutoPlayGifs:g,shouldAutoPlayVideos:p,shouldSuggestStickers:v,shouldLoopStickers:O,setSettingOption:E,loadStickerSets:j,loadAddedStickers:f})=>{const C=Object(n.q)(null),{observe:y}=Object(ta.a)({rootRef:C}),[k,N,w]=Object(xe.a)(),[S,I]=Object(n.r)(),P=Object(M.a)(),F=l.n?void 0:[{value:"enter",label:P("lng_settings_send_enter"),subLabel:"New line by Shift + Enter"},{value:"ctrl-enter",label:P(l.f?"lng_settings_send_cmdenter":"lng_settings_send_ctrlenter"),subLabel:"New line by Enter"}];Object(n.n)(()=>{j()},[j]),Object(n.n)(()=>{s&&s.length&&f()},[s,f]);const A=Object(n.m)(e=>{da.forEach((t,a)=>{document.body.classList.toggle("animation-level-"+a,e===a)}),E({animationLevel:e})},[E]),R=Object(n.m)(e=>{document.documentElement.style.setProperty("--composer-text-size",Math.max(e,l.e?16:15)+"px"),document.documentElement.style.setProperty("--message-text-size",e+"px"),E({messageTextSize:e})},[E]),T=Object(n.m)(e=>{I(e),N()},[N]),D=s&&s.map(e=>!!(c&&c[e]&&c[e].installedDate)&&c[e]).filter(Boolean);return Object(L.a)(e,a,t,r.n.General),n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header",dir:P.isRtl?"rtl":void 0},P("SETTINGS")),n.a.createElement(aa,{label:P("TextSize"),range:{min:12,max:20},value:o,onChange:R}),n.a.createElement(Ee.a,{icon:"photo",onClick:()=>t(r.n.GeneralChatBackground)},P("ChatBackground"))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:P.isRtl?"rtl":void 0},"Animation Level"),n.a.createElement("p",{className:"settings-item-description",dir:P.isRtl?"rtl":void 0},"Choose the desired animations amount."),n.a.createElement(aa,{options:da,value:i,onChange:A})),F&&n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:P.isRtl?"rtl":void 0},P("VoiceOver.Keyboard")),n.a.createElement(qe.a,{name:"keyboard-send-settings",options:F,onChange:e=>E({messageSendKeyCombo:e}),selected:d})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:P.isRtl?"rtl":void 0},P("AutoDownloadMedia")),n.a.createElement(Zt.a,{label:P("Contacts"),checked:m,onCheck:e=>E({shouldAutoDownloadMediaFromContacts:e})}),n.a.createElement(Zt.a,{label:P("AutodownloadPrivateChats"),checked:u,onCheck:e=>E({shouldAutoDownloadMediaInPrivateChats:e})}),n.a.createElement(Zt.a,{label:P("AutodownloadGroupChats"),checked:h,onCheck:e=>E({shouldAutoDownloadMediaInGroups:e})}),n.a.createElement(Zt.a,{label:P("FilterChannels"),checked:b,onCheck:e=>E({shouldAutoDownloadMediaInChannels:e})})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:P.isRtl?"rtl":void 0},P("AutoplayMedia")),n.a.createElement(Zt.a,{label:P("GifsTab2"),checked:g,onCheck:e=>E({shouldAutoPlayGifs:e})}),n.a.createElement(Zt.a,{label:P("DataAndStorage.Autoplay.Videos"),checked:p,onCheck:e=>E({shouldAutoPlayVideos:e})})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:P.isRtl?"rtl":void 0},P("AccDescrStickers")),n.a.createElement(Zt.a,{label:P("SuggestStickers"),checked:v,onCheck:e=>E({shouldSuggestStickers:e})}),n.a.createElement(Zt.a,{label:P("LoopAnimatedStickers"),checked:O,onCheck:e=>E({shouldLoopStickers:e})}),n.a.createElement("div",{className:"mt-4",ref:C},D&&D.map(e=>n.a.createElement(la,{key:e.id,stickerSet:e,observeIntersection:y,onClick:T}))),S&&n.a.createElement(ia.a,{isOpen:k,fromSticker:S,onClose:w})))}));let ua;function ha(e="*",t,a=!1){ua||(ua=document.createElement("input"),ua.setAttribute("type","file")),ua.setAttribute("accept",e),a?ua.removeAttribute("multiple"):ua.setAttribute("multiple","multiple"),ua.onchange=null,ua.value="",ua.onchange=t,ua.click()}var ba=a(17);function ga(e){return[parseInt(e.substring(0,2),16),parseInt(e.substring(2,4),16),parseInt(e.substring(4,6),16)]}function pa(e){const t=e[0].toString(16),a=e[1].toString(16),n=e[2].toString(16);return(1==t.length?"0"+t:t)+(1==a.length?"0"+a:a)+(1==n.length?"0"+n:n)}function va([e,t,a]){e/=255,t/=255,a/=255;let n,s,c=Math.max(e,t,a),r=Math.min(e,t,a),o=c,l=c-r;if(s=0==c?0:l/c,c==r)n=0;else{switch(c){case e:n=(t-a)/l+(t.5?Math.max(0,.65*n):Math.max(0,Math.min(1,1-.65*n)),`hsla(${360*t}, ${100*a}%, ${100*n}%, .4)`}var ja=a(12),fa=a(168);a(288);var Ca=Object(n.h)(({wallpaper:e,theme:t,isSelected:a,onClick:s})=>{const{slug:c,document:l}=e,i="wallpaper"+l.id,d=l.previewBlobUrl,m=Object(O.a)(i+"?size=m"),u=Object(fa.a)(l.thumbnail&&l.thumbnail.dataUri,Boolean(m),!0),{shouldRenderThumb:h,shouldRenderFullMedia:b,transitionClassNames:g}=Object(na.a)(m||d,"slow"),[p,v]=Object(n.r)(!1),{mediaData:j,downloadProgress:C}=Object(E.a)(i,!p),y=!1===Object(f.a)(p),{shouldRender:k,transitionClassNames:N}=Object(Y.a)(p&&!j||c===r.o,void 0,y,"slow"),w=Object(n.q)();w.current=t;const S=Object(n.m)(()=>{(async()=>{const e=await Object(ba.e)(j);await ja.d(o.o,w.current,e),s(c)})()},[j,s,c]);Object(n.n)(()=>{j&&S()},[j,S]);const I=Object(n.m)(()=>{j?S():v(e=>!e)},[j,S]),P=Object(W.a)("WallpaperTile",a&&"selected");return n.a.createElement("div",{className:P,onClick:I},n.a.createElement("div",{className:"media-inner"},h&&n.a.createElement("canvas",{ref:u,className:"thumbnail"}),b&&n.a.createElement("img",{src:m||d,className:"full-media "+g,alt:""}),k&&n.a.createElement("div",{className:Object(W.a)("spinner-container",N)},n.a.createElement(H.a,{progress:C,onClick:I}))))});a(289);const ya=Object(V.h)(e=>e(),6e4,!0);var ka=Object(n.h)(Object(s.h)(e=>{const t=Object(m.Db)(e),{background:a,isBlurred:n}=e.settings.themes[t]||{},{loadedWallpapers:s}=e.settings;return{background:a,isBlurred:n,loadedWallpapers:s,theme:t}},(e,t)=>Object(h.l)(t,["loadWallpapers","uploadWallpaper","setThemeSettings"]))(({isActive:e,onScreenSelect:t,onReset:a,background:s,isBlurred:c,loadedWallpapers:l,theme:i,loadWallpapers:d,uploadWallpaper:m,setThemeSettings:u})=>{const h=Object(n.q)();h.current=i,Object(n.n)(()=>{ya(()=>{d()})},[d]);const b=Object(n.m)(e=>{const{files:t}=e.target;t&&t.length>0&&m(t[0])},[m]),g=Object(n.m)(()=>{ha("image/jpeg",b,!0)},[b]),p=Object(n.m)(()=>{t(r.n.GeneralChatBackgroundColor)},[t]),v=Object(n.m)(()=>{u({theme:i,background:void 0,backgroundColor:void 0,isBlurred:!0,patternColor:"dark"===i?o.q:o.x})},[u,i]),O=Object(n.m)(e=>{u({theme:h.current,background:e});const t=l&&l.find(t=>t.slug===e);t&&t.document.thumbnail&&async function(e){const t=[0,0,0];let a,n,s,c,r=-4,o=[0,0,0],l=0;const i=document.createElement("canvas"),d=i.getContext&&i.getContext("2d");if(!d)return t;const m=await Object(ba.g)(e);s=m.naturalHeight||m.offsetHeight||m.height,n=m.naturalWidth||m.offsetWidth||m.width,i.height=s,i.width=n,d.drawImage(m,0,0);try{a=d.getImageData(0,0,n,s)}catch(e){return t}for(c=a.data.length;(r+=20){const t=Ea(e),a="#"+pa(e);u({theme:h.current,backgroundColor:a,patternColor:t})})},[l,u]),E=Object(n.m)(e=>{u({theme:h.current,isBlurred:e.target.checked})},[u]),j=Object(M.a)();Object(L.a)(e,a,t,r.n.GeneralChatBackground);const f=l&&l[0]&&l[0].slug===r.o;return n.a.createElement("div",{className:"SettingsGeneralBackground settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement(Ee.a,{icon:"camera-add",className:"mb-0",disabled:f,onClick:g},j("UploadImage")),n.a.createElement(Ee.a,{icon:"colorize",className:"mb-0",onClick:p},j("SetColor")),n.a.createElement(Ee.a,{icon:"favorite",onClick:v},j("ThemeResetToDefaults")),n.a.createElement(Zt.a,{label:j("BackgroundBlurred"),checked:Boolean(c),onChange:E})),l?n.a.createElement("div",{className:"settings-wallpapers"},l.map(e=>n.a.createElement(Ca,{wallpaper:e,theme:i,isSelected:s===e.slug,onClick:O}))):n.a.createElement(ge.a,null))}));a(290);const Na=va(ga("e6ebee")),wa=["#e6ebee","#b2cee1","#008dd0","#c6e7cb","#c4e1a6","#60b16e","#ccd0af","#a6a997","#7a7072","#fdd7af","#fdb76e","#dd8851"];function Sa(e,t){return{colorPosition:[Math.round(e[1]*(t.colorRect.width-1)),Math.round((1-e[2])*(t.colorRect.height-1))],huePosition:Math.round(e[0]*(t.hueRect.width-1))}}function Ia({colorPosition:e,huePosition:t},a){return[t/(a.hueRect.width-1),e[0]/(a.colorRect.width-1),1-e[1]/(a.colorRect.height-1)]}var Pa=Object(n.h)(Object(s.h)(e=>{const t=Object(m.Db)(e),{backgroundColor:a}=e.settings.themes[t]||{};return{backgroundColor:a,theme:t}},(e,t)=>Object(h.l)(t,["setThemeSettings"]))(({isActive:e,onScreenSelect:t,onReset:a,theme:s,backgroundColor:c,setThemeSettings:o})=>{const l=Object(n.q)();l.current=s;const i=Object(n.q)(null),d=Object(n.q)(null),m=Object(n.q)(null),u=Object(n.q)(!0),[g,p]=Object(n.r)(function(e){return e&&e.startsWith("#")?va(ga(e.replace("#",""))):Na}(c)),v=Object(n.q)(g);Object(n.n)(()=>{v.current=g},[g]);const[O,E,j]=Object(xe.a)(),[f,C]=Object(n.r)(""),[y,k]=Object(n.r)(""),N=Object(n.q)(),w=Object(n.q)();Object(n.n)(()=>{const e={offsetLeft:d.current.offsetLeft,...Object(h.l)(d.current.getBoundingClientRect(),["top","width","height"])},t={offsetLeft:m.current.offsetLeft,...Object(h.l)(m.current.getBoundingClientRect(),["width"])};function a(t){const a=[Math.min(Math.max(0,t.pageX-e.offsetLeft),e.width-1),Math.min(Math.max(0,t.pageY-e.top+i.current.scrollTop),e.height-1)],{huePosition:n}=Sa(v.current,N.current);p(Ia({colorPosition:a,huePosition:n},N.current)),E()}function n(e){const{colorPosition:a}=Sa(v.current,N.current),n=Math.min(Math.max(0,e.pageX-t.offsetLeft),t.width-1);p(Ia({colorPosition:a,huePosition:n},N.current)),E()}N.current={colorRect:e,hueRect:t},Object(b.b)(d.current,{onCapture:a,onDrag:a,onRelease:j,onClick:j,withCursor:!0}),Object(b.b)(m.current,{onCapture:n,onDrag:n,onRelease:j,onClick:j,withCursor:!0})},[E,j]);const{colorPosition:S=[0,0],huePosition:I=0}=N.current?Sa(g,N.current):{},P=pa(Oa(g)),F=g[0],M=pa(Oa([F,1,1]));Object(n.n)(()=>{const e=Oa(g),t="#"+pa(e);if(C(e.join(", ")),k(t),!u.current){const a=Ea(e);o({theme:l.current,background:void 0,backgroundColor:t,patternColor:a})}u.current=!1},[g,o]),Object(n.n)(()=>{!function(e,t,a,n){let s,c,r;a.current&&n.current?(s=n.current.colorRect.width,c=n.current.colorRect.height,r=a.current):(s=e.offsetWidth,c=e.offsetHeight,r=e.getContext("2d"),e.width=s,e.height=c,a.current=r);const o=r.createImageData(s,c),l=o.data,i=Oa([t,1,1]);let d=0;for(let e=0;e{!function(e){const t=e.offsetWidth;e.width=t,e.height=1;const a=e.getContext("2d"),n=a.createImageData(t,1),s=n.data;let c=0;for(let e=0;e{const t=e.currentTarget.value.replace(/[^\d, ]/g,"").slice(0,13);if(t.match(/^\d{1,3},\s?\d{1,3},\s?\d{1,3}$/)){const e=t.split(",").map(e=>Number(e.trim()));p(va(e))}e.currentTarget.value=t},[]),R=Object(n.m)(e=>{const t=e.currentTarget.value.replace(/[^0-9a-fA-F]/g,"").slice(0,6);t.match(/^#?[0-9a-fA-F]{6}$/)&&p(va(ga(t.replace("#","")))),e.currentTarget.value=t},[]),T=Object(n.m)(e=>{p(va(ga(e.currentTarget.dataset.color.replace("#",""))))},[]),D=Object(W.a)("SettingsGeneralBackgroundColor settings-content custom-scroll",O&&"is-dragging");return Object(L.a)(e,a,t,r.n.GeneralChatBackgroundColor),n.a.createElement("div",{ref:i,className:D},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("div",{ref:d,className:"color-picker"},n.a.createElement("canvas",null),n.a.createElement("div",{className:"handle",style:`transform: translate(${S[0]}px, ${S[1]}px); background-color: #${P};`})),n.a.createElement("div",{ref:m,className:"hue-picker"},n.a.createElement("canvas",null),n.a.createElement("div",{className:"handle",style:`transform: translateX(${I}px); background-color: #${M};`})),n.a.createElement("div",{className:"tools"},n.a.createElement(ve.a,{value:y,label:"HEX",onChange:R}),n.a.createElement(ve.a,{value:f,label:"RGB",onChange:A}))),n.a.createElement("div",{className:"predefined-colors"},wa.map(e=>n.a.createElement("div",{className:e==="#"+P?"active":void 0,"data-color":e,style:`background-color: ${e};`,onClick:T}))))}));var Fa=Object(n.h)(Object(s.h)(e=>({hasPrivateChatsNotifications:Boolean(e.settings.byKey.hasPrivateChatsNotifications),hasPrivateChatsMessagePreview:Boolean(e.settings.byKey.hasPrivateChatsMessagePreview),hasGroupNotifications:Boolean(e.settings.byKey.hasGroupNotifications),hasGroupMessagePreview:Boolean(e.settings.byKey.hasGroupMessagePreview),hasBroadcastNotifications:Boolean(e.settings.byKey.hasBroadcastNotifications),hasBroadcastMessagePreview:Boolean(e.settings.byKey.hasBroadcastMessagePreview),hasContactJoinedNotifications:Boolean(e.settings.byKey.hasContactJoinedNotifications)}),(e,t)=>Object(h.l)(t,["loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings"]))(({isActive:e,onScreenSelect:t,onReset:a,hasPrivateChatsNotifications:s,hasPrivateChatsMessagePreview:c,hasGroupNotifications:o,hasGroupMessagePreview:l,hasBroadcastNotifications:i,hasBroadcastMessagePreview:d,hasContactJoinedNotifications:m,loadNotificationSettings:u,updateContactSignUpNotification:h,updateNotificationSettings:b})=>{Object(n.n)(()=>{u()},[u]);const g=Object(n.m)((e,t,a)=>{const n="contact"===t?!s:!("group"===t?o:i),r="contact"===t?c:"group"===t?l:d;b({peerType:t,..."silent"===a&&{isSilent:!e.target.checked,shouldShowPreviews:r},..."showPreviews"===a&&{shouldShowPreviews:e.target.checked,isSilent:n}})},[d,i,l,o,c,s,b]),p=Object(n.m)(e=>{h({isSilent:!e.target.checked})},[h]),v=Object(M.a)();return Object(L.a)(e,a,t,r.n.Notifications),n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:v.isRtl?"rtl":void 0},v("AutodownloadPrivateChats")),n.a.createElement(Zt.a,{label:v("NotificationsForPrivateChats"),subLabel:v(s?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:s,onChange:e=>{g(e,"contact","silent")}}),n.a.createElement(Zt.a,{label:v("MessagePreview"),subLabel:v(c?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:c,onChange:e=>{g(e,"contact","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:v.isRtl?"rtl":void 0},v("FilterGroups")),n.a.createElement(Zt.a,{label:v("NotificationsForGroups"),subLabel:v(o?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:o,onChange:e=>{g(e,"group","silent")}}),n.a.createElement(Zt.a,{label:v("MessagePreview"),subLabel:v(l?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:l,onChange:e=>{g(e,"group","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:v.isRtl?"rtl":void 0},v("FilterChannels")),n.a.createElement(Zt.a,{label:v("NotificationsForChannels"),subLabel:v(i?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:i,onChange:e=>{g(e,"broadcast","silent")}}),n.a.createElement(Zt.a,{label:v("MessagePreview"),subLabel:v(d?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:d,onChange:e=>{g(e,"broadcast","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:v.isRtl?"rtl":void 0},v("PhoneOther")),n.a.createElement(Zt.a,{label:v("ContactJoined"),checked:m,onChange:p})))}));var Ma=Object(n.h)(Object(s.h)(e=>{const{settings:{byKey:{hasPassword:t,isSensitiveEnabled:a,canChangeSensitive:n},privacy:s},blocked:c,activeSessions:r}=e;return{hasPassword:t,blockedCount:c.totalCount,sessionsCount:r.length,isSensitiveEnabled:a,canChangeSensitive:n,visibilityPrivacyPhoneNumber:s.phoneNumber&&s.phoneNumber.visibility,visibilityPrivacyLastSeen:s.lastSeen&&s.lastSeen.visibility,visibilityPrivacyProfilePhoto:s.profilePhoto&&s.profilePhoto.visibility,visibilityPrivacyForwarding:s.forwards&&s.forwards.visibility,visibilityPrivacyGroupChats:s.chatInvite&&s.chatInvite.visibility}},(e,t)=>Object(h.l)(t,["loadBlockedContacts","loadAuthorizations","loadPrivacySettings","loadContentSettings","updateContentSettings"]))(({isActive:e,onScreenSelect:t,onReset:a,hasPassword:s,blockedCount:c,sessionsCount:o,isSensitiveEnabled:l,canChangeSensitive:i,visibilityPrivacyPhoneNumber:d,visibilityPrivacyLastSeen:m,visibilityPrivacyProfilePhoto:u,visibilityPrivacyForwarding:h,visibilityPrivacyGroupChats:b,loadPrivacySettings:g,loadBlockedContacts:p,loadAuthorizations:v,loadContentSettings:O,updateContentSettings:E})=>{Object(n.n)(()=>{p(),v(),g(),O()},[p,v,g,O]);const j=Object(M.a)();function f(e){switch(e){case"everybody":return j("P2PEverybody");case"contacts":return j("P2PContacts");case"nobody":return j("P2PNobody")}}return Object(L.a)(e,a,t,r.n.Privacy),n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement(Ee.a,{icon:"delete-user",narrow:!0,onClick:()=>t(r.n.PrivacyBlockedUsers)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},j("BlockedUsers")),c>0&&n.a.createElement("span",{className:"subtitle",dir:"auto"},j("Users",c)))),n.a.createElement(Ee.a,{icon:"lock",narrow:!0,onClick:()=>t(s?r.n.TwoFaEnabled:r.n.TwoFaDisabled)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},j("TwoStepVerification")),n.a.createElement("span",{className:"subtitle",dir:"auto"},j(s?"PasswordOn":"PasswordOff")))),n.a.createElement(Ee.a,{icon:"active-sessions",narrow:!0,onClick:()=>t(r.n.PrivacyActiveSessions)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},j("SessionsTitle")),o>0&&n.a.createElement("span",{className:"subtitle",dir:"auto"},1===o?"1 session":o+" sessions")))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:j.isRtl?"rtl":void 0},j("PrivacyTitle")),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>t(r.n.PrivacyPhoneNumber)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},j("PrivacyPhoneTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},f(d)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>t(r.n.PrivacyLastSeen)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},j("LastSeenTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},f(m)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>t(r.n.PrivacyProfilePhoto)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},j("PrivacyProfilePhotoTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},f(u)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>t(r.n.PrivacyForwarding)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},j("PrivacyForwardsTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},f(h)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>t(r.n.PrivacyGroupChats)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},j("WhoCanAddMe")),n.a.createElement("span",{className:"subtitle",dir:"auto"},f(b))))),i&&n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:j.isRtl?"rtl":void 0},j("lng_settings_sensitive_title")),n.a.createElement(Zt.a,{label:j("lng_settings_sensitive_disable_filtering"),subLabel:j("lng_settings_sensitive_about"),checked:Boolean(l),disabled:!i,onCheck:E})))})),La=a(14);var Aa=Object(n.h)(Object(s.h)(e=>({languages:e.settings.byKey.languages,language:e.settings.byKey.language}),(e,t)=>Object(h.l)(t,["loadLanguages","setSettingOption"]))(({isActive:e,onScreenSelect:t,onReset:a,languages:s,language:c,loadLanguages:o,setSettingOption:l})=>{const[i,d]=Object(n.r)(c),[m,u,h]=Object(xe.a)();Object(n.n)(()=>{o()},[o]);const b=Object(n.m)(e=>{d(e),u(),Object(La.d)(e,()=>{h(),l({language:e})})},[u,h,l]),g=Object(n.p)(()=>s?function(e){const t=(window.navigator.language||"en").toLowerCase(),a=t.substr(0,2);return e.map(({langCode:e,nativeName:t,name:a})=>({value:e,label:t,subLabel:a})).sort(e=>!t||e.value!==t&&e.value!==a?0:-1)}(s):void 0,[s]);return Object(L.a)(e,a,t,r.n.Language),n.a.createElement("div",{className:"settings-content settings-item settings-language custom-scroll"},g?n.a.createElement(qe.a,{name:"keyboard-send-settings",options:g,selected:i,loadingOption:m?i:void 0,onChange:b}):n.a.createElement(ge.a,null))}));function Ra(e){switch(e){case r.n.PrivacyPhoneNumber:case r.n.PrivacyPhoneNumberAllowedContacts:case r.n.PrivacyPhoneNumberDeniedContacts:return"phoneNumber";case r.n.PrivacyLastSeen:case r.n.PrivacyLastSeenAllowedContacts:case r.n.PrivacyLastSeenDeniedContacts:return"lastSeen";case r.n.PrivacyProfilePhoto:case r.n.PrivacyProfilePhotoAllowedContacts:case r.n.PrivacyProfilePhotoDeniedContacts:return"profilePhoto";case r.n.PrivacyForwarding:case r.n.PrivacyForwardingAllowedContacts:case r.n.PrivacyForwardingDeniedContacts:return"forwards";case r.n.PrivacyGroupChats:case r.n.PrivacyGroupChatsAllowedContacts:case r.n.PrivacyGroupChatsDeniedContacts:return"chatInvite"}}var Ta=Object(n.h)(Object(s.h)((e,{screen:t})=>{let a;const{chats:{byId:n},settings:{privacy:s}}=e;switch(t){case r.n.PrivacyPhoneNumber:a=s.phoneNumber;break;case r.n.PrivacyLastSeen:a=s.lastSeen;break;case r.n.PrivacyProfilePhoto:a=s.profilePhoto;break;case r.n.PrivacyForwarding:a=s.forwards;break;case r.n.PrivacyGroupChats:a=s.chatInvite}return a?{...a,chatsById:n}:{}},(e,t)=>Object(h.l)(t,["setPrivacyVisibility"]))(({screen:e,isActive:t,onScreenSelect:a,onReset:s,visibility:c,allowUserIds:o,allowChatIds:l,blockUserIds:i,blockChatIds:d,chatsById:m,setPrivacyVisibility:u})=>{const h=Object(M.a)(),b=Object(n.p)(()=>{switch(e){case r.n.PrivacyProfilePhoto:case r.n.PrivacyGroupChats:return[{value:"everybody",label:h("P2PEverybody")},{value:"contacts",label:h("P2PContacts")}];default:return[{value:"everybody",label:h("P2PEverybody")},{value:"contacts",label:h("P2PContacts")},{value:"nobody",label:h("P2PNobody")}]}},[h,e]),g={shouldShowDenied:"nobody"!==c,shouldShowAllowed:"everybody"!==c},p=Ra(e),v=Object(n.p)(()=>{switch(e){case r.n.PrivacyPhoneNumber:return h("PrivacyPhoneTitle");case r.n.PrivacyLastSeen:return h("LastSeenTitle");case r.n.PrivacyProfilePhoto:return h("PrivacyProfilePhotoTitle");case r.n.PrivacyForwarding:return h("PrivacyForwardsTitle");case r.n.PrivacyGroupChats:return h("WhoCanAddMe");default:return}},[h,e]);Object(L.a)(t,s,a,e);const O=Object(n.p)(()=>{switch(e){case r.n.PrivacyLastSeen:return h("CustomHelp");default:return}},[h,e]),E=(()=>{switch(e){case r.n.PrivacyPhoneNumber:return r.n.PrivacyPhoneNumberAllowedContacts;case r.n.PrivacyLastSeen:return r.n.PrivacyLastSeenAllowedContacts;case r.n.PrivacyProfilePhoto:return r.n.PrivacyProfilePhotoAllowedContacts;case r.n.PrivacyForwarding:return r.n.PrivacyForwardingAllowedContacts;default:return r.n.PrivacyGroupChatsAllowedContacts}})(),j=(()=>{switch(e){case r.n.PrivacyPhoneNumber:return r.n.PrivacyPhoneNumberDeniedContacts;case r.n.PrivacyLastSeen:return r.n.PrivacyLastSeenDeniedContacts;case r.n.PrivacyProfilePhoto:return r.n.PrivacyProfilePhotoDeniedContacts;case r.n.PrivacyForwarding:return r.n.PrivacyForwardingDeniedContacts;default:return r.n.PrivacyGroupChatsDeniedContacts}})(),f=Object(n.p)(()=>o&&l&&m?l.reduce((e,t)=>e+(m[t]?m[t].membersCount:0),o.length):0,[l,o,m]),C=Object(n.p)(()=>i&&d&&m?d.reduce((e,t)=>e+(m[t]?m[t].membersCount:0),i.length):0,[d,i,m]),y=Object(n.m)(e=>{u({privacyKey:p,visibility:e})},[p,u]);return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:h.isRtl?"rtl":void 0},v),n.a.createElement(qe.a,{name:"visibility-"+p,options:b,onChange:y,selected:c}),O&&n.a.createElement("p",{className:"settings-item-description-larger",dir:h.isRtl?"rtl":void 0},O)),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:h.isRtl?"rtl":void 0},h("PrivacyExceptions")),g.shouldShowAllowed&&n.a.createElement(Ee.a,{narrow:!0,icon:"add-user",onClick:()=>{a(E)}},n.a.createElement("div",{className:"multiline-menu-item full-size"},f>0&&n.a.createElement("span",{className:"date",dir:"auto"},"+",f),n.a.createElement("span",{className:"title"},h("AlwaysShareWith")),n.a.createElement("span",{className:"subtitle"},h("EditAdminAddUsers")))),g.shouldShowDenied&&n.a.createElement(Ee.a,{narrow:!0,icon:"delete-user",onClick:()=>{a(j)}},n.a.createElement("div",{className:"multiline-menu-item full-size"},C>0&&n.a.createElement("span",{className:"date",dir:"auto"},"−",C),n.a.createElement("span",{className:"title"},h("NeverShareWith")),n.a.createElement("span",{className:"subtitle"},h("EditAdminAddUsers"))))))}));function Da(e){return[e.region,e.country].filter(Boolean).join(", ")}function Ba(e){return`${e.deviceModel}${e.deviceModel?", ":""} ${e.platform} ${e.systemVersion}`}var Ua=Object(n.h)(Object(s.h)(e=>({activeSessions:e.activeSessions}),(e,t)=>Object(h.l)(t,["loadAuthorizations","terminateAuthorization","terminateAllAuthorizations"]))(({isActive:e,onScreenSelect:t,onReset:a,activeSessions:s,loadAuthorizations:c,terminateAuthorization:o,terminateAllAuthorizations:l})=>{const[i,d,m]=Object(xe.a)();Object(n.n)(()=>{c()},[c]);const u=Object(n.m)(e=>{o({hash:e})},[o]),h=Object(n.m)(()=>{m(),l()},[m,l]),b=Object(n.p)(()=>s.find(e=>e.isCurrent),[s]),g=Object(n.p)(()=>s.filter(e=>!e.isCurrent),[s]),p=Object(M.a)();function v(e){return n.a.createElement(Ee.a,{key:e.hash,ripple:!0,narrow:!0,contextActions:[{title:"Terminate",icon:"stop",handler:()=>{u(e.hash)}}]},n.a.createElement("div",{className:"multiline-menu-item full-size",dir:"auto"},n.a.createElement("span",{className:"date"},Object(B.g)(p,1e3*e.dateActive)),n.a.createElement("span",{className:"title"},e.appName),n.a.createElement("span",{className:"subtitle black tight"},Ba(e)),n.a.createElement("span",{className:"subtitle"},e.ip," - ",Da(e))))}return Object(L.a)(e,a,t,r.n.PrivacyActiveSessions),n.a.createElement("div",{className:"settings-content custom-scroll"},b&&(E=b,n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:p.isRtl?"rtl":void 0},p("AuthSessions.CurrentSession")),n.a.createElement(Ee.a,{narrow:!0,inactive:!0},n.a.createElement("div",{className:"multiline-menu-item",dir:"auto"},n.a.createElement("span",{className:"title",dir:"auto"},E.appName),n.a.createElement("span",{className:"subtitle black tight"},Ba(E)),n.a.createElement("span",{className:"subtitle"},E.ip," - ",Da(E)))),n.a.createElement(Ee.a,{className:"destructive mb-0",icon:"stop",ripple:!0,narrow:!0,onClick:d},p("TerminateAllSessions")))),g&&(O=g,n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:p.isRtl?"rtl":void 0},p("OtherSessions")),O.map(v))),g&&n.a.createElement(Pe.a,{isOpen:i,onClose:m,text:"Are you sure you want to terminate all other sessions?",confirmLabel:"Terminate All Other Sessions",confirmHandler:h,confirmIsDestructive:!0}));var O,E}));var xa=Object(n.h)(Object(s.h)(e=>{const{chats:{byId:t},users:{byId:a},blocked:{ids:n}}=e;return{chatsByIds:t,usersByIds:a,blockedIds:n}},(e,t)=>Object(h.l)(t,["unblockContact"]))(({isActive:e,onScreenSelect:t,onReset:a,chatsByIds:s,usersByIds:c,blockedIds:l,unblockContact:i})=>{const d=Object(n.m)(e=>{i({contactId:e})},[i]),m=Object(M.a)();return Object(L.a)(e,a,t,r.n.PrivacyBlockedUsers),n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content infinite-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("p",{className:"settings-item-description-larger mt-0 mb-2",dir:m.isRtl?"rtl":void 0},m("BlockedUsersInfo"))),n.a.createElement("div",{className:"chat-list custom-scroll"},l&&l.length?n.a.createElement("div",{className:"scroll-container"},l.map((e,t)=>function(e,t,a){const r=Object(u.ob)(e),l=r?c[e]:void 0,i=r?void 0:s[e],h=Object(W.a)("Chat chat-item-clickable blocked-list-item",r?"private":"group");return n.a.createElement(Ee.a,{key:e,className:h,ripple:!0,narrow:!0,contextActions:[{title:"Unblock",icon:"unlock",handler:()=>{d(e)}}],style:`top: ${(a+t)*o.k}px;`},n.a.createElement(x.a,{size:"medium",user:l,chat:i}),n.a.createElement("div",{className:"contact-info",dir:"auto"},n.a.createElement("h3",{dir:"auto"},Object(U.a)((r?Object(u.bb)(l):Object(u.k)(m,i))||"")),l&&l.phoneNumber&&n.a.createElement("div",{className:"contact-phone",dir:"auto"},Object(At.c)(l.phoneNumber)),l&&!l.phoneNumber&&l.username&&n.a.createElement("div",{className:"contact-username",dir:"auto"},"@",l.username)))}(e,t,0))):l&&!l.length?n.a.createElement("div",{className:"no-results",dir:"auto"},"List is empty"):n.a.createElement(ge.a,{key:"loading"}))),n.a.createElement(Dt.a,{isShown:!0,onClick:()=>{},className:"not-implemented",ariaLabel:"Add a blocked user"},n.a.createElement("i",{className:"icon-add"})))})),Ga=a(129);var za=Object(n.h)(Object(s.h)(e=>({animatedEmoji:Object(m.c)(e,"🔐")}))(({isActive:e,onReset:t,animatedEmoji:a,onScreenSelect:s})=>{const c=Object(M.a)();return Object(L.a)(e,t,s,r.n.TwoFaEnabled),n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ga.a,{sticker:a,size:"large"}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},Object(U.a)(c("EnabledPasswordText"),["br"]))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(Ee.a,{icon:"edit",onClick:()=>s(r.n.TwoFaChangePasswordCurrent)},c("ChangePassword")),n.a.createElement(Ee.a,{icon:"password-off",onClick:()=>s(r.n.TwoFaTurnOff)},c("TurnPasswordOff")),n.a.createElement(Ee.a,{icon:"email",onClick:()=>s(r.n.TwoFaRecoveryEmailCurrentPassword)},c("SetRecoveryEmail"))))})),qa=a(153),_a=a(154);var Ha=Object(n.h)(({screen:e,isActive:t,onScreenSelect:a,onReset:s,error:c,isLoading:r,expectedPassword:o,placeholder:l="Current Password",hint:i,submitLabel:d,clearError:m,onSubmit:u})=>{const[h,b]=Object(n.r)(""),[g,p]=Object(n.r)(!1),v=Object(n.m)(e=>{o&&e!==o?b("Passwords Should Be Equal"):u(e)},[u,o]),O=Object(n.m)(()=>{m&&m(),b("")},[m]),E=Object(M.a)();return Object(L.a)(t,s,a,e),n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(qa.a,{isBig:!0,isPasswordVisible:g})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(_a.a,{error:h||c,hint:i,placeholder:l,submitLabel:d||E("Next"),clearError:O,isLoading:r,isPasswordVisible:g,onChangePasswordVisibility:p,onSubmit:v})))});var $a=Object(n.h)(Object(s.h)(e=>({animatedEmoji:Object(m.c)(e,"🔐")}))(({isActive:e,onScreenSelect:t,onReset:a,animatedEmoji:s,onStart:c})=>{const o=Object(M.a)();return Object(L.a)(e,a,t,r.n.TwoFaDisabled),n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ga.a,{sticker:s,size:"large"}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},o("SetAdditionalPasswordInfo"))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(D.a,{onClick:c},o("EditAdminTransferSetPassword"))))}));const Va=l.l?550:400;var Wa=Object(n.h)(Object(s.h)((e,{icon:t})=>({animatedEmoji:Object(m.c)(e,"email"===t?"💌":"💡")}))(({animatedEmoji:e,type:t="text",isLoading:a,error:s,placeholder:c,shouldConfirm:r,clearError:o,onSubmit:i,isActive:d,onScreenSelect:m,onReset:u,screen:h})=>{const b=Object(n.q)(null),[g,p]=Object(n.r)(""),[v,O,E]=Object(xe.a)(!1);Object(n.n)(()=>{l.n||setTimeout(()=>{b.current.focus()},Va)},[]);const j=Object(M.a)();return Object(L.a)(d,u,m,h),n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ga.a,{sticker:e,size:"large"})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement("form",{action:"",onSubmit:e=>{e.preventDefault(),b.current&&i(g)}},n.a.createElement(ve.a,{ref:b,value:g,inputMode:t,label:c,error:s,onChange:e=>{s&&o&&o(),p(e.target.value)}}),g?n.a.createElement(D.a,{type:"submit",isLoading:a,ripple:!0},j("Continue")):n.a.createElement(D.a,{isText:!0,isLoading:a,ripple:!0,onClick:r?O:()=>{i()}},j("YourEmailSkip"))),r&&n.a.createElement(pe.a,{className:"narrow",isOpen:v,title:j("YourEmailSkipWarning"),onClose:E},Object(U.a)(j("YourEmailSkipWarningText"),["br","simple_markdown"]),n.a.createElement("div",{className:"dialog-buttons"},n.a.createElement(D.a,{color:"danger",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:()=>{E(),i()}},j("YourEmailSkip")),n.a.createElement(D.a,{color:"primary",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:E},j("Cancel"))))))}));var Ka=Object(n.h)(Object(s.h)(e=>({animatedEmoji:Object(m.c)(e,"🥳")}))(({isActive:e,onReset:t,animatedEmoji:a,onScreenSelect:s})=>{const c=Object(M.a)();return Object(L.a)(e,t,s,r.n.TwoFaCongratulations),n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ga.a,{sticker:a,size:"large"}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},c("TwoStepVerificationPasswordSetInfo"))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(D.a,{onClick:()=>{s(r.n.Privacy)}},c("TwoStepVerificationPasswordReturnSettings"))))}));const Ya=l.l?550:400;var Qa=Object(n.h)(Object(s.h)(e=>({animatedEmoji:Object(m.c)(e,"💌"),codeLength:e.twoFaSettings.waitingEmailCodeLength}))(({animatedEmoji:e,codeLength:t,isLoading:a,error:s,clearError:c,onSubmit:r,isActive:o,onScreenSelect:i,onReset:d,screen:m})=>{const u=Object(n.q)(null),[h,b]=Object(n.r)("");Object(n.n)(()=>{l.n||setTimeout(()=>{u.current.focus()},Ya)},[]);const g=Object(M.a)();Object(L.a)(o,d,i,m);return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ga.a,{sticker:e,size:"large"})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(ve.a,{value:h,ref:u,inputMode:"decimal",label:g("YourEmailCode"),error:s,onChange:e=>{s&&c&&c();const a=e.target.value.slice(0,t);a.length===t&&r(a),b(a),e.target.value=a}}),a&&n.a.createElement(ge.a,null)))}));var Za=Object(n.h)(Object(s.h)(e=>({...e.twoFaSettings}),(e,t)=>Object(h.l)(t,["updatePassword","updateRecoveryEmail","clearPassword","provideTwoFaEmailCode","checkPassword","clearTwoFaError"]))(({currentScreen:e,shownScreen:t,state:a,hint:s,isLoading:c,error:o,waitingEmailCodeLength:l,dispatch:i,isActive:d,onScreenSelect:m,onReset:u,updatePassword:h,checkPassword:b,clearTwoFaError:g,updateRecoveryEmail:p,provideTwoFaEmailCode:v,clearPassword:O})=>{Object(n.n)(()=>{l&&(e===r.n.TwoFaNewPasswordEmail?m(r.n.TwoFaNewPasswordEmailCode):e===r.n.TwoFaRecoveryEmail&&m(r.n.TwoFaRecoveryEmailCode))},[e,m,l]);const E=Object(n.m)(()=>{i({type:"reset"}),m(r.n.TwoFaNewPassword)},[i,m]),j=Object(n.m)(e=>{i({type:"setPassword",payload:e}),m(r.n.TwoFaNewPasswordConfirm)},[i,m]),f=Object(n.m)(()=>{m(r.n.TwoFaNewPasswordHint)},[m]),C=Object(n.m)(e=>{i({type:"setHint",payload:e}),m(r.n.TwoFaNewPasswordEmail)},[i,m]),y=Object(n.m)(e=>{i({type:"setEmail",payload:e}),h({...a,email:e,onSuccess:()=>{m(r.n.TwoFaCongratulations)}})},[i,m,a,h]),k=Object(n.m)(e=>{i({type:"setCurrentPassword",payload:e}),b({currentPassword:e,onSuccess:()=>{m(r.n.TwoFaChangePasswordNew)}})},[b,i,m]),N=Object(n.m)(e=>{i({type:"setPassword",payload:e}),m(r.n.TwoFaChangePasswordConfirm)},[i,m]),w=Object(n.m)(()=>{m(r.n.TwoFaChangePasswordHint)},[m]),S=Object(n.m)(e=>{i({type:"setHint",payload:e}),h({...a,hint:e,onSuccess:()=>{m(r.n.TwoFaCongratulations)}})},[i,m,a,h]),I=Object(n.m)(e=>{O({currentPassword:e,onSuccess:()=>{m(r.n.Privacy)}})},[O,m]),P=Object(n.m)(e=>{i({type:"setCurrentPassword",payload:e}),b({currentPassword:e,onSuccess:()=>{m(r.n.TwoFaRecoveryEmail)}})},[b,i,m]),F=Object(n.m)(e=>{i({type:"setEmail",payload:e}),p({...a,email:e,onSuccess:()=>{m(r.n.TwoFaCongratulations)}})},[i,m,a,p]),L=Object(n.m)(e=>{v({code:e})},[v]),A=Object(M.a)();switch(e){case r.n.TwoFaDisabled:return n.a.createElement($a,{onStart:E,onScreenSelect:m,isActive:d||[r.n.TwoFaNewPassword,r.n.TwoFaNewPasswordConfirm,r.n.TwoFaNewPasswordHint,r.n.TwoFaNewPasswordEmail,r.n.TwoFaNewPasswordEmailCode,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaNewPassword:return n.a.createElement(Ha,{screen:e,placeholder:A("PleaseEnterPassword"),submitLabel:A("Continue"),onSubmit:j,onScreenSelect:m,isActive:d||[r.n.TwoFaNewPasswordConfirm,r.n.TwoFaNewPasswordHint,r.n.TwoFaNewPasswordEmail,r.n.TwoFaNewPasswordEmailCode,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaNewPasswordConfirm:return n.a.createElement(Ha,{screen:e,expectedPassword:a.password,placeholder:A("PleaseReEnterPassword"),submitLabel:A("Continue"),onSubmit:f,onScreenSelect:m,isActive:d||[r.n.TwoFaNewPasswordHint,r.n.TwoFaNewPasswordEmail,r.n.TwoFaNewPasswordEmailCode,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaNewPasswordHint:return n.a.createElement(Wa,{icon:"hint",placeholder:A("PasswordHintPlaceholder"),onSubmit:C,screen:e,onScreenSelect:m,isActive:d||[r.n.TwoFaNewPasswordEmail,r.n.TwoFaNewPasswordEmailCode,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaNewPasswordEmail:return n.a.createElement(Wa,{icon:"email",type:"email",isLoading:c,error:o,clearError:g,placeholder:A("RecoveryEmailTitle"),shouldConfirm:!0,onSubmit:y,screen:e,onScreenSelect:m,isActive:d||[r.n.TwoFaNewPasswordEmailCode,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaNewPasswordEmailCode:return n.a.createElement(Qa,{isLoading:c,error:o,clearError:g,onSubmit:L,screen:e,onScreenSelect:m,isActive:d||t===r.n.TwoFaCongratulations,onReset:u});case r.n.TwoFaCongratulations:return n.a.createElement(Ka,{onScreenSelect:m,isActive:d,onReset:u});case r.n.TwoFaEnabled:return n.a.createElement(za,{onScreenSelect:m,isActive:d||[r.n.TwoFaChangePasswordCurrent,r.n.TwoFaChangePasswordNew,r.n.TwoFaChangePasswordConfirm,r.n.TwoFaChangePasswordHint,r.n.TwoFaTurnOff,r.n.TwoFaRecoveryEmailCurrentPassword,r.n.TwoFaRecoveryEmail,r.n.TwoFaRecoveryEmailCode,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaChangePasswordCurrent:return n.a.createElement(Ha,{screen:e,isLoading:c,error:o,clearError:g,hint:s,onSubmit:k,onScreenSelect:m,isActive:d||[r.n.TwoFaChangePasswordNew,r.n.TwoFaChangePasswordConfirm,r.n.TwoFaChangePasswordHint,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaChangePasswordNew:return n.a.createElement(Ha,{screen:e,placeholder:A("PleaseEnterNewFirstPassword"),onSubmit:N,onScreenSelect:m,isActive:d||[r.n.TwoFaChangePasswordConfirm,r.n.TwoFaChangePasswordHint,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaChangePasswordConfirm:return n.a.createElement(Ha,{screen:e,expectedPassword:a.password,placeholder:A("PleaseReEnterPassword"),onSubmit:w,onScreenSelect:m,isActive:d||[r.n.TwoFaChangePasswordHint,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaChangePasswordHint:return n.a.createElement(Wa,{isLoading:c,error:o,clearError:g,icon:"hint",placeholder:A("PasswordHintPlaceholder"),onSubmit:S,onScreenSelect:m,isActive:d||t===r.n.TwoFaCongratulations,onReset:u,screen:e});case r.n.TwoFaTurnOff:return n.a.createElement(Ha,{isLoading:c,error:o,clearError:g,hint:s,onSubmit:I,onScreenSelect:m,isActive:d,onReset:u,screen:e});case r.n.TwoFaRecoveryEmailCurrentPassword:return n.a.createElement(Ha,{screen:e,isLoading:c,error:o,clearError:g,hint:s,onSubmit:P,onScreenSelect:m,isActive:d||[r.n.TwoFaRecoveryEmail,r.n.TwoFaRecoveryEmailCode,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaRecoveryEmail:return n.a.createElement(Wa,{screen:e,icon:"email",type:"email",placeholder:A("RecoveryEmailTitle"),onSubmit:F,onScreenSelect:m,isActive:d||[r.n.TwoFaRecoveryEmailCode,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaRecoveryEmailCode:return n.a.createElement(Qa,{screen:e,isLoading:c,error:o,clearError:g,onSubmit:L,onScreenSelect:m,isActive:d||t===r.n.TwoFaCongratulations,onReset:u});default:return}})),Ja=a(173);function Xa(e,t){const{privacy:a}=e.settings;switch(t){case r.n.PrivacyPhoneNumberAllowedContacts:case r.n.PrivacyPhoneNumberDeniedContacts:return a.phoneNumber;case r.n.PrivacyLastSeenAllowedContacts:case r.n.PrivacyLastSeenDeniedContacts:return a.lastSeen;case r.n.PrivacyProfilePhotoAllowedContacts:case r.n.PrivacyProfilePhotoDeniedContacts:return a.profilePhoto;case r.n.PrivacyForwardingAllowedContacts:case r.n.PrivacyForwardingDeniedContacts:return a.forwards;case r.n.PrivacyGroupChatsDeniedContacts:case r.n.PrivacyGroupChatsAllowedContacts:return a.chatInvite}}var en=Object(n.h)(Object(s.h)((e,{screen:t})=>{const{chats:{byId:a,listIds:n,orderedPinnedIds:s},currentUserId:c}=e;return{currentUserId:c,chatsById:a,listIds:n.active,orderedPinnedIds:s.active,archivedPinnedIds:s.archived,archivedListIds:n.archived,settings:Xa(e,t)}},(e,t)=>Object(h.l)(t,["setPrivacySettings"]))(({currentUserId:e,isAllowList:t,screen:a,settings:s,chatsById:c,listIds:o,orderedPinnedIds:l,archivedListIds:i,archivedPinnedIds:d,setPrivacySettings:m,isActive:h,onScreenSelect:b,onReset:g})=>{const p=Object(M.a)(),v=Object(n.p)(()=>s?t?[...s.allowUserIds,...s.allowChatIds]:[...s.blockUserIds,...s.blockChatIds]:[],[t,s]),[O,E]=Object(n.r)(""),[j,f]=Object(n.r)(!1),[C,y]=Object(n.r)(v),k=Object(n.p)(()=>{const e=o?Object(u.Fb)(c,o,l,"all"):void 0,t=i?Object(u.Fb)(c,i,d,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]},[c,o,l,i,d]),N=Object(n.p)(()=>{if(k)return k.filter(t=>(Object(u.ob)(t.id)&&t.id!==e||Object(u.nb)(t))&&(!O||Object(ue.a)(Object(u.k)(p,t),O)||v.includes(t.id))).map(({id:e})=>e)},[k,e,p,O,v]),w=Object(n.m)(e=>{y(e),f(!0)},[]),S=Object(n.m)(()=>{m({privacyKey:Ra(a),isAllowList:Boolean(t),contactsIds:C}),b(r.n.Privacy)},[t,C,b,a,m]);return Object(L.a)(h,g,b,a),n.a.createElement("div",{className:"NewChat-inner step-1"},n.a.createElement(Ja.a,{itemIds:N||[],selectedIds:C,filterValue:O,filterPlaceholder:p(t?"AlwaysShareWithPlaceholder":"NeverShareWithPlaceholder"),searchInputId:"new-group-picker-search",onSelectedIdsChange:w,onFilterChange:E}),n.a.createElement(Dt.a,{isShown:j,onClick:S,ariaLabel:p(t?"AlwaysShareWithTitle":"NeverShareWithTitle")},n.a.createElement("i",{className:"icon-arrow-right"})))}));a(291);const tn=Object.keys(r.n).length/2,an=[r.n.TwoFaDisabled,r.n.TwoFaNewPassword,r.n.TwoFaNewPasswordConfirm,r.n.TwoFaNewPasswordHint,r.n.TwoFaNewPasswordEmail,r.n.TwoFaNewPasswordEmailCode,r.n.TwoFaCongratulations,r.n.TwoFaEnabled,r.n.TwoFaChangePasswordCurrent,r.n.TwoFaChangePasswordNew,r.n.TwoFaChangePasswordConfirm,r.n.TwoFaChangePasswordHint,r.n.TwoFaTurnOff,r.n.TwoFaRecoveryEmailCurrentPassword,r.n.TwoFaRecoveryEmail,r.n.TwoFaRecoveryEmailCode],nn=[r.n.Folders,r.n.FoldersCreateFolder,r.n.FoldersEditFolder,r.n.FoldersEditFolderFromChatList,r.n.FoldersIncludedChats,r.n.FoldersIncludedChatsFromChatList,r.n.FoldersExcludedChats,r.n.FoldersExcludedChatsFromChatList],sn=[r.n.PrivacyBlockedUsers,r.n.PrivacyActiveSessions],cn=[r.n.PrivacyPhoneNumberAllowedContacts,r.n.PrivacyPhoneNumberDeniedContacts],rn=[r.n.PrivacyLastSeenAllowedContacts,r.n.PrivacyLastSeenDeniedContacts],on=[r.n.PrivacyProfilePhotoAllowedContacts,r.n.PrivacyProfilePhotoDeniedContacts],ln=[r.n.PrivacyForwardingAllowedContacts,r.n.PrivacyForwardingDeniedContacts],dn=[r.n.PrivacyGroupChatsAllowedContacts,r.n.PrivacyGroupChatsDeniedContacts];var mn=Object(n.h)(({isActive:e,currentScreen:t,foldersState:a,foldersDispatch:s,onScreenSelect:c,onReset:o,shouldSkipTransition:i})=>{const[d,m]=Object(Pt.a)(Mt,Ft),u=Object(n.m)(()=>{t!==r.n.FoldersCreateFolder&&t!==r.n.FoldersEditFolder&&t!==r.n.FoldersEditFolderFromChatList||setTimeout(()=>{s({type:"reset"})},200),t!==r.n.FoldersIncludedChats&&t!==r.n.FoldersExcludedChats?o():"create"===a.mode?c(r.n.FoldersCreateFolder):c(r.n.FoldersEditFolder)},[a.mode,s,t,o,c]),h=Object(n.m)(()=>{s({type:"saveFilters"}),u()},[s,u]);function b(o,l,i){return n.a.createElement(n.a.Fragment,null,n.a.createElement(Lt,{currentScreen:t,onReset:u,onSaveFilter:h,editedFolderId:a.folderId}),function(o,l){const i={[r.n.PrivacyPhoneNumber]:cn.includes(l),[r.n.PrivacyLastSeen]:rn.includes(l),[r.n.PrivacyProfilePhoto]:on.includes(l),[r.n.PrivacyForwarding]:ln.includes(l),[r.n.PrivacyGroupChats]:dn.includes(l)},h=an.includes(l),b=nn.includes(l),g=sn.includes(l)||h||Object.keys(i).includes(l.toString())||Object.values(i).find(e=>!0===e);switch(t){case r.n.Main:return n.a.createElement(Rt,{onScreenSelect:c,isActive:e,onReset:u});case r.n.EditProfile:return n.a.createElement(qt,{onScreenSelect:c,isActive:e&&o,onReset:u});case r.n.General:return n.a.createElement(ma,{onScreenSelect:c,isActive:o||l===r.n.GeneralChatBackgroundColor||l===r.n.GeneralChatBackground||g||b,onReset:u});case r.n.Notifications:return n.a.createElement(Fa,{onScreenSelect:c,isActive:o,onReset:u});case r.n.Privacy:return n.a.createElement(Ma,{onScreenSelect:c,isActive:o||g||h,onReset:u});case r.n.Language:return n.a.createElement(Aa,{onScreenSelect:c,isActive:o,onReset:u});case r.n.GeneralChatBackground:return n.a.createElement(ka,{onScreenSelect:c,isActive:o||l===r.n.GeneralChatBackgroundColor,onReset:u});case r.n.GeneralChatBackgroundColor:return n.a.createElement(Pa,{onScreenSelect:c,isActive:o,onReset:u});case r.n.PrivacyActiveSessions:return n.a.createElement(Ua,{onScreenSelect:c,isActive:o,onReset:u});case r.n.PrivacyBlockedUsers:return n.a.createElement(xa,{onScreenSelect:c,isActive:o,onReset:u});case r.n.PrivacyPhoneNumber:case r.n.PrivacyLastSeen:case r.n.PrivacyProfilePhoto:case r.n.PrivacyForwarding:case r.n.PrivacyGroupChats:return n.a.createElement(Ta,{screen:t,onScreenSelect:c,isActive:o||i[t],onReset:u});case r.n.PrivacyPhoneNumberAllowedContacts:case r.n.PrivacyLastSeenAllowedContacts:case r.n.PrivacyProfilePhotoAllowedContacts:case r.n.PrivacyForwardingAllowedContacts:case r.n.PrivacyGroupChatsAllowedContacts:return n.a.createElement(en,{isAllowList:!0,screen:t,onScreenSelect:c,isActive:o||i[t],onReset:u});case r.n.PrivacyPhoneNumberDeniedContacts:case r.n.PrivacyLastSeenDeniedContacts:case r.n.PrivacyProfilePhotoDeniedContacts:case r.n.PrivacyForwardingDeniedContacts:case r.n.PrivacyGroupChatsDeniedContacts:return n.a.createElement(en,{screen:t,onScreenSelect:c,isActive:o,onReset:u});case r.n.Folders:case r.n.FoldersCreateFolder:case r.n.FoldersEditFolder:case r.n.FoldersEditFolderFromChatList:case r.n.FoldersIncludedChats:case r.n.FoldersIncludedChatsFromChatList:case r.n.FoldersExcludedChats:case r.n.FoldersExcludedChatsFromChatList:return n.a.createElement(ea,{currentScreen:t,shownScreen:l,state:a,dispatch:s,isActive:o,onScreenSelect:c,onReset:u});case r.n.TwoFaDisabled:case r.n.TwoFaNewPassword:case r.n.TwoFaNewPasswordConfirm:case r.n.TwoFaNewPasswordHint:case r.n.TwoFaNewPasswordEmail:case r.n.TwoFaNewPasswordEmailCode:case r.n.TwoFaCongratulations:case r.n.TwoFaEnabled:case r.n.TwoFaChangePasswordCurrent:case r.n.TwoFaChangePasswordNew:case r.n.TwoFaChangePasswordConfirm:case r.n.TwoFaChangePasswordHint:case r.n.TwoFaTurnOff:case r.n.TwoFaRecoveryEmailCurrentPassword:case r.n.TwoFaRecoveryEmail:case r.n.TwoFaRecoveryEmailCode:return n.a.createElement(Za,{currentScreen:t,state:d,dispatch:m,shownScreen:l,isActive:o,onScreenSelect:c,onReset:u});default:return}}(o,i))}return n.a.createElement(T.a,{id:"Settings",name:i?"none":l.p,activeKey:t,renderCount:tn},b)});const un=Object(V.h)(e=>e(),6e4,!0);var hn=Object(n.h)(Object(s.h)(e=>{const{userIds:t}=e.contactList||{},{byId:a}=e.users;return{usersById:a,contactIds:t,serverTimeOffset:e.serverTimeOffset}},(e,t)=>Object(h.l)(t,["loadContactList","openChat"]))(({isActive:e,onReset:t,filter:a,usersById:s,contactIds:c,loadContactList:r,openChat:o,serverTimeOffset:i})=>{Object(n.n)(()=>{un(()=>{r()})}),Object(L.a)(e,t);const d=Object(n.m)(e=>{o({id:e,shouldReplaceHistory:!0})},[o]),m=Object(n.p)(()=>{if(!c)return;const e=a?c.filter(e=>{const t=s[e];if(!t)return!1;const n=Object(u.bb)(t);return n&&Object(ue.a)(n,a)}):c;return Object(u.Jb)(e,s,void 0,i)},[c,a,s,i]),[h,b]=Object(he.a)(void 0,m,Boolean(a));return n.a.createElement(Oe.a,{items:h,onLoadMore:b,className:"chat-list custom-scroll"},h&&h.length?h.map(e=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable",onClick:()=>d(e),ripple:!l.l},n.a.createElement(je.a,{userId:e,forceShowSelf:!0,avatarSize:"large"}))):h&&!h.length?n.a.createElement("p",{className:"no-results",key:"no-results",dir:"auto"},a.length?"No contacts matched your search.":"Contact list is empty."):n.a.createElement(ge.a,{key:"loading"}))}));const bn=Object(V.h)(e=>e(),6e4,!0);var gn=Object(n.h)(Object(s.h)(e=>{const{userIds:t}=e.contactList||{},{byId:a}=e.users,{byId:n}=e.chats,{currentUserId:s}=e,{query:c,fetchingStatus:r,globalResults:o,localResults:l}=e.globalSearch,{userIds:i}=o||{},{userIds:d}=l||{};return{currentUserId:s,usersById:a,chatsById:n,localContactIds:t,searchQuery:c,isSearching:r&&r.chats,globalUserIds:i,localUserIds:d}},(e,t)=>Object(h.l)(t,["loadContactList","setGlobalSearchQuery"]))(({isChannel:e,isActive:t,selectedMemberIds:a,onSelectedMemberIdsChange:s,onNextStep:c,onReset:r,currentUserId:o,usersById:l,chatsById:i,localContactIds:d,searchQuery:m,isSearching:b,localUserIds:g,globalUserIds:p,loadContactList:v,setGlobalSearchQuery:O})=>{Object(n.n)(()=>{bn(()=>{v()})});const E=Object(M.a)();Object(L.a)(t,r);const j=Object(n.m)(e=>{O({query:e})},[O]),f=Object(n.p)(()=>{const e=d?Object(u.Ib)(d.filter(e=>e!==o),i):[];if(!m)return e;const t=e.filter(e=>{const t=l[e];if(!t)return!1;const a=Object(u.bb)(t);return a&&Object(ue.a)(a,m)});return Object(u.Ib)(Object(h.o)([...t,...g||[],...p||[]]).filter(e=>{const t=l[e];return!t||!Object(u.Bb)(t)||t.canBeInvitedToGroup}),i,!1,a)},[d,i,m,g,p,a,o,l]),C=Object(n.m)(()=>{(a.length||e)&&(O({query:""}),c())},[a.length,e,O,c]);return n.a.createElement("div",{className:"NewChat step-1"},n.a.createElement("div",{className:"left-header"},n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:r,ariaLabel:"Return to Chat List"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,E("GroupAddMembers"))),n.a.createElement("div",{className:"NewChat-inner step-1"},n.a.createElement(Ja.a,{itemIds:f,selectedIds:a,filterValue:m,filterPlaceholder:E("SendMessageTo"),searchInputId:"new-group-picker-search",isLoading:b,onSelectedIdsChange:s,onFilterChange:j}),n.a.createElement(Dt.a,{isShown:Boolean(a.length||e),onClick:C,ariaLabel:e?"Continue To Channel Info":"Continue To Group Info"},n.a.createElement("i",{className:"icon-arrow-right"}))))}));var pn=Object(n.h)(Object(s.h)(e=>{const{progress:t,error:a}=e.chatCreation||{};return{creationProgress:t,creationError:a}},(e,t)=>Object(h.l)(t,["createGroupChat","createChannel"]))(({isChannel:e,isActive:t,memberIds:a,onReset:s,creationProgress:c,creationError:o,createGroupChat:l,createChannel:i})=>{const d=Object(M.a)();Object(L.a)(t,s);const[m,u]=Object(n.r)(""),[h,b]=Object(n.r)(""),[g,p]=Object(n.r)(),[v,O]=Object(n.r)(),E=c===r.a.InProgress,j=Object(n.m)(e=>{const{value:t}=e.currentTarget,a=t.replace(/^\s+/,"");u(a),a!==t&&(e.currentTarget.value=a)},[]),f=Object(n.m)(e=>{b(e.currentTarget.value)},[]),C=Object(n.m)(()=>{m.length?a.length>199?O("Sorry, creating supergroups is not yet supported"):l({title:m,photo:g,memberIds:a}):O("Chat title can't be empty")},[m,a,l,g,"Chat title can't be empty","Sorry, creating supergroups is not yet supported"]),y=Object(n.m)(()=>{m.length?i({title:m,about:h,photo:g,memberIds:a}):O("Channel title can't be empty")},[m,i,h,g,a,"Channel title can't be empty"]);Object(n.n)(()=>{c===r.a.Complete&&s(!0)},[c,s]);const k=o||("Chat title can't be empty"!==v&&"Channel title can't be empty"!==v?v:void 0);return n.a.createElement("div",{className:"NewChat"},n.a.createElement("div",{className:"left-header"},n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:()=>s(),ariaLabel:"Return to member selection"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,d(e?"NewChannel":"NewGroup"))),n.a.createElement("div",{className:"NewChat-inner step-2"},n.a.createElement(Tt.a,{onChange:p,title:d("AddPhoto")}),n.a.createElement(ve.a,{value:m,onChange:j,label:d(e?"EnterChannelName":"GroupName"),error:"Chat title can't be empty"===v||"Channel title can't be empty"===v?v:void 0}),e&&n.a.createElement(n.a.Fragment,null,n.a.createElement(ve.a,{value:h,onChange:f,label:d("DescriptionOptionalPlaceholder")}),n.a.createElement("p",{className:"note"},d("DescriptionInfo"))),k&&n.a.createElement("p",{className:"error"},k),a.length>0&&n.a.createElement(n.a.Fragment,null,n.a.createElement("h3",{className:"chat-members-heading"},d("GroupInfo.ParticipantCount",a.length,"i")),n.a.createElement("div",{className:"chat-members-list custom-scroll"},a.map(e=>n.a.createElement(Ee.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(je.a,{userId:e})))))),n.a.createElement(Dt.a,{isShown:0!==m.length,onClick:e?y:C,disabled:E,ariaLabel:e?d("ChannelIntro.CreateChannel"):"Create Group"},E?n.a.createElement(A.a,{color:"white"}):n.a.createElement("i",{className:"icon-arrow-right"})))}));a(292);const vn=Object.keys(r.d).length/2;var On=Object(n.h)(({isActive:e,isChannel:t=!1,content:a,onContentChange:s,onReset:c})=>{const[o,i]=Object(n.r)([]),d=Object(n.m)(()=>{s(t?r.d.NewChannelStep2:r.d.NewGroupStep2)},[t,s]);return n.a.createElement(T.a,{id:"NewChat",name:l.p,renderCount:vn,activeKey:a},s=>{switch(a){case r.d.NewChannelStep1:case r.d.NewGroupStep1:return n.a.createElement(gn,{isChannel:t,isActive:e,selectedMemberIds:o,onSelectedMemberIdsChange:i,onNextStep:d,onReset:c});case r.d.NewChannelStep2:case r.d.NewGroupStep2:return n.a.createElement(pn,{isChannel:t,isActive:s&&e,memberIds:o,onReset:c});default:return}})}),En=a(198);a(293);var jn=Object(n.h)(({isActive:e,onReset:t,onContentChange:a})=>{const s=Object(M.a)();return Object(L.a)(e,t,a,r.d.Archived),n.a.createElement("div",{className:"ArchivedChats"},n.a.createElement("div",{className:"left-header"},n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:t,ariaLabel:"Return to chat list"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,s("ArchivedChats"))),n.a.createElement(En.a,{folderType:"archived",isActive:e}))});const fn={Down:!0,ArrowDown:!0,Up:!0,ArrowUp:!0,Left:!0,ArrowLeft:!0,Right:!0,ArrowRight:!0," ":!0,PageUp:!0,PageDown:!0,End:!0,Home:!0,Tab:!0};const Cn=e=>{e.preventDefault()};function yn(e){fn[e.key]&&!function(e){if(!(e&&e instanceof HTMLElement))return!1;const t=e,a=t.tagName.toLowerCase();if("textarea"===a)return!0;if("input"!==a)return!1;const n=t.getAttribute("type");return!!n&&["text","password","number","email","tel","url","search","date","datetime","datetime-local","time","month","week"].indexOf(n.toLowerCase())>-1}(e.target)&&Cn(e)}function kn(){document.addEventListener("wheel",Cn,{passive:!1}),window.ontouchmove=Cn,document.onkeydown=yn}function Nn(){document.removeEventListener("wheel",Cn),window.ontouchmove=null,document.onkeydown=null}var wn=a(57),Sn=a(171);function In(e){return e?"lng_context_copy_selected":"lng_context_copy_text"}var Pn=a(182),Fn=a(55);a(294);var Mn=({isOpen:e,message:t,anchor:a,canSendNow:s,canReschedule:r,canReply:o,canEdit:l,canPin:i,canUnpin:d,canDelete:m,canReport:h,canForward:b,canFaveSticker:g,canUnfaveSticker:p,canCopy:v,canCopyLink:O,canSelect:E,onReply:j,onEdit:f,onPin:C,onUnpin:y,onForward:k,onDelete:N,onReport:w,onFaveSticker:S,onUnfaveSticker:I,onSelect:P,onSend:F,onReschedule:L,onClose:A,onCloseAnimationEnd:R,onCopyLink:T})=>{const D=function(e,t,a){const n=[],s=Object(u.P)(e),r=Object(u.H)(e)||(Object(u.T)(e)?void 0:Object(u.S)(e)),o=Object(u.E)(e,"inline"),l=r&&(o||Object(u.eb)(e))&&Sn.a,i=window.getSelection();if(l&&n.push({label:"lng_context_copy_image",handler:()=>{Promise.resolve(o?wn.b(o,c.ApiMediaFormat.BlobUrl):r.blobUrl).then(Sn.b),t&&t()}}),s){const e=Boolean(i&&i.anchorNode&&i.anchorNode.parentNode&&i.anchorNode.parentNode.closest(".Message .content-inner")&&""!==i.toString().replace(/(?:\r\n|\r|\n)/g,""));n.push({label:In(e),handler:()=>{const a=e&&i?i.toString():s;Object(Sn.c)(a),t&&t()}})}return a&&n.push({label:"lng_context_copy_message_link",handler:()=>{a(),t&&t()}}),n}(t,A,O?T:void 0),B=Object(n.m)(()=>document.querySelector(`.active > .MessageList div[data-message-id="${t.id}"]`),[t.id]),U=Object(n.m)(()=>document.querySelector(".active > .MessageList"),[]),x=Object(n.m)(()=>document.querySelector(".MessageContextMenu .bubble"),[]),{positionX:G,positionY:z,style:q}=Object(Pn.a)(a,B,U,x,10,document.querySelector(".MiddleHeader").offsetHeight),H=Object(M.a)();return n.a.createElement(Fn.a,{isOpen:e,positionX:G,positionY:z,style:q,className:"MessageContextMenu fluid",onClose:A,onCloseAnimationEnd:R},s&&n.a.createElement(_.a,{icon:"send-outline",onClick:F},H("MessageScheduleSend")),r&&n.a.createElement(_.a,{icon:"schedule",onClick:L},H("MessageScheduleEditTime")),o&&n.a.createElement(_.a,{icon:"reply",onClick:j},H("Reply")),l&&n.a.createElement(_.a,{icon:"edit",onClick:f},H("Edit")),g&&n.a.createElement(_.a,{icon:"favorite",onClick:S},H("AddToFavorites")),p&&n.a.createElement(_.a,{icon:"favorite",onClick:I},H("Stickers.RemoveFromFavorites")),v&&D.map(e=>n.a.createElement(_.a,{key:e.label,icon:"copy",onClick:e.handler},H(e.label))),i&&n.a.createElement(_.a,{icon:"pin",onClick:C},H("DialogPin")),d&&n.a.createElement(_.a,{icon:"unpin",onClick:y},H("DialogUnpin")),b&&n.a.createElement(_.a,{icon:"forward",onClick:k},H("Forward")),E&&n.a.createElement(_.a,{icon:"select",onClick:P},H("Common.Select")),h&&n.a.createElement(_.a,{icon:"flag",onClick:w},H("lng_context_report_msg")),m&&n.a.createElement(_.a,{destructive:!0,icon:"delete",onClick:N},H("Delete")))};var Ln=Object(n.h)(Object(s.h)((e,{message:t,messageListType:a})=>{const{threadId:n}=Object(m.z)(e)||{},{noOptions:s,canReply:c,canPin:r,canUnpin:o,canDelete:l,canReport:i,canEdit:d,canForward:u,canFaveSticker:h,canUnfaveSticker:b,canCopy:g,canCopyLink:p,canSelect:v}=n&&Object(m.b)(e,t,n)||{},O="pinned"===a,E="scheduled"===a;return{noOptions:s,canSendNow:E,canReschedule:E,canReply:!O&&!E&&c,canPin:!E&&r,canUnpin:!E&&o,canDelete:l,canReport:i,canEdit:!O&&d,canForward:!E&&u,canFaveSticker:!E&&h,canUnfaveSticker:!E&&b,canCopy:g,canCopyLink:!E&&p,canSelect:v}},(e,t)=>Object(h.l)(t,["setReplyingToId","setEditingId","pinMessage","openForwardMenu","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage"]))(({isOpen:e,messageListType:t,chatUsername:a,message:s,album:c,anchor:r,onClose:o,onCloseAnimationEnd:l,noOptions:i,canSendNow:d,canReschedule:m,canReply:u,canPin:h,canUnpin:b,canDelete:g,canReport:p,canEdit:v,canForward:O,canFaveSticker:E,canUnfaveSticker:j,canCopy:f,canCopyLink:C,canSelect:y,setReplyingToId:k,setEditingId:N,pinMessage:w,openForwardMenu:S,faveSticker:I,unfaveSticker:P,toggleMessageSelection:F,sendScheduledMessages:M,rescheduleMessage:L})=>{const{transitionClassNames:A}=Object(Y.a)(e,l,void 0,!1),[R,T]=Object(n.r)(!0),[D,U]=Object(n.r)(!1),[x,G]=Object(n.r)(!1),[z,q]=Object(n.r)(!1),[_,H,$]=Object(xe.a)(),V=Object(n.m)(()=>{T(!1),U(!0)},[]),W=Object(n.m)(()=>{T(!1),G(!0)},[]),K=Object(n.m)(()=>{T(!1),o()},[o]),Q=Object(n.m)(()=>{U(!1),o()},[o]),Z=Object(n.m)(()=>{G(!1),o()},[o]),J=Object(n.m)(()=>{q(!1),o()},[o]),X=Object(n.m)(()=>{$(),o()},[$,o]),ee=Object(n.m)(()=>{k({messageId:s.id}),K()},[k,s.id,K]),te=Object(n.m)(()=>{N({messageId:s.id}),K()},[N,s.id,K]),ae=Object(n.m)(()=>{T(!1),q(!0)},[]),ne=Object(n.m)(()=>{w({messageId:s.id,isUnpin:!0}),K()},[w,s.id,K]),se=Object(n.m)(()=>{if(K(),c&&c.messages){const e=c.messages.map(({id:e})=>e);S({fromChatId:s.chatId,messageIds:e})}else S({fromChatId:s.chatId,messageIds:[s.id]})},[S,s,K,c]),ce=Object(n.m)(()=>{K(),I({sticker:s.content.sticker})},[K,s.content.sticker,I]),re=Object(n.m)(()=>{K(),P({sticker:s.content.sticker})},[K,s.content.sticker,P]),oe=Object(n.m)(()=>{const e=c&&c.messages?{messageId:s.id,childMessageIds:c.messages.map(({id:e})=>e),withShift:!1}:{messageId:s.id,withShift:!1};F(e),K()},[K,s.id,F,c]),le=Object(n.m)(()=>{M({chatId:s.chatId,id:s.id}),K()},[K,s.chatId,s.id,M]),ie=Object(n.m)(()=>{T(!1),H()},[H]),de=Object(n.m)(e=>{L({chatId:s.chatId,messageId:s.id,scheduledAt:Math.round(e.getTime()/1e3)})},[s.chatId,s.id,L]),me=Object(n.m)(()=>{Object(Sn.c)(`https://t.me/${a||"c/"+Math.abs(s.chatId)}/${s.id}`),K()},[a,K,s.chatId,s.id]);Object(n.n)(()=>(kn(),Nn),[]);const ue=Object(n.p)(()=>(c?c.messages:[s]).map(({id:e})=>e),[c,s]);if(i)return void K();const he=new Date;return he.setFullYear(he.getFullYear()+1),n.a.createElement("div",{className:["ContextMenuContainer",A].join(" ")},n.a.createElement(Mn,{message:s,isOpen:R,anchor:r,canSendNow:d,canReschedule:m,canReply:u,canDelete:g,canReport:p,canPin:h,canUnpin:b,canEdit:v,canForward:O,canFaveSticker:E,canUnfaveSticker:j,canCopy:f,canCopyLink:C,canSelect:y,onReply:ee,onEdit:te,onPin:ae,onUnpin:ne,onForward:se,onDelete:V,onReport:W,onFaveSticker:ce,onUnfaveSticker:re,onSelect:oe,onSend:le,onReschedule:ie,onClose:K,onCopyLink:me}),n.a.createElement(De,{isOpen:D,isSchedule:"scheduled"===t,onClose:Q,album:c,message:s}),n.a.createElement(_e,{isOpen:x,onClose:Z,messageIds:ue}),n.a.createElement(Be,{isOpen:z,messageId:s.id,chatId:s.chatId,onClose:J}),n.a.createElement(Re,{isOpen:_,withTimePicker:!0,selectedAt:1e3*s.date,maxAt:Object(B.k)(he),isFutureMode:!0,onClose:X,onSubmit:de}))}));a(295);var An=Object(n.h)(Object(s.h)((e,{fromSticker:t})=>({stickerSet:Object(m.zb)(e,t.stickerSetId)}),(e,t)=>Object(h.l)(t,["loadStickers","toggleStickerSet","sendMessage"]))(({isOpen:e,fromSticker:t,stickerSet:a,onClose:s,loadStickers:c,toggleStickerSet:r,sendMessage:l})=>{const i=Object(n.q)(null),d=Object(M.a)(),{observe:m}=Object(ta.a)({rootRef:i,throttleMs:200,isDisabled:!e});Object(n.n)(()=>{if(e){const{stickerSetId:e,stickerSetAccessHash:a}=t;c({stickerSetId:e,stickerSetAccessHash:a})}},[e,t,c]);const u=Object(n.m)(e=>{e={...e,isPreloadedGlobally:!0},l({sticker:e}),s()},[s,l]),h=Object(n.m)(()=>{r({stickerSetId:t.stickerSetId}),s()},[t.stickerSetId,s,r]);return n.a.createElement(pe.a,{className:"StickerSetModal",isOpen:e,onClose:s,hasCloseButton:!0,title:a?Object(U.a)(a.title,["emoji","links"]):d("AccDescrStickerSet")},a&&a.stickers?n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{ref:i,className:"stickers custom-scroll"},a.stickers.map(e=>n.a.createElement(oa.a,{sticker:e,size:o.Kb,observeIntersection:m,onClick:u,clickArg:e}))),n.a.createElement("div",{className:"button-wrapper"},n.a.createElement(D.a,{size:"smaller",fluid:!0,color:a.installedDate?"danger":"primary",onClick:h},d(a.installedDate?"StickerPack.RemoveStickerCount":"StickerPack.AddStickerCount",a.count,"i")))):n.a.createElement(ge.a,null))})),Rn=a(128);a(296);var Tn=Object(n.h)(Object(s.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t);return!a||a.isRestricted?{}:{chat:a,isMuted:Object(u.Hb)(a,Object(m.fb)(e),Object(m.eb)(e)),isPrivate:Object(u.ob)(a.id),canDeleteChat:Object(u.c)(a)}},(e,t)=>Object(h.l)(t,["updateChatMutedState","enterMessageSelectMode","sendBotCommand","restartBot"]))(({chatId:e,isOpen:t,anchor:a,isChannel:s,canStartBot:c,canRestartBot:r,canSubscribe:o,canSearch:i,canMute:d,canSelect:m,canLeave:u,chat:h,isPrivate:b,isMuted:g,canDeleteChat:p,onSubscribeChannel:v,onSearchClick:O,onClose:E,onCloseAnimationEnd:j,updateChatMutedState:f,enterMessageSelectMode:C,sendBotCommand:y,restartBot:k})=>{const[N,w]=Object(n.r)(!0),[S,I]=Object(n.r)(!1),{x:P,y:F}=a;Object(Y.a)(t,j,void 0,!1);const L=Object(n.m)(()=>{w(!1),I(!0)},[]),A=Object(n.m)(()=>{w(!1),E()},[E]),R=Object(n.m)(()=>{I(!1),E()},[E]),T=Object(n.m)(()=>{y({command:"/start"})},[y]),D=Object(n.m)(()=>{k({chatId:e})},[e,k]),B=Object(n.m)(()=>{f({chatId:e,isMuted:!g}),A()},[e,A,g,f]),U=Object(n.m)(()=>{v(),A()},[A,v]),x=Object(n.m)(()=>{O(),A()},[A,O]),G=Object(n.m)(()=>{C(),A()},[A,C]);Object(n.n)(()=>(kn(),Nn),[]);const z=Object(M.a)();return n.a.createElement(Rn.a,null,n.a.createElement("div",{className:"HeaderMenuContainer"},n.a.createElement(Fn.a,{isOpen:N,positionX:"right",style:`left: ${P}px;top: ${F}px;`,onClose:A},l.l&&c&&n.a.createElement(_.a,{icon:"bots",onClick:T},z("BotStart")),l.l&&r&&n.a.createElement(_.a,{icon:"bots",onClick:D},z("BotRestart")),l.l&&o&&n.a.createElement(_.a,{icon:s?"channel":"group",onClick:U},z(s?"Subscribe":"Join Group")),l.l&&i&&n.a.createElement(_.a,{icon:"search",onClick:x},z("Search")),d&&n.a.createElement(_.a,{icon:g?"unmute":"mute",onClick:B},z(g?"ChatsUnmute":"ChatsMute")),m&&n.a.createElement(_.a,{icon:"select",onClick:G},z("ReportSelectMessages")),u&&n.a.createElement(_.a,{destructive:!0,icon:"delete",onClick:L},z(b?"Delete":p?"GroupInfo.DeleteAndExit":s?"LeaveChannel":"Group.LeaveGroup"))),h&&n.a.createElement(Ye.a,{isOpen:S,onClose:R,chat:h})))})),Dn=a(159);a(297);const Bn=Object(V.a)(e=>e(),200,!1);var Un=Object(n.h)(Object(s.h)(e=>{const t=Object(m.s)(e);if(!t)return{};const{query:a,results:n}=Object(m.B)(e)||{},{totalCount:s,foundIds:c}=n||{};return{chat:t,query:a,totalCount:s,foundIds:c,isHistoryCalendarOpen:Boolean(e.historyCalendarSelectedAt)}},(e,t)=>Object(h.l)(t,["setLocalTextSearchQuery","searchTextMessagesLocal","focusMessage","closeLocalTextSearch","openHistoryCalendar"]))(({isActive:e,chat:t,query:a,totalCount:s,foundIds:c,isHistoryCalendarOpen:r,setLocalTextSearchQuery:o,searchTextMessagesLocal:l,focusMessage:i,closeLocalTextSearch:d,openHistoryCalendar:m})=>{const u=Object(n.q)(null),[h,b]=Object(n.r)(0);Object(n.n)(()=>{const{visualViewport:e}=window;if(!e)return;const t=document.getElementById("Main"),a=()=>{const{activeElement:a}=document;if(a&&a===u.current){const{pageTop:a,height:n}=e;t.style.transform=`translateY(${a}px)`,t.style.height=n+"px",document.documentElement.scrollTop=a}else t.style.transform="",t.style.height=""};return e.addEventListener("resize",a),()=>{e.removeEventListener("resize",a)}},[]),Object(n.n)(()=>{t&&c&&c.length?(i({chatId:t.id,messageId:c[c.length-1]}),b(0)):b(-1)},[t,i,c]),Object(n.n)(()=>{Array.from(document.querySelectorAll("input")).forEach(t=>{t.disabled=Boolean(e&&t!==u.current)}),Array.from(document.querySelectorAll("div[contenteditable]")).forEach(t=>{t.contentEditable=e?"false":"true"})},[e]),Object(n.n)(()=>{e||u.current.blur()},[e]),Object(n.o)(()=>{document.querySelector("#MobileSearch input").blur()},[r]);const g=Object(n.m)(e=>{o({query:e}),e.length&&Bn(l)},[l,o]),p=Object(n.m)(()=>{if(t&&c){const e=h+1;i({chatId:t.id,messageId:c[c.length-1-e]}),b(e)}},[t,h,i,c]),v=Object(n.m)(()=>{if(t&&c){const e=h-1;i({chatId:t.id,messageId:c[c.length-1-e]}),b(e)}},[t,h,i,c]);return n.a.createElement("div",{id:"MobileSearch",className:e?"active":""},n.a.createElement("div",{className:"header"},n.a.createElement(D.a,{size:"smaller",round:!0,color:"translucent",onClick:d},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement(Dn.a,{ref:u,value:a,onChange:g})),n.a.createElement("div",{className:"footer"},n.a.createElement("div",{className:"counter"},a?c&&c.length?`${h+1} of ${s}`:c&&!c.length?"No results":"":n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:()=>m({selectedAt:Object(B.k)(Date.now())}),ariaLabel:"Search messages by date"},n.a.createElement("i",{className:"icon-calendar"}))),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:p,disabled:!c||!c.length||h===c.length-1},n.a.createElement("i",{className:"icon-up"})),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:v,disabled:!c||!c.length||0===h},n.a.createElement("i",{className:"icon-down"}))))})),xn=a(60),Gn=a(199),zn=a(191),qn=a(187),_n=a(193);function Hn(e,t,a=0,n=!1,s=!1,c=!1){const r=e[c?"scrollLeft":"scrollTop"],o=r+e[c?"offsetWidth":"offsetHeight"],l="string"==typeof t?e.querySelectorAll(t):t,{length:i}=l,d=[];let m=!1;for(let e=0;e=r-a&&u<=o+a:i<=o+a&&u>=r-a)d.push(e),m=!0;else if(m&&!n)break}return{allElements:l,visibleIndexes:d}}var $n=function(e,t,a=!1){const n=e[a?"scrollLeft":"scrollTop"],s=n+e[a?"offsetWidth":"offsetHeight"],c=t[a?"offsetLeft":"offsetTop"],r=c+t[a?"offsetWidth":"offsetHeight"];return c>n&&rs[s.length-1]?"start":"end";Object(Vn.a)(n,c[t],e,10)}}var Kn=a(134);a(298);var Yn=Object(n.h)(({isOpen:e,filter:t,onClose:a,onInsertUserName:s,usersById:c,filteredUsers:r})=>{const o=Object(n.q)(null),{shouldRender:l,transitionClassNames:i}=Object(Y.a)(e,void 0,void 0,!1),d=Object(n.m)(e=>{if(!r)return-1;const t=r.length;return Object(Kn.a)(t,e)},[r]),[m,u]=Object(n.r)(-1),h=Object(n.m)((e,t)=>{t.preventDefault(),u(t=>d(t+e))},[u,d]),b=Object(n.m)((e,t=!1)=>{const a=c&&c[e];a&&s(a,t)},[c,s]),g=Object(n.m)(e=>{if(r&&r.length&&m>-1){const t=r[m];t&&(e.preventDefault(),b(t.id,!0))}},[r,m,b]);Object(n.n)(()=>e?Object(Ge.a)({onEsc:a,onUp:e=>h(-1,e),onDown:e=>h(1,e),onEnter:g,onTab:g}):void 0,[e,a,h,g]),Object(n.n)(()=>{r&&!r.length&&a()},[r,a]),Object(n.n)(()=>{u(0)},[t]),Object(n.n)(()=>{Wn(".chat-item-clickable",m,o)},[m]);const p=Object(f.a)(r&&r.length?r:void 0,l),v=r&&!r.length?p:r;if(!l||v&&!v.length)return;const O=Object(W.a)("MentionTooltip composer-tooltip custom-scroll",i);return n.a.createElement("div",{className:O,ref:o},v&&v.map(({id:e},t)=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable scroll-item",onClick:()=>b(e),focus:m===t},n.a.createElement(je.a,{userId:e,avatarSize:"small",withUsername:!0}))))}),Qn=a(192);a(299);var Zn=Object(n.h)(({attachments:e,caption:t,isReady:a,currentUserId:s,groupChatMembers:c,usersById:r,recentEmojis:l,baseEmojiKeywords:i,emojiKeywords:d,addRecentEmoji:m,onCaptionUpdate:u,onSend:h,onFileAppend:b,onClear:p})=>{const v=Object(n.q)(null),O=Object(f.a)(e),E=e.length?e:O,j=Boolean(e.length),[C,y,k]=Object(xe.a)(),N=Boolean(E&&E.every(e=>e.quick)),w=Object(M.a)(),{isMentionTooltipOpen:S,mentionFilter:I,closeMentionTooltip:P,insertMention:F,mentionFilteredUsers:L}=Object(Gn.a)(j,t,u,o.A,c,void 0,s,r),{isEmojiTooltipOpen:A,closeEmojiTooltip:R,filteredEmojis:T,insertEmoji:B}=Object(zn.a)(j,t,l,o.A,u,i,d,!a);Object(n.n)(()=>j?Object(g.a)(p):void 0,[j,p]);const U=Object(n.m)(()=>{j&&h()},[j,h]),x=Object(n.m)(e=>{e.preventDefault(),k();const{dataTransfer:{files:t}}=e;if(t&&t.length){const e=N?Array.from(t).filter(e=>e.type&&o.n.has(e.type)):Array.from(t);b(e,N)}},[N,b,k]);if(!E)return;const G=E.every(e=>e.mimeType.startsWith("image/")),z=E.every(e=>e.mimeType.startsWith("video/"));let q="";return q=w(G?"PreviewSender.SendPhoto":z?"PreviewSender.SendVideo":"PreviewSender.SendFile",E.length,"i"),n.a.createElement(pe.a,{isOpen:j,onClose:p,header:function(){if(E)return n.a.createElement("div",{className:"modal-header-condensed",dir:w.isRtl?"rtl":void 0},n.a.createElement(D.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel attachments",onClick:p},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("div",{className:"modal-title"},q),n.a.createElement(D.a,{color:"primary",size:"smaller",className:"modal-action-button",onClick:U},w("Send")))}(),className:"AttachmentModal "+(C?"hovered":"")},n.a.createElement("div",{className:"drop-target",onDragEnter:y,onDrop:x,onDragOver:function(e){e.preventDefault(),e.stopPropagation(),v.current&&window.clearTimeout(v.current)},onDragLeave:e=>{const{relatedTarget:t,target:a}=e;a.matches(".drop-target")&&!t&&(v.current=window.setTimeout(k,150)),a&&a.closest(".AttachmentModal.hovered")||(t&&e.stopPropagation(),k())},"data-attach-description":w("Preview.Dragging.AddItems",10)},N?n.a.createElement("div",{className:"media-wrapper custom-scroll"},E.map(e=>e.mimeType.startsWith("image/")?n.a.createElement("img",{src:e.blobUrl,alt:""}):n.a.createElement("video",{src:e.blobUrl,autoPlay:!0,muted:!0,loop:!0}))):n.a.createElement("div",{className:"document-wrapper custom-scroll"},E.map(e=>n.a.createElement(qn.a,{name:e.filename,extension:Object(xn.d)(e.filename,e.mimeType),previewData:e.previewBlobUrl,size:e.size,smaller:!0}))),n.a.createElement("div",{className:"attachment-caption-wrapper"},n.a.createElement(Yn,{isOpen:S,onClose:P,filter:I,onInsertUserName:F,filteredUsers:L,usersById:r}),n.a.createElement(Qn.a,{isOpen:A,emojis:T,onClose:R,onEmojiSelect:B,addRecentEmoji:m}),n.a.createElement(_n.a,{id:"caption-input-text",isAttachmentModalInput:!0,html:t,editableInputId:o.A,placeholder:w("Caption"),onUpdate:u,onSend:h,shouldSetFocus:j}))))}),Jn=a(142);a(300);var Xn=Object(n.h)(({isOpen:e,onSend:t,onClear:a})=>{const s=Object(n.q)(null),c=Object(n.q)(null),r=Object(n.q)(null),[o,l]=Object(n.r)(""),[i,d]=Object(n.r)([""]),[m,u]=Object(n.r)(!0),[h,b]=Object(n.r)(!1),[p,v]=Object(n.r)(!1),[O,E]=Object(n.r)(),[j,f]=Object(n.r)(),[C,y]=Object(n.r)(!1),k=Object(M.a)(),N=Object(n.m)(t=>{e&&t.current&&t.current.focus()},[e]);Object(n.n)(()=>e?Object(g.a)(a):void 0,[e,a]),Object(n.n)(()=>{e||(l(""),d([""]),u(!0),b(!1),v(!1),E(""),f(""),y(!1))},[e]),Object(n.n)(()=>N(s),[N,e]),Object(n.o)(()=>{const e=r.current;e&&O!==e.innerHTML&&(e.innerHTML=O)},[O]);const w=Object(n.m)((e=[])=>{d([...e,""]),requestAnimationFrame(()=>{const e=c.current;e&&(e.classList.toggle("overflown",e.scrollHeight>320),e.scrollTo({top:e.scrollHeight,behavior:"smooth"}))})},[]),S=Object(n.m)(()=>{if(y(!1),!e)return;const a=o.trim().substring(0,255),n=i.map(e=>e.trim().substring(0,100)).filter(e=>e.length);if(!a||n.length<2)return l(a),n.length?n.length<2?w(n):d(n):w(),void y(!0);if(p&&(!j||!n[Number(j)]))return void y(!0);const s={summary:{question:a,answers:n.map((e,t)=>({text:e.trim(),option:String(t),...String(t)===j&&{correct:!0}})),...!m&&{isPublic:!0},...h&&{multipleChoice:!0},...p&&{quiz:!0}}};if(p){const{text:e,entities:t}=O&&Object(Jn.a)(O.substring(0,200))||{};s.quiz={correctAnswers:[j],...e&&{solution:e},...t&&{solutionEntities:t}}}t(s)},[e,o,i,p,j,m,h,t,w,O]),I=Object(n.m)((e,t)=>{const a=[...i];a[e]=t,a[a.length-1].trim().length&&a.length<10?w(a):d(a)},[i,w]),P=Object(n.m)(e=>{const t=[...i];t.splice(e,1),d(t),requestAnimationFrame(()=>{c.current&&c.current.classList.toggle("overflown",c.current.scrollHeight>320)})},[i]),F=Object(n.m)(e=>{f(e)},[f]),L=Object(n.m)(e=>{u(e.target.checked)},[]),A=Object(n.m)(e=>{b(e.target.checked)},[]),R=Object(n.m)(e=>{v(e.target.checked)},[]),T=Object(n.m)(e=>{13===e.keyCode&&S()},[S]),B=Object(n.m)(()=>{if(C&&!o.trim().length)return k("lng_polls_choose_question")},[C,k,o]),U=Object(n.m)(e=>{const t=i.map(e=>e.trim()).filter(e=>e.length);if(C&&t.length<2&&!i[e].trim().length)return k("lng_polls_choose_answers")},[C,k,i]);function x(){return i.map((e,t)=>n.a.createElement("div",{className:"option-wrapper"},n.a.createElement(ve.a,{label:t!==i.length-1||10===i.length?k("OptionHint"):k("CreatePoll.AddOption"),error:U(t),value:e,onChange:e=>I(t,e.currentTarget.value),onKeyPress:T}),t!==i.length-1&&n.a.createElement(D.a,{className:"option-remove-button",round:!0,color:"translucent",size:"smaller",ariaLabel:k("Delete"),onClick:()=>P(t)},n.a.createElement("i",{className:"icon-close"}))))}return n.a.createElement(pe.a,{isOpen:e,onClose:a,header:n.a.createElement("div",{className:"modal-header-condensed"},n.a.createElement(D.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel poll creation",onClick:a},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("div",{className:"modal-title"},k("NewPoll")),n.a.createElement(D.a,{color:"primary",size:"smaller",className:"modal-action-button",onClick:S},k("Create"))),className:"PollModal"},n.a.createElement(ve.a,{ref:s,label:k("AskAQuestion"),value:o,error:B(),onChange:e=>l(e.currentTarget.value),onKeyPress:T}),n.a.createElement("div",{className:"options-divider"}),n.a.createElement("div",{className:"options-list custom-scroll",ref:c},n.a.createElement("h3",{className:"options-header"},k("PollOptions")),C&&function(){const e=i.map(e=>e.trim()).filter(e=>e.length);return p&&(!j||!e[Number(j)])&&n.a.createElement("p",{className:"error"},k("lng_polls_choose_correct"))}(),p?n.a.createElement(qe.a,{name:"correctOption",options:x().map((e,t)=>({value:String(t),label:e,hidden:t===i.length-1})),onChange:F}):x()),n.a.createElement("div",{className:"options-divider"}),n.a.createElement("div",{className:"quiz-mode"},n.a.createElement(Zt.a,{label:k("PollAnonymous"),checked:m,onChange:L}),n.a.createElement(Zt.a,{label:k("PollMultiple"),checked:h,disabled:p,onChange:A}),n.a.createElement(Zt.a,{label:k("PollQuiz"),checked:p,disabled:h,onChange:R}),p&&n.a.createElement(n.a.Fragment,null,n.a.createElement("h3",{className:"options-header"},k("lng_polls_solution_title")),n.a.createElement("div",{ref:r,className:"form-control",contentEditable:!0,dir:"auto",onChange:e=>E(e.currentTarget.innerHTML)}),n.a.createElement("div",{className:"note"},k("CreatePoll.ExplanationInfo")))))});let es;function ts(e,t,a=250,s=!1){const c=Object(n.q)(!1);Object(n.n)(()=>{es&&(clearTimeout(es),es=void 0),!e||l.n||s||(es=window.setTimeout(()=>{c.current||t()},2*a))},[s,e,a,t]);return[Object(n.m)(()=>{c.current=!0},[]),Object(n.m)(()=>{c.current=!1,es&&(clearTimeout(es),es=void 0),es=window.setTimeout(()=>{c.current||t()},a)},[a,t])]}var as=a(66),ns=a(147);a(301);var ss=Object(n.h)(({emoji:e,focus:t,onClick:a})=>{const s=Object(n.m)(t=>{t.preventDefault(),a(e.native,e.id)},[e,a]);return n.a.createElement("div",{className:"EmojiButton "+(t?"focus":""),onMouseDown:s,title:`:${e.names[0]}:`},l.d?e.native:n.a.createElement("img",{src:`./img-apple-64/${e.image}.png`,alt:"",loading:"lazy"}))});var cs=Object(n.h)(({category:e,index:t,allEmojis:a,observeIntersection:s,shouldRender:c,onEmojiSelect:r})=>{const o=Object(n.q)(null);Object(ta.c)(o,s);const{transitionClassNames:d}=Object(Y.a)(c,void 0,void 0,"slow"),m=Object(M.a)(),u=l.l?Math.floor((i.a.get().width-8)/44):9,h=44*Math.ceil(e.emojis.length/u);return n.a.createElement("div",{ref:o,key:e.id,id:"emoji-category-"+t,className:"symbol-set"},n.a.createElement("p",{className:"symbol-set-name",dir:"auto"},m("recent"===e.id?"RecentStickers":"Emoji"+t)),n.a.createElement("div",{className:Object(W.a)("symbol-set-container",d),style:`height: ${h}px;`,dir:m.isRtl?"rtl":void 0},c&&e.emojis.map(e=>{const t=a[e],s="id"in t?t:t[1];return n.a.createElement(ss,{key:s.id,emoji:s,onClick:r})})))});a(302);const rs={recent:"icon-recent",people:"icon-smile",nature:"icon-animals",foods:"icon-eats",activity:"icon-sport",places:"icon-car",objects:"icon-lamp",symbols:"icon-language",flags:"icon-flag"},os=[];let ls,is,ds;var ms=Object(n.h)(Object(s.h)(e=>Object(h.l)(e,["recentEmojis"]))(({className:e,onEmojiSelect:t,recentEmojis:s})=>{const c=Object(n.q)(null),r=Object(n.q)(null),[i,d]=Object(n.r)(),[m,u]=Object(n.r)(),[h,b]=Object(n.r)(0),{observe:g}=Object(ta.a)({rootRef:c,throttleMs:200},e=>{e.forEach(e=>{const{id:t}=e.target;if(!t||!t.startsWith("emoji-category-"))return;const a=Number(t.replace("emoji-category-",""));os[a]=e.isIntersecting});const t=os.map((e,t)=>({index:t,isIntersecting:e})).filter(({isIntersecting:e})=>e);t.length&&b(t[Math.floor(t.length/2)].index)});Object(Ze.a)(r.current,!l.l),Object(n.n)(()=>{if(!i)return;const e=r.current;if(!e)return;const t=42*h-e.offsetWidth/2+21;Object(ns.a)(e,t)},[i,h]);const p=Object(M.a)(),v=Object(n.p)(()=>{if(!i)return Ve.a;const e=[...i];return s&&s.length&&e.unshift({id:"recent",name:p("RecentStickers"),emojis:s}),e},[i,p,s]);Object(n.n)(()=>{setTimeout(()=>{const e=()=>{d(ds.categories),u(ds.emojis)};ds?e():async function(){ls||(ls=a.e(1).then(a.t.bind(null,331,3)),is=(await ls).default,ds=Object(as.b)(is));return ls}().then(e)},200)},[]);const O=Object(n.m)(e=>{b(e);const t=document.getElementById("emoji-category-"+e);Object(Vn.a)(c.current,t,"start",50,800)},[]),E=Object(n.m)((e,a)=>{t(e,a)},[t]),j=Object(mt.a)([],o.eb);const f=Object(W.a)("EmojiPicker",e);return m&&j?n.a.createElement("div",{className:f},n.a.createElement("div",{ref:r,className:"EmojiPicker-header",dir:p.isRtl?"rtl":""},v.map((function(e,t){const a=rs[e.id];return a&&n.a.createElement(D.a,{className:"symbol-set-button "+(t===h?"activated":""),round:!0,faded:!0,color:"translucent",onClick:()=>O(t),ariaLabel:e.name},n.a.createElement("i",{className:a}))}))),n.a.createElement("div",{ref:c,className:Object(W.a)("EmojiPicker-main no-selection",l.n?"no-scrollbar":"custom-scroll")},v.map((e,t)=>n.a.createElement(cs,{category:e,index:t,allEmojis:m,observeIntersection:g,shouldRender:h>=t-1&&h<=t+1,onEmojiSelect:E})))):n.a.createElement("div",{className:f},n.a.createElement(ge.a,null))}));const us=l.l?8:16;var hs=Object(n.h)(({stickerSet:e,loadAndPlay:t,index:a,observeIntersection:s,shouldRender:c,onStickerSelect:r,onStickerUnfave:d})=>{const m=Object(n.q)(null);Object(ta.c)(m,s);const{transitionClassNames:u}=Object(Y.a)(c,void 0,void 0,"slow"),h=l.l?Math.floor((i.a.get().width-8)/(o.Lb+us)):5,b=Math.ceil(e.count/h)*(o.Lb+us);return n.a.createElement("div",{ref:m,key:e.id,id:"sticker-set-"+a,className:"symbol-set"},n.a.createElement("p",{className:"symbol-set-name"},e.title),n.a.createElement("div",{className:Object(W.a)("symbol-set-container",u),style:`height: ${b}px;`},c&&e.stickers&&e.stickers.map(a=>n.a.createElement(oa.a,{key:a.id,sticker:a,size:o.Lb,observeIntersection:s,noAnimate:!t,onClick:r,clickArg:a,onUnfaveClick:"favorite"===e.id?d:void 0}))))});a(303);const bs=[];var gs=Object(n.h)(Object(s.h)(e=>{const{setsById:t,added:a,recent:n,favorite:s}=e.stickers;return{recentStickers:n.stickers,favoriteStickers:s.stickers,stickerSetsById:t,addedSetIds:a.setIds,shouldPlay:e.settings.byKey.shouldLoopStickers}},(e,t)=>Object(h.l)(t,["loadStickerSets","loadRecentStickers","loadFavoriteStickers","loadAddedStickers","addRecentSticker","unfaveSticker"]))(({className:e,loadAndPlay:t,canSendStickers:a,recentStickers:s,favoriteStickers:c,addedSetIds:r,stickerSetsById:i,shouldPlay:d,onStickerSelect:m,loadStickerSets:u,loadRecentStickers:h,loadFavoriteStickers:b,loadAddedStickers:g,addRecentSticker:p,unfaveSticker:v})=>{const O=Object(n.q)(null),E=Object(n.q)(null),[j,f]=Object(n.r)(0),{observe:C}=Object(ta.a)({rootRef:O,throttleMs:200},e=>{e.forEach(e=>{const{id:t}=e.target;if(!t||!t.startsWith("sticker-set-"))return;const a=Number(t.replace("sticker-set-",""));bs[a]=e.isIntersecting});const t=bs.map((e,t)=>({index:t,isIntersecting:e})).filter(({isIntersecting:e})=>e);t.length&&f(t[Math.floor(t.length/2)].index)}),{observe:y}=Object(ta.a)({rootRef:E}),k=Object(M.a)(),N=Boolean(r),w=Object(n.p)(()=>r?[{id:"recent",title:k("RecentStickers"),stickers:s,count:s.length},{id:"favorite",title:k("FavoriteStickers"),stickers:c,count:c.length},...r.map(e=>i[e]).filter(Boolean)]:Ve.a,[r,k,s,c,i]),S=Object(n.p)(()=>N&&0===w.filter(e=>e.stickers&&e.stickers.length).length,[w,N]);Object(n.n)(()=>{t&&(u(),h(),b())},[t,b,h,u]),Object(n.n)(()=>{r&&r.length&&g()},[r,g]),Object(Ze.a)(E.current),Object(n.n)(()=>{if(!N)return;const e=E.current;if(!e)return;const t=52*j-(e.offsetWidth/2-26);Object(ns.a)(e,t)},[N,j]);const I=Object(n.m)(e=>{f(e);const t=document.getElementById("sticker-set-"+e);Object(Vn.a)(O.current,t,"start",void 0,500)},[]),P=Object(n.m)(e=>{m(e),p({sticker:e})},[p,m]),F=Object(n.m)(e=>{v({sticker:e})},[v]),L=Object(mt.a)([],o.Bb);const A=Object(W.a)("StickerPicker",e);return N&&L&&!S&&a?n.a.createElement("div",{className:A},n.a.createElement("div",{ref:E,className:"StickerPicker-header no-selection no-scrollbar"},w.map((function(e,t){const a=e.stickers&&e.stickers[0],s=Object(W.a)("symbol-set-button sticker-set-button",t===j&&"activated");return"recent"===e.id||"favorite"===e.id||e.hasThumbnail||!a?n.a.createElement(D.a,{key:e.id,className:s,ariaLabel:e.title,round:!0,faded:"recent"===e.id||"favorite"===e.id,color:"translucent",onClick:()=>I(t)},"recent"===e.id?n.a.createElement("i",{className:"icon-recent"}):"favorite"===e.id?n.a.createElement("i",{className:"icon-favorite"}):e.isAnimated?n.a.createElement(ca,{stickerSet:e,observeIntersection:y}):n.a.createElement(ra,{stickerSet:e,observeIntersection:y})):n.a.createElement(oa.a,{key:e.id,sticker:a,size:o.Mb,title:e.title,className:s,observeIntersection:y,onClick:I,clickArg:t})}))),n.a.createElement("div",{ref:O,className:Object(W.a)("StickerPicker-main no-selection",l.n?"no-scrollbar":"custom-scroll")},w.map((e,a)=>n.a.createElement(hs,{key:e.id,stickerSet:e,loadAndPlay:Boolean(d&&t),index:a,observeIntersection:C,shouldRender:j>=a-1&&j<=a+1,onStickerSelect:P,onStickerUnfave:F})))):n.a.createElement("div",{className:A},a?S?n.a.createElement("div",{className:"picker-disabled"},"You have no saved Stickers."):n.a.createElement(ge.a,null):n.a.createElement("div",{className:"picker-disabled"},"Sending stickers is not allowed in this chat."))}));a(304);function ps(){return(ps=Object.assign||function(e){for(var t=1;t{const o=Object(n.q)(null),l=Object(n.q)(null),i=e.thumbnail&&!!e.thumbnail.dataUri,d="gif"+e.id,m=Object(ta.b)(o,t)&&!a,u=Object(O.a)(d+"?size=m",!m,c.ApiMediaFormat.BlobUrl),h=Object(fa.a)(e.thumbnail&&e.thumbnail.dataUri,Boolean(u)),b=Object(O.a)(d,!m,c.ApiMediaFormat.BlobUrl),g=Boolean(m&&b),{transitionClassNames:p}=Object(na.a)(i||u||b,"slow"),{isBuffered:v,bufferingHandlers:E}=Object(Q.a)(!0),j=m&&!v;Object(J.a)(l,[g]);const f=Object(n.m)(()=>r({...e,blobUrl:b}),[r,e,b]),C=Object(W.a)("GifButton",e.width&&e.height&&e.width({savedGifs:e.gifs.saved.gifs}),(e,t)=>Object(h.l)(t,["loadSavedGifs"]))(({className:e,loadAndPlay:t,canSendGifs:a,savedGifs:s,onGifSelect:c,loadSavedGifs:r})=>{const i=Object(n.q)(null),{observe:d}=Object(ta.a)({rootRef:i,debounceMs:300});Object(n.n)(()=>{t&&r()},[t,r]);const m=Object(mt.a)([],o.Bb);return n.a.createElement("div",{ref:i,className:Object(W.a)("GifPicker",e,l.n?"no-scrollbar":"custom-scroll")},a?m&&s&&s.length?s.map(e=>n.a.createElement(vs,{key:e.id,gif:e,observeIntersection:d,isDisabled:!t,onClick:c})):m&&s?n.a.createElement("div",{className:"picker-disabled"},"No saved GIFs."):n.a.createElement(ge.a,null):n.a.createElement("div",{className:"picker-disabled"},"Sending GIFs is not allowed in this chat."))}));let Es;!function(e){e[e.Emoji=0]="Emoji",e[e.Stickers=1]="Stickers",e[e.GIFs=2]="GIFs"}(Es||(Es={}));const js=Object.values(Es).filter(e=>"string"==typeof e),fs={[Es.Emoji]:"icon-smile",[Es.Stickers]:"icon-stickers",[Es.GIFs]:"icon-gifs"};var Cs=Object(n.h)(({activeTab:e,onSwitchTab:t,onRemoveSymbol:a,onSearchOpen:s})=>{const c=Object(M.a)();function r(a){return n.a.createElement(D.a,{className:"symbol-tab-button "+(e===a?"activated":""),onClick:()=>t(a),ariaLabel:js[a],round:!0,faded:!0,color:"translucent"},n.a.createElement("i",{className:fs[a]}))}const o=Object(n.m)(()=>{s(e===Es.Stickers?"stickers":"gifs")},[e,s]);return n.a.createElement("div",{className:"SymbolMenu-footer",onClick:function(e){e.stopPropagation()},dir:c.isRtl?"rtl":void 0},e!==Es.Emoji&&n.a.createElement(D.a,{className:"symbol-search-button",ariaLabel:e===Es.Stickers?"Search Stickers":"Search GIFs",round:!0,faded:!0,color:"translucent",onClick:o},n.a.createElement("i",{className:"icon-search"})),r(Es.Emoji),r(Es.Stickers),r(Es.GIFs),e===Es.Emoji&&n.a.createElement(D.a,{className:"symbol-delete-button",onClick:a,ariaLabel:"Remove Symbol",round:!0,faded:!0,color:"translucent"},n.a.createElement("i",{className:"icon-delete-left"})))});a(306);let ys=!1;var ks=Object(n.h)(Object(s.h)(e=>({isLeftColumnShown:e.isLeftColumnShown}))(({isOpen:e,allowedAttachmentOptions:t,isLeftColumnShown:a,onLoad:s,onClose:c,onEmojiSelect:r,onStickerSelect:o,onGifSelect:i,onRemoveSymbol:d,onSearchOpen:m,addRecentEmoji:u})=>{const[h,b]=Object(n.r)(0),[g,p]=Object(n.r)([]),[v,O]=ts(e,c,void 0,l.l),{shouldRender:E,transitionClassNames:j}=Object(Y.a)(e,c,!1,!1);!ys&&e&&(ys=!0),Object(n.n)(()=>{s()},[s]),Object(n.o)(()=>{if(l.l)return e&&(document.body.classList.add("enable-symbol-menu-transforms"),document.body.classList.add("is-symbol-menu-open")),()=>{e&&Object(V.b)(()=>{document.body.classList.remove("is-symbol-menu-open"),setTimeout(()=>{document.body.classList.remove("enable-symbol-menu-transforms")},350)})}},[e]);const f=Object(n.q)(g);f.current=g,Object(n.n)(()=>{f.current.length&&(f.current.forEach(e=>{u({emoji:e})}),p([]))},[e,h,u]);const C=Object(n.m)((e,t)=>{p(e=>[...e,t]),r(e)},[r]),y=Object(n.m)(e=>{c(),m(e)},[c,m]),k=Object(n.m)(e=>{o(e,!0)},[o]),N=Object(M.a)(),{canSendStickers:w,canSendGifs:S}=t;function I(t,a){switch(h){case Es.Emoji:return n.a.createElement(ms,{className:"picker-tab",onEmojiSelect:C});case Es.Stickers:return n.a.createElement(gs,{className:"picker-tab",loadAndPlay:!!w&&(e&&(t||a)),canSendStickers:w,onStickerSelect:k});case Es.GIFs:return n.a.createElement(Os,{className:"picker-tab",loadAndPlay:!!S&&(e&&(t||a)),canSendGifs:S,onGifSelect:i})}}const P=n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:"SymbolMenu-main",onClick:function(e){e.stopPropagation()}},ys&&n.a.createElement(T.a,{name:"slide",activeKey:h,renderCount:js.length},I)),l.l&&n.a.createElement(D.a,{round:!0,faded:!0,color:"translucent",ariaLabel:N("Close"),className:"symbol-close-button",size:"tiny",onClick:c},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(Cs,{activeTab:h,onSwitchTab:b,onRemoveSymbol:d,onSearchOpen:y}));if(l.l){if(!E)return;const e=Object(W.a)("SymbolMenu mobile-menu",j,!a&&"middle-column-open");return n.a.createElement(Rn.a,null,n.a.createElement("div",{className:e},P))}return n.a.createElement(Fn.a,{isOpen:e,positionX:"left",positionY:"bottom",onClose:c,className:"SymbolMenu",onCloseAnimationEnd:c,onMouseEnter:l.n?void 0:v,onMouseLeave:l.n?void 0:O,noCloseOnBackdrop:!l.n},P)}));a(307);var Ns=Object(n.h)(({isOpen:e,allowedAttachmentOptions:t,onFileSelect:a,onPollCreate:s,onClose:c})=>{const[r,i]=ts(e,c),d=Object(n.m)((e,t)=>{const{files:n}=e.target;n&&n.length>0&&a(Array.from(n),t)},[a]),m=Object(n.m)(()=>{ha(Array.from(o.n).join(","),e=>d(e,!0))},[d]),u=Object(n.m)(()=>{ha("*",e=>d(e,!1))},[d]),h=Object(M.a)(),{canAttachMedia:b,canAttachPolls:g}=t;return n.a.createElement(Fn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:c,className:"AttachMenu fluid",onCloseAnimationEnd:c,onMouseEnter:l.n?void 0:r,onMouseLeave:l.n?void 0:i,noCloseOnBackdrop:!l.n},!b&&n.a.createElement(_.a,{className:"media-disabled",disabled:!0},"Posting media content is not allowed in this group."),b&&n.a.createElement(n.a.Fragment,null,n.a.createElement(_.a,{icon:"photo",onClick:m},h("AttachmentMenu.PhotoOrVideo")),n.a.createElement(_.a,{icon:"document",onClick:u},h("AttachDocument"))),g&&n.a.createElement(_.a,{icon:"poll",onClick:s},h("Poll")))});a(308);var ws=Object(n.h)(Object(s.h)(e=>{const{stickers:t}=e.stickers.forEmoji;return{stickers:t}},(e,t)=>Object(h.l)(t,["clearStickersForEmoji"]))(({isOpen:e,onStickerSelect:t,stickers:a,clearStickersForEmoji:s})=>{const c=Object(n.q)(null),{shouldRender:r,transitionClassNames:i}=Object(Y.a)(e,void 0,void 0,!1),d=Object(f.a)(a,!0),m=a||d,{observe:u}=Object(ta.a)({rootRef:c,throttleMs:200});Object(n.n)(()=>e?Object(g.a)(s):void 0,[e,s]);const h=Object(W.a)("StickerTooltip composer-tooltip custom-scroll",i,!(m&&m.length)&&"hidden");return n.a.createElement("div",{ref:c,className:h,onMouseEnter:l.n?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:l.n?void 0:()=>{document.body.classList.remove("no-select")}},r&&m?m.map(e=>n.a.createElement(oa.a,{key:e.id,sticker:e,size:o.Lb,observeIntersection:u,onClick:t,clickArg:e})):r?n.a.createElement(ge.a,null):void 0)}));a(309);var Ss=Object(n.h)(Object(s.h)((e,{messageId:t})=>{const{chatId:a}=Object(m.z)(e)||{};return a?{message:Object(m.l)(e,a,t)}:{}},(e,t)=>Object(h.l)(t,["clickInlineButton"]))(({isOpen:e,message:t,onClose:a,clickInlineButton:s})=>{const[c,r]=ts(e,a);if(t&&t.keyboardButtons)return n.a.createElement(Fn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:a,className:"KeyboardMenu",onCloseAnimationEnd:a,onMouseEnter:l.n?void 0:c,onMouseLeave:l.n?void 0:r,noCloseOnBackdrop:!l.n},n.a.createElement("div",{className:"content"},t.keyboardButtons.map(e=>n.a.createElement("div",{className:"row"},e.map(e=>n.a.createElement(D.a,{ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>s({button:e})},e.text))))))}));a(310);var Is=Object(n.h)(({isOpen:e,onSilentSend:t,onScheduleSend:a,onClose:s,onCloseAnimationEnd:c})=>{const[r,o]=ts(e,s),i=Object(M.a)();return n.a.createElement(Fn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",className:"CustomSendMenu",onClose:s,onCloseAnimationEnd:c,onMouseEnter:l.n?void 0:r,onMouseLeave:l.n?void 0:o,noCloseOnBackdrop:!l.n},t&&n.a.createElement(_.a,{icon:"mute",onClick:t},i("SendWithoutSound")),a&&n.a.createElement(_.a,{icon:"schedule",onClick:a},i("ScheduleMessage")))}),Ps=a(143),Fs=a(170),Ms=a(183);a(311);var Ls=Object(n.h)(({isOpen:e,emojis:t,onClose:a,onEmojiSelect:s,addRecentEmoji:c})=>{const r=Object(n.q)(null),{shouldRender:o,transitionClassNames:i}=Object(Y.a)(e,void 0,void 0,!1),d=Object(Ms.a)(t.length?t:void 0,350)||[],[m,u]=Object(n.r)(-1);Object(n.n)(()=>{u(0)},[t]),Object(n.n)(()=>{!function(e,t){const a=t.current;if(!a)return;const{visibleIndexes:n,allElements:s}=Hn(a,".EmojiButton",8,!0,!0,!0);if(!s.length||!s[e])return;const c=n[0];if(!n.includes(e)||e===c&&!$n(a,s[c],!0)){const t="start"===(e>n[n.length-1]?"start":"end")?44*e:0;Object(ns.a)(a,t)}}(m,r)},[m]);const h=Object(n.m)(e=>{if(!t.length)return-1;const a=t.length;return Object(Kn.a)(a,e)},[t]),b=Object(n.m)((e,t)=>{t.preventDefault(),u(t=>h(t+e))},[u,h]),g=Object(n.m)(e=>{if(t.length&&m>-1){const a=t[m];a&&(e.preventDefault(),s(a.native),c({emoji:a.id}))}},[c,t,s,m]),p=Object(n.m)((e,t)=>{s(e),c({emoji:t})},[c,s]);Object(n.n)(()=>e?Object(Ge.a)({onEsc:a,onLeft:e=>b(-1,e),onRight:e=>b(1,e),onEnter:g}):void 0,[b,g,e,a]);const v=Object(W.a)("EmojiTooltip composer-tooltip custom-scroll-x",i);return n.a.createElement("div",{ref:r,className:v,onMouseEnter:l.n?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:l.n?void 0:()=>{document.body.classList.remove("no-select")}},o&&d?d.map((e,t)=>n.a.createElement(ss,{key:e.id,emoji:e,focus:m===t,onClick:p})):o?n.a.createElement(ge.a,null):void 0)});a(312);var As=Object(n.h)(({title:e,description:t,thumbnail:a,thumbUrl:s,focus:c,transitionClassNames:r="",onClick:o})=>{let l="";const i=Object(O.a)(a?"webDocument:"+a.url:void 0);return(s=s||i)?l=n.a.createElement("img",{src:s,className:r,alt:"",decoding:"async",draggable:"false"}):e&&(l=Object(sa.c)(e,1)),n.a.createElement(Ee.a,{focus:c,className:"BaseResult chat-item-clickable",onClick:o},n.a.createElement("span",{className:"thumb"},"string"==typeof l?Object(U.a)(l):l),n.a.createElement("div",{className:"content-inner"},e&&n.a.createElement("div",{className:"title"},e),t&&n.a.createElement("div",{className:"description"},t)))});a(313);var Rs=Object(n.h)(({focus:e,isForGallery:t,inlineResult:a,onClick:s})=>{let c,r,o;"photo"in a&&(c=a.photo),"thumbnail"in a&&(r=a.thumbnail),"webThumbnail"in a&&t&&(o=a.webThumbnail);const l=Object(O.a)(o?"webDocument:"+o.url:void 0),i=Object(O.a)(c&&`photo${c.id}?size=m`),{shouldRenderThumb:d,shouldRenderFullMedia:m,transitionClassNames:u}=Object(na.a)(i,"slow"),h=Object(n.m)(()=>{s(a)},[a,s]);if(t)return n.a.createElement("div",{className:"MediaResult chat-item-clickable",onClick:h},d&&n.a.createElement("img",{src:c&&c.thumbnail&&c.thumbnail.dataUri||l,alt:""}),m&&n.a.createElement("img",{src:i,className:u+" full-media",alt:""}));const{title:b,description:g}=a;return n.a.createElement(As,{focus:e,thumbUrl:m?i:r&&r.dataUri||l,transitionClassNames:m?u:void 0,title:b,description:g,onClick:h})});var Ts=Object(n.h)(({focus:e,inlineResult:t,onClick:a})=>{const{title:s,url:c,description:r,webThumbnail:o}=t,l=Object(n.m)(()=>{a(t)},[t,a]);return n.a.createElement(As,{focus:e,thumbnail:o,title:s||c,description:r,onClick:l})});var Ds=Object(n.h)(({inlineResult:e,observeIntersection:t,onClick:a})=>{const{gif:s}=e,c=Object(n.m)(()=>{a(e)},[e,a]);if(s)return n.a.createElement(vs,{gif:s,observeIntersection:t,className:"chat-item-clickable",onClick:c})});var Bs=Object(n.h)(({inlineResult:e,observeIntersection:t,onClick:a})=>{const{sticker:s}=e;if(s)return n.a.createElement(oa.a,{sticker:s,size:o.Hb,observeIntersection:t,title:s.emoji,className:"chat-item-clickable",onClick:a,clickArg:e})});a(314);const Us=Object(V.h)(e=>e(),500,!0);var xs=Object(n.h)(Object(s.h)(void 0,(e,t)=>Object(h.l)(t,["sendBotCommand","openChat","sendInlineBotResult"]))(({isOpen:e,botId:t,isGallery:a,inlineBotResults:s,switchPm:c,loadMore:o,onClose:i,openChat:d,sendBotCommand:m,onSelectResult:u})=>{const h=Object(n.q)(null),{shouldRender:b,transitionClassNames:g}=Object(Y.a)(e,void 0,void 0,!1),[p,v]=Object(n.r)(-1),{observe:O}=Object(ta.a)({rootRef:h,debounceMs:200,isDisabled:!e});Object(n.n)(()=>{v(a?-1:0)},[s,a]),Object(n.n)(()=>{Wn(".chat-item-clickable",p,h)},[p]);const E=Object(n.m)(e=>s&&s.length?Object(Kn.a)(s.length,e):-1,[s]),j=Object(n.m)((e,t)=>{a||(t.preventDefault(),v(t=>E(t+e)))},[a,E]),C=Object(n.m)(e=>{if(s&&s.length&&p>-1){const t=s[p];t&&(e.preventDefault(),u(t))}},[s,u,p]),y=Object(n.m)(({direction:e})=>{e===r.e.Backwards&&Us(o)},[o]);Object(n.n)(()=>e?Object(Ge.a)({onEsc:i,onUp:e=>j(-1,e),onDown:e=>j(1,e),onEnter:C}):void 0,[j,C,a,e,i]);const k=Object(n.m)(()=>{d({id:t}),m({chatId:t,command:"/start "+c.startParam})},[t,d,m,c]),N=Object(f.a)(s&&s.length?s:void 0,b),w=s&&!s.length?N:s;if(!b||!w||!w.length&&!c)return;const S=Object(W.a)("InlineBotTooltip composer-tooltip",l.n?"no-scrollbar":"custom-scroll",a&&"gallery",g);return n.a.createElement(Oe.a,{ref:h,className:S,items:w,itemSelector:".chat-item-clickable",noFastList:!0,onLoadMore:y,sensitiveArea:160},c&&n.a.createElement(Ee.a,{ripple:!0,className:"switch-pm scroll-item",onClick:k},n.a.createElement("span",{className:"title"},c.text)),w.map((e,t)=>{switch(e.type){case"gif":return n.a.createElement(Ds,{key:e.id,inlineResult:e,observeIntersection:O,onClick:u});case"photo":return n.a.createElement(Rs,{key:e.id,isForGallery:a,inlineResult:e,onClick:u});case"sticker":return n.a.createElement(Bs,{key:e.id,inlineResult:e,observeIntersection:O,onClick:u});case"video":case"game":return n.a.createElement(Rs,{key:e.id,focus:p===t,inlineResult:e,onClick:u});case"article":case"audio":return n.a.createElement(Ts,{key:e.id,focus:p===t,inlineResult:e,onClick:u});default:return}}))})),Gs=a(180);a(315);var zs=Object(n.h)(Object(s.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),n=a&&Object(m.n)(e,a.id);if(!a||!n)return{};const{query:s,results:c}=Object(m.B)(e)||{},{totalCount:r,foundIds:o}=c||{};return{chat:a,messagesById:n,query:s,totalCount:r,foundIds:o}},(e,t)=>Object(h.l)(t,["searchTextMessagesLocal","focusMessage"]))(({chatId:e,threadId:t,onClose:a,isActive:c,chat:r,messagesById:o,query:l,totalCount:i,foundIds:d,searchTextMessagesLocal:b,focusMessage:g})=>{const p=Object(M.a)(),v=Object(n.p)(()=>{if(!(l&&d&&d.length&&o))return Ve.a;const a=d.map(a=>{const n=o[a];if(!n)return;const c=n.senderId?Object(m.Jb)(Object(s.e)(),n.senderId):void 0;let l;if(r&&Object(u.mb)(r))l=r;else if(n.forwardInfo){const{isChannelPost:e,fromChatId:t}=n.forwardInfo;l=e&&t?Object(m.g)(Object(s.e)(),t):void 0}else l=n.senderId?Object(m.g)(Object(s.e)(),n.senderId):void 0;return{message:n,senderUser:c,senderChat:l,onClick:()=>g({chatId:e,threadId:t,messageId:a})}}).filter(Boolean);return Object(h.k)(a,({message:e})=>e.date,"desc")},[e,t,g,d,r,o,l]);Object(L.a)(c,a);const O=Object(n.q)(null),E=Object(be.a)(O,!0,e=>{const t=v&&v[-1===e?0:e];t&&t.onClick()},".ListItem-button",!0);return n.a.createElement(Oe.a,{className:"RightSearch custom-scroll",items:v,preloadBackwards:0,onLoadMore:b,noFastList:!0,onKeyDown:E,ref:O},n.a.createElement("p",{className:"helper-text",dir:"auto"},l?0!==i&&v.length?1===i?"1 message found":(v.length&&(i||v.length))+" messages found":p("lng_search_no_results"):p("lng_dlg_search_for_messages")),v.map(({message:e,senderUser:t,senderChat:a,onClick:s})=>{const c=a?Object(u.k)(p,a):Object(u.bb)(t),r=Object(u.O)(p,e);return n.a.createElement(Ee.a,{className:"chat-item-clickable search-result-message m-0",onClick:s},n.a.createElement(x.a,{chat:a,user:t}),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"title"},n.a.createElement("h3",{dir:"auto"},c&&Object(U.a)(c)),n.a.createElement(Gs.a,{message:e})),n.a.createElement("div",{className:"subtitle",dir:"auto"},Object(U.a)(r,["emoji","highlight"],{highlight:l}))))}))})),qs=a(52);var _s=Object(n.h)(Object(s.h)((e,{stickerSetId:t})=>({set:Object(m.zb)(e,t),shouldPlay:Object(m.yb)(e)}),(e,t)=>Object(h.l)(t,["loadStickers","toggleStickerSet"]))(({stickerSetId:e,observeIntersection:t,set:a,shouldPlay:s,loadStickers:c,toggleStickerSet:r,isSomeModalOpen:l,onModalToggle:i})=>{const d=Object(M.a)(),m=a&&Boolean(a.installedDate),u=Boolean(a&&a.stickers),[h,b,g]=Object(xe.a)();Object(qs.a)(()=>{i(h)},[h,i]);const p=Object(n.p)(()=>{if(!a)return[];const e=(a.covers||[]).map(({id:e})=>e),t=a.stickers?a.stickers.filter(({id:t})=>!e.includes(t)):[];return[...a.covers||[],...t].slice(0,5)},[a]);Object(n.n)(()=>{!u&&p.length<5&&c({stickerSetId:e})},[u,p.length,c,e]);const v=Object(n.m)(()=>{r({stickerSetId:e})},[r,e]);if(!a)return;const O=p.length>0;return n.a.createElement("div",{key:a.id,className:"sticker-set",dir:d.isRtl?"rtl":void 0},n.a.createElement("div",{className:"sticker-set-header"},n.a.createElement("div",{className:"title-wrapper"},n.a.createElement("h3",{className:"title",dir:"auto"},a.title),n.a.createElement("p",{className:"count",dir:"auto"},d("Stickers",a.count,"i"))),n.a.createElement(D.a,{className:m?"is-added":void 0,color:"primary",size:"tiny",pill:!0,fluid:!0,onClick:v},d(m?"Stickers.Installed":"Stickers.Install"))),n.a.createElement("div",{className:"sticker-set-main"},!O&&n.a.createElement(A.a,null),O&&p.map(e=>n.a.createElement(oa.a,{sticker:e,size:o.Nb,observeIntersection:t,noAnimate:!s||h||l,onClick:b}))),O&&n.a.createElement(ia.a,{isOpen:h,fromSticker:p[0],onClose:g}))}));a(316);const Hs=Object(V.h)(e=>e(),6e4,!0);var $s=Object(n.h)(Object(s.h)(e=>{const t=Object(m.A)(e),{query:a,resultIds:n}=t||{},{featured:s}=e.stickers;return{query:a,featuredIds:s.setIds,resultIds:n}},(e,t)=>Object(h.l)(t,["loadFeaturedStickers"]))(({onClose:e,isActive:t,query:a,featuredIds:s,resultIds:c,loadFeaturedStickers:r})=>{const o=Object(n.q)(null),l=Object(M.a)(),[i,d]=Object(n.r)(!1),{observe:m}=Object(ta.a)({rootRef:o,throttleMs:200});return Object(n.n)(()=>{Hs(()=>{r()})}),Object(L.a)(t,e),n.a.createElement("div",{ref:o,className:"StickerSearch custom-scroll",dir:l.isRtl?"rtl":void 0},function(){if(void 0!==a)return!a&&s?s.map(e=>n.a.createElement(_s,{key:e,stickerSetId:e,observeIntersection:m,isSomeModalOpen:i,onModalToggle:d})):c?c.length?c.map(e=>n.a.createElement(_s,{key:e,stickerSetId:e,observeIntersection:m,isSomeModalOpen:i,onModalToggle:d})):n.a.createElement("p",{className:"helper-text",dir:"auto"},"Nothing found."):n.a.createElement(ge.a,null)}())}));a(317);var Vs=Object(n.h)(Object(s.h)(e=>{const t=Object(m.t)(e),{query:a,results:n}=t||{},{chatId:s}=Object(m.z)(e)||{},c=s?Object(m.g)(e,s):void 0;return{query:a,results:n,chat:c,isChatWithBot:c?Object(m.O)(e,c):void 0}},(e,t)=>Object(h.l)(t,["searchMoreGifs","sendMessage","setGifSearchQuery"]))(({onClose:e,isActive:t,query:a,results:s,chat:c,isChatWithBot:r,searchMoreGifs:o,sendMessage:i,setGifSearchQuery:d})=>{const m=Object(n.q)(null),{observe:h}=Object(ta.a)({rootRef:m,debounceMs:300}),{canSendGifs:b}=Object(u.b)(c,r),g=Object(n.m)(e=>{b&&i({gif:e}),l.n&&d({query:void 0})},[b,i,d]),p=Object(M.a)();Object(L.a)(t,e);const v=Boolean(void 0!==a&&s&&s.length);return n.a.createElement("div",{className:"GifSearch",dir:p.isRtl?"rtl":void 0},n.a.createElement(Oe.a,{ref:m,className:Object(W.a)("gif-container custom-scroll",v&&"grid"),items:s,itemSelector:".GifButton",preloadBackwards:96,noFastList:!0,onLoadMore:o},function(){if(void 0!==a)return s?s.length?s.map(e=>n.a.createElement(vs,{key:e.id,gif:e,observeIntersection:h,onClick:g})):n.a.createElement("p",{className:"helper-text",dir:"auto"},p("NoGIFsFound")):n.a.createElement(ge.a,null)}()))}));a(318);var Ws=Object(n.h)(Object(s.h)((e,{answer:t})=>{const{voters:a,offsets:n}=e.pollResults;return{voters:a&&a[t.option],offset:n&&n[t.option]||""}},(e,t)=>Object(h.l)(t,["loadPollOptionResults","openChat","closePollResults"]))(({chat:e,message:t,answer:a,answerVote:s,totalVoters:c,voters:r,offset:o,loadPollOptionResults:l,openChat:i,closePollResults:d})=>{const m=Object(f.a)(s.votersCount),[u,h]=Object(n.r)(!0),b=Boolean(r),{option:g,text:p}=a,v=Object(M.a)();Object(n.n)(()=>{b&&m===s.votersCount||l({chat:e,messageId:t.id,option:g,offset:o,limit:4,shouldResetVoters:!0})},[s.votersCount,b]);const O=Object(n.m)(()=>{h(!0),l({chat:e,messageId:t.id,option:g,offset:o,limit:50})},[e,l,t.id,o,g]);Object(n.n)(()=>{h(!1)},[r]);const E=Object(n.m)(e=>{i({id:e}),d()},[d,i]);return n.a.createElement("div",{className:"PollAnswerResults"},n.a.createElement("div",{className:"poll-voters"},r?r.map(e=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable",onClick:()=>E(e)},n.a.createElement(je.a,{avatarSize:"tiny",userId:e,forceShowSelf:!0,noStatusOrTyping:!0}))):n.a.createElement(ge.a,null),r&&function(){const e=s.votersCount-r.length;return s.votersCount>4&&e>0&&n.a.createElement(Kt,{count:e,itemName:"voter",isLoading:u,onClick:O})}()),n.a.createElement("div",{className:"answer-head",dir:v.isRtl?"rtl":void 0},n.a.createElement("span",{className:"answer-title",dir:"auto"},p),n.a.createElement("span",{className:"answer-percent",dir:v.isRtl?"auto":void 0},(j=s.votersCount,(C=c)>0?(j/C*100).toFixed():0),"%")));var j,C}));a(319);var Ks=Object(n.h)(Object(s.h)(e=>{const{pollResults:{chatId:t,messageId:a},lastSyncTime:n}=e;if(!t||!a)return{};return{chat:Object(m.g)(e,t),message:Object(m.l)(e,t,a),lastSyncTime:n}})(({onClose:e,isActive:t,chat:a,message:s,lastSyncTime:c})=>{const r=Object(M.a)();if(Object(L.a)(t,e),!s||!a)return n.a.createElement(ge.a,null);const{summary:o,results:l}=Object(u.I)(s);if(!l.results)return;const i=Object(h.c)(l.results,"option");return n.a.createElement("div",{className:"PollResults",dir:r.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"poll-question",dir:"auto"},o.question),n.a.createElement("div",{className:"poll-results-list custom-scroll"},c&&o.answers.map(e=>n.a.createElement(Ws,{key:`${s.id}-${e.option}`,chat:a,message:s,answer:e,answerVote:i[e.option],totalVoters:l.totalVoters})),!c&&n.a.createElement(ge.a,null)))}));a(174);var Ys=Object(n.h)(Object(s.h)((e,{userId:t})=>{const a=Object(m.Jb)(e,t),n=Object(m.g)(e,t),{progress:s}=e.management;return{user:a,chat:n,progress:s,isMuted:Object(u.Hb)(n,Object(m.fb)(e),Object(m.eb)(e))}},(e,t)=>Object(h.l)(t,["updateContact","deleteUser","closeManagement","openChat","deleteHistory"]))(({userId:e,user:t,chat:a,progress:s,isMuted:c,updateContact:o,deleteUser:l,deleteHistory:i,closeManagement:d,openChat:m,onClose:u,isActive:h})=>{const[b,g,p]=Object(xe.a)(),[v,O]=Object(n.r)(!1),[E,j]=Object(n.r)(),f=Object(M.a)();Object(L.a)(h,u);const C=t&&t.firstName||"",y=t&&t.lastName||"",[k,N]=Object(n.r)(C),[w,S]=Object(n.r)(y),[I,P]=Object(n.r)(!c);Object(n.n)(()=>{P(!c)},[c]),Object(n.n)(()=>{O(!1),p()},[p,e]),Object(n.n)(()=>{N(C),S(y)},[C,y,t]),Object(n.n)(()=>{s===r.f.Complete&&(O(!1),j(void 0),p())},[p,s]);const F=Object(n.m)(e=>{N(e.target.value),O(!0)},[]),R=Object(n.m)(e=>{S(e.target.value),O(!0)},[]),T=Object(n.m)(e=>{P(e.target.checked),O(!0)},[]),D=Object(n.m)(()=>{const t=k.trim(),a=w.trim();t.length||j("Please provide first name"),o({userId:e,isMuted:!I,firstName:t,lastName:a})},[k,w,o,e,I]),B=Object(n.m)(()=>{i({chatId:a.id,shouldDeleteForAll:!1}),l({userId:e}),p(),d(),m({id:void 0})},[a.id,p,d,i,l,m,e]);if(!t)return;const U=s===r.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(je.a,{userId:t.id,avatarSize:"jumbo",status:"original name",withFullInfo:!0}),n.a.createElement(ve.a,{id:"user-first-name",label:f("UserInfo.FirstNamePlaceholder"),onChange:F,value:k,error:"Please provide first name"===E?E:void 0}),n.a.createElement(ve.a,{id:"user-last-name",label:f("UserInfo.LastNamePlaceholder"),onChange:R,value:w}),n.a.createElement("div",{className:"ListItem no-selection narrow"},n.a.createElement(Zt.a,{checked:I,label:f("Notifications"),subLabel:f(I?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),onChange:T}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:g},f("DeleteContact")))),n.a.createElement(Dt.a,{isShown:v,onClick:D,disabled:U,ariaLabel:f("Save")},U?n.a.createElement(A.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Pe.a,{isOpen:b,onClose:p,text:f("AreYouSureDeleteContact"),confirmLabel:f("DeleteContact"),confirmHandler:B,confirmIsDestructive:!0}))}));var Qs=Object(n.h)(Object(s.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),{progress:n}=e.management,s=Boolean(a.fullInfo&&a.fullInfo.linkedChatId),c=Object(u.lb)(a);return{chat:a,progress:n,isBasicGroup:c,hasLinkedChannel:s,canChangeInfo:c?a.isCreator:Object(u.p)(a,"changeInfo"),canBanUsers:c?a.isCreator:Object(u.p)(a,"banUsers")}},(e,t)=>Object(h.l)(t,["togglePreHistoryHidden","updateChat","closeManagement","leaveChannel","deleteChannel","deleteChat","openChat"]))(({chatId:e,chat:t,progress:a,isBasicGroup:s,hasLinkedChannel:o,canChangeInfo:l,canBanUsers:i,onScreenSelect:d,togglePreHistoryHidden:m,updateChat:h,deleteChat:b,leaveChannel:g,deleteChannel:p,closeManagement:v,openChat:E,onClose:j,isActive:f})=>{const[C,y,k]=Object(xe.a)(),N=t.title,w=t.fullInfo&&t.fullInfo.about||"",[S,I]=Object(n.r)(!1),[P,F]=Object(n.r)(N),[R,T]=Object(n.r)(w),[D,B]=Object(n.r)(),[x,G]=Object(n.r)(),z=Object(u.e)(t),q=Object(O.a)(z,!1,c.ApiMediaFormat.BlobUrl),_=Object(M.a)();Object(L.a)(f,j),Object(n.n)(()=>{a===r.f.Complete&&(I(!1),G(void 0))},[a]);const H=Object(n.m)(()=>{d(r.g.ChatPrivacyType)},[d]),$=Object(n.m)(()=>{d(r.g.Discussion)},[d]),V=Object(n.m)(()=>{d(r.g.GroupPermissions)},[d]),W=Object(n.m)(()=>{d(r.g.ChatAdministrators)},[d]),K=Object(n.m)(e=>{B(e),I(!0)},[]),Y=Object(n.m)(e=>{F(e.target.value),I(!0)},[]),Q=Object(n.m)(e=>{T(e.target.value),I(!0)},[]),Z=Object(n.m)(()=>{const t=P.trim(),a=R.trim();t.length?h({chatId:e,title:t,about:a,photo:D}):G("Group title can't be empty")},[R,e,D,P,h]),J=Object(n.m)(()=>{d(r.g.GroupMembers)},[d]),X=Object(n.m)(()=>{if(!t.fullInfo)return;const{isPreHistoryHidden:e}=t.fullInfo;m({chatId:t.id,isEnabled:!e})},[t,m]),ee=Object(n.p)(()=>{if(!t.defaultBannedRights)return 0;let e=["sendMessages","sendMedia","embedLinks","sendPolls","changeInfo","inviteUsers","pinMessages"].filter(e=>!t.defaultBannedRights[e]).length;const{sendStickers:a,sendGifs:n}=t.defaultBannedRights;return a||n||(e+=1),e},[t]),te=t.fullInfo&&t.fullInfo.adminMembers&&t.fullInfo.adminMembers.length||0,ae=Object(n.m)(()=>{s?b({chatId:t.id}):t.isCreator?p({chatId:t.id}):g({chatId:t.id}),k(),v(),E({id:void 0})},[s,t.isCreator,t.id,k,v,g,p,b,E]);if(t.isRestricted)return;const ne=a===r.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Tt.a,{currentAvatarBlobUrl:q,onChange:K,disabled:!l}),n.a.createElement(ve.a,{id:"group-title",label:_("GroupName"),onChange:Y,value:P,error:"Group title can't be empty"===x?x:void 0,disabled:!l}),n.a.createElement(ve.a,{id:"group-about",className:"mb-2",label:_("DescriptionPlaceholder"),onChange:Q,value:R,disabled:!l}),t.isCreator&&n.a.createElement(Ee.a,{icon:"lock",multiline:!0,onClick:H},n.a.createElement("span",{className:"title"},_("GroupType")),n.a.createElement("span",{className:"subtitle"},t.username?_("TypePublic"):_("TypePrivate"))),o&&n.a.createElement(Ee.a,{icon:"message",multiline:!0,onClick:$},n.a.createElement("span",{className:"title"},_("LinkedChannel")),n.a.createElement("span",{className:"subtitle"},_("DiscussionUnlink"))),n.a.createElement(Ee.a,{icon:"permissions",multiline:!0,onClick:V,disabled:!i},n.a.createElement("span",{className:"title"},_("ChannelPermissions")),n.a.createElement("span",{className:"subtitle",dir:"auto"},ee,"/",8)),n.a.createElement(Ee.a,{icon:"admin",multiline:!0,onClick:W},n.a.createElement("span",{className:"title"},_("ChannelAdministrators")),n.a.createElement("span",{className:"subtitle"},Object(sa.a)(te)))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"group",multiline:!0,onClick:J},n.a.createElement("span",{className:"title"},_("GroupMembers")),n.a.createElement("span",{className:"subtitle"},Object(sa.a)(t.membersCount))),t.fullInfo&&n.a.createElement("div",{className:"ListItem narrow no-selection"},n.a.createElement(Zt.a,{checked:!t.fullInfo.isPreHistoryHidden,label:_("ChatHistory"),onChange:X,disabled:!i}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:y},_("DeleteMega")))),n.a.createElement(Dt.a,{isShown:S,onClick:Z,disabled:ne,ariaLabel:_("Save")},ne?n.a.createElement(A.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Pe.a,{isOpen:C,onClose:k,textParts:Object(U.a)(s||!t.isCreator?_("AreYouSureDeleteAndExit"):_("AreYouSureDeleteThisChatWithGroup",t.title),["br","simple_markdown"]),confirmLabel:s||!t.isCreator?_("DeleteMega"):_("DeleteGroupForAll"),confirmHandler:ae,confirmIsDestructive:!0}))}));var Zs=Object(n.h)(Object(s.h)((e,{chatId:t})=>({chat:Object(m.g)(e,t),currentUserId:e.currentUserId}),(e,t)=>Object(h.l)(t,["updateChatDefaultBannedRights"]))(({onScreenSelect:e,onChatMemberSelect:t,chat:a,currentUserId:s,updateChatDefaultBannedRights:c,onClose:o,isActive:l})=>{const[i,d]=Object(n.r)({}),[m,u]=Object(n.r)(!1),[h,b]=Object(n.r)(!1),g=Object(M.a)();Object(L.a)(l,o);const p=Object(n.m)(()=>{e(r.g.GroupRemovedUsers)},[e]),v=Object(n.m)(()=>{e(r.g.GroupUserPermissionsCreate)},[e]),O=Object(n.m)(a=>{t(a.userId,a.promotedByUserId===s),e(r.g.GroupUserPermissions)},[s,t,e]);Object(n.n)(()=>{d(a&&a.defaultBannedRights||{}),u(!1),setTimeout(()=>{b(!1)},250)},[a]);const E=Object(n.m)(e=>{const{name:t}=e.target;function a(e){return!e||void 0}d(e=>({...e,[t]:a(e[t]),..."sendStickers"===t&&{sendGifs:a(e[t])}})),u(!0)},[]),j=Object(n.m)(()=>{a&&(b(!0),c({chatId:a.id,bannedRights:i}))},[a,i,c]),f=Object(n.p)(()=>a&&a.fullInfo&&a.fullInfo.kickedMembers?a.fullInfo.kickedMembers.length:0,[a]),C=Object(n.p)(()=>a&&a.fullInfo&&a.fullInfo.members?a.fullInfo.members.filter(({bannedRights:e})=>!!e):[],[a]),y=Object(n.m)(e=>{const{bannedRights:t}=e;if(!t||!a)return;const{defaultBannedRights:n}=a;return Object.keys(t).reduce((e,a)=>{if(!t[a]||n&&n[a]||"sendInline"===a||"viewMessages"===a||"sendGames"===a)return e;const s=function(e){switch(e){case"sendMessages":return"UserRestrictionsNoSend";case"sendMedia":return"UserRestrictionsNoSendMedia";case"sendStickers":return"UserRestrictionsNoSendStickers";case"embedLinks":return"UserRestrictionsNoEmbedLinks";case"sendPolls":return"UserRestrictionsNoSendPolls";case"changeInfo":return"UserRestrictionsNoChangeInfo";case"inviteUsers":return"UserRestrictionsInviteUsers";case"pinMessages":return"UserRestrictionsPinMessages";default:return}}(a);if(!s)return e;const c=g(s);return`${e}${e.length?", "+c:c}`},"")},[a,g]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement("h3",{className:"section-heading",dir:"auto"},g("ChannelPermissionsHeader")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"sendMessages",checked:!i.sendMessages,label:g("UserRestrictionsSend"),blocking:!0,onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"sendMedia",checked:!i.sendMedia,label:g("UserRestrictionsSendMedia"),blocking:!0,onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"sendStickers",checked:!i.sendStickers&&!i.sendGifs,label:g("UserRestrictionsSendStickers"),blocking:!0,onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"sendPolls",checked:!i.sendPolls,label:g("UserRestrictionsSendPolls"),blocking:!0,onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"embedLinks",checked:!i.embedLinks,label:g("UserRestrictionsEmbedLinks"),blocking:!0,onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"inviteUsers",checked:!i.inviteUsers,label:g("UserRestrictionsInviteUsers"),blocking:!0,onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"pinMessages",checked:!i.pinMessages,label:g("UserRestrictionsPinMessages"),blocking:!0,onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"changeInfo",checked:!i.changeInfo,label:g("UserRestrictionsChangeInfo"),blocking:!0,onChange:E}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete-user",multiline:!0,narrow:!0,onClick:p},n.a.createElement("span",{className:"title"},g("ChannelBlockedUsers")),n.a.createElement("span",{className:"subtitle"},f))),n.a.createElement("div",{className:"section"},n.a.createElement("h3",{className:"section-heading",dir:"auto"},g("PrivacyExceptions")),n.a.createElement(Ee.a,{icon:"add-user",onClick:v},g("ChannelAddException")),C.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable exceptions-member",onClick:()=>O(e)},n.a.createElement(je.a,{userId:e.userId,status:y(e)}))))),n.a.createElement(Dt.a,{isShown:m,onClick:j,ariaLabel:g("Save"),disabled:h},h?n.a.createElement(A.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))}));var Js=Object(n.h)(Object(s.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),{byId:n}=e.users;return{chat:a,usersById:n}},(e,t)=>Object(h.l)(t,["updateChatMemberBannedRights"]))(({chat:e,usersById:t,updateChatMemberBannedRights:a,onClose:s,isActive:c})=>{const r=Object(M.a)();Object(L.a)(c,s);const o=Object(n.p)(()=>e&&e.fullInfo&&e.fullInfo.kickedMembers?e.fullInfo.kickedMembers:[],[e]),l=Object(n.m)(e=>{if(!e.kickedByUserId)return;const a=t[e.kickedByUserId];return a?r("UserRemovedBy",Object(u.bb)(a)):void 0},[r,t]),i=Object(n.m)(t=>{if(e)return[{title:r("Unblock"),icon:"delete",destructive:!0,handler:()=>a({chatId:e.id,userId:t.userId,bannedRights:{}})}]},[r,e,a]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",dir:r.isRtl?"rtl":void 0},n.a.createElement("p",{className:"text-muted"},r("NoBlockedGroup2")),o.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable",ripple:!0,contextActions:i(e)},n.a.createElement(je.a,{userId:e.userId,status:l(e)}))))))}));var Xs=Object(n.h)(Object(s.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),{progress:n}=e.management;return{chat:a,progress:n,isSignaturesShown:Boolean(a&&a.isSignaturesShown),canChangeInfo:Object(u.p)(a,"changeInfo")}},(e,t)=>Object(h.l)(t,["toggleSignatures","updateChat","closeManagement","leaveChannel","deleteChannel","openChat"]))(({chatId:e,chat:t,progress:a,isSignaturesShown:s,canChangeInfo:o,onScreenSelect:l,updateChat:i,toggleSignatures:d,closeManagement:m,leaveChannel:h,deleteChannel:b,openChat:g,onClose:p,isActive:v})=>{const E=t&&t.title||"",j=t&&t.fullInfo&&t.fullInfo.about||"",f=t&&t.fullInfo&&t.fullInfo.linkedChatId,[C,y,k]=Object(xe.a)(),[N,w]=Object(n.r)(!1),[S,I]=Object(n.r)(E),[P,F]=Object(n.r)(j),[R,T]=Object(n.r)(),[D,B]=Object(n.r)(),U=t&&Object(u.e)(t),x=Object(O.a)(U,!1,c.ApiMediaFormat.BlobUrl),G=Object(M.a)();Object(L.a)(v,p),Object(n.n)(()=>{a===r.f.Complete&&(w(!1),B(void 0))},[a]);const z=t&&t.fullInfo&&t.fullInfo.adminMembers&&t.fullInfo.adminMembers.length||0,q=Object(n.m)(()=>{l(r.g.ChatPrivacyType)},[l]),_=Object(n.m)(()=>{l(r.g.Discussion)},[l]),H=Object(n.m)(()=>{l(r.g.ChatAdministrators)},[l]),$=Object(n.m)(e=>{T(e),w(!0)},[]),V=Object(n.m)(e=>{I(e.target.value),w(!0)},[]),W=Object(n.m)(e=>{F(e.target.value),w(!0)},[]),K=Object(n.m)(()=>{const t=S.trim(),a=P.trim();t.length?i({chatId:e,title:t,about:a,photo:R}):B("Channel title can't be empty")},[P,e,R,S,i]),Y=Object(n.m)(()=>{d({chatId:e,isEnabled:!s})},[e,s,d]),Q=Object(n.m)(()=>{l(r.g.ChannelSubscribers)},[l]),Z=Object(n.m)(()=>{t.isCreator?b({chatId:t.id}):h({chatId:t.id}),k(),m(),g({id:void 0})},[t.isCreator,t.id,k,m,h,b,g]);if(t.isRestricted)return;const J=a===r.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Tt.a,{currentAvatarBlobUrl:x,onChange:$,disabled:!o}),n.a.createElement(ve.a,{id:"channel-title",label:G("EnterChannelName"),onChange:V,value:S,error:"Channel title can't be empty"===D?D:void 0,disabled:!o}),n.a.createElement(ve.a,{id:"channel-about",className:"mb-2",label:G("DescriptionPlaceholder"),onChange:W,value:P,disabled:!o}),t.isCreator&&n.a.createElement(Ee.a,{icon:"lock",multiline:!0,onClick:q},n.a.createElement("span",{className:"title"},G("ChannelType")),n.a.createElement("span",{className:"subtitle"},t.username?G("TypePublic"):G("TypePrivate"))),n.a.createElement(Ee.a,{icon:"message",multiline:!0,onClick:_,disabled:!o},n.a.createElement("span",{className:"title"},G("Discussion")),n.a.createElement("span",{className:"subtitle"},G(f?"DiscussionUnlink":"Add"))),n.a.createElement(Ee.a,{icon:"admin",multiline:!0,onClick:H},n.a.createElement("span",{className:"title"},G("ChannelAdministrators")),n.a.createElement("span",{className:"subtitle"},z)),n.a.createElement("div",{className:"ListItem no-selection narrow"},n.a.createElement(Zt.a,{checked:s,label:G("ChannelSignMessages"),onChange:Y}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"group",multiline:!0,onClick:Q},n.a.createElement("span",{className:"title",dir:"auto"},G("ChannelSubscribers")),n.a.createElement("span",{className:"subtitle",dir:"auto"},G("Subscribers",t.membersCount,"i")))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:y},t.isCreator?G("ChannelDelete"):G("LeaveChannel")))),n.a.createElement(Dt.a,{isShown:N,onClick:K,disabled:J,ariaLabel:G("Save")},J?n.a.createElement(A.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Pe.a,{isOpen:C,onClose:k,text:t.isCreator?G("ChannelDeleteAlert"):G("ChannelLeaveAlert"),confirmLabel:t.isCreator?G("ChannelDelete"):G("LeaveChannel"),confirmHandler:Z,confirmIsDestructive:!0}))})),ec=a(59);var tc=Object(n.h)(Object(s.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),{isUsernameAvailable:n}=Object(m.ab)(e,t);return{chat:a,isChannel:Object(u.mb)(a),progress:e.management.progress,isUsernameAvailable:n}},(e,t)=>Object(h.l)(t,["checkPublicLink","updatePublicLink","updatePrivateLink"]))(({chat:e,onClose:t,isActive:a,isChannel:s,progress:c,isUsernameAvailable:o,checkPublicLink:l,updatePublicLink:i,updatePrivateLink:d})=>{const m=Boolean(e.username),u=e.fullInfo&&e.fullInfo.inviteLink,[h,b]=Object(n.r)(m?"public":"private"),[g,p]=Object(n.r)(),[v,O,E]=Object(xe.a)(),j="public"===h&&g&&o||"private"===h&&m;Object(L.a)(a,t),Object(n.n)(()=>{h&&!u&&d()},[h,u,d]);const f=Object(n.m)(e=>{b(e)},[]),C=Object(n.m)(()=>{i({username:"public"===h?g:""})},[h,i,g]),y=Object(n.m)(()=>{E(),d()},[E,d]),k=Object(M.a)(),N=s?"Channel":"Mega",w=s?"Channel":"Group",S=[{value:"private",label:k(N+"Private"),subLabel:k(N+"PrivateInfo")},{value:"public",label:k(N+"Public"),subLabel:k(N+"PublicInfo")}],I=c===r.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",dir:k.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"section-heading"},k(w+"Type")),n.a.createElement(qe.a,{selected:h,name:"channel-type",options:S,onChange:f})),"private"===h?n.a.createElement("div",{className:"section",dir:k.isRtl?"rtl":void 0},u?n.a.createElement(n.a.Fragment,null,n.a.createElement(ec.a,{url:u,className:"group-link",text:u}),n.a.createElement("p",{className:"section-info",dir:k.isRtl?"rtl":void 0},k(N+"PrivateLinkHelp")),n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:O},k("RevokeLink")),n.a.createElement(Pe.a,{isOpen:v,onClose:E,text:k("RevokeAlert"),confirmLabel:k("RevokeButton"),confirmHandler:y,confirmIsDestructive:!0})):n.a.createElement(ge.a,null)):n.a.createElement("div",{className:"section no-border"},n.a.createElement(Gt,{asLink:!0,currentUsername:e.username,isLoading:I,isUsernameAvailable:o,checkUsername:l,onChange:p}),n.a.createElement("p",{className:"section-info",dir:"auto"},k(w+".Username.CreatePublicLinkHelp")))),n.a.createElement(Dt.a,{isShown:j,disabled:I,ariaLabel:k("Save"),onClick:C},I?n.a.createElement(A.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))}));var ac=Object(n.h)(Object(s.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),{forDiscussionIds:n,byId:s}=e.chats;return{chat:a,chatsByIds:s,forDiscussionIds:n,linkedChat:a&&a.fullInfo&&a.fullInfo.linkedChatId?Object(m.g)(e,a.fullInfo.linkedChatId):void 0,isChannel:a&&Object(u.mb)(a)}},(e,t)=>Object(h.l)(t,["loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup"]))(({chat:e,onClose:t,isActive:a,chatId:s,chatsByIds:c,linkedChat:l,forDiscussionIds:i,isChannel:d,onScreenSelect:m,loadGroupsForDiscussion:u,linkDiscussionGroup:h,unlinkDiscussionGroup:b})=>{const[g,p]=Object(n.r)(),[v,O]=Object(n.r)(),[E,j]=Object(n.r)(!1),f=Object(n.m)(()=>j(!0),[]),[C,y,k]=Object(xe.a)(),[N,w,S]=Object(xe.a)(),I=Object(M.a)(),P=l&&l.id;Object(L.a)(a,t),Object(n.n)(()=>{u()},[u]),Object(n.n)(()=>{v||Object(_t.a)("DiscussionGroups").then(O)},[v]);const F=Object(n.m)(()=>{k(),b({channelId:d?s:P}),d||m(r.g.Initial)},[k,b,d,s,P,m]),A=Object(n.m)(()=>{S(),h({channelId:s,chatId:g})},[S,h,s,g]);function R(){const e=c[g];if(e)return n.a.createElement("div",{className:"modal-header"},n.a.createElement(x.a,{size:"tiny",chat:e}),n.a.createElement("div",{className:"modal-title"},I("Channel.DiscussionGroup.LinkGroup")))}function T(){const t=c[g];if(t)return t.hasPrivateLink?Object(U.a)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?`,["br","simple_markdown"]):Object(U.a)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?\n\nAnyone from the channel will be able to see messages in this group.`,["br","simple_markdown"])}return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement("div",{className:"section-icon"},v&&n.a.createElement(Ht.a,{id:"discussionGroupsDucks",size:o.Eb,animationData:v,play:E,noLoop:!0,onLoad:f})),l&&n.a.createElement("div",null,n.a.createElement(Ee.a,{className:"chat-item-clickable",inactive:!0},n.a.createElement(fe.a,{chatId:l.id})),n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:y},I(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel")),n.a.createElement(Pe.a,{isOpen:C,onClose:k,header:n.a.createElement("div",{className:"modal-header"},n.a.createElement(x.a,{size:"tiny",chat:l}),n.a.createElement("div",{className:"modal-title"},I(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"))),textParts:Object(U.a)(I(d?"DiscussionUnlinkChannelAlert":"DiscussionUnlinkGroupAlert",l.title),["br","simple_markdown"]),confirmLabel:I(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"),confirmHandler:F,confirmIsDestructive:!0})),!l&&n.a.createElement("div",null,n.a.createElement("p",{className:"section-help",dir:"auto"},I("DiscussionChannelHelp")),n.a.createElement("div",{teactFastList:!0},n.a.createElement(Ee.a,{key:"create-group",icon:"group",ripple:!0,teactOrderKey:0,className:"not-implemented"},I("DiscussionCreateGroup")),i?i.map((e,t)=>n.a.createElement(Ee.a,{key:e,teactOrderKey:t+1,className:"chat-item-clickable scroll-item",onClick:()=>{p(e),w()}},n.a.createElement(fe.a,{chatId:e}))):n.a.createElement(st.a,{key:"nothing-found",teactOrderKey:0,text:"No discussion groups found"})),n.a.createElement("p",{className:"mt-4 mb-0 section-help",dir:"auto"},I("DiscussionChannelHelp2")),n.a.createElement(Pe.a,{isOpen:N,onClose:S,header:R(),textParts:T(),confirmLabel:I("DiscussionLinkGroup"),confirmHandler:A,isButtonsInOneRow:!0})))))}));var nc=Object(n.h)(Object(s.h)((e,{chatId:t,isPromotedByCurrentUser:a})=>{const n=Object(m.g)(e,t);return{chat:n,isFormFullyDisabled:!(n.isCreator||a)}},(e,t)=>Object(h.l)(t,["updateChatMemberBannedRights"]))(({chat:e,selectedChatMemberId:t,onScreenSelect:a,updateChatMemberBannedRights:s,isFormFullyDisabled:c,onClose:o,isActive:l})=>{const[i,d]=Object(n.r)({}),[m,u]=Object(n.r)(!1),[h,b]=Object(n.r)(!1),[g,p,v]=Object(xe.a)(),O=Object(M.a)();Object(L.a)(l,o);const E=Object(n.p)(()=>{if(e&&e.fullInfo&&e.fullInfo.members)return e.fullInfo.members.find(({userId:e})=>e===t)},[e,t]);Object(n.n)(()=>{e&&e.fullInfo&&t&&!E&&a(r.g.GroupPermissions)},[e,a,E,t]),Object(n.n)(()=>{d(E&&E.bannedRights||e&&e.defaultBannedRights||{}),u(!1),b(!1)},[e,E]);const j=Object(n.m)(e=>{const{name:t}=e.target;function a(e){return!e||void 0}d(e=>({...e,[t]:a(e[t]),..."sendStickers"===t&&{sendGifs:a(e[t])}})),u(!0)},[]),f=Object(n.m)(()=>{e&&t&&(b(!0),s({chatId:e.id,userId:t,bannedRights:i}))},[e,t,i,s]),C=Object(n.m)(()=>{e&&t&&s({chatId:e.id,userId:t,bannedRights:{viewMessages:!0}})},[e,t,s]),y=Object(n.m)(t=>!!c||!(!e||!e.defaultBannedRights)&&e.defaultBannedRights[t],[e,c]);if(E)return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(je.a,{userId:E.userId})),n.a.createElement("h3",{className:"section-heading mt-4",dir:"auto"},O("UserRestrictionsCanDo")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"sendMessages",checked:!i.sendMessages,label:O("UserRestrictionsSend"),blocking:!0,disabled:y("sendMessages"),onChange:j})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"sendMedia",checked:!i.sendMedia,label:O("UserRestrictionsSendMedia"),blocking:!0,disabled:y("sendMedia"),onChange:j})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"sendStickers",checked:!i.sendStickers&&!i.sendGifs,label:O("UserRestrictionsSendStickers"),blocking:!0,disabled:y("sendStickers"),onChange:j})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"sendPolls",checked:!i.sendPolls,label:O("UserRestrictionsSendPolls"),blocking:!0,disabled:y("sendPolls"),onChange:j})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"embedLinks",checked:!i.embedLinks,label:O("UserRestrictionsEmbedLinks"),blocking:!0,disabled:y("embedLinks"),onChange:j})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"inviteUsers",checked:!i.inviteUsers,label:O("UserRestrictionsInviteUsers"),blocking:!0,disabled:y("inviteUsers"),onChange:j})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"pinMessages",checked:!i.pinMessages,label:O("UserRestrictionsPinMessages"),blocking:!0,disabled:y("pinMessages"),onChange:j})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"changeInfo",checked:!i.changeInfo,label:O("UserRestrictionsChangeInfo"),blocking:!0,disabled:y("changeInfo"),onChange:j}))),!c&&n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete-user",ripple:!0,destructive:!0,onClick:p},O("UserRestrictionsBlock")))),n.a.createElement(Dt.a,{isShown:m,onClick:f,ariaLabel:O("Save"),disabled:h},h?n.a.createElement(A.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Pe.a,{isOpen:g,onClose:v,text:"Are you sure you want to ban and remove this user from the group?",confirmLabel:"Remove",confirmHandler:C,confirmIsDestructive:!0}))}));var sc=Object(n.h)(Object(s.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),{byId:n}=e.users;return{chat:a,currentUserId:e.currentUserId,isChannel:Object(u.mb)(a),usersById:n}})(({chat:e,isChannel:t,currentUserId:a,usersById:s,onScreenSelect:c,onChatMemberSelect:o,onClose:l,isActive:i})=>{const d=Object(M.a)();Object(L.a)(i,l);const m=Object(n.p)(()=>e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort((e,t)=>e.isOwner?-1:t.isOwner?1:0):[],[e]),h=Object(n.m)(e=>{o(e.userId,e.promotedByUserId===a),c(r.g.ChatAdminRights)},[a,o,c]),b=Object(n.m)(e=>{if(e.isOwner)return d("ChannelCreator");const t=e.promotedByUserId?s[e.promotedByUserId]:void 0;return t?d("EditAdminPromotedBy",Object(u.bb)(t)):d("ChannelAdmin")},[d,s]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"recent",multiline:!0,onClick:function(){c(r.g.GroupRecentActions)}},n.a.createElement("span",{className:"title"},d("EventLog")),n.a.createElement("span",{className:"subtitle"},d(t?"EventLogInfoDetailChannel":"EventLogInfoDetail")))),n.a.createElement("div",{className:"section",dir:d.isRtl?"rtl":void 0},n.a.createElement("p",{className:"text-muted",dir:"auto"},t?"You can add administrators to help you manage your channel.":"You can add administrators to help you manage your group."),m.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable",onClick:()=>h(e)},n.a.createElement(je.a,{userId:e.userId,status:b(e),forceShowSelf:!0}))))))}));var cc=Object(n.h)(Object(s.h)((e,{chatId:t})=>({chat:Object(m.g)(e,t)}))(({chat:e,onClose:t,isActive:a})=>{const s=Object(M.a)();Object(L.a)(a,t);const c=Object(n.p)(()=>e&&e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort((e,t)=>e.isOwner?-1:t.isOwner?1:0):[],[e]),r=Object(n.m)(e=>e.isOwner?s("ChannelCreator"):s("ChannelAdmin"),[s]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section not-implemented",dir:s.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"section-heading",dir:"auto"},"Actions"),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"changeInfo",checked:!0,label:s("EventLogAllEvents"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"changeInfo",checked:!0,label:s("EventLogFilterNewAdmins"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"changeInfo",checked:!0,label:s("EventLogFilterNewMembers"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"changeInfo",checked:!0,label:s("EventLogFilterChannelInfo"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"changeInfo",checked:!0,label:s("EventLogFilterDeletedMessages"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"changeInfo",checked:!0,label:s("EventLogFilterEditedMessages"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"changeInfo",checked:!0,label:s("EventLogFilterLeavingMembers"),onChange:void 0}))),n.a.createElement("div",{className:"section not-implemented",dir:s.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"section-heading",dir:"auto"},s("Channel.Management.Title")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"changeInfo",checked:!0,label:s("EventLogAllAdmins"),onChange:void 0})),c.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable picker-list-item",onClick:void 0,ripple:!0},n.a.createElement(Zt.a,{label:"",checked:!0}),n.a.createElement(je.a,{userId:e.userId,status:r(e),forceShowSelf:!0}))))))}));var rc=Object(n.h)(Object(s.h)((e,{chatId:t,isPromotedByCurrentUser:a})=>{const n=Object(m.g)(e,t),{byId:s}=e.users,{currentUserId:c}=e;return{chat:n,usersById:s,currentUserId:c,isChannel:Object(u.mb)(n),isFormFullyDisabled:!(n.isCreator||a)}},(e,t)=>Object(h.l)(t,["updateChatAdmin"]))(({selectedChatMemberId:e,onScreenSelect:t,chat:a,usersById:s,currentUserId:c,isChannel:o,isFormFullyDisabled:l,updateChatAdmin:i,onClose:d,isActive:m})=>{const[h,b]=Object(n.r)({}),[g,p]=Object(n.r)(!1),[v,O]=Object(n.r)(!1),[E,j,f]=Object(xe.a)(),[C,y]=Object(n.r)(""),k=Object(M.a)();Object(L.a)(m,d);const N=Object(n.p)(()=>{if(a.fullInfo&&a.fullInfo.adminMembers)return a.fullInfo.adminMembers.find(({userId:t})=>t===e)},[a,e]);Object(n.n)(()=>{a&&a.fullInfo&&e&&!N&&t(r.g.ChatAdministrators)},[a,t,N,e]),Object(n.n)(()=>{b(N&&N.adminRights||{}),y((N&&N.customTitle||"").substr(0,16)),p(!1),O(!1)},[N]);const w=Object(n.m)(e=>{const{name:t}=e.target;b(e=>{return{...e,[t]:(a=e[t],!a||void 0)};var a}),p(!0)},[]),S=Object(n.m)(()=>{e&&(O(!0),i({chatId:a.id,userId:e,adminRights:h,customTitle:C}))},[a,e,h,C,i]),I=Object(n.m)(()=>{e&&(i({chatId:a.id,userId:e,adminRights:{}}),f())},[a.id,f,e,i]),P=Object(n.m)(e=>!Object(u.lb)(a)&&(!(!l&&a.adminRights)||!a.adminRights[e]),[a,l]),F=Object(n.p)(()=>{if(!N)return;if(N.isOwner)return k("ChannelCreator");const e=N.promotedByUserId?s[N.promotedByUserId]:void 0;return e?k("EditAdminPromotedBy",Object(u.bb)(e)):k("ChannelAdmin")},[N,s,k]),R=Object(n.m)(e=>{const{value:t}=e.target;y(t),p(!0)},[]);if(N)return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(je.a,{userId:N.userId,status:F,forceShowSelf:!0})),n.a.createElement("h3",{className:"section-heading mt-4",dir:"auto"},k("EditAdminWhatCanDo")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"changeInfo",checked:!!h.changeInfo,label:k(o?"EditAdminChangeChannelInfo":"EditAdminChangeGroupInfo"),blocking:!0,disabled:P("changeInfo"),onChange:w})),o&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"postMessages",checked:!!h.postMessages,label:k("EditAdminPostMessages"),blocking:!0,disabled:P("postMessages"),onChange:w})),o&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"editMessages",checked:!!h.editMessages,label:k("EditAdminEditMessages"),blocking:!0,disabled:P("editMessages"),onChange:w})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"deleteMessages",checked:!!h.deleteMessages,label:k(o?"EditAdminDeleteMessages":"EditAdminGroupDeleteMessages"),blocking:!0,disabled:P("deleteMessages"),onChange:w})),!o&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"banUsers",checked:!!h.banUsers,label:k("EditAdminBanUsers"),blocking:!0,disabled:P("banUsers"),onChange:w})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"inviteUsers",checked:!!h.inviteUsers,label:k("EditAdminAddUsers"),blocking:!0,disabled:P("inviteUsers"),onChange:w})),!o&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"pinMessages",checked:!!h.pinMessages,label:k("EditAdminPinMessages"),blocking:!0,disabled:P("pinMessages"),onChange:w})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"addAdmins",checked:!!h.addAdmins,label:k("EditAdminAddAdmins"),blocking:!0,disabled:P("addAdmins"),onChange:w})),!o&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(Zt.a,{name:"anonymous",checked:!!h.anonymous,label:k("EditAdminSendAnonymously"),blocking:!0,disabled:P("anonymous"),onChange:w})),l&&n.a.createElement("p",{className:"section-info mb-4",dir:"auto"},k("Channel.EditAdmin.CannotEdit")),!o&&n.a.createElement(ve.a,{id:"admin-title",label:k("EditAdminRank"),onChange:R,value:C,disabled:l,maxLength:16}),c!==e&&!l&&n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:j},k("EditAdminRemoveAdmin")))),n.a.createElement(Dt.a,{isShown:g,onClick:S,ariaLabel:k("Save"),disabled:v},v?n.a.createElement(A.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Pe.a,{isOpen:E,onClose:f,text:"Are you sure you want to dismiss this admin?",confirmLabel:"Dismiss",confirmHandler:I,confirmIsDestructive:!0}))}));var oc=Object(n.h)(Object(s.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),{byId:n}=e.users;return{members:a&&a.fullInfo&&a.fullInfo.members,usersById:n,isChannel:a&&Object(u.mb)(a),serverTimeOffset:e.serverTimeOffset}},(e,t)=>Object(h.l)(t,["openUserInfo"]))(({members:e,usersById:t,isChannel:a,openUserInfo:s,onClose:c,isActive:r,serverTimeOffset:o})=>{const l=Object(n.p)(()=>{if(e&&t)return Object(u.Jb)(e.map(({userId:e})=>e),t,void 0,o)},[e,o,t]),i=Object(n.m)(e=>{s({id:e})},[s]);return Object(L.a)(r,c),n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",teactFastList:!0},l?l.map((e,t)=>n.a.createElement(Ee.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>i(e)},n.a.createElement(je.a,{userId:e,forceShowSelf:!0}))):n.a.createElement(st.a,{teactOrderKey:0,key:"nothing-found",text:a?"No subscribers found":"No members found"}))))}));var lc=Object(n.h)(Object(s.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),{byId:n}=e.users;return{members:a&&a.fullInfo&&a.fullInfo.members,usersById:n,isChannel:a&&Object(u.mb)(a),serverTimeOffset:e.serverTimeOffset}})(({usersById:e,members:t,isChannel:a,onScreenSelect:s,onChatMemberSelect:c,onClose:o,isActive:l,serverTimeOffset:i})=>{Object(L.a)(l,o);const d=Object(n.p)(()=>{if(t&&e)return Object(u.Jb)(t.filter(e=>!e.isOwner).map(({userId:e})=>e),e,void 0,i)},[t,i,e]),m=Object(n.m)(e=>{c(e),s(r.g.GroupUserPermissions)},[c,s]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",teactFastList:!0},d?d.map((e,t)=>n.a.createElement(Ee.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>m(e)},n.a.createElement(je.a,{userId:e,forceShowSelf:!0}))):n.a.createElement(st.a,{teactOrderKey:0,key:"nothing-found",text:a?"No subscribers found":"No members found"}))))}));var ic=Object(n.h)(Object(s.h)(e=>({managementType:Object(m.v)(e)}))(({chatId:e,currentScreen:t,selectedChatMemberId:a,isPromotedByCurrentUser:s,onScreenSelect:c,onChatMemberSelect:o,onClose:l,isActive:i,managementType:d})=>{switch(t){case r.g.Initial:switch(d){case"user":return n.a.createElement(Ys,{key:e,userId:e,onClose:l,isActive:i});case"group":return n.a.createElement(Qs,{key:e,chatId:e,onScreenSelect:c,onClose:l,isActive:i||[r.g.ChatPrivacyType,r.g.Discussion,r.g.GroupPermissions,r.g.ChatAdministrators,r.g.GroupRemovedUsers,r.g.GroupUserPermissionsCreate,r.g.GroupUserPermissions,r.g.ChatAdminRights,r.g.GroupRecentActions].includes(t)});case"channel":return n.a.createElement(Xs,{key:e,chatId:e,onScreenSelect:c,onClose:l,isActive:i||[r.g.ChannelSubscribers,r.g.ChatAdministrators,r.g.Discussion,r.g.ChatPrivacyType,r.g.ChatAdminRights,r.g.GroupRecentActions].includes(t)})}break;case r.g.ChatPrivacyType:return n.a.createElement(tc,{chatId:e,isActive:i,onClose:l});case r.g.Discussion:return n.a.createElement(ac,{chatId:e,onScreenSelect:c,isActive:i,onClose:l});case r.g.GroupPermissions:return n.a.createElement(Zs,{chatId:e,onScreenSelect:c,onChatMemberSelect:o,isActive:i||[r.g.GroupRemovedUsers,r.g.GroupUserPermissionsCreate,r.g.GroupUserPermissions].includes(t),onClose:l});case r.g.GroupRemovedUsers:return n.a.createElement(Js,{chatId:e,isActive:i,onClose:l});case r.g.GroupUserPermissionsCreate:return n.a.createElement(lc,{chatId:e,onChatMemberSelect:o,onScreenSelect:c,isActive:i||[r.g.GroupUserPermissions].includes(t),onClose:l});case r.g.GroupUserPermissions:return n.a.createElement(nc,{chatId:e,selectedChatMemberId:a,isPromotedByCurrentUser:s,onScreenSelect:c,isActive:i,onClose:l});case r.g.ChatAdministrators:return n.a.createElement(sc,{chatId:e,onScreenSelect:c,onChatMemberSelect:o,isActive:i||[r.g.ChatAdminRights,r.g.GroupRecentActions].includes(t),onClose:l});case r.g.GroupRecentActions:return n.a.createElement(cc,{chatId:e,isActive:i,onClose:l});case r.g.ChatAdminRights:return n.a.createElement(rc,{chatId:e,selectedChatMemberId:a,isPromotedByCurrentUser:s,onScreenSelect:c,isActive:i,onClose:l});case r.g.ChannelSubscribers:case r.g.GroupMembers:return n.a.createElement(oc,{chatId:e,isActive:i,onClose:l})}}));const dc={USD:"$",EUR:"€",GBP:"£",JPY:"¥",RUB:"₽",UAH:"₴",INR:"₹",AED:"د.إ"};function mc(e){return e&&dc[e]||""}const uc=/^4[0-9]{12}(?:[0-9]{1,3})?$/,hc=/^5[1-5][0-9]{11,14}$/,bc=/^2[2-7][0-9]{11,14}$/;let gc;!function(e){e[e.Default=0]="Default",e[e.Visa=1]="Visa",e[e.Mastercard=2]="Mastercard"}(gc||(gc={}));const pc={[gc.Default]:"",[gc.Visa]:"visa",[gc.Mastercard]:"mastercard"};function vc(e){return e=e.replace(/\s/g,""),uc.test(e)?gc.Visa:hc.test(e)||bc.test(e)?gc.Mastercard:gc.Default}var Oc=a(61);const Ec={streetLine1:"",streetLine2:"",city:"",state:"",countryIso2:"",postCode:"",fullName:"",email:"",phone:"",shipping:"",cardNumber:"",cardholder:"",expiry:"",cvv:"",billingCountry:"",billingZip:"",saveInfo:!0,saveCredentials:!1,formErrors:{}},jc=(e,t)=>{switch(t.type){case"changeAddress1":return{...e,streetLine1:t.payload,formErrors:{...e.formErrors,streetLine1:void 0}};case"changeAddress2":return{...e,streetLine2:t.payload,formErrors:{...e.formErrors,streetLine2:void 0}};case"changeCity":return{...e,city:t.payload,formErrors:{...e.formErrors,city:void 0}};case"changeState":return{...e,state:t.payload,formErrors:{...e.formErrors,state:void 0}};case"changeCountry":return{...e,countryIso2:t.payload,billingCountry:fc(t.payload),formErrors:{...e.formErrors,countryIso2:void 0}};case"changePostCode":return{...e,postCode:t.payload,formErrors:{...e.formErrors,postCode:void 0}};case"changeFullName":return{...e,fullName:t.payload,formErrors:{...e.formErrors,fullName:void 0}};case"changeEmail":return{...e,email:t.payload,formErrors:{...e.formErrors,email:void 0}};case"changePhone":return{...e,phone:t.payload,formErrors:{...e.formErrors,phone:void 0}};case"changeShipping":return{...e,shipping:t.payload};case"changeCardNumber":return{...e,cardNumber:t.payload,formErrors:{...e.formErrors,cardNumber:void 0}};case"changeCardholder":return{...e,cardholder:t.payload,formErrors:{...e.formErrors,cardholder:void 0}};case"changeExpiryDate":return{...e,expiry:t.payload,formErrors:{...e.formErrors,expiry:void 0}};case"changeCvvCode":return{...e,cvv:t.payload,formErrors:{...e.formErrors,cvv:void 0}};case"changeBillingCountry":return{...e,billingCountry:t.payload,formErrors:{...e.formErrors,billingCountry:void 0}};case"changeBillingZip":return{...e,billingZip:t.payload,formErrors:{...e.formErrors,billingZip:void 0}};case"changeSaveInfo":return{...e,saveInfo:t.payload};case"changeSaveCredentials":return{...e,saveCredentials:t.payload};case"updateUserInfo":return t.payload.countryIso2?{...e,...t.payload,billingCountry:fc(t.payload.countryIso2)}:{...e,...t.payload};case"setFormErrors":return{...e,formErrors:{...e.formErrors,...t.payload}};default:return e}};function fc(e){const t=At.a.find(({id:t})=>t===e);return t?t.name:""}function Cc(e,t=400){Object(n.n)(()=>{l.n||setTimeout(()=>{Object(V.b)(()=>{e.current&&e.current.focus()})},t)},[e,t])}var yc=Object(n.h)(e=>{const{id:t,value:a,label:s,hasArrow:c,error:r,ref:o,placeholder:l,onChange:i,children:d}=e,m=r||s,u=Object(W.a)("input-group",a&&"touched",r&&"error",m&&"with-label",c&&"with-arrow","input-group");return n.a.createElement("div",{className:u},n.a.createElement("select",{className:"form-control",id:t,value:a||"",onChange:i,placeholder:l||s,ref:o},d),m&&t&&n.a.createElement("label",{htmlFor:t},m))});a(320);var kc=Object(n.h)(({state:e,needEmail:t,needPhone:a,needName:s,needAddress:c,dispatch:r})=>{const o=Object(n.q)(null),l=Object(n.q)(null),i=Object(n.q)(null);Object(n.n)(()=>{i.current&&i.current.value!==e.countryIso2&&(i.current.value=e.countryIso2)},[e.countryIso2]);const d=Object(M.a)();Cc(o);const m=Object(n.m)(e=>{r({type:"changeAddress1",payload:e.target.value})},[r]),u=Object(n.m)(e=>{r({type:"changeAddress2",payload:e.target.value})},[r]),h=Object(n.m)(e=>{r({type:"changeCity",payload:e.target.value})},[r]),b=Object(n.m)(e=>{r({type:"changeState",payload:e.target.value})},[r]),g=Object(n.m)(e=>{r({type:"changeCountry",payload:e.target.value})},[r]),p=Object(n.m)(e=>{r({type:"changePostCode",payload:e.target.value})},[r]),v=Object(n.m)(e=>{r({type:"changeFullName",payload:e.target.value})},[r]),O=Object(n.m)(e=>{r({type:"changeEmail",payload:e.target.value})},[r]),E=Object(n.m)(e=>{let{value:t}=e.target;t="+"+t.replace(/\D/g,""),l.current&&(l.current.value=t),r({type:"changePhone",payload:t})},[r]),j=Object(n.m)(e=>{r({type:"changeSaveInfo",payload:e.target.value})},[r]),{formErrors:f}=e;return n.a.createElement("div",{className:"ShippingInfo"},n.a.createElement("form",null,c?n.a.createElement("div",null,n.a.createElement("h5",null,d("PaymentShippingAddress")),n.a.createElement(ve.a,{ref:o,label:"Address1 (Street)",onChange:m,value:e.streetLine1,inputMode:"text",error:f.streetLine1}),n.a.createElement(ve.a,{label:"Address2 (Street)",onChange:u,value:e.streetLine2,inputMode:"text",error:f.streetLine2}),n.a.createElement(ve.a,{label:"City",onChange:h,value:e.city,inputMode:"text",error:f.city}),n.a.createElement(ve.a,{label:"State",onChange:b,value:e.state,inputMode:"text",error:f.state}),n.a.createElement(yc,{label:"Country",placeholder:"Country",onChange:g,value:e.countryIso2,hasArrow:Boolean(!0),id:"shipping-country",error:f.countryIso2,ref:i},At.a.map(({name:e,id:t})=>n.a.createElement("option",{value:t,className:"county-item"},e))),n.a.createElement(ve.a,{label:"Post Code",onChange:p,value:e.postCode,inputMode:"text",error:f.postCode})):void 0,s||t||a?n.a.createElement("h5",null,d("PaymentShippingReceiver")):void 0,s&&n.a.createElement(ve.a,{label:"Full name",onChange:v,value:e.fullName,inputMode:"text",error:f.fullName}),t&&n.a.createElement(ve.a,{label:"Email",onChange:O,value:e.email,inputMode:"email",error:f.email}),a&&n.a.createElement(ve.a,{label:"Phone number",onChange:E,value:e.phone,inputMode:"tel",error:f.phone,ref:l}),n.a.createElement(Zt.a,{label:d("PaymentShippingSave"),subLabel:d("PaymentShippingSaveInfo"),checked:Boolean(e.saveInfo),onChange:j})))});a(321);var Nc=Object(n.h)(({state:e,shippingOptions:t,currency:a,dispatch:s})=>{Object(n.n)(()=>{t&&!e.shipping&&s({type:"changeShipping",payload:t[0].id})},[t,e.shipping,s]);const c=Object(n.m)(e=>{s({type:"changeShipping",payload:e})},[s]),r=Object(n.p)(()=>t.map(({id:e,title:t,amount:n})=>({label:t,subLabel:`${a} ${String(n/100)}`,value:e})),[t,a]);return n.a.createElement("div",{className:"Shipping"},n.a.createElement("form",null,n.a.createElement("p",null,"Select shipping method"),n.a.createElement(qe.a,{name:"shipping-options",options:r,onChange:c,selected:e.shipping})))});a(322);function wc(e,t,a,s=!1){return n.a.createElement("div",{className:"price-info-item "+(s?"price-info-item-main":"")},n.a.createElement("div",{className:"title"},e),n.a.createElement("div",{className:"value"},`${a||""} ${(t/100).toFixed(2)}`))}function Sc(e,t,a){return n.a.createElement("div",{className:"checkout-info-item"},n.a.createElement("i",{className:e}," "),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"title"},t),n.a.createElement("p",{className:"data"},a)))}var Ic=Object(n.h)(({invoiceContent:e,prices:t,shippingPrices:a,checkoutInfo:s,currency:c,totalPrice:r})=>{const{photoUrl:o,title:l,text:i}=e||{},{paymentMethod:d,paymentProvider:m,shippingAddress:u,name:h,phone:b,shippingMethod:g}=s||{};return n.a.createElement("div",{className:"Checkout"},n.a.createElement("div",{className:"description has-image"},o&&n.a.createElement("img",{src:o,alt:""}),n.a.createElement("div",{className:"text"},n.a.createElement("h5",null,l),n.a.createElement("p",null,i))),n.a.createElement("div",{className:"price-info"},t&&t.map(e=>wc(e.label,e.amount,c,!1)),a&&a.map(e=>wc(e.label,e.amount,c,!1)),void 0!==r&&wc("Total",r,c,!0)),n.a.createElement("div",{className:"invoice-info"},d&&Sc("icon-card",d,"Payment method"),m&&Sc("stripe-provider",m,"Payment provider"),u&&Sc("icon-location",u,"Shipping address"),h&&Sc("icon-user",h,"Name"),b&&Sc("icon-phone",b,"Phone number"),g&&Sc("icon-truck",g,"Shipping method")))});var Pc=Object(n.h)(({value:e,error:t,onChange:a})=>{const s=Object(n.q)(null),c=Object(n.m)(t=>{if("Backspace"===t.key&&"/"===e.charAt(e.length-1)){const t=e.slice(0,e.length-1);s.current&&(s.current.value=t)}},[e]),r=Object(n.m)(e=>{a(function(e){const t=(e=e.replace(/[^\d]/g,"").slice(0,4)).match(/.{1,2}/g);return t&&t[0]&&Number(t[0])>12&&(t[0]="12"),t&&t[0]&&2===t[0].length&&!t[1]&&(t[1]=""),t?t.join("/"):""}(e.target.value))},[a]);return n.a.createElement(ve.a,{label:"Expiry date",ref:s,onChange:r,onKeyDown:c,value:e,error:t,inputMode:"numeric",maxLength:5})}),Fc=(a(323),a.p+"mastercard.4216118edafe23cc2dec7b8807ba4622.svg"),Mc=a.p+"visa.e5a7c336e1deb4b92a636e2e053878c4.svg";var Lc=Object(n.h)(({value:e,error:t,onChange:a})=>{const s=Object(n.q)(null);Cc(s);const[c,r]=Object(n.r)(gc.Default);Object(n.n)(()=>{const t=vc(e);r(t)},[]);const o=Object(n.m)(e=>{const t=function(e){const t=(e=e.replace(/[^\d]/g,"")).match(/.{1,4}/g);return t?t.join(" "):""}(e.target.value),n=vc(e.target.value);r(n),a(t),s.current&&(s.current.value=t)},[a,s]),l=function(e){switch(e){case gc.Mastercard:return n.a.createElement("img",{src:Fc,alt:""});case gc.Visa:return n.a.createElement("img",{src:Mc,alt:""});default:return}}(c);return n.a.createElement("div",{className:"CardInput"},n.a.createElement("span",{className:"left-addon"},l),n.a.createElement(ve.a,{ref:s,label:"Card number",onChange:o,value:e,inputMode:"numeric",className:c?"has-left-addon":"",error:t,maxLength:23}))});a(324);var Ac=Object(n.h)(({state:e,canSaveCredentials:t,needCardholderName:a,needCountry:s,needZip:c,dispatch:r})=>{const o=Object(n.q)(null);Object(n.n)(()=>{o.current&&o.current.value!==e.billingCountry&&(o.current.value=e.billingCountry)},[e.billingCountry]);const l=Object(n.m)(e=>{r({type:"changeCardNumber",payload:e})},[r]),i=Object(n.m)(e=>{r({type:"changeCardholder",payload:e.target.value.toUpperCase()})},[r]),d=Object(n.m)(e=>{r({type:"changeExpiryDate",payload:e})},[r]),m=Object(n.m)(e=>{r({type:"changeCvvCode",payload:e.target.value})},[r]),u=Object(n.m)(e=>{r({type:"changeBillingCountry",payload:e.target.value})},[r]),h=Object(n.m)(e=>{r({type:"changeBillingZip",payload:e.target.value})},[r]),b=Object(n.m)(e=>{r({type:"changeSaveCredentials",payload:e.target.value})},[r]),g=Object(M.a)(),{formErrors:p={}}=e;return n.a.createElement("div",{className:"PaymentInfo"},n.a.createElement("form",null,n.a.createElement("h5",null,g("PaymentCardTitle")),n.a.createElement(Lc,{onChange:l,value:e.cardNumber,error:p.cardNumber}),a&&n.a.createElement(ve.a,{label:"Name on card",onChange:i,value:e.cardholder,inputMode:"text",error:p.cardholder}),n.a.createElement("section",{className:"inline-inputs"},n.a.createElement(Pc,{value:e.expiry,onChange:d,error:p.expiry}),n.a.createElement(ve.a,{label:"CVV code",onChange:m,value:e.cvv,inputMode:"numeric",maxLength:3,error:p.cvv})),s||c?n.a.createElement("h5",null,g("PaymentBillingAddress")):void 0,s&&n.a.createElement(yc,{label:"Country",placeholder:"Country",onChange:u,value:e.billingCountry,hasArrow:Boolean(!0),id:"billing-country",error:p.billingCountry,ref:o},At.a.map(({name:e})=>n.a.createElement("option",{value:e,className:"county-item"},e))),c&&n.a.createElement(ve.a,{label:"Post Code",onChange:h,value:e.billingZip,inputMode:"text",error:p.billingZip}),t&&n.a.createElement(Zt.a,{label:g("PaymentCardSavePaymentInformation"),checked:e.saveCredentials,onChange:b})))});a(196);var Rc=Object(n.h)(Object(s.h)(e=>{const{step:t,shippingOptions:a,savedInfo:n,canSaveCredentials:s,invoice:c,invoiceContent:r,nativeProvider:o,nativeParams:l,passwordMissing:i,error:d}=e.payment,m=Boolean(c&&(!o||"stripe"!==o)),{needCardholderName:u,needCountry:h,needZip:b}=l||{},{nameRequested:g,phoneRequested:p,emailRequested:v,shippingAddressRequested:O,flexible:E,phoneToProvider:j,emailToProvider:f,currency:C,prices:y}=c||{};return{step:t,shippingOptions:a,savedInfo:n,canSaveCredentials:s,nativeProvider:o,passwordMissing:i,nameRequested:g,shippingAddressRequested:O,phoneRequested:p,emailRequested:v,flexible:E,phoneToProvider:j,emailToProvider:f,currency:C,prices:y,isProviderError:m,invoiceContent:r,needCardholderName:u,needCountry:h,needZip:b,error:d,globalDialogs:e.dialogs}},(e,t)=>Object(h.l)(t,["validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError"]))(({isOpen:e,onClose:t,step:a,shippingOptions:s,savedInfo:c,canSaveCredentials:o,nameRequested:l,shippingAddressRequested:i,phoneRequested:d,emailRequested:m,phoneToProvider:u,emailToProvider:h,currency:b,passwordMissing:g,isProviderError:p,invoiceContent:v,nativeProvider:O,prices:E,needCardholderName:j,needCountry:f,needZip:C,error:y,globalDialogs:k,validateRequestedInfo:N,sendPaymentForm:w,setPaymentStep:S,sendCredentialsInfo:I,clearPaymentError:P})=>{const[F,L]=Object(Pt.a)(jc,Ec),R=mc(b),[B,U]=Object(n.r)(!1),x=Object(M.a)();Object(n.n)(()=>{(a||y||k)&&U(!1)},[a,y,k]),Object(n.n)(()=>{if(y&&y.field)L({type:"setFormErrors",payload:{[y.field]:y.fieldError}});else if(k&&k.length){const e=Object(Oc.a)(k);L({type:"setFormErrors",payload:{...e}})}},[y,k,L]),Object(n.n)(()=>{if(c){const{name:e,phone:t,email:a,shippingAddress:n}=c;L({type:"updateUserInfo",payload:{fullName:e,phone:t&&"+"!==t.charAt(0)?"+"+t:t,email:a,...n||{}}})}},[c,L]);const G=Object(n.m)(()=>{P()},[P]),z=Object(n.p)(()=>a!==r.j.Checkout?0:function(e=[],t,a){const n=t?Dc(t,a):[];let s=0;const c=e.concat(n||[]);return s=c.reduce((e,t)=>e+t.amount,s),s}(E,s,F.shipping),[a,F.shipping,E,s]),q=Object(n.p)(()=>{if(a===r.j.Checkout)return function(e,t,a){const n=`${function(e){const t=vc(e);return pc[t]||""}(e.cardNumber)} *${e.cardNumber.slice(-4)}`,s=e.streetLine1?`${e.streetLine1}, ${e.city}, ${e.countryIso2}`:void 0,{phone:c,fullName:r}=e,o=t?Tc(t,e.shipping):void 0,l=o?o.title:void 0;return{paymentMethod:n,paymentProvider:a,shippingAddress:s,name:r,phone:c,shippingMethod:l}}(F,s,O||"")},[a,F,s,O]);const _=Object(n.m)(()=>{const{saveInfo:e}=F,t=function(e){const{streetLine1:t,streetLine2:a,city:n,state:s,countryIso2:c,postCode:r,fullName:o,phone:l,email:i}=e;return{name:o,phone:l,email:i,shippingAddress:{streetLine1:t,streetLine2:a,city:n,state:s,countryIso2:c,postCode:r}}}(F);N({requestInfo:t,saveInfo:e})},[N,F]),H=Object(n.m)(()=>{const e=function(e){const{cardNumber:t,cardholder:a,expiry:n,cvv:s,billingCountry:c,billingZip:r}=e,[o,l]=n.split("/");return{data:{cardNumber:t,cardholder:a,expiryMonth:o,expiryYear:l,cvv:s,country:c,zip:r}}}(F);I({credentials:e})},[I,F]),$=Object(n.m)(()=>{w({shippingOptionId:F.shipping,saveCredentials:F.saveCredentials})},[w,F]),V=Object(n.m)(e=>{S({step:e})},[S]),W=Object(n.m)(()=>{switch(U(!0),a){case r.j.ShippingInfo:return _();case r.j.Shipping:return V(r.j.PaymentInfo);case r.j.PaymentInfo:return H();case r.j.Checkout:return $();default:return()=>{}}},[a,_,V,H,$]),K=Object(n.p)(()=>{switch(a){case r.j.ShippingInfo:return x("PaymentShippingInfo");case r.j.Shipping:return x("PaymentShippingMethod");case r.j.PaymentInfo:return x("PaymentCardInfo");case r.j.Checkout:return x("PaymentCheckout");default:return""}},[a,x]),Y=Object(n.p)(()=>{switch(a){case r.j.Checkout:return x("Checkout.PayPrice",`${R}${(z/100).toFixed(2)}`);default:return x("Next")}},[a,x,R,z]);return p?n.a.createElement(pe.a,{className:"error",isOpen:e,onClose:t},n.a.createElement("p",null,"Sorry, Telegram WebZ doesn't support payments with this provider yet. ",n.a.createElement("br",null),"Please use one of our mobile apps to do this."),n.a.createElement(D.a,{isText:!0,onClick:t},x("OK"))):n.a.createElement(pe.a,{className:"PaymentModal",isOpen:e,onClose:t},n.a.createElement("div",{className:"header",dir:x.isRtl?"rtl":void 0},n.a.createElement(D.a,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h3",null,K)),void 0!==a?n.a.createElement(T.a,{name:"slide",activeKey:a},()=>n.a.createElement("div",{className:"content custom-scroll"},function(e){switch(e){case r.j.ShippingInfo:return n.a.createElement(kc,{state:F,dispatch:L,needAddress:Boolean(i),needEmail:Boolean(m||h),needPhone:Boolean(d||u),needName:Boolean(l)});case r.j.Shipping:return n.a.createElement(Nc,{state:F,dispatch:L,shippingOptions:s||[],currency:R});case r.j.PaymentInfo:return n.a.createElement(Ac,{state:F,dispatch:L,canSaveCredentials:Boolean(!g&&o),needCardholderName:j,needCountry:f,needZip:C});case r.j.Checkout:return n.a.createElement(Ic,{prices:E,shippingPrices:F.shipping&&s?Dc(s,F.shipping):void 0,totalPrice:z,invoiceContent:v,checkoutInfo:q,currency:R});default:return}}(a))):n.a.createElement("div",{className:"empty-content"},n.a.createElement(A.a,{color:"gray"})),n.a.createElement("div",{className:"footer"},n.a.createElement(D.a,{type:"submit",onClick:W,disabled:B,isLoading:B},Y)),y&&!y.field&&function(){if(y)return n.a.createElement(pe.a,{className:"error",isOpen:Boolean(y),onClose:G},n.a.createElement("h4",null,y.description||"Error"),n.a.createElement("p",null,y.description||"Error"),n.a.createElement(D.a,{isText:!0,onClick:P},x("OK")))}())}));function Tc(e,t){return e.find(({id:e})=>e===t)}function Dc(e,t){const a=Tc(e,t);return a?a.prices:void 0}var Bc=Object(n.h)(Object(s.h)(e=>{const{receipt:t}=e.payment,{currency:a,prices:n,info:s,totalAmount:c,credentialsTitle:r,shippingPrices:o,shippingMethod:l,photoUrl:i,text:d,title:m}=t||{};return{currency:a,prices:n,info:s,totalAmount:c,credentialsTitle:r,shippingPrices:o,shippingMethod:l,photoUrl:i,text:d,title:m}})(({isOpen:e,onClose:t,prices:a,shippingPrices:s,totalAmount:c,currency:r,info:o,photoUrl:l,text:i,title:d,credentialsTitle:m,shippingMethod:u})=>{const h=Object(M.a)(),b=mc(r),g=Object(n.p)(()=>function(e,t,a){if(!t)return{paymentMethod:e};const{shippingAddress:n}=t,s=n&&n.streetLine1?`${n.streetLine1}, ${n.city}, ${n.countryIso2}`:void 0,{phone:c,name:r}=t;return{paymentMethod:e,paymentProvider:"Stripe",shippingAddress:s,name:r,phone:c,shippingMethod:a}}(m,o,u),[o,u,m]);return n.a.createElement(pe.a,{className:"PaymentModal PaymentModal-receipt",isOpen:e,onClose:t},n.a.createElement("div",null,n.a.createElement("div",{className:"header",dir:h.isRtl?"rtl":void 0},n.a.createElement(D.a,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h3",null," ",h("PaymentReceipt")," ")),n.a.createElement("div",{className:"receipt-content custom-scroll"},n.a.createElement(Ic,{prices:a,shippingPrices:s,totalPrice:c,invoiceContent:{photoUrl:l,text:i,title:d},checkoutInfo:g,currency:b}))))}))},132:function(e,t,a){"use strict";a.d(t,"a",(function(){return r}));var n=a(8),s=a(57);const c={MonkeyIdle:a.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs",MonkeyTracking:a.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs",MonkeyClose:a.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs",MonkeyPeek:a.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs",FoldersAll:a.p+"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs",FoldersNew:a.p+"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs",DiscussionGroups:a.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs"};function r(e){const t=c[e].replace(window.location.origin,"");return s.b("file"+t,n.ApiMediaFormat.Lottie)}},136:function(e,t,a){"use strict";var n=a(0),s=a(9),c=a(2),r=a(17),o=a(16),l=a(21),i=a(112),d=a(20);a(156);const m={type:"blob",quality:.8,format:"jpeg",circle:!1};let u,h,b;var g=Object(n.h)(({file:e,onChange:t,onClose:s})=>{const[g,p]=Object(n.r)(!1);Object(n.n)(()=>{e&&(g?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:a,offsetHeight:n}=t;b=new u(t,{enableZoom:!0,boundary:{width:a,height:n},viewport:{width:a-16,height:n-16,type:"circle"}});const s=await Object(r.a)(e);await b.bind({url:s})}catch(e){c.r&&console.error(e)}}(e):async function(){return h||(h=Promise.all([a.e(6),a.e(8)]).then(a.bind(null,333)),u=(await h).default),h}().then(()=>p(!0)))},[e,g]);const v=Object(o.a)();return n.a.createElement(i.a,{isOpen:Boolean(e),onClose:s,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},g?n.a.createElement("div",{id:"avatar-crop"}):n.a.createElement(d.a,null),n.a.createElement(l.a,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!b)return;const e=await b.result(m),a="string"==typeof e?e:Object(r.b)(e,"avatar.jpg");t(a)},ariaLabel:v("CropImage")},n.a.createElement("i",{className:"icon-check"})))});a(157);t.a=Object(n.h)(({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:a,onChange:c})=>{const[r,o]=Object(n.r)(),[l,i]=Object(n.r)(a);Object(n.n)(()=>{i(a)},[a]);const d=Object(s.a)(l&&"filled",t&&"disabled");return n.a.createElement("div",{className:"AvatarEditable"},n.a.createElement("label",{className:d,role:"button",tabIndex:0,title:e},n.a.createElement("input",{type:"file",onChange:function(e){const t=e.target;t&&t.files&&t.files[0]&&(o(t.files[0]),t.value="")},accept:"image/png, image/jpeg"}),n.a.createElement("i",{className:"icon-camera-add"}),l&&n.a.createElement("img",{src:l,alt:"Avatar"})),n.a.createElement(g,{file:r,onClose:function(){o(void 0)},onChange:function(e){o(void 0),c(e),l&&URL.revokeObjectURL(l),i(URL.createObjectURL(e))}}))})},144:function(e,t,a){},153:function(e,t,a){"use strict";var n=a(0),s=a(2),c=a(6),r=a(132),o=a(119);a(144);const l=[0,50],i=[0,20],d=[20,0],m=c.l?s.Db:s.Cb;t.a=Object(n.h)(({isPasswordVisible:e,isBig:t})=>{const[a,c]=Object(n.r)(),[u,h]=Object(n.r)(),[b,g]=Object(n.r)(!1),[p,v]=Object(n.r)(!1);Object(n.n)(()=>{a?setTimeout(()=>v(!0),2e3):Object(r.a)("MonkeyClose").then(c)},[a]),Object(n.n)(()=>{u||Object(r.a)("MonkeyPeek").then(h)},[u]);const O=Object(n.m)(()=>g(!0),[]);return n.a.createElement("div",{id:"monkey",className:t?"big":""},!b&&n.a.createElement("div",{className:"monkey-preview"}),a&&n.a.createElement(o.a,{id:"closeMonkey",size:t?s.Ob:m,className:p?"hidden":"shown",animationData:a,playSegment:l,noLoop:!0,onLoad:O}),u&&n.a.createElement(o.a,{id:"peekMonkey",size:t?s.Ob:m,className:p?"shown":"hidden",animationData:u,playSegment:e?i:d,noLoop:!0}))})},154:function(e,t,a){"use strict";var n=a(0),s=a(2),c=a(6),r=a(9),o=a(16),l=a(21);const i=c.l?550:400;t.a=Object(n.h)(({isLoading:e=!1,isPasswordVisible:t,error:a,hint:d,placeholder:m="Password",submitLabel:u="Next",clearError:h,onChangePasswordVisibility:b,onInputChange:g,onSubmit:p})=>{const v=Object(n.q)(null),O=Object(o.a)(),[E,j]=Object(n.r)(""),[f,C]=Object(n.r)(!1);return Object(n.n)(()=>{c.n||setTimeout(()=>{v.current.focus()},i)},[]),Object(n.n)(()=>{a&&requestAnimationFrame(()=>{v.current.focus(),v.current.select()})},[a]),n.a.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||f&&p(E)},autoComplete:"off"},n.a.createElement("div",{className:Object(r.a)("input-group password-input",E&&"touched",a&&"error"),dir:O.isRtl?"rtl":void 0},n.a.createElement("input",{ref:v,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:E||"",autoComplete:"current-password",onChange:function(e){a&&h();const{target:t}=e;j(t.value),C(t.value.length>=s.jb),g&&g(t.value)},dir:"auto"}),n.a.createElement("label",null,a||d||m),n.a.createElement("div",{className:"toggle-password",onClick:function(){b(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},n.a.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),f&&n.a.createElement(l.a,{type:"submit",ripple:!0,isLoading:e},u))})},156:function(e,t,a){},157:function(e,t,a){},174:function(e,t,a){},196:function(e,t,a){},267:function(e,t,a){},268:function(e,t,a){},269:function(e,t,a){},270:function(e,t,a){},271:function(e,t,a){},272:function(e,t,a){},273:function(e,t,a){},274:function(e,t,a){},275:function(e,t,a){},276:function(e,t,a){},277:function(e,t,a){},278:function(e,t,a){},279:function(e,t,a){},280:function(e,t,a){},281:function(e,t,a){},282:function(e,t,a){},283:function(e,t,a){},284:function(e,t,a){},285:function(e,t,a){},286:function(e,t,a){},287:function(e,t,a){},288:function(e,t,a){},289:function(e,t,a){},290:function(e,t,a){},291:function(e,t,a){},292:function(e,t,a){},293:function(e,t,a){},294:function(e,t,a){},295:function(e,t,a){},296:function(e,t,a){},297:function(e,t,a){},298:function(e,t,a){},299:function(e,t,a){},300:function(e,t,a){},301:function(e,t,a){},302:function(e,t,a){},303:function(e,t,a){},304:function(e,t,a){},305:function(e,t,a){},306:function(e,t,a){},307:function(e,t,a){},308:function(e,t,a){},309:function(e,t,a){},310:function(e,t,a){},311:function(e,t,a){},312:function(e,t,a){},313:function(e,t,a){},314:function(e,t,a){},315:function(e,t,a){},316:function(e,t,a){},317:function(e,t,a){},318:function(e,t,a){},319:function(e,t,a){},320:function(e,t,a){},321:function(e,t,a){},322:function(e,t,a){},323:function(e,t,a){},324:function(e,t,a){}}]); +//# sourceMappingURL=3.356913bd8f5c1b421f79.js.map \ No newline at end of file diff --git a/dist/3.356913bd8f5c1b421f79.js.map b/dist/3.356913bd8f5c1b421f79.js.map new file mode 100644 index 000000000..1b1860640 --- /dev/null +++ b/dist/3.356913bd8f5c1b421f79.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/mediaViewer/helpers/ghostAnimation.ts","webpack:///./src/components/mediaViewer/SenderInfo.tsx","webpack:///./src/components/mediaViewer/MediaViewerActions.tsx","webpack:///./src/components/mediaViewer/MediaViewerFooter.tsx","webpack:///./src/hooks/useFullscreen.ts","webpack:///./src/components/mediaViewer/helpers/formatFileSize.ts","webpack:///./src/components/mediaViewer/VideoPlayerControls.tsx","webpack:///./src/components/mediaViewer/VideoPlayer.tsx","webpack:///./src/components/mediaViewer/ZoomControls.tsx","webpack:///./src/components/mediaViewer/PanZoom.tsx","webpack:///./src/components/mediaViewer/MediaViewer.tsx","webpack:///./src/components/main/ForwardPicker.tsx","webpack:///./src/components/main/Dialogs.tsx","webpack:///./src/components/main/Notifications.tsx","webpack:///./src/components/main/SafeLinkModal.tsx","webpack:///./src/components/common/CalendarModal.tsx","webpack:///./src/components/main/HistoryCalendar.tsx","webpack:///./src/components/common/DeleteMessageModal.tsx","webpack:///./src/components/common/PinMessageModal.tsx","webpack:///./src/components/common/UnpinAllMessagesModal.tsx","webpack:///./src/components/middle/DeleteSelectedMessageModal.tsx","webpack:///./src/components/common/ReportMessageModal.tsx","webpack:///./src/components/middle/MessageSelectToolbar.tsx","webpack:///./src/hooks/useSelectWithEnter.ts","webpack:///./src/components/left/search/LeftSearchResultChat.tsx","webpack:///./src/components/left/search/RecentContacts.tsx","webpack:///./src/components/left/search/ChatMessage.tsx","webpack:///./src/components/left/search/DateSuggest.tsx","webpack:///./src/components/left/search/ChatResults.tsx","webpack:///./src/components/left/search/ChatMessageResults.tsx","webpack:///./src/components/left/search/helpers/createMapStateToProps.ts","webpack:///./src/components/left/search/MediaResults.tsx","webpack:///./src/components/left/search/helpers/getSenderName.ts","webpack:///./src/components/left/search/LinkResults.tsx","webpack:///./src/components/left/search/FileResults.tsx","webpack:///./src/components/left/search/AudioResults.tsx","webpack:///./src/components/left/search/LeftSearch.tsx","webpack:///./src/hooks/reducers/useTwoFaReducer.ts","webpack:///./src/components/left/settings/SettingsHeader.tsx","webpack:///./src/components/left/settings/SettingsMain.tsx","webpack:///./src/components/common/UsernameInput.tsx","webpack:///./src/components/left/settings/SettingsEditProfile.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersMain.tsx","webpack:///./src/components/ui/ShowMoreButton.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersEdit.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersChatFilters.tsx","webpack:///./src/components/left/settings/folders/SettingsFolders.tsx","webpack:///./src/components/ui/RangeSlider.tsx","webpack:///./src/components/middle/composer/StickerSetCoverAnimated.tsx","webpack:///./src/components/middle/composer/StickerSetCover.tsx","webpack:///./src/components/left/settings/SettingsStickerSet.tsx","webpack:///./src/components/left/settings/SettingsGeneral.tsx","webpack:///./src/util/systemFilesDialog.ts","webpack:///./src/util/colors.ts","webpack:///./src/components/left/settings/WallpaperTile.tsx","webpack:///./src/components/left/settings/SettingsGeneralBackground.tsx","webpack:///./src/components/left/settings/SettingsGeneralBackgroundColor.tsx","webpack:///./src/components/left/settings/SettingsNotifications.tsx","webpack:///./src/components/left/settings/SettingsPrivacy.tsx","webpack:///./src/components/left/settings/SettingsLanguage.tsx","webpack:///./src/components/left/settings/helper/privacy.ts","webpack:///./src/components/left/settings/SettingsPrivacyVisibility.tsx","webpack:///./src/components/left/settings/SettingsPrivacyActiveSessions.tsx","webpack:///./src/components/left/settings/SettingsPrivacyBlockedUsers.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaEnabled.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaPassword.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaStart.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaSkippableForm.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaCongratulations.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaEmailCode.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFa.tsx","webpack:///./src/components/left/settings/SettingsPrivacyVisibilityExceptionList.tsx","webpack:///./src/components/left/settings/Settings.tsx","webpack:///./src/components/left/main/ContactList.tsx","webpack:///./src/components/left/newChat/NewChatStep1.tsx","webpack:///./src/components/left/newChat/NewChatStep2.tsx","webpack:///./src/components/left/newChat/NewChat.tsx","webpack:///./src/components/left/ArchivedChats.tsx","webpack:///./src/util/scrollLock.ts","webpack:///./src/components/middle/message/helpers/copyOptions.ts","webpack:///./src/components/middle/message/MessageContextMenu.tsx","webpack:///./src/components/middle/message/ContextMenuContainer.tsx","webpack:///./src/components/common/StickerSetModal.tsx","webpack:///./src/components/middle/HeaderMenuContainer.tsx","webpack:///./src/components/middle/MobileSearch.tsx","webpack:///./src/util/findInViewport.ts","webpack:///./src/util/isFullyVisible.ts","webpack:///./src/util/setTooltipItemVisible.ts","webpack:///./src/components/middle/composer/MentionTooltip.tsx","webpack:///./src/components/middle/composer/AttachmentModal.tsx","webpack:///./src/components/middle/composer/PollModal.tsx","webpack:///./src/hooks/useMouseInside.ts","webpack:///./src/components/middle/composer/EmojiButton.tsx","webpack:///./src/components/middle/composer/EmojiCategory.tsx","webpack:///./src/components/middle/composer/EmojiPicker.tsx","webpack:///./src/components/middle/composer/StickerSet.tsx","webpack:///./src/components/middle/composer/StickerPicker.tsx","webpack:///./src/components/common/GifButton.tsx","webpack:///./src/components/middle/composer/GifPicker.tsx","webpack:///./src/components/middle/composer/SymbolMenuFooter.tsx","webpack:///./src/components/middle/composer/SymbolMenu.tsx","webpack:///./src/components/middle/composer/AttachMenu.tsx","webpack:///./src/components/middle/composer/StickerTooltip.tsx","webpack:///./src/components/middle/composer/BotKeyboardMenu.tsx","webpack:///./src/components/middle/composer/CustomSendMenu.tsx","webpack:///./src/components/middle/composer/EmojiTooltip.tsx","webpack:///./src/components/middle/composer/inlineResults/BaseResult.tsx","webpack:///./src/components/middle/composer/inlineResults/MediaResult.tsx","webpack:///./src/components/middle/composer/inlineResults/ArticleResult.tsx","webpack:///./src/components/middle/composer/inlineResults/GifResult.tsx","webpack:///./src/components/middle/composer/inlineResults/StickerResult.tsx","webpack:///./src/components/middle/composer/InlineBotTooltip.tsx","webpack:///./src/components/right/RightSearch.tsx","webpack:///./src/components/right/StickerSetResult.tsx","webpack:///./src/components/right/StickerSearch.tsx","webpack:///./src/components/right/GifSearch.tsx","webpack:///./src/components/right/PollAnswerResults.tsx","webpack:///./src/components/right/PollResults.tsx","webpack:///./src/components/right/management/ManageUser.tsx","webpack:///./src/components/right/management/ManageGroup.tsx","webpack:///./src/components/right/management/ManageGroupPermissions.tsx","webpack:///./src/components/right/management/ManageGroupRemovedUsers.tsx","webpack:///./src/components/right/management/ManageChannel.tsx","webpack:///./src/components/right/management/ManageChatPrivacyType.tsx","webpack:///./src/components/right/management/ManageDiscussion.tsx","webpack:///./src/components/right/management/ManageGroupUserPermissions.tsx","webpack:///./src/components/right/management/ManageChatAdministrators.tsx","webpack:///./src/components/right/management/ManageGroupRecentActions.tsx","webpack:///./src/components/right/management/ManageGroupAdminRights.tsx","webpack:///./src/components/right/management/ManageGroupMembers.tsx","webpack:///./src/components/right/management/ManageGroupUserPermissionsCreate.tsx","webpack:///./src/components/right/management/Management.tsx","webpack:///./src/components/middle/helpers/getCurrencySign.ts","webpack:///./src/components/common/helpers/detectCardType.ts","webpack:///./src/hooks/reducers/usePaymentReducer.ts","webpack:///./src/hooks/useFocusAfterAnimation.tsx","webpack:///./src/components/ui/Select.tsx","webpack:///./src/components/payment/ShippingInfo.tsx","webpack:///./src/components/payment/Shipping.tsx","webpack:///./src/components/payment/Checkout.tsx","webpack:///./src/components/payment/ExpiryInput.tsx","webpack:///./src/components/middle/helpers/inputFormatters.ts","webpack:///./src/assets/mastercard.svg","webpack:///./src/assets/visa.svg","webpack:///./src/components/payment/CardInput.tsx","webpack:///./src/components/payment/PaymentInfo.tsx","webpack:///./src/components/payment/PaymentModal.tsx","webpack:///./src/components/payment/ReceiptModal.tsx","webpack:///./src/components/common/helpers/animatedAssets.ts","webpack:///./src/assets/TwoFactorSetupMonkeyIdle.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyTracking.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyClose.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyPeek.tgs","webpack:///./src/assets/FoldersAll.tgs","webpack:///./src/assets/FoldersNew.tgs","webpack:///./src/assets/DiscussionGroupsDucks.tgs","webpack:///./src/components/ui/CropModal.tsx","webpack:///./src/components/ui/AvatarEditable.tsx","webpack:///./src/components/common/PasswordMonkey.tsx","webpack:///./src/components/common/PasswordForm.tsx"],"names":["animateOpening","hasFooter","origin","bestImageData","dimensions","isVideo","message","mediaEl","fromImage","getNodes","width","windowWidth","windowSize","get","availableWidth","height","availableHeight","getMediaViewerAvailableDimensions","toWidth","toHeight","calculateDimensions","toLeft","toTop","mql","window","matchMedia","MEDIA_VIEWER_MEDIA_QUERY","topOffsetRem","matches","REM","getTopOffset","top","fromTop","left","fromLeft","fromWidth","fromHeight","getBoundingClientRect","MediaViewerOrigin","SharedMedia","Album","ScheduledAlbum","SearchResult","includes","uncovered","realWidth","realHeight","size","Math","max","srcWidth","srcHeight","uncover","fromTranslateX","fromTranslateY","fromScaleX","fromScaleY","ghost","createGhost","applyStyles","transform","applyShape","document","body","classList","add","requestAnimationFrame","appendChild","style","firstChild","objectFit","remove","clearShape","setTimeout","contains","removeChild","ANIMATION_END_DELAY","animateClosing","container","toImage","getElementById","querySelector","targetTop","el","display","rect","windowHeight","isElementInViewport","shouldFadeOut","Inline","ScheduledInline","isMessageImageFullyVisible","existingGhost","getElementsByClassName","ProfileAvatar","transition","transformOrigin","opacity","source","shouldAppendProfileInfo","createElement","img","Image","src","HTMLVideoElement","poster","profileInfo","cloneNode","imageEl","messageListElement","imgOffsetTop","offsetTop","closest","id","parentElement","scrollTop","offsetHeight","element","styles","Object","assign","containerSelector","mediaSelector","MiddleHeaderAvatar","mediaEls","querySelectorAll","length","withGlobal","global","chatId","messageId","isAvatar","sender","isChatPrivate","selectUser","selectChat","selectChatMessage","selectSender","setGlobal","actions","pick","closeMediaViewer","focusMessage","handleFocusMessage","useCallback","lang","useLang","isFromChat","senderTitle","getSenderTitle","className","onClick","Avatar","key","chat","user","dir","renderText","formatMediaDateTime","date","MediaViewerActions","mediaData","isZoomed","fileName","onCloseMediaViewer","onForward","onZoomToggle","isDownloadStarted","downloadProgress","handleDownloadClick","useMediaDownload","getMessageMediaHash","undefined","MenuButton","useMemo","onTrigger","isOpen","Button","round","color","ariaLabel","IS_SINGLE_COLUMN_LAYOUT","DropdownMenu","trigger","positionX","MenuItem","icon","href","download","ProgressSpinner","progress","noCross","MediaViewerFooter","text","isHidden","isForVideo","isMultiline","setIsMultiline","useState","useEffect","footerContent","checkIsMultiline","clientHeight","handleResize","throttle","addEventListener","removeEventListener","classNames","buildClassName","e","stopPropagation","prop","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","getBrowserFullscreenElementProp","units","bytes","number","floor","log","toFixed","stopEvent","VideoPlayerControls","bufferedProgress","currentTime","duration","fileSize","isForceVisible","isForceMobileVersion","isPlayed","isFullscreenSupported","isFullscreen","onChangeFullscreen","onPlayPause","onSeek","isVisible","setVisibility","timeout","clearTimeout","downloadedPercent","totalSize","percentagePlayed","percentageBuffered","min","step","type","onInput","value","renderSeekLine","ripple","formatMediaDuration","renderTime","formatFileSize","memo","url","isGif","posterData","posterSize","isMediaViewerOpen","noPlay","onClose","videoRef","useRef","setIsPlayed","IS_TOUCH_ENV","IS_IOS","setCurrentTime","isControlsVisible","setIsControlsVisible","setFullscreen","exitFullscreen","elRef","setIsFullscreen","Boolean","useLayoutEffect","listener","listenerEnter","listenerExit","video","current","PLATFORM_ENV","requestFullscreen","webkitRequestFullscreen","webkitEnterFullscreen","mozRequestFullScreen","mozCancelFullScreen","webkitCancelFullScreen","webkitExitFullscreen","useFullscreenStatus","isBuffered","bufferingHandlers","useBuffering","shouldRender","shouldRenderSpinner","transitionClassNames","spinnerClassNames","useShowTransition","shouldRenderPlayButton","playButtonClassNames","pause","safePlay","togglePlayState","play","useVideoCleanup","handleMouseOver","handleMouseOut","handleTimeUpdate","currentTarget","handleEnded","handleFullscreenChange","handleSeek","Number","target","toggleControls","togglePayingStateBySpace","preventDefault","wrapperStyle","videoStyle","onMouseOver","onMouseOut","ref","autoPlay","playsInline","loop","muted","onEnded","onDoubleClick","onTimeUpdate","join","square","isShown","onChangeZoom","prevIsShown","usePrevious","inputRef","zoomLevel","setZoomLevel","isSeeking","handleStartSeek","handleStopSeek","disabled","onChange","onMouseDown","onMouseUp","INITIAL_MATRIX","SCALE_VALUES","1","1.5","2","2.5","3","children","noWrap","canPan","panDeltaX","panDeltaY","onPan","tunedZoomLevel","isDragging","setIsDragging","dragData","setDragData","dx","dy","x","y","matrixData","setMatrixData","panWrapperRef","panContainerRef","newZoomLevel","newPandx","newPandy","newMatrixData","areSortedArraysEqual","oldScale","wrapper","image","wrapperRect","imageRect","newImgWidth","newImgHeight","newImgX","newImgY","calculateSafeZoneOnZoom","toString","newDragData","pageX","pageY","onMouseMove","deltaX","deltaY","getNewMatrixData","renderPhoto","blobUrl","imageSize","canDrag","alt","draggable","Spinner","threadId","avatarOwnerId","profilePhotoIndex","mediaViewer","animationLevel","settings","byKey","senderId","avatarOwner","chatMessages","collectionIds","selectScheduledMessage","selectScheduledMessages","selectChatMessages","selectOutlyingIds","selectListedIds","currentSearch","selectCurrentMediaSearch","foundIds","resultsByType","media","openMediaViewer","openForwardMenu","isFromSharedMedia","isFromSearch","photo","getMessagePhoto","getMessageVideo","webPagePhoto","getMessageWebPagePhoto","webPageVideo","getMessageWebPageVideo","isDocumentPhoto","isMessageDocumentPhoto","isDocumentVideo","isMessageDocumentVideo","isPhoto","isSingleSlide","messageIds","getChatMediaMessageIds","selectedMediaMessageIndex","indexOf","isFirst","isLast","animationKey","prevSenderId","slideAnimation","headerAnimation","isGhostAnimation","isFooterHidden","setIsFooterHidden","canPanZoomWrap","setCanPanZoomWrap","setIsZoomed","panDelta","setPanDelta","getMediaHash","isFull","photos","getChatAvatarHash","blobUrlPictogram","useMedia","ApiMediaFormat","BlobUrl","previewMediaHash","blobUrlPreview","startsWith","DataUri","fullMediaData","useMediaWithDownloadProgress","getMessageMediaFormat","localBlobUrl","thumbDataUri","useBlurSync","getMessageMediaThumbDataUri","videoSize","getMessageFileSize","getMessageFileName","getMessageDocument","mediaSize","getPhotoFullDimensions","getVideoDimensions","AVATAR_FULL_DIMENSIONS","toggle","forceUpdate","useForceUpdate","addListener","removeListener","prevMessage","prevOrigin","prevAvatarOwner","prevBestImageData","dispatchHeavyAnimationEvent","textParts","renderMessageText","timer","closeZoom","handleZoomToggle","handleZoomValue","level","canCloseZoom","close","handleFooterClick","handleForward","fromChatId","captureEscKeyListener","stopCurrentAudio","disableRefresh","enableRefresh","getMessageId","fromId","direction","index","selectPreviousMedia","selectNextMedia","handleKeyDown","shouldCloseOnVideo","captureEvents","excludedClosestSelector","onSwipe","SwipeDirection","Right","Left","handlePan","handleToggleFooterVisibility","renderSlide","isActive","calculateMediaViewerDimensions","renderSenderInfo","useHistoryBack","ShowTransition","isRtl","Transition","activeKey","name","aria-label","chats","byId","chatsById","listIds","orderedPinnedIds","currentUserId","pinnedIds","active","activeListIds","archivedListIds","archived","setForwardChatId","exitForwardMode","loadMoreChats","filter","setFilter","focus","blur","chatIds","priorityIds","unique","sortChatIds","getCanPostInChat","MAIN_THREAD_ID","searchWords","getChatTitle","viewportIds","getMore","useInfiniteScroll","handleFilterChange","containerRef","useKeyboardListNavigation","modalHeader","InputText","onKeyDown","placeholder","Modal","header","InfiniteScroll","items","onLoadMore","noScrollRestore","map","ListItem","PrivateChatInfo","status","userId","GroupChatInfo","Loading","getErrorHeader","error","isSlowMode","hasErrorKey","dialogs","dismissDialog","acceptInviteConfirmation","dialog","invite","hash","title","participantsCount","isChannel","participantsText","joinText","isText","renderInvite","getReadableErrorText","notifications","dismissNotification","Notification","onDismiss","toggleSafeLinkModal","handleOpen","open","handleDismiss","renderingUrl","useCurrentOrPrev","ConfirmDialog","confirmLabel","confirmHandler","WEEKDAY_LETTERS","isDisabledDay","year","month","day","minDate","maxDate","selectedDay","Date","fixedMinDate","getFullYear","getMonth","getDate","fixedMaxDate","formatInputTime","String","padStart","selectedAt","maxAt","isFutureMode","isPastMode","withTimePicker","submitButtonLabel","secondButtonLabel","onSubmit","onSecondButtonClick","now","defaultSelectedDate","prevIsOpen","selectedDate","setSelectedDate","selectedHours","setSelectedHours","getHours","selectedMinutes","setSelectedMinutes","getMinutes","currentYear","currentMonth","currentDate","shouldDisableNextMonth","shouldDisablePrevMonth","calendarGrid","grid","setFullYear","setMonth","setDate","monthStartDay","getDay","i","push","gridDate","buildCalendarGrid","handleChangeHours","replace","hours","getTime","setHours","hoursStr","handleChangeMinutes","minutes","setMinutes","minutesStr","d","dateCopy","role","tabIndex","handleDateSelect","inputMode","formatDateToString","code","today","formatTime","formatSubmitLabel","historyCalendarSelectedAt","searchMessagesByDate","closeHistoryCalendar","handleJumpToDate","timestamp","valueOf","isSchedule","selectCurrentMessageList","canDeleteForAll","selectAllowedMessageActions","contactName","getUserFirstOrLastName","getPrivateChatUserId","willDeleteForCurrentUserOnly","isChatBasicGroup","willDeleteForAll","isChatSuperGroup","album","deleteMessages","deleteScheduledMessages","handleDeleteMessageForAll","messages","shouldDeleteForAll","handleDeleteMessageForSelf","onEnter","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","isChatChannel","isGroup","isSuperGroup","canPinForAll","pinMessage","handlePinMessageForAll","isUnpin","handlePinMessage","isOneSide","isSilent","pinnedMessagesCount","onUnpin","selectedMessageIds","selectedMessages","selectCanDeleteSelectedMessages","selectCurrentChat","exitMessageSelectMode","reportMessages","selectedReason","setSelectedReason","description","setDescription","handleReport","reason","handleSelectReason","handleDescriptionChange","REPORT_OPTIONS","label","RadioGroup","options","selected","messageListType","canDelete","canReport","selectCanReportSelectedMessages","selectedMessagesCount","selectSelectedMessagesCount","canDeleteMessages","canReportMessages","canPost","openForwardMenuForSelectedMessages","isDeleteModalOpen","openDeleteModal","closeDeleteModal","useFlag","isReportModalOpen","openReportModal","closeReportModal","captureKeyboardListeners","onBackspace","onDelete","onEsc","prevSelectedMessagesCount","renderingSelectedMessagesCount","formattedMessagesCount","destructive","onSelect","buttonRef","activeElement","privateChatUserId","privateChatUser","isPinned","selectIsChatPinned","isMuted","selectIsChatMuted","selectNotifySettings","selectNotifyExceptions","withUsername","contextActions","useChatContextActions","handleDelete","handleClick","useSelectWithEnter","avatarSize","DeleteChatModal","runThrottled","cb","userIds","topUserIds","topPeers","usersById","users","recentlyFoundChatIds","globalSearch","onReset","loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats","topUsersRef","useHorizontalScroll","shouldReplaceHistory","lastSyncTime","searchQuery","mediaThumbnail","mediaBlobUrl","isRoundVideo","getMessageRoundVideo","withOnlineStatus","isSavedMessages","isSelf","isVerified","VerifiedIcon","Link","formatPastTimeShort","getMessageSummaryText","highlight","renderMessageSummary","searchDate","suggestions","match","suggestion","latestYear","getSuggestionsFromDate","localContactIds","contactList","fetchingStatus","globalResults","localResults","globalChatIds","globalUserIds","localChatIds","localUserIds","byChatId","globalMessagesByChatId","dateSearchQuery","onSearchDateSelect","searchMessagesGlobal","setGlobalSearchChatId","shouldShowMoreLocal","setShouldShowMoreLocal","shouldShowMoreGlobal","setShouldShowMoreGlobal","handleLoadMore","LoadMoreDirection","Backwards","query","handleChatClick","handlePickerItemClick","MEMO_EMPTY_ARRAY","foundContactIds","fullName","getUserFullName","username","foundMessages","split","sort","a","b","handleClickShowMoreLocal","handleClickShowMoreGlobal","nothingFound","noScrollRestoreOnTop","noFastList","NothingFound","PickerSelectedItem","chatOrUserId","clickArg","createMapStateToProps","props","currentType","isVoice","theme","selectTheme","isLoading","searchChatId","handleSelectMedia","canRenderContents","useAsyncRendering","SLIDE_TRANSITION_DURATION","isMediaGrid","isMessageList","itemSelector","Media","idPrefix","getSenderName","senderName","isChatGroup","handleMessageFocus","shouldDrawDateDivider","toYearMonth","formatMonthAndYear","WebLink","onMessageClick","Document","withDate","datetime","smaller","onDateClick","openAudioPlayer","handlePlayAudio","Audio","onPlay","TABS","GlobalSearchContent","ChatList","Links","Files","Music","Voice","CHAT_TABS","slice","TRANSITION_RENDER_COUNT","keys","currentContent","setGlobalSearchContent","setGlobalSearchDate","activeTab","setActiveTab","parseDateString","handleSwitchTab","tab","content","handleSearchDateSelect","TabList","tabs","onSwitchTab","renderCount","INITIAL_STATE","currentPassword","password","hint","email","twoFaReducer","state","action","payload","currentScreen","editedFolderId","onSaveFilter","signOut","deleteChatFolder","isSignOutDialogOpen","setIsSignOutDialogOpen","isDeleteFolderDialogOpen","setIsDeleteFolderDialogOpen","openSignOutConfirmation","closeSignOutConfirmation","openDeleteFolderConfirmation","closeDeleteFolderConfirmation","handleSignOutMessage","handleDeleteFolderMessage","SettingsMenuButton","SettingsScreens","EditProfile","General","Notifications","Privacy","Language","GeneralChatBackground","GeneralChatBackgroundColor","PrivacyPhoneNumber","PrivacyLastSeen","PrivacyProfilePhoto","PrivacyForwarding","PrivacyGroupChats","PrivacyPhoneNumberAllowedContacts","PrivacyLastSeenAllowedContacts","PrivacyProfilePhotoAllowedContacts","PrivacyForwardingAllowedContacts","PrivacyGroupChatsAllowedContacts","PrivacyPhoneNumberDeniedContacts","PrivacyLastSeenDeniedContacts","PrivacyProfilePhotoDeniedContacts","PrivacyForwardingDeniedContacts","PrivacyGroupChatsDeniedContacts","PrivacyActiveSessions","PrivacyBlockedUsers","TwoFaDisabled","TwoFaEnabled","TwoFaNewPassword","TwoFaChangePasswordNew","TwoFaChangePasswordConfirm","TwoFaNewPasswordConfirm","TwoFaNewPasswordHint","TwoFaChangePasswordHint","TwoFaNewPasswordEmail","TwoFaRecoveryEmail","TwoFaNewPasswordEmailCode","TwoFaRecoveryEmailCode","TwoFaCongratulations","TwoFaChangePasswordCurrent","TwoFaTurnOff","TwoFaRecoveryEmailCurrentPassword","Folders","FoldersCreateFolder","FoldersEditFolder","FoldersEditFolderFromChatList","FoldersIncludedChats","FoldersIncludedChatsFromChatList","FoldersExcludedChats","FoldersExcludedChatsFromChatList","renderHeaderContent","confirmIsDestructive","currentUser","onScreenSelect","Main","formatPhoneNumberWithCode","phoneNumber","LINK_PREFIX_REGEX","USERNAME_REGEX","runDebouncedForCheckUsername","debounce","currentUsername","asLink","isUsernameAvailable","checkUsername","setUsername","langPrefix","usernameSuccess","usernameError","test","handleUsernameChange","newUsername","trim","isValid","isUsernameValid","success","readOnly","profileEdit","firstName","currentFirstName","lastName","currentLastName","fullInfo","bio","currentBio","currentAvatarHash","loadCurrentUser","updateProfile","isUsernameTouched","setIsUsernameTouched","isProfileFieldsTouched","setIsProfileFieldsTouched","setError","setPhoto","setFirstName","setLastName","setBio","currentAvatarBlobUrl","ProfileEditProgress","InProgress","isUsernameError","isSaveButtonShown","Complete","handlePhotoChange","newPhoto","handleFirstNameChange","handleLastNameChange","handleBioChange","handleProfileSave","trimmedFirstName","trimmedLastName","trimmedBio","AvatarEditable","UsernameInput","FloatingActionButton","runThrottledForLoadRecommended","orderedIds","orderedFolderIds","foldersById","recommended","recommendedChatFolders","chatFolders","notifySettings","notifyExceptions","onCreateFolder","onEditFolder","loadRecommendedChatFolders","addChatFolder","showDialog","animationData","setAnimationData","isAnimationLoaded","setIsAnimationLoaded","handleAnimationLoad","getAnimationData","then","handleCreateFolder","data","userFolders","folder","subtitle","getFolderDescriptionText","handleCreateFolderFromRecommended","AnimatedSticker","STICKER_SIZE_FOLDER_SETTINGS","noLoop","onLoad","pill","fluid","narrow","multiline","ShowMoreButton","count","itemName","itemPluralName","ERROR_NO_TITLE","loadedActiveChatIds","loadedArchivedChatIds","dispatch","onAddIncludedChats","onAddExcludedChats","onBack","editChatFolder","isIncludedChatsListExpanded","setIsIncludedChatsListExpanded","isExcludedChatsListExpanded","setIsExcludedChatsListExpanded","selectedChatIds","includedChatIds","selectedChatTypes","includedChatTypes","selectChatFilters","excludedChatIds","excludedChatTypes","folderId","visibleIncludedChatIds","visibleExcludedChatIds","allLoadedChatsSet","Set","loadedIncludedChatIds","findIntersectionWithSet","loadedExcludedChatIds","listType","renderChats","mode","visibleChatIds","isExpanded","leftChatsCount","clickHandler","chatType","INCLUDED_CHAT_TYPES","find","typeKey","EXCLUDED_CHAT_TYPES","inactive","renderChatType","event","isTouched","folderUpdate","selectedIds","filterValue","onSelectedIdsChange","onSelectedChatTypesChange","onFilterChange","chatTypes","shouldMinimize","hasMaxChats","handleItemClick","newSelectedIds","splice","handleChatTypeClick","newSelectedChatTypes","selectedType","isMinimized","canClose","Checkbox","checked","isSelected","withChatType","archivedPinnedIds","chatFilter","activeChatArrays","prepareChatList","archivedChatArrays","pinnedChats","otherChats","displayedIds","newFilter","handleSelectedIdsChange","ids","includeFilters","excludeFilters","handleSelectedChatTypesChange","newFilters","forEach","shownScreen","handleReset","handleEditFolder","handleAddIncludedChats","handleAddExcludedChats","range","handleChange","trackWidth","possibleValuesLength","option","STICKER_SIZE_PICKER_HEADER","stickerSet","observeIntersection","isIntersecting","useIsIntersecting","mediaHash","lottieData","Lottie","shouldRenderFullMedia","useTransitionForMedia","getFirstLetters","hasThumbnail","stickers","firstSticker","isAnimated","STICKER_SIZE_GENERAL_SETTINGS","StickerButton","sticker","ANIMATION_LEVEL_OPTIONS","stickerSetIds","added","setIds","stickerSetsById","setsById","messageTextSize","messageSendKeyCombo","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayGifs","shouldAutoPlayVideos","shouldSuggestStickers","shouldLoopStickers","setSettingOption","loadStickerSets","loadAddedStickers","stickerSettingsRef","observe","observeIntersectionForCovers","useIntersectionObserver","rootRef","isModalOpen","openModal","closeModal","setSticker","KEYBOARD_SEND_OPTIONS","subLabel","IS_MAC_OS","handleAnimationLevelChange","newLevel","_","handleMessageTextSizeChange","newSize","documentElement","setProperty","handleStickerSetClick","stickerSets","installedDate","onCheck","isChecked","fromSticker","fileSelector","openSystemFilesDialog","accept","callback","noMultiple","setAttribute","removeAttribute","onchange","click","hex2rgb","param","parseInt","substring","rgb2hex","p0","p1","p2","rgb2hsb","r","g","h","s","v","hsb2rgb","f","p","q","t","getPatternColor","rgbColor","hue","saturation","wallpaper","slug","localMediaHash","previewBlobUrl","thumbRef","useCanvasBlur","thumbnail","dataUri","shouldRenderThumb","isDownloadAllowed","setIsDownloadAllowed","fullMedia","wasDownloadDisabled","UPLOADING_WALLPAPER_SLUG","cacheKeyRef","handleSelect","blob","fetchBlob","cacheApi","CUSTOM_BG_CACHE_NAME","isAllowed","background","isBlurred","themes","loadedWallpapers","loadWallpapers","uploadWallpaper","setThemeSettings","themeRef","handleFileSelect","files","handleUploadWallpaper","handleSetColor","handleResetToDefault","backgroundColor","patternColor","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","handleWallPaperSelect","currentWallpaper","async","defaultRGB","rgb","canvas","context","getContext","preloadImage","naturalHeight","naturalWidth","offsetWidth","drawImage","getImageData","blockSize","getAverageColor","handleWallPaperBlurChange","isUploading","DEFAULT_HSB","PREDEFINED_COLORS","hsb2positions","hsb","rects","colorPosition","colorRect","huePosition","hueRect","positions2hsb","colorPickerRef","huePickerRef","isFirstRunRef","setHsb","getInitialHsb","hsbRef","markIsDragging","unmarkIsDragging","rgbInput","setRgbInput","hexInput","setHexInput","rectsRef","colorCtxRef","offsetLeft","handleColorDrag","handleHueDrag","onCapture","onDrag","onRelease","withCursor","hex","hueHex","w","ctx","imgData","createImageData","pixels","col","perY","st","ed","perX","putImageData","drawColor","drawHue","handleRgbChange","rgbValue","channel","handleHexChange","hexValue","handlePredefinedColorClick","dataset","data-color","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","hasContactJoinedNotifications","loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings","handleSettingsChange","peerType","setting","currentIsSilent","currentShouldShowPreviews","shouldShowPreviews","handleContactNotificationChange","hasPassword","isSensitiveEnabled","canChangeSensitive","privacy","blocked","activeSessions","blockedCount","totalCount","sessionsCount","visibilityPrivacyPhoneNumber","visibility","visibilityPrivacyLastSeen","lastSeen","visibilityPrivacyProfilePhoto","profilePhoto","visibilityPrivacyForwarding","forwards","visibilityPrivacyGroupChats","chatInvite","loadPrivacySettings","loadBlockedContacts","loadAuthorizations","loadContentSettings","updateContentSettings","getVisibilityValue","languages","language","loadLanguages","selectedLanguage","setSelectedLanguage","markIsLoading","unmarkIsLoading","langCode","setLanguage","currentLangCode","navigator","toLowerCase","shortLangCode","substr","nativeName","buildOptions","loadingOption","getPrivacyKey","screen","privacySettings","allowUserIds","allowChatIds","blockUserIds","blockChatIds","setPrivacyVisibility","visibilityOptions","exceptionLists","shouldShowDenied","shouldShowAllowed","privacyKey","headerText","descriptionText","allowedContactsScreen","deniedContactsScreen","allowedCount","reduce","result","membersCount","blockCount","handleVisibilityChange","getLocation","session","region","country","getDeviceEnvironment","deviceModel","platform","systemVersion","terminateAuthorization","terminateAllAuthorizations","isConfirmTerminateAllDialogOpen","openConfirmTerminateAllDialog","closeConfirmTerminateAllDialog","handleTerminateSessionClick","handleTerminateAllSessions","currentSession","isCurrent","otherSessions","renderSession","handler","dateActive","appName","ip","sessions","chatsByIds","usersByIds","blockedIds","unblockContact","handleUnblockClick","contactId","viewportOffset","isPrivate","CHAT_HEIGHT_PX","renderContact","animatedEmoji","selectAnimatedEmoji","AnimatedEmoji","expectedPassword","submitLabel","clearError","validationError","setValidationError","shouldShowPassword","setShouldShowPassword","handleSubmit","newPassword","handleClearError","PasswordMonkey","isBig","isPasswordVisible","PasswordForm","onChangePasswordVisibility","onStart","FOCUS_DELAY_TIMEOUT_MS","shouldConfirm","setValue","isConfirmShown","markIsConfirmShown","unmarkIsConfirmShown","codeLength","twoFaSettings","waitingEmailCodeLength","newValue","updatePassword","checkPassword","clearTwoFaError","updateRecoveryEmail","provideTwoFaEmailCode","clearPassword","handleStartWizard","handleNewPassword","handleNewPasswordConfirm","handleNewPasswordHint","handleNewPasswordEmail","onSuccess","handleChangePasswordCurrent","handleChangePasswordNew","handleChangePasswordConfirm","handleChangePasswordHint","handleTurnOff","handleRecoveryEmailCurrentPassword","handleRecoveryEmail","handleEmailCode","getCurrentPrivacySettings","isAllowList","setPrivacySettings","selectedContactIds","setSearchQuery","isSubmitShown","setIsSubmitShown","newSelectedContactIds","setNewSelectedContactIds","handleSelectedContactIdsChange","contactsIds","itemIds","filterPlaceholder","searchInputId","TWO_FA_SCREENS","FOLDERS_SCREENS","PRIVACY_SCREENS","PRIVACY_PHONE_NUMBER_SCREENS","PRIVACY_LAST_SEEN_PHONE_SCREENS","PRIVACY_PROFILE_PHOTO_SCREENS","PRIVACY_FORWARDING_SCREENS","PRIVACY_GROUP_CHATS_SCREENS","foldersState","foldersDispatch","shouldSkipTransition","twoFaState","twoFaDispatch","useReducer","handleSaveFilter","renderCurrentSection","isScreenActive","isFrom","currentKey","privacyAllowScreens","isTwoFaScreen","isFoldersScreen","isPrivacyScreen","values","renderCurrentSectionContent","LAYERS_ANIMATION_NAME","contactIds","serverTimeOffset","resultIds","sortUserIds","forceShowSelf","isSearching","selectedMemberIds","onSelectedMemberIdsChange","onNextStep","setGlobalSearchQuery","isUserBot","canBeInvitedToGroup","handleNextStep","creationProgress","creationError","chatCreation","memberIds","createGroupChat","createChannel","setTitle","about","setAbout","ChatCreationProgress","handleTitleChange","handleCreateGroup","handleCreateChannel","renderedError","RENDER_COUNT","LeftColumnContent","onContentChange","newChatMemberIds","setNewChatMemberIds","NewChannelStep2","NewGroupStep2","isStepActive","NewChannelStep1","NewGroupStep1","Archived","folderType","IGNORED_KEYS","Down","ArrowDown","Up","ArrowUp","ArrowLeft","ArrowRight","PageUp","PageDown","End","Home","Tab","preventDefaultForScrollKeys","HTMLElement","tagName","getAttribute","isTextBox","disableScrolling","passive","ontouchmove","onkeydown","enableScrolling","getCopyLabel","hasSelection","MessageContextMenu","anchor","canSendNow","canReschedule","canReply","canEdit","canPin","canUnpin","canForward","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","onReply","onEdit","onPin","onReport","onFaveSticker","onUnfaveSticker","onSend","onReschedule","onCloseAnimationEnd","onCopyLink","copyOptions","afterEffect","getMessageText","canImageBeCopied","hasMessageLocalBlobUrl","CLIPBOARD_ITEM_SUPPORTED","selection","getSelection","Promise","resolve","mediaLoader","copyImageToClipboard","anchorNode","parentNode","clipboardText","copyTextToClipboard","getMessageCopyOptions","getTriggerElement","getRootElement","getMenuElement","positionY","useContextMenuPosition","Menu","noOptions","isScheduled","chatUsername","setReplyingToId","setEditingId","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","isMenuOpen","setIsMenuOpen","setIsDeleteModalOpen","setIsReportModalOpen","isPinModalOpen","setIsPinModalOpen","isCalendarOpen","openCalendar","closeCalendar","closeMenu","closePinModal","handleCloseCalendar","handleReply","handleEdit","handlePin","handleUnpin","handleFaveSticker","handleUnfaveSticker","handleSelectMessage","params","childMessageIds","withShift","handleScheduledMessageSend","handleOpenCalendar","handleRescheduleMessage","scheduledAt","handleCopyLink","abs","reportMessageIds","scheduledMaxDate","getDayStartAt","selectStickerSet","stickerSetId","loadStickers","toggleStickerSet","sendMessage","throttleMs","isDisabled","stickerSetAccessHash","isPreloadedGlobally","handleButtonClick","hasCloseButton","STICKER_SIZE_MODAL","isRestricted","canDeleteChat","getCanDeleteChat","canStartBot","canRestartBot","canSubscribe","canSearch","canMute","canLeave","onSubscribeChannel","onSearchClick","updateChatMutedState","enterMessageSelectMode","sendBotCommand","restartBot","handleStartBot","command","handleRestartBot","handleToggleMuteClick","handleSubscribe","handleSearch","handleSelectMessages","Portal","runDebouncedForSearch","results","selectCurrentTextSearch","isHistoryCalendarOpen","setLocalTextSearchQuery","searchTextMessagesLocal","closeLocalTextSearch","openHistoryCalendar","focusedIndex","setFocusedIndex","visualViewport","mainEl","pageTop","Array","from","input","div","contentEditable","handleMessageSearchQueryChange","newQuery","handleUp","newFocusIndex","handleDown","SearchInput","findInViewport","selectorOrElements","margin","isDense","shouldContainBottom","isHorizontal","viewportY1","viewportY2","allElements","visibleIndexes","isFound","y1","y2","isFullyVisible","setTooltipItemVisible","selector","first","position","fastSmoothScroll","onInsertUserName","filteredUsers","getSelectedIndex","newIndex","cycleRestrict","selectedMentionIndex","setSelectedMentionIndex","handleArrowKey","handleUserSelect","forceFocus","handleSelectMention","member","onUp","onDown","onTab","prevChatMembers","renderedChatMembers","attachments","caption","isReady","groupChatMembers","recentEmojis","baseEmojiKeywords","emojiKeywords","addRecentEmoji","onCaptionUpdate","onFileAppend","onClear","hideTimeoutRef","prevAttachments","renderingAttachments","isHovered","markHovered","unmarkHovered","isQuick","every","quick","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","insertMention","mentionFilteredUsers","useMentionTooltip","EDITABLE_INPUT_MODAL_ID","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","sendAttachments","handleFilesDrop","dataTransfer","newFiles","file","CONTENT_TYPES_FOR_QUICK_UPLOAD","has","areAllPhotos","mimeType","areAllVideos","renderHeader","onDragEnter","onDrop","onDragOver","onDragLeave","relatedTarget","toTarget","fromTarget","data-attach-description","attachment","File","filename","extension","getFileExtension","previewData","emojis","onEmojiSelect","MessageInput","isAttachmentModalInput","html","editableInputId","onUpdate","shouldSetFocus","questionInputRef","optionsListRef","solutionRef","question","setQuestion","setOptions","isAnonymous","setIsAnonymous","isMultipleAnswers","setIsMultipleAnswers","isQuizMode","setIsQuizMode","solution","setSolution","correctOption","setCorrectOption","hasErrors","setHasErrors","focusInput","solutionEl","innerHTML","addNewOption","newOptions","list","scrollHeight","scrollTo","behavior","handleCreate","questionTrimmed","optionsTrimmed","o","summary","answers","correct","isPublic","multipleChoice","quiz","entities","parseMessageInput","correctAnswers","solutionEntities","updateOption","removeOption","handleCorrectOptionChange","handleIsAnonymousChange","handleMultipleAnswersChange","handleQuizModeChange","handleKeyPress","keyCode","getQuestionError","getOptionsError","renderOptions","onKeyPress","renderQuizNoOptionError","hidden","closeTimeout","useMouseInside","menuCloseTimeout","isMouseInside","emoji","native","names","IS_EMOJI_SUPPORTED","loading","category","allEmojis","useOnIntersect","emojisPerRow","ceil","displayedEmoji","ICONS_BY_CATEGORY","recent","people","nature","foods","activity","places","objects","symbols","flags","categoryIntersections","emojiDataPromise","emojiRawData","emojiData","headerRef","categories","setCategories","setEmojis","activeCategoryIndex","setActiveCategoryIndex","entries","entry","intersectingWithIndexes","newLeft","HEADER_BUTTON_WIDTH","fastSmoothScrollHorizontal","allCategories","themeCategories","unshift","exec","default","uncompressEmoji","ensureEmojiData","selectCategory","categoryEl","handleEmojiSelect","MENU_TRANSITION_DURATION","containerClassName","faded","STICKER_MARGIN","loadAndPlay","onStickerSelect","onStickerUnfave","stickersPerRow","STICKER_SIZE_PICKER","noAnimate","onUnfaveClick","stickerSetIntersections","favorite","recentStickers","favoriteStickers","addedSetIds","shouldPlay","canSendStickers","loadRecentStickers","loadFavoriteStickers","addRecentSticker","activeSetIndex","setActiveSetIndex","areAddedLoaded","allSets","noPopulatedSets","set","stickerSetEl","handleStickerSelect","handleStickerUnfave","fullClassName","buttonClassName","gif","videoData","shouldRenderVideo","preload","savedGifs","gifs","saved","canSendGifs","onGifSelect","loadSavedGifs","debounceMs","SymbolMenuTabs","SYMBOL_MENU_TAB_TITLES","SYMBOL_MENU_TAB_ICONS","Emoji","Stickers","GIFs","onRemoveSymbol","onSearchOpen","renderTabButton","handleSearchOpen","isActivated","isLeftColumnShown","allowedAttachmentOptions","setRecentEmojis","handleMouseEnter","handleMouseLeave","fastRaf","recentEmojisRef","renderContent","onMouseEnter","onMouseLeave","noCloseOnBackdrop","onFileSelect","onPollCreate","handleQuickSelect","handleDocumentSelect","canAttachMedia","canAttachPolls","autoClose","forEmoji","clearStickersForEmoji","prevStickers","displayedStickers","clickInlineButton","keyboardButtons","row","button","onSilentSend","onScheduleSend","listEmojis","usePrevDuringAnimation","selectedIndex","setSelectedIndex","setItemVisible","emojisCount","handleSelectEmoji","onLeft","onRight","thumbUrl","thumbnailDataUrl","decoding","isForGallery","inlineResult","webThumbnail","STICKER_SIZE_INLINE_BOT_RESULT","botId","isGallery","inlineBotResults","switchPm","loadMore","onSelectResult","handleSelectInlineBotResult","handleSendPm","startParam","prevInlineBotResults","renderedInlineBotResults","sensitiveArea","inlineBotResult","messagesById","foundResults","senderUser","getGlobal","senderChat","forwardInfo","isChannelPost","orderBy","foundResult","preloadBackwards","LastMessageMeta","selectShouldLoopStickers","isSomeModalOpen","onModalToggle","isAdded","areStickersLoaded","useOnChange","coverStickerIds","covers","otherStickers","handleAddClick","canRenderStickers","STICKER_SIZE_SEARCH","selectCurrentStickerSearch","featured","featuredIds","loadFeaturedStickers","setIsModalOpen","selectCurrentGifSearch","isChatWithBot","selectIsChatWithBot","searchMoreGifs","setGifSearchQuery","getAllowedAttachmentOptions","handleGifClick","hasResults","answer","voters","offsets","pollResults","offset","answerVote","totalVoters","loadPollOptionResults","closePollResults","prevVotersCount","votersCount","setIsLoading","areVotersLoaded","limit","shouldResetVoters","handleViewMoreClick","handleMemberClick","noStatusOrTyping","leftVotersCount","renderViewMoreButton","total","getMessagePoll","resultsByOption","buildCollectionByKey","management","updateContact","deleteUser","deleteHistory","closeManagement","isDeleteDialogOpen","openDeleteDialog","closeDeleteDialog","isNotificationsEnabled","setIsNotificationsEnabled","ManagementProgress","handleNotificationChange","handleDeleteContact","withFullInfo","hasLinkedChannel","linkedChatId","isBasicGroup","canChangeInfo","isCreator","getHasAdminRight","canBanUsers","togglePreHistoryHidden","updateChat","deleteChat","leaveChannel","deleteChannel","currentTitle","currentAbout","imageHash","handleClickEditType","ManagementScreens","ChatPrivacyType","handleClickDiscussion","Discussion","handleClickPermissions","GroupPermissions","handleClickAdministrators","ChatAdministrators","handleSetPhoto","handleAboutChange","handleUpdateGroup","trimmedTitle","trimmedAbout","handleClickMembers","GroupMembers","handleTogglePreHistory","isPreHistoryHidden","isEnabled","enabledPermissionsCount","defaultBannedRights","sendStickers","sendGifs","adminsCount","adminMembers","handleDeleteGroup","formatInteger","onChatMemberSelect","updateChatDefaultBannedRights","permissions","setPermissions","havePermissionChanged","setHavePermissionChanged","handleRemovedUsersClick","GroupRemovedUsers","handleAddExceptionClick","GroupUserPermissionsCreate","handleExceptionMemberClick","promotedByUserId","GroupUserPermissions","handlePermissionChange","getUpdatedPermissionValue","handleSavePermissions","bannedRights","removedUsersCount","kickedMembers","exceptionMembers","members","getMemberExceptions","langKey","getLangKeyForBannedRightKey","translatedString","sendMessages","blocking","sendMedia","sendPolls","embedLinks","inviteUsers","pinMessages","changeInfo","updateChatMemberBannedRights","removedMembers","getRemovedBy","kickedByUserId","kickedByUser","getContextActions","isSignaturesShown","toggleSignatures","hasLinkedChat","handleUpdateChannel","handleToggleSignatures","handleClickSubscribers","ChannelSubscribers","handleDeleteChannel","selectManagement","checkPublicLink","updatePublicLink","updatePrivateLink","privateLink","inviteLink","privacyType","setPrivacyType","isRevokeConfirmDialogOpen","openRevokeConfirmDialog","closeRevokeConfirmDialog","canUpdate","handleOptionChange","handleSave","handleRevokePrivateLink","langPrefix1","langPrefix2","SafeLink","forDiscussionIds","linkedChat","loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup","linkedGroupId","setLinkedGroupId","isConfirmUnlinkGroupDialogOpen","openConfirmUnlinkGroupDialog","closeConfirmUnlinkGroupDialog","isConfirmLinkGroupDialogOpen","openConfirmLinkGroupDialog","closeConfirmLinkGroupDialog","handleUnlinkGroupSessions","channelId","Initial","handleLinkGroupSessions","renderLinkGroupHeader","linkedGroup","renderLinkGroupConfirmText","hasPrivateLink","STICKER_SIZE_DISCUSSION_GROUPS","teactFastList","teactOrderKey","isButtonsInOneRow","isPromotedByCurrentUser","isFormFullyDisabled","selectedChatMemberId","isBanConfirmationDialogOpen","openBanConfirmationDialog","closeBanConfirmationDialog","selectedChatMember","handleBanFromGroup","viewMessages","getControlIsDisabled","isOwner","handleAdminMemberClick","ChatAdminRights","getMemberStatus","promotedByUser","GroupRecentActions","updateChatAdmin","setIsTouched","isDismissConfirmationDialogOpen","openDismissConfirmationDialog","closeDismissConfirmationDialog","customTitle","setCustomTitle","adminRights","handleDismissAdmin","memberStatus","handleCustomTitleChange","postMessages","editMessages","banUsers","addAdmins","anonymous","maxLength","openUserInfo","memberId","managementType","selectCurrentManagementType","CURRENCIES","USD","EUR","GBP","JPY","RUB","UAH","INR","AED","getCurrencySign","currency","VISA","MASTERCARD1","MASTERCARD2","CardType","cards","Default","Visa","Mastercard","detectCardType","cardNumber","streetLine1","streetLine2","city","countryIso2","postCode","phone","shipping","cardholder","expiry","cvv","billingCountry","billingZip","saveInfo","saveCredentials","formErrors","reducer","getBillingCountry","countryCode","countryList","useFocusAfterAnimation","animationDuration","hasArrow","labelText","htmlFor","needEmail","needPhone","needName","needAddress","phoneRef","selectCountryRef","handleAddress1Change","handleAddress2Change","handleCityChange","handleStateChange","handleCountryChange","handlePostCodeChange","handleFullNameChange","handleEmailChange","handlePhoneChange","handleSaveInfoChange","shippingOptions","handleShippingSelect","amount","renderPaymentItem","main","renderCheckoutItem","invoiceContent","prices","shippingPrices","checkoutInfo","totalPrice","photoUrl","paymentMethod","paymentProvider","shippingAddress","shippingMethod","item","expiryInputRef","charAt","parts","formatCardExpiry","cardNumberRef","cardType","setCardType","newCardType","formatCardNumber","cardIcon","mastercardIconPath","visaIconPath","getCardIcon","canSaveCredentials","needCardholderName","needCountry","needZip","handleCardNumberChange","handleCardholderChange","toUpperCase","handleExpiryChange","handleCvvChange","handleBillingPostCodeChange","handleChangeSaveCredentials","savedInfo","invoice","nativeProvider","nativeParams","passwordMissing","payment","isProviderError","nameRequested","phoneRequested","emailRequested","shippingAddressRequested","flexible","phoneToProvider","emailToProvider","globalDialogs","validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError","paymentState","paymentDispatch","currencySign","field","fieldError","errors","getShippingErrors","handleErrorModalClose","PaymentStep","Checkout","shippingOption","getShippingPrices","totalPrices","concat","acc","cur","getTotalPrice","detectCardTypeText","findShippingOption","getCheckoutInfo","validateRequest","requestInfo","getRequestInfo","sendCredentials","credentials","expiryMonth","expiryYear","zip","getCredentials","sendForm","shippingOptionId","setStep","nextStep","ShippingInfo","Shipping","PaymentInfo","buttonText","cuurentStep","renderModalContent","renderError","optionId","receipt","mapedPrices","info","totalAmount","credentialsTitle","fullAddress","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","path","location","cropperResultOptions","quality","format","circle","Croppie","croppiePromise","cropper","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","enableZoom","boundary","viewport","blobToDataUri","bind","err","DEBUG","console","initCropper","ensureCroppie","croppedImg","blobToFile","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","URL","revokeObjectURL","createObjectURL","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","STICKER_SIZE","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","isPeekShown","setIsPeekShown","handleFirstMonkeyLoad","STICKER_SIZE_TWO_FA","playSegment","onInputChange","setPassword","canSubmit","setCanSubmit","select","autoComplete","MIN_PASSWORD_LENGTH"],"mappings":"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","file":"3.356913bd8f5c1b421f79.js","sourcesContent":["import { ApiMessage, ApiDimensions } from '../../../api/types';\n\nimport { MediaViewerOrigin } from '../../../types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport {\n calculateDimensions,\n getMediaViewerAvailableDimensions,\n MEDIA_VIEWER_MEDIA_QUERY,\n REM,\n} from '../../common/helpers/mediaDimensions';\nimport windowSize from '../../../util/windowSize';\n\nconst ANIMATION_DURATION = 200;\n\nexport function animateOpening(\n hasFooter: boolean,\n origin: MediaViewerOrigin,\n bestImageData: string,\n dimensions: ApiDimensions,\n isVideo: boolean,\n message?: ApiMessage,\n) {\n const { mediaEl: fromImage } = getNodes(origin, message);\n if (!fromImage) {\n return;\n }\n\n const { width: windowWidth } = windowSize.get();\n const {\n width: availableWidth, height: availableHeight,\n } = getMediaViewerAvailableDimensions(hasFooter, isVideo);\n const { width: toWidth, height: toHeight } = calculateDimensions(\n availableWidth, availableHeight, dimensions.width, dimensions.height,\n );\n const toLeft = (windowWidth - toWidth) / 2;\n const toTop = getTopOffset(hasFooter) + (availableHeight - toHeight) / 2;\n\n let {\n top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight,\n } = fromImage.getBoundingClientRect();\n\n if ([\n MediaViewerOrigin.SharedMedia,\n MediaViewerOrigin.Album,\n MediaViewerOrigin.ScheduledAlbum,\n MediaViewerOrigin.SearchResult,\n ].includes(origin)) {\n const uncovered = uncover(toWidth, toHeight, fromTop, fromLeft, fromWidth, fromHeight);\n fromTop = uncovered.top;\n fromLeft = uncovered.left;\n fromWidth = uncovered.width;\n fromHeight = uncovered.height;\n }\n\n const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2);\n const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2);\n const fromScaleX = fromWidth / toWidth;\n const fromScaleY = fromHeight / toHeight;\n\n const ghost = createGhost(bestImageData || fromImage);\n applyStyles(ghost, {\n top: `${toTop}px`,\n left: `${toLeft}px`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`,\n });\n applyShape(ghost, origin);\n\n document.body.classList.add('ghost-animating');\n\n requestAnimationFrame(() => {\n document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n ghost.style.transform = '';\n clearShape(ghost);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (document.body.contains(ghost)) {\n document.body.removeChild(ghost);\n }\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nexport function animateClosing(origin: MediaViewerOrigin, bestImageData: string, message?: ApiMessage) {\n const { container, mediaEl: toImage } = getNodes(origin, message);\n if (!toImage) {\n return;\n }\n\n const fromImage = document.getElementById('MediaViewer')!.querySelector(\n '.active .media-viewer-content img, .active .media-viewer-content video',\n );\n if (!fromImage || !toImage) {\n return;\n }\n\n const {\n top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight,\n } = fromImage.getBoundingClientRect();\n const {\n top: targetTop, left: toLeft, width: toWidth, height: toHeight,\n } = toImage.getBoundingClientRect();\n\n let toTop = targetTop;\n if (!isElementInViewport(container)) {\n const { height: windowHeight } = windowSize.get();\n toTop = targetTop < fromTop ? -toHeight : windowHeight;\n }\n\n const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2);\n const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2);\n let fromScaleX = fromWidth / toWidth;\n let fromScaleY = fromHeight / toHeight;\n\n const shouldFadeOut = (\n [MediaViewerOrigin.Inline, MediaViewerOrigin.ScheduledInline].includes(origin)\n && !isMessageImageFullyVisible(container, toImage)\n ) || (\n [MediaViewerOrigin.Album, MediaViewerOrigin.ScheduledAlbum].includes(origin)\n && !isMessageImageFullyVisible(container, toImage)\n );\n\n if ([\n MediaViewerOrigin.SharedMedia,\n MediaViewerOrigin.Album,\n MediaViewerOrigin.ScheduledAlbum,\n MediaViewerOrigin.SearchResult,\n ].includes(origin)) {\n if (fromScaleX > fromScaleY) {\n fromScaleX = fromScaleY;\n } else if (fromScaleY > fromScaleX) {\n fromScaleY = fromScaleX;\n }\n }\n\n const existingGhost = document.getElementsByClassName('ghost')[0] as HTMLDivElement;\n\n const ghost = existingGhost || createGhost(bestImageData || toImage, origin === MediaViewerOrigin.ProfileAvatar);\n if (!existingGhost) {\n applyStyles(ghost, {\n top: `${toTop}px`,\n left: `${toLeft}px`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`,\n });\n }\n\n requestAnimationFrame(() => {\n if (existingGhost) {\n const {\n top,\n left,\n width,\n height,\n } = existingGhost.getBoundingClientRect();\n const scaleX = width / toWidth;\n const scaleY = height / toHeight;\n\n applyStyles(ghost, {\n transition: 'none',\n top: `${toTop}px`,\n left: `${toLeft}px`,\n transformOrigin: 'top left',\n transform: `translate3d(${left - toLeft}px, ${top - toTop}px, 0) scale(${scaleX}, ${scaleY})`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n });\n }\n document.body.classList.add('ghost-animating');\n if (!existingGhost) document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n if (existingGhost) {\n existingGhost.style.transition = '';\n }\n\n ghost.style.transform = '';\n\n if (shouldFadeOut) {\n ghost.style.opacity = '0';\n }\n\n applyShape(ghost, origin);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (document.body.contains(ghost)) {\n document.body.removeChild(ghost);\n }\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nfunction createGhost(source: string | HTMLImageElement | HTMLVideoElement, shouldAppendProfileInfo = false) {\n const ghost = document.createElement('div');\n ghost.classList.add('ghost');\n\n const img = new Image();\n\n if (typeof source === 'string') {\n img.src = source;\n } else if (source instanceof HTMLVideoElement) {\n img.src = source.poster;\n } else {\n img.src = source.src;\n }\n\n ghost.appendChild(img);\n\n if (shouldAppendProfileInfo) {\n ghost.classList.add('ProfileInfo');\n const profileInfo = document.querySelector('#RightColumn .ProfileInfo .info');\n if (profileInfo) {\n ghost.appendChild(profileInfo.cloneNode(true));\n }\n }\n\n return ghost;\n}\n\nfunction uncover(realWidth: number, realHeight: number, top: number, left: number, width: number, height: number) {\n if (realWidth === realHeight) {\n const size = Math.max(width, height) * (realWidth / realHeight);\n left -= (size - width) / 2;\n top -= (size - height) / 2;\n width = size;\n height = size;\n } else if (realWidth > realHeight) {\n const srcWidth = width;\n width = height * (realWidth / realHeight);\n left -= (width - srcWidth) / 2;\n } else if (realHeight > realWidth) {\n const srcHeight = height;\n height = width * (realHeight / realWidth);\n top -= (height - srcHeight) / 2;\n }\n\n return {\n top, left, width, height,\n };\n}\n\nfunction isElementInViewport(el: HTMLElement) {\n if (el.style.display === 'none') {\n return false;\n }\n\n const rect = el.getBoundingClientRect();\n const { height: windowHeight } = windowSize.get();\n\n return (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);\n}\n\nfunction isMessageImageFullyVisible(container: HTMLElement, imageEl: HTMLElement) {\n const messageListElement = document.querySelector('.active > .MessageList')!;\n let imgOffsetTop = container.offsetTop + imageEl.closest('.content-inner, .WebPage')!.offsetTop;\n if (container.id.includes('album-media-')) {\n imgOffsetTop += container.parentElement!.offsetTop + container.closest('.Message')!.offsetTop;\n }\n\n return imgOffsetTop > messageListElement.scrollTop\n && imgOffsetTop + imageEl.offsetHeight < messageListElement.scrollTop + messageListElement.offsetHeight;\n}\n\nfunction getTopOffset(hasFooter: boolean) {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n let topOffsetRem = 4.125;\n if (hasFooter) {\n topOffsetRem += mql.matches ? 0.875 : 3.375;\n }\n\n return topOffsetRem * REM;\n}\n\nfunction applyStyles(element: HTMLElement, styles: Record) {\n Object.assign(element.style, styles);\n}\n\nfunction getNodes(origin: MediaViewerOrigin, message?: ApiMessage) {\n let containerSelector;\n let mediaSelector;\n\n switch (origin) {\n case MediaViewerOrigin.Album:\n case MediaViewerOrigin.ScheduledAlbum:\n containerSelector = `.active > .MessageList #album-media-${message!.id}`;\n mediaSelector = '.full-media';\n break;\n\n case MediaViewerOrigin.SharedMedia:\n containerSelector = `#shared-media${message!.id}`;\n mediaSelector = 'img';\n break;\n\n case MediaViewerOrigin.SearchResult:\n containerSelector = `#search-media${message!.id}`;\n mediaSelector = 'img';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\n containerSelector = '.MiddleHeader .ChatInfo .Avatar';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ProfileAvatar:\n containerSelector = '#RightColumn .ProfileInfo .active .ProfilePhoto';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ScheduledInline:\n case MediaViewerOrigin.Inline:\n default:\n containerSelector = `.active > .MessageList #message${message!.id}`;\n mediaSelector = '.message-content .full-media, .message-content .thumbnail';\n }\n\n const container = document.querySelector(containerSelector)!;\n const mediaEls = container && container.querySelectorAll(mediaSelector);\n\n return {\n container,\n mediaEl: mediaEls && mediaEls[mediaEls.length - 1],\n };\n}\n\nfunction applyShape(ghost: HTMLDivElement, origin: MediaViewerOrigin) {\n switch (origin) {\n case MediaViewerOrigin.Album:\n case MediaViewerOrigin.ScheduledAlbum:\n case MediaViewerOrigin.Inline:\n case MediaViewerOrigin.ScheduledInline:\n ghost.classList.add('rounded-corners');\n break;\n\n case MediaViewerOrigin.SharedMedia:\n case MediaViewerOrigin.ProfileAvatar:\n case MediaViewerOrigin.SearchResult:\n (ghost.firstChild as HTMLElement).style.objectFit = 'cover';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\n ghost.classList.add('circle');\n break;\n }\n}\n\nfunction clearShape(ghost: HTMLDivElement) {\n (ghost.firstChild as HTMLElement).style.objectFit = 'default';\n ghost.classList.remove('rounded-corners', 'circle');\n}\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiMessage, ApiUser } from '../../api/types';\n\nimport { getSenderTitle, isChatPrivate } from '../../modules/helpers';\nimport { formatMediaDateTime } from '../../util/dateFormat';\nimport renderText from '../common/helpers/renderText';\nimport {\n selectChat,\n selectChatMessage,\n selectSender,\n selectUser,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from '../common/Avatar';\n\nimport './SenderInfo.scss';\n\ntype OwnProps = {\n chatId?: number;\n messageId?: number;\n isAvatar?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiUser | ApiChat;\n message?: ApiMessage;\n};\n\ntype DispatchProps = Pick;\n\nconst SenderInfo: FC = ({\n chatId, messageId, sender, isAvatar, message, closeMediaViewer, focusMessage,\n}) => {\n const handleFocusMessage = useCallback(() => {\n closeMediaViewer();\n focusMessage({ chatId, messageId });\n }, [chatId, focusMessage, messageId, closeMediaViewer]);\n\n const lang = useLang();\n\n if (!sender || (!message && !isAvatar)) {\n return undefined;\n }\n\n const isFromChat = sender.id < 0;\n const senderTitle = getSenderTitle(lang, sender);\n\n return (\n
\n {isFromChat ? (\n \n ) : (\n \n )}\n
\n
\n {senderTitle && renderText(senderTitle)}\n
\n
\n {isAvatar ? lang('lng_mediaview_profile_photo') : formatMediaDateTime(lang, message!.date * 1000)}\n
\n
\n
\n );\n};\n\nexport default withGlobal(\n (global, { chatId, messageId, isAvatar }): StateProps => {\n if (isAvatar && chatId) {\n return {\n sender: isChatPrivate(chatId) ? selectUser(global, chatId) : selectChat(global, chatId),\n };\n }\n\n if (!messageId || !chatId) {\n return {};\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n\n return {\n message,\n sender: message && selectSender(global, message),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['closeMediaViewer', 'focusMessage']),\n)(SenderInfo);\n","import React, { FC, useMemo } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { getMessageMediaHash } from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport useMediaDownload from '../../hooks/useMediaDownload';\n\nimport Button from '../ui/Button';\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport ProgressSpinner from '../ui/ProgressSpinner';\n\nimport './MediaViewerActions.scss';\n\ntype OwnProps = {\n mediaData?: string;\n isVideo: boolean;\n isZoomed: boolean;\n message?: ApiMessage;\n fileName?: string;\n isAvatar?: boolean;\n onCloseMediaViewer: NoneToVoidFunction;\n onForward: NoneToVoidFunction;\n onZoomToggle: NoneToVoidFunction;\n};\n\nconst MediaViewerActions: FC = ({\n mediaData,\n isVideo,\n isZoomed,\n message,\n fileName,\n isAvatar,\n onCloseMediaViewer,\n onForward,\n onZoomToggle,\n}) => {\n const {\n isDownloadStarted,\n downloadProgress,\n handleDownloadClick,\n } = useMediaDownload(\n message && isVideo ? getMessageMediaHash(message, 'download') : undefined,\n fileName,\n );\n\n const lang = useLang();\n\n const MenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, []);\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n return (\n
\n \n {!isAvatar && (\n \n {lang('Forward')}\n \n )}\n {isVideo ? (\n \n {isDownloadStarted ? `${Math.round(downloadProgress * 100)}% Downloading...` : 'Download'}\n \n ) : (\n \n {lang('AccActionDownload')}\n \n )}\n \n {isDownloadStarted && }\n
\n );\n }\n\n return (\n
\n {!isAvatar && (\n <>\n \n \n \n \n )}\n {isVideo ? (\n \n {isDownloadStarted ? (\n \n ) : (\n \n )}\n \n ) : (\n \n \n \n )}\n \n \n \n \n \n \n
\n );\n};\n\nexport default MediaViewerActions;\n","import React, { FC, useEffect, useState } from '../../lib/teact/teact';\n\nimport { throttle } from '../../util/schedulers';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport buildClassName from '../../util/buildClassName';\nimport { REM } from '../common/helpers/mediaDimensions';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\n\nimport './MediaViewerFooter.scss';\n\nconst RESIZE_THROTTLE_MS = 500;\n\ntype OwnProps = {\n text: TextPart | TextPart[];\n onClick: () => void;\n isHidden?: boolean;\n isForVideo: boolean;\n};\n\nconst MediaViewerFooter: FC = ({\n text = '', isHidden, isForVideo, onClick,\n}) => {\n const [isMultiline, setIsMultiline] = useState(false);\n useEffect(() => {\n const footerContent = document.querySelector('.MediaViewerFooter .media-text') as HTMLDivElement | null;\n\n const checkIsMultiline = () => {\n const height = footerContent ? footerContent.clientHeight : 0;\n\n setIsMultiline(height > REM * 2);\n };\n\n // First run for initial detection of multiline footer text\n checkIsMultiline();\n\n const handleResize = throttle(checkIsMultiline, RESIZE_THROTTLE_MS, true);\n\n window.addEventListener('resize', handleResize, false);\n\n return () => {\n window.removeEventListener('resize', handleResize, false);\n };\n }, []);\n\n function stopEvent(e: React.MouseEvent) {\n if (text) {\n e.stopPropagation();\n }\n }\n\n const classNames = buildClassName(\n 'MediaViewerFooter',\n isForVideo && 'is-for-video',\n isHidden && 'is-hidden',\n );\n\n return (\n
\n {text && (\n
\n

{text}

\n
\n )}\n
\n );\n};\n\nexport default MediaViewerFooter;\n","import { useLayoutEffect, useState } from '../lib/teact/teact';\nimport { PLATFORM_ENV } from '../util/environment';\n\ntype RefType = {\n current: HTMLElement | null;\n};\n\ntype ReturnType = [boolean, () => void, () => void] | [false];\ntype CallbackType = (isPlayed: boolean) => void;\n\nconst prop = getBrowserFullscreenElementProp();\n\nexport default function useFullscreenStatus(elRef: RefType, setIsPlayed: CallbackType): ReturnType {\n const [isFullscreen, setIsFullscreen] = useState(Boolean(prop && document[prop]));\n\n const setFullscreen = () => {\n if (!elRef.current || !(prop || PLATFORM_ENV === 'iOS')) {\n return;\n }\n\n if (elRef.current.requestFullscreen) {\n elRef.current.requestFullscreen();\n } else if (elRef.current.webkitRequestFullscreen) {\n elRef.current.webkitRequestFullscreen();\n } else if (elRef.current.webkitEnterFullscreen) {\n elRef.current.webkitEnterFullscreen();\n } else if (elRef.current.mozRequestFullScreen) {\n elRef.current.mozRequestFullScreen();\n }\n\n setIsFullscreen(true);\n };\n\n const exitFullscreen = () => {\n if (!elRef.current) {\n return;\n }\n\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.webkitCancelFullScreen) {\n document.webkitCancelFullScreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n }\n\n setIsFullscreen(false);\n };\n\n useLayoutEffect(() => {\n const listener = () => { setIsFullscreen(Boolean(prop && document[prop])); };\n const listenerEnter = () => { setIsFullscreen(true); };\n const listenerExit = () => {\n setIsFullscreen(false);\n setIsPlayed(false);\n };\n const video = elRef.current;\n\n document.addEventListener('fullscreenchange', listener, false);\n document.addEventListener('webkitfullscreenchange', listener, false);\n document.addEventListener('mozfullscreenchange', listener, false);\n\n if (video) {\n video.addEventListener('webkitbeginfullscreen', listenerEnter, false);\n video.addEventListener('webkitendfullscreen', listenerExit, false);\n }\n\n return () => {\n document.removeEventListener('fullscreenchange', listener, false);\n document.removeEventListener('webkitfullscreenchange', listener, false);\n document.removeEventListener('mozfullscreenchange', listener, false);\n if (video) {\n video.removeEventListener('webkitbeginfullscreen', listenerEnter, false);\n video.removeEventListener('webkitendfullscreen', listenerExit, false);\n }\n };\n // eslint-disable-next-line\n }, []);\n\n if (!prop && PLATFORM_ENV !== 'iOS') {\n return [false];\n }\n\n return [isFullscreen, setFullscreen, exitFullscreen];\n}\n\nfunction getBrowserFullscreenElementProp() {\n if (typeof document.fullscreenElement !== 'undefined') {\n return 'fullscreenElement';\n } else if (typeof document.mozFullScreenElement !== 'undefined') {\n return 'mozFullScreenElement';\n } else if (typeof document.webkitFullscreenElement !== 'undefined') {\n return 'webkitFullscreenElement';\n }\n\n return '';\n}\n","const units = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'];\n\nexport default (bytes: number) => {\n const number = bytes === 0 ? 0 : Math.floor(Math.log(bytes) / Math.log(1024));\n\n return `${(bytes / 1024 ** Math.floor(number)).toFixed(1)} ${units[number]}`;\n};\n","import React, { FC, useState, useEffect } from '../../lib/teact/teact';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { formatMediaDuration } from '../../util/dateFormat';\nimport formatFileSize from './helpers/formatFileSize';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './VideoPlayerControls.scss';\n\ntype IProps = {\n bufferedProgress: number;\n currentTime: number;\n duration: number;\n fileSize: number;\n isForceVisible: boolean;\n isForceMobileVersion?: boolean;\n isPlayed: boolean;\n isFullscreenSupported: boolean;\n isFullscreen: boolean;\n onChangeFullscreen: (e: React.MouseEvent) => void;\n onPlayPause: (e: React.MouseEvent) => void;\n onSeek: OnChangeHandler;\n};\n\ntype OnChangeHandler = (e: React.ChangeEvent) => void;\n\nconst stopEvent = (e: React.MouseEvent) => {\n e.stopPropagation();\n};\n\nconst HIDE_CONTROLS_TIMEOUT_MS = 800;\n\nconst VideoPlayerControls: FC = ({\n bufferedProgress,\n currentTime,\n duration,\n fileSize,\n isForceVisible,\n isForceMobileVersion,\n isPlayed,\n isFullscreenSupported,\n isFullscreen,\n onChangeFullscreen,\n onPlayPause,\n onSeek,\n}) => {\n const [isVisible, setVisibility] = useState(true);\n\n useEffect(() => {\n if (isForceVisible) {\n setVisibility(isForceVisible);\n }\n }, [isForceVisible]);\n\n useEffect(() => {\n let timeout: number | undefined;\n\n if (!isForceVisible) {\n if (IS_SINGLE_COLUMN_LAYOUT) {\n setVisibility(false);\n } else {\n timeout = window.setTimeout(() => {\n setVisibility(false);\n }, HIDE_CONTROLS_TIMEOUT_MS);\n }\n }\n\n return () => {\n if (timeout) {\n window.clearTimeout(timeout);\n }\n };\n }, [isForceVisible]);\n\n useEffect(() => {\n if (isVisible || isForceVisible) {\n document.body.classList.add('video-controls-visible');\n }\n\n return () => {\n document.body.classList.remove('video-controls-visible');\n };\n }, [isForceVisible, isVisible]);\n\n const lang = useLang();\n\n if (!isVisible && !isForceVisible) {\n return undefined;\n }\n\n return (\n
\n {renderSeekLine(currentTime, duration, bufferedProgress, onSeek)}\n \n \n \n {renderTime(currentTime, duration)}\n {bufferedProgress < 1 && renderFileSize(bufferedProgress, fileSize)}\n {isFullscreenSupported && (\n \n \n \n )}\n
\n );\n};\n\nfunction renderTime(currentTime: number, duration: number) {\n return (\n
\n {`${formatMediaDuration(currentTime)} / ${formatMediaDuration(duration)}`}\n
\n );\n}\n\nfunction renderFileSize(downloadedPercent: number, totalSize: number) {\n return (\n
\n {`${formatFileSize(totalSize * downloadedPercent)} / ${formatFileSize(totalSize)}`}\n
\n );\n}\n\nfunction renderSeekLine(currentTime: number, duration: number, bufferedProgress: number, onSeek: OnChangeHandler) {\n const percentagePlayed = (currentTime / duration) * 100;\n const percentageBuffered = bufferedProgress * 100;\n\n return (\n
\n
\n \n \n \n
\n
\n );\n}\n\nexport default VideoPlayerControls;\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { ApiDimensions } from '../../api/types';\n\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../util/environment';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBuffering from '../../hooks/useBuffering';\nimport useFullscreenStatus from '../../hooks/useFullscreen';\nimport useVideoCleanup from '../../hooks/useVideoCleanup';\nimport safePlay from '../../util/safePlay';\n\nimport VideoPlayerControls from './VideoPlayerControls';\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Button from '../ui/Button';\n\nimport './VideoPlayer.scss';\n\ntype OwnProps = {\n url?: string;\n isGif?: boolean;\n posterData?: string;\n posterSize?: ApiDimensions;\n downloadProgress?: number;\n fileSize: number;\n isMediaViewerOpen?: boolean;\n noPlay?: boolean;\n onClose: (e: React.MouseEvent) => void;\n};\n\nconst MOBILE_VERSION_CONTROL_WIDTH = 400;\n\nconst VideoPlayer: FC = ({\n url,\n isGif,\n posterData,\n posterSize,\n downloadProgress,\n fileSize,\n isMediaViewerOpen,\n noPlay,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n const [isPlayed, setIsPlayed] = useState(!IS_TOUCH_ENV || !IS_IOS);\n const [currentTime, setCurrentTime] = useState(0);\n const [isControlsVisible, setIsControlsVisible] = useState(true);\n\n const [isFullscreen, setFullscreen, exitFullscreen] = useFullscreenStatus(videoRef, setIsPlayed);\n\n const { isBuffered, bufferedProgress, bufferingHandlers } = useBuffering();\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(!isBuffered, undefined, undefined, 'slow');\n const {\n shouldRender: shouldRenderPlayButton,\n transitionClassNames: playButtonClassNames,\n } = useShowTransition(IS_IOS && !isPlayed && !shouldRenderSpinner, undefined, undefined, 'slow');\n\n useEffect(() => {\n if (noPlay || !isMediaViewerOpen) {\n videoRef.current!.pause();\n } else if (url && !IS_TOUCH_ENV) {\n // Chrome does not automatically start playing when `url` becomes available (even with `autoPlay`),\n // so we force it here. Contrary, iOS does not allow to call `play` without mouse event,\n // so we need to use `autoPlay` instead to allow pre-buffering.\n safePlay(videoRef.current!);\n }\n }, [noPlay, isMediaViewerOpen, url]);\n\n useEffect(() => {\n if (videoRef.current!.currentTime === videoRef.current!.duration) {\n setCurrentTime(0);\n setIsPlayed(false);\n } else {\n setCurrentTime(videoRef.current!.currentTime);\n }\n }, [currentTime]);\n\n const togglePlayState = useCallback((e: React.MouseEvent | KeyboardEvent) => {\n e.stopPropagation();\n if (isPlayed) {\n videoRef.current!.pause();\n setIsPlayed(false);\n } else {\n videoRef.current!.play();\n setIsPlayed(true);\n }\n }, [isPlayed]);\n\n useVideoCleanup(videoRef, []);\n\n const handleMouseOver = useCallback(() => {\n setIsControlsVisible(true);\n }, []);\n\n const handleMouseOut = useCallback(() => {\n setIsControlsVisible(false);\n }, []);\n\n const handleTimeUpdate = useCallback((e: React.SyntheticEvent) => {\n setCurrentTime(e.currentTarget.currentTime);\n }, []);\n\n const handleEnded = useCallback(() => {\n setCurrentTime(0);\n setIsPlayed(false);\n }, []);\n\n const handleFullscreenChange = useCallback(() => {\n if (isFullscreen && exitFullscreen) {\n exitFullscreen();\n } else if (!isFullscreen && setFullscreen) {\n setFullscreen();\n }\n }, [exitFullscreen, isFullscreen, setFullscreen]);\n\n const handleSeek = useCallback((e: React.ChangeEvent) => {\n e.stopPropagation();\n\n videoRef.current!.currentTime = (Number(e.target.value) * videoRef.current!.duration) / 100;\n }, []);\n\n const toggleControls = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setIsControlsVisible(!isControlsVisible);\n }, [isControlsVisible]);\n\n useEffect(() => {\n const togglePayingStateBySpace = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n togglePlayState(e);\n }\n };\n\n document.addEventListener('keydown', togglePayingStateBySpace, false);\n\n return () => {\n document.removeEventListener('keydown', togglePayingStateBySpace, false);\n };\n }, [togglePlayState]);\n\n const wrapperStyle = posterSize && `width: ${posterSize.width}px; height: ${posterSize.height}px`;\n const videoStyle = `background-image: url(${posterData})`;\n\n return (\n \n \n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n {url && }\n \n
\n {shouldRenderPlayButton && (\n \n )}\n {shouldRenderSpinner && (\n
\n {!isBuffered &&
Buffering...
}\n \n
\n )}\n {!isGif && !shouldRenderSpinner && (\n \n )}\n
\n );\n};\n\nexport default memo(VideoPlayer);\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport usePrevious from '../../hooks/usePrevious';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './ZoomControls.scss';\n\ntype OwnProps = {\n isShown: boolean;\n onChangeZoom: (level: number, canCloseZoom?: boolean) => void;\n};\n\nexport const MAX_ZOOM_LEVEL = 3;\nexport const MIN_ZOOM_LEVEL = 1;\nconst ONE_STEP_PERCENT = 100 / (MAX_ZOOM_LEVEL - MIN_ZOOM_LEVEL);\nconst RESET_ZOOM_LEVEL = 1.5;\n\nconst ZoomControls: FC = ({ isShown, onChangeZoom }) => {\n const { transitionClassNames } = useShowTransition(isShown);\n const prevIsShown = usePrevious(isShown);\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [zoomLevel, setZoomLevel] = useState(1);\n const isSeeking = useRef(false);\n\n useEffect(() => {\n if (isShown && !prevIsShown) {\n setZoomLevel(RESET_ZOOM_LEVEL);\n }\n }, [isShown, prevIsShown]);\n\n const handleZoomOut = () => {\n if (inputRef.current) {\n setZoomLevel(Math.max(MIN_ZOOM_LEVEL, zoomLevel - 0.5));\n }\n };\n\n const handleZoomIn = () => {\n if (inputRef.current) {\n setZoomLevel(Math.min(MAX_ZOOM_LEVEL, zoomLevel + 0.5));\n }\n };\n\n const handleStartSeek = useCallback(() => {\n isSeeking.current = true;\n }, []);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n if (zoomLevel === 1) {\n onChangeZoom(zoomLevel, !isSeeking.current);\n }\n }, [onChangeZoom, zoomLevel]);\n\n const handleSeeklineChange = (e:React.ChangeEvent) => {\n setZoomLevel(Math.min(MAX_ZOOM_LEVEL, Math.max(Number(e.target.value), MIN_ZOOM_LEVEL)));\n };\n\n useEffect(() => {\n onChangeZoom(zoomLevel, !isSeeking.current);\n }, [zoomLevel, onChangeZoom]);\n\n const lang = useLang();\n\n const className = buildClassName(\n 'ZoomControls',\n transitionClassNames,\n );\n\n return (\n
\n \n \n \n \n \n \n
\n
\n \n \n
\n
\n
\n );\n};\n\nexport default memo(ZoomControls);\n","/*\n @source https://github.com/ajainarayanan/react-pan-zoom\n\n Heavily inspired/lifted from this idea: https://stackoverflow.com/a/39311435/661768\n without jqueryUI or jquery dependency.\n*/\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { areSortedArraysEqual } from '../../util/iteratees';\n\nimport './PanZoom.scss';\n\nexport interface IDragData {\n x: number;\n y: number;\n dx: number;\n dy: number;\n}\n\nexport interface OwnProps {\n children: any;\n className?: string;\n noWrap: boolean;\n canPan: boolean;\n zoomLevel: number;\n panDeltaX: number;\n panDeltaY: number;\n onPan?: (x: number, y: number) => void;\n}\n\nconst INITIAL_MATRIX = [\n 1, 0, 0, 1, 0, 0,\n];\n\nconst SCALE_VALUES = {\n 1: 1,\n 1.5: 1.5,\n 2: 2.2,\n 2.5: 3.3,\n 3: 5.5,\n};\n\nconst ZOOM_SAFE_AREA = 150;\n\nfunction calculateSafeZoneOnZoom(oldScale: number, matrixData: number[], wrapper: HTMLDivElement | null) {\n const image = wrapper && wrapper.querySelector('.active img');\n if (!wrapper || !image) {\n return matrixData;\n }\n const wrapperRect = wrapper.getBoundingClientRect();\n const imageRect = image.getBoundingClientRect();\n\n const newImgWidth = (imageRect.width / oldScale) * matrixData[0];\n const newImgHeight = (imageRect.height / oldScale) * matrixData[3];\n const newImgX = (wrapperRect.width - newImgWidth) / 2 + matrixData[4];\n const newImgY = (wrapperRect.height - newImgHeight) / 2 + matrixData[5];\n if (wrapperRect.width && wrapperRect.width - ZOOM_SAFE_AREA < newImgX) {\n matrixData[4] -= newImgX + wrapperRect.width - ZOOM_SAFE_AREA;\n } else if (newImgWidth && newImgWidth + newImgX < ZOOM_SAFE_AREA) {\n matrixData[4] -= newImgWidth + newImgX - ZOOM_SAFE_AREA;\n }\n if (wrapperRect.height && wrapperRect.height - ZOOM_SAFE_AREA < newImgY) {\n matrixData[5] -= newImgY + wrapperRect.height - ZOOM_SAFE_AREA;\n } else if (newImgHeight && newImgHeight + newImgY < ZOOM_SAFE_AREA) {\n matrixData[5] -= newImgHeight + newImgY - ZOOM_SAFE_AREA;\n }\n\n return matrixData;\n}\n\nconst PanZoom: FC = ({\n children,\n className,\n noWrap,\n canPan,\n zoomLevel,\n panDeltaX,\n panDeltaY,\n onPan,\n}) => {\n const tunedZoomLevel = SCALE_VALUES[zoomLevel as keyof typeof SCALE_VALUES] || zoomLevel;\n const [isDragging, setIsDragging] = useState(false);\n const [dragData, setDragData] = useState({\n dx: panDeltaX, dy: panDeltaY, x: 0, y: 0,\n });\n // [zoom, skew, skew, zoom, dx, dy] - see https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix()\n const [matrixData, setMatrixData] = useState(INITIAL_MATRIX);\n // Used to set cursor while moving.\n // eslint-disable-next-line no-null/no-null\n const panWrapperRef = useRef(null);\n // Used to set transform for pan.\n // eslint-disable-next-line no-null/no-null\n const panContainerRef = useRef(null);\n\n useEffect(() => {\n const newZoomLevel = tunedZoomLevel || matrixData[0];\n const newPandx = panDeltaX || matrixData[4];\n const newPandy = panDeltaY || matrixData[5];\n\n const newMatrixData = [...matrixData];\n if (matrixData[0] !== newZoomLevel) {\n newMatrixData[0] = newZoomLevel || newMatrixData[0];\n newMatrixData[3] = newZoomLevel || newMatrixData[3];\n }\n if (matrixData[4] !== newPandx) {\n newMatrixData[4] = newPandx;\n }\n if (matrixData[5] !== newPandy) {\n newMatrixData[5] = newPandy;\n }\n\n if (!areSortedArraysEqual(matrixData, newMatrixData)) {\n setMatrixData(calculateSafeZoneOnZoom(matrixData[0], newMatrixData, panWrapperRef.current));\n }\n // eslint-disable-next-line\n }, [panDeltaX, panDeltaY, tunedZoomLevel]);\n\n useEffect(() => {\n if (!canPan) {\n setMatrixData(INITIAL_MATRIX);\n }\n }, [canPan]);\n\n useEffect(() => {\n if (panContainerRef.current) {\n panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`;\n }\n }, [noWrap, matrixData]);\n\n const handleMouseDown = (e: React.MouseEvent) => {\n if (!canPan) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n\n const offsetX = matrixData[4];\n const offsetY = matrixData[5];\n const newDragData: IDragData = {\n dx: offsetX,\n dy: offsetY,\n x: e.pageX,\n y: e.pageY,\n };\n setDragData(newDragData);\n setIsDragging(true);\n\n if (panWrapperRef.current) {\n panWrapperRef.current.classList.add('move');\n }\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n\n if (panWrapperRef.current) {\n panWrapperRef.current.classList.remove('move');\n }\n\n if (onPan) {\n onPan(matrixData[4], matrixData[5]);\n }\n };\n\n function getNewMatrixData(x: number, y: number): number[] {\n const newMatrixData = [...matrixData];\n const deltaX = dragData.x - x;\n const deltaY = dragData.y - y;\n newMatrixData[4] = dragData.dx - deltaX;\n newMatrixData[5] = dragData.dy - deltaY;\n\n return newMatrixData;\n }\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (isDragging) {\n const newMatrixData = getNewMatrixData(e.pageX, e.pageY);\n setMatrixData(newMatrixData);\n\n if (panContainerRef.current) {\n panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`;\n }\n }\n };\n\n if (noWrap) {\n return children;\n }\n\n return (\n \n \n {children}\n
\n
\n );\n};\n\nexport default memo(PanZoom);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiChat, ApiMediaFormat, ApiMessage, ApiUser, ApiDimensions,\n} from '../../api/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../util/environment';\nimport windowSize from '../../util/windowSize';\nimport {\n AVATAR_FULL_DIMENSIONS,\n MEDIA_VIEWER_MEDIA_QUERY,\n calculateMediaViewerDimensions,\n} from '../common/helpers/mediaDimensions';\nimport {\n selectChat,\n selectChatMessage,\n selectChatMessages,\n selectCurrentMediaSearch,\n selectListedIds,\n selectOutlyingIds,\n selectScheduledMessage,\n selectScheduledMessages,\n selectUser,\n} from '../../modules/selectors';\nimport {\n getChatAvatarHash,\n getChatMediaMessageIds,\n getMessageFileName,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessagePhoto,\n getMessageVideo,\n getMessageDocument,\n isMessageDocumentPhoto,\n isMessageDocumentVideo,\n getMessageWebPagePhoto,\n getMessageWebPageVideo,\n getPhotoFullDimensions,\n getVideoDimensions, getMessageFileSize,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { stopCurrentAudio } from '../../util/audioPlayer';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useBlurSync from '../../hooks/useBlurSync';\nimport usePrevious from '../../hooks/usePrevious';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport { renderMessageText } from '../common/helpers/renderMessageText';\nimport { animateClosing, animateOpening } from './helpers/ghostAnimation';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Spinner from '../ui/Spinner';\nimport ShowTransition from '../ui/ShowTransition';\nimport Transition from '../ui/Transition';\nimport Button from '../ui/Button';\nimport SenderInfo from './SenderInfo';\nimport MediaViewerActions from './MediaViewerActions';\nimport MediaViewerFooter from './MediaViewerFooter';\nimport VideoPlayer from './VideoPlayer';\nimport ZoomControls from './ZoomControls';\nimport PanZoom from './PanZoom';\n\nimport './MediaViewer.scss';\n\ntype StateProps = {\n chatId?: number;\n threadId?: number;\n messageId?: number;\n senderId?: number;\n origin?: MediaViewerOrigin;\n avatarOwner?: ApiChat | ApiUser;\n profilePhotoIndex?: number;\n message?: ApiMessage;\n chatMessages?: Record;\n collectionIds?: number[];\n animationLevel: 0 | 1 | 2;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_DURATION = 350;\n\nconst MediaViewer: FC = ({\n chatId,\n threadId,\n messageId,\n senderId,\n origin,\n avatarOwner,\n profilePhotoIndex,\n message,\n chatMessages,\n collectionIds,\n openMediaViewer,\n closeMediaViewer,\n openForwardMenu,\n focusMessage,\n animationLevel,\n}) => {\n const isOpen = Boolean(avatarOwner || messageId);\n\n const isFromSharedMedia = origin === MediaViewerOrigin.SharedMedia;\n const isFromSearch = origin === MediaViewerOrigin.SearchResult;\n\n /* Content */\n const photo = message ? getMessagePhoto(message) : undefined;\n const video = message ? getMessageVideo(message) : undefined;\n const webPagePhoto = message ? getMessageWebPagePhoto(message) : undefined;\n const webPageVideo = message ? getMessageWebPageVideo(message) : undefined;\n const isDocumentPhoto = message ? isMessageDocumentPhoto(message) : false;\n const isDocumentVideo = message ? isMessageDocumentVideo(message) : false;\n const isVideo = Boolean(video || webPageVideo || isDocumentVideo);\n const isPhoto = Boolean(!isVideo && (photo || webPagePhoto || isDocumentPhoto));\n const { isGif } = video || webPageVideo || {};\n const isAvatar = Boolean(avatarOwner);\n\n /* Navigation */\n const isSingleSlide = Boolean(webPagePhoto || webPageVideo);\n const messageIds = useMemo(() => {\n return isSingleSlide && messageId\n ? [messageId]\n : getChatMediaMessageIds(chatMessages || {}, collectionIds || [], isFromSharedMedia);\n }, [isSingleSlide, messageId, chatMessages, collectionIds, isFromSharedMedia]);\n\n const selectedMediaMessageIndex = messageId ? messageIds.indexOf(messageId) : -1;\n const isFirst = selectedMediaMessageIndex === 0 || selectedMediaMessageIndex === -1;\n const isLast = selectedMediaMessageIndex === messageIds.length - 1 || selectedMediaMessageIndex === -1;\n\n /* Animation */\n const animationKey = useRef();\n const prevSenderId = usePrevious(senderId);\n if (isOpen && (!prevSenderId || prevSenderId !== senderId || !animationKey.current)) {\n animationKey.current = selectedMediaMessageIndex;\n }\n const slideAnimation = animationLevel >= 1 ? 'mv-slide' : 'none';\n const headerAnimation = animationLevel === 2 ? 'slide-fade' : 'none';\n const isGhostAnimation = animationLevel === 2;\n\n /* Controls */\n const [isFooterHidden, setIsFooterHidden] = useState(false);\n const [canPanZoomWrap, setCanPanZoomWrap] = useState(false);\n const [isZoomed, setIsZoomed] = useState(false);\n const [zoomLevel, setZoomLevel] = useState(1);\n const [panDelta, setPanDelta] = useState({ x: 0, y: 0 });\n\n /* Media data */\n function getMediaHash(isFull?: boolean) {\n if (isAvatar && profilePhotoIndex !== undefined) {\n const { photos } = avatarOwner!;\n return photos && photos[profilePhotoIndex]\n ? `photo${photos[profilePhotoIndex].id}?size=c`\n : getChatAvatarHash(avatarOwner!, isFull ? 'big' : 'normal');\n }\n\n return message && getMessageMediaHash(message, isFull ? 'viewerFull' : 'viewerPreview');\n }\n\n const blobUrlPictogram = useMedia(\n message && (isFromSharedMedia || isFromSearch) && getMessageMediaHash(message, 'pictogram'),\n undefined,\n ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const previewMediaHash = getMediaHash();\n const blobUrlPreview = useMedia(\n previewMediaHash,\n undefined,\n isAvatar && previewMediaHash && previewMediaHash.startsWith('profilePhoto')\n ? ApiMediaFormat.DataUri\n : ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const { mediaData: fullMediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMediaHash(true),\n undefined,\n message && getMessageMediaFormat(message, 'viewerFull'),\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n\n const localBlobUrl = (photo || video) ? (photo || video)!.blobUrl : undefined;\n let bestImageData = (!isVideo && (localBlobUrl || fullMediaData)) || blobUrlPreview || blobUrlPictogram;\n const thumbDataUri = useBlurSync(!bestImageData && message && getMessageMediaThumbDataUri(message));\n if (!bestImageData && origin !== MediaViewerOrigin.SearchResult) {\n bestImageData = thumbDataUri;\n }\n\n const videoSize = message ? getMessageFileSize(message) : undefined;\n const fileName = message\n ? getMessageFileName(message)\n : isAvatar\n ? `avatar${avatarOwner!.id}-${profilePhotoIndex}.jpg`\n : undefined;\n\n let dimensions!: ApiDimensions;\n if (message) {\n if (isDocumentPhoto || isDocumentVideo) {\n dimensions = getMessageDocument(message)!.mediaSize!;\n } else if (photo || webPagePhoto) {\n dimensions = getPhotoFullDimensions((photo || webPagePhoto)!)!;\n } else if (video || webPageVideo) {\n dimensions = getVideoDimensions((video || webPageVideo)!)!;\n }\n } else {\n dimensions = AVATAR_FULL_DIMENSIONS;\n }\n\n useEffect(() => {\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n return;\n }\n\n document.body.classList.toggle('is-media-viewer-open', isOpen);\n }, [isOpen]);\n\n const forceUpdate = useForceUpdate();\n useEffect(() => {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', forceUpdate);\n } else if (typeof mql.addListener === 'function') {\n mql.addListener(forceUpdate);\n }\n\n return () => {\n if (typeof mql.removeEventListener === 'function') {\n mql.removeEventListener('change', forceUpdate);\n } else if (typeof mql.removeListener === 'function') {\n mql.removeListener(forceUpdate);\n }\n };\n }, [forceUpdate]);\n\n const prevMessage = usePrevious(message);\n const prevOrigin = usePrevious(origin);\n const prevAvatarOwner = usePrevious(avatarOwner);\n const prevBestImageData = usePrevious(bestImageData);\n useEffect(() => {\n if (isGhostAnimation && isOpen && !prevMessage && !prevAvatarOwner) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n const textParts = message ? renderMessageText(message) : undefined;\n const hasFooter = Boolean(textParts);\n animateOpening(hasFooter, origin!, bestImageData!, dimensions, isVideo, message);\n }\n\n if (isGhostAnimation && !isOpen && (prevMessage || prevAvatarOwner)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n animateClosing(prevOrigin!, prevBestImageData!, prevMessage || undefined);\n }\n }, [\n isGhostAnimation, isOpen, origin, prevOrigin, message, prevMessage, prevAvatarOwner,\n bestImageData, prevBestImageData, dimensions, isVideo,\n ]);\n\n useEffect(() => {\n let timer: number | undefined;\n\n if (isZoomed) {\n setCanPanZoomWrap(true);\n } else {\n timer = window.setTimeout(() => {\n setCanPanZoomWrap(false);\n }, ANIMATION_DURATION);\n }\n\n return () => {\n if (timer) {\n window.clearTimeout(timer);\n }\n };\n }, [isZoomed]);\n\n const closeZoom = () => {\n setIsZoomed(false);\n setZoomLevel(1);\n setPanDelta({ x: 0, y: 0 });\n };\n\n const handleZoomToggle = useCallback(() => {\n setIsZoomed(!isZoomed);\n setZoomLevel(!isZoomed ? 1.5 : 1);\n if (isZoomed) {\n setPanDelta({ x: 0, y: 0 });\n }\n }, [isZoomed]);\n\n const handleZoomValue = useCallback((level: number, canCloseZoom = false) => {\n setZoomLevel(level);\n if (level === 1 && canCloseZoom) {\n closeZoom();\n }\n }, []);\n\n const close = useCallback(() => {\n closeMediaViewer();\n closeZoom();\n }, [closeMediaViewer]);\n\n const handleFooterClick = useCallback(() => {\n close();\n focusMessage({ chatId, threadId, messageId });\n }, [close, chatId, threadId, focusMessage, messageId]);\n\n const handleForward = useCallback(() => {\n openForwardMenu({ fromChatId: chatId, messageIds: [messageId] });\n closeZoom();\n }, [openForwardMenu, chatId, messageId]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(() => {\n if (isZoomed) {\n closeZoom();\n } else {\n close();\n }\n }) : undefined), [close, isOpen, isZoomed]);\n\n useEffect(() => {\n if (isVideo && !isGif) {\n stopCurrentAudio();\n }\n }, [isGif, isVideo]);\n\n // Prevent refresh when rotating device to watch a video\n useEffect(() => {\n if (!isOpen) {\n return undefined;\n }\n\n windowSize.disableRefresh();\n\n return () => {\n windowSize.enableRefresh();\n };\n }, [isOpen]);\n\n const getMessageId = useCallback((fromId: number, direction: number): number => {\n let index = messageIds.indexOf(fromId);\n if ((direction === -1 && index > 0) || (direction === 1 && index < messageIds.length - 1)) {\n index += direction;\n }\n\n return messageIds[index];\n }, [messageIds]);\n\n const selectPreviousMedia = useCallback(() => {\n if (isFirst) {\n return;\n }\n\n openMediaViewer({\n chatId,\n threadId,\n messageId: messageId ? getMessageId(messageId, -1) : undefined,\n origin,\n });\n }, [chatId, threadId, getMessageId, isFirst, messageId, openMediaViewer, origin]);\n\n const selectNextMedia = useCallback(() => {\n if (isLast) {\n return;\n }\n\n openMediaViewer({\n chatId,\n threadId,\n messageId: messageId ? getMessageId(messageId, 1) : undefined,\n origin,\n });\n }, [chatId, threadId, getMessageId, isLast, messageId, openMediaViewer, origin]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Left': // IE/Edge specific value\n case 'ArrowLeft':\n selectPreviousMedia();\n break;\n\n case 'Right': // IE/Edge specific value\n case 'ArrowRight':\n selectNextMedia();\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n });\n\n // Support for swipe gestures and closing on click\n useEffect(() => {\n const element = document.querySelector('.slide-container > .active, .slide-container > .to');\n if (!element) {\n return undefined;\n }\n\n const shouldCloseOnVideo = isGif && !IS_IOS;\n\n return captureEvents(element, {\n // eslint-disable-next-line max-len\n excludedClosestSelector: `.backdrop, .navigation, .media-viewer-head, .media-viewer-footer${!shouldCloseOnVideo ? ', .VideoPlayer' : ''}`,\n onClick: () => {\n if (!isZoomed && !IS_TOUCH_ENV) {\n close();\n }\n },\n onSwipe: IS_TOUCH_ENV ? (e, direction) => {\n if (direction === SwipeDirection.Right) {\n selectPreviousMedia();\n } else if (direction === SwipeDirection.Left) {\n selectNextMedia();\n } else if (!(e.target && (e.target as HTMLElement).closest('.MediaViewerFooter'))) {\n close();\n }\n } : undefined,\n });\n }, [close, isFooterHidden, isGif, isPhoto, isZoomed, selectNextMedia, selectPreviousMedia]);\n\n const handlePan = useCallback((x: number, y: number) => {\n setPanDelta({ x, y });\n }, []);\n\n const handleToggleFooterVisibility = useCallback(() => {\n if (IS_TOUCH_ENV && (isPhoto || isGif)) {\n setIsFooterHidden(!isFooterHidden);\n }\n }, [isFooterHidden, isGif, isPhoto]);\n\n const lang = useLang();\n\n useHistoryBack(isOpen, closeMediaViewer, openMediaViewer, {\n chatId,\n threadId,\n messageId,\n origin,\n avatarOwnerId: avatarOwner && avatarOwner.id,\n });\n\n function renderSlide(isActive: boolean) {\n if (isAvatar) {\n return (\n
\n {renderPhoto(\n fullMediaData || blobUrlPreview,\n calculateMediaViewerDimensions(AVATAR_FULL_DIMENSIONS, false),\n !IS_SINGLE_COLUMN_LAYOUT && !isZoomed,\n )}\n
\n );\n } else if (message) {\n const textParts = renderMessageText(message);\n const hasFooter = Boolean(textParts);\n\n return (\n \n {isPhoto && renderPhoto(\n localBlobUrl || fullMediaData || blobUrlPreview || blobUrlPictogram,\n message && calculateMediaViewerDimensions(dimensions!, hasFooter),\n !IS_SINGLE_COLUMN_LAYOUT && !isZoomed,\n )}\n {isVideo && (\n \n )}\n {textParts && (\n \n )}\n
\n );\n }\n\n return undefined;\n }\n\n function renderSenderInfo() {\n return isAvatar ? (\n \n ) : (\n \n );\n }\n\n return (\n \n {() => (\n <>\n
\n {IS_SINGLE_COLUMN_LAYOUT && (\n \n \n \n )}\n \n {renderSenderInfo}\n \n \n
\n \n \n {renderSlide}\n \n \n {!isFirst && (\n \n )}\n {!isLast && (\n \n )}\n \n \n )}\n \n );\n};\n\nfunction renderPhoto(blobUrl?: string, imageSize?: ApiDimensions, canDrag?: boolean) {\n return blobUrl\n ? (\n \n )\n : (\n \n \n
\n );\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chatId, threadId, messageId, avatarOwnerId, profilePhotoIndex, origin,\n } = global.mediaViewer;\n const {\n animationLevel,\n } = global.settings.byKey;\n\n if (origin === MediaViewerOrigin.SearchResult) {\n if (!(chatId && messageId)) {\n return { animationLevel };\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n if (!message) {\n return { animationLevel };\n }\n\n return {\n chatId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n animationLevel,\n };\n }\n\n if (avatarOwnerId) {\n const sender = selectUser(global, avatarOwnerId) || selectChat(global, avatarOwnerId);\n\n return {\n messageId: -1,\n senderId: avatarOwnerId,\n avatarOwner: sender,\n profilePhotoIndex: profilePhotoIndex || 0,\n animationLevel,\n origin,\n };\n }\n\n if (!(chatId && threadId && messageId)) {\n return { animationLevel };\n }\n\n let message: ApiMessage | undefined;\n if (origin && [MediaViewerOrigin.ScheduledAlbum, MediaViewerOrigin.ScheduledInline].includes(origin)) {\n message = selectScheduledMessage(global, chatId, messageId);\n } else {\n message = selectChatMessage(global, chatId, messageId);\n }\n\n if (!message) {\n return { animationLevel };\n }\n\n let chatMessages: Record | undefined;\n\n if (origin && [MediaViewerOrigin.ScheduledAlbum, MediaViewerOrigin.ScheduledInline].includes(origin)) {\n chatMessages = selectScheduledMessages(global, chatId);\n } else {\n chatMessages = selectChatMessages(global, chatId);\n }\n let collectionIds: number[] | undefined;\n\n if (origin === MediaViewerOrigin.Inline || origin === MediaViewerOrigin.Album) {\n collectionIds = selectOutlyingIds(global, chatId, threadId) || selectListedIds(global, chatId, threadId);\n } else if (origin === MediaViewerOrigin.SharedMedia) {\n const currentSearch = selectCurrentMediaSearch(global);\n const { foundIds } = (currentSearch && currentSearch.resultsByType && currentSearch.resultsByType.media) || {};\n collectionIds = foundIds;\n }\n\n return {\n chatId,\n threadId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n chatMessages,\n collectionIds,\n animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openMediaViewer', 'closeMediaViewer', 'openForwardMenu', 'focusMessage',\n ]),\n)(MediaViewer));\n","import React, {\n FC, useMemo, useState, memo, useRef, useEffect, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, MAIN_THREAD_ID } from '../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport {\n getCanPostInChat, getChatTitle, isChatPrivate, sortChatIds,\n} from '../../modules/helpers';\nimport searchWords from '../../util/searchWords';\nimport { pick, unique } from '../../util/iteratees';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\n\nimport Loading from '../ui/Loading';\nimport Modal from '../ui/Modal';\nimport InputText from '../ui/InputText';\nimport Button from '../ui/Button';\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport GroupChatInfo from '../common/GroupChatInfo';\n\nimport './ForwardPicker.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n chatsById: Record;\n pinnedIds?: number[];\n activeListIds?: number[];\n archivedListIds?: number[];\n orderedPinnedIds?: number[];\n currentUserId?: number;\n};\n\ntype DispatchProps = Pick;\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\nconst MODAL_HIDE_DELAY_MS = 300;\n\nconst ForwardPicker: FC = ({\n chatsById,\n pinnedIds,\n activeListIds,\n archivedListIds,\n currentUserId,\n isOpen,\n setForwardChatId,\n exitForwardMode,\n loadMoreChats,\n}) => {\n const [filter, setFilter] = useState('');\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const lang = useLang();\n\n useEffect(() => {\n if (isOpen) {\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n });\n }, FOCUS_DELAY_MS);\n }\n } else {\n if (inputRef.current) {\n inputRef.current.blur();\n }\n\n setTimeout(() => {\n setFilter('');\n }, MODAL_HIDE_DELAY_MS);\n }\n }, [isOpen]);\n\n const chatIds = useMemo(() => {\n const listIds = [\n ...activeListIds || [],\n ...archivedListIds || [],\n ];\n\n let priorityIds = pinnedIds || [];\n if (currentUserId) {\n priorityIds = unique([currentUserId, ...priorityIds]);\n }\n\n return sortChatIds([\n ...listIds.filter((id) => {\n const chat = chatsById[id];\n if (!chat) {\n return true;\n }\n\n if (!getCanPostInChat(chat, MAIN_THREAD_ID)) {\n return false;\n }\n\n if (!filter) {\n return true;\n }\n\n return searchWords(getChatTitle(lang, chatsById[id], undefined, id === currentUserId), filter);\n }),\n ], chatsById, undefined, priorityIds);\n }, [activeListIds, archivedListIds, chatsById, currentUserId, filter, lang, pinnedIds]);\n\n const [viewportIds, getMore] = useInfiniteScroll(loadMoreChats, chatIds, Boolean(filter));\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n setFilter(e.currentTarget.value);\n }, []);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, isOpen, (index) => {\n if (viewportIds && viewportIds.length > 0) {\n setForwardChatId({ id: viewportIds[index === -1 ? 0 : index] });\n }\n }, '.ListItem-button', true);\n\n const modalHeader = (\n
\n \n \n \n \n
\n );\n\n return (\n \n {viewportIds && viewportIds.length ? (\n \n {viewportIds.map((id) => (\n setForwardChatId({ id })}\n >\n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : viewportIds && !viewportIds.length ? (\n

Sorry, nothing found.

\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n currentUserId,\n } = global;\n\n return {\n chatsById,\n pinnedIds: orderedPinnedIds.active,\n activeListIds: listIds.active,\n archivedListIds: listIds.archived,\n currentUserId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setForwardChatId', 'exitForwardMode', 'loadMoreChats']),\n)(ForwardPicker));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiError, ApiInviteInfo } from '../../api/types';\n\nimport getReadableErrorText from '../../util/getReadableErrorText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport renderText from '../common/helpers/renderText';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './Dialogs.scss';\n\ntype StateProps = {\n dialogs: (ApiError | ApiInviteInfo)[];\n};\n\ntype DispatchProps = Pick;\n\nconst Dialogs: FC = ({ dialogs, dismissDialog, acceptInviteConfirmation }) => {\n const lang = useLang();\n\n if (!dialogs.length) {\n return undefined;\n }\n\n const renderInvite = (invite: ApiInviteInfo) => {\n const {\n hash, title, participantsCount, isChannel,\n } = invite;\n\n const handleJoinClick = () => {\n acceptInviteConfirmation({\n hash,\n });\n dismissDialog();\n };\n\n const participantsText = isChannel\n ? lang('Subscribers', participantsCount, 'i')\n : lang('Members', participantsCount, 'i');\n\n const joinText = isChannel ? lang('ChannelJoin') : lang('JoinGroup');\n\n return (\n \n {participantsCount !== undefined &&

{participantsText}

}\n \n \n \n );\n };\n\n const renderError = (error: ApiError) => {\n return (\n \n {error.hasErrorKey ? getReadableErrorText(error) : renderText(error.message!, ['emoji', 'br'])}\n
\n \n
\n \n );\n };\n\n const renderDialog = (dialog: ApiError | ApiInviteInfo) => {\n if ('hash' in dialog) {\n return renderInvite(dialog);\n }\n\n return renderError(dialog);\n };\n\n return (\n
\n {dialogs.map(renderDialog)}\n
\n );\n};\n\nfunction getErrorHeader(error: ApiError) {\n if (error.isSlowMode) {\n return 'Slowmode enabled';\n }\n\n if (!error.hasErrorKey) {\n return 'Telegram';\n }\n\n return 'Something went wrong';\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['dialogs']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissDialog', 'acceptInviteConfirmation']),\n)(Dialogs));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiNotification } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\n\nimport Notification from '../ui/Notification';\nimport renderText from '../common/helpers/renderText';\n\ntype StateProps = {\n notifications: ApiNotification[];\n};\n\ntype DispatchProps = Pick;\n\nconst Notifications: FC = ({ notifications, dismissNotification }) => {\n if (!notifications.length) {\n return undefined;\n }\n\n return (\n
\n {notifications.map(({ message }) => (\n \n ))}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['notifications']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissNotification']),\n)(Notifications));\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport ConfirmDialog from '../ui/ConfirmDialog';\n\nexport type OwnProps = {\n url?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst SafeLinkModal: FC = ({ url, toggleSafeLinkModal }) => {\n const lang = useLang();\n\n const handleOpen = useCallback(() => {\n window.open(url);\n toggleSafeLinkModal({ url: undefined });\n }, [toggleSafeLinkModal, url]);\n\n const handleDismiss = useCallback(() => {\n toggleSafeLinkModal({ url: undefined });\n }, [toggleSafeLinkModal]);\n\n const renderingUrl = useCurrentOrPrev(url);\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['toggleSafeLinkModal']),\n)(SafeLinkModal));\n","import React, {\n FC, memo, useState, useEffect, useMemo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport { formatTime, formatDateToString } from '../../util/dateFormat';\nimport useLang, { LangFn } from '../../hooks/useLang';\nimport usePrevious from '../../hooks/usePrevious';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './CalendarModal.scss';\n\nexport type OwnProps = {\n selectedAt?: number;\n maxAt?: number;\n isFutureMode?: boolean;\n isPastMode?: boolean;\n isOpen: boolean;\n withTimePicker?: boolean;\n submitButtonLabel?: string;\n secondButtonLabel?: string;\n onClose: () => void;\n onSubmit: (date: Date) => void;\n onSecondButtonClick?: NoneToVoidFunction;\n};\n\nconst WEEKDAY_LETTERS = [\n 'lng_weekday1',\n 'lng_weekday2',\n 'lng_weekday3',\n 'lng_weekday4',\n 'lng_weekday5',\n 'lng_weekday6',\n 'lng_weekday7',\n];\n\nconst CalendarModal: FC = ({\n selectedAt,\n maxAt,\n isFutureMode,\n isPastMode,\n isOpen,\n withTimePicker,\n submitButtonLabel,\n secondButtonLabel,\n onClose,\n onSubmit,\n onSecondButtonClick,\n}) => {\n const lang = useLang();\n const now = new Date();\n const defaultSelectedDate = useMemo(() => (selectedAt ? new Date(selectedAt) : new Date()), [selectedAt]);\n const maxDate = maxAt ? new Date(maxAt) : undefined;\n const prevIsOpen = usePrevious(isOpen);\n\n const [selectedDate, setSelectedDate] = useState(defaultSelectedDate);\n const [selectedHours, setSelectedHours] = useState(\n formatInputTime(defaultSelectedDate.getHours()),\n );\n const [selectedMinutes, setSelectedMinutes] = useState(\n formatInputTime(defaultSelectedDate.getMinutes()),\n );\n\n const currentYear = selectedDate.getFullYear();\n const currentMonth = selectedDate.getMonth();\n const currentDate = selectedDate.getDate();\n\n useEffect(() => {\n if (!prevIsOpen && isOpen) {\n setSelectedDate(defaultSelectedDate);\n }\n }, [isOpen, defaultSelectedDate, prevIsOpen]);\n\n const shouldDisableNextMonth = (isPastMode && currentYear >= now.getFullYear() && currentMonth >= now.getMonth())\n || (maxDate && currentYear >= maxDate.getFullYear() && currentMonth >= maxDate.getMonth());\n const shouldDisablePrevMonth = isFutureMode && currentYear <= now.getFullYear() && currentMonth <= now.getMonth();\n\n const calendarGrid = useMemo(() => (\n buildCalendarGrid(currentYear, currentMonth)\n ), [currentMonth, currentYear]);\n\n function handlePrevMonth() {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() - 1);\n\n return dateCopy;\n });\n }\n\n function handleNextMonth() {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() + 1);\n\n return dateCopy;\n });\n }\n\n function handleDateSelect(date: number) {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setDate(date);\n\n return dateCopy;\n });\n }\n\n function handleSubmit() {\n onSubmit(selectedDate);\n }\n\n const handleChangeHours = useCallback((e: React.ChangeEvent) => {\n const value = e.target.value.replace(/[^\\d]+/g, '');\n if (!value.length) {\n setSelectedHours('');\n e.target.value = '';\n return;\n }\n\n const hours = Math.max(0, Math.min(Number(value), 23));\n\n const date = new Date(selectedDate.getTime());\n date.setHours(hours);\n setSelectedDate(date);\n\n const hoursStr = formatInputTime(hours);\n setSelectedHours(hoursStr);\n e.target.value = hoursStr;\n }, [selectedDate]);\n\n const handleChangeMinutes = useCallback((e: React.ChangeEvent) => {\n const value = e.target.value.replace(/[^\\d]+/g, '');\n if (!value.length) {\n setSelectedMinutes('');\n e.target.value = '';\n return;\n }\n\n const minutes = Math.max(0, Math.min(Number(value), 59));\n\n const date = new Date(selectedDate.getTime());\n date.setMinutes(minutes);\n setSelectedDate(date);\n\n const minutesStr = formatInputTime(minutes);\n setSelectedMinutes(minutesStr);\n e.target.value = minutesStr;\n }, [selectedDate]);\n\n function renderTimePicker() {\n return (\n
\n \n :\n \n
\n );\n }\n\n return (\n \n
\n
\n \n \n \n\n

\n {lang(`lng_month${selectedDate.getMonth() + 1}`)}\n {' '}\n {selectedDate.getFullYear()}\n

\n\n \n \n \n\n \n \n \n
\n
\n\n
\n
\n {WEEKDAY_LETTERS.map((day) => (\n
\n {lang(day)}\n
\n ))}\n {calendarGrid.map((gridDate) => (\n handleDateSelect(gridDate)}\n className={buildClassName(\n 'day-button',\n isDisabledDay(\n currentYear, currentMonth, gridDate, isFutureMode ? now : undefined, isPastMode ? now : maxDate,\n )\n ? 'disabled'\n : `${gridDate ? 'clickable' : ''}`,\n gridDate === currentDate && 'selected',\n )}\n >\n {!!gridDate && (\n {gridDate}\n )}\n
\n ))}\n
\n
\n\n {withTimePicker && renderTimePicker()}\n\n
\n \n {secondButtonLabel && (\n \n )}\n
\n \n );\n};\n\nfunction buildCalendarGrid(year: number, month: number) {\n const grid: number[] = [];\n\n const date = new Date();\n date.setFullYear(year);\n date.setMonth(month);\n date.setDate(1);\n\n const monthStartDay = date.getDay() || 7;\n // Fill empty cells\n for (let i = 1; i < monthStartDay; i++) {\n grid.push(0);\n }\n\n while (date.getMonth() === month) {\n const gridDate = date.getDate();\n grid.push(gridDate);\n date.setDate(gridDate + 1);\n }\n\n return grid;\n}\n\nfunction isDisabledDay(year: number, month: number, day: number, minDate?: Date, maxDate?: Date) {\n const selectedDay = new Date(year, month, day, 0, 0, 0, 0);\n const fixedMinDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), 0, 0, 0, 0);\n const fixedMaxDate = maxDate && new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate(), 0, 0, 0, 0);\n\n if (fixedMaxDate && selectedDay > fixedMaxDate) {\n return true;\n } else if (fixedMinDate && selectedDay < fixedMinDate) {\n return true;\n }\n\n return false;\n}\n\nfunction formatInputTime(value: string | number) {\n return String(value).padStart(2, '0');\n}\n\nfunction formatSubmitLabel(lang: LangFn, date: Date) {\n const day = formatDateToString(date, lang.code);\n const today = formatDateToString(new Date(), lang.code);\n\n if (day === today) {\n return lang('Conversation.ScheduleMessage.SendToday', formatTime(date));\n }\n\n return lang('Conversation.ScheduleMessage.SendOn', [day, formatTime(date)]);\n}\n\nexport default memo(CalendarModal);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport CalendarModal from '../common/CalendarModal';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n selectedAt?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst HistoryCalendar: FC = ({\n isOpen, selectedAt, searchMessagesByDate, closeHistoryCalendar,\n}) => {\n const handleJumpToDate = useCallback((date: Date) => {\n searchMessagesByDate({ timestamp: date.valueOf() / 1000 });\n closeHistoryCalendar();\n }, [closeHistoryCalendar, searchMessagesByDate]);\n\n const lang = useLang();\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n selectedAt: global.historyCalendarSelectedAt,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesByDate', 'closeHistoryCalendar',\n ]),\n)(HistoryCalendar));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../api/types';\nimport { IAlbum } from '../../types';\n\nimport { GlobalActions } from '../../global/types';\n\nimport {\n selectAllowedMessageActions,\n selectChat,\n selectCurrentMessageList,\n selectUser,\n} from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n isSchedule: boolean;\n message: ApiMessage;\n album?: IAlbum;\n onClose: () => void;\n};\n\ntype StateProps = {\n canDeleteForAll?: boolean;\n contactName?: string;\n willDeleteForCurrentUserOnly?: boolean;\n willDeleteForAll?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteMessageModal: FC = ({\n isOpen,\n isSchedule,\n message,\n album,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n deleteMessages,\n deleteScheduledMessages,\n}) => {\n const handleDeleteMessageForAll = useCallback(() => {\n const messageIds = album && album.messages\n ? album.messages.map(({ id }) => id)\n : [message.id];\n deleteMessages({ messageIds, shouldDeleteForAll: true });\n onClose();\n }, [deleteMessages, message.id, onClose, album]);\n\n const handleDeleteMessageForSelf = useCallback(() => {\n const messageIds = album && album.messages\n ? album.messages.map(({ id }) => id)\n : [message.id];\n if (isSchedule) {\n deleteScheduledMessages({ messageIds });\n } else {\n deleteMessages({\n messageIds,\n shouldDeleteForAll: false,\n });\n }\n onClose();\n }, [album, message.id, isSchedule, onClose, deleteScheduledMessages, deleteMessages]);\n\n const lang = useLang();\n\n return (\n \n

{lang('AreYouSureDeleteSingleMessage')}

\n {willDeleteForCurrentUserOnly && (\n

{lang('lng_delete_for_me_chat_hint', 1, 'i')}

\n )}\n {willDeleteForAll && (\n

{lang('lng_delete_for_everyone_hint', 1, 'i')}

\n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { message, isSchedule }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const { canDeleteForAll } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {};\n const chat = selectChat(global, message.chatId);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll;\n const willDeleteForAll = chat && isChatSuperGroup(chat);\n\n return {\n canDeleteForAll: !isSchedule && canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'deleteMessages', 'deleteScheduledMessages',\n ]),\n)(DeleteMessageModal));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { selectChat, selectIsChatWithSelf, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n isChatChannel,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport renderText from './helpers/renderText';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId: number;\n messageId: number;\n onClose: () => void;\n};\n\ntype StateProps = {\n isChannel: boolean;\n isPrivateChat: boolean;\n isChatWithSelf: boolean;\n isGroup: boolean;\n isSuperGroup: boolean;\n canPinForAll: boolean;\n contactName?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst PinMessageModal: FC = ({\n isOpen,\n messageId,\n chatId,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n onClose,\n pinMessage,\n}) => {\n const handlePinMessageForAll = useCallback(() => {\n pinMessage({\n chatId, messageId, isUnpin: false,\n });\n onClose();\n }, [pinMessage, chatId, messageId, onClose]);\n\n const handlePinMessage = useCallback(() => {\n pinMessage({\n chatId, messageId, isUnpin: false, isOneSide: true, isSilent: true,\n });\n onClose();\n }, [chatId, messageId, onClose, pinMessage]);\n\n const lang = useLang();\n\n function renderMessage() {\n if (isChannel) {\n return lang('PinMessageAlertChannel');\n }\n\n if (isGroup || isSuperGroup) {\n return lang('PinMessageAlert');\n }\n\n return lang('PinMessageAlertChat');\n }\n\n return (\n \n

{renderMessage()}

\n \n {canPinForAll && (\n \n )}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const isPrivateChat = isChatPrivate(chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const chat = selectChat(global, chatId);\n const isChannel = !!chat && isChatChannel(chat);\n const isGroup = !!chat && isChatBasicGroup(chat);\n const isSuperGroup = !!chat && isChatSuperGroup(chat);\n const canPinForAll = (isPrivateChat && !isChatWithSelf) || isSuperGroup || isGroup;\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['pinMessage']),\n)(PinMessageModal));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId?: number;\n pinnedMessagesCount?: number;\n onClose: () => void;\n onUnpin: () => void;\n};\n\nconst UnpinAllMessagesModal: FC = ({\n isOpen,\n pinnedMessagesCount = 0,\n onClose,\n onUnpin,\n}) => {\n const lang = useLang();\n\n return (\n \n

{lang('Chat.UnpinAllMessagesConfirmation', pinnedMessagesCount, 'i')}

\n \n \n \n );\n};\n\nexport default memo(UnpinAllMessagesModal);\n","import React, {\n FC, useCallback, memo, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { selectCanDeleteSelectedMessages, selectCurrentChat, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport usePrevious from '../../hooks/usePrevious';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n isSchedule: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n selectedMessageIds?: number[];\n canDeleteForAll?: boolean;\n contactName?: string;\n willDeleteForCurrentUserOnly?: boolean;\n willDeleteForAll?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteSelectedMessageModal: FC = ({\n isOpen,\n isSchedule,\n selectedMessageIds,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n deleteMessages,\n deleteScheduledMessages,\n exitMessageSelectMode,\n}) => {\n const prevIsOpen = usePrevious(isOpen);\n\n const handleDeleteMessageForAll = useCallback(() => {\n onClose();\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: true });\n }, [deleteMessages, selectedMessageIds, onClose]);\n\n const handleDeleteMessageForSelf = useCallback(() => {\n if (isSchedule) {\n deleteScheduledMessages({ messageIds: selectedMessageIds });\n } else {\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: false });\n }\n\n onClose();\n }, [isSchedule, onClose, deleteScheduledMessages, selectedMessageIds, deleteMessages]);\n\n const lang = useLang();\n\n // Returning `undefined` from FC instead of `` doesn't trigger useHistoryBack\n useEffect(() => {\n if (!isOpen && prevIsOpen) {\n exitMessageSelectMode();\n }\n }, [exitMessageSelectMode, isOpen, prevIsOpen]);\n\n if (!selectedMessageIds) {\n return undefined;\n }\n\n return (\n \n

{lang('AreYouSureDeleteFewMessages')}

\n {willDeleteForCurrentUserOnly && (\n

This will delete them just for you, not for other participants in the chat.

\n )}\n {willDeleteForAll && (\n

This will delete them for everyone in this chat.

\n )}\n {canDeleteForAll && (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { isSchedule }): StateProps => {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { canDeleteForAll } = selectCanDeleteSelectedMessages(global);\n const chat = selectCurrentChat(global);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll;\n const willDeleteForAll = chat && isChatSuperGroup(chat);\n\n return {\n selectedMessageIds,\n canDeleteForAll: !isSchedule && canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'deleteMessages',\n 'deleteScheduledMessages',\n 'exitMessageSelectMode',\n ]),\n)(DeleteSelectedMessageModal));\n","import { ChangeEvent } from 'react';\n\nimport React, {\n FC, memo, useCallback, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiReportReason } from '../../api/types';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport RadioGroup from '../ui/RadioGroup';\nimport InputText from '../ui/InputText';\n\nexport type OwnProps = {\n isOpen: boolean;\n messageIds?: number[];\n onClose: () => void;\n};\n\ntype DispatchProps = Pick;\n\nconst ReportMessageModal: FC = ({\n isOpen,\n messageIds,\n reportMessages,\n exitMessageSelectMode,\n onClose,\n}) => {\n const [selectedReason, setSelectedReason] = useState('spam');\n const [description, setDescription] = useState('');\n\n const handleReport = () => {\n reportMessages({ messageIds, reason: selectedReason, description });\n exitMessageSelectMode();\n onClose();\n };\n\n const handleSelectReason = useCallback((value: string) => {\n setSelectedReason(value as ApiReportReason);\n }, []);\n\n const handleDescriptionChange = useCallback((e: ChangeEvent) => {\n setDescription(e.target.value);\n }, []);\n\n const lang = useLang();\n\n const REPORT_OPTIONS: {value: ApiReportReason; label: string}[] = [\n { value: 'spam', label: lang('lng_report_reason_spam') },\n { value: 'violence', label: lang('lng_report_reason_violence') },\n { value: 'pornography', label: lang('lng_report_reason_pornography') },\n { value: 'childAbuse', label: lang('lng_report_reason_child_abuse') },\n { value: 'copyright', label: lang('ReportPeer.ReasonCopyright') },\n { value: 'other', label: lang('lng_report_reason_other') },\n ];\n\n if (!messageIds) {\n return undefined;\n }\n\n return (\n \n \n \n \n \n \n );\n};\n\nexport default memo(withGlobal(\n undefined, (setGlobal, actions): DispatchProps => pick(actions, [\n 'reportMessages', 'exitMessageSelectMode',\n ]),\n)(ReportMessageModal));\n","import React, { FC, memo, useEffect } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\n\nimport {\n selectCanDeleteSelectedMessages,\n selectCanReportSelectedMessages,\n selectCurrentMessageList,\n selectSelectedMessagesCount,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useFlag from '../../hooks/useFlag';\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport buildClassName from '../../util/buildClassName';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport MenuItem from '../ui/MenuItem';\n\nimport DeleteSelectedMessageModal from './DeleteSelectedMessageModal';\nimport ReportMessageModal from '../common/ReportMessageModal';\n\nimport './MessageSelectToolbar.scss';\n\nexport type OwnProps = {\n isActive?: boolean;\n canPost?: boolean;\n messageListType?: MessageListType;\n};\n\ntype StateProps = {\n isSchedule: boolean;\n selectedMessagesCount?: number;\n canDeleteMessages?: boolean;\n canReportMessages?: boolean;\n selectedMessageIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst MessageSelectToolbar: FC = ({\n canPost,\n isActive,\n messageListType,\n isSchedule,\n selectedMessagesCount,\n canDeleteMessages,\n canReportMessages,\n selectedMessageIds,\n exitMessageSelectMode,\n openForwardMenuForSelectedMessages,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n const [isReportModalOpen, openReportModal, closeReportModal] = useFlag();\n\n useEffect(() => {\n return isActive && !isDeleteModalOpen && !isReportModalOpen\n ? captureKeyboardListeners({\n onBackspace: openDeleteModal,\n onDelete: openDeleteModal,\n onEsc: exitMessageSelectMode,\n })\n : undefined;\n }, [isActive, isDeleteModalOpen, isReportModalOpen, openDeleteModal, exitMessageSelectMode]);\n\n const prevSelectedMessagesCount = usePrevious(selectedMessagesCount || undefined, true);\n const renderingSelectedMessagesCount = isActive ? selectedMessagesCount : prevSelectedMessagesCount;\n\n const lang = useLang();\n\n const formattedMessagesCount = lang('VoiceOver.Chat.MessagesSelected', renderingSelectedMessagesCount);\n\n const className = buildClassName(\n 'MessageSelectToolbar',\n canPost && 'with-composer',\n isActive && 'shown',\n );\n\n return (\n
\n
\n \n \n \n \n {formattedMessagesCount}\n \n\n {!!selectedMessagesCount && (\n
\n {messageListType !== 'scheduled' && (\n \n \n {lang('Forward')}\n \n \n )}\n {canReportMessages && (\n \n \n {lang('Report')}\n \n \n )}\n \n \n {lang('Delete')}\n \n \n
\n )}\n
\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { type: messageListType } = selectCurrentMessageList(global) || {};\n const { canDelete } = selectCanDeleteSelectedMessages(global);\n const canReport = selectCanReportSelectedMessages(global);\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n\n return {\n isSchedule: messageListType === 'scheduled',\n selectedMessagesCount: selectSelectedMessagesCount(global),\n canDeleteMessages: canDelete,\n canReportMessages: canReport,\n selectedMessageIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['exitMessageSelectMode', 'openForwardMenuForSelectedMessages']),\n)(MessageSelectToolbar));\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nexport default (\n onSelect: NoneToVoidFunction,\n) => {\n // eslint-disable-next-line no-null/no-null\n const buttonRef = useRef(null);\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (e.key !== 'Enter') return;\n const isFocused = buttonRef.current === document.activeElement;\n\n if (isFocused) {\n onSelect();\n }\n }, [onSelect]);\n\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown, false);\n\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n\n return buttonRef;\n};\n","import React, {\n FC, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport useChatContextActions from '../../../hooks/useChatContextActions';\nimport useFlag from '../../../hooks/useFlag';\nimport { isChatPrivate, getPrivateChatUserId, selectIsChatMuted } from '../../../modules/helpers';\nimport {\n selectChat, selectUser, selectIsChatPinned, selectNotifySettings, selectNotifyExceptions,\n} from '../../../modules/selectors';\nimport useSelectWithEnter from '../../../hooks/useSelectWithEnter';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport DeleteChatModal from '../../common/DeleteChatModal';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n withUsername?: boolean;\n onClick: (id: number) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n isPinned?: boolean;\n isMuted?: boolean;\n};\n\nconst LeftSearchResultChat: FC = ({\n chatId,\n chat,\n privateChatUser,\n isPinned,\n isMuted,\n withUsername,\n onClick,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n isPinned,\n isMuted,\n handleDelete: openDeleteModal,\n });\n\n const handleClick = () => {\n onClick(chatId);\n };\n\n const buttonRef = useSelectWithEnter(handleClick);\n\n if (!chat) {\n return undefined;\n }\n\n return (\n \n {isChatPrivate(chatId) ? (\n \n ) : (\n \n )}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const privateChatUserId = chat && getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n const isPinned = selectIsChatPinned(global, chatId);\n const isMuted = chat\n ? selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global))\n : undefined;\n\n return {\n chat,\n privateChatUser,\n isPinned,\n isMuted,\n };\n },\n)(LeftSearchResultChat));\n","import React, {\n FC, useEffect, useCallback, useRef, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { getUserFirstOrLastName } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Avatar from '../../common/Avatar';\nimport Button from '../../ui/Button';\nimport LeftSearchResultChat from './LeftSearchResultChat';\n\nimport './RecentContacts.scss';\n\ntype OwnProps = {\n onReset: () => void;\n};\n\ntype StateProps = {\n topUserIds?: number[];\n usersById: Record;\n recentlyFoundChatIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SEARCH_CLOSE_TIMEOUT_MS = 250;\nconst NBSP = '\\u00A0';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst RecentContacts: FC = ({\n topUserIds, usersById, recentlyFoundChatIds,\n onReset, loadTopUsers, loadContactList, openChat,\n addRecentlyFoundChatId, clearRecentlyFoundChats,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const topUsersRef = useRef(null);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadTopUsers();\n // Loading full contact list for quick local search before user enters the query\n loadContactList();\n });\n }, [loadTopUsers, loadContactList]);\n\n useHorizontalScroll(topUsersRef.current, !topUserIds);\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id, shouldReplaceHistory: true });\n onReset();\n setTimeout(() => {\n addRecentlyFoundChatId({ id });\n }, SEARCH_CLOSE_TIMEOUT_MS);\n },\n [openChat, addRecentlyFoundChatId, onReset],\n );\n\n const lang = useLang();\n\n return (\n
\n {topUserIds && (\n
\n
\n {topUserIds.map((userId) => (\n
handleClick(userId)} dir={lang.isRtl ? 'rtl' : undefined}>\n \n
{renderText(getUserFirstOrLastName(usersById[userId]) || NBSP)}
\n
\n ))}\n
\n
\n )}\n {recentlyFoundChatIds && (\n
\n

\n {lang('Recent')}\n\n \n \n \n

\n {recentlyFoundChatIds.map((id) => (\n \n ))}\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: topUserIds } = global.topPeers;\n const usersById = global.users.byId;\n const { recentlyFoundChatIds } = global.globalSearch;\n\n return {\n topUserIds,\n usersById,\n recentlyFoundChatIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadTopUsers',\n 'loadContactList',\n 'openChat',\n 'addRecentlyFoundChatId',\n 'clearRecentlyFoundChats',\n ]),\n)(RecentContacts));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus,\n} from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport {\n getChatTitle,\n getPrivateChatUserId,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n getMessageRoundVideo,\n} from '../../../modules/helpers';\nimport { selectChat, selectUser } from '../../../modules/selectors';\nimport renderText from '../../common/helpers/renderText';\nimport { pick } from '../../../util/iteratees';\nimport useMedia from '../../../hooks/useMedia';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useLang, { LangFn } from '../../../hooks/useLang';\nimport useSelectWithEnter from '../../../hooks/useSelectWithEnter';\n\nimport Avatar from '../../common/Avatar';\nimport VerifiedIcon from '../../common/VerifiedIcon';\nimport ListItem from '../../ui/ListItem';\nimport Link from '../../ui/Link';\n\nimport './ChatMessage.scss';\n\ntype OwnProps = {\n searchQuery?: string;\n message: ApiMessage;\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ChatMessage: FC = ({\n message,\n searchQuery,\n chatId,\n chat,\n privateChatUser,\n focusMessage,\n lastSyncTime,\n}) => {\n const mediaThumbnail = getMessageMediaThumbDataUri(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'micro'));\n const isRoundVideo = Boolean(getMessageRoundVideo(message));\n\n const handleClick = useCallback(() => {\n focusMessage({ chatId, messageId: message.id });\n }, [chatId, focusMessage, message.id]);\n\n const lang = useLang();\n\n const buttonRef = useSelectWithEnter(handleClick);\n\n if (!chat) {\n return undefined;\n }\n\n return (\n \n \n
\n
\n
\n

{renderText(getChatTitle(lang, chat, privateChatUser))}

\n {chat.isVerified && }\n
\n
\n \n {formatPastTimeShort(lang, message.date * 1000)}\n \n
\n\n
\n
\n
\n {renderMessageSummary(lang, message, mediaBlobUrl || mediaThumbnail, searchQuery, isRoundVideo)}\n
\n
\n
\n \n );\n};\n\nfunction renderMessageSummary(\n lang: LangFn, message: ApiMessage, blobUrl?: string, searchQuery?: string, isRoundVideo?: boolean,\n) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(lang, message));\n }\n\n return (\n \n \"\"\n {getMessageVideo(message) && }\n {renderText(getMessageSummaryText(lang, message, true), ['emoji', 'highlight'], { highlight: searchQuery })}\n \n );\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return {};\n }\n\n const privateChatUserId = getPrivateChatUserId(chat);\n\n return {\n chat,\n lastSyncTime: global.lastSyncTime,\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'focusMessage',\n ]),\n)(ChatMessage));\n","import React, { FC, memo, useMemo } from '../../../lib/teact/teact';\nimport { formatDateToString } from '../../../util/dateFormat';\n\nimport './DateSuggest.scss';\n\nconst SUGGESTION_COUNT = 8;\n\nexport type OwnProps = {\n searchDate: string;\n onSelect: (value: Date) => void;\n};\n\nconst DateSuggest: FC = ({\n searchDate, onSelect,\n}) => {\n const suggestions = useMemo(() => getSuggestionsFromDate(searchDate), [searchDate]);\n return (\n
\n {suggestions.map(({ date, text }) => {\n return (\n onSelect(date)}\n className=\"date-item\"\n key={text}\n >\n \n {text}\n \n );\n })}\n
\n );\n};\n\nfunction getSuggestionsFromDate(searchDate: string) {\n const hasYear = searchDate.match(/^\\d{2,4}-\\d{2}-\\d{2}$/g);\n if (hasYear) {\n const date = new Date(searchDate);\n return [{ date, text: formatDateToString(date) }];\n }\n\n const suggestion = [];\n const currentDate = new Date();\n const currentYear = currentDate.getFullYear();\n const latestYear = currentDate.getTime() > (new Date(`${currentYear}-${searchDate}`)).getTime()\n ? currentYear\n : currentYear - 1;\n\n for (let i = 0; i < SUGGESTION_COUNT; i++) {\n const date = new Date(`${latestYear - i}-${searchDate}`);\n suggestion.push({ date, text: formatDateToString(date) });\n }\n\n return suggestion;\n}\n\nexport default memo(DateSuggest);\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser, ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport searchWords from '../../../util/searchWords';\nimport { unique, pick } from '../../../util/iteratees';\nimport { getUserFullName, getMessageSummaryText, sortChatIds } from '../../../modules/helpers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport LeftSearchResultChat from './LeftSearchResultChat';\nimport RecentContacts from './RecentContacts';\nimport ChatMessage from './ChatMessage';\nimport DateSuggest from './DateSuggest';\nimport Link from '../../ui/Link';\nimport NothingFound from '../../common/NothingFound';\nimport PickerSelectedItem from '../../common/PickerSelectedItem';\n\nexport type OwnProps = {\n searchQuery?: string;\n dateSearchQuery?: string;\n searchDate?: number;\n onReset: () => void;\n onSearchDateSelect: (value: Date) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n localContactIds?: number[];\n localChatIds?: number[];\n localUserIds?: number[];\n globalChatIds?: number[];\n globalUserIds?: number[];\n foundIds?: string[];\n globalMessagesByChatId?: Record }>;\n chatsById: Record;\n usersById: Record;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH = 4;\nconst LESS_LIST_ITEMS_AMOUNT = 3;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatResults: FC = ({\n searchQuery, searchDate, dateSearchQuery, currentUserId,\n localContactIds, localChatIds, localUserIds, globalChatIds, globalUserIds,\n foundIds, globalMessagesByChatId, chatsById, usersById, fetchingStatus, lastSyncTime,\n onReset, onSearchDateSelect, openChat, addRecentlyFoundChatId, searchMessagesGlobal, setGlobalSearchChatId,\n}) => {\n const lang = useLang();\n\n const [shouldShowMoreLocal, setShouldShowMoreLocal] = useState(false);\n const [shouldShowMoreGlobal, setShouldShowMoreGlobal] = useState(false);\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: 'text',\n query: searchQuery,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery]);\n\n const handleChatClick = useCallback(\n (id: number) => {\n openChat({ id, shouldReplaceHistory: true });\n\n if (id !== currentUserId) {\n addRecentlyFoundChatId({ id });\n }\n\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n onReset();\n }\n },\n [currentUserId, openChat, addRecentlyFoundChatId, onReset],\n );\n\n const handlePickerItemClick = useCallback((id: number) => {\n setGlobalSearchChatId({ id });\n }, [setGlobalSearchChatId]);\n\n const localResults = useMemo(() => {\n if (!searchQuery || (searchQuery.startsWith('@') && searchQuery.length < 2)) {\n return MEMO_EMPTY_ARRAY;\n }\n\n const foundContactIds = localContactIds\n ? localContactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n\n const fullName = getUserFullName(user);\n return (fullName && searchWords(fullName, searchQuery)) || searchWords(user.username, searchQuery);\n })\n : [];\n\n return [\n ...(currentUserId && searchWords(lang('SavedMessages'), searchQuery) ? [currentUserId] : []),\n ...sortChatIds(unique([\n ...foundContactIds,\n ...(localChatIds || []),\n ...(localUserIds || []),\n ]), chatsById),\n ];\n }, [\n searchQuery, localContactIds, currentUserId, lang, localChatIds, localUserIds, chatsById, usersById,\n ]);\n\n const globalResults = useMemo(() => {\n if (!searchQuery || searchQuery.length < MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH || !globalChatIds || !globalUserIds) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return sortChatIds(unique([...globalChatIds, ...globalUserIds]),\n chatsById, true);\n }, [chatsById, globalChatIds, globalUserIds, searchQuery]);\n\n const foundMessages = useMemo(() => {\n if ((!searchQuery && !searchDate) || !foundIds || foundIds.length === 0) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds\n .map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return (\n globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]\n );\n })\n .filter(Boolean as any)\n .sort((a, b) => b.date - a.date);\n }, [foundIds, globalMessagesByChatId, searchQuery, searchDate]);\n\n const handleClickShowMoreLocal = useCallback(() => {\n setShouldShowMoreLocal(!shouldShowMoreLocal);\n }, [shouldShowMoreLocal]);\n\n const handleClickShowMoreGlobal = useCallback(() => {\n setShouldShowMoreGlobal(!shouldShowMoreGlobal);\n }, [shouldShowMoreGlobal]);\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(lang, message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages\n && !localResults.length && !globalResults.length && !foundMessages.length;\n\n if (!searchQuery && !searchDate) {\n return ;\n }\n\n return (\n \n {dateSearchQuery && (\n
\n \n
\n )}\n {nothingFound && (\n \n )}\n {!!localResults.length && (\n
\n {localResults.map((id) => (\n \n ))}\n
\n )}\n {!!localResults.length && (\n
\n

\n {localResults.length > LESS_LIST_ITEMS_AMOUNT && (\n \n {lang(shouldShowMoreLocal ? 'ChatList.Search.ShowLess' : 'ChatList.Search.ShowMore')}\n \n )}\n {lang('DialogList.SearchSectionDialogs')}\n

\n {localResults.map((id, index) => {\n if (!shouldShowMoreLocal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n \n );\n })}\n
\n )}\n {!!globalResults.length && (\n
\n

\n {globalResults.length > LESS_LIST_ITEMS_AMOUNT && (\n \n {lang(shouldShowMoreGlobal ? 'ChatList.Search.ShowLess' : 'ChatList.Search.ShowMore')}\n \n )}\n {lang('DialogList.SearchSectionGlobal')}\n

\n {globalResults.map((id, index) => {\n if (!shouldShowMoreGlobal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n \n );\n })}\n
\n )}\n {!!foundMessages.length && (\n
\n

{lang('SearchMessages')}

\n {foundMessages.map(renderFoundMessage)}\n
\n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { byId: chatsById } = global.chats;\n const { byId: usersById } = global.users;\n\n const { userIds: localContactIds } = global.contactList || {};\n\n if (!localContactIds) {\n return {\n chatsById,\n usersById,\n };\n }\n\n const {\n currentUserId, messages, lastSyncTime,\n } = global;\n const {\n fetchingStatus, globalResults, localResults, resultsByType,\n } = global.globalSearch;\n const { chatIds: globalChatIds, userIds: globalUserIds } = globalResults || {};\n const { chatIds: localChatIds, userIds: localUserIds } = localResults || {};\n const { byChatId: globalMessagesByChatId } = messages;\n const { foundIds } = (resultsByType && resultsByType.text) || {};\n\n return {\n currentUserId,\n localContactIds,\n localChatIds,\n localUserIds,\n globalChatIds,\n globalUserIds,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n usersById,\n fetchingStatus,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'addRecentlyFoundChatId',\n 'searchMessagesGlobal',\n 'setGlobalSearchChatId',\n ]),\n)(ChatResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { getMessageSummaryText } from '../../../modules/helpers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport ChatMessage from './ChatMessage';\nimport NothingFound from '../../common/NothingFound';\nimport DateSuggest from './DateSuggest';\n\nexport type OwnProps = {\n searchQuery?: string;\n dateSearchQuery?: string;\n onReset: () => void;\n onSearchDateSelect: (value: Date) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n foundIds?: string[];\n globalMessagesByChatId?: Record }>;\n chatsById: Record;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatMessageResults: FC = ({\n searchQuery,\n currentUserId,\n dateSearchQuery,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n fetchingStatus,\n lastSyncTime,\n searchMessagesGlobal,\n onSearchDateSelect,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: 'text',\n query: searchQuery,\n chatId: currentUserId,\n });\n });\n }\n }, [currentUserId, lastSyncTime, searchMessagesGlobal, searchQuery]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || foundIds.length === 0) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds\n .map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return (\n globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]\n );\n })\n .filter(Boolean as any)\n .sort((a, b) => b.date - a.date);\n }, [foundIds, globalMessagesByChatId]);\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(lang, message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages && !foundMessages.length;\n\n return (\n
\n \n {dateSearchQuery && (\n
\n \n
\n )}\n {nothingFound && (\n \n )}\n {!!foundMessages.length && foundMessages.map(renderFoundMessage)}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { byId: chatsById } = global.chats;\n const { currentUserId, messages: { byChatId: globalMessagesByChatId }, lastSyncTime } = global;\n const { fetchingStatus, resultsByType } = global.globalSearch;\n\n const { foundIds } = (resultsByType && resultsByType.text) || {};\n\n return {\n currentUserId,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n fetchingStatus,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['searchMessagesGlobal']),\n)(ChatMessageResults));\n","import { GlobalState } from '../../../../global/types';\nimport {\n ApiChat, ApiGlobalMessageSearchType, ApiMessage, ApiUser,\n} from '../../../../api/types';\nimport { ISettings } from '../../../../types';\n\nimport { selectTheme } from '../../../../modules/selectors';\n\nexport type StateProps = {\n theme: ISettings['theme'];\n isLoading?: boolean;\n chatsById: Record;\n usersById: Record;\n globalMessagesByChatId?: Record }>;\n foundIds?: string[];\n lastSyncTime?: number;\n searchChatId?: number;\n};\n\nexport function createMapStateToProps(type: ApiGlobalMessageSearchType) {\n return (global: GlobalState, props: any) => {\n const { byId: chatsById } = global.chats;\n const { byId: usersById } = global.users;\n const {\n fetchingStatus, resultsByType, chatId,\n } = global.globalSearch;\n\n // One component is used for two different types of results.\n // The differences between them are only in the isVoice property.\n // The rest of the search results use their own personal components.\n const currentType = type !== 'audio' ? type : (props && props.isVoice ? 'voice' : 'audio');\n\n const { byChatId: globalMessagesByChatId } = global.messages;\n const { foundIds } = (resultsByType && resultsByType[currentType]) || {};\n\n return {\n theme: selectTheme(global),\n isLoading: foundIds === undefined\n || (fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false),\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n searchChatId: chatId,\n lastSyncTime: global.lastSyncTime,\n };\n };\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection, MediaViewerOrigin } from '../../../types';\n\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Media from '../../common/Media';\nimport ChatMessage from './ChatMessage';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'media';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst MediaResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n openMediaViewer,\n}) => {\n const lang = useLang();\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleSelectMedia = useCallback((messageId: number, chatId: number) => {\n openMediaViewer({\n chatId,\n messageId,\n origin: MediaViewerOrigin.SearchResult,\n });\n }, [openMediaViewer]);\n\n function renderGallery() {\n return (\n
\n {foundMessages.map((message) => (\n \n ))}\n
\n );\n }\n\n function renderSearchResult() {\n return foundMessages.map((message) => (\n \n ));\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n const isMediaGrid = canRenderContents && foundIds && foundIds.length > 0 && !searchQuery;\n const isMessageList = canRenderContents && foundIds && foundIds.length > 0 && searchQuery;\n\n const classNames = buildClassName(\n 'search-content custom-scroll',\n isMessageList && 'chat-list',\n );\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {isMediaGrid && renderGallery()}\n {isMessageList && renderSearchResult()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'openMediaViewer',\n ]),\n)(MediaResults));\n","import { ApiChat, ApiMessage, ApiUser } from '../../../../api/types';\nimport {\n getChatTitle,\n getSenderTitle,\n isChatPrivate,\n isChatGroup,\n} from '../../../../modules/helpers';\nimport { LangFn } from '../../../../hooks/useLang';\n\nexport function getSenderName(\n lang: LangFn, message: ApiMessage, chatsById: Record, usersById: Record,\n) {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n const sender = isChatPrivate(senderId) ? usersById[senderId] : chatsById[senderId];\n\n let senderName = getSenderTitle(lang, sender);\n\n const chat = chatsById[message.chatId];\n if (chat) {\n if (isChatPrivate(senderId) && (sender as ApiUser).isSelf) {\n senderName = `${lang('FromYou')} → ${getChatTitle(lang, chat)}`;\n } else if (isChatGroup(chat)) {\n senderName += ` → ${getChatTitle(lang, chat)}`;\n }\n }\n\n return senderName;\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport WebLink from '../../common/WebLink';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'links';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst LinkResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

\n {formatMonthAndYear(lang, new Date(message.date * 1000))}\n

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n ]),\n)(LinkResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport { getMessageDocument } from '../../../modules/helpers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport Document from '../../common/Document';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'documents';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst FileResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n const message = globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n\n return message && getMessageDocument(message) ? message : undefined;\n }).filter(Boolean) as ApiMessage[];\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

{formatMonthAndYear(lang, new Date(message.date * 1000))}

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n ]),\n)(FileResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Audio from '../../common/Audio';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n isVoice?: boolean;\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst AudioResults: FC = ({\n theme,\n isVoice,\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n openAudioPlayer,\n}) => {\n const lang = useLang();\n const currentType = isVoice ? 'voice' : 'audio';\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: currentType,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [currentType, lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n const handlePlayAudio = useCallback((messageId: number, chatId: number) => {\n openAudioPlayer({ chatId, messageId });\n }, [openAudioPlayer]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

\n {formatMonthAndYear(lang, new Date(message.date * 1000))}\n

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps('audio'),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n 'openAudioPlayer',\n ]),\n)(AudioResults));\n","import React, {\n FC, memo, useCallback, useState, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { GlobalSearchContent } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { parseDateString } from '../../../util/dateFormat';\nimport useKeyboardListNavigation from '../../../hooks/useKeyboardListNavigation';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport TabList from '../../ui/TabList';\nimport Transition from '../../ui/Transition';\nimport ChatResults from './ChatResults';\nimport UserChatResults from './ChatMessageResults';\nimport MediaResults from './MediaResults';\nimport LinkResults from './LinkResults';\nimport FileResults from './FileResults';\nimport AudioResults from './AudioResults';\n\nimport './LeftSearch.scss';\n\nexport type OwnProps = {\n searchQuery?: string;\n searchDate?: number;\n isActive: boolean;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentContent?: GlobalSearchContent;\n chatId?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst TABS = [\n { type: GlobalSearchContent.ChatList, title: 'SearchAllChatsShort' },\n { type: GlobalSearchContent.Media, title: 'SharedMediaTab2' },\n { type: GlobalSearchContent.Links, title: 'SharedLinksTab2' },\n { type: GlobalSearchContent.Files, title: 'SharedFilesTab2' },\n { type: GlobalSearchContent.Music, title: 'SharedMusicTab2' },\n { type: GlobalSearchContent.Voice, title: 'SharedVoiceTab2' },\n];\n\nconst CHAT_TABS = [\n { type: GlobalSearchContent.ChatList, title: 'All Messages' },\n ...TABS.slice(1),\n];\n\nconst TRANSITION_RENDER_COUNT = Object.keys(GlobalSearchContent).length / 2;\n\nconst LeftSearch: FC = ({\n searchQuery,\n searchDate,\n isActive,\n currentContent = GlobalSearchContent.ChatList,\n chatId,\n setGlobalSearchContent,\n setGlobalSearchDate,\n onReset,\n}) => {\n const lang = useLang();\n const [activeTab, setActiveTab] = useState(currentContent);\n const dateSearchQuery = useMemo(() => parseDateString(searchQuery), [searchQuery]);\n\n const handleSwitchTab = useCallback((index: number) => {\n const tab = TABS[index];\n setGlobalSearchContent({ content: tab.type });\n setActiveTab(index);\n }, [setGlobalSearchContent]);\n\n const handleSearchDateSelect = useCallback((value: Date) => {\n setGlobalSearchDate({ date: value.getTime() / 1000 });\n }, [setGlobalSearchDate]);\n\n useHistoryBack(isActive, onReset, undefined, undefined, true);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, isActive, undefined, '.ListItem-button', true);\n\n return (\n
\n \n \n {() => {\n switch (currentContent) {\n case GlobalSearchContent.ChatList:\n if (chatId) {\n return (\n \n );\n }\n return (\n \n );\n case GlobalSearchContent.Media:\n return ;\n case GlobalSearchContent.Links:\n return ;\n case GlobalSearchContent.Files:\n return ;\n case GlobalSearchContent.Music:\n return (\n \n );\n case GlobalSearchContent.Voice:\n return (\n \n );\n default:\n return undefined;\n }\n }}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentContent, chatId } = global.globalSearch;\n\n return { currentContent, chatId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setGlobalSearchContent', 'setGlobalSearchDate']),\n)(LeftSearch));\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\n\nexport type TwoFaActions = (\n 'setCurrentPassword' | 'setPassword' | 'setHint' | 'setEmail' | 'reset'\n);\nexport type TwoFaDispatch = Dispatch;\n\nexport type TwoFaState = {\n currentPassword: string;\n password: string;\n hint: string;\n email: string;\n};\n\nconst INITIAL_STATE: TwoFaState = {\n currentPassword: '',\n password: '',\n hint: '',\n email: '',\n};\n\nconst twoFaReducer: StateReducer = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setCurrentPassword':\n return {\n ...state,\n currentPassword: action.payload,\n };\n\n case 'setPassword':\n return {\n ...state,\n password: action.payload,\n };\n\n case 'setHint':\n return {\n ...state,\n hint: action.payload,\n };\n\n case 'setEmail':\n return {\n ...state,\n email: action.payload,\n };\n\n case 'reset':\n return INITIAL_STATE;\n\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(twoFaReducer, INITIAL_STATE);\n};\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\nimport Button from '../../ui/Button';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n currentScreen: SettingsScreens;\n editedFolderId?: number;\n onReset: () => void;\n onSaveFilter: () => void;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsHeader: FC = ({\n currentScreen,\n editedFolderId,\n onReset,\n onSaveFilter,\n signOut,\n deleteChatFolder,\n}) => {\n const [isSignOutDialogOpen, setIsSignOutDialogOpen] = useState(false);\n const [isDeleteFolderDialogOpen, setIsDeleteFolderDialogOpen] = useState(false);\n\n const openSignOutConfirmation = useCallback(() => {\n setIsSignOutDialogOpen(true);\n }, []);\n\n const closeSignOutConfirmation = useCallback(() => {\n setIsSignOutDialogOpen(false);\n }, []);\n\n const openDeleteFolderConfirmation = useCallback(() => {\n setIsDeleteFolderDialogOpen(true);\n }, []);\n\n const closeDeleteFolderConfirmation = useCallback(() => {\n setIsDeleteFolderDialogOpen(false);\n }, []);\n\n const handleSignOutMessage = useCallback(() => {\n closeSignOutConfirmation();\n signOut();\n }, [closeSignOutConfirmation, signOut]);\n\n const handleDeleteFolderMessage = useCallback(() => {\n closeDeleteFolderConfirmation();\n deleteChatFolder({ id: editedFolderId });\n onReset();\n }, [editedFolderId, closeDeleteFolderConfirmation, deleteChatFolder, onReset]);\n\n const SettingsMenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, []);\n\n const lang = useLang();\n\n function renderHeaderContent() {\n switch (currentScreen) {\n case SettingsScreens.EditProfile:\n return

{lang('lng_settings_information')}

;\n case SettingsScreens.General:\n return

{lang('General')}

;\n case SettingsScreens.Notifications:\n return

{lang('Notifications')}

;\n case SettingsScreens.Privacy:\n return

{lang('PrivacySettings')}

;\n case SettingsScreens.Language:\n return

{lang('Language')}

;\n\n case SettingsScreens.GeneralChatBackground:\n return

{lang('ChatBackground')}

;\n case SettingsScreens.GeneralChatBackgroundColor:\n return

{lang('SetColor')}

;\n\n case SettingsScreens.PrivacyPhoneNumber:\n return

{lang('PrivacyPhone')}

;\n case SettingsScreens.PrivacyLastSeen:\n return

{lang('PrivacyLastSeen')}

;\n case SettingsScreens.PrivacyProfilePhoto:\n return

{lang('Privacy.ProfilePhoto')}

;\n case SettingsScreens.PrivacyForwarding:\n return

{lang('PrivacyForwards')}

;\n case SettingsScreens.PrivacyGroupChats:\n return

{lang('AutodownloadGroupChats')}

;\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return

{lang('AlwaysShareWith')}

;\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return

{lang('NeverShareWith')}

;\n\n case SettingsScreens.PrivacyActiveSessions:\n return

{lang('SessionsTitle')}

;\n case SettingsScreens.PrivacyBlockedUsers:\n return

{lang('BlockedUsers')}

;\n\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaEnabled:\n return

{lang('TwoStepVerification')}

;\n case SettingsScreens.TwoFaNewPassword:\n case SettingsScreens.TwoFaChangePasswordNew:\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return

{lang('PleaseEnterCurrentPassword')}

;\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return

{lang('PleaseReEnterPassword')}

;\n case SettingsScreens.TwoFaNewPasswordHint:\n case SettingsScreens.TwoFaChangePasswordHint:\n return

{lang('PasswordHint')}

;\n case SettingsScreens.TwoFaNewPasswordEmail:\n case SettingsScreens.TwoFaRecoveryEmail:\n return

{lang('RecoveryEmailTitle')}

;\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return

Recovery Email Code

;\n case SettingsScreens.TwoFaCongratulations:\n return

{lang('TwoStepVerificationPasswordSet')}

;\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return

{lang('PleaseEnterCurrentPassword')}

;\n\n case SettingsScreens.Folders:\n return

{lang('Filters')}

;\n case SettingsScreens.FoldersCreateFolder:\n return

{lang('FilterNew')}

;\n case SettingsScreens.FoldersEditFolder:\n case SettingsScreens.FoldersEditFolderFromChatList:\n return (\n
\n

{lang('FilterEdit')}

\n\n {editedFolderId && (\n \n \n {lang('Delete')}\n \n \n )}\n
\n );\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersIncludedChatsFromChatList:\n case SettingsScreens.FoldersExcludedChats:\n case SettingsScreens.FoldersExcludedChatsFromChatList:\n return (\n
\n {(currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersIncludedChatsFromChatList) ? (\n

{lang('FilterInclude')}

\n ) : (\n

{lang('FilterExclude')}

\n )}\n\n \n \n \n
\n );\n\n default:\n return (\n
\n

{lang('SETTINGS')}

\n\n \n {lang('LogOutTitle')}\n \n
\n );\n }\n }\n\n return (\n
\n \n \n \n {renderHeaderContent()}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['signOut', 'deleteChatFolder']),\n)(SettingsHeader));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../types';\nimport { ApiUser } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { getUserFullName } from '../../../modules/helpers';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport renderText from '../../common/helpers/renderText';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Avatar from '../../common/Avatar';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUser?: ApiUser;\n};\n\nconst SettingsMain: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n currentUser,\n}) => {\n const lang = useLang();\n const fullName = getUserFullName(currentUser);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Main);\n\n return (\n
\n
\n {currentUser && (\n
\n \n

{fullName && renderText(fullName)}

\n

{formatPhoneNumberWithCode(currentUser.phoneNumber)}

\n
\n )}\n onScreenSelect(SettingsScreens.EditProfile)}\n >\n {lang('lng_settings_information')}\n \n onScreenSelect(SettingsScreens.Folders)}\n >\n {lang('Filters')}\n \n onScreenSelect(SettingsScreens.General)}\n >\n {lang('Telegram.GeneralSettingsViewController')}\n \n onScreenSelect(SettingsScreens.Notifications)}\n >\n {lang('Notifications')}\n \n onScreenSelect(SettingsScreens.Privacy)}\n >\n {lang('PrivacySettings')}\n \n onScreenSelect(SettingsScreens.Language)}\n >\n {lang('Language')}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentUserId } = global;\n\n return {\n currentUser: currentUserId ? selectUser(global, currentUserId) : undefined,\n };\n },\n)(SettingsMain));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useCallback, memo, useEffect, useMemo,\n} from '../../lib/teact/teact';\n\nimport { debounce } from '../../util/schedulers';\nimport useLang from '../../hooks/useLang';\n\nimport InputText from '../ui/InputText';\n\ntype OwnProps = {\n currentUsername?: string;\n asLink?: boolean;\n isLoading?: boolean;\n isUsernameAvailable?: boolean;\n checkUsername: AnyToVoidFunction;\n onChange: (value: string | false) => void;\n};\n\nconst MIN_USERNAME_LENGTH = 5;\nconst MAX_USERNAME_LENGTH = 32;\nconst LINK_PREFIX = 'https://t.me/';\nconst LINK_PREFIX_REGEX = /https:\\/\\/t\\.me\\/?/i;\nconst USERNAME_REGEX = /^([a-zA-Z0-9_]+)$/;\n\nconst runDebouncedForCheckUsername = debounce((cb) => cb(), 250, false);\n\nfunction isUsernameValid(username: string) {\n return username.length >= MIN_USERNAME_LENGTH\n && username.length <= MAX_USERNAME_LENGTH\n && USERNAME_REGEX.test(username);\n}\n\nconst SettingsEditProfile: FC = ({\n currentUsername,\n asLink,\n isLoading,\n isUsernameAvailable,\n checkUsername,\n onChange,\n}) => {\n const [username, setUsername] = useState(currentUsername || '');\n\n const lang = useLang();\n const langPrefix = asLink ? 'SetUrl' : 'Username';\n const label = asLink ? lang('SetUrlPlaceholder') : lang('Username');\n\n const [usernameSuccess, usernameError] = useMemo(() => {\n if (!username.length) {\n return [];\n }\n\n if (username.length < MIN_USERNAME_LENGTH) {\n return [undefined, `${label} is too short`];\n }\n if (username.length > MAX_USERNAME_LENGTH) {\n return [undefined, `${label} is too long`];\n }\n if (!USERNAME_REGEX.test(username)) {\n return [undefined, `${label} contains invalid characters`];\n }\n\n if (isUsernameAvailable === undefined) {\n return [];\n }\n\n // Variable `isUsernameAvailable` is initialized with `undefined`, so a strict false check is required\n return [\n isUsernameAvailable ? lang(`${langPrefix}Available`, 'Username') : undefined,\n isUsernameAvailable === false ? lang(`${langPrefix}InUse`) : undefined,\n ];\n }, [username, isUsernameAvailable, lang, langPrefix, label]);\n\n useEffect(() => {\n setUsername(currentUsername || '');\n }, [asLink, currentUsername]);\n\n const handleUsernameChange = useCallback((e: ChangeEvent) => {\n const newUsername = e.target.value.trim().replace(LINK_PREFIX_REGEX, '');\n setUsername(newUsername);\n e.target.value = `${asLink ? LINK_PREFIX : ''}${newUsername}`;\n\n const isValid = isUsernameValid(newUsername);\n\n if (isValid) {\n runDebouncedForCheckUsername(() => {\n checkUsername({ username: newUsername });\n });\n }\n\n if (onChange) {\n onChange(isValid ? newUsername : false);\n }\n }, [asLink, checkUsername, onChange]);\n\n return (\n \n );\n};\n\nexport default memo(SettingsEditProfile);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useCallback, memo, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { ProfileEditProgress, SettingsScreens } from '../../../types';\n\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport { selectUser } from '../../../modules/selectors';\nimport { getChatAvatarHash } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport InputText from '../../ui/InputText';\nimport renderText from '../../common/helpers/renderText';\nimport UsernameInput from '../../common/UsernameInput';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\ntype OwnProps = {\n isActive: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentAvatarHash?: string;\n currentFirstName?: string;\n currentLastName?: string;\n currentBio?: string;\n currentUsername?: string;\n progress?: ProfileEditProgress;\n isUsernameAvailable?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst MAX_BIO_LENGTH = 70;\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide your first name';\nconst ERROR_BIO_TOO_LONG = 'Bio can\\' be longer than 70 characters';\n\nconst SettingsEditProfile: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n loadCurrentUser,\n updateProfile,\n checkUsername,\n}) => {\n const lang = useLang();\n\n const [isUsernameTouched, setIsUsernameTouched] = useState(false);\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n\n const [photo, setPhoto] = useState();\n const [firstName, setFirstName] = useState(currentFirstName || '');\n const [lastName, setLastName] = useState(currentLastName || '');\n const [bio, setBio] = useState(currentBio || '');\n const [username, setUsername] = useState(currentUsername || '');\n\n const currentAvatarBlobUrl = useMedia(currentAvatarHash, false, ApiMediaFormat.BlobUrl);\n\n const isLoading = progress === ProfileEditProgress.InProgress;\n const isUsernameError = username === false;\n\n const isSaveButtonShown = useMemo(() => {\n if (isUsernameError) {\n return false;\n }\n\n return Boolean(photo) || isProfileFieldsTouched || isUsernameAvailable === true;\n }, [photo, isProfileFieldsTouched, isUsernameError, isUsernameAvailable]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.EditProfile);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadCurrentUser();\n });\n }, [loadCurrentUser]);\n\n useEffect(() => {\n setPhoto(undefined);\n }, [currentAvatarBlobUrl]);\n\n useEffect(() => {\n setFirstName(currentFirstName || '');\n setLastName(currentLastName || '');\n setBio(currentBio || '');\n }, [currentFirstName, currentLastName, currentBio]);\n\n useEffect(() => {\n setUsername(currentUsername || '');\n }, [currentUsername]);\n\n useEffect(() => {\n if (progress === ProfileEditProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setIsUsernameTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const handlePhotoChange = useCallback((newPhoto: File) => {\n setPhoto(newPhoto);\n }, []);\n\n const handleFirstNameChange = useCallback((e: ChangeEvent) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleBioChange = useCallback((e: ChangeEvent) => {\n setBio(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUsernameChange = useCallback((value: string | false) => {\n setUsername(value);\n setIsUsernameTouched(true);\n }, []);\n\n const handleProfileSave = useCallback(() => {\n const trimmedFirstName = firstName.trim();\n const trimmedLastName = lastName.trim();\n const trimmedBio = bio.trim();\n\n if (!trimmedFirstName.length) {\n setError(ERROR_FIRST_NAME_MISSING);\n return;\n }\n\n if (trimmedBio.length > MAX_BIO_LENGTH) {\n setError(ERROR_BIO_TOO_LONG);\n return;\n }\n\n updateProfile({\n photo,\n ...(isProfileFieldsTouched && {\n firstName: trimmedFirstName,\n lastName: trimmedLastName,\n bio: trimmedBio,\n }),\n ...(isUsernameTouched && {\n username,\n }),\n });\n }, [\n photo,\n firstName, lastName, bio, isProfileFieldsTouched,\n username, isUsernameTouched,\n updateProfile,\n ]);\n\n return (\n
\n
\n
\n \n \n \n \n\n

\n {renderText(lang('lng_settings_about_bio'), ['br', 'simple_markdown'])}\n

\n
\n\n
\n

{lang('Username')}

\n\n \n\n

\n {renderText(lang('UsernameHelp'), ['br', 'simple_markdown'])}\n

\n {username && (\n

\n {lang('lng_username_link')}
\n https://t.me/{username}\n

\n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentUserId } = global;\n const { progress, isUsernameAvailable } = global.profileEdit || {};\n const currentUser = currentUserId ? selectUser(global, currentUserId) : undefined;\n\n if (!currentUser) {\n return {\n progress,\n isUsernameAvailable,\n };\n }\n\n const {\n firstName: currentFirstName,\n lastName: currentLastName,\n username: currentUsername,\n fullInfo,\n } = currentUser;\n const { bio: currentBio } = fullInfo || {};\n const currentAvatarHash = getChatAvatarHash(currentUser);\n\n return {\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadCurrentUser',\n 'updateProfile',\n 'checkUsername',\n ]),\n)(SettingsEditProfile));\n","import React, {\n FC, memo, useMemo, useCallback, useState, useEffect,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { ApiChatFolder, ApiChat, ApiUser } from '../../../../api/types';\nimport { NotifyException, NotifySettings, SettingsScreens } from '../../../../types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick } from '../../../../util/iteratees';\nimport { selectNotifyExceptions, selectNotifySettings } from '../../../../modules/selectors';\nimport { throttle } from '../../../../util/schedulers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport { getFolderDescriptionText } from '../../../../modules/helpers';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport ListItem from '../../../ui/ListItem';\nimport Button from '../../../ui/Button';\nimport Loading from '../../../ui/Loading';\nimport AnimatedSticker from '../../../common/AnimatedSticker';\n\ntype OwnProps = {\n onCreateFolder: () => void;\n onEditFolder: (folder: ApiChatFolder) => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n orderedFolderIds?: number[];\n foldersById: Record;\n recommendedChatFolders?: ApiChatFolder[];\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottledForLoadRecommended = throttle((cb) => cb(), 60000, true);\n\nconst MAX_ALLOWED_FOLDERS = 10;\n\nconst SettingsFoldersMain: FC = ({\n onCreateFolder,\n onEditFolder,\n isActive,\n onScreenSelect,\n onReset,\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings,\n notifyExceptions,\n loadRecommendedChatFolders,\n addChatFolder,\n showDialog,\n}) => {\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('FoldersAll').then(setAnimationData);\n }\n }, [animationData]);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottledForLoadRecommended(() => {\n loadRecommendedChatFolders();\n });\n }, [loadRecommendedChatFolders]);\n\n const handleCreateFolder = useCallback(() => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showDialog({\n data: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n hasErrorKey: true,\n },\n });\n\n return;\n }\n\n onCreateFolder();\n }, [foldersById, showDialog, onCreateFolder]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Folders);\n\n const userFolders = useMemo(() => {\n if (!orderedFolderIds) {\n return undefined;\n }\n\n const chatIds = Object.keys(chatsById).map(Number);\n\n return orderedFolderIds.map((id) => {\n const folder = foldersById[id];\n\n return {\n id: folder.id,\n title: folder.title,\n subtitle: getFolderDescriptionText(\n lang, chatsById, usersById, folder, chatIds, notifySettings, notifyExceptions,\n ),\n };\n });\n }, [orderedFolderIds, chatsById, foldersById, usersById, notifySettings, notifyExceptions, lang]);\n\n const handleCreateFolderFromRecommended = useCallback((folder: ApiChatFolder) => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showDialog({\n data: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n hasErrorKey: true,\n },\n });\n\n return;\n }\n\n addChatFolder({ folder });\n }, [foldersById, addChatFolder, showDialog]);\n\n return (\n
\n
\n
\n {animationData && (\n \n )}\n
\n\n

\n {lang('CreateNewFilterInfo')}\n

\n\n \n \n {lang('CreateNewFilter')}\n \n
\n\n
\n

{lang('Filters')}

\n\n {userFolders && userFolders.length ? userFolders.map((folder) => (\n onEditFolder(foldersById[folder.id])}\n >\n {folder.title}\n {folder.subtitle}\n \n )) : userFolders && !userFolders.length ? (\n

\n You have no folders yet.\n

\n ) : }\n
\n\n {(recommendedChatFolders && !!recommendedChatFolders.length) && (\n
\n

\n {lang('FilterRecommended')}\n

\n\n {recommendedChatFolders.map((folder) => (\n handleCreateFolderFromRecommended(folder)}\n >\n
\n
\n {folder.title}\n {folder.description}\n
\n\n \n {lang('Add')}\n \n
\n \n ))}\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: { byId: chatsById },\n users: { byId: usersById },\n } = global;\n\n const {\n orderedIds: orderedFolderIds,\n byId: foldersById,\n recommended: recommendedChatFolders,\n } = global.chatFolders;\n\n return {\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadRecommendedChatFolders', 'addChatFolder', 'showDialog']),\n)(SettingsFoldersMain));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\n\nimport './ShowMoreButton.scss';\n\ntype OwnProps = {\n count: number;\n itemName: string;\n itemPluralName?: string;\n isLoading?: boolean;\n onClick: () => void;\n};\n\nconst ShowMoreButton: FC = ({\n count,\n itemName,\n itemPluralName,\n isLoading,\n onClick,\n}) => {\n const lang = useLang();\n\n return (\n \n \n Show {count} more {count > 1 ? itemPluralName || `${itemName}s` : itemName}\n \n );\n};\n\nexport default ShowMoreButton;\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { findIntersectionWithSet, pick } from '../../../../util/iteratees';\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport {\n EXCLUDED_CHAT_TYPES,\n FolderEditDispatch,\n FoldersState,\n INCLUDED_CHAT_TYPES,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedSticker from '../../../common/AnimatedSticker';\nimport InputText from '../../../ui/InputText';\nimport PrivateChatInfo from '../../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../../common/GroupChatInfo';\nimport FloatingActionButton from '../../../ui/FloatingActionButton';\nimport Spinner from '../../../ui/Spinner';\nimport ShowMoreButton from '../../../ui/ShowMoreButton';\n\ntype OwnProps = {\n state: FoldersState;\n dispatch: FolderEditDispatch;\n onAddIncludedChats: () => void;\n onAddExcludedChats: () => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n onBack: () => void;\n};\n\ntype StateProps = {\n loadedActiveChatIds?: number[];\n loadedArchivedChatIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SUBMIT_TIMEOUT = 500;\n\nconst INITIAL_CHATS_LIMIT = 5;\n\nconst ERROR_NO_TITLE = 'Please provide a title for this folder.';\nconst ERROR_NO_CHATS = 'ChatList.Filter.Error.Empty';\n\nconst SettingsFoldersEdit: FC = ({\n state,\n dispatch,\n onAddIncludedChats,\n onAddExcludedChats,\n isActive,\n onScreenSelect,\n onReset,\n onBack,\n loadedActiveChatIds,\n loadedArchivedChatIds,\n editChatFolder,\n addChatFolder,\n loadMoreChats,\n}) => {\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n\n const [isIncludedChatsListExpanded, setIsIncludedChatsListExpanded] = useState(false);\n const [isExcludedChatsListExpanded, setIsExcludedChatsListExpanded] = useState(false);\n\n const {\n selectedChatIds: includedChatIds,\n selectedChatTypes: includedChatTypes,\n } = selectChatFilters(state, 'included');\n const {\n selectedChatIds: excludedChatIds,\n selectedChatTypes: excludedChatTypes,\n } = selectChatFilters(state, 'excluded');\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('FoldersNew').then(setAnimationData);\n }\n }, [animationData]);\n\n useEffect(() => {\n setIsIncludedChatsListExpanded(false);\n setIsExcludedChatsListExpanded(false);\n }, [state.folderId]);\n\n const [visibleIncludedChatIds, visibleExcludedChatIds] = useMemo(() => {\n const allLoadedChatsSet = new Set([\n ...loadedActiveChatIds || [],\n ...loadedArchivedChatIds || [],\n ]);\n\n const loadedIncludedChatIds = findIntersectionWithSet(includedChatIds, allLoadedChatsSet);\n const loadedExcludedChatIds = findIntersectionWithSet(excludedChatIds, allLoadedChatsSet);\n\n return [\n isIncludedChatsListExpanded\n ? loadedIncludedChatIds\n : loadedIncludedChatIds.slice(0, INITIAL_CHATS_LIMIT - includedChatTypes.length),\n isExcludedChatsListExpanded\n ? loadedExcludedChatIds\n : loadedExcludedChatIds.slice(0, INITIAL_CHATS_LIMIT - excludedChatTypes.length),\n ];\n }, [\n excludedChatIds, includedChatIds, includedChatTypes, excludedChatTypes,\n isExcludedChatsListExpanded, isIncludedChatsListExpanded,\n loadedActiveChatIds, loadedArchivedChatIds,\n ]);\n\n useEffect(() => {\n if (\n visibleIncludedChatIds.length < includedChatIds.length\n || visibleExcludedChatIds.length < excludedChatIds.length\n ) {\n loadMoreChats({ listType: 'active' });\n }\n }, [\n loadMoreChats,\n excludedChatIds.length,\n includedChatIds.length,\n visibleExcludedChatIds.length,\n visibleIncludedChatIds.length,\n ]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onBack, onScreenSelect, state.mode === 'edit'\n ? SettingsScreens.FoldersEditFolder\n : SettingsScreens.FoldersCreateFolder);\n\n function handleChange(event: React.ChangeEvent) {\n const { currentTarget } = event;\n dispatch({ type: 'setTitle', payload: currentTarget.value.trim() });\n }\n\n function handleSubmit() {\n const { title } = state.folder;\n\n if (!title) {\n dispatch({ type: 'setError', payload: ERROR_NO_TITLE });\n return;\n }\n\n if (!includedChatIds.length && !Object.keys(includedChatTypes).length) {\n dispatch({ type: 'setError', payload: ERROR_NO_CHATS });\n return;\n }\n\n dispatch({ type: 'setIsLoading', payload: true });\n if (state.mode === 'edit') {\n editChatFolder({ id: state.folderId, folderUpdate: state.folder });\n } else {\n addChatFolder({ folder: state.folder });\n }\n\n setTimeout(() => {\n onReset();\n }, SUBMIT_TIMEOUT);\n }\n\n function renderChatType(key: string, mode: 'included' | 'excluded') {\n const chatType = mode === 'included'\n ? INCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key)\n : EXCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key);\n\n if (!chatType) {\n return undefined;\n }\n\n return (\n \n {lang(chatType.title)}\n \n );\n }\n\n function renderChats(mode: 'included' | 'excluded') {\n const selectedChatTypes = mode === 'included' ? includedChatTypes : excludedChatTypes;\n const visibleChatIds = mode === 'included' ? visibleIncludedChatIds : visibleExcludedChatIds;\n\n const isExpanded = mode === 'included' ? isIncludedChatsListExpanded : isExcludedChatsListExpanded;\n const allChatIds = mode === 'included' ? includedChatIds : excludedChatIds;\n const leftChatsCount = allChatIds.length - selectedChatTypes.length - visibleChatIds.length;\n const clickHandler = mode === 'included'\n ? () => setIsIncludedChatsListExpanded(true)\n : () => setIsExcludedChatsListExpanded(true);\n\n return (\n <>\n {selectedChatTypes.map((key) => renderChatType(key, mode))}\n {visibleChatIds.map((id) => (\n \n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n {(!isExpanded && leftChatsCount > 0) && (\n \n )}\n \n );\n }\n\n return (\n
\n
\n
\n
\n {animationData && (\n \n )}\n
\n\n {state.mode === 'create' && (\n

\n {lang('FilterIncludeInfo')}\n

\n )}\n\n \n
\n\n
\n {state.error && state.error === ERROR_NO_CHATS && (\n

\n {lang(state.error)}\n

\n )}\n\n

{lang('FilterInclude')}

\n\n \n {lang('FilterAddChats')}\n \n\n {renderChats('included')}\n
\n\n
\n

{lang('FilterExclude')}

\n\n \n {lang('FilterAddChats')}\n \n\n {renderChats('excluded')}\n
\n
\n\n \n {state.isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { listIds } = global.chats;\n\n return {\n loadedActiveChatIds: listIds.active,\n loadedArchivedChatIds: listIds.archived,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['editChatFolder', 'addChatFolder', 'loadMoreChats']),\n)(SettingsFoldersEdit));\n","import React, {\n FC, useCallback, useRef, useEffect, memo,\n} from '../../../../lib/teact/teact';\n\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport {\n INCLUDED_CHAT_TYPES,\n EXCLUDED_CHAT_TYPES,\n FolderChatType,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useInfiniteScroll from '../../../../hooks/useInfiniteScroll';\nimport useLang from '../../../../hooks/useLang';\n\nimport Checkbox from '../../../ui/Checkbox';\nimport InputText from '../../../ui/InputText';\nimport ListItem from '../../../ui/ListItem';\nimport PrivateChatInfo from '../../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../../common/GroupChatInfo';\nimport PickerSelectedItem from '../../../common/PickerSelectedItem';\nimport InfiniteScroll from '../../../ui/InfiniteScroll';\nimport Loading from '../../../ui/Loading';\n\nimport '../../../common/Picker.scss';\nimport './SettingsFoldersChatsPicker.scss';\n\ntype OwnProps = {\n mode: 'included' | 'excluded';\n chatIds: number[];\n selectedIds: number[];\n selectedChatTypes: string[];\n filterValue?: string;\n onSelectedIdsChange: (ids: number[]) => void;\n onSelectedChatTypesChange: (types: string[]) => void;\n onFilterChange: (value: string) => void;\n onLoadMore: () => void;\n};\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\n\nconst MAX_CHATS = 100;\nconst MAX_FULL_ITEMS = 10;\nconst ALWAYS_FULL_ITEMS_COUNT = 5;\n\nconst SettingsFoldersChatsPicker: FC = ({\n mode,\n chatIds,\n selectedIds,\n selectedChatTypes,\n filterValue,\n onSelectedIdsChange,\n onSelectedChatTypesChange,\n onFilterChange,\n onLoadMore,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const chatTypes = mode === 'included' ? INCLUDED_CHAT_TYPES : EXCLUDED_CHAT_TYPES;\n const shouldMinimize = selectedIds.length + selectedChatTypes.length > MAX_FULL_ITEMS;\n const hasMaxChats = selectedIds.length >= MAX_CHATS;\n\n useEffect(() => {\n setTimeout(() => {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n });\n }, FOCUS_DELAY_MS);\n }, []);\n\n const handleItemClick = useCallback((id: number) => {\n const newSelectedIds = [...selectedIds];\n if (newSelectedIds.includes(id)) {\n newSelectedIds.splice(newSelectedIds.indexOf(id), 1);\n } else {\n newSelectedIds.push(id);\n }\n onSelectedIdsChange(newSelectedIds);\n }, [selectedIds, onSelectedIdsChange]);\n\n const handleChatTypeClick = useCallback((key: FolderChatType['key']) => {\n const newSelectedChatTypes = [...selectedChatTypes];\n if (newSelectedChatTypes.includes(key)) {\n newSelectedChatTypes.splice(newSelectedChatTypes.indexOf(key), 1);\n } else {\n newSelectedChatTypes.push(key);\n }\n onSelectedChatTypesChange(newSelectedChatTypes);\n }, [selectedChatTypes, onSelectedChatTypesChange]);\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n onFilterChange(value);\n }, [onFilterChange]);\n\n const lang = useLang();\n\n function renderSelectedChatType(key: string) {\n const selectedType = chatTypes.find(({ key: typeKey }) => key === typeKey);\n if (!selectedType) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n function renderChatType(type: FolderChatType) {\n return (\n handleChatTypeClick(type.key)}\n ripple\n >\n \n

{lang(type.title)}

\n \n \n );\n }\n\n function renderItem(id: number) {\n const isSelected = selectedIds.includes(id);\n\n return (\n handleItemClick(id)}\n ripple\n disabled={!isSelected && hasMaxChats}\n >\n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n \n );\n }\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, chatIds, Boolean(filterValue));\n\n return (\n
\n
\n {selectedChatTypes.map(renderSelectedChatType)}\n {selectedIds.map((id, i) => (\n \n ))}\n {!hasMaxChats ? (\n \n ) : (\n

\n {`Sorry, you can't add more than ${MAX_CHATS} chats.`}\n

\n )}\n
\n \n {(!viewportIds || !viewportIds.length || viewportIds.includes(chatIds[0])) && (\n <>\n

\n {lang('FilterChatTypes')}\n

\n {chatTypes.map(renderChatType)}\n
\n

\n {lang('FilterChats')}\n

\n \n )}\n\n {viewportIds && viewportIds.length ? (\n viewportIds.map(renderItem)\n ) : viewportIds && !viewportIds.length ? (\n

Sorry, nothing found.

\n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(SettingsFoldersChatsPicker);\n","import React, {\n FC, memo, useMemo, useCallback,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { ApiChat } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport useLang from '../../../../hooks/useLang';\nimport { pick } from '../../../../util/iteratees';\nimport searchWords from '../../../../util/searchWords';\nimport { prepareChatList, getChatTitle } from '../../../../modules/helpers';\nimport {\n FoldersState,\n FolderEditDispatch,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport SettingsFoldersChatsPicker from './SettingsFoldersChatsPicker';\n\nimport Loading from '../../../ui/Loading';\n\ntype OwnProps = {\n mode: 'included' | 'excluded';\n state: FoldersState;\n dispatch: FolderEditDispatch;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsFoldersChatFilters: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n mode,\n state,\n dispatch,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n loadMoreChats,\n}) => {\n const { chatFilter } = state;\n const { selectedChatIds, selectedChatTypes } = selectChatFilters(state, mode, true);\n\n const lang = useLang();\n const chats = useMemo(() => {\n const activeChatArrays = listIds\n ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all')\n : undefined;\n const archivedChatArrays = archivedListIds\n ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived')\n : undefined;\n\n if (!activeChatArrays && !archivedChatArrays) {\n return undefined;\n }\n\n return [\n ...(activeChatArrays\n ? [...activeChatArrays.pinnedChats, ...activeChatArrays.otherChats]\n : []\n ),\n ...(archivedChatArrays ? archivedChatArrays.otherChats : []),\n ];\n }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]);\n\n const displayedIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (\n !chatFilter\n || searchWords(getChatTitle(lang, chat), chatFilter)\n || selectedChatIds.includes(chat.id)\n ))\n .map(({ id }) => id);\n }, [chats, chatFilter, lang, selectedChatIds]);\n\n const handleFilterChange = useCallback((newFilter: string) => {\n dispatch({\n type: 'setChatFilter',\n payload: newFilter,\n });\n }, [dispatch]);\n\n const handleSelectedIdsChange = useCallback((ids: number[]) => {\n if (mode === 'included') {\n dispatch({\n type: 'setIncludeFilters',\n payload: { ...state.includeFilters, includedChatIds: ids },\n });\n } else {\n dispatch({\n type: 'setExcludeFilters',\n payload: { ...state.excludeFilters, excludedChatIds: ids },\n });\n }\n }, [mode, state, dispatch]);\n\n const handleSelectedChatTypesChange = useCallback((keys: string[]) => {\n const newFilters: Record = {};\n keys.forEach((key) => {\n newFilters[key] = true;\n });\n\n if (mode === 'included') {\n dispatch({\n type: 'setIncludeFilters',\n payload: {\n includedChatIds: selectedChatIds,\n ...newFilters,\n },\n });\n } else {\n dispatch({\n type: 'setExcludeFilters',\n payload: {\n excludedChatIds: selectedChatIds,\n ...newFilters,\n },\n });\n }\n }, [mode, selectedChatIds, dispatch]);\n\n useHistoryBack(isActive, onReset, onScreenSelect,\n mode === 'included' ? SettingsScreens.FoldersIncludedChats : SettingsScreens.FoldersExcludedChats);\n\n if (!displayedIds) {\n return ;\n }\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n } = global;\n\n return {\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n archivedPinnedIds: orderedPinnedIds.archived,\n archivedListIds: listIds.archived,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMoreChats']),\n)(SettingsFoldersChatFilters));\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport { ApiChatFolder } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { FolderEditDispatch, FoldersState } from '../../../../hooks/reducers/useFoldersReducer';\n\nimport SettingsFoldersMain from './SettingsFoldersMain';\nimport SettingsFoldersEdit from './SettingsFoldersEdit';\nimport SettingsFoldersChatFilters from './SettingsFoldersChatFilters';\n\nimport './SettingsFolders.scss';\n\nconst TRANSITION_DURATION = 200;\n\nexport type OwnProps = {\n currentScreen: SettingsScreens;\n shownScreen: SettingsScreens;\n state: FoldersState;\n dispatch: FolderEditDispatch;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst SettingsFolders: FC = ({\n currentScreen,\n shownScreen,\n state,\n dispatch,\n isActive,\n onScreenSelect,\n onReset,\n}) => {\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n || currentScreen === SettingsScreens.FoldersEditFolderFromChatList\n ) {\n setTimeout(() => {\n dispatch({ type: 'reset' });\n }, TRANSITION_DURATION);\n }\n\n if (\n currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersExcludedChats\n ) {\n if (state.mode === 'create') {\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n } else {\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }\n return;\n }\n\n onReset();\n }, [\n state.mode, dispatch,\n currentScreen, onReset, onScreenSelect,\n ]);\n\n const handleCreateFolder = useCallback(() => {\n dispatch({ type: 'reset' });\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n }, [onScreenSelect, dispatch]);\n\n const handleEditFolder = useCallback((folder: ApiChatFolder) => {\n dispatch({ type: 'editFolder', payload: folder });\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }, [dispatch, onScreenSelect]);\n\n const handleAddIncludedChats = useCallback(() => {\n dispatch({ type: 'editIncludeFilters' });\n onScreenSelect(currentScreen === SettingsScreens.FoldersEditFolderFromChatList\n ? SettingsScreens.FoldersIncludedChatsFromChatList\n : SettingsScreens.FoldersIncludedChats);\n }, [currentScreen, dispatch, onScreenSelect]);\n\n const handleAddExcludedChats = useCallback(() => {\n dispatch({ type: 'editExcludeFilters' });\n onScreenSelect(currentScreen === SettingsScreens.FoldersEditFolderFromChatList\n ? SettingsScreens.FoldersExcludedChatsFromChatList\n : SettingsScreens.FoldersExcludedChats);\n }, [currentScreen, dispatch, onScreenSelect]);\n\n switch (currentScreen) {\n case SettingsScreens.Folders:\n return (\n \n );\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n case SettingsScreens.FoldersEditFolderFromChatList:\n return (\n \n );\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersIncludedChatsFromChatList:\n return (\n \n );\n case SettingsScreens.FoldersExcludedChats:\n case SettingsScreens.FoldersExcludedChatsFromChatList:\n return (\n \n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(SettingsFolders);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, useMemo, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport './RangeSlider.scss';\n\ntype OwnProps = {\n options?: string[];\n range?: { min: number; max: number; step?: number };\n label?: string;\n value: number;\n disabled?: boolean;\n onChange: (value: number) => void;\n};\n\nconst RangeSlider: FC = ({\n options,\n range,\n label,\n value,\n disabled,\n onChange,\n}) => {\n const lang = useLang();\n const handleChange = useCallback((event: ChangeEvent) => {\n onChange(Number(event.currentTarget.value));\n }, [onChange]);\n\n const className = buildClassName(\n 'RangeSlider',\n disabled && 'disabled',\n );\n\n const trackWidth = useMemo(() => {\n if (options) {\n return (value / (options.length - 1)) * 100;\n } else if (range) {\n const possibleValuesLength = (range.max - range.min) / (range.step || 1);\n return ((value - range.min) / possibleValuesLength) * 100;\n }\n return 0;\n }, [value, options, range]);\n\n const [min, max, step] = useMemo(() => {\n if (options) {\n return [0, options.length - 1, 1];\n } else if (range) {\n return [range.min, range.max, range.step || 1];\n }\n\n return [0, 0, 0];\n }, [range, options]);\n\n return (\n
\n {label && (\n
\n {label}\n {range && (\n {value}\n )}\n
\n )}\n
\n \n \n {options && (\n
\n {options.map((option, index) => (\n onChange(index)}\n >\n {option}\n
\n ))}\n
\n )}\n
\n
\n );\n};\n\nexport default memo(RangeSlider);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiStickerSet } from '../../../api/types';\n\nimport { STICKER_SIZE_PICKER_HEADER } from '../../../config';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport { getFirstLetters } from '../../../util/textFormat';\n\nimport AnimatedSticker from '../../common/AnimatedSticker';\n\ntype OwnProps = {\n size?: number;\n stickerSet: ApiStickerSet;\n observeIntersection: ObserveFn;\n};\n\nconst StickerSetCoverAnimated: FC = ({\n size = STICKER_SIZE_PICKER_HEADER,\n stickerSet,\n observeIntersection,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaHash = `stickerSet${stickerSet.id}`;\n const lottieData = useMedia(mediaHash, !isIntersecting, ApiMediaFormat.Lottie);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(lottieData, 'slow');\n\n return (\n
\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && lottieData && (\n \n )}\n
\n );\n};\n\nexport default memo(StickerSetCoverAnimated);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiStickerSet } from '../../../api/types';\n\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport { getFirstLetters } from '../../../util/textFormat';\n\ntype OwnProps = {\n stickerSet: ApiStickerSet;\n observeIntersection: ObserveFn;\n};\n\nconst StickerSetCover: FC = ({ stickerSet, observeIntersection }) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaData = useMedia(stickerSet.hasThumbnail && `stickerSet${stickerSet.id}`, !isIntersecting);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(mediaData, 'slow');\n\n return (\n
\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && (\n \"\"\n )}\n
\n );\n};\n\nexport default memo(StickerSetCover);\n","import React, {\n FC, memo,\n} from '../../../lib/teact/teact';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { STICKER_SIZE_GENERAL_SETTINGS } from '../../../config';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Button from '../../ui/Button';\nimport StickerSetCoverAnimated from '../../middle/composer/StickerSetCoverAnimated';\nimport StickerSetCover from '../../middle/composer/StickerSetCover';\nimport StickerButton from '../../common/StickerButton';\n\nimport './SettingsStickerSet.scss';\n\ntype OwnProps = {\n stickerSet?: ApiStickerSet;\n observeIntersection: ObserveFn;\n onClick: (value: ApiSticker) => void;\n};\n\nconst SettingsStickerSet: FC = ({\n stickerSet,\n observeIntersection,\n onClick,\n}) => {\n const lang = useLang();\n\n if (!stickerSet || !stickerSet.stickers) {\n return undefined;\n }\n\n const firstSticker = stickerSet.stickers && stickerSet.stickers[0];\n\n if (stickerSet.hasThumbnail || !firstSticker) {\n return (\n firstSticker && onClick(firstSticker)}\n >\n \n {stickerSet.isAnimated ? (\n \n ) : (\n \n )}\n \n
\n
{stickerSet.title}
\n
{lang('StickerPack.StickerCount', stickerSet.count, 'i')}
\n
\n \n );\n } else {\n return (\n onClick(firstSticker)}\n >\n \n
\n
{stickerSet.title}
\n
{lang('StickerPack.StickerCount', stickerSet.count, 'i')}
\n
\n \n );\n }\n};\n\nexport default memo(SettingsStickerSet);\n","import React, {\n FC, useCallback, memo, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ISettings } from '../../../types';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { IS_IOS, IS_MAC_OS, IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport RangeSlider from '../../ui/RangeSlider';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup from '../../ui/RadioGroup';\nimport SettingsStickerSet from './SettingsStickerSet';\nimport StickerSetModal from '../../common/StickerSetModal.async';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick & {\n stickerSetIds?: string[];\n stickerSetsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_LEVEL_OPTIONS = [\n 'Solid and Steady',\n 'Nice and Fast',\n 'Lots of Stuff',\n];\n\nconst SettingsGeneral: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n stickerSetIds,\n stickerSetsById,\n messageTextSize,\n animationLevel,\n messageSendKeyCombo,\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n shouldAutoPlayGifs,\n shouldAutoPlayVideos,\n shouldSuggestStickers,\n shouldLoopStickers,\n setSettingOption,\n loadStickerSets,\n loadAddedStickers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const stickerSettingsRef = useRef(null);\n const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: stickerSettingsRef });\n const [isModalOpen, openModal, closeModal] = useFlag();\n const [sticker, setSticker] = useState();\n\n const lang = useLang();\n\n const KEYBOARD_SEND_OPTIONS = !IS_TOUCH_ENV ? [\n { value: 'enter', label: lang('lng_settings_send_enter'), subLabel: 'New line by Shift + Enter' },\n {\n value: 'ctrl-enter',\n label: lang(IS_MAC_OS ? 'lng_settings_send_cmdenter' : 'lng_settings_send_ctrlenter'),\n subLabel: 'New line by Enter',\n },\n ] : undefined;\n\n useEffect(() => {\n loadStickerSets();\n }, [loadStickerSets]);\n\n useEffect(() => {\n if (stickerSetIds && stickerSetIds.length) {\n loadAddedStickers();\n }\n }, [stickerSetIds, loadAddedStickers]);\n\n const handleAnimationLevelChange = useCallback((newLevel: number) => {\n ANIMATION_LEVEL_OPTIONS.forEach((_, i) => {\n document.body.classList.toggle(`animation-level-${i}`, newLevel === i);\n });\n\n setSettingOption({ animationLevel: newLevel });\n }, [setSettingOption]);\n\n const handleMessageTextSizeChange = useCallback((newSize: number) => {\n document.documentElement.style.setProperty(\n '--composer-text-size', `${Math.max(newSize, IS_IOS ? 16 : 15)}px`,\n );\n document.documentElement.style.setProperty('--message-text-size', `${newSize}px`);\n\n setSettingOption({ messageTextSize: newSize });\n }, [setSettingOption]);\n\n const handleStickerSetClick = useCallback((value: ApiSticker) => {\n setSticker(value);\n openModal();\n }, [openModal]);\n\n const stickerSets = stickerSetIds && stickerSetIds.map((id: string) => {\n return stickerSetsById && stickerSetsById[id] && stickerSetsById[id].installedDate ? stickerSetsById[id] : false;\n }).filter(Boolean as any);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.General);\n\n return (\n
\n
\n

{lang('SETTINGS')}

\n\n \n\n onScreenSelect(SettingsScreens.GeneralChatBackground)}\n >\n {lang('ChatBackground')}\n \n
\n\n
\n

\n Animation Level\n

\n

\n Choose the desired animations amount.\n

\n\n \n
\n\n {KEYBOARD_SEND_OPTIONS && (\n
\n

{lang('VoiceOver.Keyboard')}

\n\n setSettingOption({ messageSendKeyCombo: value })}\n selected={messageSendKeyCombo}\n />\n
\n )}\n\n
\n

{lang('AutoDownloadMedia')}

\n\n setSettingOption({ shouldAutoDownloadMediaFromContacts: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInPrivateChats: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInGroups: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInChannels: isChecked })}\n />\n
\n\n
\n

{lang('AutoplayMedia')}

\n\n setSettingOption({ shouldAutoPlayGifs: isChecked })}\n />\n setSettingOption({ shouldAutoPlayVideos: isChecked })}\n />\n
\n\n
\n

{lang('AccDescrStickers')}

\n\n setSettingOption({ shouldSuggestStickers: isChecked })}\n />\n setSettingOption({ shouldLoopStickers: isChecked })}\n />\n\n
\n {stickerSets && stickerSets.map((stickerSet: ApiStickerSet) => (\n \n ))}\n
\n {sticker && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n ...pick(global.settings.byKey, [\n 'messageTextSize',\n 'animationLevel',\n 'messageSendKeyCombo',\n 'shouldAutoDownloadMediaFromContacts',\n 'shouldAutoDownloadMediaInPrivateChats',\n 'shouldAutoDownloadMediaInGroups',\n 'shouldAutoDownloadMediaInChannels',\n 'shouldAutoPlayGifs',\n 'shouldAutoPlayVideos',\n 'shouldSuggestStickers',\n 'shouldLoopStickers',\n 'isSensitiveEnabled',\n 'canChangeSensitive',\n ]),\n stickerSetIds: global.stickers.added.setIds,\n stickerSetsById: global.stickers.setsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setSettingOption', 'loadStickerSets', 'loadAddedStickers',\n ]),\n)(SettingsGeneral));\n","let fileSelector: HTMLInputElement;\n\nexport function openSystemFilesDialog(accept = '*', callback: (e: Event) => void, noMultiple = false) {\n if (!fileSelector) {\n fileSelector = document.createElement('input');\n fileSelector.setAttribute('type', 'file');\n }\n\n fileSelector.setAttribute('accept', accept);\n\n if (noMultiple) {\n fileSelector.removeAttribute('multiple');\n } else {\n fileSelector.setAttribute('multiple', 'multiple');\n }\n\n // eslint-disable-next-line no-null/no-null\n fileSelector.onchange = null;\n fileSelector.value = '';\n fileSelector.onchange = callback;\n\n fileSelector.click();\n}\n","/* eslint-disable eqeqeq */\n/* eslint-disable prefer-template */\n/* eslint-disable prefer-const */\n/* eslint-disable prefer-destructuring */\n/* eslint-disable one-var */\n/* eslint-disable one-var-declaration-per-line */\n\nimport { preloadImage } from './files';\n\n/**\n * HEX > RGB\n * input: 'xxxxxx' (ex. 'ed15fa') case-insensitive\n * output: [r, g, b] ([0-255, 0-255, 0-255])\n */\nexport function hex2rgb(param: string): [number, number, number] {\n return [\n parseInt(param.substring(0, 2), 16),\n parseInt(param.substring(2, 4), 16),\n parseInt(param.substring(4, 6), 16),\n ];\n}\n\n/**\n * RGB > HEX\n * input: [r, g, b] ([0-255, 0-255, 0-255])\n * output: 'xxxxxx' (ex. 'ff0000')\n */\nexport function rgb2hex(param: [number, number, number]) {\n const p0 = param[0].toString(16);\n const p1 = param[1].toString(16);\n const p2 = param[2].toString(16);\n return (p0.length == 1 ? '0' + p0 : p0) + (p1.length == 1 ? '0' + p1 : p1) + (p2.length == 1 ? '0' + p2 : p2);\n}\n\n/**\n * Converts an RGB color value to HSV. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes r, g, and b are contained in the set [0, 255] and\n * returns h, s, and v in the set [0, 1].\n *\n * @param Number r The red color value\n * @param Number g The green color value\n * @param Number b The blue color value\n * @return Array The HSV representation\n */\nexport function rgb2hsb([r, g, b]: [number, number, number]): [number, number, number] {\n r /= 255;\n g /= 255;\n b /= 255;\n\n let max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h!: number, s: number, v: number = max;\n\n let d = max - min;\n s = max == 0 ? 0 : d / max;\n\n if (max == min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n\n h /= 6;\n }\n\n return [h, s, v];\n}\n\n/**\n * Converts an HSV color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes h, s, and v are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 255].\n *\n * @param Number h The hue\n * @param Number s The saturation\n * @param Number v The value\n * @return Array The RGB representation\n */\nexport function hsb2rgb([h, s, v]: [number, number, number]): [number, number, number] {\n let r!: number, g!: number, b!: number;\n\n let i = Math.floor(h * 6);\n let f = h * 6 - i;\n let p = v * (1 - s);\n let q = v * (1 - f * s);\n let t = v * (1 - (1 - f) * s);\n\n switch (i % 6) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n case 5:\n r = v;\n g = p;\n b = q;\n break;\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n ];\n}\n\nexport async function getAverageColor(url: string): Promise<[number, number, number]> {\n // Only visit every 5 pixels\n const blockSize = 5;\n const defaultRGB: [number, number, number] = [0, 0, 0];\n let data;\n let width;\n let height;\n let i = -4;\n let length;\n let rgb: [number, number, number] = [0, 0, 0];\n let count = 0;\n\n const canvas = document.createElement('canvas');\n const context = canvas.getContext && canvas.getContext('2d');\n if (!context) {\n return defaultRGB;\n }\n\n const image = await preloadImage(url);\n height = image.naturalHeight || image.offsetHeight || image.height;\n width = image.naturalWidth || image.offsetWidth || image.width;\n canvas.height = height;\n canvas.width = width;\n\n context.drawImage(image, 0, 0);\n\n try {\n data = context.getImageData(0, 0, width, height);\n } catch (e) {\n return defaultRGB;\n }\n\n length = data.data.length;\n\n // eslint-disable-next-line no-cond-assign\n while ((i += blockSize * 4) < length) {\n ++count;\n rgb[0] += data.data[i];\n rgb[1] += data.data[i + 1];\n rgb[2] += data.data[i + 2];\n }\n\n rgb[0] = Math.floor(rgb[0] / count);\n rgb[1] = Math.floor(rgb[1] / count);\n rgb[2] = Math.floor(rgb[2] / count);\n\n return rgb;\n}\n\n// eslint-disable-next-line max-len\n// Function was adapted from https://github.com/telegramdesktop/tdesktop/blob/35ff621b5b52f7e3553fb0f990ea13ade7101b8e/Telegram/SourceFiles/data/data_wall_paper.cpp#L518\nexport function getPatternColor(rgbColor: [number, number, number]) {\n let [hue, saturation, value] = rgb2hsb(rgbColor);\n\n saturation = Math.min(1, saturation + 0.05 + 0.1 * (1 - saturation));\n value = value > 0.5\n ? Math.max(0, value * 0.65)\n : Math.max(0, Math.min(1, 1 - value * 0.65));\n\n return `hsla(${hue * 360}, ${saturation * 100}%, ${value * 100}%, .4)`;\n}\n","import React, {\n FC, memo, useCallback, useEffect, useState, useRef,\n} from '../../../lib/teact/teact';\nimport { ApiWallpaper } from '../../../api/types';\nimport { ThemeKey, UPLOADING_WALLPAPER_SLUG } from '../../../types';\n\nimport { CUSTOM_BG_CACHE_NAME } from '../../../config';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { fetchBlob } from '../../../util/files';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport buildClassName from '../../../util/buildClassName';\nimport useMedia from '../../../hooks/useMedia';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useCanvasBlur from '../../../hooks/useCanvasBlur';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './WallpaperTile.scss';\n\ntype OwnProps = {\n wallpaper: ApiWallpaper;\n theme: ThemeKey;\n isSelected: boolean;\n onClick: (slug: string) => void;\n};\n\nconst WallpaperTile: FC = ({\n wallpaper,\n theme,\n isSelected,\n onClick,\n}) => {\n const { slug, document } = wallpaper;\n const localMediaHash = `wallpaper${document.id!}`;\n const localBlobUrl = document.previewBlobUrl;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`);\n const thumbRef = useCanvasBlur(\n document.thumbnail && document.thumbnail.dataUri,\n Boolean(previewBlobUrl),\n true,\n );\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(previewBlobUrl || localBlobUrl, 'slow');\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(false);\n const {\n mediaData: fullMedia, downloadProgress,\n } = useMediaWithDownloadProgress(localMediaHash, !isDownloadAllowed);\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const { shouldRender: shouldRenderSpinner, transitionClassNames: spinnerClassNames } = useShowTransition(\n (isDownloadAllowed && !fullMedia) || slug === UPLOADING_WALLPAPER_SLUG,\n undefined,\n wasDownloadDisabled,\n 'slow',\n );\n // To prevent triggering of the effect for useCallback\n const cacheKeyRef = useRef();\n cacheKeyRef.current = theme;\n\n const handleSelect = useCallback(() => {\n (async () => {\n const blob = await fetchBlob(fullMedia!);\n await cacheApi.save(CUSTOM_BG_CACHE_NAME, cacheKeyRef.current!, blob);\n onClick(slug);\n })();\n }, [fullMedia, onClick, slug]);\n\n useEffect(() => {\n if (fullMedia) {\n handleSelect();\n }\n }, [fullMedia, handleSelect]);\n\n const handleClick = useCallback(() => {\n if (fullMedia) {\n handleSelect();\n } else {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n }\n }, [fullMedia, handleSelect]);\n\n const className = buildClassName(\n 'WallpaperTile',\n isSelected && 'selected',\n );\n\n return (\n
\n
\n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n
\n
\n );\n};\n\nexport default memo(WallpaperTile);\n","import React, {\n FC, memo, useEffect, useCallback, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ThemeKey, UPLOADING_WALLPAPER_SLUG } from '../../../types';\nimport { ApiWallpaper } from '../../../api/types';\n\nimport { DARK_THEME_PATTERN_COLOR, DEFAULT_PATTERN_COLOR } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { getAverageColor, getPatternColor, rgb2hex } from '../../../util/colors';\nimport { selectTheme } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Loading from '../../ui/Loading';\nimport WallpaperTile from './WallpaperTile';\n\nimport './SettingsGeneralBackground.scss';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n background?: string;\n isBlurred?: boolean;\n loadedWallpapers?: ApiWallpaper[];\n theme: ThemeKey;\n};\n\ntype DispatchProps = Pick;\n\nconst SUPPORTED_TYPES = 'image/jpeg';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst SettingsGeneralBackground: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n background,\n isBlurred,\n loadedWallpapers,\n theme,\n loadWallpapers,\n uploadWallpaper,\n setThemeSettings,\n}) => {\n const themeRef = useRef();\n themeRef.current = theme;\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadWallpapers();\n });\n }, [loadWallpapers]);\n\n const handleFileSelect = useCallback((e: Event) => {\n const { files } = e.target as HTMLInputElement;\n\n if (files && files.length > 0) {\n uploadWallpaper(files[0]);\n }\n }, [uploadWallpaper]);\n\n const handleUploadWallpaper = useCallback(() => {\n openSystemFilesDialog(SUPPORTED_TYPES, handleFileSelect, true);\n }, [handleFileSelect]);\n\n const handleSetColor = useCallback(() => {\n onScreenSelect(SettingsScreens.GeneralChatBackgroundColor);\n }, [onScreenSelect]);\n\n const handleResetToDefault = useCallback(() => {\n setThemeSettings({\n theme,\n background: undefined,\n backgroundColor: undefined,\n isBlurred: true,\n patternColor: theme === 'dark' ? DARK_THEME_PATTERN_COLOR : DEFAULT_PATTERN_COLOR,\n });\n }, [setThemeSettings, theme]);\n\n const handleWallPaperSelect = useCallback((slug: string) => {\n setThemeSettings({ theme: themeRef.current, background: slug });\n const currentWallpaper = loadedWallpapers && loadedWallpapers.find((wallpaper) => wallpaper.slug === slug);\n if (currentWallpaper && currentWallpaper.document.thumbnail) {\n getAverageColor(currentWallpaper.document.thumbnail.dataUri)\n .then((color) => {\n const patternColor = getPatternColor(color);\n const rgbColor = `#${rgb2hex(color)}`;\n setThemeSettings({ theme: themeRef.current, backgroundColor: rgbColor, patternColor });\n });\n }\n }, [loadedWallpapers, setThemeSettings]);\n\n const handleWallPaperBlurChange = useCallback((e: React.ChangeEvent) => {\n setThemeSettings({ theme: themeRef.current, isBlurred: e.target.checked });\n }, [setThemeSettings]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.GeneralChatBackground);\n\n const isUploading = loadedWallpapers && loadedWallpapers[0] && loadedWallpapers[0].slug === UPLOADING_WALLPAPER_SLUG;\n\n return (\n
\n
\n \n {lang('UploadImage')}\n \n\n \n {lang('SetColor')}\n \n\n \n {lang('ThemeResetToDefaults')}\n \n\n \n
\n\n {loadedWallpapers ? (\n
\n {loadedWallpapers.map((wallpaper) => (\n \n ))}\n
\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const theme = selectTheme(global);\n const { background, isBlurred } = global.settings.themes[theme] || {};\n const { loadedWallpapers } = global.settings;\n\n return {\n background,\n isBlurred,\n loadedWallpapers,\n theme,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadWallpapers', 'uploadWallpaper', 'setThemeSettings',\n ]),\n)(SettingsGeneralBackground));\n","import { ChangeEvent, MutableRefObject, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ThemeKey } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport {\n getPatternColor, hex2rgb, hsb2rgb, rgb2hex, rgb2hsb,\n} from '../../../util/colors';\nimport { captureEvents, RealTouchEvent } from '../../../util/captureEvents';\nimport { selectTheme } from '../../../modules/selectors';\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport InputText from '../../ui/InputText';\n\nimport './SettingsGeneralBackgroundColor.scss';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n backgroundColor?: string;\n theme: ThemeKey;\n};\n\ntype DispatchProps = Pick;\n\ninterface CanvasRects {\n colorRect: {\n offsetLeft: number;\n top: number;\n width: number;\n height: number;\n };\n hueRect: {\n offsetLeft: number;\n width: number;\n };\n}\n\nconst DEFAULT_HSB = rgb2hsb(hex2rgb('e6ebee'));\nconst PREDEFINED_COLORS = [\n '#e6ebee', '#b2cee1', '#008dd0', '#c6e7cb', '#c4e1a6', '#60b16e',\n '#ccd0af', '#a6a997', '#7a7072', '#fdd7af', '#fdb76e', '#dd8851',\n];\n\nconst SettingsGeneralBackground: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n theme,\n backgroundColor,\n setThemeSettings,\n}) => {\n const themeRef = useRef();\n themeRef.current = theme;\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const colorPickerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const huePickerRef = useRef(null);\n const isFirstRunRef = useRef(true);\n\n const [hsb, setHsb] = useState(getInitialHsb(backgroundColor));\n // Cache for drag handlers\n const hsbRef = useRef(hsb);\n useEffect(() => {\n hsbRef.current = hsb;\n }, [hsb]);\n\n const [isDragging, markIsDragging, unmarkIsDragging] = useFlag();\n const [rgbInput, setRgbInput] = useState('');\n const [hexInput, setHexInput] = useState('');\n\n const rectsRef = useRef();\n const colorCtxRef = useRef();\n\n // Setup: cache rects, subscribe for drag events\n useEffect(() => {\n // We use `offsetLeft` instead of `left` to support screen transition\n const colorRect = {\n offsetLeft: colorPickerRef.current!.offsetLeft,\n ...pick(colorPickerRef.current!.getBoundingClientRect(), ['top', 'width', 'height']),\n };\n const hueRect = {\n offsetLeft: huePickerRef.current!.offsetLeft,\n ...pick(huePickerRef.current!.getBoundingClientRect(), ['width']),\n };\n\n rectsRef.current = { colorRect, hueRect };\n\n function handleColorDrag(e: MouseEvent | RealTouchEvent) {\n const colorPosition = [\n Math.min(Math.max(0, e.pageX! - colorRect.offsetLeft), colorRect.width - 1),\n Math.min(Math.max(0, e.pageY! - colorRect.top + containerRef.current!.scrollTop), colorRect.height - 1),\n ];\n\n const { huePosition } = hsb2positions(hsbRef.current, rectsRef.current!);\n\n setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!));\n markIsDragging();\n }\n\n captureEvents(colorPickerRef.current!, {\n onCapture: handleColorDrag,\n onDrag: handleColorDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n withCursor: true,\n });\n\n function handleHueDrag(e: MouseEvent | RealTouchEvent) {\n const { colorPosition } = hsb2positions(hsbRef.current, rectsRef.current!);\n const huePosition = Math.min(Math.max(0, e.pageX! - hueRect.offsetLeft), hueRect.width - 1);\n\n setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!));\n markIsDragging();\n }\n\n captureEvents(huePickerRef.current!, {\n onCapture: handleHueDrag,\n onDrag: handleHueDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n withCursor: true,\n });\n }, [markIsDragging, unmarkIsDragging]);\n\n const { colorPosition = [0, 0], huePosition = 0 } = rectsRef.current ? hsb2positions(hsb, rectsRef.current) : {};\n const hex = rgb2hex(hsb2rgb(hsb));\n const hue = hsb[0];\n const hueHex = rgb2hex(hsb2rgb([hue, 1, 1]));\n\n // Save value and update inputs when HSL changes\n useEffect(() => {\n const rgb = hsb2rgb(hsb);\n const color = `#${rgb2hex(rgb)}`;\n\n setRgbInput(rgb.join(', '));\n setHexInput(color);\n\n if (!isFirstRunRef.current) {\n const patternColor = getPatternColor(rgb);\n setThemeSettings({\n theme: themeRef.current,\n background: undefined,\n backgroundColor: color,\n patternColor,\n });\n }\n isFirstRunRef.current = false;\n }, [hsb, setThemeSettings]);\n\n // Redraw color picker when hue changes\n useEffect(() => {\n drawColor(colorPickerRef.current!.firstChild as HTMLCanvasElement, hue, colorCtxRef, rectsRef);\n }, [hue]);\n\n // Initially draw hue picker\n useEffect(() => {\n drawHue(huePickerRef.current!.firstChild as HTMLCanvasElement);\n }, []);\n\n const handleRgbChange = useCallback((e: ChangeEvent) => {\n const rgbValue = e.currentTarget.value.replace(/[^\\d, ]/g, '').slice(0, 13);\n\n if (rgbValue.match(/^\\d{1,3},\\s?\\d{1,3},\\s?\\d{1,3}$/)) {\n const rgb = rgbValue.split(',').map((channel) => Number(channel.trim())) as [number, number, number];\n setHsb(rgb2hsb(rgb));\n }\n\n e.currentTarget.value = rgbValue;\n }, []);\n\n const handleHexChange = useCallback((e: ChangeEvent) => {\n const hexValue = e.currentTarget.value.replace(/[^0-9a-fA-F]/g, '').slice(0, 6);\n\n if (hexValue.match(/^#?[0-9a-fA-F]{6}$/)) {\n setHsb(rgb2hsb(hex2rgb(hexValue.replace('#', ''))));\n }\n\n e.currentTarget.value = hexValue;\n }, []);\n\n const handlePredefinedColorClick = useCallback((e: React.MouseEvent) => {\n setHsb(rgb2hsb(hex2rgb(e.currentTarget.dataset.color!.replace('#', ''))));\n }, []);\n\n const className = buildClassName(\n 'SettingsGeneralBackgroundColor settings-content custom-scroll',\n isDragging && 'is-dragging',\n );\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.GeneralChatBackgroundColor);\n\n return (\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n {PREDEFINED_COLORS.map((color) => (\n \n ))}\n
\n
\n );\n};\n\nfunction getInitialHsb(backgroundColor?: string) {\n return backgroundColor && backgroundColor.startsWith('#')\n ? rgb2hsb(hex2rgb(backgroundColor.replace('#', '')))\n : DEFAULT_HSB;\n}\n\nfunction hsb2positions(hsb: [number, number, number], rects: CanvasRects) {\n return {\n colorPosition: [\n Math.round((hsb[1]) * (rects.colorRect.width - 1)),\n Math.round((1 - hsb[2]) * (rects.colorRect.height - 1)),\n ],\n huePosition: Math.round(hsb[0] * (rects.hueRect.width - 1)),\n };\n}\n\nfunction positions2hsb(\n { colorPosition, huePosition }: { colorPosition: number[]; huePosition: number },\n rects: CanvasRects,\n): [number, number, number] {\n return [\n huePosition / (rects.hueRect.width - 1),\n colorPosition[0] / (rects.colorRect.width - 1),\n 1 - colorPosition[1] / (rects.colorRect.height - 1),\n ];\n}\n\nfunction drawColor(\n canvas: HTMLCanvasElement,\n hue: number,\n colorCtxRef: MutableRefObject,\n rectsRef: RefObject,\n) {\n let w: number;\n let h: number;\n let ctx: CanvasRenderingContext2D;\n\n if (!colorCtxRef.current || !rectsRef.current) {\n // First run\n w = canvas.offsetWidth;\n h = canvas.offsetHeight;\n ctx = canvas.getContext('2d')!;\n\n canvas.width = w;\n canvas.height = h;\n\n colorCtxRef.current = ctx;\n } else {\n w = rectsRef.current.colorRect.width;\n h = rectsRef.current.colorRect.height;\n ctx = colorCtxRef.current;\n }\n\n const imgData = ctx!.createImageData(w, h);\n const pixels = imgData.data;\n const col = hsb2rgb([hue, 1, 1]);\n\n let index = 0;\n\n for (let y = 0; y < h; y++) {\n const perY = 1 - y / (h - 1);\n const st = [255 * perY, 255 * perY, 255 * perY];\n const ed = [col[0] * perY, col[1] * perY, col[2] * perY];\n for (let x = 0; x < w; x++) {\n const perX = x / (w - 1);\n pixels[index++] = st[0] + (ed[0] - st[0]) * perX;\n pixels[index++] = st[1] + (ed[1] - st[1]) * perX;\n pixels[index++] = st[2] + (ed[2] - st[2]) * perX;\n pixels[index++] = 255;\n }\n }\n\n ctx!.putImageData(imgData, 0, 0);\n}\n\nfunction drawHue(canvas: HTMLCanvasElement) {\n const w = canvas.offsetWidth;\n const h = 1;\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d')!;\n\n const imgData = ctx.createImageData(w, h);\n const pixels = imgData.data;\n\n let index = 0;\n\n for (let x = 0; x < w; x++) {\n const hue = x / (w - 1);\n const rgb = hsb2rgb([hue, 1, 1]);\n /* eslint-disable prefer-destructuring */\n pixels[index++] = rgb[0];\n pixels[index++] = rgb[1];\n pixels[index++] = rgb[2];\n /* eslint-enable prefer-destructuring */\n pixels[index++] = 255;\n }\n\n ctx.putImageData(imgData, 0, 0);\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const theme = selectTheme(global);\n const { backgroundColor } = global.settings.themes[theme] || {};\n return {\n backgroundColor,\n theme,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setThemeSettings']),\n)(SettingsGeneralBackground));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Checkbox from '../../ui/Checkbox';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n hasPrivateChatsNotifications: boolean;\n hasPrivateChatsMessagePreview: boolean;\n hasGroupNotifications: boolean;\n hasGroupMessagePreview: boolean;\n hasBroadcastNotifications: boolean;\n hasBroadcastMessagePreview: boolean;\n hasContactJoinedNotifications: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsNotifications: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n hasPrivateChatsNotifications,\n hasPrivateChatsMessagePreview,\n hasGroupNotifications,\n hasGroupMessagePreview,\n hasBroadcastNotifications,\n hasBroadcastMessagePreview,\n hasContactJoinedNotifications,\n loadNotificationSettings,\n updateContactSignUpNotification,\n updateNotificationSettings,\n}) => {\n useEffect(() => {\n loadNotificationSettings();\n }, [loadNotificationSettings]);\n\n const handleSettingsChange = useCallback((\n e: ChangeEvent,\n peerType: 'contact' | 'group' | 'broadcast',\n setting: 'silent' | 'showPreviews',\n ) => {\n const currentIsSilent = peerType === 'contact'\n ? !hasPrivateChatsNotifications\n : !(peerType === 'group' ? hasGroupNotifications : hasBroadcastNotifications);\n const currentShouldShowPreviews = peerType === 'contact'\n ? hasPrivateChatsMessagePreview\n : (peerType === 'group' ? hasGroupMessagePreview : hasBroadcastMessagePreview);\n\n updateNotificationSettings({\n peerType,\n ...(setting === 'silent' && { isSilent: !e.target.checked, shouldShowPreviews: currentShouldShowPreviews }),\n ...(setting === 'showPreviews' && { shouldShowPreviews: e.target.checked, isSilent: currentIsSilent }),\n });\n }, [\n hasBroadcastMessagePreview, hasBroadcastNotifications,\n hasGroupMessagePreview, hasGroupNotifications,\n hasPrivateChatsMessagePreview, hasPrivateChatsNotifications,\n updateNotificationSettings,\n ]);\n\n const handleContactNotificationChange = useCallback((e: ChangeEvent) => {\n updateContactSignUpNotification({\n isSilent: !e.target.checked,\n });\n }, [updateContactSignUpNotification]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Notifications);\n\n return (\n
\n
\n

\n {lang('AutodownloadPrivateChats')}\n

\n\n { handleSettingsChange(e, 'contact', 'silent'); }}\n />\n { handleSettingsChange(e, 'contact', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('FilterGroups')}

\n\n { handleSettingsChange(e, 'group', 'silent'); }}\n />\n { handleSettingsChange(e, 'group', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('FilterChannels')}

\n\n { handleSettingsChange(e, 'broadcast', 'silent'); }}\n />\n { handleSettingsChange(e, 'broadcast', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('PhoneOther')}

\n\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global): StateProps => {\n return {\n hasPrivateChatsNotifications: Boolean(global.settings.byKey.hasPrivateChatsNotifications),\n hasPrivateChatsMessagePreview: Boolean(global.settings.byKey.hasPrivateChatsMessagePreview),\n hasGroupNotifications: Boolean(global.settings.byKey.hasGroupNotifications),\n hasGroupMessagePreview: Boolean(global.settings.byKey.hasGroupMessagePreview),\n hasBroadcastNotifications: Boolean(global.settings.byKey.hasBroadcastNotifications),\n hasBroadcastMessagePreview: Boolean(global.settings.byKey.hasBroadcastMessagePreview),\n hasContactJoinedNotifications: Boolean(global.settings.byKey.hasContactJoinedNotifications),\n };\n},\n(setGlobal, actions): DispatchProps => pick(actions, [\n 'loadNotificationSettings',\n 'updateContactSignUpNotification',\n 'updateNotificationSettings',\n]))(SettingsNotifications));\n","import React, { FC, memo, useEffect } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { PrivacyVisibility, SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n hasPassword?: boolean;\n blockedCount: number;\n sessionsCount: number;\n isSensitiveEnabled?: boolean;\n canChangeSensitive?: boolean;\n visibilityPrivacyPhoneNumber?: PrivacyVisibility;\n visibilityPrivacyLastSeen?: PrivacyVisibility;\n visibilityPrivacyProfilePhoto?: PrivacyVisibility;\n visibilityPrivacyForwarding?: PrivacyVisibility;\n visibilityPrivacyGroupChats?: PrivacyVisibility;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacy: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n hasPassword,\n blockedCount,\n sessionsCount,\n isSensitiveEnabled,\n canChangeSensitive,\n visibilityPrivacyPhoneNumber,\n visibilityPrivacyLastSeen,\n visibilityPrivacyProfilePhoto,\n visibilityPrivacyForwarding,\n visibilityPrivacyGroupChats,\n loadPrivacySettings,\n loadBlockedContacts,\n loadAuthorizations,\n loadContentSettings,\n updateContentSettings,\n}) => {\n useEffect(() => {\n loadBlockedContacts();\n loadAuthorizations();\n loadPrivacySettings();\n loadContentSettings();\n }, [loadBlockedContacts, loadAuthorizations, loadPrivacySettings, loadContentSettings]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Privacy);\n\n function getVisibilityValue(visibility?: PrivacyVisibility) {\n switch (visibility) {\n case 'everybody':\n return lang('P2PEverybody');\n\n case 'contacts':\n return lang('P2PContacts');\n\n case 'nobody':\n return lang('P2PNobody');\n }\n\n return undefined;\n }\n\n return (\n
\n
\n onScreenSelect(SettingsScreens.PrivacyBlockedUsers)}\n >\n
\n {lang('BlockedUsers')}\n {blockedCount > 0 && (\n \n {lang('Users', blockedCount)}\n \n )}\n
\n \n onScreenSelect(\n hasPassword ? SettingsScreens.TwoFaEnabled : SettingsScreens.TwoFaDisabled,\n )}\n >\n
\n {lang('TwoStepVerification')}\n \n {lang(hasPassword ? 'PasswordOn' : 'PasswordOff')}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyActiveSessions)}\n >\n
\n {lang('SessionsTitle')}\n {sessionsCount > 0 && (\n \n {sessionsCount === 1 ? '1 session' : `${sessionsCount} sessions`}\n \n )}\n
\n \n
\n\n
\n

{lang('PrivacyTitle')}

\n\n onScreenSelect(SettingsScreens.PrivacyPhoneNumber)}\n >\n
\n {lang('PrivacyPhoneTitle')}\n \n {getVisibilityValue(visibilityPrivacyPhoneNumber)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyLastSeen)}\n >\n
\n {lang('LastSeenTitle')}\n \n {getVisibilityValue(visibilityPrivacyLastSeen)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyProfilePhoto)}\n >\n
\n {lang('PrivacyProfilePhotoTitle')}\n \n {getVisibilityValue(visibilityPrivacyProfilePhoto)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyForwarding)}\n >\n
\n {lang('PrivacyForwardsTitle')}\n \n {getVisibilityValue(visibilityPrivacyForwarding)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyGroupChats)}\n >\n
\n {lang('WhoCanAddMe')}\n \n {getVisibilityValue(visibilityPrivacyGroupChats)}\n \n
\n \n
\n\n {canChangeSensitive && (\n
\n

\n {lang('lng_settings_sensitive_title')}\n

\n \n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: {\n byKey: { hasPassword, isSensitiveEnabled, canChangeSensitive },\n privacy,\n },\n blocked,\n activeSessions,\n } = global;\n\n return {\n hasPassword,\n blockedCount: blocked.totalCount,\n sessionsCount: activeSessions.length,\n isSensitiveEnabled,\n canChangeSensitive,\n visibilityPrivacyPhoneNumber: privacy.phoneNumber && privacy.phoneNumber.visibility,\n visibilityPrivacyLastSeen: privacy.lastSeen && privacy.lastSeen.visibility,\n visibilityPrivacyProfilePhoto: privacy.profilePhoto && privacy.profilePhoto.visibility,\n visibilityPrivacyForwarding: privacy.forwards && privacy.forwards.visibility,\n visibilityPrivacyGroupChats: privacy.chatInvite && privacy.chatInvite.visibility,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadBlockedContacts', 'loadAuthorizations', 'loadPrivacySettings', 'loadContentSettings', 'updateContentSettings',\n ]),\n)(SettingsPrivacy));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ISettings, SettingsScreens } from '../../../types';\nimport { ApiLanguage } from '../../../api/types';\n\nimport { setLanguage } from '../../../util/langProvider';\nimport { pick } from '../../../util/iteratees';\n\nimport RadioGroup from '../../ui/RadioGroup';\nimport Loading from '../../ui/Loading';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst SettingsLanguage: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n languages,\n language,\n loadLanguages,\n setSettingOption,\n}) => {\n const [selectedLanguage, setSelectedLanguage] = useState(language);\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n // TODO Throttle\n useEffect(() => {\n loadLanguages();\n }, [loadLanguages]);\n\n const handleChange = useCallback((langCode: string) => {\n setSelectedLanguage(langCode);\n markIsLoading();\n\n setLanguage(langCode, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: langCode });\n });\n }, [markIsLoading, unmarkIsLoading, setSettingOption]);\n\n const options = useMemo(() => {\n return languages ? buildOptions(languages) : undefined;\n }, [languages]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Language);\n\n return (\n
\n {options ? (\n \n ) : (\n \n )}\n
\n );\n};\n\nfunction buildOptions(languages: ApiLanguage[]) {\n const currentLangCode = (window.navigator.language || 'en').toLowerCase();\n const shortLangCode = currentLangCode.substr(0, 2);\n\n return languages.map(({ langCode, nativeName, name }) => ({\n value: langCode,\n label: nativeName,\n subLabel: name,\n })).sort((a) => {\n return currentLangCode && (a.value === currentLangCode || a.value === shortLangCode) ? -1 : 0;\n });\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n languages: global.settings.byKey.languages,\n language: global.settings.byKey.language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadLanguages', 'setSettingOption',\n ]),\n)(SettingsLanguage));\n","import { ApiPrivacyKey, SettingsScreens } from '../../../../types';\n\nexport function getPrivacyKey(screen: SettingsScreens): ApiPrivacyKey | undefined {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n return 'phoneNumber';\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n return 'lastSeen';\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n return 'profilePhoto';\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n return 'forwards';\n case SettingsScreens.PrivacyGroupChats:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return 'chatInvite';\n }\n\n return undefined;\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\nimport { pick } from '../../../util/iteratees';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport { getPrivacyKey } from './helper/privacy';\n\ntype OwnProps = {\n screen: SettingsScreens;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Partial & {\n chatsById?: Record;\n usersById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibility: FC = ({\n screen,\n isActive,\n onScreenSelect,\n onReset,\n visibility,\n allowUserIds,\n allowChatIds,\n blockUserIds,\n blockChatIds,\n chatsById,\n setPrivacyVisibility,\n}) => {\n const lang = useLang();\n\n const visibilityOptions = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyGroupChats:\n return [\n { value: 'everybody', label: lang('P2PEverybody') },\n { value: 'contacts', label: lang('P2PContacts') },\n ];\n\n default:\n return [\n { value: 'everybody', label: lang('P2PEverybody') },\n { value: 'contacts', label: lang('P2PContacts') },\n { value: 'nobody', label: lang('P2PNobody') },\n ];\n }\n }, [lang, screen]);\n\n const exceptionLists = {\n shouldShowDenied: visibility !== 'nobody',\n shouldShowAllowed: visibility !== 'everybody',\n };\n\n const privacyKey = getPrivacyKey(screen);\n\n const headerText = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return lang('PrivacyPhoneTitle');\n case SettingsScreens.PrivacyLastSeen:\n return lang('LastSeenTitle');\n case SettingsScreens.PrivacyProfilePhoto:\n return lang('PrivacyProfilePhotoTitle');\n case SettingsScreens.PrivacyForwarding:\n return lang('PrivacyForwardsTitle');\n case SettingsScreens.PrivacyGroupChats:\n return lang('WhoCanAddMe');\n default:\n return undefined;\n }\n }, [lang, screen]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n const descriptionText = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyLastSeen:\n return lang('CustomHelp');\n default:\n return undefined;\n }\n }, [lang, screen]);\n\n const allowedContactsScreen = (() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return SettingsScreens.PrivacyPhoneNumberAllowedContacts;\n case SettingsScreens.PrivacyLastSeen:\n return SettingsScreens.PrivacyLastSeenAllowedContacts;\n case SettingsScreens.PrivacyProfilePhoto:\n return SettingsScreens.PrivacyProfilePhotoAllowedContacts;\n case SettingsScreens.PrivacyForwarding:\n return SettingsScreens.PrivacyForwardingAllowedContacts;\n default:\n return SettingsScreens.PrivacyGroupChatsAllowedContacts;\n }\n })();\n\n const deniedContactsScreen = (() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return SettingsScreens.PrivacyPhoneNumberDeniedContacts;\n case SettingsScreens.PrivacyLastSeen:\n return SettingsScreens.PrivacyLastSeenDeniedContacts;\n case SettingsScreens.PrivacyProfilePhoto:\n return SettingsScreens.PrivacyProfilePhotoDeniedContacts;\n case SettingsScreens.PrivacyForwarding:\n return SettingsScreens.PrivacyForwardingDeniedContacts;\n default:\n return SettingsScreens.PrivacyGroupChatsDeniedContacts;\n }\n })();\n\n const allowedCount = useMemo(() => {\n if (!allowUserIds || !allowChatIds || !chatsById) {\n return 0;\n }\n\n return allowChatIds.reduce((result, chatId) => {\n return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0);\n }, allowUserIds.length);\n }, [allowChatIds, allowUserIds, chatsById]);\n\n const blockCount = useMemo(() => {\n if (!blockUserIds || !blockChatIds || !chatsById) {\n return 0;\n }\n\n return blockChatIds.reduce((result, chatId) => {\n return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0);\n }, blockUserIds.length);\n }, [blockChatIds, blockUserIds, chatsById]);\n\n const handleVisibilityChange = useCallback((value) => {\n setPrivacyVisibility({\n privacyKey,\n visibility: value,\n });\n }, [privacyKey, setPrivacyVisibility]);\n\n return (\n
\n
\n

{headerText}

\n\n \n\n {descriptionText && (\n

{descriptionText}

\n )}\n
\n\n
\n

{lang('PrivacyExceptions')}

\n\n {exceptionLists.shouldShowAllowed && (\n { onScreenSelect(allowedContactsScreen); }}\n >\n
\n {allowedCount > 0 && +{allowedCount}}\n {lang('AlwaysShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n {exceptionLists.shouldShowDenied && (\n { onScreenSelect(deniedContactsScreen); }}\n >\n
\n {blockCount > 0 && −{blockCount}}\n {lang('NeverShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { screen }): StateProps => {\n let privacySettings: ApiPrivacySettings | undefined;\n\n const {\n chats: { byId: chatsById },\n settings: { privacy },\n } = global;\n\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n privacySettings = privacy.phoneNumber;\n break;\n\n case SettingsScreens.PrivacyLastSeen:\n privacySettings = privacy.lastSeen;\n break;\n\n case SettingsScreens.PrivacyProfilePhoto:\n privacySettings = privacy.profilePhoto;\n break;\n\n case SettingsScreens.PrivacyForwarding:\n privacySettings = privacy.forwards;\n break;\n\n case SettingsScreens.PrivacyGroupChats:\n privacySettings = privacy.chatInvite;\n break;\n }\n\n if (!privacySettings) {\n return {};\n }\n\n return {\n ...privacySettings,\n chatsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacyVisibility']),\n)(SettingsPrivacyVisibility));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiSession } from '../../../api/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n activeSessions: ApiSession[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyActiveSessions: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n activeSessions,\n loadAuthorizations,\n terminateAuthorization,\n terminateAllAuthorizations,\n}) => {\n const [isConfirmTerminateAllDialogOpen, openConfirmTerminateAllDialog, closeConfirmTerminateAllDialog] = useFlag();\n useEffect(() => {\n loadAuthorizations();\n }, [loadAuthorizations]);\n\n const handleTerminateSessionClick = useCallback((hash: string) => {\n terminateAuthorization({ hash });\n }, [terminateAuthorization]);\n\n const handleTerminateAllSessions = useCallback(() => {\n closeConfirmTerminateAllDialog();\n terminateAllAuthorizations();\n }, [closeConfirmTerminateAllDialog, terminateAllAuthorizations]);\n\n const currentSession = useMemo(() => {\n return activeSessions.find((session) => session.isCurrent);\n }, [activeSessions]);\n\n const otherSessions = useMemo(() => {\n return activeSessions.filter((session) => !session.isCurrent);\n }, [activeSessions]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.PrivacyActiveSessions);\n\n function renderCurrentSession(session: ApiSession) {\n return (\n
\n

\n {lang('AuthSessions.CurrentSession')}\n

\n\n \n
\n {session.appName}\n {getDeviceEnvironment(session)}\n {session.ip} - {getLocation(session)}\n
\n
\n\n \n {lang('TerminateAllSessions')}\n \n
\n );\n }\n\n function renderOtherSessions(sessions: ApiSession[]) {\n return (\n
\n

\n {lang('OtherSessions')}\n

\n\n {sessions.map(renderSession)}\n
\n );\n }\n\n function renderSession(session: ApiSession) {\n return (\n {\n handleTerminateSessionClick(session.hash);\n },\n }]}\n >\n
\n {formatPastTimeShort(lang, session.dateActive * 1000)}\n {session.appName}\n {getDeviceEnvironment(session)}\n {session.ip} - {getLocation(session)}\n
\n \n );\n }\n\n return (\n
\n {currentSession && renderCurrentSession(currentSession)}\n {otherSessions && renderOtherSessions(otherSessions)}\n {otherSessions && (\n \n )}\n
\n );\n};\n\nfunction getLocation(session: ApiSession) {\n return [session.region, session.country].filter(Boolean).join(', ');\n}\n\nfunction getDeviceEnvironment(session: ApiSession) {\n return `${session.deviceModel}${session.deviceModel ? ', ' : ''} ${session.platform} ${session.systemVersion}`;\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n activeSessions: global.activeSessions,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadAuthorizations', 'terminateAuthorization', 'terminateAllAuthorizations',\n ]),\n)(SettingsPrivacyActiveSessions));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { CHAT_HEIGHT_PX } from '../../../config';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport { pick } from '../../../util/iteratees';\nimport {\n getChatTitle, getUserFullName, isChatPrivate,\n} from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport buildClassName from '../../../util/buildClassName';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Avatar from '../../common/Avatar';\nimport Loading from '../../ui/Loading';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsByIds: Record;\n usersByIds: Record;\n blockedIds: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyBlockedUsers: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n chatsByIds,\n usersByIds,\n blockedIds,\n unblockContact,\n}) => {\n const handleUnblockClick = useCallback((contactId: number) => {\n unblockContact({ contactId });\n }, [unblockContact]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.PrivacyBlockedUsers);\n\n function renderContact(contactId: number, i: number, viewportOffset: number) {\n const isPrivate = isChatPrivate(contactId);\n const user = isPrivate ? usersByIds[contactId] : undefined;\n const chat = !isPrivate ? chatsByIds[contactId] : undefined;\n\n const className = buildClassName(\n 'Chat chat-item-clickable blocked-list-item',\n isPrivate ? 'private' : 'group',\n );\n\n return (\n {\n handleUnblockClick(contactId);\n },\n }]}\n style={`top: ${(viewportOffset + i) * CHAT_HEIGHT_PX}px;`}\n >\n \n
\n

{renderText((isPrivate ? getUserFullName(user) : getChatTitle(lang, chat!)) || '')}

\n {user && user.phoneNumber && (\n
{formatPhoneNumberWithCode(user.phoneNumber)}
\n )}\n {user && !user.phoneNumber && user.username && (\n
@{user.username}
\n )}\n
\n \n );\n }\n\n return (\n
\n
\n
\n

\n {lang('BlockedUsersInfo')}\n

\n
\n\n
\n {blockedIds && blockedIds.length ? (\n
\n {blockedIds!.map((contactId, i) => renderContact(contactId, i, 0))}\n
\n ) : blockedIds && !blockedIds.length ? (\n
\n List is empty\n
\n ) : (\n \n )}\n
\n
\n\n {\n }}\n className=\"not-implemented\"\n ariaLabel=\"Add a blocked user\"\n >\n \n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsByIds,\n },\n users: {\n byId: usersByIds,\n },\n blocked: {\n ids,\n },\n } = global;\n\n return {\n chatsByIds,\n usersByIds,\n blockedIds: ids,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['unblockContact']),\n)(SettingsPrivacyBlockedUsers));\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaEnabled: FC = ({\n isActive, onReset, animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaEnabled);\n\n return (\n
\n
\n \n\n

\n {renderText(lang('EnabledPasswordText'), ['br'])}\n

\n
\n\n
\n onScreenSelect(SettingsScreens.TwoFaChangePasswordCurrent)}\n >\n {lang('ChangePassword')}\n \n onScreenSelect(SettingsScreens.TwoFaTurnOff)}\n >\n {lang('TurnPasswordOff')}\n \n onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCurrentPassword)}\n >\n {lang('SetRecoveryEmail')}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🔐'),\n };\n})(SettingsTwoFaEnabled));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../../../lib/teact/teact';\n\nimport { SettingsScreens } from '../../../../types';\n\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport PasswordMonkey from '../../../common/PasswordMonkey';\nimport PasswordForm from '../../../common/PasswordForm';\n\ntype OwnProps = {\n screen: SettingsScreens;\n error?: string;\n isLoading?: boolean;\n expectedPassword?: string;\n placeholder?: string;\n hint?: string;\n submitLabel?: string;\n clearError?: NoneToVoidFunction;\n onSubmit: (password: string) => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst EQUAL_PASSWORD_ERROR = 'Passwords Should Be Equal';\n\nconst SettingsTwoFaPassword: FC = ({\n screen,\n isActive,\n onScreenSelect,\n onReset,\n error,\n isLoading,\n expectedPassword,\n placeholder = 'Current Password',\n hint,\n submitLabel,\n clearError,\n onSubmit,\n}) => {\n const [validationError, setValidationError] = useState('');\n const [shouldShowPassword, setShouldShowPassword] = useState(false);\n\n const handleSubmit = useCallback((newPassword) => {\n if (expectedPassword && newPassword !== expectedPassword) {\n setValidationError(EQUAL_PASSWORD_ERROR);\n } else {\n onSubmit(newPassword);\n }\n }, [onSubmit, expectedPassword]);\n\n const handleClearError = useCallback(() => {\n if (clearError) {\n clearError();\n }\n setValidationError('');\n }, [clearError]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n return (\n
\n
\n \n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(SettingsTwoFaPassword);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onStart: NoneToVoidFunction;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaStart: FC = ({\n isActive, onScreenSelect, onReset, animatedEmoji, onStart,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaDisabled);\n\n return (\n
\n
\n \n\n

\n {lang('SetAdditionalPasswordInfo')}\n

\n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🔐'),\n };\n})(SettingsTwoFaStart));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useFlag from '../../../../hooks/useFlag';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport Button from '../../../ui/Button';\nimport Modal from '../../../ui/Modal';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport InputText from '../../../ui/InputText';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n icon: 'hint' | 'email';\n type?: 'text' | 'email';\n isLoading?: boolean;\n error?: string;\n placeholder: string;\n shouldConfirm?: boolean;\n clearError?: NoneToVoidFunction;\n onSubmit: (value?: string) => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n screen: SettingsScreens;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst SettingsTwoFaSkippableForm: FC = ({\n animatedEmoji,\n type = 'text',\n isLoading,\n error,\n placeholder,\n shouldConfirm,\n clearError,\n onSubmit,\n isActive,\n onScreenSelect,\n onReset,\n screen,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [value, setValue] = useState('');\n const [isConfirmShown, markIsConfirmShown, unmarkIsConfirmShown] = useFlag(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n const handleInputChange = (e: React.ChangeEvent) => {\n if (error && clearError) {\n clearError();\n }\n\n setValue(e.target.value);\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!inputRef.current) {\n return;\n }\n\n onSubmit(value);\n };\n\n const handleSkip = () => {\n onSubmit();\n };\n\n const handleSkipConfirm = () => {\n unmarkIsConfirmShown();\n onSubmit();\n };\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n return (\n
\n
\n \n
\n\n
\n
\n \n\n {value ? (\n \n ) : (\n \n {lang('YourEmailSkip')}\n \n )}\n \n {shouldConfirm && (\n \n {renderText(lang('YourEmailSkipWarningText'), ['br', 'simple_markdown'])}\n
\n \n {lang('YourEmailSkip')}\n \n \n {lang('Cancel')}\n \n
\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal((global, { icon }) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, icon === 'email' ? '💌' : '💡'),\n };\n})(SettingsTwoFaSkippableForm));\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaCongratulations: FC = ({\n isActive, onReset, animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n const handleClick = () => {\n onScreenSelect(SettingsScreens.Privacy);\n };\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaCongratulations);\n\n return (\n
\n
\n \n\n

\n {lang('TwoStepVerificationPasswordSetInfo')}\n

\n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🥳'),\n };\n})(SettingsTwoFaCongratulations));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport InputText from '../../../ui/InputText';\nimport Loading from '../../../ui/Loading';\n\ntype OwnProps = {\n isLoading?: boolean;\n error?: string;\n clearError: NoneToVoidFunction;\n onSubmit: (hint: string) => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n screen: SettingsScreens;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n codeLength: number;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst SettingsTwoFaEmailCode: FC = ({\n animatedEmoji,\n codeLength,\n isLoading,\n error,\n clearError,\n onSubmit,\n isActive,\n onScreenSelect,\n onReset,\n screen,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [value, setValue] = useState('');\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n const handleInputChange = (e: React.ChangeEvent) => {\n if (error && clearError) {\n clearError();\n }\n\n const newValue = e.target.value.slice(0, codeLength);\n\n if (newValue.length === codeLength) {\n onSubmit(newValue);\n }\n\n setValue(newValue);\n e.target.value = newValue;\n };\n\n return (\n
\n
\n \n
\n\n
\n \n {isLoading && }\n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '💌'),\n codeLength: global.twoFaSettings.waitingEmailCodeLength,\n };\n})(SettingsTwoFaEmailCode));\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../../../global/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { pick } from '../../../../util/iteratees';\nimport { TwoFaDispatch, TwoFaState } from '../../../../hooks/reducers/useTwoFaReducer';\nimport useLang from '../../../../hooks/useLang';\n\nimport SettingsTwoFaEnabled from './SettingsTwoFaEnabled';\nimport SettingsTwoFaPassword from './SettingsTwoFaPassword';\nimport SettingsTwoFaStart from './SettingsTwoFaStart';\nimport SettingsTwoFaSkippableForm from './SettingsTwoFaSkippableForm';\nimport SettingsTwoFaCongratulations from './SettingsTwoFaCongratulations';\nimport SettingsTwoFaEmailCode from './SettingsTwoFaEmailCode';\n\nexport type OwnProps = {\n state: TwoFaState;\n currentScreen: SettingsScreens;\n shownScreen: SettingsScreens;\n dispatch: TwoFaDispatch;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = GlobalState['twoFaSettings'];\n\ntype DispatchProps = Pick;\n\nconst SettingsTwoFa: FC = ({\n currentScreen,\n shownScreen,\n state,\n hint,\n isLoading,\n error,\n waitingEmailCodeLength,\n dispatch,\n isActive,\n onScreenSelect,\n onReset,\n updatePassword,\n checkPassword,\n clearTwoFaError,\n updateRecoveryEmail,\n provideTwoFaEmailCode,\n clearPassword,\n}) => {\n useEffect(() => {\n if (waitingEmailCodeLength) {\n if (currentScreen === SettingsScreens.TwoFaNewPasswordEmail) {\n onScreenSelect(SettingsScreens.TwoFaNewPasswordEmailCode);\n } else if (currentScreen === SettingsScreens.TwoFaRecoveryEmail) {\n onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCode);\n }\n }\n }, [currentScreen, onScreenSelect, waitingEmailCodeLength]);\n\n const handleStartWizard = useCallback(() => {\n dispatch({ type: 'reset' });\n onScreenSelect(SettingsScreens.TwoFaNewPassword);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPassword = useCallback((value: string) => {\n dispatch({ type: 'setPassword', payload: value });\n onScreenSelect(SettingsScreens.TwoFaNewPasswordConfirm);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPasswordConfirm = useCallback(() => {\n onScreenSelect(SettingsScreens.TwoFaNewPasswordHint);\n }, [onScreenSelect]);\n\n const handleNewPasswordHint = useCallback((value?: string) => {\n dispatch({ type: 'setHint', payload: value });\n onScreenSelect(SettingsScreens.TwoFaNewPasswordEmail);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPasswordEmail = useCallback((value?: string) => {\n dispatch({ type: 'setEmail', payload: value });\n updatePassword({\n ...state,\n email: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updatePassword]);\n\n const handleChangePasswordCurrent = useCallback((value: string) => {\n dispatch({ type: 'setCurrentPassword', payload: value });\n checkPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaChangePasswordNew);\n },\n });\n }, [checkPassword, dispatch, onScreenSelect]);\n\n const handleChangePasswordNew = useCallback((value: string) => {\n dispatch({ type: 'setPassword', payload: value });\n onScreenSelect(SettingsScreens.TwoFaChangePasswordConfirm);\n }, [dispatch, onScreenSelect]);\n\n const handleChangePasswordConfirm = useCallback(() => {\n onScreenSelect(SettingsScreens.TwoFaChangePasswordHint);\n }, [onScreenSelect]);\n\n const handleChangePasswordHint = useCallback((value?: string) => {\n dispatch({ type: 'setHint', payload: value });\n updatePassword({\n ...state,\n hint: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updatePassword]);\n\n const handleTurnOff = useCallback((value: string) => {\n clearPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.Privacy);\n },\n });\n }, [clearPassword, onScreenSelect]);\n\n const handleRecoveryEmailCurrentPassword = useCallback((value: string) => {\n dispatch({ type: 'setCurrentPassword', payload: value });\n checkPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaRecoveryEmail);\n },\n });\n }, [checkPassword, dispatch, onScreenSelect]);\n\n const handleRecoveryEmail = useCallback((value?: string) => {\n dispatch({ type: 'setEmail', payload: value });\n updateRecoveryEmail({\n ...state,\n email: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updateRecoveryEmail]);\n\n const handleEmailCode = useCallback((code: string) => {\n provideTwoFaEmailCode({ code });\n }, [provideTwoFaEmailCode]);\n\n const lang = useLang();\n\n switch (currentScreen) {\n case SettingsScreens.TwoFaDisabled:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPassword:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordHint:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordEmail:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n return (\n \n );\n\n case SettingsScreens.TwoFaCongratulations:\n return (\n \n );\n\n case SettingsScreens.TwoFaEnabled:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordCurrent:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordNew:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordHint:\n return (\n \n );\n\n case SettingsScreens.TwoFaTurnOff:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmail:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return (\n \n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => ({ ...global.twoFaSettings }),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updatePassword', 'updateRecoveryEmail', 'clearPassword', 'provideTwoFaEmailCode',\n 'checkPassword', 'clearTwoFaError',\n ]),\n)(SettingsTwoFa));\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\nimport { pick } from '../../../util/iteratees';\nimport searchWords from '../../../util/searchWords';\nimport { getPrivacyKey } from './helper/privacy';\nimport {\n getChatTitle, isChatGroup, isChatPrivate, prepareChatList,\n} from '../../../modules/helpers';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\n\nexport type OwnProps = {\n isAllowList?: boolean;\n screen: SettingsScreens;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n settings?: ApiPrivacySettings;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibilityExceptionList: FC = ({\n currentUserId,\n isAllowList,\n screen,\n settings,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n setPrivacySettings,\n isActive,\n onScreenSelect,\n onReset,\n}) => {\n const lang = useLang();\n\n const selectedContactIds = useMemo(() => {\n if (!settings) {\n return [];\n }\n\n if (isAllowList) {\n return [...settings.allowUserIds, ...settings.allowChatIds];\n } else {\n return [...settings.blockUserIds, ...settings.blockChatIds];\n }\n }, [isAllowList, settings]);\n const [searchQuery, setSearchQuery] = useState('');\n const [isSubmitShown, setIsSubmitShown] = useState(false);\n const [newSelectedContactIds, setNewSelectedContactIds] = useState(selectedContactIds);\n\n const chats = useMemo(() => {\n const activeChatArrays = listIds\n ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all')\n : undefined;\n const archivedChatArrays = archivedListIds\n ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived')\n : undefined;\n\n if (!activeChatArrays && !archivedChatArrays) {\n return undefined;\n }\n\n return [\n ...(activeChatArrays\n ? [\n ...activeChatArrays.pinnedChats,\n ...activeChatArrays.otherChats,\n ]\n : []\n ),\n ...(archivedChatArrays ? archivedChatArrays.otherChats : []),\n ];\n }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]);\n\n const displayedIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (\n ((isChatPrivate(chat.id) && chat.id !== currentUserId) || isChatGroup(chat))\n && (\n !searchQuery\n || searchWords(getChatTitle(lang, chat), searchQuery)\n || selectedContactIds.includes(chat.id)\n )\n ))\n .map(({ id }) => id);\n }, [chats, currentUserId, lang, searchQuery, selectedContactIds]);\n\n const handleSelectedContactIdsChange = useCallback((value: number[]) => {\n setNewSelectedContactIds(value);\n setIsSubmitShown(true);\n }, []);\n\n const handleSubmit = useCallback(() => {\n setPrivacySettings({\n privacyKey: getPrivacyKey(screen),\n isAllowList: Boolean(isAllowList),\n contactsIds: newSelectedContactIds,\n });\n\n onScreenSelect(SettingsScreens.Privacy);\n }, [isAllowList, newSelectedContactIds, onScreenSelect, screen, setPrivacySettings]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n\n return (\n
\n \n\n \n \n \n
\n );\n};\n\nfunction getCurrentPrivacySettings(global: GlobalState, screen: SettingsScreens) {\n const { privacy } = global.settings;\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n return privacy.phoneNumber;\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n return privacy.lastSeen;\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n return privacy.profilePhoto;\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n return privacy.forwards;\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return privacy.chatInvite;\n }\n\n return undefined;\n}\n\nexport default memo(withGlobal(\n (global, { screen }): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n currentUserId,\n } = global;\n\n return {\n currentUserId,\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n archivedPinnedIds: orderedPinnedIds.archived,\n archivedListIds: listIds.archived,\n settings: getCurrentPrivacySettings(global, screen),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacySettings']),\n)(SettingsPrivacyVisibilityExceptionList));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { SettingsScreens } from '../../../types';\nimport { FolderEditDispatch, FoldersState } from '../../../hooks/reducers/useFoldersReducer';\n\nimport { LAYERS_ANIMATION_NAME } from '../../../util/environment';\nimport useTwoFaReducer from '../../../hooks/reducers/useTwoFaReducer';\n\nimport Transition from '../../ui/Transition';\nimport SettingsHeader from './SettingsHeader';\nimport SettingsMain from './SettingsMain';\nimport SettingsEditProfile from './SettingsEditProfile';\nimport SettingsFolders from './folders/SettingsFolders';\nimport SettingsGeneral from './SettingsGeneral';\nimport SettingsGeneralBackground from './SettingsGeneralBackground';\nimport SettingsGeneralBackgroundColor from './SettingsGeneralBackgroundColor';\nimport SettingsNotifications from './SettingsNotifications';\nimport SettingsPrivacy from './SettingsPrivacy';\nimport SettingsLanguage from './SettingsLanguage';\nimport SettingsPrivacyVisibility from './SettingsPrivacyVisibility';\nimport SettingsPrivacyActiveSessions from './SettingsPrivacyActiveSessions';\nimport SettingsPrivacyBlockedUsers from './SettingsPrivacyBlockedUsers';\nimport SettingsTwoFa from './twoFa/SettingsTwoFa';\nimport SettingsPrivacyVisibilityExceptionList from './SettingsPrivacyVisibilityExceptionList';\n\nimport './Settings.scss';\n\nconst TRANSITION_RENDER_COUNT = Object.keys(SettingsScreens).length / 2;\nconst TRANSITION_DURATION = 200;\n\nconst TWO_FA_SCREENS = [\n SettingsScreens.TwoFaDisabled,\n SettingsScreens.TwoFaNewPassword,\n SettingsScreens.TwoFaNewPasswordConfirm,\n SettingsScreens.TwoFaNewPasswordHint,\n SettingsScreens.TwoFaNewPasswordEmail,\n SettingsScreens.TwoFaNewPasswordEmailCode,\n SettingsScreens.TwoFaCongratulations,\n SettingsScreens.TwoFaEnabled,\n SettingsScreens.TwoFaChangePasswordCurrent,\n SettingsScreens.TwoFaChangePasswordNew,\n SettingsScreens.TwoFaChangePasswordConfirm,\n SettingsScreens.TwoFaChangePasswordHint,\n SettingsScreens.TwoFaTurnOff,\n SettingsScreens.TwoFaRecoveryEmailCurrentPassword,\n SettingsScreens.TwoFaRecoveryEmail,\n SettingsScreens.TwoFaRecoveryEmailCode,\n];\n\nconst FOLDERS_SCREENS = [\n SettingsScreens.Folders,\n SettingsScreens.FoldersCreateFolder,\n SettingsScreens.FoldersEditFolder,\n SettingsScreens.FoldersEditFolderFromChatList,\n SettingsScreens.FoldersIncludedChats,\n SettingsScreens.FoldersIncludedChatsFromChatList,\n SettingsScreens.FoldersExcludedChats,\n SettingsScreens.FoldersExcludedChatsFromChatList,\n];\n\nconst PRIVACY_SCREENS = [\n SettingsScreens.PrivacyBlockedUsers,\n SettingsScreens.PrivacyActiveSessions,\n];\n\nconst PRIVACY_PHONE_NUMBER_SCREENS = [\n SettingsScreens.PrivacyPhoneNumberAllowedContacts,\n SettingsScreens.PrivacyPhoneNumberDeniedContacts,\n];\n\nconst PRIVACY_LAST_SEEN_PHONE_SCREENS = [\n SettingsScreens.PrivacyLastSeenAllowedContacts,\n SettingsScreens.PrivacyLastSeenDeniedContacts,\n];\n\nconst PRIVACY_PROFILE_PHOTO_SCREENS = [\n SettingsScreens.PrivacyProfilePhotoAllowedContacts,\n SettingsScreens.PrivacyProfilePhotoDeniedContacts,\n];\n\nconst PRIVACY_FORWARDING_SCREENS = [\n SettingsScreens.PrivacyForwardingAllowedContacts,\n SettingsScreens.PrivacyForwardingDeniedContacts,\n];\n\nconst PRIVACY_GROUP_CHATS_SCREENS = [\n SettingsScreens.PrivacyGroupChatsAllowedContacts,\n SettingsScreens.PrivacyGroupChatsDeniedContacts,\n];\n\nexport type OwnProps = {\n isActive: boolean;\n currentScreen: SettingsScreens;\n foldersState: FoldersState;\n foldersDispatch: FolderEditDispatch;\n onScreenSelect: (screen: SettingsScreens) => void;\n shouldSkipTransition?: boolean;\n onReset: () => void;\n};\n\nconst Settings: FC = ({\n isActive,\n currentScreen,\n foldersState,\n foldersDispatch,\n onScreenSelect,\n onReset,\n shouldSkipTransition,\n}) => {\n const [twoFaState, twoFaDispatch] = useTwoFaReducer();\n\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n || currentScreen === SettingsScreens.FoldersEditFolderFromChatList\n ) {\n setTimeout(() => {\n foldersDispatch({ type: 'reset' });\n }, TRANSITION_DURATION);\n }\n\n if (\n currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersExcludedChats\n ) {\n if (foldersState.mode === 'create') {\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n } else {\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }\n return;\n }\n\n onReset();\n }, [\n foldersState.mode, foldersDispatch,\n currentScreen, onReset, onScreenSelect,\n ]);\n\n const handleSaveFilter = useCallback(() => {\n foldersDispatch({ type: 'saveFilters' });\n handleReset();\n }, [foldersDispatch, handleReset]);\n\n function renderCurrentSectionContent(isScreenActive: boolean, screen: SettingsScreens) {\n const privacyAllowScreens: Record = {\n [SettingsScreens.PrivacyPhoneNumber]: PRIVACY_PHONE_NUMBER_SCREENS.includes(screen),\n [SettingsScreens.PrivacyLastSeen]: PRIVACY_LAST_SEEN_PHONE_SCREENS.includes(screen),\n [SettingsScreens.PrivacyProfilePhoto]: PRIVACY_PROFILE_PHOTO_SCREENS.includes(screen),\n [SettingsScreens.PrivacyForwarding]: PRIVACY_FORWARDING_SCREENS.includes(screen),\n [SettingsScreens.PrivacyGroupChats]: PRIVACY_GROUP_CHATS_SCREENS.includes(screen),\n };\n\n const isTwoFaScreen = TWO_FA_SCREENS.includes(screen);\n const isFoldersScreen = FOLDERS_SCREENS.includes(screen);\n const isPrivacyScreen = PRIVACY_SCREENS.includes(screen)\n || isTwoFaScreen\n || Object.keys(privacyAllowScreens).includes(screen.toString())\n || Object.values(privacyAllowScreens).find((key) => key === true);\n\n switch (currentScreen) {\n case SettingsScreens.Main:\n return (\n \n );\n case SettingsScreens.EditProfile:\n return (\n \n );\n case SettingsScreens.General:\n return (\n \n );\n case SettingsScreens.Notifications:\n return (\n \n );\n case SettingsScreens.Privacy:\n return (\n \n );\n case SettingsScreens.Language:\n return (\n \n );\n case SettingsScreens.GeneralChatBackground:\n return (\n \n );\n case SettingsScreens.GeneralChatBackgroundColor:\n return (\n \n );\n case SettingsScreens.PrivacyActiveSessions:\n return (\n \n );\n case SettingsScreens.PrivacyBlockedUsers:\n return (\n \n );\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyGroupChats:\n return (\n \n );\n\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return (\n \n );\n\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return (\n \n );\n\n case SettingsScreens.Folders:\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n case SettingsScreens.FoldersEditFolderFromChatList:\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersIncludedChatsFromChatList:\n case SettingsScreens.FoldersExcludedChats:\n case SettingsScreens.FoldersExcludedChatsFromChatList:\n return (\n \n );\n\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaNewPassword:\n case SettingsScreens.TwoFaNewPasswordConfirm:\n case SettingsScreens.TwoFaNewPasswordHint:\n case SettingsScreens.TwoFaNewPasswordEmail:\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n case SettingsScreens.TwoFaCongratulations:\n case SettingsScreens.TwoFaEnabled:\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaChangePasswordNew:\n case SettingsScreens.TwoFaChangePasswordConfirm:\n case SettingsScreens.TwoFaChangePasswordHint:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n case SettingsScreens.TwoFaRecoveryEmail:\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return (\n \n );\n\n default:\n return undefined;\n }\n }\n\n function renderCurrentSection(isScreenActive: boolean, isFrom: boolean, currentKey: SettingsScreens) {\n return (\n <>\n \n {renderCurrentSectionContent(isScreenActive, currentKey)}\n \n );\n }\n\n return (\n \n {renderCurrentSection}\n \n );\n};\n\nexport default memo(Settings);\n","import React, {\n FC, useEffect, useCallback, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { pick } from '../../../util/iteratees';\nimport { getUserFullName, sortUserIds } from '../../../modules/helpers';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport ListItem from '../../ui/ListItem';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n filter: string;\n isActive: boolean;\n onReset: () => void;\n};\n\ntype StateProps = {\n usersById: Record;\n contactIds?: number[];\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst ContactList: FC = ({\n isActive, onReset,\n filter, usersById, contactIds, loadContactList, openChat, serverTimeOffset,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n useHistoryBack(isActive, onReset);\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id, shouldReplaceHistory: true });\n },\n [openChat],\n );\n\n const listIds = useMemo(() => {\n if (!contactIds) {\n return undefined;\n }\n\n const resultIds = filter ? contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, filter);\n }) : contactIds;\n\n return sortUserIds(resultIds, usersById, undefined, serverTimeOffset);\n }, [contactIds, filter, usersById, serverTimeOffset]);\n\n const [viewportIds, getMore] = useInfiniteScroll(undefined, listIds, Boolean(filter));\n\n return (\n \n {viewportIds && viewportIds.length ? (\n viewportIds.map((id) => (\n handleClick(id)}\n ripple={!IS_SINGLE_COLUMN_LAYOUT}\n >\n \n \n ))\n ) : viewportIds && !viewportIds.length ? (\n

\n {filter.length ? 'No contacts matched your search.' : 'Contact list is empty.'}\n

\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: contactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n\n return {\n usersById,\n contactIds,\n serverTimeOffset: global.serverTimeOffset,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'openChat']),\n)(ContactList));\n","import React, {\n FC, useCallback, useEffect, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport { pick, unique } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { getUserFullName, isUserBot, sortChatIds } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Button from '../../ui/Button';\n\nexport type OwnProps = {\n isChannel?: boolean;\n isActive: boolean;\n selectedMemberIds: number[];\n onSelectedMemberIdsChange: (ids: number[]) => void;\n onNextStep: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n usersById: Record;\n chatsById: Record;\n localContactIds?: number[];\n searchQuery?: string;\n isSearching?: boolean;\n localUserIds?: number[];\n globalUserIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst NewChatStep1: FC = ({\n isChannel,\n isActive,\n selectedMemberIds,\n onSelectedMemberIdsChange,\n onNextStep,\n onReset,\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching,\n localUserIds,\n globalUserIds,\n loadContactList,\n setGlobalSearchQuery,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset);\n\n const handleFilterChange = useCallback((query: string) => {\n setGlobalSearchQuery({ query });\n }, [setGlobalSearchQuery]);\n\n const displayedIds = useMemo(() => {\n const contactIds = localContactIds\n ? sortChatIds(localContactIds.filter((id) => id !== currentUserId), chatsById)\n : [];\n\n if (!searchQuery) {\n return contactIds;\n }\n\n const foundContactIds = contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, searchQuery);\n });\n\n return sortChatIds(\n unique([\n ...foundContactIds,\n ...(localUserIds || []),\n ...(globalUserIds || []),\n ]).filter((contactId) => {\n const user = usersById[contactId];\n\n return !user || !isUserBot(user) || user.canBeInvitedToGroup;\n }),\n chatsById,\n false,\n selectedMemberIds,\n );\n }, [\n localContactIds, chatsById, searchQuery, localUserIds, globalUserIds, selectedMemberIds,\n currentUserId, usersById,\n ]);\n\n const handleNextStep = useCallback(() => {\n if (selectedMemberIds.length || isChannel) {\n setGlobalSearchQuery({ query: '' });\n onNextStep();\n }\n }, [selectedMemberIds.length, isChannel, setGlobalSearchQuery, onNextStep]);\n\n return (\n
\n
\n \n \n \n

{lang('GroupAddMembers')}

\n
\n
\n \n\n \n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: localContactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n const { currentUserId } = global;\n\n const {\n query: searchQuery,\n fetchingStatus,\n globalResults,\n localResults,\n } = global.globalSearch;\n const { userIds: globalUserIds } = globalResults || {};\n const { userIds: localUserIds } = localResults || {};\n\n return {\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching: fetchingStatus && fetchingStatus.chats,\n globalUserIds,\n localUserIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'setGlobalSearchQuery']),\n)(NewChatStep1));\n","import React, {\n FC, useState, useCallback, useEffect, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ChatCreationProgress } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport InputText from '../../ui/InputText';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport Button from '../../ui/Button';\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nexport type OwnProps = {\n isChannel?: boolean;\n isActive: boolean;\n memberIds: number[];\n onReset: (forceReturnToChatList?: boolean) => void;\n};\n\ntype StateProps = {\n creationProgress?: ChatCreationProgress;\n creationError?: string;\n};\n\ntype DispatchProps = Pick;\n\n// TODO @implement\nconst MAX_USERS_FOR_LEGACY_CHAT = 199; // Accounting for current user\n\nconst NewChatStep2: FC = ({\n isChannel,\n isActive,\n memberIds,\n onReset,\n creationProgress,\n creationError,\n createGroupChat,\n createChannel,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset);\n\n const [title, setTitle] = useState('');\n const [about, setAbout] = useState('');\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n\n const chatTitleEmptyError = 'Chat title can\\'t be empty';\n const channelTitleEmptyError = 'Channel title can\\'t be empty';\n const chatTooManyUsersError = 'Sorry, creating supergroups is not yet supported';\n\n const isLoading = creationProgress === ChatCreationProgress.InProgress;\n\n const handleTitleChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n const newValue = value.replace(/^\\s+/, '');\n\n setTitle(newValue);\n\n if (newValue !== value) {\n e.currentTarget.value = newValue;\n }\n }, []);\n\n const handleDescriptionChange = useCallback((e: React.ChangeEvent) => {\n setAbout(e.currentTarget.value);\n }, []);\n\n const handleCreateGroup = useCallback(() => {\n if (!title.length) {\n setError(chatTitleEmptyError);\n return;\n }\n\n if (memberIds.length > MAX_USERS_FOR_LEGACY_CHAT) {\n setError(chatTooManyUsersError);\n return;\n }\n\n createGroupChat({\n title,\n photo,\n memberIds,\n });\n }, [title, memberIds, createGroupChat, photo, chatTitleEmptyError, chatTooManyUsersError]);\n\n const handleCreateChannel = useCallback(() => {\n if (!title.length) {\n setError(channelTitleEmptyError);\n return;\n }\n\n createChannel({\n title,\n about,\n photo,\n memberIds,\n });\n }, [title, createChannel, about, photo, memberIds, channelTitleEmptyError]);\n\n useEffect(() => {\n if (creationProgress === ChatCreationProgress.Complete) {\n onReset(true);\n }\n }, [creationProgress, onReset]);\n\n const renderedError = creationError || (\n error !== chatTitleEmptyError && error !== channelTitleEmptyError\n ? error\n : undefined\n );\n\n return (\n
\n
\n onReset()}\n ariaLabel=\"Return to member selection\"\n >\n \n \n

{lang(isChannel ? 'NewChannel' : 'NewGroup')}

\n
\n
\n \n \n {isChannel && (\n <>\n \n

{lang('DescriptionInfo')}

\n \n )}\n\n {renderedError && (\n

{renderedError}

\n )}\n\n {memberIds.length > 0 && (\n <>\n

{lang('GroupInfo.ParticipantCount', memberIds.length, 'i')}

\n\n
\n {memberIds.map((id) => (\n \n \n \n ))}\n
\n \n )}\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n progress: creationProgress,\n error: creationError,\n } = global.chatCreation || {};\n\n return {\n creationProgress,\n creationError,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'createGroupChat', 'createChannel',\n ]),\n)(NewChatStep2));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../../lib/teact/teact';\n\nimport { LeftColumnContent } from '../../../types';\n\nimport { LAYERS_ANIMATION_NAME } from '../../../util/environment';\n\nimport Transition from '../../ui/Transition';\nimport NewChatStep1 from './NewChatStep1';\nimport NewChatStep2 from './NewChatStep2';\n\nimport './NewChat.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n isChannel?: boolean;\n content: LeftColumnContent;\n onContentChange: (content: LeftColumnContent) => void;\n onReset: () => void;\n};\n\nconst RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\n\nconst NewChat: FC = ({\n isActive,\n isChannel = false,\n content,\n onContentChange,\n onReset,\n}) => {\n const [newChatMemberIds, setNewChatMemberIds] = useState([]);\n\n const handleNextStep = useCallback(() => {\n onContentChange(isChannel ? LeftColumnContent.NewChannelStep2 : LeftColumnContent.NewGroupStep2);\n }, [isChannel, onContentChange]);\n\n return (\n \n {(isStepActive) => {\n switch (content) {\n case LeftColumnContent.NewChannelStep1:\n case LeftColumnContent.NewGroupStep1:\n return (\n \n );\n case LeftColumnContent.NewChannelStep2:\n case LeftColumnContent.NewGroupStep2:\n return (\n \n );\n default:\n return undefined;\n }\n }}\n \n );\n};\n\nexport default memo(NewChat);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Button from '../ui/Button';\nimport ChatList from './main/ChatList';\nimport { LeftColumnContent } from '../../types';\n\nimport './ArchivedChats.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n onReset: () => void;\n onContentChange: (content: LeftColumnContent) => void;\n};\n\nconst ArchivedChats: FC = ({ isActive, onReset, onContentChange }) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onContentChange, LeftColumnContent.Archived);\n\n return (\n
\n
\n \n \n \n

{lang('ArchivedChats')}

\n
\n \n
\n );\n};\n\nexport default memo(ArchivedChats);\n","const IGNORED_KEYS: Record = {\n Down: true,\n ArrowDown: true,\n Up: true,\n ArrowUp: true,\n Left: true,\n ArrowLeft: true,\n Right: true,\n ArrowRight: true,\n ' ': true,\n PageUp: true,\n PageDown: true,\n End: true,\n Home: true,\n Tab: true,\n};\n\nfunction isTextBox(target: EventTarget | null) {\n if (!target || !(target instanceof HTMLElement)) return false;\n const element = target;\n const tagName = element.tagName.toLowerCase();\n if (tagName === 'textarea') return true;\n if (tagName !== 'input') return false;\n const type = element.getAttribute('type');\n if (!type) return false;\n const inputTypes = [\n 'text', 'password', 'number', 'email', 'tel', 'url',\n 'search', 'date', 'datetime', 'datetime-local', 'time', 'month', 'week',\n ];\n return inputTypes.indexOf(type.toLowerCase()) > -1;\n}\n\nconst preventDefault = (e: Event) => {\n e.preventDefault();\n};\n\nfunction preventDefaultForScrollKeys(e: KeyboardEvent) {\n if (IGNORED_KEYS[e.key] && !isTextBox(e.target)) {\n preventDefault(e);\n }\n}\n\nexport function disableScrolling() {\n // Disable scrolling in Chrome\n document.addEventListener('wheel', preventDefault, { passive: false });\n window.ontouchmove = preventDefault; // mobile\n document.onkeydown = preventDefaultForScrollKeys;\n}\n\nexport function enableScrolling() {\n document.removeEventListener('wheel', preventDefault); // Enable scrolling in Chrome\n // eslint-disable-next-line no-null/no-null\n window.ontouchmove = null;\n // eslint-disable-next-line no-null/no-null\n document.onkeydown = null;\n}\n","import { ApiMediaFormat, ApiMessage } from '../../../../api/types';\n\nimport * as mediaLoader from '../../../../util/mediaLoader';\nimport {\n getMessageMediaHash,\n getMessagePhoto,\n getMessageText,\n getMessageWebPagePhoto,\n getMessageWebPageVideo,\n hasMessageLocalBlobUrl,\n} from '../../../../modules/helpers';\nimport { CLIPBOARD_ITEM_SUPPORTED, copyImageToClipboard, copyTextToClipboard } from '../../../../util/clipboard';\n\ntype ICopyOptions = {\n label: string;\n handler: () => void;\n}[];\n\nexport function getMessageCopyOptions(\n message: ApiMessage, afterEffect?: () => void, onCopyLink?: () => void,\n): ICopyOptions {\n const options: ICopyOptions = [];\n const text = getMessageText(message);\n const photo = getMessagePhoto(message)\n || (!getMessageWebPageVideo(message) ? getMessageWebPagePhoto(message) : undefined);\n const mediaHash = getMessageMediaHash(message, 'inline');\n const canImageBeCopied = photo && (mediaHash || hasMessageLocalBlobUrl(message)) && CLIPBOARD_ITEM_SUPPORTED;\n const selection = window.getSelection();\n\n if (canImageBeCopied) {\n options.push({\n label: 'lng_context_copy_image',\n handler: () => {\n Promise.resolve(mediaHash ? mediaLoader.fetch(mediaHash, ApiMediaFormat.BlobUrl) : photo!.blobUrl)\n .then(copyImageToClipboard);\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n if (text) {\n // Detect if the user has selection in the current message\n const hasSelection = Boolean((\n selection\n && selection.anchorNode\n && selection.anchorNode.parentNode\n && (selection.anchorNode.parentNode as HTMLElement).closest('.Message .content-inner')\n && selection.toString().replace(/(?:\\r\\n|\\r|\\n)/g, '') !== ''\n ));\n\n options.push({\n label: getCopyLabel(hasSelection),\n handler: () => {\n const clipboardText = hasSelection && selection ? selection.toString() : text;\n copyTextToClipboard(clipboardText);\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n if (onCopyLink) {\n options.push({\n label: 'lng_context_copy_message_link',\n handler: () => {\n onCopyLink();\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n return options;\n}\n\nfunction getCopyLabel(hasSelection: boolean): string {\n if (hasSelection) {\n return 'lng_context_copy_selected';\n }\n return 'lng_context_copy_text';\n}\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IAnchorPosition } from '../../../types';\n\nimport { getMessageCopyOptions } from './helpers/copyOptions';\nimport useContextMenuPosition from '../../../hooks/useContextMenuPosition';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './MessageContextMenu.scss';\n\ntype OwnProps = {\n isOpen: boolean;\n anchor: IAnchorPosition;\n message: ApiMessage;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canReport?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n onReply: () => void;\n onEdit: () => void;\n onPin: () => void;\n onUnpin: () => void;\n onForward: () => void;\n onDelete: () => void;\n onReport: () => void;\n onFaveSticker: () => void;\n onUnfaveSticker: () => void;\n onSelect: () => void;\n onSend: () => void;\n onReschedule: () => void;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onCopyLink?: () => void;\n};\n\nconst SCROLLBAR_WIDTH = 10;\n\nconst MessageContextMenu: FC = ({\n isOpen,\n message,\n anchor,\n canSendNow,\n canReschedule,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n onReply,\n onEdit,\n onPin,\n onUnpin,\n onForward,\n onDelete,\n onReport,\n onFaveSticker,\n onUnfaveSticker,\n onSelect,\n onSend,\n onReschedule,\n onClose,\n onCloseAnimationEnd,\n onCopyLink,\n}) => {\n const copyOptions = getMessageCopyOptions(message, onClose, canCopyLink ? onCopyLink : undefined);\n\n const getTriggerElement = useCallback(() => {\n return document.querySelector(`.active > .MessageList div[data-message-id=\"${message.id}\"]`);\n }, [message.id]);\n\n const getRootElement = useCallback(\n () => document.querySelector('.active > .MessageList'),\n [],\n );\n\n const getMenuElement = useCallback(\n () => document.querySelector('.MessageContextMenu .bubble'),\n [],\n );\n\n const { positionX, positionY, style } = useContextMenuPosition(\n anchor,\n getTriggerElement,\n getRootElement,\n getMenuElement,\n SCROLLBAR_WIDTH,\n (document.querySelector('.MiddleHeader') as HTMLElement).offsetHeight,\n );\n\n const lang = useLang();\n\n return (\n \n {canSendNow && {lang('MessageScheduleSend')}}\n {canReschedule && (\n {lang('MessageScheduleEditTime')}\n )}\n {canReply && {lang('Reply')}}\n {canEdit && {lang('Edit')}}\n {canFaveSticker && (\n {lang('AddToFavorites')}\n )}\n {canUnfaveSticker && (\n {lang('Stickers.RemoveFromFavorites')}\n )}\n {canCopy && copyOptions.map((options) => (\n {lang(options.label)}\n ))}\n {canPin && {lang('DialogPin')}}\n {canUnpin && {lang('DialogUnpin')}}\n {canForward && {lang('Forward')}}\n {canSelect && {lang('Common.Select')}}\n {canReport && {lang('lng_context_report_msg')}}\n {canDelete && {lang('Delete')}}\n \n );\n};\n\nexport default MessageContextMenu;\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\nimport { IAlbum, IAnchorPosition } from '../../../types';\nimport { selectAllowedMessageActions, selectCurrentMessageList } from '../../../modules/selectors';\nimport { disableScrolling, enableScrolling } from '../../../util/scrollLock';\nimport { pick } from '../../../util/iteratees';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\n\nimport DeleteMessageModal from '../../common/DeleteMessageModal';\nimport ReportMessageModal from '../../common/ReportMessageModal';\nimport PinMessageModal from '../../common/PinMessageModal';\nimport MessageContextMenu from './MessageContextMenu';\nimport CalendarModal from '../../common/CalendarModal';\nimport { getDayStartAt } from '../../../util/dateFormat';\nimport { copyTextToClipboard } from '../../../util/clipboard';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatUsername?: string;\n message: ApiMessage;\n album?: IAlbum;\n anchor: IAnchorPosition;\n messageListType: MessageListType;\n onClose: () => void;\n onCloseAnimationEnd: () => void;\n};\n\ntype StateProps = {\n noOptions?: boolean;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canReport?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ContextMenuContainer: FC = ({\n isOpen,\n messageListType,\n chatUsername,\n message,\n album,\n anchor,\n onClose,\n onCloseAnimationEnd,\n noOptions,\n canSendNow,\n canReschedule,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n setReplyingToId,\n setEditingId,\n pinMessage,\n openForwardMenu,\n faveSticker,\n unfaveSticker,\n toggleMessageSelection,\n sendScheduledMessages,\n rescheduleMessage,\n}) => {\n const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const [isReportModalOpen, setIsReportModalOpen] = useState(false);\n const [isPinModalOpen, setIsPinModalOpen] = useState(false);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const handleReport = useCallback(() => {\n setIsMenuOpen(false);\n setIsReportModalOpen(true);\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(false);\n onClose();\n }, [onClose]);\n\n const closeReportModal = useCallback(() => {\n setIsReportModalOpen(false);\n onClose();\n }, [onClose]);\n\n const closePinModal = useCallback(() => {\n setIsPinModalOpen(false);\n onClose();\n }, [onClose]);\n\n const handleCloseCalendar = useCallback(() => {\n closeCalendar();\n onClose();\n }, [closeCalendar, onClose]);\n\n const handleReply = useCallback(() => {\n setReplyingToId({ messageId: message.id });\n closeMenu();\n }, [setReplyingToId, message.id, closeMenu]);\n\n const handleEdit = useCallback(() => {\n setEditingId({ messageId: message.id });\n closeMenu();\n }, [setEditingId, message.id, closeMenu]);\n\n const handlePin = useCallback(() => {\n setIsMenuOpen(false);\n setIsPinModalOpen(true);\n }, []);\n\n const handleUnpin = useCallback(() => {\n pinMessage({ messageId: message.id, isUnpin: true });\n closeMenu();\n }, [pinMessage, message.id, closeMenu]);\n\n const handleForward = useCallback(() => {\n closeMenu();\n if (album && album.messages) {\n const messageIds = album.messages.map(({ id }) => id);\n openForwardMenu({ fromChatId: message.chatId, messageIds });\n } else {\n openForwardMenu({ fromChatId: message.chatId, messageIds: [message.id] });\n }\n }, [openForwardMenu, message, closeMenu, album]);\n\n const handleFaveSticker = useCallback(() => {\n closeMenu();\n faveSticker({ sticker: message.content.sticker });\n }, [closeMenu, message.content.sticker, faveSticker]);\n\n const handleUnfaveSticker = useCallback(() => {\n closeMenu();\n unfaveSticker({ sticker: message.content.sticker });\n }, [closeMenu, message.content.sticker, unfaveSticker]);\n\n const handleSelectMessage = useCallback(() => {\n const params = album && album.messages\n ? {\n messageId: message.id,\n childMessageIds: album.messages.map(({ id }) => id),\n withShift: false,\n }\n : { messageId: message.id, withShift: false };\n\n toggleMessageSelection(params);\n closeMenu();\n }, [closeMenu, message.id, toggleMessageSelection, album]);\n\n const handleScheduledMessageSend = useCallback(() => {\n sendScheduledMessages({ chatId: message.chatId, id: message.id });\n closeMenu();\n }, [closeMenu, message.chatId, message.id, sendScheduledMessages]);\n\n const handleOpenCalendar = useCallback(() => {\n setIsMenuOpen(false);\n openCalendar();\n }, [openCalendar]);\n\n const handleRescheduleMessage = useCallback((date: Date) => {\n rescheduleMessage({\n chatId: message.chatId,\n messageId: message.id,\n scheduledAt: Math.round(date.getTime() / 1000),\n });\n }, [message.chatId, message.id, rescheduleMessage]);\n\n const handleCopyLink = useCallback(() => {\n copyTextToClipboard(`https://t.me/${chatUsername || `c/${Math.abs(message.chatId)}`}/${message.id}`);\n closeMenu();\n }, [chatUsername, closeMenu, message.chatId, message.id]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\n\n const reportMessageIds = useMemo(() => (album ? album.messages : [message]).map(({ id }) => id), [album, message]);\n\n if (noOptions) {\n closeMenu();\n\n return undefined;\n }\n\n const scheduledMaxDate = new Date();\n scheduledMaxDate.setFullYear(scheduledMaxDate.getFullYear() + 1);\n\n return (\n
\n \n \n \n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { message, messageListType }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const {\n noOptions,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {};\n const isPinned = messageListType === 'pinned';\n const isScheduled = messageListType === 'scheduled';\n\n return {\n noOptions,\n canSendNow: isScheduled,\n canReschedule: isScheduled,\n canReply: !isPinned && !isScheduled && canReply,\n canPin: !isScheduled && canPin,\n canUnpin: !isScheduled && canUnpin,\n canDelete,\n canReport,\n canEdit: !isPinned && canEdit,\n canForward: !isScheduled && canForward,\n canFaveSticker: !isScheduled && canFaveSticker,\n canUnfaveSticker: !isScheduled && canUnfaveSticker,\n canCopy,\n canCopyLink: !isScheduled && canCopyLink,\n canSelect,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setReplyingToId',\n 'setEditingId',\n 'pinMessage',\n 'openForwardMenu',\n 'faveSticker',\n 'unfaveSticker',\n 'toggleMessageSelection',\n 'sendScheduledMessages',\n 'rescheduleMessage',\n ]),\n)(ContextMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiSticker, ApiStickerSet } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { STICKER_SIZE_MODAL } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport { selectStickerSet } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\nimport renderText from './helpers/renderText';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport Loading from '../ui/Loading';\nimport StickerButton from './StickerButton';\n\nimport './StickerSetModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n fromSticker: ApiSticker;\n onClose: () => void;\n};\n\ntype StateProps = {\n stickerSet?: ApiStickerSet;\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerSetModal: FC = ({\n isOpen,\n fromSticker,\n stickerSet,\n onClose,\n loadStickers,\n toggleStickerSet,\n sendMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const lang = useLang();\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE, isDisabled: !isOpen });\n\n useEffect(() => {\n if (isOpen) {\n const { stickerSetId, stickerSetAccessHash } = fromSticker;\n loadStickers({ stickerSetId, stickerSetAccessHash });\n }\n }, [isOpen, fromSticker, loadStickers]);\n\n const handleSelect = useCallback((sticker: ApiSticker) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n sendMessage({ sticker });\n onClose();\n }, [onClose, sendMessage]);\n\n const handleButtonClick = useCallback(() => {\n toggleStickerSet({ stickerSetId: fromSticker.stickerSetId });\n onClose();\n }, [fromSticker.stickerSetId, onClose, toggleStickerSet]);\n\n return (\n \n {stickerSet && stickerSet.stickers ? (\n <>\n
\n {stickerSet.stickers.map((sticker) => (\n \n ))}\n
\n
\n \n {lang(\n stickerSet.installedDate ? 'StickerPack.RemoveStickerCount' : 'StickerPack.AddStickerCount',\n stickerSet.count,\n 'i',\n )}\n \n
\n \n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { fromSticker }: OwnProps) => {\n return { stickerSet: selectStickerSet(global, fromSticker.stickerSetId) };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadStickers',\n 'toggleStickerSet',\n 'sendMessage',\n ]),\n)(StickerSetModal));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat } from '../../api/types';\nimport { IAnchorPosition } from '../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { disableScrolling, enableScrolling } from '../../util/scrollLock';\nimport { selectChat, selectNotifySettings, selectNotifyExceptions } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { isChatPrivate, getCanDeleteChat, selectIsChatMuted } from '../../modules/helpers';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport Portal from '../ui/Portal';\nimport Menu from '../ui/Menu';\nimport MenuItem from '../ui/MenuItem';\nimport DeleteChatModal from '../common/DeleteChatModal';\n\nimport './HeaderMenuContainer.scss';\n\ntype DispatchProps = Pick;\n\nexport type OwnProps = {\n chatId: number;\n threadId: number;\n isOpen: boolean;\n anchor: IAnchorPosition;\n isChannel?: boolean;\n canStartBot?: boolean;\n canRestartBot?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canMute?: boolean;\n canSelect?: boolean;\n canLeave?: boolean;\n onSubscribeChannel: () => void;\n onSearchClick: () => void;\n onClose: () => void;\n onCloseAnimationEnd: () => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isPrivate?: boolean;\n isMuted?: boolean;\n canDeleteChat?: boolean;\n};\n\nconst HeaderMenuContainer: FC = ({\n chatId,\n isOpen,\n anchor,\n isChannel,\n canStartBot,\n canRestartBot,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n chat,\n isPrivate,\n isMuted,\n canDeleteChat,\n onSubscribeChannel,\n onSearchClick,\n onClose,\n onCloseAnimationEnd,\n updateChatMutedState,\n enterMessageSelectMode,\n sendBotCommand,\n restartBot,\n}) => {\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const { x, y } = anchor;\n\n useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(false);\n onClose();\n }, [onClose]);\n\n const handleStartBot = useCallback(() => {\n sendBotCommand({ command: '/start' });\n }, [sendBotCommand]);\n\n const handleRestartBot = useCallback(() => {\n restartBot({ chatId });\n }, [chatId, restartBot]);\n\n const handleToggleMuteClick = useCallback(() => {\n updateChatMutedState({ chatId, isMuted: !isMuted });\n closeMenu();\n }, [chatId, closeMenu, isMuted, updateChatMutedState]);\n\n const handleSubscribe = useCallback(() => {\n onSubscribeChannel();\n closeMenu();\n }, [closeMenu, onSubscribeChannel]);\n\n const handleSearch = useCallback(() => {\n onSearchClick();\n closeMenu();\n }, [closeMenu, onSearchClick]);\n\n const handleSelectMessages = useCallback(() => {\n enterMessageSelectMode();\n closeMenu();\n }, [closeMenu, enterMessageSelectMode]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\n\n const lang = useLang();\n\n return (\n \n
\n \n {IS_SINGLE_COLUMN_LAYOUT && canStartBot && (\n \n {lang('BotStart')}\n \n )}\n {IS_SINGLE_COLUMN_LAYOUT && canRestartBot && (\n \n {lang('BotRestart')}\n \n )}\n {IS_SINGLE_COLUMN_LAYOUT && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {IS_SINGLE_COLUMN_LAYOUT && canSearch && (\n \n {lang('Search')}\n \n )}\n {canMute && (\n \n {lang(isMuted ? 'ChatsUnmute' : 'ChatsMute')}\n \n )}\n {canSelect && (\n \n {lang('ReportSelectMessages')}\n \n )}\n {canLeave && (\n \n {lang(isPrivate\n ? 'Delete'\n : (canDeleteChat ? 'GroupInfo.DeleteAndExit' : (isChannel ? 'LeaveChannel' : 'Group.LeaveGroup')))}\n \n )}\n \n {chat && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat || chat.isRestricted) {\n return {};\n }\n\n return {\n chat,\n isMuted: selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)),\n isPrivate: isChatPrivate(chat.id),\n canDeleteChat: getCanDeleteChat(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updateChatMutedState',\n 'enterMessageSelectMode',\n 'sendBotCommand',\n 'restartBot',\n ]),\n)(HeaderMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState, useLayoutEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { debounce } from '../../util/schedulers';\nimport { selectCurrentTextSearch, selectCurrentChat } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { getDayStartAt } from '../../util/dateFormat';\n\nimport Button from '../ui/Button';\nimport SearchInput from '../ui/SearchInput';\n\nimport './MobileSearch.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n};\n\ntype StateProps = {\n isActive?: boolean;\n chat?: ApiChat;\n query?: string;\n totalCount?: number;\n foundIds?: number[];\n isHistoryCalendarOpen?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst runDebouncedForSearch = debounce((cb) => cb(), 200, false);\n\nconst MobileSearchFooter: FC = ({\n isActive,\n chat,\n query,\n totalCount,\n foundIds,\n isHistoryCalendarOpen,\n setLocalTextSearchQuery,\n searchTextMessagesLocal,\n focusMessage,\n closeLocalTextSearch,\n openHistoryCalendar,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [focusedIndex, setFocusedIndex] = useState(0);\n\n // Fix for iOS keyboard\n useEffect(() => {\n const { visualViewport } = window as any;\n if (!visualViewport) {\n return undefined;\n }\n\n const mainEl = document.getElementById('Main') as HTMLDivElement;\n const handleResize = () => {\n const { activeElement } = document;\n if (activeElement && (activeElement === inputRef.current)) {\n const { pageTop, height } = visualViewport;\n mainEl.style.transform = `translateY(${pageTop}px)`;\n mainEl.style.height = `${height}px`;\n document.documentElement.scrollTop = pageTop;\n } else {\n mainEl.style.transform = '';\n mainEl.style.height = '';\n }\n };\n\n visualViewport.addEventListener('resize', handleResize);\n\n return () => {\n visualViewport.removeEventListener('resize', handleResize);\n };\n }, []);\n\n // Focus message\n useEffect(() => {\n if (chat && foundIds && foundIds.length) {\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1] });\n setFocusedIndex(0);\n } else {\n setFocusedIndex(-1);\n }\n }, [chat, focusMessage, foundIds]);\n\n // Disable native up/down buttons on iOS\n useEffect(() => {\n Array.from(document.querySelectorAll('input')).forEach((input) => {\n input.disabled = Boolean(isActive && input !== inputRef.current);\n });\n\n Array.from(document.querySelectorAll('div[contenteditable]')).forEach((div) => {\n div.contentEditable = isActive ? 'false' : 'true';\n });\n }, [isActive]);\n\n // Blur on exit\n useEffect(() => {\n if (!isActive) {\n inputRef.current!.blur();\n }\n }, [isActive]);\n\n useLayoutEffect(() => {\n const searchInput = document.querySelector('#MobileSearch input')!;\n searchInput.blur();\n }, [isHistoryCalendarOpen]);\n\n const handleMessageSearchQueryChange = useCallback((newQuery: string) => {\n setLocalTextSearchQuery({ query: newQuery });\n\n if (newQuery.length) {\n runDebouncedForSearch(searchTextMessagesLocal);\n }\n }, [searchTextMessagesLocal, setLocalTextSearchQuery]);\n\n const handleUp = useCallback(() => {\n if (chat && foundIds) {\n const newFocusIndex = focusedIndex + 1;\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] });\n setFocusedIndex(newFocusIndex);\n }\n }, [chat, focusedIndex, focusMessage, foundIds]);\n\n const handleDown = useCallback(() => {\n if (chat && foundIds) {\n const newFocusIndex = focusedIndex - 1;\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] });\n setFocusedIndex(newFocusIndex);\n }\n }, [chat, focusedIndex, focusMessage, foundIds]);\n\n return (\n
\n
\n \n \n \n \n
\n
\n
\n {query ? (\n foundIds && foundIds.length ? (\n `${focusedIndex + 1} of ${totalCount}`\n ) : foundIds && !foundIds.length ? (\n 'No results'\n ) : (\n ''\n )\n ) : (\n openHistoryCalendar({ selectedAt: getDayStartAt(Date.now()) })}\n ariaLabel=\"Search messages by date\"\n >\n \n \n )}\n
\n \n \n \n \n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return {};\n }\n\n const { query, results } = selectCurrentTextSearch(global) || {};\n const { totalCount, foundIds } = results || {};\n\n return {\n chat,\n query,\n totalCount,\n foundIds,\n isHistoryCalendarOpen: Boolean(global.historyCalendarSelectedAt),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'searchTextMessagesLocal',\n 'focusMessage',\n 'closeLocalTextSearch',\n 'openHistoryCalendar',\n ]),\n)(MobileSearchFooter));\n","export default function findInViewport(\n container: HTMLElement,\n selectorOrElements: string | NodeListOf,\n margin = 0,\n isDense = false,\n shouldContainBottom = false,\n isHorizontal = false,\n) {\n const viewportY1 = container[isHorizontal ? 'scrollLeft' : 'scrollTop'];\n const viewportY2 = viewportY1 + container[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const allElements = typeof selectorOrElements === 'string'\n ? container.querySelectorAll(selectorOrElements)\n : selectorOrElements;\n const { length } = allElements;\n const visibleIndexes: number[] = [];\n let isFound = false;\n\n for (let i = 0; i < length; i++) {\n const element = allElements[i];\n const y1 = element[isHorizontal ? 'offsetLeft' : 'offsetTop'];\n const y2 = y1 + element[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const isVisible = shouldContainBottom\n ? y2 >= viewportY1 - margin && y2 <= viewportY2 + margin\n : y1 <= viewportY2 + margin && y2 >= viewportY1 - margin;\n\n if (isVisible) {\n visibleIndexes.push(i);\n isFound = true;\n } else if (isFound && !isDense) {\n break;\n }\n }\n\n return { allElements, visibleIndexes };\n}\n","function isFullyVisible(container: HTMLElement, element: HTMLElement, isHorizontal = false) {\n const viewportY1 = container[isHorizontal ? 'scrollLeft' : 'scrollTop'];\n const viewportY2 = viewportY1 + container[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const y1 = element[isHorizontal ? 'offsetLeft' : 'offsetTop'];\n const y2 = y1 + element[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n return y1 > viewportY1 && y2 < viewportY2;\n}\n\nexport default isFullyVisible;\n","import findInViewport from './findInViewport';\nimport isFullyVisible from './isFullyVisible';\nimport fastSmoothScroll from './fastSmoothScroll';\n\nconst VIEWPORT_MARGIN = 8;\nconst SCROLL_MARGIN = 10;\n\nexport default function setTooltipItemVisible(selector: string, index: number, containerRef: Record) {\n const container = containerRef.current!;\n if (!container || index < 0) {\n return;\n }\n const { visibleIndexes, allElements } = findInViewport(\n container,\n selector,\n VIEWPORT_MARGIN,\n true,\n true,\n );\n\n if (!allElements.length || !allElements[index]) {\n return;\n }\n const first = visibleIndexes[0];\n if (!visibleIndexes.includes(index)\n || (index === first && !isFullyVisible(container, allElements[first]))) {\n const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';\n fastSmoothScroll(container, allElements[index], position, SCROLL_MARGIN);\n }\n}\n","import React, {\n FC, useCallback, useEffect, useState, useRef, memo,\n} from '../../../lib/teact/teact';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport { ApiUser } from '../../../api/types';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport setTooltipItemVisible from '../../../util/setTooltipItemVisible';\nimport cycleRestrict from '../../../util/cycleRestrict';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nimport './MentionTooltip.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n filter: string;\n onClose: () => void;\n onInsertUserName: (user: ApiUser, forceFocus?: boolean) => void;\n filteredUsers?: ApiUser[];\n usersById?: Record;\n};\n\nconst MentionTooltip: FC = ({\n isOpen,\n filter,\n onClose,\n onInsertUserName,\n usersById,\n filteredUsers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!filteredUsers) {\n return -1;\n }\n const membersCount = filteredUsers!.length;\n return cycleRestrict(membersCount, newIndex);\n }, [filteredUsers]);\n\n const [selectedMentionIndex, setSelectedMentionIndex] = useState(-1);\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n e.preventDefault();\n setSelectedMentionIndex((index) => (getSelectedIndex(index + value)));\n }, [setSelectedMentionIndex, getSelectedIndex]);\n\n const handleUserSelect = useCallback((userId: number, forceFocus = false) => {\n const user = usersById && usersById[userId];\n if (!user) {\n return;\n }\n\n onInsertUserName(user, forceFocus);\n }, [usersById, onInsertUserName]);\n\n const handleSelectMention = useCallback((e: KeyboardEvent) => {\n if (filteredUsers && filteredUsers.length && selectedMentionIndex > -1) {\n const member = filteredUsers[selectedMentionIndex];\n if (member) {\n e.preventDefault();\n handleUserSelect(member.id, true);\n }\n }\n }, [filteredUsers, selectedMentionIndex, handleUserSelect]);\n\n useEffect(() => (isOpen ? captureKeyboardListeners({\n onEsc: onClose,\n onUp: (e: KeyboardEvent) => handleArrowKey(-1, e),\n onDown: (e: KeyboardEvent) => handleArrowKey(1, e),\n onEnter: handleSelectMention,\n onTab: handleSelectMention,\n }) : undefined), [isOpen, onClose, handleArrowKey, handleSelectMention]);\n\n useEffect(() => {\n if (filteredUsers && !filteredUsers.length) {\n onClose();\n }\n }, [filteredUsers, onClose]);\n\n useEffect(() => {\n setSelectedMentionIndex(0);\n }, [filter]);\n\n useEffect(() => {\n setTooltipItemVisible('.chat-item-clickable', selectedMentionIndex, containerRef);\n }, [selectedMentionIndex]);\n\n const prevChatMembers = usePrevious(\n filteredUsers && filteredUsers.length\n ? filteredUsers\n : undefined,\n shouldRender,\n );\n const renderedChatMembers = filteredUsers && !filteredUsers.length\n ? prevChatMembers\n : filteredUsers;\n\n if (!shouldRender || (renderedChatMembers && !renderedChatMembers.length)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'MentionTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n );\n\n return (\n
\n {renderedChatMembers && renderedChatMembers.map(({ id }, index) => (\n handleUserSelect(id)}\n focus={selectedMentionIndex === index}\n >\n \n \n ))}\n
\n );\n};\n\nexport default memo(MentionTooltip);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiAttachment, ApiChatMember, ApiUser } from '../../../api/types';\n\nimport { CONTENT_TYPES_FOR_QUICK_UPLOAD, EDITABLE_INPUT_MODAL_ID } from '../../../config';\nimport { getFileExtension } from '../../common/helpers/documentInfo';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useMentionTooltip from './hooks/useMentionTooltip';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport File from '../../common/File';\nimport MessageInput from './MessageInput';\nimport MentionTooltip from './MentionTooltip';\nimport EmojiTooltip from './EmojiTooltip.async';\n\nimport './AttachmentModal.scss';\n\nexport type OwnProps = {\n attachments: ApiAttachment[];\n caption: string;\n isReady?: boolean;\n currentUserId?: number;\n groupChatMembers?: ApiChatMember[];\n usersById?: Record;\n recentEmojis: string[];\n baseEmojiKeywords?: Record;\n emojiKeywords?: Record;\n addRecentEmoji: AnyToVoidFunction;\n onCaptionUpdate: (html: string) => void;\n onSend: () => void;\n onFileAppend: (files: File[], isQuick: boolean) => void;\n onClear: () => void;\n};\n\nconst DROP_LEAVE_TIMEOUT_MS = 150;\n\nconst AttachmentModal: FC = ({\n attachments,\n caption,\n isReady,\n currentUserId,\n groupChatMembers,\n usersById,\n recentEmojis,\n baseEmojiKeywords,\n emojiKeywords,\n addRecentEmoji,\n onCaptionUpdate,\n onSend,\n onFileAppend,\n onClear,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const hideTimeoutRef = useRef(null);\n const prevAttachments = usePrevious(attachments);\n const renderingAttachments = attachments.length ? attachments : prevAttachments;\n const isOpen = Boolean(attachments.length);\n const [isHovered, markHovered, unmarkHovered] = useFlag();\n const isQuick = Boolean(renderingAttachments && renderingAttachments.every((a) => a.quick));\n const lang = useLang();\n\n const {\n isMentionTooltipOpen, mentionFilter,\n closeMentionTooltip, insertMention,\n mentionFilteredUsers,\n } = useMentionTooltip(\n isOpen,\n caption,\n onCaptionUpdate,\n EDITABLE_INPUT_MODAL_ID,\n groupChatMembers,\n undefined,\n currentUserId,\n usersById,\n );\n const {\n isEmojiTooltipOpen, closeEmojiTooltip, filteredEmojis, insertEmoji,\n } = useEmojiTooltip(\n isOpen,\n caption,\n recentEmojis,\n EDITABLE_INPUT_MODAL_ID,\n onCaptionUpdate,\n baseEmojiKeywords,\n emojiKeywords,\n !isReady,\n );\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]);\n\n const sendAttachments = useCallback(() => {\n if (isOpen) {\n onSend();\n }\n }, [isOpen, onSend]);\n\n const handleDragLeave = (e: React.DragEvent) => {\n const { relatedTarget: toTarget, target: fromTarget } = e;\n\n // Esc button pressed during drag event\n if ((fromTarget as HTMLDivElement).matches('.drop-target') && !toTarget) {\n hideTimeoutRef.current = window.setTimeout(unmarkHovered, DROP_LEAVE_TIMEOUT_MS);\n }\n\n // Prevent DragLeave event from firing when the pointer moves inside the AttachmentModal drop target\n if (fromTarget && (fromTarget as HTMLElement).closest('.AttachmentModal.hovered')) {\n return;\n }\n\n if (toTarget) {\n e.stopPropagation();\n }\n\n unmarkHovered();\n };\n\n const handleFilesDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n unmarkHovered();\n\n const { dataTransfer: { files } } = e;\n\n if (files && files.length) {\n const newFiles = isQuick\n ? Array.from(files).filter((file) => {\n return file.type && CONTENT_TYPES_FOR_QUICK_UPLOAD.has(file.type);\n })\n : Array.from(files);\n\n onFileAppend(newFiles, isQuick);\n }\n }, [isQuick, onFileAppend, unmarkHovered]);\n\n function handleDragOver(e: React.MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n if (hideTimeoutRef.current) {\n window.clearTimeout(hideTimeoutRef.current);\n }\n }\n\n if (!renderingAttachments) {\n return undefined;\n }\n\n const areAllPhotos = renderingAttachments.every((a) => a.mimeType.startsWith('image/'));\n const areAllVideos = renderingAttachments.every((a) => a.mimeType.startsWith('video/'));\n\n let title = '';\n if (areAllPhotos) {\n title = lang('PreviewSender.SendPhoto', renderingAttachments.length, 'i');\n } else if (areAllVideos) {\n title = lang('PreviewSender.SendVideo', renderingAttachments.length, 'i');\n } else {\n title = lang('PreviewSender.SendFile', renderingAttachments.length, 'i');\n }\n\n function renderHeader() {\n if (!renderingAttachments) {\n return undefined;\n }\n\n return (\n
\n \n
{title}
\n \n {lang('Send')}\n \n
\n );\n }\n\n return (\n \n \n {isQuick ? (\n
\n {renderingAttachments.map((attachment) => (\n attachment.mimeType.startsWith('image/')\n ? \"\"\n :
\n ) : (\n
\n {renderingAttachments.map((attachment) => (\n \n ))}\n
\n )}\n\n
\n \n \n \n
\n \n \n );\n};\n\nexport default memo(AttachmentModal);\n","import { ChangeEvent, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiNewPoll } from '../../../api/types';\n\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport InputText from '../../ui/InputText';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup from '../../ui/RadioGroup';\n\nimport './PollModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onSend: (pollSummary: ApiNewPoll) => void;\n onClear: () => void;\n};\n\nconst MAX_LIST_HEIGHT = 320;\nconst MAX_OPTIONS_COUNT = 10;\nconst MAX_OPTION_LENGTH = 100;\nconst MAX_QUESTION_LENGTH = 255;\nconst MAX_SOLUTION_LENGTH = 200;\n\nconst PollModal: FC = ({ isOpen, onSend, onClear }) => {\n // eslint-disable-next-line no-null/no-null\n const questionInputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const optionsListRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const solutionRef = useRef(null);\n\n const [question, setQuestion] = useState('');\n const [options, setOptions] = useState(['']);\n const [isAnonymous, setIsAnonymous] = useState(true);\n const [isMultipleAnswers, setIsMultipleAnswers] = useState(false);\n const [isQuizMode, setIsQuizMode] = useState(false);\n const [solution, setSolution] = useState();\n const [correctOption, setCorrectOption] = useState();\n const [hasErrors, setHasErrors] = useState(false);\n\n const lang = useLang();\n\n const focusInput = useCallback((ref: RefObject) => {\n if (isOpen && ref.current) {\n ref.current.focus();\n }\n }, [isOpen]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]);\n useEffect(() => {\n if (!isOpen) {\n setQuestion('');\n setOptions(['']);\n setIsAnonymous(true);\n setIsMultipleAnswers(false);\n setIsQuizMode(false);\n setSolution('');\n setCorrectOption('');\n setHasErrors(false);\n }\n }, [isOpen]);\n\n useEffect(() => focusInput(questionInputRef), [focusInput, isOpen]);\n\n useLayoutEffect(() => {\n const solutionEl = solutionRef.current;\n\n if (solutionEl && solution !== solutionEl.innerHTML) {\n solutionEl.innerHTML = solution;\n }\n }, [solution]);\n\n const addNewOption = useCallback((newOptions: string[] = []) => {\n setOptions([...newOptions, '']);\n requestAnimationFrame(() => {\n const list = optionsListRef.current;\n if (!list) {\n return;\n }\n\n list.classList.toggle('overflown', list.scrollHeight > MAX_LIST_HEIGHT);\n list.scrollTo({ top: list.scrollHeight, behavior: 'smooth' });\n });\n }, []);\n\n const handleCreate = useCallback(() => {\n setHasErrors(false);\n if (!isOpen) {\n return;\n }\n\n const questionTrimmed = question.trim().substring(0, MAX_QUESTION_LENGTH);\n const optionsTrimmed = options.map((o) => o.trim().substring(0, MAX_OPTION_LENGTH)).filter((o) => o.length);\n\n if (!questionTrimmed || optionsTrimmed.length < 2) {\n setQuestion(questionTrimmed);\n if (optionsTrimmed.length) {\n if (optionsTrimmed.length < 2) {\n addNewOption(optionsTrimmed);\n } else {\n setOptions(optionsTrimmed);\n }\n } else {\n addNewOption();\n }\n setHasErrors(true);\n return;\n }\n\n if (isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)])) {\n setHasErrors(true);\n return;\n }\n\n const answers = optionsTrimmed\n .map((text, index) => ({\n text: text.trim(),\n option: String(index),\n ...(String(index) === correctOption && { correct: true }),\n }));\n\n const payload: ApiNewPoll = {\n summary: {\n question: questionTrimmed,\n answers,\n ...(!isAnonymous && { isPublic: true }),\n ...(isMultipleAnswers && { multipleChoice: true }),\n ...(isQuizMode && { quiz: true }),\n },\n };\n\n if (isQuizMode) {\n const { text, entities } = (solution && parseMessageInput(solution.substring(0, MAX_SOLUTION_LENGTH))) || {};\n\n payload.quiz = {\n correctAnswers: [correctOption],\n ...(text && { solution: text }),\n ...(entities && { solutionEntities: entities }),\n };\n }\n\n onSend(payload);\n }, [\n isOpen,\n question,\n options,\n isQuizMode,\n correctOption,\n isAnonymous,\n isMultipleAnswers,\n onSend,\n addNewOption,\n solution,\n ]);\n\n const updateOption = useCallback((index: number, text: string) => {\n const newOptions = [...options];\n newOptions[index] = text;\n if (newOptions[newOptions.length - 1].trim().length && newOptions.length < MAX_OPTIONS_COUNT) {\n addNewOption(newOptions);\n } else {\n setOptions(newOptions);\n }\n }, [options, addNewOption]);\n\n const removeOption = useCallback((index: number) => {\n const newOptions = [...options];\n newOptions.splice(index, 1);\n setOptions(newOptions);\n requestAnimationFrame(() => {\n if (!optionsListRef.current) {\n return;\n }\n\n optionsListRef.current.classList.toggle('overflown', optionsListRef.current.scrollHeight > MAX_LIST_HEIGHT);\n });\n }, [options]);\n\n const handleCorrectOptionChange = useCallback((newValue: string) => {\n setCorrectOption(newValue);\n }, [setCorrectOption]);\n\n const handleIsAnonymousChange = useCallback((e: ChangeEvent) => {\n setIsAnonymous(e.target.checked);\n }, []);\n\n const handleMultipleAnswersChange = useCallback((e: ChangeEvent) => {\n setIsMultipleAnswers(e.target.checked);\n }, []);\n\n const handleQuizModeChange = useCallback((e: ChangeEvent) => {\n setIsQuizMode(e.target.checked);\n }, []);\n\n const handleKeyPress = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode === 13) {\n handleCreate();\n }\n }, [handleCreate]);\n\n const getQuestionError = useCallback(() => {\n if (hasErrors && !question.trim().length) {\n return lang('lng_polls_choose_question');\n }\n\n return undefined;\n }, [hasErrors, lang, question]);\n\n const getOptionsError = useCallback((index: number) => {\n const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length);\n if (hasErrors && optionsTrimmed.length < 2 && !options[index].trim().length) {\n return lang('lng_polls_choose_answers');\n }\n return undefined;\n }, [hasErrors, lang, options]);\n\n function renderHeader() {\n return (\n
\n \n
{lang('NewPoll')}
\n \n {lang('Create')}\n \n
\n );\n }\n\n function renderOptions() {\n return options.map((option, index) => (\n
\n updateOption(index, e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n {index !== options.length - 1 && (\n removeOption(index)}\n >\n \n \n )}\n
\n ));\n }\n\n function renderRadioOptions() {\n return renderOptions()\n .map((label, index) => ({ value: String(index), label, hidden: index === options.length - 1 }));\n }\n\n function renderQuizNoOptionError() {\n const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length);\n\n return isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)]) && (\n

{lang('lng_polls_choose_correct')}

\n );\n }\n\n return (\n \n setQuestion(e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n
\n\n
\n

{lang('PollOptions')}

\n\n {hasErrors && renderQuizNoOptionError()}\n {isQuizMode ? (\n \n ) : (\n renderOptions()\n )}\n\n
\n\n
\n\n
\n \n \n \n {isQuizMode && (\n <>\n

{lang('lng_polls_solution_title')}

\n setSolution(e.currentTarget.innerHTML)}\n />\n
{lang('CreatePoll.ExplanationInfo')}
\n \n )}\n
\n \n );\n};\n\nexport default memo(PollModal);\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\n\nconst MENU_CLOSE_TIMEOUT = 250;\nlet closeTimeout: number | undefined;\n\nexport default function useMouseInside(\n isOpen: boolean, onClose: NoneToVoidFunction, menuCloseTimeout = MENU_CLOSE_TIMEOUT, isDisabled = false,\n) {\n const isMouseInside = useRef(false);\n\n useEffect(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n if (isOpen && !IS_TOUCH_ENV && !isDisabled) {\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout * 2);\n }\n }, [isDisabled, isOpen, menuCloseTimeout, onClose]);\n\n const handleMouseEnter = useCallback(() => {\n isMouseInside.current = true;\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout);\n }, [menuCloseTimeout, onClose]);\n\n return [handleMouseEnter, handleMouseLeave];\n}\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\n\nimport './EmojiButton.scss';\n\ntype OwnProps = {\n emoji: Emoji;\n focus?: boolean;\n onClick: (emoji: string, name: string) => void;\n};\n\nconst EmojiButton: FC = ({ emoji, focus, onClick }) => {\n const handleClick = useCallback((e: React.MouseEvent) => {\n // Preventing safari from losing focus on Composer MessageInput\n e.preventDefault();\n\n onClick(emoji.native, emoji.id);\n }, [emoji, onClick]);\n\n return (\n \n {IS_EMOJI_SUPPORTED ? emoji.native : \"\"}\n
\n );\n};\n\nexport default memo(EmojiButton);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport windowSize from '../../../util/windowSize';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useLang from '../../../hooks/useLang';\n\nimport EmojiButton from './EmojiButton';\n\nconst EMOJIS_PER_ROW_ON_DESKTOP = 9;\nconst EMOJI_MARGIN = 4;\nconst MOBILE_CONTAINER_PADDING = 8;\nconst EMOJI_SIZE = 40;\n\ntype OwnProps = {\n category: EmojiCategory;\n index: number;\n allEmojis: AllEmojis;\n observeIntersection: ObserveFn;\n shouldRender: boolean;\n onEmojiSelect: (emoji: string, name: string) => void;\n};\n\nconst EmojiCategory: FC = ({\n category, index, allEmojis, observeIntersection, shouldRender, onEmojiSelect,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n\n const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow');\n\n const lang = useLang();\n\n const emojisPerRow = IS_SINGLE_COLUMN_LAYOUT\n ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (EMOJI_SIZE + EMOJI_MARGIN))\n : EMOJIS_PER_ROW_ON_DESKTOP;\n const height = Math.ceil(category.emojis.length / emojisPerRow) * (EMOJI_SIZE + EMOJI_MARGIN);\n\n return (\n \n

\n {lang(category.id === 'recent' ? 'RecentStickers' : `Emoji${index}`)}\n

\n \n {shouldRender && category.emojis.map((name) => {\n const emoji = allEmojis[name];\n // Some emojis have multiple skins and are represented as an Object with emojis for all skins.\n // For now, we select only the first emoji with 'neutral' skin.\n const displayedEmoji = 'id' in emoji ? emoji : emoji[1];\n\n return (\n \n );\n })}\n
\n \n );\n};\n\nexport default memo(EmojiCategory);\n","import React, {\n FC, useState, useEffect, memo, useRef, useMemo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { MENU_TRANSITION_DURATION } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../util/environment';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport {\n EmojiModule,\n EmojiRawData,\n EmojiData,\n uncompressEmoji,\n} from '../../../util/emoji';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Loading from '../../ui/Loading';\nimport EmojiCategory from './EmojiCategory';\n\nimport './EmojiPicker.scss';\n\ntype OwnProps = {\n className?: string;\n onEmojiSelect: (emoji: string, name: string) => void;\n};\n\ntype StateProps = Pick;\ntype EmojiCategoryData = { id: string; name: string; emojis: string[] };\n\nconst ICONS_BY_CATEGORY: Record = {\n recent: 'icon-recent',\n people: 'icon-smile',\n nature: 'icon-animals',\n foods: 'icon-eats',\n activity: 'icon-sport',\n places: 'icon-car',\n objects: 'icon-lamp',\n symbols: 'icon-language',\n flags: 'icon-flag',\n};\n\nconst OPEN_ANIMATION_DELAY = 200;\n// Only a few categories are above this height.\nconst SMOOTH_SCROLL_DISTANCE = 800;\nconst FOCUS_MARGIN = 50;\nconst HEADER_BUTTON_WIDTH = 42; // px. Includes margins\nconst INTERSECTION_THROTTLE = 200;\n\nconst categoryIntersections: boolean[] = [];\n\nlet emojiDataPromise: Promise;\nlet emojiRawData: EmojiRawData;\nlet emojiData: EmojiData;\n\nconst EmojiPicker: FC = ({\n className, onEmojiSelect, recentEmojis,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef(null);\n\n const [categories, setCategories] = useState();\n const [emojis, setEmojis] = useState();\n const [activeCategoryIndex, setActiveCategoryIndex] = useState(0);\n\n const { observe: observeIntersection } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE,\n }, (entries) => {\n entries.forEach((entry) => {\n const { id } = entry.target as HTMLDivElement;\n if (!id || !id.startsWith('emoji-category-')) {\n return;\n }\n\n const index = Number(id.replace('emoji-category-', ''));\n categoryIntersections[index] = entry.isIntersecting;\n });\n\n const intersectingWithIndexes = categoryIntersections\n .map((isIntersecting, index) => ({ index, isIntersecting }))\n .filter(({ isIntersecting }) => isIntersecting);\n\n if (!intersectingWithIndexes.length) {\n return;\n }\n\n setActiveCategoryIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index);\n });\n\n useHorizontalScroll(headerRef.current, !IS_SINGLE_COLUMN_LAYOUT);\n\n // Scroll header when active set updates\n useEffect(() => {\n if (!categories) {\n return;\n }\n\n const header = headerRef.current;\n if (!header) {\n return;\n }\n\n const newLeft = activeCategoryIndex * HEADER_BUTTON_WIDTH - header.offsetWidth / 2 + HEADER_BUTTON_WIDTH / 2;\n\n fastSmoothScrollHorizontal(header, newLeft);\n }, [categories, activeCategoryIndex]);\n\n const lang = useLang();\n\n const allCategories = useMemo(() => {\n if (!categories) {\n return MEMO_EMPTY_ARRAY;\n }\n const themeCategories = [...categories];\n if (recentEmojis && recentEmojis.length) {\n themeCategories.unshift({\n id: 'recent',\n name: lang('RecentStickers'),\n emojis: recentEmojis,\n });\n }\n\n return themeCategories;\n }, [categories, lang, recentEmojis]);\n\n // Initialize data on first render.\n useEffect(() => {\n setTimeout(() => {\n const exec = () => {\n setCategories(emojiData.categories);\n\n setEmojis(emojiData.emojis as AllEmojis);\n };\n\n if (emojiData) {\n exec();\n } else {\n ensureEmojiData()\n .then(exec);\n }\n }, OPEN_ANIMATION_DELAY);\n }, []);\n\n const selectCategory = useCallback((index: number) => {\n setActiveCategoryIndex(index);\n const categoryEl = document.getElementById(`emoji-category-${index}`)!;\n fastSmoothScroll(containerRef.current!, categoryEl, 'start', FOCUS_MARGIN, SMOOTH_SCROLL_DISTANCE);\n }, []);\n\n const handleEmojiSelect = useCallback((emoji: string, name: string) => {\n onEmojiSelect(emoji, name);\n }, [onEmojiSelect]);\n\n const canRenderContents = useAsyncRendering([], MENU_TRANSITION_DURATION);\n\n function renderCategoryButton(category: EmojiCategoryData, index: number) {\n const icon = ICONS_BY_CATEGORY[category.id];\n\n return icon && (\n selectCategory(index)}\n ariaLabel={category.name}\n >\n \n \n );\n }\n\n const containerClassName = buildClassName('EmojiPicker', className);\n\n if (!emojis || !canRenderContents) {\n return (\n
\n \n
\n );\n }\n\n return (\n
\n
\n {allCategories.map(renderCategoryButton)}\n
\n \n {allCategories.map((category, i) => (\n = i - 1 && activeCategoryIndex <= i + 1}\n onEmojiSelect={handleEmojiSelect}\n />\n ))}\n
\n \n );\n};\n\nasync function ensureEmojiData() {\n if (!emojiDataPromise) {\n emojiDataPromise = import('emoji-data-ios/emoji-data.json') as unknown as Promise;\n emojiRawData = (await emojiDataPromise).default;\n\n emojiData = uncompressEmoji(emojiRawData);\n }\n\n return emojiDataPromise;\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['recentEmojis']),\n)(EmojiPicker));\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiSticker } from '../../../api/types';\nimport { StickerSetOrRecent } from '../../../types';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_PICKER } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport windowSize from '../../../util/windowSize';\nimport StickerButton from '../../common/StickerButton';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\n\ntype OwnProps = {\n stickerSet: StickerSetOrRecent;\n loadAndPlay: boolean;\n index: number;\n observeIntersection: ObserveFn;\n shouldRender: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n onStickerUnfave: (sticker: ApiSticker) => void;\n};\n\nconst STICKERS_PER_ROW_ON_DESKTOP = 5;\nconst STICKER_MARGIN = IS_SINGLE_COLUMN_LAYOUT ? 8 : 16;\nconst MOBILE_CONTAINER_PADDING = 8;\n\nconst StickerSet: FC = ({\n stickerSet,\n loadAndPlay,\n index,\n observeIntersection,\n shouldRender,\n onStickerSelect,\n onStickerUnfave,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n\n const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow');\n\n const stickersPerRow = IS_SINGLE_COLUMN_LAYOUT\n ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (STICKER_SIZE_PICKER + STICKER_MARGIN))\n : STICKERS_PER_ROW_ON_DESKTOP;\n const height = Math.ceil(stickerSet.count / stickersPerRow) * (STICKER_SIZE_PICKER + STICKER_MARGIN);\n\n return (\n \n

{stickerSet.title}

\n \n {shouldRender && stickerSet.stickers && stickerSet.stickers.map((sticker) => (\n \n ))}\n \n \n );\n};\n\nexport default memo(StickerSet);\n","import React, {\n FC, useState, useEffect, memo, useRef, useMemo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiStickerSet, ApiSticker } from '../../../api/types';\nimport { StickerSetOrRecent } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION, STICKER_SIZE_PICKER_HEADER } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Loading from '../../ui/Loading';\nimport Button from '../../ui/Button';\nimport StickerButton from '../../common/StickerButton';\nimport StickerSet from './StickerSet';\nimport StickerSetCover from './StickerSetCover';\nimport StickerSetCoverAnimated from './StickerSetCoverAnimated';\n\nimport './StickerPicker.scss';\n\ntype OwnProps = {\n className: string;\n loadAndPlay: boolean;\n canSendStickers: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n recentStickers: ApiSticker[];\n favoriteStickers: ApiSticker[];\n stickerSetsById: Record;\n addedSetIds?: string[];\n shouldPlay?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst SMOOTH_SCROLL_DISTANCE = 500;\nconst HEADER_BUTTON_WIDTH = 52; // px (including margin)\nconst STICKER_INTERSECTION_THROTTLE = 200;\n\nconst stickerSetIntersections: boolean[] = [];\n\nconst StickerPicker: FC = ({\n className,\n loadAndPlay,\n canSendStickers,\n recentStickers,\n favoriteStickers,\n addedSetIds,\n stickerSetsById,\n shouldPlay,\n onStickerSelect,\n loadStickerSets,\n loadRecentStickers,\n loadFavoriteStickers,\n loadAddedStickers,\n addRecentSticker,\n unfaveSticker,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef(null);\n const [activeSetIndex, setActiveSetIndex] = useState(0);\n\n const { observe: observeIntersection } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: STICKER_INTERSECTION_THROTTLE,\n }, (entries) => {\n entries.forEach((entry) => {\n const { id } = entry.target as HTMLDivElement;\n if (!id || !id.startsWith('sticker-set-')) {\n return;\n }\n\n const index = Number(id.replace('sticker-set-', ''));\n stickerSetIntersections[index] = entry.isIntersecting;\n });\n\n const intersectingWithIndexes = stickerSetIntersections\n .map((isIntersecting, index) => ({ index, isIntersecting }))\n .filter(({ isIntersecting }) => isIntersecting);\n\n if (!intersectingWithIndexes.length) {\n return;\n }\n\n setActiveSetIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index);\n });\n const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: headerRef });\n\n const lang = useLang();\n\n const areAddedLoaded = Boolean(addedSetIds);\n\n const allSets = useMemo(() => {\n if (!addedSetIds) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return [\n {\n id: 'recent',\n title: lang('RecentStickers'),\n stickers: recentStickers,\n count: recentStickers.length,\n },\n {\n id: 'favorite',\n title: lang('FavoriteStickers'),\n stickers: favoriteStickers,\n count: favoriteStickers.length,\n },\n ...addedSetIds.map((id) => stickerSetsById[id]).filter(Boolean),\n ];\n }, [addedSetIds, lang, recentStickers, favoriteStickers, stickerSetsById]);\n\n const noPopulatedSets = useMemo(() => (\n areAddedLoaded\n && allSets.filter((set) => set.stickers && set.stickers.length).length === 0\n ), [allSets, areAddedLoaded]);\n\n useEffect(() => {\n if (loadAndPlay) {\n loadStickerSets();\n loadRecentStickers();\n loadFavoriteStickers();\n }\n }, [loadAndPlay, loadFavoriteStickers, loadRecentStickers, loadStickerSets]);\n\n useEffect(() => {\n if (addedSetIds && addedSetIds.length) {\n loadAddedStickers();\n }\n }, [addedSetIds, loadAddedStickers]);\n\n useHorizontalScroll(headerRef.current);\n\n // Scroll container and header when active set changes\n useEffect(() => {\n if (!areAddedLoaded) {\n return;\n }\n\n const header = headerRef.current;\n if (!header) {\n return;\n }\n\n const newLeft = activeSetIndex * HEADER_BUTTON_WIDTH - (header.offsetWidth / 2 - HEADER_BUTTON_WIDTH / 2);\n\n fastSmoothScrollHorizontal(header, newLeft);\n }, [areAddedLoaded, activeSetIndex]);\n\n const selectStickerSet = useCallback((index: number) => {\n setActiveSetIndex(index);\n const stickerSetEl = document.getElementById(`sticker-set-${index}`)!;\n fastSmoothScroll(containerRef.current!, stickerSetEl, 'start', undefined, SMOOTH_SCROLL_DISTANCE);\n }, []);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n onStickerSelect(sticker);\n addRecentSticker({ sticker });\n }, [addRecentSticker, onStickerSelect]);\n\n const handleStickerUnfave = useCallback((sticker: ApiSticker) => {\n unfaveSticker({ sticker });\n }, [unfaveSticker]);\n\n const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION);\n\n function renderCover(stickerSet: StickerSetOrRecent, index: number) {\n const firstSticker = stickerSet.stickers && stickerSet.stickers[0];\n const buttonClassName = buildClassName(\n 'symbol-set-button sticker-set-button',\n index === activeSetIndex && 'activated',\n );\n\n if (stickerSet.id === 'recent' || stickerSet.id === 'favorite' || stickerSet.hasThumbnail || !firstSticker) {\n return (\n selectStickerSet(index)}\n >\n {stickerSet.id === 'recent' ? (\n \n ) : stickerSet.id === 'favorite' ? (\n \n ) : stickerSet.isAnimated ? (\n \n ) : (\n \n )}\n \n );\n } else {\n return (\n \n );\n }\n }\n\n const fullClassName = buildClassName('StickerPicker', className);\n\n if (!areAddedLoaded || !canRenderContents || noPopulatedSets || !canSendStickers) {\n return (\n
\n {!canSendStickers ? (\n
Sending stickers is not allowed in this chat.
\n ) : noPopulatedSets ? (\n
You have no saved Stickers.
\n ) : (\n \n )}\n
\n );\n }\n\n return (\n
\n \n {allSets.map(renderCover)}\n
\n \n {allSets.map((stickerSet, i) => (\n = i - 1 && activeSetIndex <= i + 1}\n onStickerSelect={handleStickerSelect}\n onStickerUnfave={handleStickerUnfave}\n />\n ))}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n setsById,\n added,\n recent,\n favorite,\n } = global.stickers;\n\n return {\n recentStickers: recent.stickers,\n favoriteStickers: favorite.stickers,\n stickerSetsById: setsById,\n addedSetIds: added.setIds,\n shouldPlay: global.settings.byKey.shouldLoopStickers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadStickerSets',\n 'loadRecentStickers',\n 'loadFavoriteStickers',\n 'loadAddedStickers',\n 'addRecentSticker',\n 'unfaveSticker',\n ]),\n)(StickerPicker));\n","import React, {\n FC, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiVideo } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useVideoCleanup from '../../hooks/useVideoCleanup';\nimport useBuffering from '../../hooks/useBuffering';\nimport useCanvasBlur from '../../hooks/useCanvasBlur';\n\nimport Spinner from '../ui/Spinner';\n\nimport './GifButton.scss';\n\ntype OwnProps = {\n gif: ApiVideo;\n observeIntersection: ObserveFn;\n isDisabled?: boolean;\n className?: string;\n onClick: (gif: ApiVideo) => void;\n};\n\nconst GifButton: FC = ({\n gif, observeIntersection, isDisabled, className, onClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n\n const hasThumbnail = gif.thumbnail && !!gif.thumbnail.dataUri;\n const localMediaHash = `gif${gif.id}`;\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n const loadAndPlay = isIntersecting && !isDisabled;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const thumbRef = useCanvasBlur(gif.thumbnail && gif.thumbnail.dataUri, Boolean(previewBlobUrl));\n const videoData = useMedia(localMediaHash, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const shouldRenderVideo = Boolean(loadAndPlay && videoData);\n const { transitionClassNames } = useTransitionForMedia(hasThumbnail || previewBlobUrl || videoData, 'slow');\n const { isBuffered, bufferingHandlers } = useBuffering(true);\n const shouldRenderSpinner = loadAndPlay && !isBuffered;\n\n useVideoCleanup(videoRef, [shouldRenderVideo]);\n\n const handleClick = useCallback(\n () => onClick({\n ...gif,\n blobUrl: videoData,\n }),\n [onClick, gif, videoData],\n );\n\n const fullClassName = buildClassName(\n 'GifButton',\n gif.width && gif.height && gif.width < gif.height ? 'vertical' : 'horizontal',\n transitionClassNames,\n localMediaHash,\n className,\n );\n\n return (\n \n {hasThumbnail && (\n \n )}\n {!hasThumbnail && previewBlobUrl && (\n \n )}\n {(shouldRenderVideo || previewBlobUrl) && (\n \n \n \n )}\n {shouldRenderSpinner && (\n \n )}\n \n );\n};\n\nexport default memo(GifButton);\n","import React, {\n FC, useEffect, memo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiVideo } from '../../../api/types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport Loading from '../../ui/Loading';\nimport GifButton from '../../common/GifButton';\n\nimport './GifPicker.scss';\n\ntype OwnProps = {\n className: string;\n loadAndPlay: boolean;\n canSendGifs: boolean;\n onGifSelect: (gif: ApiVideo) => void;\n};\n\ntype StateProps = {\n savedGifs?: ApiVideo[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifPicker: FC = ({\n className,\n loadAndPlay,\n canSendGifs,\n savedGifs,\n onGifSelect,\n loadSavedGifs,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE });\n\n useEffect(() => {\n if (loadAndPlay) {\n loadSavedGifs();\n }\n }, [loadAndPlay, loadSavedGifs]);\n\n const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION);\n\n return (\n \n {!canSendGifs ? (\n
Sending GIFs is not allowed in this chat.
\n ) : canRenderContents && savedGifs && savedGifs.length ? (\n savedGifs.map((gif) => (\n \n ))\n ) : canRenderContents && savedGifs ? (\n
No saved GIFs.
\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n savedGifs: global.gifs.saved.gifs,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadSavedGifs']),\n)(GifPicker));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\n\ntype OwnProps = {\n activeTab: SymbolMenuTabs;\n onSwitchTab: (tab: SymbolMenuTabs) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n};\n\nexport enum SymbolMenuTabs {\n 'Emoji',\n 'Stickers',\n 'GIFs',\n}\n\n// Getting enum string values for display in Tabs.\n// See: https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings\nexport const SYMBOL_MENU_TAB_TITLES = Object.values(SymbolMenuTabs)\n .filter((value): value is string => typeof value === 'string');\n\nconst SYMBOL_MENU_TAB_ICONS = {\n [SymbolMenuTabs.Emoji]: 'icon-smile',\n [SymbolMenuTabs.Stickers]: 'icon-stickers',\n [SymbolMenuTabs.GIFs]: 'icon-gifs',\n};\n\nconst SymbolMenuFooter: FC = ({\n activeTab, onSwitchTab, onRemoveSymbol, onSearchOpen,\n}) => {\n const lang = useLang();\n\n function renderTabButton(tab: SymbolMenuTabs) {\n return (\n onSwitchTab(tab)}\n ariaLabel={SYMBOL_MENU_TAB_TITLES[tab]}\n round\n faded\n color=\"translucent\"\n >\n \n \n );\n }\n\n const handleSearchOpen = useCallback(() => {\n onSearchOpen(activeTab === SymbolMenuTabs.Stickers ? 'stickers' : 'gifs');\n }, [activeTab, onSearchOpen]);\n\n function stopPropagation(event: any) {\n event.stopPropagation();\n }\n\n return (\n
\n {activeTab !== SymbolMenuTabs.Emoji && (\n \n \n \n )}\n\n {renderTabButton(SymbolMenuTabs.Emoji)}\n {renderTabButton(SymbolMenuTabs.Stickers)}\n {renderTabButton(SymbolMenuTabs.GIFs)}\n\n {activeTab === SymbolMenuTabs.Emoji && (\n \n \n \n )}\n
\n );\n};\n\nexport default memo(SymbolMenuFooter);\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker, ApiVideo } from '../../../api/types';\n\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../util/environment';\nimport { fastRaf } from '../../../util/schedulers';\nimport buildClassName from '../../../util/buildClassName';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Menu from '../../ui/Menu';\nimport Transition from '../../ui/Transition';\nimport EmojiPicker from './EmojiPicker';\nimport StickerPicker from './StickerPicker';\nimport GifPicker from './GifPicker';\nimport SymbolMenuFooter, { SYMBOL_MENU_TAB_TITLES, SymbolMenuTabs } from './SymbolMenuFooter';\nimport Portal from '../../ui/Portal';\n\nimport './SymbolMenu.scss';\n\nconst ANIMATION_DURATION = 350;\n\nexport type OwnProps = {\n isOpen: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n onLoad: () => void;\n onClose: () => void;\n onEmojiSelect: (emoji: string) => void;\n onStickerSelect: (sticker: ApiSticker, shouldPreserveInput?: boolean) => void;\n onGifSelect: (gif: ApiVideo) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n addRecentEmoji: AnyToVoidFunction;\n};\n\ntype StateProps = {\n isLeftColumnShown: boolean;\n};\n\nlet isActivated = false;\n\nconst SymbolMenu: FC = ({\n isOpen, allowedAttachmentOptions, isLeftColumnShown,\n onLoad, onClose,\n onEmojiSelect, onStickerSelect, onGifSelect,\n onRemoveSymbol, onSearchOpen, addRecentEmoji,\n}) => {\n const [activeTab, setActiveTab] = useState(0);\n const [recentEmojis, setRecentEmojis] = useState([]);\n\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose, undefined, IS_SINGLE_COLUMN_LAYOUT);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onClose, false, false);\n\n if (!isActivated && isOpen) {\n isActivated = true;\n }\n\n useEffect(() => {\n onLoad();\n }, [onLoad]);\n\n useLayoutEffect(() => {\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n return undefined;\n }\n\n if (isOpen) {\n document.body.classList.add('enable-symbol-menu-transforms');\n document.body.classList.add('is-symbol-menu-open');\n }\n\n return () => {\n if (isOpen) {\n fastRaf(() => {\n document.body.classList.remove('is-symbol-menu-open');\n setTimeout(() => {\n document.body.classList.remove('enable-symbol-menu-transforms');\n }, ANIMATION_DURATION);\n });\n }\n };\n }, [isOpen]);\n\n const recentEmojisRef = useRef(recentEmojis);\n recentEmojisRef.current = recentEmojis;\n useEffect(() => {\n if (!recentEmojisRef.current.length) {\n return;\n }\n\n recentEmojisRef.current.forEach((name) => {\n addRecentEmoji({ emoji: name });\n });\n\n setRecentEmojis([]);\n }, [isOpen, activeTab, addRecentEmoji]);\n\n const handleEmojiSelect = useCallback((emoji: string, name: string) => {\n setRecentEmojis((emojis) => {\n return [...emojis, name];\n });\n\n onEmojiSelect(emoji);\n }, [onEmojiSelect]);\n\n const handleSearch = useCallback((type: 'stickers' | 'gifs') => {\n onClose();\n onSearchOpen(type);\n }, [onClose, onSearchOpen]);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n onStickerSelect(sticker, true);\n }, [onStickerSelect]);\n\n const lang = useLang();\n\n const { canSendStickers, canSendGifs } = allowedAttachmentOptions;\n\n function renderContent(isActive: boolean, isFrom: boolean) {\n switch (activeTab) {\n case SymbolMenuTabs.Emoji:\n return (\n \n );\n case SymbolMenuTabs.Stickers:\n return (\n \n );\n case SymbolMenuTabs.GIFs:\n return (\n \n );\n }\n\n return undefined;\n }\n\n function stopPropagation(event: any) {\n event.stopPropagation();\n }\n\n const content = (\n <>\n
\n {isActivated && (\n \n {renderContent}\n \n )}\n
\n {IS_SINGLE_COLUMN_LAYOUT && (\n \n \n \n )}\n \n \n );\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'SymbolMenu mobile-menu',\n transitionClassNames,\n !isLeftColumnShown && 'middle-column-open',\n );\n\n return (\n \n
\n {content}\n
\n
\n );\n }\n\n return (\n \n {content}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n isLeftColumnShown: global.isLeftColumnShown,\n };\n },\n)(SymbolMenu));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { CONTENT_TYPES_FOR_QUICK_UPLOAD } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './AttachMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n onFileSelect: (files: File[], isQuick: boolean) => void;\n onPollCreate: () => void;\n onClose: () => void;\n};\n\nconst AttachMenu: FC = ({\n isOpen, allowedAttachmentOptions, onFileSelect, onPollCreate, onClose,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n const handleFileSelect = useCallback((e: Event, isQuick: boolean) => {\n const { files } = e.target as HTMLInputElement;\n\n if (files && files.length > 0) {\n onFileSelect(Array.from(files), isQuick);\n }\n }, [onFileSelect]);\n\n const handleQuickSelect = useCallback(() => {\n openSystemFilesDialog(\n Array.from(CONTENT_TYPES_FOR_QUICK_UPLOAD).join(','),\n (e) => handleFileSelect(e, true),\n );\n }, [handleFileSelect]);\n\n const handleDocumentSelect = useCallback(() => {\n openSystemFilesDialog('*', (e) => handleFileSelect(e, false));\n }, [handleFileSelect]);\n\n const lang = useLang();\n\n const { canAttachMedia, canAttachPolls } = allowedAttachmentOptions;\n\n return (\n \n {/*\n ** Using ternary operator here causes some attributes from first clause\n ** transferring to the fragment content in the second clause\n */}\n {!canAttachMedia && (\n Posting media content is not allowed in this group.\n )}\n {canAttachMedia && (\n <>\n \n {lang('AttachmentMenu.PhotoOrVideo')}\n \n {lang('AttachDocument')}\n \n )}\n {canAttachPolls && (\n {lang('Poll')}\n )}\n \n );\n};\n\nexport default memo(AttachMenu);\n","import React, {\n FC, memo, useEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { STICKER_SIZE_PICKER } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport Loading from '../../ui/Loading';\nimport StickerButton from '../../common/StickerButton';\n\nimport './StickerTooltip.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n stickers?: ApiSticker[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerTooltip: FC = ({\n isOpen,\n onStickerSelect,\n stickers,\n clearStickersForEmoji,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n const prevStickers = usePrevious(stickers, true);\n const displayedStickers = stickers || prevStickers;\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE });\n\n useEffect(() => (isOpen ? captureEscKeyListener(clearStickersForEmoji) : undefined), [isOpen, clearStickersForEmoji]);\n\n const handleMouseEnter = () => {\n document.body.classList.add('no-select');\n };\n\n const handleMouseLeave = () => {\n document.body.classList.remove('no-select');\n };\n\n const className = buildClassName(\n 'StickerTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n !(displayedStickers && displayedStickers.length) && 'hidden',\n );\n\n return (\n \n {shouldRender && displayedStickers ? (\n displayedStickers.map((sticker) => (\n \n ))\n ) : shouldRender ? (\n \n ) : undefined}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { stickers } = global.stickers.forEmoji;\n\n return { stickers };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['clearStickersForEmoji']),\n)(StickerTooltip));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport { selectChatMessage, selectCurrentMessageList } from '../../../modules/selectors';\nimport useMouseInside from '../../../hooks/useMouseInside';\n\nimport Menu from '../../ui/Menu';\nimport Button from '../../ui/Button';\n\nimport './BotKeyboardMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n messageId: number;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n message?: ApiMessage;\n};\n\ntype DispatchProps = Pick;\n\nconst BotKeyboardMenu: FC = ({\n isOpen, message, onClose, clickInlineButton,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n if (!message || !message.keyboardButtons) {\n return undefined;\n }\n\n return (\n \n
\n {message.keyboardButtons.map((row) => (\n
\n {row.map((button) => (\n clickInlineButton({ button })}\n >\n {button.text}\n \n ))}\n
\n ))}\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { messageId }): StateProps => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return {};\n }\n\n return { message: selectChatMessage(global, chatId, messageId) };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'clickInlineButton',\n ]),\n)(BotKeyboardMenu));\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './CustomSendMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onSilentSend?: NoneToVoidFunction;\n onScheduleSend?: NoneToVoidFunction;\n onClose: NoneToVoidFunction;\n onCloseAnimationEnd?: NoneToVoidFunction;\n};\n\nconst CustomSendMenu: FC = ({\n isOpen, onSilentSend, onScheduleSend, onClose, onCloseAnimationEnd,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n const lang = useLang();\n\n return (\n \n {onSilentSend && {lang('SendWithoutSound')}}\n {onScheduleSend && {lang('ScheduleMessage')}}\n \n );\n};\n\nexport default memo(CustomSendMenu);\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport cycleRestrict from '../../../util/cycleRestrict';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport findInViewport from '../../../util/findInViewport';\nimport isFullyVisible from '../../../util/isFullyVisible';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevDuringAnimation from '../../../hooks/usePrevDuringAnimation';\n\nimport Loading from '../../ui/Loading';\nimport EmojiButton from './EmojiButton';\n\nimport './EmojiTooltip.scss';\n\nconst VIEWPORT_MARGIN = 8;\nconst EMOJI_BUTTON_WIDTH = 44;\nconst CLOSE_DURATION = 350;\nconst NO_EMOJI_SELECTED_INDEX = -1;\n\nfunction setItemVisible(index: number, containerRef: Record) {\n const container = containerRef.current!;\n if (!container) {\n return;\n }\n\n const { visibleIndexes, allElements } = findInViewport(\n container,\n '.EmojiButton',\n VIEWPORT_MARGIN,\n true,\n true,\n true,\n );\n\n if (!allElements.length || !allElements[index]) {\n return;\n }\n const first = visibleIndexes[0];\n if (!visibleIndexes.includes(index)\n || (index === first && !isFullyVisible(container, allElements[first], true))) {\n const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';\n const newLeft = position === 'start' ? index * EMOJI_BUTTON_WIDTH : 0;\n\n fastSmoothScrollHorizontal(container, newLeft);\n }\n}\n\nexport type OwnProps = {\n isOpen: boolean;\n onEmojiSelect: (text: string) => void;\n onClose: NoneToVoidFunction;\n addRecentEmoji: AnyToVoidFunction;\n emojis: Emoji[];\n};\n\nconst EmojiTooltip: FC = ({\n isOpen,\n emojis,\n onClose,\n onEmojiSelect,\n addRecentEmoji,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n const listEmojis: Emoji[] = usePrevDuringAnimation(emojis.length ? emojis : undefined, CLOSE_DURATION) || [];\n\n const [selectedIndex, setSelectedIndex] = useState(NO_EMOJI_SELECTED_INDEX);\n\n useEffect(() => {\n setSelectedIndex(0);\n }, [emojis]);\n\n useEffect(() => {\n setItemVisible(selectedIndex, containerRef);\n }, [selectedIndex]);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!emojis.length) {\n return NO_EMOJI_SELECTED_INDEX;\n }\n\n const emojisCount = emojis.length;\n return cycleRestrict(emojisCount, newIndex);\n }, [emojis]);\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n e.preventDefault();\n setSelectedIndex((index) => (getSelectedIndex(index + value)));\n }, [setSelectedIndex, getSelectedIndex]);\n\n const handleSelectEmoji = useCallback((e: KeyboardEvent) => {\n if (emojis.length && selectedIndex > NO_EMOJI_SELECTED_INDEX) {\n const emoji = emojis[selectedIndex];\n if (emoji) {\n e.preventDefault();\n onEmojiSelect(emoji.native);\n addRecentEmoji({ emoji: emoji.id });\n }\n }\n }, [addRecentEmoji, emojis, onEmojiSelect, selectedIndex]);\n\n const handleClick = useCallback((native: string, id: string) => {\n onEmojiSelect(native);\n addRecentEmoji({ emoji: id });\n }, [addRecentEmoji, onEmojiSelect]);\n\n useEffect(() => (isOpen ? captureKeyboardListeners({\n onEsc: onClose,\n onLeft: (e: KeyboardEvent) => handleArrowKey(-1, e),\n onRight: (e: KeyboardEvent) => handleArrowKey(1, e),\n onEnter: handleSelectEmoji,\n }) : undefined), [handleArrowKey, handleSelectEmoji, isOpen, onClose]);\n\n const handleMouseEnter = () => {\n document.body.classList.add('no-select');\n };\n\n const handleMouseLeave = () => {\n document.body.classList.remove('no-select');\n };\n\n const className = buildClassName(\n 'EmojiTooltip composer-tooltip custom-scroll-x',\n transitionClassNames,\n );\n\n return (\n \n {shouldRender && listEmojis ? (\n listEmojis.map((emoji, index) => (\n \n ))\n ) : shouldRender ? (\n \n ) : undefined}\n \n );\n};\n\nexport default memo(EmojiTooltip);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\n\nimport { ApiWebDocument } from '../../../../api/types';\n\nimport { getFirstLetters } from '../../../../util/textFormat';\nimport renderText from '../../../common/helpers/renderText';\nimport useMedia from '../../../../hooks/useMedia';\n\nimport ListItem from '../../../ui/ListItem';\n\nimport './BaseResult.scss';\n\nexport type OwnProps = {\n focus?: boolean;\n thumbnail?: ApiWebDocument;\n thumbUrl?: string;\n title?: string;\n description?: string;\n transitionClassNames?: string;\n onClick: NoneToVoidFunction;\n};\n\nconst BaseResult: FC = ({\n title,\n description,\n thumbnail,\n thumbUrl,\n focus,\n transitionClassNames = '',\n onClick,\n}) => {\n let content: string | undefined = '';\n\n const thumbnailDataUrl = useMedia(thumbnail ? `webDocument:${thumbnail.url}` : undefined);\n thumbUrl = thumbUrl || thumbnailDataUrl;\n\n if (thumbUrl) {\n content = (\n \"\"\n );\n } else if (title) {\n content = getFirstLetters(title, 1);\n }\n\n return (\n \n \n {typeof content === 'string' ? renderText(content) : content}\n \n
\n {title && (
{title}
)}\n {description && (
{description}
)}\n
\n \n );\n};\n\nexport default memo(BaseResult);\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport {\n ApiBotInlineMediaResult, ApiBotInlineResult, ApiPhoto, ApiThumbnail, ApiWebDocument,\n} from '../../../../api/types';\n\nimport useMedia from '../../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../../hooks/useTransitionForMedia';\n\nimport BaseResult from './BaseResult';\n\nimport './MediaResult.scss';\n\nexport type OwnProps = {\n focus?: boolean;\n isForGallery?: boolean;\n inlineResult: ApiBotInlineMediaResult | ApiBotInlineResult;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst MediaResult: FC = ({\n focus, isForGallery, inlineResult, onClick,\n}) => {\n let photo: ApiPhoto | undefined;\n let thumbnail: ApiThumbnail | undefined;\n let webThumbnail: ApiWebDocument | undefined;\n\n if ('photo' in inlineResult) {\n photo = inlineResult.photo;\n }\n // For results with type=video (for example @stikstokbot)\n if ('thumbnail' in inlineResult) {\n thumbnail = inlineResult.thumbnail;\n }\n if ('webThumbnail' in inlineResult && isForGallery) {\n webThumbnail = inlineResult.webThumbnail;\n }\n\n const thumbnailDataUrl = useMedia(webThumbnail ? `webDocument:${webThumbnail.url}` : undefined);\n const mediaBlobUrl = useMedia(photo && `photo${photo.id}?size=m`);\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(mediaBlobUrl, 'slow');\n\n const handleClick = useCallback(() => {\n onClick(inlineResult);\n }, [inlineResult, onClick]);\n\n if (isForGallery) {\n return (\n
\n {shouldRenderThumb && (\n \"\"\n )}\n {shouldRenderFullMedia && (\n \"\"\n )}\n
\n );\n }\n\n const { title, description } = inlineResult;\n\n return (\n \n );\n};\n\nexport default memo(MediaResult);\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport { ApiBotInlineResult } from '../../../../api/types';\n\nimport BaseResult from './BaseResult';\n\nexport type OwnProps = {\n focus?: boolean;\n inlineResult: ApiBotInlineResult;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst ArticleResult: FC = ({ focus, inlineResult, onClick }) => {\n const {\n title, url, description, webThumbnail,\n } = inlineResult;\n\n const handleClick = useCallback(() => {\n onClick(inlineResult);\n }, [inlineResult, onClick]);\n\n return (\n \n );\n};\n\nexport default memo(ArticleResult);\n","import React, {\n FC, memo, useCallback,\n} from '../../../../lib/teact/teact';\n\nimport { ApiBotInlineMediaResult, ApiBotInlineResult } from '../../../../api/types';\n\nimport { ObserveFn } from '../../../../hooks/useIntersectionObserver';\n\nimport GifButton from '../../../common/GifButton';\n\ntype OwnProps = {\n inlineResult: ApiBotInlineMediaResult;\n observeIntersection: ObserveFn;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst GifResult: FC = ({\n inlineResult, observeIntersection, onClick,\n}) => {\n const { gif } = inlineResult;\n\n const handleClick = useCallback(() => {\n onClick(inlineResult);\n }, [inlineResult, onClick]);\n\n if (!gif) {\n return undefined;\n }\n\n return (\n \n );\n};\n\nexport default memo(GifResult);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\n\nimport { ApiBotInlineMediaResult, ApiBotInlineResult } from '../../../../api/types';\n\nimport { STICKER_SIZE_INLINE_BOT_RESULT } from '../../../../config';\nimport { ObserveFn } from '../../../../hooks/useIntersectionObserver';\n\nimport StickerButton from '../../../common/StickerButton';\n\ntype OwnProps = {\n inlineResult: ApiBotInlineMediaResult;\n observeIntersection: ObserveFn;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst StickerResult: FC = ({ inlineResult, observeIntersection, onClick }) => {\n const { sticker } = inlineResult;\n\n if (!sticker) {\n return undefined;\n }\n\n return (\n \n );\n};\n\nexport default memo(StickerResult);\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiBotInlineMediaResult, ApiBotInlineResult, ApiBotInlineSwitchPm } from '../../../api/types';\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport setTooltipItemVisible from '../../../util/setTooltipItemVisible';\nimport buildClassName from '../../../util/buildClassName';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport cycleRestrict from '../../../util/cycleRestrict';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport MediaResult from './inlineResults/MediaResult';\nimport ArticleResult from './inlineResults/ArticleResult';\nimport GifResult from './inlineResults/GifResult';\nimport StickerResult from './inlineResults/StickerResult';\nimport ListItem from '../../ui/ListItem';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\n\nimport './InlineBotTooltip.scss';\n\nconst INTERSECTION_DEBOUNCE_MS = 200;\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nexport type OwnProps = {\n isOpen: boolean;\n botId?: number;\n isGallery?: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n inlineBotResults?: (ApiBotInlineResult | ApiBotInlineMediaResult)[];\n switchPm?: ApiBotInlineSwitchPm;\n onSelectResult: (inlineResult: ApiBotInlineMediaResult | ApiBotInlineResult) => void;\n loadMore: NoneToVoidFunction;\n onClose: NoneToVoidFunction;\n};\n\ntype DispatchProps = Pick;\n\nconst InlineBotTooltip: FC = ({\n isOpen,\n botId,\n isGallery,\n inlineBotResults,\n switchPm,\n loadMore,\n onClose,\n openChat,\n sendBotCommand,\n onSelectResult,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({\n rootRef: containerRef,\n debounceMs: INTERSECTION_DEBOUNCE_MS,\n isDisabled: !isOpen,\n });\n\n useEffect(() => {\n setSelectedIndex(isGallery ? -1 : 0);\n }, [inlineBotResults, isGallery]);\n\n useEffect(() => {\n setTooltipItemVisible('.chat-item-clickable', selectedIndex, containerRef);\n }, [selectedIndex]);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!inlineBotResults || !inlineBotResults.length) {\n return -1;\n }\n\n return cycleRestrict(inlineBotResults.length, newIndex);\n }, [inlineBotResults]);\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n if (isGallery) {\n return;\n }\n\n e.preventDefault();\n setSelectedIndex((index) => (getSelectedIndex(index + value)));\n }, [isGallery, getSelectedIndex]);\n\n const handleSelectInlineBotResult = useCallback((e: KeyboardEvent) => {\n if (inlineBotResults && inlineBotResults.length && selectedIndex > -1) {\n const inlineResult = inlineBotResults[selectedIndex];\n if (inlineResult) {\n e.preventDefault();\n onSelectResult(inlineResult);\n }\n }\n }, [inlineBotResults, onSelectResult, selectedIndex]);\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (direction === LoadMoreDirection.Backwards) {\n runThrottled(loadMore);\n }\n }, [loadMore]);\n\n\n useEffect(() => (isOpen ? captureKeyboardListeners({\n onEsc: onClose,\n onUp: (e: KeyboardEvent) => handleArrowKey(-1, e),\n onDown: (e: KeyboardEvent) => handleArrowKey(1, e),\n onEnter: handleSelectInlineBotResult,\n }) : undefined), [handleArrowKey, handleSelectInlineBotResult, isGallery, isOpen, onClose]);\n\n const handleSendPm = useCallback(() => {\n openChat({ id: botId });\n sendBotCommand({ chatId: botId, command: `/start ${switchPm!.startParam}` });\n }, [botId, openChat, sendBotCommand, switchPm]);\n\n\n const prevInlineBotResults = usePrevious(\n inlineBotResults && inlineBotResults.length\n ? inlineBotResults\n : undefined,\n shouldRender,\n );\n const renderedInlineBotResults = inlineBotResults && !inlineBotResults.length\n ? prevInlineBotResults\n : inlineBotResults;\n\n if (!shouldRender || !renderedInlineBotResults || (!renderedInlineBotResults.length && !switchPm)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'InlineBotTooltip composer-tooltip',\n IS_TOUCH_ENV ? 'no-scrollbar' : 'custom-scroll',\n isGallery && 'gallery',\n transitionClassNames,\n );\n\n function renderSwitchPm() {\n return (\n \n {switchPm!.text}\n \n );\n }\n\n function renderContent() {\n return renderedInlineBotResults!.map((inlineBotResult, index) => {\n switch (inlineBotResult.type) {\n case 'gif':\n return (\n \n );\n\n case 'photo':\n return (\n \n );\n\n case 'sticker':\n return (\n \n );\n\n case 'video':\n case 'game':\n return (\n \n );\n case 'article':\n case 'audio':\n return (\n \n );\n\n default:\n return undefined;\n }\n });\n }\n\n return (\n \n {switchPm && renderSwitchPm()}\n {renderContent()}\n \n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'sendBotCommand', 'openChat', 'sendInlineBotResult',\n ]),\n)(InlineBotTooltip));\n","import React, {\n FC, useMemo, memo, useRef,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiUser, ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport {\n selectUser,\n selectChatMessages,\n selectChat,\n selectCurrentTextSearch,\n} from '../../modules/selectors';\nimport {\n getMessageSummaryText,\n getChatTitle,\n getUserFullName,\n isChatChannel,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport { orderBy, pick } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport ListItem from '../ui/ListItem';\nimport LastMessageMeta from '../common/LastMessageMeta';\nimport Avatar from '../common/Avatar';\n\nimport './RightSearch.scss';\n\nexport type OwnProps = {\n chatId: number;\n threadId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n messagesById?: Record;\n query?: string;\n totalCount?: number;\n foundIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\ninterface Result {\n message: ApiMessage;\n senderUser?: ApiUser;\n senderChat?: ApiChat;\n onClick: NoneToVoidFunction;\n}\n\nconst RightSearch: FC = ({\n chatId,\n threadId,\n onClose,\n isActive,\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n searchTextMessagesLocal,\n focusMessage,\n}) => {\n const lang = useLang();\n\n const foundResults = useMemo(() => {\n if (!query || !foundIds || !foundIds.length || !messagesById) {\n return MEMO_EMPTY_ARRAY;\n }\n\n const results = foundIds.map((id) => {\n const message = messagesById[id];\n if (!message) {\n return undefined;\n }\n\n const senderUser = message.senderId ? selectUser(getGlobal(), message.senderId) : undefined;\n\n let senderChat;\n if (chat && isChatChannel(chat)) {\n senderChat = chat;\n } else if (message.forwardInfo) {\n const { isChannelPost, fromChatId } = message.forwardInfo;\n senderChat = isChannelPost && fromChatId ? selectChat(getGlobal(), fromChatId) : undefined;\n } else {\n senderChat = message.senderId ? selectChat(getGlobal(), message.senderId) : undefined;\n }\n\n return {\n message,\n senderUser,\n senderChat,\n onClick: () => focusMessage({ chatId, threadId, messageId: id }),\n };\n }).filter(Boolean) as Result[];\n\n return orderBy(results, ({ message }) => message.date, 'desc');\n }, [chatId, threadId, focusMessage, foundIds, chat, messagesById, query]);\n\n const renderSearchResult = ({\n message, senderUser, senderChat, onClick,\n }: Result) => {\n const title = senderChat ? getChatTitle(lang, senderChat) : getUserFullName(senderUser);\n const text = getMessageSummaryText(lang, message);\n\n return (\n \n \n
\n
\n

{title && renderText(title)}

\n \n
\n
\n {renderText(text, ['emoji', 'highlight'], { highlight: query })}\n
\n
\n \n );\n };\n\n useHistoryBack(isActive, onClose);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, true, (index) => {\n const foundResult = foundResults && foundResults[index === -1 ? 0 : index];\n if (foundResult) {\n foundResult.onClick();\n }\n }, '.ListItem-button', true);\n\n return (\n \n

\n {!query ? (\n lang('lng_dlg_search_for_messages')\n ) : (totalCount === 0 || !foundResults.length) ? (\n lang('lng_search_no_results')\n ) : totalCount === 1 ? (\n '1 message found'\n ) : (\n `${(foundResults.length && (totalCount || foundResults.length))} messages found`\n )}\n

\n {foundResults.map(renderSearchResult)}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const messagesById = chat && selectChatMessages(global, chat.id);\n if (!chat || !messagesById) {\n return {};\n }\n\n const { query, results } = selectCurrentTextSearch(global) || {};\n const { totalCount, foundIds } = results || {};\n\n return {\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n };\n },\n (global, actions): DispatchProps => pick(actions, ['searchTextMessagesLocal', 'focusMessage']),\n)(RightSearch));\n","import React, {\n FC, useEffect, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiStickerSet } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport { ObserveFn } from '../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_SEARCH } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport { selectShouldLoopStickers, selectStickerSet } from '../../modules/selectors';\nimport useFlag from '../../hooks/useFlag';\nimport useOnChange from '../../hooks/useOnChange';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport StickerButton from '../common/StickerButton';\nimport StickerSetModal from '../common/StickerSetModal.async';\nimport Spinner from '../ui/Spinner';\n\ntype OwnProps = {\n stickerSetId: string;\n observeIntersection: ObserveFn;\n isSomeModalOpen: boolean;\n onModalToggle: (isOpen: boolean) => void;\n};\n\ntype StateProps = {\n set?: ApiStickerSet;\n shouldPlay?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst STICKERS_TO_DISPLAY = 5;\n\nconst StickerSetResult: FC = ({\n stickerSetId, observeIntersection, set, shouldPlay,\n loadStickers, toggleStickerSet, isSomeModalOpen, onModalToggle,\n}) => {\n const lang = useLang();\n const isAdded = set && Boolean(set.installedDate);\n const areStickersLoaded = Boolean(set && set.stickers);\n\n const [isModalOpen, openModal, closeModal] = useFlag();\n\n useOnChange(() => {\n onModalToggle(isModalOpen);\n }, [isModalOpen, onModalToggle]);\n\n const displayedStickers = useMemo(() => {\n if (!set) {\n return [];\n }\n\n const coverStickerIds = (set.covers || []).map(({ id }) => id);\n const otherStickers = set.stickers ? set.stickers.filter(({ id }) => !coverStickerIds.includes(id)) : [];\n\n return [...set.covers || [], ...otherStickers].slice(0, STICKERS_TO_DISPLAY);\n }, [set]);\n\n useEffect(() => {\n // Featured stickers are initialized with one sticker in collection (cover of SickerSet)\n if (!areStickersLoaded && displayedStickers.length < STICKERS_TO_DISPLAY) {\n loadStickers({ stickerSetId });\n }\n }, [areStickersLoaded, displayedStickers.length, loadStickers, stickerSetId]);\n\n const handleAddClick = useCallback(() => {\n toggleStickerSet({ stickerSetId });\n }, [toggleStickerSet, stickerSetId]);\n\n if (!set) {\n return undefined;\n }\n\n const canRenderStickers = displayedStickers.length > 0;\n\n return (\n
\n
\n
\n

{set.title}

\n

{lang('Stickers', set.count, 'i')}

\n
\n \n {lang(isAdded ? 'Stickers.Installed' : 'Stickers.Install')}\n \n
\n
\n {!canRenderStickers && }\n {canRenderStickers && displayedStickers.map((sticker) => (\n \n ))}\n
\n {canRenderStickers && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { stickerSetId }): StateProps => {\n return {\n set: selectStickerSet(global, stickerSetId),\n shouldPlay: selectShouldLoopStickers(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadStickers', 'toggleStickerSet']),\n)(StickerSetResult));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport { throttle } from '../../util/schedulers';\nimport { selectCurrentStickerSearch } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Loading from '../ui/Loading';\nimport StickerSetResult from './StickerSetResult';\n\nimport './StickerSearch.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n query?: string;\n featuredIds?: string[];\n resultIds?: string[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst StickerSearch: FC = ({\n onClose,\n isActive,\n query,\n featuredIds,\n resultIds,\n loadFeaturedStickers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const lang = useLang();\n\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE });\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadFeaturedStickers();\n });\n });\n\n useHistoryBack(isActive, onClose);\n\n function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!query && featuredIds) {\n return featuredIds.map((id) => (\n \n ));\n }\n\n if (resultIds) {\n if (!resultIds.length) {\n return

Nothing found.

;\n }\n\n return resultIds.map((id) => (\n \n ));\n }\n\n return ;\n }\n\n return (\n
\n {renderContent()}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentSearch = selectCurrentStickerSearch(global);\n const { query, resultIds } = currentSearch || {};\n const { featured } = global.stickers;\n\n return {\n query,\n featuredIds: featured.setIds,\n resultIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFeaturedStickers']),\n)(StickerSearch));\n","import React, {\n FC, memo, useRef, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiVideo } from '../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport {\n selectCurrentGifSearch,\n selectChat,\n selectIsChatWithBot,\n selectCurrentMessageList,\n} from '../../modules/selectors';\nimport { getAllowedAttachmentOptions } from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport GifButton from '../common/GifButton';\nimport Loading from '../ui/Loading';\n\nimport './GifSearch.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n query?: string;\n results?: ApiVideo[];\n chat?: ApiChat;\n isChatWithBot?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst PRELOAD_BACKWARDS = 96; // GIF Search bot results are multiplied by 24\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifSearch: FC = ({\n onClose,\n isActive,\n query,\n results,\n chat,\n isChatWithBot,\n searchMoreGifs,\n sendMessage,\n setGifSearchQuery,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE });\n\n const { canSendGifs } = getAllowedAttachmentOptions(chat, isChatWithBot);\n\n const handleGifClick = useCallback((gif: ApiVideo) => {\n if (canSendGifs) {\n sendMessage({ gif });\n }\n\n if (IS_TOUCH_ENV) {\n setGifSearchQuery({ query: undefined });\n }\n }, [canSendGifs, sendMessage, setGifSearchQuery]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!results) {\n return (\n \n );\n }\n\n if (!results.length) {\n return (\n

{lang('NoGIFsFound')}

\n );\n }\n\n return results.map((gif) => (\n \n ));\n }\n\n const hasResults = Boolean(query !== undefined && results && results.length);\n\n return (\n
\n \n {renderContent()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentSearch = selectCurrentGifSearch(global);\n const { query, results } = currentSearch || {};\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const isChatWithBot = chat ? selectIsChatWithBot(global, chat) : undefined;\n\n return {\n query,\n results,\n chat,\n isChatWithBot,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['searchMoreGifs', 'sendMessage', 'setGifSearchQuery']),\n)(GifSearch));\n","import React, {\n FC, useCallback, useState, memo, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiChat,\n ApiMessage,\n ApiPollAnswer,\n ApiPollResult,\n} from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport { pick } from '../../util/iteratees';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport ShowMoreButton from '../ui/ShowMoreButton';\nimport Loading from '../ui/Loading';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\n\nimport './PollAnswerResults.scss';\n\ntype OwnProps = {\n chat: ApiChat;\n message: ApiMessage;\n answer: ApiPollAnswer;\n answerVote: ApiPollResult;\n totalVoters: number;\n};\n\ntype StateProps = {\n voters?: number[];\n offset: string;\n};\n\ntype DispatchProps = Pick;\n\nconst INITIAL_LIMIT = 4;\nconst VIEW_MORE_LIMIT = 50;\n\nconst PollAnswerResults: FC = ({\n chat,\n message,\n answer,\n answerVote,\n totalVoters,\n voters,\n offset,\n loadPollOptionResults,\n openChat,\n closePollResults,\n}) => {\n const prevVotersCount = usePrevious(answerVote.votersCount);\n const [isLoading, setIsLoading] = useState(true);\n const areVotersLoaded = Boolean(voters);\n const { option, text } = answer;\n const lang = useLang();\n\n useEffect(() => {\n // For update when new votes arrive or when the user takes back his vote\n if (!areVotersLoaded || prevVotersCount !== answerVote.votersCount) {\n loadPollOptionResults({\n chat, messageId: message.id, option, offset, limit: INITIAL_LIMIT, shouldResetVoters: true,\n });\n }\n // eslint-disable-next-line\n }, [answerVote.votersCount, areVotersLoaded]);\n\n const handleViewMoreClick = useCallback(() => {\n setIsLoading(true);\n loadPollOptionResults({\n chat, messageId: message.id, option, offset, limit: VIEW_MORE_LIMIT,\n });\n }, [chat, loadPollOptionResults, message.id, offset, option]);\n\n useEffect(() => {\n setIsLoading(false);\n }, [voters]);\n\n const handleMemberClick = useCallback((id: number) => {\n openChat({ id });\n closePollResults();\n }, [closePollResults, openChat]);\n\n function renderViewMoreButton() {\n const leftVotersCount = answerVote.votersCount - voters!.length;\n\n return answerVote.votersCount > INITIAL_LIMIT && leftVotersCount > 0 && (\n \n );\n }\n\n return (\n
\n
\n {voters\n ? voters.map((id) => (\n handleMemberClick(id)}\n >\n \n \n ))\n : }\n {voters && renderViewMoreButton()}\n
\n
\n {text}\n \n {getPercentage(answerVote.votersCount, totalVoters)}%\n \n
\n
\n );\n};\n\nfunction getPercentage(value: number, total: number) {\n return total > 0 ? ((value / total) * 100).toFixed() : 0;\n}\n\nexport default memo(withGlobal(\n (global, { answer }: OwnProps): StateProps => {\n const { voters, offsets } = global.pollResults;\n\n return {\n voters: voters && voters[answer.option],\n offset: (offsets && offsets[answer.option]) || '',\n };\n },\n (global, actions): DispatchProps => pick(actions, ['loadPollOptionResults', 'openChat', 'closePollResults']),\n)(PollAnswerResults));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiChat } from '../../api/types';\nimport { selectChat, selectChatMessage } from '../../modules/selectors';\nimport { buildCollectionByKey } from '../../util/iteratees';\nimport { getMessagePoll } from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport PollAnswerResults from './PollAnswerResults';\nimport Loading from '../ui/Loading';\n\nimport './PollResults.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n message?: ApiMessage;\n lastSyncTime?: number;\n};\n\nconst PollResults: FC = ({\n onClose,\n isActive,\n chat,\n message,\n lastSyncTime,\n}) => {\n const lang = useLang();\n useHistoryBack(isActive, onClose);\n\n if (!message || !chat) {\n return ;\n }\n\n const { summary, results } = getMessagePoll(message)!;\n if (!results.results) {\n return undefined;\n }\n\n const resultsByOption = buildCollectionByKey(results.results, 'option');\n\n return (\n
\n

{summary.question}

\n
\n {lastSyncTime && summary.answers.map((answer) => (\n \n ))}\n {!lastSyncTime && }\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n pollResults: { chatId, messageId },\n lastSyncTime,\n } = global;\n\n if (!chatId || !messageId) {\n return {};\n }\n\n const chat = selectChat(global, chatId);\n const message = selectChatMessage(global, chatId, messageId);\n\n return {\n chat,\n message,\n lastSyncTime,\n };\n },\n)(PollResults));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport {\n selectChat, selectNotifyExceptions, selectNotifySettings, selectUser,\n} from '../../../modules/selectors';\nimport { selectIsChatMuted } from '../../../modules/helpers';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\nimport './Management.scss';\n\ntype OwnProps = {\n userId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat: ApiChat;\n progress?: ManagementProgress;\n isMuted?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide first name';\n\nconst ManageUser: FC = ({\n userId,\n user,\n chat,\n progress,\n isMuted,\n updateContact,\n deleteUser,\n deleteHistory,\n closeManagement,\n openChat,\n onClose,\n isActive,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const currentFirstName = user ? (user.firstName || '') : '';\n const currentLastName = user ? (user.lastName || '') : '';\n\n const [firstName, setFirstName] = useState(currentFirstName);\n const [lastName, setLastName] = useState(currentLastName);\n const [isNotificationsEnabled, setIsNotificationsEnabled] = useState(!isMuted);\n\n useEffect(() => {\n setIsNotificationsEnabled(!isMuted);\n }, [isMuted]);\n\n useEffect(() => {\n setIsProfileFieldsTouched(false);\n closeDeleteDialog();\n }, [closeDeleteDialog, userId]);\n\n useEffect(() => {\n setFirstName(currentFirstName);\n setLastName(currentLastName);\n }, [currentFirstName, currentLastName, user]);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n closeDeleteDialog();\n }\n }, [closeDeleteDialog, progress]);\n\n const handleFirstNameChange = useCallback((e: ChangeEvent) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleNotificationChange = useCallback((e: ChangeEvent) => {\n setIsNotificationsEnabled(e.target.checked);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleProfileSave = useCallback(() => {\n const trimmedFirstName = firstName.trim();\n const trimmedLastName = lastName.trim();\n\n if (!trimmedFirstName.length) {\n setError(ERROR_FIRST_NAME_MISSING);\n }\n\n updateContact({\n userId,\n isMuted: !isNotificationsEnabled,\n firstName: trimmedFirstName,\n lastName: trimmedLastName,\n });\n }, [firstName, lastName, updateContact, userId, isNotificationsEnabled]);\n\n const handleDeleteContact = useCallback(() => {\n deleteHistory({\n chatId: chat.id,\n shouldDeleteForAll: false,\n });\n deleteUser({ userId });\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.id, closeDeleteDialog, closeManagement, deleteHistory, deleteUser, openChat, userId]);\n\n if (!user) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n
\n \n
\n
\n
\n \n {lang('DeleteContact')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId }): StateProps => {\n const user = selectUser(global, userId);\n const chat = selectChat(global, userId)!;\n const { progress } = global.management;\n const isMuted = selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global));\n\n return {\n user, chat, progress, isMuted,\n };\n },\n (global, actions): DispatchProps => pick(actions, [\n 'updateContact', 'deleteUser', 'closeManagement', 'openChat', 'deleteHistory',\n ]),\n)(ManageUser));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiMediaFormat } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { getChatAvatarHash, getHasAdminRight, isChatBasicGroup } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { selectChat } from '../../../modules/selectors';\nimport { formatInteger } from '../../../util/textFormat';\nimport { pick } from '../../../util/iteratees';\nimport renderText from '../../common/helpers/renderText';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n progress?: ManagementProgress;\n isBasicGroup: boolean;\n hasLinkedChannel: boolean;\n canChangeInfo?: boolean;\n canBanUsers?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst GROUP_TITLE_EMPTY = 'Group title can\\'t be empty';\n\n// Some checkboxes control multiple rights, and some rights are not controlled from Permissions screen,\n// so we need to define the amount manually\nconst TOTAL_PERMISSIONS_COUNT = 8;\n\nconst ManageGroup: FC = ({\n chatId,\n chat,\n progress,\n isBasicGroup,\n hasLinkedChannel,\n canChangeInfo,\n canBanUsers,\n onScreenSelect,\n togglePreHistoryHidden,\n updateChat,\n deleteChat,\n leaveChannel,\n deleteChannel,\n closeManagement,\n openChat,\n onClose,\n isActive,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const currentTitle = chat.title;\n const currentAbout = chat.fullInfo ? (chat.fullInfo.about || '') : '';\n\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [title, setTitle] = useState(currentTitle);\n const [about, setAbout] = useState(currentAbout);\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n const imageHash = getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const handleClickEditType = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatPrivacyType);\n }, [onScreenSelect]);\n\n const handleClickDiscussion = useCallback(() => {\n onScreenSelect(ManagementScreens.Discussion);\n }, [onScreenSelect]);\n\n const handleClickPermissions = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleSetPhoto = useCallback((file: File) => {\n setPhoto(file);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent) => {\n setAbout(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUpdateGroup = useCallback(() => {\n const trimmedTitle = title.trim();\n const trimmedAbout = about.trim();\n\n if (!trimmedTitle.length) {\n setError(GROUP_TITLE_EMPTY);\n return;\n }\n\n updateChat({\n chatId,\n title: trimmedTitle,\n about: trimmedAbout,\n photo,\n });\n }, [about, chatId, photo, title, updateChat]);\n\n const handleClickMembers = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupMembers);\n }, [onScreenSelect]);\n\n const handleTogglePreHistory = useCallback(() => {\n if (!chat.fullInfo) {\n return;\n }\n\n const { isPreHistoryHidden } = chat.fullInfo;\n\n togglePreHistoryHidden({ chatId: chat.id, isEnabled: !isPreHistoryHidden });\n }, [chat, togglePreHistoryHidden]);\n\n const enabledPermissionsCount = useMemo(() => {\n if (!chat.defaultBannedRights) {\n return 0;\n }\n\n let totalCount = [\n 'sendMessages',\n 'sendMedia',\n 'embedLinks',\n 'sendPolls',\n 'changeInfo',\n 'inviteUsers',\n 'pinMessages',\n ].filter(\n (key) => !chat.defaultBannedRights![key as keyof ApiChatBannedRights],\n ).length;\n\n const { sendStickers, sendGifs } = chat.defaultBannedRights;\n\n // These two rights are controlled with a single checkbox\n if (!sendStickers && !sendGifs) {\n totalCount += 1;\n }\n\n return totalCount;\n }, [chat]);\n\n const adminsCount = (chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0;\n\n const handleDeleteGroup = useCallback(() => {\n if (isBasicGroup) {\n deleteChat({ chatId: chat.id });\n } else if (!chat.isCreator) {\n leaveChannel({ chatId: chat.id });\n } else {\n deleteChannel({ chatId: chat.id });\n }\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [\n isBasicGroup, chat.isCreator, chat.id,\n closeDeleteDialog, closeManagement, leaveChannel, deleteChannel, deleteChat, openChat,\n ]);\n\n if (chat.isRestricted) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n {chat.isCreator && (\n \n {lang('GroupType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n \n )}\n {hasLinkedChannel && (\n \n {lang('LinkedChannel')}\n {lang('DiscussionUnlink')}\n \n )}\n \n {lang('ChannelPermissions')}\n \n {enabledPermissionsCount}/{TOTAL_PERMISSIONS_COUNT}\n \n \n \n {lang('ChannelAdministrators')}\n {formatInteger(adminsCount)}\n \n
\n
\n \n {lang('GroupMembers')}\n {formatInteger(chat.membersCount!)}\n \n\n {chat.fullInfo && (\n
\n \n
\n )}\n
\n
\n \n {lang('DeleteMega')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { progress } = global.management;\n const hasLinkedChannel = Boolean(chat.fullInfo && chat.fullInfo.linkedChatId);\n const isBasicGroup = isChatBasicGroup(chat);\n\n return {\n chat,\n progress,\n isBasicGroup,\n hasLinkedChannel,\n canChangeInfo: isBasicGroup ? chat.isCreator : getHasAdminRight(chat, 'changeInfo'),\n canBanUsers: isBasicGroup ? chat.isCreator : getHasAdminRight(chat, 'banUsers'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'togglePreHistoryHidden', 'updateChat', 'closeManagement',\n 'leaveChannel', 'deleteChannel', 'deleteChat', 'openChat',\n ]),\n)(ManageGroup));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiChatMember } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n currentUserId?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FLOATING_BUTTON_ANIMATION_TIMEOUT_MS = 250;\n\nfunction getLangKeyForBannedRightKey(key: string) {\n switch (key) {\n case 'sendMessages':\n return 'UserRestrictionsNoSend';\n case 'sendMedia':\n return 'UserRestrictionsNoSendMedia';\n case 'sendStickers':\n return 'UserRestrictionsNoSendStickers';\n case 'embedLinks':\n return 'UserRestrictionsNoEmbedLinks';\n case 'sendPolls':\n return 'UserRestrictionsNoSendPolls';\n case 'changeInfo':\n return 'UserRestrictionsNoChangeInfo';\n case 'inviteUsers':\n return 'UserRestrictionsInviteUsers';\n case 'pinMessages':\n return 'UserRestrictionsPinMessages';\n default:\n return undefined;\n }\n}\n\nconst ManageGroupPermissions: FC = ({\n onScreenSelect,\n onChatMemberSelect,\n chat,\n currentUserId,\n updateChatDefaultBannedRights,\n onClose,\n isActive,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const handleRemovedUsersClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupRemovedUsers);\n }, [onScreenSelect]);\n\n const handleAddExceptionClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupUserPermissionsCreate);\n }, [onScreenSelect]);\n\n const handleExceptionMemberClick = useCallback((member: ApiChatMember) => {\n onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId);\n onScreenSelect(ManagementScreens.GroupUserPermissions);\n }, [currentUserId, onChatMemberSelect, onScreenSelect]);\n\n useEffect(() => {\n setPermissions((chat && chat.defaultBannedRights) || {});\n setHavePermissionChanged(false);\n setTimeout(() => {\n setIsLoading(false);\n }, FLOATING_BUTTON_ANIMATION_TIMEOUT_MS);\n }, [chat]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as Exclude]),\n ...(name === 'sendStickers' && {\n sendGifs: getUpdatedPermissionValue(p[name]),\n }),\n }));\n setHavePermissionChanged(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!chat) {\n return;\n }\n\n setIsLoading(true);\n updateChatDefaultBannedRights({ chatId: chat.id, bannedRights: permissions });\n }, [chat, permissions, updateChatDefaultBannedRights]);\n\n const removedUsersCount = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) {\n return 0;\n }\n\n return chat.fullInfo.kickedMembers.length;\n }, [chat]);\n\n const exceptionMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.members) {\n return [];\n }\n\n return chat.fullInfo.members.filter(({ bannedRights }) => !!bannedRights);\n }, [chat]);\n\n const getMemberExceptions = useCallback((member: ApiChatMember) => {\n const { bannedRights } = member;\n if (!bannedRights || !chat) {\n return undefined;\n }\n\n const { defaultBannedRights } = chat;\n\n return Object.keys(bannedRights).reduce((result, key) => {\n if (\n !bannedRights[key as keyof ApiChatBannedRights]\n || (defaultBannedRights && defaultBannedRights[key as keyof ApiChatBannedRights])\n || key === 'sendInline' || key === 'viewMessages' || key === 'sendGames'\n ) {\n return result;\n }\n\n const langKey = getLangKeyForBannedRightKey(key);\n\n if (!langKey) {\n return result;\n }\n\n const translatedString = lang(langKey);\n\n return `${result}${!result.length ? translatedString : `, ${translatedString}`}`;\n }, '');\n }, [chat, lang]);\n\n return (\n
\n
\n
\n

{lang('ChannelPermissionsHeader')}

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n \n {lang('ChannelBlockedUsers')}\n {removedUsersCount}\n \n
\n\n
\n

{lang('PrivacyExceptions')}

\n\n \n {lang('ChannelAddException')}\n \n\n {exceptionMembers.map((member) => (\n handleExceptionMemberClick(member)}\n >\n \n \n ))}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n return { chat, currentUserId: global.currentUserId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatDefaultBannedRights']),\n)(ManageGroupPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { getUserFullName } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n usersById: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupRemovedUsers: FC = ({\n chat,\n usersById,\n updateChatMemberBannedRights,\n onClose,\n isActive,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const removedMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) {\n return [];\n }\n\n return chat.fullInfo.kickedMembers;\n }, [chat]);\n\n const getRemovedBy = useCallback((member: ApiChatMember) => {\n if (!member.kickedByUserId) {\n return undefined;\n }\n\n const kickedByUser = usersById[member.kickedByUserId];\n if (!kickedByUser) {\n return undefined;\n }\n\n return lang('UserRemovedBy', getUserFullName(kickedByUser));\n }, [lang, usersById]);\n\n const getContextActions = useCallback((member: ApiChatMember) => {\n if (!chat) {\n return undefined;\n }\n\n return [{\n title: lang('Unblock'),\n icon: 'delete',\n destructive: true,\n handler: () => updateChatMemberBannedRights({\n chatId: chat.id,\n userId: member.userId,\n bannedRights: {},\n }),\n }];\n }, [lang, chat, updateChatMemberBannedRights]);\n\n return (\n
\n
\n
\n

{lang('NoBlockedGroup2')}

\n\n {removedMembers.map((member) => (\n \n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n\n return { chat, usersById };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']),\n)(ManageGroupRemovedUsers));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiMediaFormat } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { getChatAvatarHash, getHasAdminRight } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n progress?: ManagementProgress;\n isSignaturesShown: boolean;\n canChangeInfo?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CHANNEL_TITLE_EMPTY = 'Channel title can\\'t be empty';\n\nconst ManageChannel: FC = ({\n chatId,\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo,\n onScreenSelect,\n updateChat,\n toggleSignatures,\n closeManagement,\n leaveChannel,\n deleteChannel,\n openChat,\n onClose,\n isActive,\n}) => {\n const currentTitle = chat ? (chat.title || '') : '';\n const currentAbout = chat && chat.fullInfo ? (chat.fullInfo.about || '') : '';\n const hasLinkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId;\n\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [title, setTitle] = useState(currentTitle);\n const [about, setAbout] = useState(currentAbout);\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n const imageHash = chat && getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const adminsCount = (chat && chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0;\n\n const handleClickEditType = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatPrivacyType);\n }, [onScreenSelect]);\n\n const handleClickDiscussion = useCallback(() => {\n onScreenSelect(ManagementScreens.Discussion);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleSetPhoto = useCallback((file: File) => {\n setPhoto(file);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent) => {\n setAbout(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUpdateChannel = useCallback(() => {\n const trimmedTitle = title.trim();\n const trimmedAbout = about.trim();\n\n if (!trimmedTitle.length) {\n setError(CHANNEL_TITLE_EMPTY);\n return;\n }\n\n updateChat({\n chatId,\n title: trimmedTitle,\n about: trimmedAbout,\n photo,\n });\n }, [about, chatId, photo, title, updateChat]);\n\n const handleToggleSignatures = useCallback(() => {\n toggleSignatures({ chatId, isEnabled: !isSignaturesShown });\n }, [chatId, isSignaturesShown, toggleSignatures]);\n\n const handleClickSubscribers = useCallback(() => {\n onScreenSelect(ManagementScreens.ChannelSubscribers);\n }, [onScreenSelect]);\n\n\n const handleDeleteChannel = useCallback(() => {\n if (chat.isCreator) {\n deleteChannel({ chatId: chat.id });\n } else {\n leaveChannel({ chatId: chat.id });\n }\n\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.isCreator, chat.id, closeDeleteDialog, closeManagement, leaveChannel, deleteChannel, openChat]);\n\n if (chat.isRestricted) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n {chat.isCreator && (\n \n {lang('ChannelType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n \n )}\n \n {lang('Discussion')}\n {hasLinkedChat ? lang('DiscussionUnlink') : lang('Add')}\n \n \n {lang('ChannelAdministrators')}\n {adminsCount}\n \n
\n \n
\n
\n
\n \n {lang('ChannelSubscribers')}\n {lang('Subscribers', chat.membersCount!, 'i')}\n \n
\n
\n \n {chat.isCreator ? lang('ChannelDelete') : lang('LeaveChannel')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { progress } = global.management;\n const isSignaturesShown = Boolean(chat && chat.isSignaturesShown);\n\n return {\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'toggleSignatures', 'updateChat', 'closeManagement', 'leaveChannel', 'deleteChannel', 'openChat',\n ]),\n)(ManageChannel));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { selectChat, selectManagement } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport { isChatChannel } from '../../../modules/helpers';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport SafeLink from '../../common/SafeLink';\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport Loading from '../../ui/Loading';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport UsernameInput from '../../common/UsernameInput';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype PrivacyType = 'private' | 'public';\n\ntype OwnProps = {\n chatId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n isChannel: boolean;\n progress?: ManagementProgress;\n isUsernameAvailable?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageChatPrivacyType: FC = ({\n chat,\n onClose,\n isActive,\n isChannel,\n progress,\n isUsernameAvailable,\n checkPublicLink,\n updatePublicLink,\n updatePrivateLink,\n}) => {\n const isPublic = Boolean(chat.username);\n const privateLink = chat.fullInfo && chat.fullInfo.inviteLink;\n\n const [privacyType, setPrivacyType] = useState(isPublic ? 'public' : 'private');\n const [username, setUsername] = useState();\n const [isRevokeConfirmDialogOpen, openRevokeConfirmDialog, closeRevokeConfirmDialog] = useFlag();\n\n const canUpdate = (\n (privacyType === 'public' && username && isUsernameAvailable)\n || (privacyType === 'private' && isPublic)\n );\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n if (privacyType && !privateLink) {\n updatePrivateLink();\n }\n }, [privacyType, privateLink, updatePrivateLink]);\n\n const handleOptionChange = useCallback((value: string) => {\n setPrivacyType(value as PrivacyType);\n }, []);\n\n const handleSave = useCallback(() => {\n updatePublicLink({ username: privacyType === 'public' ? username : '' });\n }, [privacyType, updatePublicLink, username]);\n\n const handleRevokePrivateLink = useCallback(() => {\n closeRevokeConfirmDialog();\n updatePrivateLink();\n }, [closeRevokeConfirmDialog, updatePrivateLink]);\n\n const lang = useLang();\n const langPrefix1 = isChannel ? 'Channel' : 'Mega';\n const langPrefix2 = isChannel ? 'Channel' : 'Group';\n\n const options = [\n { value: 'private', label: lang(`${langPrefix1}Private`), subLabel: lang(`${langPrefix1}PrivateInfo`) },\n { value: 'public', label: lang(`${langPrefix1}Public`), subLabel: lang(`${langPrefix1}PublicInfo`) },\n ];\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n

{lang(`${langPrefix2}Type`)}

\n \n
\n {privacyType === 'private' ? (\n
\n {privateLink ? (\n <>\n \n

\n {lang(`${langPrefix1}PrivateLinkHelp`)}\n

\n\n \n {lang('RevokeLink')}\n \n \n \n ) : (\n \n )}\n
\n ) : (\n
\n \n

\n {lang(`${langPrefix2}.Username.CreatePublicLinkHelp`)}\n

\n
\n )}\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { isUsernameAvailable } = selectManagement(global, chatId)!;\n\n return {\n chat,\n isChannel: isChatChannel(chat),\n progress: global.management.progress,\n isUsernameAvailable,\n };\n },\n (setGlobal, actions) => pick(actions, [\n 'checkPublicLink', 'updatePublicLink', 'updatePrivateLink',\n ]),\n)(ManageChatPrivacyType));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { STICKER_SIZE_DISCUSSION_GROUPS } from '../../../config';\nimport { selectChat } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport getAnimationData from '../../common/helpers/animatedAssets';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport AnimatedSticker from '../../common/AnimatedSticker';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport useFlag from '../../../hooks/useFlag';\nimport renderText from '../../common/helpers/renderText';\nimport Avatar from '../../common/Avatar';\nimport { isChatChannel } from '../../../modules/helpers';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n chatsByIds: Record;\n linkedChat?: ApiChat;\n forDiscussionIds?: number[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageDiscussion: FC = ({\n chat,\n onClose,\n isActive,\n chatId,\n chatsByIds,\n linkedChat,\n forDiscussionIds,\n isChannel,\n onScreenSelect,\n loadGroupsForDiscussion,\n linkDiscussionGroup,\n unlinkDiscussionGroup,\n}) => {\n const [linkedGroupId, setLinkedGroupId] = useState();\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n const [isConfirmUnlinkGroupDialogOpen, openConfirmUnlinkGroupDialog, closeConfirmUnlinkGroupDialog] = useFlag();\n const [isConfirmLinkGroupDialogOpen, openConfirmLinkGroupDialog, closeConfirmLinkGroupDialog] = useFlag();\n const lang = useLang();\n const linkedChatId = linkedChat && linkedChat.id;\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n loadGroupsForDiscussion();\n }, [loadGroupsForDiscussion]);\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('DiscussionGroups').then(setAnimationData);\n }\n }, [animationData]);\n\n const handleUnlinkGroupSessions = useCallback(() => {\n closeConfirmUnlinkGroupDialog();\n unlinkDiscussionGroup({ channelId: isChannel ? chatId : linkedChatId });\n if (!isChannel) {\n onScreenSelect(ManagementScreens.Initial);\n }\n }, [closeConfirmUnlinkGroupDialog, unlinkDiscussionGroup, isChannel, chatId, linkedChatId, onScreenSelect]);\n\n const handleLinkGroupSessions = useCallback(() => {\n closeConfirmLinkGroupDialog();\n linkDiscussionGroup({ channelId: chatId, chatId: linkedGroupId });\n }, [closeConfirmLinkGroupDialog, linkDiscussionGroup, chatId, linkedGroupId]);\n\n const onDiscussionClick = (groupId: number) => {\n setLinkedGroupId(groupId);\n openConfirmLinkGroupDialog();\n };\n\n function renderUnlinkGroupHeader() {\n return (\n
\n \n
\n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n
\n
\n );\n }\n function renderLinkGroupHeader() {\n const linkedGroup = chatsByIds[linkedGroupId];\n\n if (!linkedGroup) {\n return undefined;\n }\n\n return (\n
\n \n
\n {lang('Channel.DiscussionGroup.LinkGroup')}\n
\n
\n );\n }\n\n function renderLinkGroupConfirmText() {\n const linkedGroup = chatsByIds[linkedGroupId];\n\n if (!linkedGroup) {\n return undefined;\n }\n\n if (linkedGroup.hasPrivateLink) {\n return renderText(\n `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?`,\n ['br', 'simple_markdown'],\n );\n // return renderText(\n // lang('DiscussionLinkGroupPublicAlert', linkedChat.title, chat!.title),\n // ['br', 'simple_markdown'],\n // );\n }\n\n return renderText(\n // eslint-disable-next-line max-len\n `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?\\n\\nAnyone from the channel will be able to see messages in this group.`,\n ['br', 'simple_markdown'],\n );\n // return renderText(\n // lang('DiscussionLinkGroupPrivateAlert', linkedChat.title, chat!.title),\n // ['br', 'simple_markdown'],\n // );\n }\n\n function renderLinkedGroup() {\n return (\n
\n \n \n \n \n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n \n \n
\n );\n }\n\n function renderDiscussionGroups() {\n return (\n
\n

{lang('DiscussionChannelHelp')}

\n\n
\n \n {lang('DiscussionCreateGroup')}\n \n {forDiscussionIds ? (\n forDiscussionIds.map((id, i) => (\n { onDiscussionClick(id); }}\n >\n \n \n ))\n ) : (\n \n )}\n
\n

{lang('DiscussionChannelHelp2')}

\n \n
\n );\n }\n\n return (\n
\n
\n
\n
\n {animationData && (\n \n )}\n
\n {linkedChat && renderLinkedGroup()}\n {!linkedChat && renderDiscussionGroups()}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { forDiscussionIds, byId: chatsByIds } = global.chats;\n const linkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId\n ? selectChat(global, chat.fullInfo.linkedChatId)\n : undefined;\n\n return {\n chat,\n chatsByIds,\n forDiscussionIds,\n linkedChat,\n isChannel: chat && isChatChannel(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadGroupsForDiscussion', 'linkDiscussionGroup', 'unlinkDiscussionGroup',\n ]),\n)(ManageDiscussion));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatBannedRights } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n chatId: number;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isFormFullyDisabled?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupUserPermissions: FC = ({\n chat,\n selectedChatMemberId,\n onScreenSelect,\n updateChatMemberBannedRights,\n isFormFullyDisabled,\n onClose,\n isActive,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isBanConfirmationDialogOpen, openBanConfirmationDialog, closeBanConfirmationDialog] = useFlag();\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const selectedChatMember = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.members) {\n return undefined;\n }\n\n return chat.fullInfo.members.find(({ userId }) => userId === selectedChatMemberId);\n }, [chat, selectedChatMemberId]);\n\n useEffect(() => {\n if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember && selectedChatMember.bannedRights) || (chat && chat.defaultBannedRights) || {});\n setHavePermissionChanged(false);\n setIsLoading(false);\n }, [chat, selectedChatMember]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as Exclude]),\n ...(name === 'sendStickers' && {\n sendGifs: getUpdatedPermissionValue(p[name]),\n }),\n }));\n setHavePermissionChanged(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!chat || !selectedChatMemberId) {\n return;\n }\n\n setIsLoading(true);\n updateChatMemberBannedRights({\n chatId: chat.id,\n userId: selectedChatMemberId,\n bannedRights: permissions,\n });\n }, [chat, selectedChatMemberId, permissions, updateChatMemberBannedRights]);\n\n const handleBanFromGroup = useCallback(() => {\n if (!chat || !selectedChatMemberId) {\n return;\n }\n\n updateChatMemberBannedRights({\n chatId: chat.id,\n userId: selectedChatMemberId,\n bannedRights: {\n viewMessages: true,\n },\n });\n }, [chat, selectedChatMemberId, updateChatMemberBannedRights]);\n\n const getControlIsDisabled = useCallback((key: Exclude) => {\n if (isFormFullyDisabled) {\n return true;\n }\n\n if (!chat || !chat.defaultBannedRights) {\n return false;\n }\n\n return chat.defaultBannedRights[key];\n }, [chat, isFormFullyDisabled]);\n\n if (!selectedChatMember) {\n return undefined;\n }\n\n return (\n
\n
\n
\n \n \n \n\n

{lang('UserRestrictionsCanDo')}

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n {!isFormFullyDisabled && (\n
\n \n {lang('UserRestrictionsBlock')}\n \n
\n )}\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId, isPromotedByCurrentUser }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser);\n\n return { chat, isFormFullyDisabled };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']),\n)(ManageGroupUserPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\n\nimport { getUserFullName, isChatChannel } from '../../../modules/helpers';\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n currentUserId?: number;\n isChannel: boolean;\n usersById: Record;\n};\n\nconst ManageChatAdministrators: FC = ({\n chat,\n isChannel,\n currentUserId,\n usersById,\n onScreenSelect,\n onChatMemberSelect,\n onClose,\n isActive,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n function handleRecentActionsClick() {\n onScreenSelect(ManagementScreens.GroupRecentActions);\n }\n\n const adminMembers = useMemo(() => {\n if (!chat.fullInfo || !chat.fullInfo.adminMembers) {\n return [];\n }\n\n return chat.fullInfo.adminMembers.sort((a, b) => {\n if (a.isOwner) {\n return -1;\n } else if (b.isOwner) {\n return 1;\n }\n\n return 0;\n });\n }, [chat]);\n\n const handleAdminMemberClick = useCallback((member: ApiChatMember) => {\n onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId);\n onScreenSelect(ManagementScreens.ChatAdminRights);\n }, [currentUserId, onChatMemberSelect, onScreenSelect]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n const promotedByUser = member.promotedByUserId ? usersById[member.promotedByUserId] : undefined;\n\n if (promotedByUser) {\n return lang('EditAdminPromotedBy', getUserFullName(promotedByUser));\n }\n\n return lang('ChannelAdmin');\n }, [lang, usersById]);\n\n return (\n
\n
\n
\n \n {lang('EventLog')}\n {lang(isChannel ? 'EventLogInfoDetailChannel' : 'EventLogInfoDetail')}\n \n
\n\n
\n

\n {isChannel\n ? 'You can add administrators to help you manage your channel.'\n : 'You can add administrators to help you manage your group.'}\n

\n\n {adminMembers.map((member) => (\n handleAdminMemberClick(member)}\n >\n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { byId: usersById } = global.users;\n\n return {\n chat,\n currentUserId: global.currentUserId,\n isChannel: isChatChannel(chat),\n usersById,\n };\n },\n // (setGlobal, actions): DispatchProps => pick(actions, ['togglePreHistoryHidden', 'updateChat']),\n)(ManageChatAdministrators));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember } from '../../../api/types';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n};\n\nconst ManageGroupRecentActions: FC = ({ chat, onClose, isActive }) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const adminMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.adminMembers) {\n return [];\n }\n\n return chat.fullInfo.adminMembers.sort((a, b) => {\n if (a.isOwner) {\n return -1;\n } else if (b.isOwner) {\n return 1;\n }\n\n return 0;\n });\n }, [chat]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n return lang('ChannelAdmin');\n }, [lang]);\n\n return (\n
\n
\n
\n

Actions

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n

{lang('Channel.Management.Title')}

\n\n
\n \n
\n\n {adminMembers.map((member) => (\n \n \n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n return { chat };\n },\n)(ManageGroupRecentActions));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatAdminRights, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat } from '../../../modules/selectors';\nimport { getUserFullName, isChatBasicGroup, isChatChannel } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport InputText from '../../ui/InputText';\n\ntype OwnProps = {\n chatId: number;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n usersById: Record;\n currentUserId?: number;\n isChannel: boolean;\n isFormFullyDisabled: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CUSTOM_TITLE_MAX_LENGTH = 16;\n\nconst ManageGroupAdminRights: FC = ({\n selectedChatMemberId,\n onScreenSelect,\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n updateChatAdmin,\n onClose,\n isActive,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [isTouched, setIsTouched] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isDismissConfirmationDialogOpen, openDismissConfirmationDialog, closeDismissConfirmationDialog] = useFlag();\n const [customTitle, setCustomTitle] = useState('');\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const selectedChatMember = useMemo(() => {\n if (!chat.fullInfo || !chat.fullInfo.adminMembers) {\n return undefined;\n }\n\n return chat.fullInfo.adminMembers.find(({ userId }) => userId === selectedChatMemberId);\n }, [chat, selectedChatMemberId]);\n\n useEffect(() => {\n if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember && selectedChatMember.adminRights) || {});\n setCustomTitle(((selectedChatMember && selectedChatMember.customTitle) || '').substr(0, CUSTOM_TITLE_MAX_LENGTH));\n setIsTouched(false);\n setIsLoading(false);\n }, [selectedChatMember]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatAdminRights]),\n }));\n setIsTouched(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!selectedChatMemberId) {\n return;\n }\n\n setIsLoading(true);\n updateChatAdmin({\n chatId: chat.id,\n userId: selectedChatMemberId,\n adminRights: permissions,\n customTitle,\n });\n }, [chat, selectedChatMemberId, permissions, customTitle, updateChatAdmin]);\n\n const handleDismissAdmin = useCallback(() => {\n if (!selectedChatMemberId) {\n return;\n }\n\n updateChatAdmin({\n chatId: chat.id,\n userId: selectedChatMemberId,\n adminRights: {},\n });\n closeDismissConfirmationDialog();\n }, [chat.id, closeDismissConfirmationDialog, selectedChatMemberId, updateChatAdmin]);\n\n const getControlIsDisabled = useCallback((key: keyof ApiChatAdminRights) => {\n if (isChatBasicGroup(chat)) {\n return false;\n }\n\n if (isFormFullyDisabled || !chat.adminRights) {\n return true;\n }\n\n return !chat.adminRights![key];\n }, [chat, isFormFullyDisabled]);\n\n const memberStatus = useMemo(() => {\n if (!selectedChatMember) {\n return undefined;\n }\n\n if (selectedChatMember.isOwner) {\n return lang('ChannelCreator');\n }\n\n const promotedByUser = selectedChatMember.promotedByUserId\n ? usersById[selectedChatMember.promotedByUserId]\n : undefined;\n\n if (promotedByUser) {\n return lang('EditAdminPromotedBy', getUserFullName(promotedByUser));\n }\n\n return lang('ChannelAdmin');\n }, [selectedChatMember, usersById, lang]);\n\n const handleCustomTitleChange = useCallback((e) => {\n const { value } = e.target;\n setCustomTitle(value);\n setIsTouched(true);\n }, []);\n\n if (!selectedChatMember) {\n return undefined;\n }\n\n return (\n
\n
\n
\n \n \n \n\n

{lang('EditAdminWhatCanDo')}

\n\n
\n \n
\n {isChannel && (\n
\n \n
\n )}\n {isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n\n {isFormFullyDisabled && (\n

\n {lang('Channel.EditAdmin.CannotEdit')}\n

\n )}\n\n {!isChannel && (\n \n )}\n\n {currentUserId !== selectedChatMemberId && !isFormFullyDisabled && (\n \n {lang('EditAdminRemoveAdmin')}\n \n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId, isPromotedByCurrentUser }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { byId: usersById } = global.users;\n const { currentUserId } = global;\n const isChannel = isChatChannel(chat);\n const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser);\n\n return {\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatAdmin']),\n)(ManageGroupAdminRights));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { selectChat } from '../../../modules/selectors';\nimport { sortUserIds, isChatChannel } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport NothingFound from '../../common/NothingFound';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupMembers: FC = ({\n members,\n usersById,\n isChannel,\n openUserInfo,\n onClose,\n isActive,\n serverTimeOffset,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(members.map(({ userId }) => userId), usersById, undefined, serverTimeOffset);\n }, [members, serverTimeOffset, usersById]);\n\n const handleMemberClick = useCallback((id: number) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n useHistoryBack(isActive, onClose);\n\n return (\n
\n
\n
\n {memberIds ? (\n memberIds.map((id, i) => (\n handleMemberClick(id)}\n >\n \n \n ))\n ) : (\n \n )}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n serverTimeOffset: global.serverTimeOffset,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n ]),\n)(ManageGroupMembers));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { sortUserIds, isChatChannel } from '../../../modules/helpers';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\nconst ManageGroupUserPermissionsCreate: FC = ({\n usersById,\n members,\n isChannel,\n onScreenSelect,\n onChatMemberSelect,\n onClose,\n isActive,\n serverTimeOffset,\n}) => {\n useHistoryBack(isActive, onClose);\n\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(\n members.filter((member) => !member.isOwner).map(({ userId }) => userId),\n usersById, undefined, serverTimeOffset,\n );\n }, [members, serverTimeOffset, usersById]);\n\n const handleExceptionMemberClick = useCallback((memberId: number) => {\n onChatMemberSelect(memberId);\n onScreenSelect(ManagementScreens.GroupUserPermissions);\n }, [onChatMemberSelect, onScreenSelect]);\n\n return (\n
\n
\n
\n {memberIds ? (\n memberIds.map((id, i) => (\n handleExceptionMemberClick(id)}\n >\n \n \n ))\n ) : (\n \n )}\n
\n
\n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n serverTimeOffset: global.serverTimeOffset,\n };\n },\n)(ManageGroupUserPermissionsCreate));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementType } from '../../../types';\n\nimport { selectCurrentManagementType } from '../../../modules/selectors';\n\nimport ManageUser from './ManageUser';\nimport ManageGroup from './ManageGroup';\nimport ManageGroupPermissions from './ManageGroupPermissions';\nimport ManageGroupRemovedUsers from './ManageGroupRemovedUsers';\nimport ManageChannel from './ManageChannel';\nimport ManageChatPrivacyType from './ManageChatPrivacyType';\nimport ManageDiscussion from './ManageDiscussion';\nimport ManageGroupUserPermissions from './ManageGroupUserPermissions';\nimport ManageChatAdministrators from './ManageChatAdministrators';\nimport ManageGroupRecentActions from './ManageGroupRecentActions';\nimport ManageGroupAdminRights from './ManageGroupAdminRights';\nimport ManageGroupMembers from './ManageGroupMembers';\nimport ManageGroupUserPermissionsCreate from './ManageGroupUserPermissionsCreate';\n\nexport type OwnProps = {\n chatId: number;\n currentScreen: ManagementScreens;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n managementType?: ManagementType;\n};\n\nconst Management: FC = ({\n chatId,\n currentScreen,\n selectedChatMemberId,\n isPromotedByCurrentUser,\n onScreenSelect,\n onChatMemberSelect,\n onClose,\n isActive,\n managementType,\n}) => {\n switch (currentScreen) {\n case ManagementScreens.Initial: {\n switch (managementType) {\n case 'user':\n return (\n \n );\n case 'group':\n return (\n \n );\n case 'channel':\n return (\n \n );\n }\n\n break;\n }\n\n case ManagementScreens.ChatPrivacyType:\n return (\n \n );\n\n case ManagementScreens.Discussion:\n return (\n \n );\n\n case ManagementScreens.GroupPermissions:\n return (\n \n );\n\n case ManagementScreens.GroupRemovedUsers:\n return (\n \n );\n\n case ManagementScreens.GroupUserPermissionsCreate:\n return (\n \n );\n\n case ManagementScreens.GroupUserPermissions:\n return (\n \n );\n\n case ManagementScreens.ChatAdministrators:\n return (\n \n );\n\n case ManagementScreens.GroupRecentActions:\n return (\n \n );\n\n case ManagementScreens.ChatAdminRights:\n return (\n \n );\n\n case ManagementScreens.ChannelSubscribers:\n case ManagementScreens.GroupMembers:\n return (\n \n );\n }\n\n return undefined; // Never reached\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const managementType = selectCurrentManagementType(global);\n\n return {\n managementType,\n };\n },\n)(Management));\n","const CURRENCIES: Record = {\n USD: '$',\n EUR: '€',\n GBP: '£',\n JPY: '¥',\n RUB: '₽',\n UAH: '₴',\n INR: '₹',\n AED: 'د.إ',\n};\n\nexport function getCurrencySign(currency: string | undefined): string {\n if (!currency) {\n return '';\n }\n return CURRENCIES[currency] || '';\n}\n","const VISA = /^4[0-9]{12}(?:[0-9]{1,3})?$/;\nconst MASTERCARD1 = /^5[1-5][0-9]{11,14}$/;\nconst MASTERCARD2 = /^2[2-7][0-9]{11,14}$/;\n\nexport enum CardType {\n Default,\n Visa,\n Mastercard,\n}\n\nconst cards: Record = {\n [CardType.Default]: '',\n [CardType.Visa]: 'visa',\n [CardType.Mastercard]: 'mastercard',\n};\n\nexport function detectCardType(cardNumber: string): number {\n cardNumber = cardNumber.replace(/\\s/g, '');\n if (VISA.test(cardNumber)) {\n return CardType.Visa;\n }\n if (MASTERCARD1.test(cardNumber) || MASTERCARD2.test(cardNumber)) {\n return CardType.Mastercard;\n }\n return CardType.Default;\n}\n\nexport function detectCardTypeText(cardNumber: string): string {\n const cardType = detectCardType(cardNumber);\n return cards[cardType as number] || '';\n}\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { countryList } from '../../util/phoneNumber';\n\nexport type FormState = {\n streetLine1: string;\n streetLine2: string;\n city: string;\n state: string;\n countryIso2: string;\n postCode: string;\n fullName: string;\n email: string;\n phone: string;\n shipping: string;\n cardNumber: string;\n cardholder: string;\n expiry: string;\n cvv: string;\n billingCountry: string;\n billingZip: string;\n saveInfo: boolean;\n saveCredentials: boolean;\n formErrors: Record;\n};\n\nexport type FormActions = (\n 'changeAddress1' | 'changeAddress2' | 'changeCity' | 'changeState' | 'changeCountry' |\n 'changePostCode' | 'changeFullName' | 'changeEmail' | 'changePhone' | 'changeShipping' | 'updateUserInfo' |\n 'changeCardNumber' | 'changeCardholder' | 'changeExpiryDate' | 'changeCvvCode' | 'changeBillingCountry' |\n 'changeBillingZip' | 'changeSaveInfo' | 'changeSaveCredentials' | 'setFormErrors'\n);\nexport type FormEditDispatch = Dispatch;\n\nconst INITIAL_STATE: FormState = {\n streetLine1: '',\n streetLine2: '',\n city: '',\n state: '',\n countryIso2: '',\n postCode: '',\n fullName: '',\n email: '',\n phone: '',\n shipping: '',\n cardNumber: '',\n cardholder: '',\n expiry: '',\n cvv: '',\n billingCountry: '',\n billingZip: '',\n saveInfo: true,\n saveCredentials: false,\n formErrors: {},\n};\n\nconst reducer: StateReducer = (state, action) => {\n switch (action.type) {\n case 'changeAddress1':\n return {\n ...state,\n streetLine1: action.payload,\n formErrors: {\n ...state.formErrors,\n streetLine1: undefined,\n },\n };\n case 'changeAddress2':\n return {\n ...state,\n streetLine2: action.payload,\n formErrors: {\n ...state.formErrors,\n streetLine2: undefined,\n },\n };\n case 'changeCity':\n return {\n ...state,\n city: action.payload,\n formErrors: {\n ...state.formErrors,\n city: undefined,\n },\n };\n case 'changeState':\n return {\n ...state,\n state: action.payload,\n formErrors: {\n ...state.formErrors,\n state: undefined,\n },\n };\n case 'changeCountry':\n return {\n ...state,\n countryIso2: action.payload,\n billingCountry: getBillingCountry(action.payload),\n formErrors: {\n ...state.formErrors,\n countryIso2: undefined,\n },\n };\n case 'changePostCode':\n return {\n ...state,\n postCode: action.payload,\n formErrors: {\n ...state.formErrors,\n postCode: undefined,\n },\n };\n case 'changeFullName':\n return {\n ...state,\n fullName: action.payload,\n formErrors: {\n ...state.formErrors,\n fullName: undefined,\n },\n };\n case 'changeEmail':\n return {\n ...state,\n email: action.payload,\n formErrors: {\n ...state.formErrors,\n email: undefined,\n },\n };\n case 'changePhone':\n return {\n ...state,\n phone: action.payload,\n formErrors: {\n ...state.formErrors,\n phone: undefined,\n },\n };\n case 'changeShipping':\n return { ...state, shipping: action.payload };\n case 'changeCardNumber':\n return {\n ...state,\n cardNumber: action.payload,\n formErrors: {\n ...state.formErrors,\n cardNumber: undefined,\n },\n };\n case 'changeCardholder':\n return {\n ...state,\n cardholder: action.payload,\n formErrors: {\n ...state.formErrors,\n cardholder: undefined,\n },\n };\n case 'changeExpiryDate':\n return {\n ...state,\n expiry: action.payload,\n formErrors: {\n ...state.formErrors,\n expiry: undefined,\n },\n };\n case 'changeCvvCode':\n return {\n ...state,\n cvv: action.payload,\n formErrors: {\n ...state.formErrors,\n cvv: undefined,\n },\n };\n case 'changeBillingCountry':\n return {\n ...state,\n billingCountry: action.payload,\n formErrors: {\n ...state.formErrors,\n billingCountry: undefined,\n },\n };\n case 'changeBillingZip':\n return {\n ...state,\n billingZip: action.payload,\n formErrors: {\n ...state.formErrors,\n billingZip: undefined,\n },\n };\n case 'changeSaveInfo':\n return { ...state, saveInfo: action.payload };\n case 'changeSaveCredentials':\n return { ...state, saveCredentials: action.payload };\n case 'updateUserInfo':\n if (action.payload.countryIso2) {\n return {\n ...state,\n ...action.payload,\n billingCountry: getBillingCountry(action.payload.countryIso2),\n };\n }\n return { ...state, ...action.payload };\n case 'setFormErrors':\n return {\n ...state,\n formErrors: {\n ...state.formErrors,\n ...action.payload,\n },\n };\n default:\n return state;\n }\n};\n\nfunction getBillingCountry(countryCode: string) {\n const country = countryList.find(({ id }) => id === countryCode);\n return country ? country.name : '';\n}\n\nexport default () => {\n return useReducer(reducer, INITIAL_STATE);\n};\n","import { RefObject } from 'react';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\nimport { fastRaf } from '../util/schedulers';\nimport { useEffect } from '../lib/teact/teact';\n\nconst DEFAULT_DURATION = 400;\n\nexport default function useFocusAfterAnimation(\n ref: RefObject, animationDuration = DEFAULT_DURATION,\n) {\n useEffect(() => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n setTimeout(() => {\n fastRaf(() => {\n if (ref.current) {\n ref.current.focus();\n }\n });\n }, animationDuration);\n }, [ref, animationDuration]);\n}\n","import { ChangeEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n id?: string;\n value?: string;\n label?: string;\n error?: string;\n ref?: RefObject;\n hasArrow?: boolean;\n placeholder?: string;\n onChange?: (e: ChangeEvent) => void;\n children: any;\n};\n\nconst Select: FC = (props) => {\n const {\n id,\n value,\n label,\n hasArrow,\n error,\n ref,\n placeholder,\n onChange,\n children,\n } = props;\n const labelText = error || label;\n const fullClassName = buildClassName(\n 'input-group',\n value && 'touched',\n error && 'error',\n labelText && 'with-label',\n hasArrow && 'with-arrow',\n 'input-group',\n );\n\n return (\n
\n \n {children}\n \n {labelText && id && (\n \n )}\n
\n );\n};\n\nexport default memo(Select);\n","import React, {\n FC, useRef, useCallback, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation';\nimport useLang from '../../hooks/useLang';\nimport { countryList } from '../../util/phoneNumber';\n\nimport InputText from '../ui/InputText';\nimport Select from '../ui/Select';\nimport Checkbox from '../ui/Checkbox';\n\nimport './ShippingInfo.scss';\n\nexport type OwnProps = {\n state: FormState;\n needEmail: boolean;\n needPhone: boolean;\n needName: boolean;\n needAddress: boolean;\n dispatch: FormEditDispatch;\n};\n\nconst ShippingInfo: FC = ({\n state,\n needEmail,\n needPhone,\n needName,\n needAddress,\n dispatch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const phoneRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const selectCountryRef = useRef(null);\n\n useEffect(() => {\n if (selectCountryRef.current\n && selectCountryRef.current.value !== state.countryIso2) {\n selectCountryRef.current.value = state.countryIso2;\n }\n }, [state.countryIso2]);\n\n const lang = useLang();\n\n useFocusAfterAnimation(inputRef);\n\n const handleAddress1Change = useCallback((e) => {\n dispatch({ type: 'changeAddress1', payload: e.target.value });\n }, [dispatch]);\n\n const handleAddress2Change = useCallback((e) => {\n dispatch({ type: 'changeAddress2', payload: e.target.value });\n }, [dispatch]);\n\n const handleCityChange = useCallback((e) => {\n dispatch({ type: 'changeCity', payload: e.target.value });\n }, [dispatch]);\n\n const handleStateChange = useCallback((e) => {\n dispatch({ type: 'changeState', payload: e.target.value });\n }, [dispatch]);\n\n const handleCountryChange = useCallback((e) => {\n dispatch({ type: 'changeCountry', payload: e.target.value });\n }, [dispatch]);\n\n const handlePostCodeChange = useCallback((e) => {\n dispatch({ type: 'changePostCode', payload: e.target.value });\n }, [dispatch]);\n\n const handleFullNameChange = useCallback((e) => {\n dispatch({ type: 'changeFullName', payload: e.target.value });\n }, [dispatch]);\n\n const handleEmailChange = useCallback((e) => {\n dispatch({ type: 'changeEmail', payload: e.target.value });\n }, [dispatch]);\n\n const handlePhoneChange = useCallback((e) => {\n let { value } = e.target;\n value = `+${value.replace(/\\D/g, '')}`;\n if (phoneRef.current) {\n phoneRef.current.value = value;\n }\n dispatch({ type: 'changePhone', payload: value });\n }, [dispatch]);\n\n const handleSaveInfoChange = useCallback((e) => {\n dispatch({ type: 'changeSaveInfo', payload: e.target.value });\n }, [dispatch]);\n\n const { formErrors } = state;\n return (\n
\n
\n {needAddress ? (\n
\n
{lang('PaymentShippingAddress')}
\n \n \n \n \n \n {countryList.map(({ name, id }) => (\n \n {name}\n \n ))}\n \n\n \n
\n ) : undefined}\n { needName || needEmail || needPhone ? (\n
{lang('PaymentShippingReceiver')}
\n ) : undefined }\n { needName && (\n \n ) }\n { needEmail && (\n \n ) }\n { needPhone && (\n \n ) }\n \n \n
\n );\n};\n\nexport default memo(ShippingInfo);\n","import React, {\n FC, useCallback, memo, useMemo, useEffect,\n} from '../../lib/teact/teact';\n\nimport { ShippingOption } from '../../types/index';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\n\nimport RadioGroup from '../ui/RadioGroup';\n\nimport './Shipping.scss';\n\nexport type OwnProps = {\n state: FormState;\n shippingOptions: ShippingOption[];\n currency: string;\n dispatch: FormEditDispatch;\n};\n\nconst Shipping: FC = ({\n state,\n shippingOptions,\n currency,\n dispatch,\n}) => {\n useEffect(() => {\n if (!shippingOptions || state.shipping) {\n return;\n }\n dispatch({ type: 'changeShipping', payload: shippingOptions[0].id });\n }, [shippingOptions, state.shipping, dispatch]);\n\n const handleShippingSelect = useCallback((value) => {\n dispatch({ type: 'changeShipping', payload: value });\n }, [dispatch]);\n\n const options = useMemo(() => (shippingOptions.map(({ id: value, title: label, amount }) => ({\n label,\n subLabel: `${currency} ${String(amount / 100)}`,\n value,\n }))), [shippingOptions, currency]);\n\n return (\n
\n
\n

Select shipping method

\n \n \n
\n );\n};\n\nexport default memo(Shipping);\n","import React, {\n FC, memo,\n} from '../../lib/teact/teact';\n\nimport { Price } from '../../types';\n\nimport './Checkout.scss';\n\nexport type OwnProps = {\n invoiceContent?: {\n title?: string;\n description?: string;\n text?: string;\n photoUrl?: string;\n };\n checkoutInfo?: {\n paymentMethod?: string;\n paymentProvider?: string;\n shippingAddress?: string;\n name?: string;\n phone?: string;\n shippingMethod?: string;\n };\n prices?: Price[];\n totalPrice?: number;\n shippingPrices?: Price[];\n currency?: string;\n};\n\nconst Checkout: FC = ({\n invoiceContent,\n prices,\n shippingPrices,\n checkoutInfo,\n currency,\n totalPrice,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const { photoUrl, title, text } = (invoiceContent || {});\n const {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n } = (checkoutInfo || {});\n return (\n
\n
\n { photoUrl && (\n \"\"\n )}\n
\n
{ title }
\n

{ text }

\n
\n
\n
\n { prices && prices.map((item) => (\n renderPaymentItem(item.label, item.amount, currency, false)\n )) }\n { shippingPrices && shippingPrices.map((item) => (\n renderPaymentItem(item.label, item.amount, currency, false)\n )) }\n { totalPrice !== undefined && (\n renderPaymentItem('Total', totalPrice, currency, true)\n ) }\n
\n
\n {paymentMethod && renderCheckoutItem('icon-card', paymentMethod, 'Payment method')}\n {paymentProvider && renderCheckoutItem('stripe-provider', paymentProvider, 'Payment provider')}\n {shippingAddress && renderCheckoutItem('icon-location', shippingAddress, 'Shipping address')}\n {name && renderCheckoutItem('icon-user', name, 'Name')}\n {phone && renderCheckoutItem('icon-phone', phone, 'Phone number')}\n {shippingMethod && renderCheckoutItem('icon-truck', shippingMethod, 'Shipping method')}\n
\n
\n );\n};\n\nfunction renderPaymentItem(title: string, value: number, currency?: string, main = false) {\n return (\n
\n
\n { title }\n
\n
\n { `${currency || ''} ${(value / 100).toFixed(2)}` }\n
\n
\n );\n}\n\nfunction renderCheckoutItem(icon: string, title: string, data: string) {\n return (\n
\n \n
\n
\n { title }\n
\n

\n { data }\n

\n
\n
\n );\n}\n\nexport default memo(Checkout);\n","import React, {\n FC, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { formatCardExpiry } from '../middle/helpers/inputFormatters';\n\nimport InputText from '../ui/InputText';\n\nconst MAX_FIELD_LENGTH = 5;\n\nexport type OwnProps = {\n value: string;\n error?: string;\n onChange: (value: string) => void;\n};\n\nconst ExpiryInput : FC = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const expiryInputRef = useRef(null);\n\n const handleKeyDown = useCallback((e) => {\n if (e.key === 'Backspace' && value.charAt(value.length - 1) === '/') {\n const newValue = value.slice(0, value.length - 1);\n if (expiryInputRef.current) {\n expiryInputRef.current.value = newValue;\n }\n }\n }, [value]);\n\n const handleChange = useCallback((e) => {\n onChange(formatCardExpiry(e.target.value));\n }, [onChange]);\n\n return (\n \n );\n};\n\nexport default memo(ExpiryInput);\n","export function formatCardExpiry(input: string) {\n input = input.replace(/[^\\d]/g, '').slice(0, 4);\n const parts = input.match(/.{1,2}/g);\n if (parts && parts[0] && Number(parts[0]) > 12) {\n parts[0] = '12';\n }\n if (parts && parts[0] && parts[0].length === 2 && !parts[1]) {\n parts[1] = '';\n }\n return parts ? parts.join('/') : '';\n}\n\nexport function formatCardNumber(input: string) {\n input = input.replace(/[^\\d]/g, '');\n const parts = input.match(/.{1,4}/g);\n return parts ? parts.join(' ') : '';\n}\n","export default __webpack_public_path__ + \"mastercard.4216118edafe23cc2dec7b8807ba4622.svg\";","export default __webpack_public_path__ + \"visa.e5a7c336e1deb4b92a636e2e053878c4.svg\";","import React, {\n FC, memo, useCallback, useState, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation';\nimport { formatCardNumber } from '../middle/helpers/inputFormatters';\nimport { detectCardType, CardType } from '../common/helpers/detectCardType';\n\nimport InputText from '../ui/InputText';\n\nimport './CardInput.scss';\n\n// @ts-ignore\nimport mastercardIconPath from '../../assets/mastercard.svg';\n// @ts-ignore\nimport visaIconPath from '../../assets/visa.svg';\n\nconst CARD_NUMBER_MAX_LENGTH = 23;\n\nexport type OwnProps = {\n value: string;\n error?: string;\n onChange: (value: string) => void;\n};\n\nconst CardInput : FC = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const cardNumberRef = useRef(null);\n\n useFocusAfterAnimation(cardNumberRef);\n\n const [cardType, setCardType] = useState(CardType.Default);\n useEffect(() => {\n const newCardType = detectCardType(value);\n setCardType(newCardType);\n // eslint-disable-next-line\n }, []);\n\n const handleChange = useCallback((e) => {\n const newValue = formatCardNumber(e.target.value);\n const newCardType = detectCardType(e.target.value);\n setCardType(newCardType);\n onChange(newValue);\n if (cardNumberRef.current) {\n cardNumberRef.current.value = newValue;\n }\n }, [onChange, cardNumberRef]);\n\n const cardIcon = getCardIcon(cardType);\n\n return (\n
\n {cardIcon}\n \n
\n );\n};\n\nexport default memo(CardInput);\n\nfunction getCardIcon(cardType: CardType) {\n switch (cardType) {\n case CardType.Mastercard:\n return \"\";\n case CardType.Visa:\n return \"\";\n default:\n return undefined;\n }\n}\n","import React, {\n FC, useCallback, memo, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\nimport { countryList } from '../../util/phoneNumber';\n\nimport InputText from '../ui/InputText';\nimport Checkbox from '../ui/Checkbox';\nimport Select from '../ui/Select';\nimport ExpiryInput from './ExpiryInput';\nimport CardInput from './CardInput';\n\nimport './PaymentInfo.scss';\n\nexport type OwnProps = {\n state: FormState;\n canSaveCredentials: boolean;\n needCardholderName?: boolean;\n needCountry?: boolean;\n needZip?: boolean;\n dispatch: FormEditDispatch;\n};\n\nconst PaymentInfo: FC = ({\n state,\n canSaveCredentials,\n needCardholderName,\n needCountry,\n needZip,\n dispatch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const selectCountryRef = useRef(null);\n\n useEffect(() => {\n if (selectCountryRef.current\n && selectCountryRef.current.value !== state.billingCountry) {\n selectCountryRef.current.value = state.billingCountry;\n }\n }, [state.billingCountry]);\n\n const handleCardNumberChange = useCallback((value) => {\n dispatch({ type: 'changeCardNumber', payload: value });\n }, [dispatch]);\n\n const handleCardholderChange = useCallback((e) => {\n dispatch({ type: 'changeCardholder', payload: e.target.value.toUpperCase() });\n }, [dispatch]);\n\n const handleExpiryChange = useCallback((value) => {\n dispatch({ type: 'changeExpiryDate', payload: value });\n }, [dispatch]);\n\n const handleCvvChange = useCallback((e) => {\n dispatch({ type: 'changeCvvCode', payload: e.target.value });\n }, [dispatch]);\n\n const handleCountryChange = useCallback((e) => {\n dispatch({ type: 'changeBillingCountry', payload: e.target.value });\n }, [dispatch]);\n\n const handleBillingPostCodeChange = useCallback((e) => {\n dispatch({ type: 'changeBillingZip', payload: e.target.value });\n }, [dispatch]);\n\n const handleChangeSaveCredentials = useCallback((e) => {\n dispatch({ type: 'changeSaveCredentials', payload: e.target.value });\n }, [dispatch]);\n\n const lang = useLang();\n\n const { formErrors = {} } = state;\n\n return (\n
\n
\n
{lang('PaymentCardTitle')}
\n \n { needCardholderName && (\n \n )}\n
\n \n \n
\n { needCountry || needZip ? (\n
{lang('PaymentBillingAddress')}
\n ) : undefined }\n { needCountry && (\n \n {\n countryList.map(({ name }) => (\n \n {name}\n \n ))\n }\n \n ) }\n { needZip && (\n \n )}\n { canSaveCredentials && (\n \n ) }\n \n
\n );\n};\n\nexport default memo(PaymentInfo);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { PaymentStep, ShippingOption, Price } from '../../types';\nimport { ApiError, ApiInviteInfo } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\nimport { detectCardTypeText } from '../common/helpers/detectCardType';\nimport { getShippingErrors } from '../../modules/helpers/payments';\nimport usePaymentReducer, { FormState } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\n\nimport ShippingInfo from './ShippingInfo';\nimport Shipping from './Shipping';\nimport Checkout from './Checkout';\nimport PaymentInfo from './PaymentInfo';\nimport Button from '../ui/Button';\nimport Modal from '../ui/Modal';\nimport Transition from '../ui/Transition';\nimport Spinner from '../ui/Spinner';\n\nimport './PaymentModal.scss';\n\nconst DEFAULT_PROVIDER = 'stripe';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n nameRequested?: boolean;\n shippingAddressRequested?: boolean;\n phoneRequested?: boolean;\n emailRequested?: boolean;\n flexible?: boolean;\n phoneToProvider?: boolean;\n emailToProvider?: boolean;\n currency?: string;\n prices?: Price[];\n isProviderError: boolean;\n needCardholderName?: boolean;\n needCountry?: boolean;\n needZip?: boolean;\n globalDialogs?: (ApiError | ApiInviteInfo)[];\n};\n\ntype GlobalStateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst Invoice: FC = ({\n isOpen,\n onClose,\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n nameRequested,\n shippingAddressRequested,\n phoneRequested,\n emailRequested,\n phoneToProvider,\n emailToProvider,\n currency,\n passwordMissing,\n isProviderError,\n invoiceContent,\n nativeProvider,\n prices,\n needCardholderName,\n needCountry,\n needZip,\n error,\n globalDialogs,\n validateRequestedInfo,\n sendPaymentForm,\n setPaymentStep,\n sendCredentialsInfo,\n clearPaymentError,\n}) => {\n const [paymentState, paymentDispatch] = usePaymentReducer();\n const currencySign = getCurrencySign(currency);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n useEffect(() => {\n if (step || error || globalDialogs) {\n setIsLoading(false);\n }\n }, [step, error, globalDialogs]);\n\n useEffect(() => {\n if (error && error.field) {\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n [error.field]: error.fieldError,\n },\n });\n return;\n }\n if (globalDialogs && globalDialogs.length) {\n const errors = getShippingErrors(globalDialogs);\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n ...errors,\n },\n });\n }\n }, [error, globalDialogs, paymentDispatch]);\n\n useEffect(() => {\n if (savedInfo) {\n const {\n name: fullName, phone, email, shippingAddress,\n } = savedInfo;\n paymentDispatch({\n type: 'updateUserInfo',\n payload: {\n fullName,\n phone: phone && phone.charAt(0) !== '+'\n ? `+${phone}`\n : phone,\n email,\n ...(shippingAddress || {}),\n },\n });\n }\n }, [savedInfo, paymentDispatch]);\n\n const handleErrorModalClose = useCallback(() => {\n clearPaymentError();\n }, [clearPaymentError]);\n\n const totalPrice = useMemo(() => {\n if (step !== PaymentStep.Checkout) {\n return 0;\n }\n\n return getTotalPrice(prices, shippingOptions, paymentState.shipping);\n }, [step, paymentState.shipping, prices, shippingOptions]);\n\n const checkoutInfo = useMemo(() => {\n if (step !== PaymentStep.Checkout) {\n return undefined;\n }\n return getCheckoutInfo(paymentState, shippingOptions, nativeProvider || '');\n }, [step, paymentState, shippingOptions, nativeProvider]);\n\n function renderError() {\n if (!error) {\n return undefined;\n }\n return (\n \n

{error.description || 'Error'}

\n

{error.description || 'Error'}

\n \n {lang('OK')}\n \n
\n );\n }\n\n function renderModalContent(cuurentStep: PaymentStep) {\n switch (cuurentStep) {\n case PaymentStep.ShippingInfo:\n return (\n \n );\n case PaymentStep.Shipping:\n return (\n \n );\n case PaymentStep.PaymentInfo:\n return (\n \n );\n case PaymentStep.Checkout:\n return (\n \n );\n default:\n return undefined;\n }\n }\n\n const validateRequest = useCallback(() => {\n const { saveInfo } = paymentState;\n const requestInfo = getRequestInfo(paymentState);\n validateRequestedInfo({ requestInfo, saveInfo });\n }, [validateRequestedInfo, paymentState]);\n\n const sendCredentials = useCallback(() => {\n const credentials = getCredentials(paymentState);\n sendCredentialsInfo({\n credentials,\n });\n }, [sendCredentialsInfo, paymentState]);\n\n const sendForm = useCallback(() => {\n sendPaymentForm({\n shippingOptionId: paymentState.shipping,\n saveCredentials: paymentState.saveCredentials,\n });\n }, [sendPaymentForm, paymentState]);\n\n const setStep = useCallback((nextStep) => {\n setPaymentStep({ step: nextStep });\n }, [setPaymentStep]);\n\n const handleButtonClick = useCallback(() => {\n setIsLoading(true);\n switch (step) {\n case PaymentStep.ShippingInfo:\n return validateRequest();\n case PaymentStep.Shipping:\n return setStep(PaymentStep.PaymentInfo);\n case PaymentStep.PaymentInfo:\n return sendCredentials();\n case PaymentStep.Checkout:\n return sendForm();\n default:\n return () => {};\n }\n }, [step, validateRequest, setStep, sendCredentials, sendForm]);\n\n const modalHeader = useMemo(() => {\n switch (step) {\n case PaymentStep.ShippingInfo:\n return lang('PaymentShippingInfo');\n case PaymentStep.Shipping:\n return lang('PaymentShippingMethod');\n case PaymentStep.PaymentInfo:\n return lang('PaymentCardInfo');\n case PaymentStep.Checkout:\n return lang('PaymentCheckout');\n default:\n return '';\n }\n }, [step, lang]);\n\n const buttonText = useMemo(() => {\n switch (step) {\n case PaymentStep.Checkout:\n return lang('Checkout.PayPrice', `${currencySign}${(totalPrice / 100).toFixed(2)}`);\n default:\n return lang('Next');\n }\n }, [step, lang, currencySign, totalPrice]);\n\n if (isProviderError) {\n return (\n \n

\n Sorry, Telegram WebZ doesn't support payments with this provider yet.
\n Please use one of our mobile apps to do this.\n

\n \n {lang('OK')}\n \n \n );\n }\n\n return (\n \n
\n \n \n \n

{modalHeader}

\n
\n {step !== undefined ? (\n \n {() => (\n
\n {renderModalContent(step)}\n
\n )}\n
\n ) : (\n
\n \n
\n )}\n
\n \n {buttonText}\n \n
\n {error && !error.field && renderError()}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps & GlobalStateProps => {\n const {\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n invoice,\n invoiceContent,\n nativeProvider,\n nativeParams,\n passwordMissing,\n error,\n } = global.payment;\n\n const isProviderError = Boolean(invoice && (!nativeProvider || nativeProvider !== DEFAULT_PROVIDER));\n const { needCardholderName, needCountry, needZip } = (nativeParams || {});\n const {\n nameRequested,\n phoneRequested,\n emailRequested,\n shippingAddressRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices,\n } = (invoice || {});\n\n return {\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n nativeProvider,\n passwordMissing,\n nameRequested,\n shippingAddressRequested,\n phoneRequested,\n emailRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices,\n isProviderError,\n invoiceContent,\n needCardholderName,\n needCountry,\n needZip,\n error,\n globalDialogs: global.dialogs,\n };\n },\n (setGlobal, actions): DispatchProps => {\n return pick(actions, [\n 'validateRequestedInfo',\n 'sendPaymentForm',\n 'setPaymentStep',\n 'sendCredentialsInfo',\n 'clearPaymentError',\n ]);\n },\n)(Invoice));\n\nfunction findShippingOption(shippingOptions: ShippingOption[], optionId: string) {\n return shippingOptions.find(({ id }) => id === optionId);\n}\n\nfunction getShippingPrices(shippingOptions: ShippingOption[], shippingOption: string) {\n const option = findShippingOption(shippingOptions, shippingOption);\n return option ? option.prices : undefined;\n}\n\nfunction getTotalPrice(prices: Price[] = [], shippingOptions: ShippingOption[] | undefined, shippingOption: string) {\n const shippingPrices = shippingOptions\n ? getShippingPrices(shippingOptions, shippingOption)\n : [];\n let total = 0;\n const totalPrices = prices.concat(shippingPrices || []);\n total = totalPrices.reduce((acc, cur) => {\n return acc + cur.amount;\n }, total);\n return total;\n}\n\nfunction getCheckoutInfo(state: FormState, shippingOptions: ShippingOption[] | undefined, paymentProvider: string) {\n const cardTypeText = detectCardTypeText(state.cardNumber);\n const paymentMethod = `${cardTypeText} *${state.cardNumber.slice(-4)}`;\n const shippingAddress = state.streetLine1\n ? `${state.streetLine1}, ${state.city}, ${state.countryIso2}`\n : undefined;\n const { phone, fullName: name } = state;\n const shippingOption = shippingOptions ? findShippingOption(shippingOptions, state.shipping) : undefined;\n const shippingMethod = shippingOption ? shippingOption.title : undefined;\n return {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n };\n}\n\nfunction getRequestInfo(paymentState: FormState) {\n const {\n streetLine1,\n streetLine2,\n city,\n state,\n countryIso2,\n postCode,\n fullName: name,\n phone,\n email,\n } = paymentState;\n\n const shippingAddress = {\n streetLine1,\n streetLine2,\n city,\n state,\n countryIso2,\n postCode,\n };\n\n return {\n name,\n phone,\n email,\n shippingAddress,\n };\n}\n\nfunction getCredentials(paymentState: FormState) {\n const {\n cardNumber, cardholder, expiry, cvv, billingCountry, billingZip,\n } = paymentState;\n const [expiryMonth, expiryYear] = expiry.split('/');\n const data = {\n cardNumber,\n cardholder,\n expiryMonth,\n expiryYear,\n cvv,\n country: billingCountry,\n zip: billingZip,\n };\n\n return {\n data,\n };\n}\n","import React, {\n FC, memo, useMemo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { Price } from '../../types';\nimport { ApiShippingAddress } from '../../api/types/payments';\n\nimport useLang from '../../hooks/useLang';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\n\nimport Checkout from './Checkout';\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './PaymentModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n prices?: Price[];\n shippingPrices: any;\n totalAmount?: number;\n currency?: string;\n info?: {\n shippingAddress?: ApiShippingAddress;\n phone?: string;\n name?: string;\n };\n photoUrl?: string;\n text?: string;\n title?: string;\n credentialsTitle?: string;\n shippingMethod?: string;\n};\n\nconst ReceiptModal: FC = ({\n isOpen,\n onClose,\n prices,\n shippingPrices,\n totalAmount,\n currency,\n info,\n photoUrl,\n text,\n title,\n credentialsTitle,\n shippingMethod,\n}) => {\n const lang = useLang();\n const currencySign = getCurrencySign(currency);\n const checkoutInfo = useMemo(() => {\n return getCheckoutInfo(credentialsTitle, info, shippingMethod);\n }, [info, shippingMethod, credentialsTitle]);\n return (\n \n
\n
\n \n \n \n

{lang('PaymentReceipt')}

\n
\n
\n \n
\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { receipt } = global.payment;\n const {\n currency,\n prices: mapedPrices,\n info,\n totalAmount,\n credentialsTitle,\n shippingPrices,\n shippingMethod,\n photoUrl,\n text,\n title,\n } = (receipt || {});\n\n return {\n currency,\n prices: mapedPrices,\n info,\n totalAmount,\n credentialsTitle,\n shippingPrices,\n shippingMethod,\n photoUrl,\n text,\n title,\n };\n },\n)(ReceiptModal));\n\nfunction getCheckoutInfo(paymentMethod?: string,\n info?:\n { phone?: string;\n name?: string;\n shippingAddress?: ApiShippingAddress;\n },\n shippingMethod?: string) {\n if (!info) {\n return { paymentMethod };\n }\n const { shippingAddress } = info;\n const fullAddress = shippingAddress && shippingAddress.streetLine1\n ? `${shippingAddress.streetLine1}, ${shippingAddress.city}, ${shippingAddress.countryIso2}`\n : undefined;\n const { phone, name } = info;\n return {\n paymentMethod,\n paymentProvider: 'Stripe',\n shippingAddress: fullAddress,\n name,\n phone,\n shippingMethod,\n };\n}\n","import { ApiMediaFormat } from '../../../api/types';\n\nimport * as mediaLoader from '../../../util/mediaLoader';\n\n// @ts-ignore\nimport MonkeyIdle from '../../../assets/TwoFactorSetupMonkeyIdle.tgs';\n// @ts-ignore\nimport MonkeyTracking from '../../../assets/TwoFactorSetupMonkeyTracking.tgs';\n// @ts-ignore\nimport MonkeyClose from '../../../assets/TwoFactorSetupMonkeyClose.tgs';\n// @ts-ignore\nimport MonkeyPeek from '../../../assets/TwoFactorSetupMonkeyPeek.tgs';\n// @ts-ignore\nimport FoldersAll from '../../../assets/FoldersAll.tgs';\n// @ts-ignore\nimport FoldersNew from '../../../assets/FoldersNew.tgs';\n// @ts-ignore\nimport DiscussionGroups from '../../../assets/DiscussionGroupsDucks.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n};\n\nexport default function getAnimationData(name: keyof typeof ANIMATED_STICKERS_PATHS) {\n const path = ANIMATED_STICKERS_PATHS[name].replace(window.location.origin, '');\n\n return mediaLoader.fetch(`file${path}`, ApiMediaFormat.Lottie);\n}\n","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs\";","export default __webpack_public_path__ + \"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs\";","export default __webpack_public_path__ + \"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs\";","export default __webpack_public_path__ + \"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs\";","import React, {\n FC, useEffect, useState, memo,\n} from '../../lib/teact/teact';\n\nimport { DEBUG } from '../../config';\nimport { blobToFile, blobToDataUri } from '../../util/files';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Modal from './Modal';\nimport Loading from './Loading';\n\nimport './CropModal.scss';\n\n// Change to 'base64' to get base64-encoded string\nconst cropperResultOptions: Croppie.ResultOptions & { type: 'blob' } = {\n type: 'blob',\n quality: 0.8,\n format: 'jpeg',\n circle: false,\n};\n\ntype ICroppie = typeof import('croppie');\nlet Croppie: ICroppie;\nlet croppiePromise: Promise<{ default: ICroppie }>;\n\nasync function ensureCroppie() {\n if (!croppiePromise) {\n croppiePromise = import('../../lib/croppie') as unknown as Promise<{ default: ICroppie }>;\n Croppie = (await croppiePromise).default;\n }\n\n return croppiePromise;\n}\n\nlet cropper: Croppie;\n\nasync function initCropper(imgFile: File) {\n try {\n const cropContainer = document.getElementById('avatar-crop');\n if (!cropContainer) {\n return;\n }\n\n const { offsetWidth, offsetHeight } = cropContainer;\n\n cropper = new Croppie(cropContainer, {\n enableZoom: true,\n boundary: {\n width: offsetWidth,\n height: offsetHeight,\n },\n viewport: {\n width: offsetWidth - 16,\n height: offsetHeight - 16,\n type: 'circle',\n },\n });\n\n const dataUri = await blobToDataUri(imgFile);\n await cropper.bind({ url: dataUri });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n}\n\ntype OwnProps = {\n file?: File;\n onChange: (file: File) => void;\n onClose: () => void;\n};\n\nconst CropModal: FC = ({ file, onChange, onClose }: OwnProps) => {\n const [isCroppieReady, setIsCroppieReady] = useState(false);\n\n useEffect(() => {\n if (!file) {\n return;\n }\n\n if (!isCroppieReady) {\n ensureCroppie().then(() => setIsCroppieReady(true));\n\n return;\n }\n\n initCropper(file);\n }, [file, isCroppieReady]);\n\n const lang = useLang();\n\n async function handleCropClick() {\n if (!cropper) {\n return;\n }\n\n const result: Blob | string = await cropper.result(cropperResultOptions);\n const croppedImg = typeof result === 'string' ? result : blobToFile(result, 'avatar.jpg');\n\n onChange(croppedImg);\n }\n\n return (\n \n {isCroppieReady ? (\n
\n ) : (\n \n )}\n \n \n \n \n );\n};\n\nexport default memo(CropModal);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport CropModal from './CropModal';\n\nimport './AvatarEditable.scss';\n\ninterface OwnProps {\n title?: string;\n disabled?: boolean;\n currentAvatarBlobUrl?: string;\n onChange: (file: File) => void;\n}\n\nconst AvatarEditable: FC = ({\n title = 'Change your profile picture',\n disabled,\n currentAvatarBlobUrl,\n onChange,\n}) => {\n const [selectedFile, setSelectedFile] = useState();\n const [croppedBlobUrl, setCroppedBlobUrl] = useState(currentAvatarBlobUrl);\n\n useEffect(() => {\n setCroppedBlobUrl(currentAvatarBlobUrl);\n }, [currentAvatarBlobUrl]);\n\n function handleSelectFile(event: ChangeEvent) {\n const target = event.target as HTMLInputElement;\n\n if (!target || !target.files || !target.files[0]) {\n return;\n }\n\n setSelectedFile(target.files[0]);\n target.value = '';\n }\n\n function handleAvatarCrop(croppedImg: File) {\n setSelectedFile(undefined);\n onChange(croppedImg);\n\n if (croppedBlobUrl) {\n URL.revokeObjectURL(croppedBlobUrl);\n }\n setCroppedBlobUrl(URL.createObjectURL(croppedImg));\n }\n\n function handleModalClose() {\n setSelectedFile(undefined);\n }\n\n const labelClassName = buildClassName(\n croppedBlobUrl && 'filled',\n disabled && 'disabled',\n );\n\n return (\n
\n \n \n \n {croppedBlobUrl && \"Avatar\"}\n \n \n
\n );\n};\n\nexport default memo(AvatarEditable);\n","import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n isPasswordVisible: boolean;\n isBig?: boolean;\n};\n\nconst PEEK_MONKEY_SHOW_DELAY = 2000;\nconst SEGMENT_COVER_EYES: [number, number] = [0, 50];\nconst SEGMENT_UNCOVER_EYE: [number, number] = [0, 20];\nconst SEGMENT_COVER_EYE: [number, number] = [20, 0];\nconst STICKER_SIZE = IS_SINGLE_COLUMN_LAYOUT ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst PasswordMonkey: FC = ({ isPasswordVisible, isBig }) => {\n const [closeMonkeyData, setCloseMonkeyData] = useState>();\n const [peekMonkeyData, setPeekMonkeyData] = useState>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const [isPeekShown, setIsPeekShown] = useState(false);\n\n useEffect(() => {\n if (!closeMonkeyData) {\n getAnimationData('MonkeyClose').then(setCloseMonkeyData);\n } else {\n setTimeout(() => setIsPeekShown(true), PEEK_MONKEY_SHOW_DELAY);\n }\n }, [closeMonkeyData]);\n\n useEffect(() => {\n if (!peekMonkeyData) {\n getAnimationData('MonkeyPeek').then(setPeekMonkeyData);\n }\n }, [peekMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n return (\n
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {closeMonkeyData && (\n \n )}\n {peekMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(PasswordMonkey);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { MIN_PASSWORD_LENGTH } from '../../config';\nimport { IS_TOUCH_ENV, IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\ntype OwnProps = {\n submitLabel?: string;\n error?: string;\n hint?: string;\n placeholder?: string;\n isLoading?: boolean;\n isPasswordVisible?: boolean;\n clearError: NoneToVoidFunction;\n onChangePasswordVisibility: (state: boolean) => void;\n onInputChange?: (password: string) => void;\n onSubmit: (password: string) => void;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst PasswordForm: FC = ({\n isLoading = false,\n isPasswordVisible,\n error,\n hint,\n placeholder = 'Password',\n submitLabel = 'Next',\n clearError,\n onChangePasswordVisibility,\n onInputChange,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const lang = useLang();\n\n const [password, setPassword] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n useEffect(() => {\n if (error) {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n inputRef.current!.select();\n });\n }\n }, [error]);\n\n function onPasswordChange(e: ChangeEvent) {\n if (error) {\n clearError();\n }\n\n const { target } = e;\n setPassword(target.value);\n setCanSubmit(target.value.length >= MIN_PASSWORD_LENGTH);\n if (onInputChange) {\n onInputChange(target.value);\n }\n }\n\n function togglePasswordVisibility() {\n onChangePasswordVisibility(!isPasswordVisible);\n }\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (isLoading) {\n return;\n }\n\n if (canSubmit) {\n onSubmit(password);\n }\n }\n\n return (\n
\n \n \n \n \n \n
\n
\n {canSubmit && (\n \n )}\n \n );\n};\n\nexport default memo(PasswordForm);\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/3.c4d4bc793e11d4bb6728.css.map b/dist/3.c4d4bc793e11d4bb6728.css.map deleted file mode 100644 index 9b5575d80..000000000 --- a/dist/3.c4d4bc793e11d4bb6728.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/mediaViewer/SenderInfo.scss","webpack:///./src/components/mediaViewer/MediaViewerActions.scss","webpack:///./src/components/mediaViewer/MediaViewerFooter.scss","webpack:///./src/components/mediaViewer/VideoPlayerControls.scss","webpack:///./src/components/mediaViewer/VideoPlayer.scss","webpack:///./src/components/mediaViewer/ZoomControls.scss","webpack:///./src/components/mediaViewer/PanZoom.scss","webpack:///./src/components/mediaViewer/MediaViewer.scss","webpack:///./src/components/main/ForwardPicker.scss","webpack:///./src/components/main/Dialogs.scss","webpack:///./src/components/common/CalendarModal.scss","webpack:///./src/components/middle/MessageSelectToolbar.scss","webpack:///./src/components/left/search/RecentContacts.scss","webpack:///./src/components/left/search/ChatMessage.scss","webpack:///./src/components/left/search/DateSuggest.scss","webpack:///./src/components/left/search/LeftSearch.scss","webpack:///./src/components/ui/CropModal.scss","webpack:///./src/components/ui/AvatarEditable.scss","webpack:///./src/components/ui/ShowMoreButton.scss","webpack:///./src/components/left/settings/folders/SettingsFoldersChatsPicker.scss","webpack:///./src/components/left/settings/folders/SettingsFolders.scss","webpack:///./src/components/ui/RangeSlider.scss","webpack:///./src/components/common/StickerButton.scss","webpack:///./src/components/left/settings/SettingsStickerSet.scss","webpack:///./src/components/left/settings/WallpaperTile.scss","webpack:///./src/components/left/settings/SettingsGeneralBackground.scss","webpack:///./src/components/left/settings/SettingsGeneralBackgroundColor.scss","webpack:///./src/components/common/PasswordMonkey.scss","webpack:///./src/components/left/settings/Settings.scss","webpack:///./src/components/left/newChat/NewChat.scss","webpack:///./src/components/left/ArchivedChats.scss","webpack:///./src/components/middle/message/MessageContextMenu.scss","webpack:///./src/components/common/StickerSetModal.scss","webpack:///./src/components/middle/HeaderMenuContainer.scss","webpack:///./src/components/middle/MobileSearch.scss","webpack:///./src/components/middle/composer/MentionTooltip.scss","webpack:///./src/components/middle/composer/AttachmentModal.scss","webpack:///./src/components/middle/composer/PollModal.scss","webpack:///./src/components/middle/composer/EmojiButton.scss","webpack:///./src/components/middle/composer/EmojiPicker.scss","webpack:///./src/components/middle/composer/StickerPicker.scss","webpack:///./src/components/common/GifButton.scss","webpack:///./src/components/middle/composer/GifPicker.scss","webpack:///./src/components/middle/composer/SymbolMenu.scss","webpack:///./src/components/middle/composer/AttachMenu.scss","webpack:///./src/components/middle/composer/StickerTooltip.scss","webpack:///./src/components/middle/composer/BotKeyboardMenu.scss","webpack:///./src/components/middle/composer/CustomSendMenu.scss","webpack:///./src/components/middle/composer/EmojiTooltip.scss","webpack:///./src/components/middle/composer/inlineResults/BaseResult.scss","webpack:///./src/components/middle/composer/inlineResults/MediaResult.scss","webpack:///./src/components/middle/composer/InlineBotTooltip.scss","webpack:///./src/components/right/RightSearch.scss","webpack:///./src/components/right/StickerSearch.scss","webpack:///./src/components/right/GifSearch.scss","webpack:///./src/components/right/PollAnswerResults.scss","webpack:///./src/components/right/PollResults.scss","webpack:///./src/components/right/management/Management.scss","webpack:///./src/components/payment/ShippingInfo.scss","webpack:///./src/components/payment/Shipping.scss","webpack:///./src/components/payment/Checkout.scss","webpack:///./src/components/payment/CardInput.scss","webpack:///./src/components/payment/PaymentInfo.scss","webpack:///./src/components/payment/PaymentModal.scss"],"names":[],"mappings":"AAAA,YAAY,aAAa,qBAAqB,YAAY,eAAe,WAAW,wBAAwB,kBAAkB,UAAU,oBAAoB,uBAAuB,0BAA0B,oBAAoB,cAAc,kBAAkB,aAAa,sBAAsB,uBAAuB,eAAe,mBAAmB,oBAAoB,gBAAgB,gBAAgB,gBAAgB,uBAAuB,kBAAkB,oBAAoB,mBAAmB;;ACAjf,oBAAoB,aAAa,yBAAyB,2BAA2B,4BAA4B,2BAA2B,2BAA2B,kBAAkB,4CAA4C,kBAAkB,MAAM;;ACA7P,mBAAmB,kBAAkB,SAAS,eAAe,WAAW,wBAAwB,uCAAuC,aAAa,2BAA2B,mBAAmB,mBAAmB,0BAA0B,mBAAmB,sBAAsB,gEAAgE,gCAAgC,UAAU,oBAAoB,wDAAwD,UAAU,oBAAoB,gDAAgD,kBAAkB,0CAA0C,YAAY,eAAe,WAAW,wBAAwB,sDAAsD,UAAU,0BAA0B,gDAAgD,WAAW,6BAA6B,UAAU,+BAA+B,gBAAgB,cAAc,gBAAgB,kBAAkB,4BAA4B,mBAAmB,uBAAuB,mBAAmB,2BAA2B,+BAA+B,oBAAoB,sCAAsC,eAAe,gBAAgB,oBAAoB,iDAAiD,WAAW,kBAAkB,aAAa,cAAc,YAAY,eAAe,4BAA4B,2CAA2C,uBAAuB,0BAA0B,iDAAiD,aAAa,iBAAiB,qBAAqB,yBAAyB,sDAAsD;;ACAhmD,qBAAqB,aAAa,mBAAmB,kBAAkB,OAAO,SAAS,WAAW,oBAAoB,kBAAkB,gEAAgE,yCAAyC,aAAa,0BAA0B,qBAAqB,eAAe,6BAA6B,gBAAgB,+BAA+B,8CAA8C,gBAAgB,UAAU,eAAe,iBAAiB,wCAAwC,iBAAiB,qDAAqD,iBAAiB,6BAA6B,cAAc,UAAU,cAAc,eAAe,0BAA0B,6BAA6B,gBAAgB,6BAA6B,mBAAmB,kCAAkC,cAAc,mBAAmB,iCAAiC,iBAAiB,0BAA0B,iCAAiC,kBAAkB,mCAAmC,oBAAoB,0BAA0B,mCAAmC,kBAAkB,0BAA0B,8CAA8C,kBAAkB,uCAAuC,kBAAkB,SAAS,2BAA2B,mBAAmB,gBAAgB,uBAAuB,0BAA0B,uCAAuC,gBAAgB,UAAU,eAAe,iBAAiB,kBAAkB,mDAAmD,eAAe,sCAAsC,kBAAkB,UAAU,WAAW,MAAM,YAAY,4CAA4C,kBAAkB,QAAQ,aAAa,cAAc,WAAW,2BAA2B,wCAAwC,2CAA2C,wIAAwI,kBAAkB,MAAM,OAAO,YAAY,2CAA2C,+CAA+C,uCAAuC,6CAA6C,gCAAgC,oDAAoD,WAAW,kBAAkB,aAAa,cAAc,kBAAkB,sCAAsC,QAAQ,QAAQ,oCAAoC,4CAA4C,WAAW,UAAU,SAAS,UAAU,eAAe,gBAAgB,kEAAkE;;ACAvoF,aAAa,kBAAkB,oBAAoB,sBAAsB,gBAAgB,iCAAiC,kBAAkB,MAAM,QAAQ,SAAS,OAAO,qCAAqC,sBAAsB,uBAAuB,uCAAuC,2BAA2B,0BAA0B,aAAa,WAAW,0BAA0B,aAAa,kBAAkB,2BAA2B,aAAa,sBAAsB,yBAAyB,iBAAiB,mBAAmB,cAAc,iCAAiC,YAAY,mBAAmB,aAAa,WAAW,YAAY,6BAA6B,wBAAwB,2BAA2B,mBAAmB,gCAAgC,+BAA+B,+BAA+B,2BAA2B,+BAA+B,gCAAgC,0BAA0B,kBAAkB,SAAS,QAAQ,gCAAgC,cAAc,eAAe,4CAA4C,uDAAuD,uCAAuC,qCAAqC,kBAAkB,kBAAkB,aAAa,gCAAgC,kBAAkB,MAAM,OAAO,WAAW,YAAY,aAAa,mBAAmB,uBAAuB,2CAA2C,4BAA4B,WAAW,kBAAkB,kBAAkB,eAAe,cAAc,UAAU,mBAAmB,sBAAsB,qBAAqB,iDAAiD;;ACApqD,cAAc,kBAAkB,eAAe,SAAS,2BAA2B,2CAA2C,WAAW,gBAAgB,gBAAgB,qCAAqC,+BAA+B,oBAAoB,mBAAmB,8BAA8B,mBAAmB,+CAA+C,kBAAkB,cAAc,aAAa,cAAc,WAAW,mDAAmD,iBAAiB,wBAAwB,WAAW,uBAAuB,YAAY,wBAAwB,kBAAkB,aAAa,cAAc,aAAa,YAAY,8BAA8B,kBAAkB,QAAQ,aAAa,cAAc,WAAW,2BAA2B,uCAAuC,2CAA2C,6DAA6D,kBAAkB,MAAM,OAAO,YAAY,2CAA2C,+BAA+B,gBAAgB,uBAAuB,sCAAsC,WAAW,kBAAkB,aAAa,cAAc,kBAAkB,oCAAoC,QAAQ,QAAQ,oCAAoC,8BAA8B,WAAW,YAAY,aAAa,UAAU,SAAS,UAAU,eAAe,gBAAgB,oDAAoD;;ACAh8C,4BAA4B,kBAAkB,WAAW,YAAY,aAAa,YAAY,yBAAyB,iBAAiB,eAAe,iCAAiC,iCAAiC,gBAAgB,uBAAuB,eAAe,MAAM;;ACArR,aAAa,eAAe,MAAM,OAAO,YAAY,YAAY,2BAA2B,WAAW,8BAA8B,iBAAiB,aAAa,2BAA2B,+BAA+B,kBAAkB,eAAe,sBAAsB,mBAAmB,yBAAyB,yBAAyB,mBAAmB,sIAAsI,aAAa,oCAAoC,mCAAmC,sEAAsE,oBAAoB,gBAAgB,gCAAgC,aAAa,uCAAuC,UAAU,0CAA0C,eAAe,MAAM,OAAO,YAAY,aAAa,UAAU,UAAU,gCAAgC,aAAa,yBAAyB,kBAAkB,kBAAkB,mCAAmC,YAAY,4CAA4C,WAAW,YAAY,0BAA0B,gCAAgC,iBAAiB,oDAAoD,qBAAqB,mDAAmD,0BAA0B,+DAA+D,kBAAkB,oBAAoB,kBAAkB,WAAW,YAAY,aAAa,mBAAmB,gBAAgB,mCAAmC,kBAAkB,UAAU,kBAAkB,YAAY,oBAAoB,uBAAuB,mBAAmB,8CAA8C,eAAe,0BAA0B,8CAA8C,iBAAiB,2BAA2B,8CAA8C,gBAAgB,kDAAkD,+BAA+B,2BAA2B,kDAAkD,gCAAgC,8CAA8C,kBAAkB,kDAAkD,kBAAkB,QAAQ,SAAS,gCAAgC,uCAAuC,gBAAgB,iCAAiC,mBAAmB,yBAAyB,oDAAoD,gBAAgB,YAAY,4CAA4C,YAAY,yBAAyB,eAAe,SAAS,WAAW,SAAS,YAAY,UAAU,SAAS,wBAAwB,gBAAgB,iCAAiC,wBAAwB,UAAU,wBAAwB,aAAa,eAAe,UAAU,0BAA0B,yBAAyB,YAAY,sEAAsE,UAAU,8BAA8B,OAAO,qFAAqF,6CAA6C,uCAAuC,UAAU,QAAQ,qBAAqB,8BAA8B,QAAQ,iFAAiF,0DAA0D,uCAAuC,OAAO,WAAW,qBAAqB,gCAAgC,qBAAqB,aAAa,YAAY,6BAA6B,0BAA0B,gCAAgC,UAAU,gCAAgC,oBAAoB,wDAAwD,UAAU,oBAAoB,OAAO,kBAAkB,8BAA8B,+BAA+B,gBAAgB,gBAAgB,gDAAgD,uBAAuB,4CAA4C,cAAc,kBAAkB,mBAAmB,mFAAmF,wBAAwB,WAAW,YAAY,iBAAiB,yBAAyB;;ACAtpI,eAAe,8BAA8B,6BAA6B,WAAW,gBAAgB,0BAA0B,6BAA6B,YAAY,6BAA6B,aAAa,mBAAmB,uBAAuB,qCAAqC,oBAAoB,0CAA0C,SAAS,2CAA2C,YAAY,2BAA2B,eAAe,eAAe,kBAAkB,oBAAoB,uBAAuB,8BAA8B,UAAU,gBAAgB,aAAa,sBAAsB,2CAA2C,YAAY,kBAAkB,gBAAgB,oBAAoB,2BAA2B,YAAY,SAAS,kBAAkB,aAAa,mBAAmB,uBAAuB,kCAAkC,0BAA0B,yEAAyE,SAAS,0FAA0F;;ACA9jC,SAAS,eAAe,MAAM,OAAO,YAAY,aAAa;;ACA9D,6BAA6B,mBAAmB,4CAA4C,0BAA0B,2BAA2B,aAAa,mBAAmB,uBAAuB,qBAAqB,yCAAyC,eAAe,kBAAkB,qDAAqD,kBAAkB,oDAAoD,iBAAiB,uBAAuB,aAAa,yBAAyB,sBAAsB,+BAA+B,oBAAoB,uCAAuC,iBAAiB,+BAA+B,aAAa,mBAAmB,kCAAkC,OAAO,qBAAqB,kBAAkB,0BAA0B,kCAAkC,oBAAoB,4CAA4C,2BAA2B,8CAA8C,YAAY,oBAAoB,2BAA2B,kBAAkB,mBAAmB,wBAAwB,gBAAgB,uBAAuB,0BAA0B,2BAA2B,uBAAuB,mCAAmC,gBAAgB,YAAY,qCAAqC,eAAe,2CAA2C,wDAAwD,8CAA8C,sCAAsC,YAAY,oCAAoC,aAAa,oBAAoB,mCAAmC,WAAW,cAAc,iBAAiB,gCAAgC,kBAAkB,MAAM,OAAO,WAAW,YAAY,aAAa,mBAAmB,uBAAuB,mBAAmB,iCAAiC,aAAa,mBAAmB,uBAAuB,iBAAiB,6BAA6B,8BAA8B,aAAa,qCAAqC;;ACA9+D,sBAAsB,kBAAkB,cAAc,YAAY,aAAa,WAAW,WAAW,uBAAuB,SAAS,UAAU,mDAAmD,qBAAqB,sBAAsB,mCAAmC,WAAW,0BAA0B,sBAAsB,UAAU,WAAW,eAAe,mCAAmC,cAAc,4BAA4B,oBAAoB,+EAA+E,kDAAkD,kCAAkC,kHAAkH,SAAS,6CAA6C,2BAA2B,kCAAkC,UAAU,oBAAoB,wCAAwC,iDAAiD,4EAA4E,2FAA2F,kFAAkF,kEAAkE,8BAA8B,WAAW,gBAAgB,WAAW,UAAU,WAAW,4BAA4B,WAAW,gBAAgB,aAAa,mBAAmB,gBAAgB,mCAAmC,4CAA4C,iDAAiD,gBAAgB,0BAA0B,4BAA4B,UAAU,gBAAgB,oCAAoC,WAAW,YAAY,0BAA0B,oCAAoC,eAAe,iBAAiB,4BAA4B,iBAAiB,mBAAmB,gBAAgB,uBAAuB,YAAY,0BAA0B,4BAA4B,qBAAqB,8BAA8B,iBAAiB,aAAa,wCAAwC,kBAAkB,kBAAkB,0CAA0C,eAAe,mDAAmD;;ACArvE,yBAAyB,gBAAgB,mCAAmC,mBAAmB,2BAA2B,YAAY,eAAe,gBAAgB,kBAAkB,mBAAmB,qBAAqB,8BAA8B,8CAA8C,SAAS,oDAAoD,+BAA+B,+BAA+B,qBAAqB,aAAa,YAAY,yBAAyB,mBAAmB,2CAA2C,eAAe,kBAAkB,gBAAgB,2CAA2C,qBAAqB,0CAA0C,sBAAsB,uCAAuC,uBAAuB,qCAAqC,mCAAmC,8CAA8C,kBAAkB,mBAAmB,kBAAkB,gBAAgB,uBAAuB,2DAA2D,WAAW,YAAY,qBAAqB,sBAAsB,oBAAoB,qCAAqC,aAAa,mBAAmB,6CAA6C,iBAAiB,sDAAsD,cAAc;;ACAt0C,yBAAyB,iBAAiB,qFAAqF,qCAAqC,8BAA8B,qBAAqB,0BAA0B,YAAY,sBAAsB,eAAe,WAAW,6BAA6B,kCAAkC,sDAAsD,wBAAwB,mBAAmB,sBAAsB,mBAAmB,4BAA4B,YAAY,kCAAkC,gBAAgB,uBAAuB,yCAAyC,wBAAwB,gDAAgD,aAAa,gCAAgC,cAAc,eAAe,iBAAiB,sBAAsB,uBAAuB,oBAAoB,uCAAuC,kBAAkB,qBAAqB,iBAAiB,WAAW,6BAA6B,yBAAyB,iBAAiB,uBAAuB,aAAa,8BAA8B,gCAAgC;;ACAvoC,aAAa,aAAa,YAAY,mBAAmB,8BAA8B,kBAAkB,oBAAoB,wBAAwB,aAAa,cAAc,eAAe,mBAAmB,eAAe,kBAAkB,gBAAgB,kCAAkC,uCAAuC,kBAAkB;;ACA9V,YAAY,aAAa,sBAAsB,YAAY,gBAAgB,wBAAwB,OAAO,gBAAgB,qBAAqB,mBAAmB,UAAU,4BAA4B,0BAA0B,gDAAgD,mBAAmB,6BAA6B,kBAAkB,oBAAoB,qBAAqB,qCAAqC,gBAAgB,mBAAmB,kCAAkC,qCAAqC,WAAW,kBAAkB,WAAW,WAAW,gCAAgC,aAAa,SAAS,6EAA6E,eAAe,sBAAsB,oCAAoC,mBAAmB,6FAA6F,UAAU,cAAc,sHAAsH,6BAA6B,wBAAwB,2CAA2C,sIAAsI,aAAa,qBAAqB,aAAa,yCAAyC,kBAAkB,YAAY,YAAY,gBAAgB,uBAAuB,sBAAsB,0BAA0B,iBAAiB,kCAAkC,kBAAkB,mBAAmB,wBAAwB,aAAa,cAAc,qCAAqC,mBAAmB,gBAAgB,kCAAkC,iBAAiB,oCAAoC,+BAA+B,sDAAsD,uBAAuB,2BAA2B,uBAAuB,8DAA8D,YAAY,4EAA4E,cAAc,yBAAyB,6DAA6D,aAAa,kCAAkC,2EAA2E,WAAW,+DAA+D,iBAAiB,uEAAuE,YAAY,yDAAyD,wBAAwB,gEAAgE,aAAa,gBAAgB,0BAA0B,sBAAsB,oBAAoB,4BAA4B,sBAAsB,6CAA6C,kCAAkC,mBAAmB,gBAAgB,2BAA2B,oBAAoB,mDAAmD,YAAY,yBAAyB,gBAAgB,kBAAkB,kHAAkH,+BAA+B,yHAAyH,WAAW,iBAAiB,eAAe,qCAAqC,cAAc,qBAAqB,4BAA4B,kBAAkB,aAAa,cAAc,iBAAiB,8BAA8B,qBAAqB,iDAAiD,yCAAyC,iCAAiC,gBAAgB,kBAAkB,8BAA8B,gDAAgD,cAAc,2DAA2D,kBAAkB,oEAAoE,iBAAiB,eAAe,0BAA0B,YAAY,oCAAoC,eAAe;;ACA9/H,yBAAyB,wBAAwB,gBAAgB,yBAAyB,iBAAiB,kBAAkB,kDAAkD,gBAAgB,2BAA2B,kBAAkB,YAAY,WAAW,iDAAiD,wBAAwB,gBAAgB,cAAc,kBAAkB,gCAAgC,WAAW,cAAc,iBAAiB,qCAAqC,kBAAkB,MAAM,OAAO,kDAAkD,qCAAqC,YAAY,mDAAmD,kEAAkE,gCAAgC,qDAAqD,gCAAgC,8CAA8C,gCAAgC,yDAAyD,gCAAgC,eAAe,mBAAmB,8CAA8C,sCAAsC,+DAA+D,qBAAqB,qDAAqD,gCAAgC,eAAe,mBAAmB,2CAA2C,sCAAsC,2DAA2D,qBAAqB,8CAA8C,gCAAgC,eAAe,mBAAmB,0CAA0C,sCAAsC,oDAAoD;;ACAptD,sBAAsB,iBAAiB,kBAAkB,aAAa,cAAc,mBAAmB,wBAAwB,mBAAmB,uBAAuB,sCAAsC,kBAAkB,YAAY,eAAe,eAAe,kBAAkB,gBAAgB,wBAAwB,4BAA4B,aAAa,0BAA0B,kBAAkB,MAAM,OAAO,WAAW,YAAY,wBAAwB,mBAAmB,iCAAiC,qCAAqC,6UAA6U,wBAAwB,6GAA6G,2BAA2B,8BAA8B,qBAAqB,6BAA6B,yCAAyC,oCAAoC,WAAW,cAAc,kBAAkB,OAAO,MAAM,WAAW,YAAY,iCAAiC,+BAA+B,oBAAoB,iCAAiC,aAAa,sCAAsC;;ACAh7C,gBAAgB,mCAAmC,aAAa,mBAAmB,gBAAgB,oBAAoB,+BAA+B,qBAAqB,kBAAkB,iBAAiB,kBAAkB,kCAAkC,yBAAyB;;ACA3R,4BAA4B,yCAAyC,2CAA2C,+CAA+C,8DAA8D,qBAAqB,mBAAmB,YAAY,8DAA8D,kCAAkC,yCAAyC,wBAAwB,qDAAqD,aAAa,uFAAuF,yBAAyB,kFAAkF,uBAAuB,iEAAiE,iBAAiB,qBAAqB,kEAAkE,eAAe,gBAAgB,SAAS,0EAA0E,cAAc,kBAAkB,eAAe,sBAAsB,kDAAkD,oBAAoB,gBAAgB,qBAAqB,iDAAiD,wBAAwB;;ACAjuC,mCAAmC,WAAW,aAAa,mBAAmB,8BAA8B,sCAAsC,aAAa,mBAAmB,8CAA8C,qBAAqB,oBAAoB,6CAA6C,aAAa,2BAA2B,mBAAmB,gDAAgD,eAAe,gBAAgB,mBAAmB,SAAS,gBAAgB,mBAAmB,uBAAuB,gBAAgB,8CAA8C,aAAa,yDAAyD,iBAAiB,+CAA+C,YAAY,2DAA2D,2BAA2B,6DAA6D,UAAU,cAAc,6CAA6C,mBAAmB,sBAAsB,+BAA+B,eAAe,wBAAwB;;ACA7iC,aAAa,qCAAqC,mBAAmB,sBAAsB,oBAAoB,4CAA4C,6BAA6B,aAAa,8BAA8B,uBAAuB,oCAAoC,cAAc,iBAAiB,kCAAkC,6CAA6C,cAAc,kBAAkB,0BAA0B,kBAAkB,UAAU,kCAAkC,WAAW,kBAAkB,WAAW,OAAO,cAAc,gBAAgB,sCAAsC,uBAAuB,YAAY,WAAW,gCAAgC,kBAAkB,WAAW,OAAO,cAAc,gBAAgB,qCAAqC,uBAAuB,oBAAoB,iCAAiC,wBAAwB,cAAc,WAAW,eAAe,qBAAqB,uBAAuB,uCAAuC,aAAa,4CAA4C,WAAW,eAAe,uBAAuB,yBAAyB,kBAAkB,uDAAuD,wBAAwB,uDAAuD,+BAA+B,YAAY,eAAe,cAAc,kBAAkB,eAAe,mBAAmB,8CAA8C,sCAAsC,6DAA6D,qBAAqB,mDAAmD,+BAA+B,YAAY,eAAe,cAAc,kBAAkB,eAAe,mBAAmB,2CAA2C,sCAAsC,yDAAyD,qBAAqB,4CAA4C,+BAA+B,YAAY,eAAe,cAAc,kBAAkB,eAAe,mBAAmB,0CAA0C,sCAAsC,kDAAkD,qBAAqB,6BAA6B,aAAa,wBAAwB,sBAAsB,sBAAsB,4BAA4B,mBAAmB,kBAAkB,eAAe,kCAAkC,0BAA0B,qEAAqE,wBAAwB,mCAAmC,gBAAgB,wCAAwC,gBAAgB,uCAAuC;;ACA9rF,eAAe,qBAAqB,WAAW,YAAY,cAAc,kDAAkD,wCAAwC,wBAAwB,eAAe,mEAAmE,kBAAkB,0BAA0B,eAAe,gBAAgB,0BAA0B,yBAAyB,eAAe,gBAAgB,mDAAmD,kBAAkB,MAAM,OAAO,WAAW,YAAY,mBAAmB,mBAAmB,sCAAsC,kBAAkB,YAAY,cAAc,cAAc,eAAe,iBAAiB,UAAU,wCAAwC,eAAe,qBAAqB,wDAAwD,4CAA4C;;ACAn3B,4CAA4C,oBAAoB,+DAA+D,WAAW,YAAY,mBAAmB,UAAU,cAAc,wBAAwB,eAAe,gBAAgB,yCAAyC,aAAa,sBAAsB,uBAAuB,iFAAiF;;ACA5a,eAAe,SAAS,oBAAoB,eAAe,kBAAkB,kDAAkD,kBAAkB,OAAO,MAAM,WAAW,YAAY,4BAA4B,gBAAgB,mBAAmB,+BAA+B,mEAAmE,kBAAkB,OAAO,MAAM,WAAW,YAAY,iBAAiB,sBAAsB,WAAW,cAAc,sCAAsC,UAAU,6BAA6B,+BAA+B,UAAU,qCAAqC,qBAAqB,kCAAkC,YAAY,aAAa,mBAAmB;;ACA1sB,gDAAgD,aAAa,cAAc,qCAAqC,mBAAmB,gBAAgB,oCAAoC,uBAAuB;;ACA9M,0DAA0D,gCAAgC,0FAA0F,kBAAkB,8CAA8C,gBAAgB,aAAa,kBAAkB,4CAA4C,cAAc,cAAc,uCAAuC,cAAc,WAAW,YAAY,2CAA2C,eAAe,wCAAwC,kBAAkB,aAAa,cAAc,aAAa,cAAc,yCAAyC,sBAAsB,YAAY,oDAAoD,YAAY,uCAAuC,uBAAuB,aAAa,oDAAoD,gBAAgB,mEAAmE,mDAAmD,gEAAgE,oBAAoB,+DAA+D,mBAAmB,mDAAmD,aAAa,cAAc,qCAAqC,mBAAmB,gBAAgB,uDAAuD,eAAe,iDAAiD,iCAAiC,8DAA8D,2CAA2C,yDAAyD,8DAA8D,cAAc,WAAW,WAAW,iBAAiB;;ACA1tD,QAAQ,kBAAkB,cAAc,iBAAiB,kBAAkB,aAAa,cAAc,sBAAsB,kDAAkD,QAAQ,YAAY,aAAa,sBAAsB,YAAY,YAAY,aAAa,yBAAyB,kBAAkB,OAAO,MAAM,WAAW,YAAY,gCAAgC,aAAa,wBAAwB,WAAW,YAAY,qBAAqB;;ACA1c,UAAU,YAAY,cAAc,aAAa,sBAAsB,gBAAgB,sBAAsB,aAAa,YAAY,8BAA8B,mBAAmB,4BAA4B,WAAW,6CAA6C,6BAA6B,8BAA8B,kBAAkB,mCAAmC,yCAAyC,gBAAgB,kCAAkC,aAAa,sBAAsB,iDAAiD,cAAc,YAAY,0BAA0B,iBAAiB,mBAAmB,iCAAiC,iBAAiB,qBAAqB,yBAAyB,aAAa,sBAAsB,mBAAmB,sBAAsB,kBAAkB,sCAAsC,WAAW,uBAAuB,WAAW,YAAY,qBAAqB,kBAAkB,wCAAwC,kBAAkB,OAAO,MAAM,WAAW,YAAY,+CAA+C,aAAa,oBAAoB,sBAAsB,uBAAuB,uBAAuB,kBAAkB,+BAA+B,qBAAqB,6BAA6B,aAAa,uBAAuB,mBAAmB,gBAAgB,iBAAiB,iBAAiB,SAAS,2CAA2C,oBAAoB,kBAAkB,8BAA8B,mBAAmB,cAAc,SAAS,eAAe,0CAA0C,2BAA2B,yBAAyB,gBAAgB,sBAAsB,eAAe,kCAAkC,mBAAmB,kBAAkB,+BAA+B,iBAAiB,2BAA2B,mBAAmB,kCAAkC,mBAAmB,qBAAqB,oDAAoD,eAAe,oCAAoC,iBAAiB,uBAAuB,kCAAkC,eAAe,sBAAsB,kCAAkC,gBAAgB,sBAAsB,2CAA2C,iBAAiB,yBAAyB,oBAAoB,oCAAoC,gBAAgB,8CAA8C,oBAAoB,wDAAwD,WAAW,oDAAoD,YAAY,kBAAkB,iBAAiB,kCAAkC,6GAA6G,cAAc,gBAAgB,qDAAqD,oBAAoB,wDAAwD,mBAAmB,mBAAmB,kCAAkC,kEAAkE,oBAAoB,8DAA8D,wBAAwB,8DAA8D,sBAAsB,uBAAuB,sDAAsD,yBAAyB,wDAAwD,cAAc,2CAA2C,qBAAqB,4DAA4D,mBAAmB,gBAAgB,eAAe,mDAAmD,WAAW,YAAY,kBAAkB,yDAAyD,eAAe,iBAAiB,sBAAsB,gBAAgB,0DAA0D,mBAAmB,iBAAiB,kCAAkC,+HAA+H,iBAAiB,6DAA6D,WAAW,cAAc,kBAAkB,4BAA4B,wBAAwB,qDAAqD,sBAAsB,8CAA8C,gBAAgB,gEAAgE,gBAAgB,sBAAsB,yCAAyC,kBAAkB,gBAAgB,wCAAwC,YAAY,4CAA4C,aAAa,uBAAuB,iBAAiB,eAAe;;ACA/oJ,SAAS,YAAY,gBAAgB,kBAAkB,eAAe,yCAAyC,gBAAgB,sBAAsB,kBAAkB,aAAa,sBAAsB,yDAAyD,mBAAmB,oBAAoB,sBAAsB,6BAA6B,yBAAyB,4BAA4B,sBAAsB,kCAAkC,4CAA4C,kCAAkC,eAAe,gBAAgB,oBAAoB,yCAAyC,kBAAkB,oBAAoB,kBAAkB;;ACA5qB,eAAe,YAAY,gBAAgB,0BAA0B;;ACArE,oBAAoB,kBAAkB,eAAe,4BAA4B,qBAAqB,8GAA8G,8BAA8B,kBAAkB;;ACApQ,+BAA+B,eAAe,eAAe,0BAA0B,+BAA+B,iBAAiB,+BAA+B,oBAAoB,gCAAgC,kBAAkB,UAAU,2BAA2B,kBAAkB,WAAW,aAAa,gBAAgB,gBAAgB,kBAAkB,gBAAgB,iCAAiC,iBAAiB,0CAA0C,+CAA+C,wCAAwC,qBAAqB,0BAA0B,WAAW,kBAAkB;;ACA5nB,qBAAqB,eAAe,MAAM,OAAO,QAAQ,aAAa,6BAA6B,2BAA2B,kBAAkB,eAAe,qCAAqC,sCAAsC,mCAAmC,6BAA6B;;ACA1S,sBAAsB,kBAAkB,MAAM,OAAO,+BAA+B,WAAW,cAAc,mCAAmC,aAAa,mBAAmB,2BAA2B,mCAAmC,oBAAoB,OAAO,sBAAsB,kBAAkB,SAAS,OAAO,+BAA+B,WAAW,cAAc,mCAAmC,aAAa,mBAAmB,kBAAkB,qBAAqB,+BAA+B,OAAO,kCAAkC,sEAAsE;;ACAjnB,gBAAgB,wBAAwB,gBAAgB,sBAAsB,WAAW,0BAA0B,gBAAgB,yBAAyB,8CAA8C,SAAS,+DAA+D,gBAAgB,oDAAoD,aAAa,qDAAqD,0BAA0B,cAAc,sDAAsD,eAAe,+DAA+D,WAAW,oCAAoC,iBAAiB,kCAAkC,mBAAmB,0CAA0C,YAAY,uCAAuC;;ACAtxB,iBAAiB,kCAAkC,+BAA+B,mBAAmB,0BAA0B,+BAA+B,gBAAgB,uBAAuB,gCAAgC,+BAA+B,iCAAiC,0BAA0B,gCAAgC,uBAAuB,gCAAgC,iBAAiB,cAAc,aAAa,eAAe,qBAAqB,0EAA0E,OAAO,0BAA0B,aAAa,qBAAqB,2CAA2C,iBAAiB,gGAAgG,YAAY,iBAAiB,gBAAgB,0GAA0G,mBAAmB,mCAAmC,iBAAiB,cAAc,cAAc,aAAa,sBAAsB,wBAAwB,0DAA0D,qBAAqB,8CAA8C,0BAA0B,6CAA6C,kBAAkB,2DAA2D,mCAAmC,6DAA6D,mBAAmB,UAAU,8BAA8B,kBAAkB,2EAA2E,WAAW,kBAAkB,OAAO,MAAM,QAAQ,SAAS,2CAA2C,oBAAoB,UAAU,yBAAyB,UAAU,sCAAsC,mDAAmD,yCAAyC,qCAAqC,sCAAsC,aAAa,uBAAuB,mBAAmB,2BAA2B,8CAA8C,YAAY,6CAA6C,UAAU,wIAAwI,oBAAoB,mFAAmF;;ACAn3E,yBAAyB,mBAAmB,8BAA8B,0BAA0B,+BAA+B,oBAAoB,mCAAmC,mBAAmB,2BAA2B,kCAAkC,eAAe,gBAAgB,sBAAsB,yBAAyB,6BAA6B,kBAAkB,6CAA6C,iBAAiB,cAAc,mCAAmC,gCAAgC,0BAA0B,yBAAyB,gBAAgB,gBAAgB,4DAA4D,mBAAmB,2BAA2B,kBAAkB,yCAAyC,mBAAmB,iDAAiD,kBAAkB,cAAc,gBAAgB,sBAAsB,kBAAkB,sCAAsC,qBAAqB,4BAA4B,kBAAkB,iBAAiB,kBAAkB,kCAAkC,kBAAkB,kBAAkB,yBAAyB,2BAA2B,mCAAmC;;ACAntC,aAAa,oBAAoB,mBAAmB,uBAAuB,aAAa,cAAc,gBAAgB,kDAAkD,eAAe,kBAAkB,mBAAmB,6BAA6B,sCAAsC,yBAAyB,oBAAoB,sCAAsC,kDAAkD,iBAAiB,WAAW;;ACAhc,aAAa,YAAY,kBAAkB,yBAAyB,gBAAgB,eAAe,0BAA0B,kBAAkB,wBAAwB,wCAAwC,aAAa,eAAe,oBAAoB,YAAY,6CAA6C,aAAa,mBAAmB,6BAA6B,+CAA+C,0BAA0B,oBAAoB,gBAAgB,kBAAkB,cAAc,mBAAmB,oBAAoB,qBAAqB,8BAA8B,uCAAuC,SAAS,6CAA6C,+BAA+B,uCAAuC,oBAAoB,sBAAsB,2BAA2B,WAAW,cAAc,cAAc,YAAY;;ACAv3B,eAAe,YAAY,oBAAoB,kBAAkB,yBAAyB,gBAAgB,eAAe,0BAA0B,oBAAoB,wBAAwB,sBAAsB,YAAY,6CAA6C,mBAAmB,gBAAgB,kBAAkB,mBAAmB,+CAA+C,qBAAqB,8BAA8B,yCAAyC,SAAS,+CAA+C,+BAA+B,6BAA6B,WAAW,cAAc,cAAc,YAAY,YAAY,0CAA0C,oBAAoB,sBAAsB,wDAAwD,qBAAqB,qIAAqI,aAAa,cAAc,WAAW,YAAY,6DAA6D,WAAW,YAAY,kBAAkB,aAAa,mBAAmB,uBAAuB,+IAA+I,WAAW,YAAY,kBAAkB,MAAM,OAAO,qCAAqC,YAAY,cAAc,0BAA0B,qCAAqC,YAAY,mCAAmC,yBAAyB,eAAe,iBAAiB;;ACApjD,WAAW,aAAa,mBAAmB,uBAAuB,eAAe,6BAA6B,eAAe,gBAAgB,kBAAkB,sBAAsB,mBAAmB,oBAAoB,uBAAuB,sBAAsB,uBAAuB,sBAAsB,iCAAiC,wCAAwC,8BAA8B,kBAAkB,uCAAuC,WAAW,YAAY,iBAAiB,uBAAuB,yBAAyB,kBAAkB,oBAAoB,kBAAkB;;ACAtmB,WAAW,aAAa,qCAAqC,uBAAuB,iBAAiB,qBAAqB,YAAY,gBAAgB,gBAAgB,gDAAgD,mBAAmB;;ACAzO,wBAAwB,eAAe,OAAO,QAAQ,SAAS,mCAAmC,gGAAgG,UAAU,6CAA6C,6BAA6B,+BAA+B,uDAAuD,gGAAgG,+CAA+C,gBAAgB,iDAAiD,8CAA8C,iBAAiB,+BAA+B,iCAAiC,0DAA0D,mBAAmB,wCAAwC,0CAA0C,aAAa,mBAAmB,uBAAuB,+CAA+C,kBAAkB,2BAA2B,cAAc,0BAA0B,gBAAgB,gBAAgB,UAAU,qCAAqC,oBAAoB,6CAA6C,iBAAiB,gDAAgD,kBAAkB,aAAa,gDAAgD,kBAAkB,cAAc,8BAA8B,YAAY,uCAAuC,iCAAiC,sCAAsC,kBAAkB,UAAU,OAAO,WAAW,aAAa,cAAc,oBAAoB,UAAU,+BAA+B,gBAAgB,6BAA6B,iCAAiC,aAAa,mBAAmB,uBAAuB,kCAAkC,iCAAiC,aAAa,kBAAkB,aAAa,WAAW,gCAAgC,iCAAiC,eAAe,YAAY,mBAAmB,iBAAiB,eAAe,sBAAsB,gBAAgB,SAAS,oBAAoB,kDAAkD,gBAAgB,mBAAmB,uBAAuB,mBAAmB,uBAAuB,sBAAsB,mBAAmB,mBAAmB,cAAc,0BAA0B,gBAAgB,iBAAiB,UAAU,iFAAiF,gBAAgB,8CAA8C,cAAc,0CAA0C;;ACAhjF,YAAY,kBAAkB,sCAAsC,kBAAkB,UAAU,UAAU,QAAQ,aAAa,mCAAmC;;ACAlK,gBAAgB,aAAa,2DAA2D,oBAAoB,mBAAmB,uBAAuB;;ACAtJ,sBAAsB,sBAAsB,gBAAgB,iDAAiD,uBAAuB,aAAa,sBAAsB,yBAAyB,gBAAgB,cAAc,0BAA0B,uBAAuB,iBAAiB,4BAA4B,aAAa,mBAAmB,iCAAiC,mBAAmB,+BAA+B,OAAO,WAAW,YAAY,qBAAqB,kDAAkD,sCAAsC,mCAAmC,2BAA2B,gBAAgB,oBAAoB,qCAAqC,WAAW,wCAAwC,uCAAuC;;ACA3xB,gBAAgB,kBAAkB,cAAc,0CAA0C,kBAAkB,UAAU,UAAU,QAAQ,aAAa,uCAAuC,mBAAmB,wBAAwB;;ACAvO,cAAc,aAAa,oBAAoB,gBAAgB,mBAAmB,kBAAkB,2BAA2B;;ACA/H,iDAAiD,gCAAgC,iCAAiC,wDAAwD,cAAc,uBAAuB,mBAAmB,mDAAmD,cAAc,WAAW,YAAY,iBAAiB,gDAAgD,oBAAoB,qBAAqB,uBAAuB,wBAAwB,gBAAgB,iBAAiB,mCAAmC,WAAW,iBAAiB,6BAA6B,aAAa,cAAc,kBAAkB,2BAA2B,YAAY,mBAAmB,gBAAgB,gBAAgB,uBAAuB,yBAAyB,mBAAmB,oBAAoB,qBAAqB,4BAA4B,gBAAgB,uBAAuB,gBAAgB,uBAAuB,8DAA8D;;ACA3+B,aAAa,SAAS,oBAAoB,gBAAgB,kBAAkB,eAAe,iBAAiB,kBAAkB,OAAO,MAAM,WAAW,YAAY;;ACAlK,kBAAkB,2BAA2B,oCAAoC,cAAc,gBAAgB,0BAA0B,aAAa,qCAAqC,aAAa,UAAU,0BAA0B,0BAA0B,sCAAsC,qCAAqC,mBAAmB,sDAAsD,4BAA4B,6BAA6B,qCAAqC,wBAAwB,yCAAyC,cAAc,SAAS,SAAS,oBAAoB,gBAAgB,uJAAuJ,kBAAkB,MAAM,OAAO,sBAAsB,uBAAuB,0BAA0B,uJAAuJ,WAAW,YAAY,oCAAoC;;ACA5kC,aAAa,YAAY,iBAAiB,gBAAgB,0BAA0B,aAAa,uBAAuB,gBAAgB,kCAAkC,uBAAuB;;ACAjM,eAAe,YAAY,iBAAiB,gBAAgB,4BAA4B,aAAa,uBAAuB,gBAAgB,kCAAkC,4BAA4B,mBAAmB,mCAAmC,aAAa,8BAA8B,eAAe,kDAAkD,gBAAgB,0CAA0C,eAAe,sBAAsB,SAAS,gBAAgB,mBAAmB,uBAAuB,0CAA0C,kCAAkC,SAAS,2CAA2C,cAAc,iBAAiB,oDAAoD,mCAAmC,kCAAkC,qHAAqH,+CAA+C,iCAAiC,aAAa,iBAAiB,gBAAgB,oDAAoD,iBAAiB,6CAA6C,cAAc,kBAAkB,8BAA8B;;ACAzsC,WAAW,YAAY,gBAAgB,0BAA0B,YAAY,cAAc,+BAA+B,aAAa,qCAAqC,uBAAuB,iBAAiB,qBAAqB,wBAAwB,6BAA6B,gBAAgB;;ACA9S,mBAAmB,6CAA6C,wBAAwB,aAAa,8BAA8B,gCAAgC,aAAa,mBAAmB,mBAAmB,sBAAsB,gBAAgB,kCAAkC,+BAA+B,gBAAgB,MAAM,mCAAmC,0BAA0B,gCAAgC,kCAAkC,mCAAmC,iBAAiB,6CAA6C,cAAc,kBAAkB,gCAAgC,iBAAiB,kBAAkB,gBAAgB,0BAA0B,gCAAgC,kBAAkB,yCAAyC,wBAAwB,oEAAoE,qBAAqB,6EAA6E,oBAAoB,eAAe,mCAAmC,0BAA0B,wBAAwB,uDAAuD,iBAAiB,eAAe,8BAA8B,sBAAsB,kBAAkB;;ACA9uC,aAAa,YAAY,kBAAkB,aAAa,sBAAsB,oBAAoB,sBAAsB,kBAAkB,MAAM,OAAO,SAAS,QAAQ,kCAAkC,4BAA4B,sBAAsB,cAAc,kBAAkB,0BAA0B,4BAA4B,gBAAgB,gCAAgC,0CAA0C,YAAY;;ACAxb,YAAY,kBAAkB,YAAY,2BAA2B,YAAY,kBAAkB,kBAAkB,qBAAqB,oBAAoB,0CAA0C,0BAA0B,eAAe,mCAAmC,gBAAgB,iBAAiB,+BAA+B,gBAAgB,+BAA+B,2BAA2B,yCAAyC,gBAAgB,mCAAmC,cAAc,eAAe,mBAAmB,kBAAkB,oDAAoD,kBAAkB,OAAO,MAAM,WAAW,YAAY,2DAA2D,aAAa,+BAA+B,iBAAiB,0CAA0C,gBAAgB,yDAAyD,oBAAoB,gEAAgE,gBAAgB,mBAAmB,gDAAgD,gBAAgB,mBAAmB,mEAAmE,qBAAqB,sCAAsC,gBAAgB,mBAAmB,kCAAkC,gDAAgD,mBAAmB,mCAAmC,kCAAkC,qBAAqB,6CAA6C,mBAAmB,mCAAmC,kCAAkC,kBAAkB,8BAA8B,iBAAiB,kCAAkC,YAAY,wBAAwB,wBAAwB,yBAAyB,gBAAgB,gCAAgC,oBAAoB,mBAAmB,2CAA2C,sBAAsB,6CAA6C,cAAc,WAAW,eAAe,4CAA4C,eAAe,aAAa,eAAe,oBAAoB;;ACAhlE,cAAc,oBAAoB,iBAAiB,iBAAiB,kCAAkC;;ACAtG,UAAU,oBAAoB,iBAAiB,kCAAkC,gBAAgB,oBAAoB,sBAAsB;;ACA3I,UAAU,iBAAiB,uBAAuB,aAAa,mBAAmB,cAAc,2BAA2B,YAAY,aAAa,gCAAgC,iBAAiB,mBAAmB,+BAA+B,iBAAiB,iBAAiB,kCAAkC,sBAAsB,YAAY,uCAAuC,kBAAkB,aAAa,mBAAmB,4BAA4B,kCAAkC,gBAAgB,4CAA4C,wBAAwB,8CAA8C,aAAa,YAAY,wBAAwB,0CAA0C,aAAa,4CAA4C,aAAa,0BAA0B,gBAAgB,8CAA8C,iBAAiB,kCAAkC,kBAAkB,aAAa,8DAA8D,kFAAkF,qBAAqB,mBAAmB,cAAc,yDAAyD,eAAe,sBAAsB,gBAAgB,gBAAgB,sBAAsB,wBAAwB,0BAA0B,wDAAwD,gBAAgB,mBAAmB;;ACAx6C,WAAW,kBAAkB,qDAAqD,kBAAkB,uBAAuB,kBAAkB,UAAU,UAAU,UAAU,2BAA2B;;ACAtM,aAAa,oBAAoB,gBAAgB,iBAAiB,kCAAkC,qBAAqB,4BAA4B,aAAa,8BAA8B,yCAAyC,aAAa,cAAc;;ACApQ,8BAA8B,oBAAoB,sBAAsB,kBAAkB,4BAA4B,6BAA6B,WAAW,oBAAoB,aAAa,mBAAmB,mBAAmB,mCAAmC,6CAA6C,yBAAyB,gBAAgB,mBAAmB,uBAAuB,mBAAmB,0BAA0B,aAAa,6BAA6B,aAAa,eAAe,aAAa,mBAAmB,uBAAuB,+BAA+B,aAAa,gBAAgB,uBAAuB,cAAc,WAAW,YAAY,kBAAkB,sBAAsB,kBAAkB,+BAA+B,gCAAgC,WAAW,oBAAoB,mCAAmC,0CAA0C,6BAA6B,oBAAoB,gBAAgB,4BAA4B,YAAY,6BAA6B,UAAU,gBAAgB,iGAAiG,4BAA4B,gBAAgB,0BAA0B","file":"3.c4d4bc793e11d4bb6728.css","sourcesContent":[".SenderInfo{display:flex;align-content:center;color:white;cursor:pointer;opacity:.5;transition:.15s opacity}.SenderInfo:hover{opacity:1}.SenderInfo .Avatar{margin-inline-end:1rem}@media (max-width: 600px){.SenderInfo .Avatar{display:none}}.SenderInfo .meta{display:flex;flex-direction:column;justify-content:center;max-width:100%}.SenderInfo .title{line-height:1.45rem;font-weight:500;white-space:pre;overflow:hidden;text-overflow:ellipsis}.SenderInfo .date{line-height:1.25rem;font-size:0.875rem;letter-spacing:-0.01rem}\n",".MediaViewerActions{display:flex;margin-inline-start:auto;margin-inline-end:-.375rem}.MediaViewerActions .Button{margin-inline-start:.25rem}.MediaViewerActions-mobile{position:relative}.MediaViewerActions-mobile .ProgressSpinner{position:absolute;top:0;left:0}\n",".MediaViewerFooter{position:absolute;bottom:0;padding:1rem 0;width:100%;transition:opacity .15s}#MediaViewer.zoomed .MediaViewerFooter{display:none}@media (max-height: 640px){.MediaViewerFooter{padding:.5rem 0 0}}@media (max-width: 600px){.MediaViewerFooter{padding-bottom:4.5rem;background:linear-gradient(to top, #000 0%, rgba(0,0,0,0) 100%)}.MediaViewerFooter.is-for-video{opacity:0;pointer-events:none}.video-controls-visible .MediaViewerFooter.is-for-video{opacity:1;pointer-events:all}}.MediaViewerFooter .media-viewer-footer-content{position:relative;max-width:var(--messages-container-width);margin:auto;cursor:pointer;opacity:.5;transition:opacity .15s}.MediaViewerFooter .media-viewer-footer-content:hover{opacity:1}@media (max-width: 600px){.MediaViewerFooter .media-viewer-footer-content{opacity:1}}.MediaViewerFooter.is-hidden{opacity:0}.MediaViewerFooter .media-text{margin-bottom:0;overflow:auto;padding:0 .5rem;text-align:center;color:rgba(255,255,255,0.9);font-size:.9375rem;letter-spacing:.025rem;max-height:4.25rem}@media (max-height: 640px){.MediaViewerFooter .media-text{max-height:2.75rem}}.MediaViewerFooter .media-text .emoji{width:.9375rem;height:.9375rem;vertical-align:-2px}.MediaViewerFooter .media-text.multiline::before{content:'';position:absolute;left:-.75rem;right:-.75rem;top:-.25rem;bottom:-.25rem;background:rgba(0,0,0,0.75);border-radius:var(--border-radius-default);z-index:var(--z-below)}@media (max-width: 600px){.MediaViewerFooter .media-text.multiline::before{display:none;background:none}}.MediaViewerFooter a{color:var(--color-links)}.MediaViewerFooter a:hover,.MediaViewerFooter a:focus{color:var(--color-links-hover)}\n",".VideoPlayerControls{display:flex;align-items:center;position:absolute;left:0;bottom:0;width:100%;padding-top:.625rem;font-size:.875rem;background:linear-gradient(to top, #000 0%, rgba(0,0,0,0) 100%)}#MediaViewer.zoomed .VideoPlayerControls{display:none}@media (max-width: 600px){.VideoPlayerControls{position:fixed;padding:1.25rem .5rem .75rem;background:none;z-index:var(--z-media-viewer)}}.VideoPlayerControls.mobile .player-file-size{position:static;left:auto;transform:none;margin-left:auto}.VideoPlayerControls.mobile .fullscreen{margin-left:1rem}.VideoPlayerControls.mobile .player-time+.fullscreen{margin-left:auto}.VideoPlayerControls .Button{width:2.25rem;padding:0;margin:.25rem;height:1.75rem}@media (max-width: 600px){.VideoPlayerControls .Button{height:2.25rem}}.VideoPlayerControls .play i{line-height:1.5rem}.VideoPlayerControls .player-time{margin:0 1rem;white-space:nowrap}.VideoPlayerControls .fullscreen{margin-left:auto}@media (max-width: 600px){.VideoPlayerControls .fullscreen{margin-left:1rem}}.VideoPlayerControls .fullscreen i{line-height:1.75rem}@media (max-width: 600px){.VideoPlayerControls .fullscreen i{font-size:1.5rem}}@media (max-width: 600px){.VideoPlayerControls .player-time+.fullscreen{margin-left:auto}}.VideoPlayerControls .player-file-size{position:absolute;left:50%;transform:translateX(-50%);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media (max-width: 600px){.VideoPlayerControls .player-file-size{position:static;left:auto;transform:none;margin-left:auto;margin-right:1rem}.VideoPlayerControls .player-file-size+.fullscreen{margin-left:0}}.VideoPlayerControls .player-seekline{position:absolute;left:1rem;right:1rem;top:0;height:1rem}.VideoPlayerControls .player-seekline-track{position:absolute;top:50%;left:-.25rem;right:-.25rem;height:5px;transform:translateY(-50%);background-color:rgba(255,255,255,0.16);border-radius:var(--border-radius-default)}.VideoPlayerControls .player-seekline-buffered,.VideoPlayerControls .player-seekline-played,.VideoPlayerControls .player-seekline-input{position:absolute;top:0;left:0;height:100%;border-radius:var(--border-radius-default)}.VideoPlayerControls .player-seekline-buffered{background-color:rgba(255,255,255,0.5)}.VideoPlayerControls .player-seekline-played{background:var(--color-primary)}.VideoPlayerControls .player-seekline-played::after{content:'';position:absolute;width:.75rem;height:.75rem;border-radius:50%;background-color:var(--color-primary);right:0;top:50%;transform:translate(0.325rem, -50%)}.VideoPlayerControls .player-seekline-input{width:100%;opacity:0;margin:0;padding:0;cursor:pointer;overflow:hidden}.VideoPlayerControls .player-seekline-input::-webkit-slider-thumb{margin-top:-2rem}\n",".VideoPlayer{position:relative;display:inline-flex;flex-direction:column;overflow:hidden}#MediaViewer.zoomed .VideoPlayer{position:absolute;top:0;right:0;bottom:0;left:0}#MediaViewer.zoomed .VideoPlayer>div{width:100% !important;height:100% !important}#MediaViewer.zoomed .VideoPlayer video{max-height:none !important}@media (min-width: 601px){.VideoPlayer{z-index:1}}@media (max-width: 600px){.VideoPlayer{overflow:visible}}@media (max-height: 640px){.VideoPlayer{margin-bottom:1.75rem}.has-footer .VideoPlayer{margin-bottom:0}}.VideoPlayer video{display:block;max-height:calc(100vh - 8.25rem);margin:auto;object-fit:contain;outline:none;width:100%;height:100%;background:no-repeat 50% 50%;background-size:contain}@media (max-height: 640px){.VideoPlayer video{max-height:calc(100vh - 10rem)}}.has-footer .VideoPlayer video{max-height:calc(100vh - 15rem)}@media (max-height: 640px){.has-footer .VideoPlayer video{max-height:calc(100vh - 10rem)}}.VideoPlayer .play-button{position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);width:3.25rem;height:3.25rem;background-color:rgba(0,0,0,0.5) !important}body:not(.animation-level-0) .VideoPlayer .play-button{transition:opacity .3s ease !important}.VideoPlayer .play-button .icon-play{font-size:1.75rem;position:relative;left:.125rem}.VideoPlayer .spinner-container{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.VideoPlayer .spinner-container .buffering{background:rgba(0,0,0,0.25);color:#fff;font-size:0.75rem;position:absolute;left:0.1875rem;top:0.1875rem;z-index:1;padding:0 0.375rem;border-radius:0.75rem;line-height:1.125rem}.VideoPlayer .spinner-container .ProgressSpinner{cursor:pointer}\n",".ZoomControls{position:absolute;bottom:1.25rem;left:50%;background:rgba(0,0,0,0.5);border-radius:var(--border-radius-default);width:100%;height:3.375rem;max-width:274px;transform:translate3d(-50%, 0, 10px);transition:opacity .3s ease-in;pointer-events:none}.ZoomControls.open{z-index:var(--z-media-viewer);pointer-events:all}.ZoomControls .zoom-out,.ZoomControls .zoom-in{position:absolute;top:0.4375rem;width:2.5rem;height:2.5rem;color:#fff}.ZoomControls .zoom-out i,.ZoomControls .zoom-in i{font-size:1.5rem}.ZoomControls .zoom-out{left:.5rem}.ZoomControls .zoom-in{right:.5rem}.ZoomControls .seekline{position:absolute;left:3.25rem;right:3.25rem;top:1.125rem;height:1rem}.ZoomControls .seekline-track{position:absolute;top:50%;left:-.25rem;right:-.25rem;height:2px;transform:translateY(-50%);background-color:rgba(255,255,255,0.5);border-radius:var(--border-radius-default)}.ZoomControls .seekline-played,.ZoomControls .seekline-input{position:absolute;top:0;left:0;height:100%;border-radius:var(--border-radius-default)}.ZoomControls .seekline-played{background:#fff;transition:width 200ms}.ZoomControls .seekline-played::after{content:'';position:absolute;width:.75rem;height:.75rem;border-radius:50%;background-color:var(--color-white);right:0;top:50%;transform:translate(0.325rem, -50%)}.ZoomControls .seekline-input{width:100%;height:1rem;top:-.375rem;opacity:0;margin:0;padding:0;cursor:pointer;overflow:hidden}.ZoomControls .seekline-input::-webkit-slider-thumb{margin-top:-2rem}\n",".pan-wrapper,.pan-container{position:relative;width:100%;height:100%}.pan-wrapper{cursor:move;-webkit-user-select:none;user-select:none}.pan-container{transition:transform .2s ease-in}.pan-wrapper.move .pan-container{transition:none}.zoomed .pan-container{position:fixed;top:0;left:0}\n","#MediaViewer{position:fixed;top:0;left:0;width:100vw;height:100%;background:rgba(0,0,0,0.9);color:#fff;z-index:var(--z-media-viewer);padding:0.5rem 0;display:grid;grid-template-columns:auto;grid-template-rows:2.75rem 1fr;grid-column-gap:0;grid-row-gap:0;justify-items:stretch;align-items:center}#MediaViewer:not(.shown){display:block !important;transform:scale(0)}body.ghost-animating #MediaViewer>.pan-wrapper,body.ghost-animating #MediaViewer>.Transition,body.ghost-animating #MediaViewer>button{display:none}body.animation-level-2 #MediaViewer{transition-duration:.3s !important}#MediaViewer:not(.open) .SenderInfo,#MediaViewer .closing .SenderInfo{pointer-events:none;transition:none}#MediaViewer.zoomed .navigation{display:none}#MediaViewer.zoomed .media-viewer-head{z-index:2}#MediaViewer.zoomed .media-viewer-content{position:fixed;top:0;left:0;width:100vw;height:100vh;padding:0;z-index:1}#MediaViewer .media-viewer-head{display:flex;grid-area:1 / 1 / 2 / -2;padding:0 1.25rem;position:relative;z-index:var(--z-media-viewer-head);min-width:0}#MediaViewer .media-viewer-head>.Transition{width:100%;min-width:0}@media (max-width: 600px){#MediaViewer .media-viewer-head{padding:0 0.5rem}#MediaViewer .media-viewer-head .media-viewer-close{margin-right:1.5rem}}#MediaViewer>.Transition,#MediaViewer>.pan-wrapper{grid-area:1 / 1 / -1 / -1}#MediaViewer>.Transition,#MediaViewer>.pan-wrapper .Transition{position:relative;justify-self:center;text-align:center;width:100%;height:100%;display:flex;align-items:center;overflow:hidden}#MediaViewer .media-viewer-content{position:relative;z-index:1;padding:3.25rem 0;height:100%;display:inline-flex;justify-content:center;align-items:center}#MediaViewer .media-viewer-content.has-footer{padding:7rem 0}@media (min-width: 600px){#MediaViewer .media-viewer-content.has-footer{min-width:600px}}@media (max-height: 640px){#MediaViewer .media-viewer-content.has-footer{padding:4rem 0}}#MediaViewer .media-viewer-content.has-footer>img{max-height:calc(100vh - 15rem)}@media (max-height: 640px){#MediaViewer .media-viewer-content.has-footer>img{max-height:calc(100vh - 10rem)}}#MediaViewer .media-viewer-content .thumbnail{position:relative}#MediaViewer .media-viewer-content .thumbnail img{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}#MediaViewer .media-viewer-content>img{max-width:100vw;max-height:calc(100vh - 8.25rem);object-fit:contain;transition:transform .2s}#MediaViewer .media-viewer-content .spinner-wrapper{max-width:100vw;margin:auto}#MediaViewer .media-viewer-content .Spinner{margin:auto}#MediaViewer .navigation{position:fixed;top:4rem;width:10vw;bottom:0;border:none;padding:0;margin:0;-webkit-appearance:none;appearance:none;background:transparent no-repeat;background-size:1.25rem;opacity:0;transition:opacity .15s;outline:none;cursor:pointer;z-index:1}@media (max-width: 600px){#MediaViewer .navigation{width:20vw}}#MediaViewer .navigation:hover,.is-touch-env #MediaViewer .navigation{opacity:1}#MediaViewer .navigation.prev{left:0;background-image:url(media_navigation_previous.11f3cfece8fead5a78e6349db2545210.svg);background-position:1.25rem calc(50% - 2rem)}#MediaViewer .navigation.prev[dir=rtl]{left:auto;right:0;transform:scaleX(-1)}#MediaViewer .navigation.next{right:0;background-image:url(media_navigation_next.3d6e264d21e73ad725738beb8e9dbbb8.svg);background-position:calc(100% - 1.25rem) calc(50% - 2rem)}#MediaViewer .navigation.next[dir=rtl]{left:0;right:auto;transform:scaleX(-1)}#MediaViewer .navigation.inline{top:calc(50% - 3rem);bottom:unset;height:6rem;background-position-y:center}@media (max-width: 600px){#MediaViewer .navigation.inline{opacity:0;transition:opacity .15s ease-in;pointer-events:none}.video-controls-visible #MediaViewer .navigation.inline{opacity:1;pointer-events:all}}.ghost{position:absolute;z-index:var(--z-media-viewer);will-change:transform, opacity;overflow:hidden;border-radius:0;transition:transform .2s ease, opacity .2s ease}.ghost.rounded-corners{border-radius:var(--border-radius-messages)}.ghost.circle{border-radius:50%}body.is-ios .ghost{transition:transform .2s ease, opacity .2s ease, border-radius .2s ease !important}.ghost img,.ghost video{width:100%;height:100%;user-select:none;-webkit-user-select:none;object-fit:cover}\n",".ForwardPicker{z-index:var(--z-media-viewer)}.ForwardPicker .modal-dialog{height:70%;max-width:25rem}@media (max-width: 600px){.ForwardPicker .modal-dialog{height:90%}}.ForwardPicker .modal-header{display:flex;align-items:center;padding:0.25rem 0.5rem}.ForwardPicker .modal-header .Button{margin-right:0.5rem}.ForwardPicker .modal-header .input-group{margin:0}.ForwardPicker .modal-header .form-control{border:none;box-shadow:none !important;height:2.75rem;padding:0.5rem;font-size:1.25rem;line-height:1.75rem;unicode-bidi:plaintext}.ForwardPicker .modal-content{padding:0;overflow:hidden;display:flex;flex-direction:column}.ForwardPicker .modal-content .picker-list{height:100%;overflow-x:hidden;overflow-y:auto;padding:0 1rem 1rem}.ForwardPicker .no-results{height:100%;margin:0;padding:1rem 1rem;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary)}@media (max-width: 600px){.ForwardPicker .ListItem.chat-item-clickable:not(.force-rounded-corners){margin:0}.ForwardPicker .ListItem.chat-item-clickable:not(.force-rounded-corners) .ListItem-button{border-radius:0}}\n","#Dialogs{position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:var(--z-modal)}\n",".CalendarModal .modal-dialog{max-width:26.25rem}.CalendarModal .modal-dialog .modal-content{padding:.375rem 1rem 1rem}.CalendarModal .timepicker{display:flex;align-items:center;justify-content:center;margin-bottom:1.5rem}.CalendarModal .timepicker .form-control{max-width:5rem;text-align:center}.CalendarModal .timepicker .form-control:first-child{margin-right:1rem}.CalendarModal .timepicker .form-control:last-child{margin-left:1rem}.CalendarModal .footer{display:flex;justify-content:flex-end;flex-direction:column}.CalendarModal .footer .Button{text-transform:none}.CalendarModal .footer .Button+.Button{margin-top:.5rem}.CalendarModal .month-selector{display:flex;align-items:center}.CalendarModal .month-selector h4{flex:1;margin:0 0 0 1.25rem;font-size:1.25rem}@media (max-width: 600px){.CalendarModal .month-selector h4{margin-left:.75rem}}.CalendarModal .month-selector h4 ~ .Button{color:var(--color-primary)}.CalendarModal .month-selector .Button.hidden{opacity:0.5;pointer-events:none}.CalendarModal .day-button{position:relative;border-radius:4rem;outline:none !important;font-weight:500;margin:.125rem .625rem}@media (max-width: 600px){.CalendarModal .day-button{margin:.25rem .375rem}}.CalendarModal .day-button.weekday{margin-bottom:0;height:1rem}.CalendarModal .day-button.clickable{cursor:pointer}.CalendarModal .day-button.clickable:hover{background-color:var(--color-interactive-element-hover)}.CalendarModal .day-button.clickable.selected{background-color:var(--color-primary);color:white}.CalendarModal .day-button.disabled{opacity:0.25;pointer-events:none}.CalendarModal .day-button::before{content:\"\";display:block;padding-top:100%}.CalendarModal .day-button span{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:0.875rem}.CalendarModal .calendar-wrapper{display:flex;align-items:center;justify-content:center;min-height:17rem;margin:1.5rem -0.5rem 0.5rem}.CalendarModal .calendar-grid{display:grid;grid-template-columns:repeat(7, 1fr);width:100%}\n",".MessageSelectToolbar{position:absolute;bottom:0.5rem;left:0.5rem;right:0.5rem;width:auto;z-index:20;justify-content:center;margin:0;opacity:1}.mask-image-disabled .MessageSelectToolbar::before{left:auto !important;right:auto !important}.no-composer .MessageSelectToolbar{width:100%}@media (min-width: 601px){.MessageSelectToolbar{left:1rem;right:1rem;bottom:1.25rem}.no-composer .MessageSelectToolbar{top:-4.75rem}}.MessageSelectToolbar-inner{transform:scaleX(1);transition:transform var(--select-transition),opacity var(--select-transition)}.MessageSelectToolbar .MessageSelectToolbar-inner{transform:scaleX(1) translateX(0)}.no-composer .unpin-button-container+.MessageSelectToolbar,.no-composer .messaging-disabled+.MessageSelectToolbar{top:auto}body.animation-level-0 .MessageSelectToolbar{transition:none !important}.MessageSelectToolbar:not(.shown){opacity:0;pointer-events:none}.MessageSelectToolbar:not(.shown)-inner{transform:scaleX(var(--toolbar-hidden-scale, 1))}.MessageSelectToolbar:not(.shown).with-composer .MessageSelectToolbar-inner{transform:scaleX(var(--toolbar-hidden-scale, 1)) translateX(var(--toolbar-translate-x, 0))}.MessageSelectToolbar:not(.shown):not(.with-composer) .MessageSelectToolbar-inner{transform:scaleX(var(--toolbar-unpin-hidden-scale)) translateX(0)}.MessageSelectToolbar::before{z-index:-1;max-width:32rem;width:100%;left:auto;right:auto}.MessageSelectToolbar-inner{width:100%;max-width:32rem;display:flex;align-items:center;padding:0.25rem;background:var(--color-background);border-radius:var(--border-radius-messages);box-shadow:0 1px 2px var(--color-default-shadow);font-weight:500}@media (max-width: 600px){.MessageSelectToolbar-inner{padding:0;max-width:none}}.MessageSelectToolbar-inner>.Button{width:3rem;height:3rem}@media (max-width: 600px){.MessageSelectToolbar-inner>.Button{width:2.875rem;height:2.875rem}}.MessageSelectToolbar-count{margin-left:1rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex-grow:1}@media (max-width: 600px){.MessageSelectToolbar-count{margin-right:0.5rem}}.MessageSelectToolbar-actions{margin-left:auto;display:flex}.MessageSelectToolbar-actions .MenuItem{padding:0.6875rem;border-radius:50%}.MessageSelectToolbar-actions .MenuItem i{margin-right:0}.MessageSelectToolbar-actions .MenuItem .item-text{display:none}\n",".RecentContacts .Loading{min-height:75vh}.RecentContacts .top-peers-section{padding:.5rem 1rem}.RecentContacts .top-peers{height:6rem;margin:0 -1rem;overflow-x:auto;overflow-y:hidden;white-space:nowrap;scrollbar-width:none;scrollbar-color:rgba(0,0,0,0)}.RecentContacts .top-peers::-webkit-scrollbar{height:0}.RecentContacts .top-peers::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0)}.RecentContacts .top-peer-item{display:inline-block;width:4.5rem;height:6rem;padding:0.625rem 0.25rem;margin-left:0.5rem;border-radius:var(--border-radius-default);cursor:pointer;position:relative;overflow:hidden}.RecentContacts .top-peer-item:first-child{margin-left:0.125rem}.RecentContacts .top-peer-item:last-child{margin-right:0.125rem}.RecentContacts .top-peer-item .Avatar{margin:0 auto 0.375rem}.RecentContacts .top-peer-item:hover{background:var(--color-chat-hover)}.RecentContacts .top-peer-item .top-peer-name{text-align:center;white-space:nowrap;font-size:0.75rem;overflow:hidden;text-overflow:ellipsis}.RecentContacts .top-peer-item .top-peer-name .emoji-small{width:1rem;height:1rem;background-size:1rem;margin-inline-end:1px;vertical-align:-3px}.RecentContacts .recent-chats-header{display:flex;align-items:center}.RecentContacts .recent-chats-header .Button{margin-left:auto}.RecentContacts .recent-chats-header[dir=rtl] .Button{margin-left:0;margin-right:auto}\n",".ChatMessage:first-child{margin-top:.5rem}.ChatMessage:hover .Avatar.online::after,.ChatMessage.selected .Avatar.online::after{border-color:var(--color-chat-hover)}.ChatMessage .ListItem-button{padding:.25rem .5rem}.ChatMessage .info .title{flex-grow:1}.ChatMessage .info h3{font-size:1rem;width:auto}.ChatMessage .info .subtitle{color:var(--color-text-secondary)}.ChatMessage .info .subtitle .matching-text-highlight{color:var(--color-text);background:#CAE3F7;border-radius:0.25rem;padding:0 0.125rem}.ChatMessage .info .message{flex-grow:1;color:var(--color-text-secondary);overflow:hidden;text-overflow:ellipsis}.ChatMessage .info .message .sender-name{color:var(--color-text)}.ChatMessage .info .message .sender-name::after{content:': '}.ChatMessage .info .message img{width:1.25rem;height:1.25rem;object-fit:cover;border-radius:.125rem;vertical-align:-.25rem;margin-right:.25rem}.ChatMessage .info .message .icon-play{position:relative;display:inline-block;font-size:.75rem;color:#fff;margin-inline-start:-1.25rem;margin-inline-end:0.5rem;bottom:0.0625rem}.ChatMessage .info-row{display:flex;justify-content:space-between}.ChatMessage[dir=rtl] .subtitle{text-align:right}\n",".DateSuggest{display:flex;height:2rem;flex-direction:row;justify-content:space-between;margin-left:.5rem;margin-bottom:.5rem}.DateSuggest .date-item{display:flex;flex:1 1 auto;min-width:8rem;margin-top:.375rem;cursor:pointer;font-size:.875rem;font-weight:500;color:var(--color-text-secondary)}.DateSuggest .date-item .icon-calendar{font-size:1.25rem;margin-right:.25rem}\n",".LeftSearch{display:flex;flex-direction:column;height:100%;overflow:hidden}.LeftSearch>.Transition{flex:1;overflow:hidden}.LeftSearch .TabList{padding-bottom:1px;z-index:1}.LeftSearch .documents-list{padding:0 1.25rem 1.25rem}.LeftSearch .documents-list .ListItem+.ListItem{margin-top:1.25rem}.LeftSearch .section-heading{position:relative;padding-top:1.25rem;padding-left:1.25rem;margin:0 0 1rem -1.25rem !important;font-weight:500;font-size:.9375rem;color:var(--color-text-secondary)}.LeftSearch .section-heading::before{content:'';position:absolute;width:100%;height:1px;background:var(--color-borders);left:.625rem;top:-1px}.LeftSearch .section-heading[dir=rtl],.LeftSearch .section-heading[dir=auto]{padding-left:0;padding-right:1.25rem;margin:0 -1.25rem 0 1rem !important;text-align:initial}.LeftSearch .section-heading[dir=rtl]::before,.LeftSearch .section-heading[dir=auto]::before{left:auto;right:.625rem}.LeftSearch .LeftSearch .search-section .section-heading,.LeftSearch .RecentContacts .search-section .section-heading{margin-left:-1rem !important;width:calc(100% + 2rem);box-shadow:0 -1px 0 0 var(--color-borders)}.LeftSearch .LeftSearch .search-section .section-heading::before,.LeftSearch .RecentContacts .search-section .section-heading::before{display:none}.LeftSearch .WebLink{display:flex}.LeftSearch .content:not(.with-seekline){align-self:center;min-width:0;flex-grow:1;overflow:hidden;text-overflow:ellipsis;word-break:break-word}.LeftSearch .message-date{font-size:.75rem;color:var(--color-text-secondary);padding-left:1rem;white-space:nowrap}.LeftSearch .media-list{display:grid;padding:.5rem;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.LeftSearch .Audio .duration span{padding:0 .25rem}.LeftSearch .Audio .ProgressSpinner{margin:-.1875rem 0 0 -.1875rem}.LeftSearch .ListItem.search-result .ChatInfo .handle{unicode-bidi:plaintext;color:var(--color-primary);unicode-bidi:plaintext}.LeftSearch .ListItem.search-result .ChatInfo .handle::before{content:'@'}html[lang=ar] .LeftSearch .ListItem.search-result .ChatInfo .handle::before{content:' ،@';margin-inline-end:.25rem}.LeftSearch .ListItem.search-result .ChatInfo .handle::after{content:', ';color:var(--color-text-secondary)}html[lang=ar] .LeftSearch .ListItem.search-result .ChatInfo .handle::after{content:''}.LeftSearch .ListItem.search-result .ChatInfo[dir=rtl] .status{text-align:right}.LeftSearch .ListItem.search-result .ChatInfo[dir=rtl] .status .handle{float:right}.LeftSearch .ListItem.search-result-message .sender-name{color:var(--color-text)}.LeftSearch .ListItem.search-result-message .sender-name::after{content:': ';white-space:pre}@media (max-width: 600px){.LeftSearch .ListItem{margin:0 -0.625rem}}.LeftSearch .search-section{padding:0 1rem 0.5rem}.LeftSearch .search-section .section-heading{color:var(--color-text-secondary);font-size:.9375rem;font-weight:500;margin-bottom:0 !important;padding-top:.875rem}.LeftSearch .search-section .section-heading .Link{float:right;color:var(--color-links);font-weight:400;margin-right:1rem}.LeftSearch .search-section .section-heading .Link:focus,.LeftSearch .search-section .section-heading .Link:hover{color:var(--color-links-hover)}.LeftSearch .search-section .section-heading[dir=rtl] .Link,.LeftSearch .search-section .section-heading[dir=auto] .Link{float:left;margin-left:1rem;margin-right:0}.LeftSearch .search-section .Loading{height:4.5rem;margin-bottom:0.5rem}.LeftSearch .chat-selection{padding-top:.5rem;display:flex;flex-shrink:0;flex-wrap:nowrap;justify-content:space-between;align-items:flex-end;box-shadow:inset 0 -1px 0 0 var(--color-borders);background-color:var(--color-background);-webkit-overflow-scrolling:touch;overflow-x:auto;overflow-y:hidden;scrollbar-color:rgba(0,0,0,0)}.LeftSearch .chat-selection>.PickerSelectedItem{flex:0 0 auto}.LeftSearch .chat-selection>.PickerSelectedItem:last-child{margin-right:auto}.LeftSearch .chat-selection[dir=rtl]>.PickerSelectedItem:last-child{margin-left:auto;margin-right:0}.LeftSearch .NothingFound{height:100%}.LeftSearch [dir=rtl] .message-date{padding-left:0;padding-right:1rem}\n",".CropModal .modal-dialog{width:calc(100% - 2rem);max-width:35rem;height:calc(100% - 1rem);max-height:35rem;position:relative}.CropModal .modal-content,.CropModal #avatar-crop{overflow:hidden}.CropModal .confirm-button{position:absolute;bottom:1rem;right:1rem;box-shadow:0 1px 2px var(--color-default-shadow)}.CropModal #avatar-crop{max-width:25rem;margin:0 auto;position:relative}.CropModal #avatar-crop::before{content:'';display:block;padding-top:100%}.CropModal #avatar-crop .cr-boundary{position:absolute;top:0;left:0;border-radius:var(--border-radius-messages-small)}.CropModal #avatar-crop .cr-viewport{border:none;box-shadow:0 0 2000px 2000px rgba(255,255,255,0.5)}.CropModal #avatar-crop .cr-slider::-webkit-slider-runnable-track{background:var(--color-borders)}.CropModal #avatar-crop .cr-slider::-moz-range-track{background:var(--color-borders)}.CropModal #avatar-crop .cr-slider::-ms-track{background:var(--color-borders)}.CropModal #avatar-crop .cr-slider::-webkit-slider-thumb{background:var(--color-primary);cursor:pointer;transform:scale(1);-webkit-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.CropModal #avatar-crop .cr-slider::-webkit-slider-thumb:hover{transform:scale(1.2)}.CropModal #avatar-crop .cr-slider::-moz-range-thumb{background:var(--color-primary);cursor:pointer;transform:scale(1);-moz-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.CropModal #avatar-crop .cr-slider::-moz-range-thumb:hover{transform:scale(1.2)}.CropModal #avatar-crop .cr-slider::-ms-thumb{background:var(--color-primary);cursor:pointer;transform:scale(1);-ms-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.CropModal #avatar-crop .cr-slider::-ms-thumb:hover{transform:scale(1.2)}\n",".AvatarEditable label{margin-left:auto;margin-right:auto;width:7.5rem;height:7.5rem;margin-bottom:2rem;display:flex !important;align-items:center;justify-content:center;background-color:var(--color-primary);border-radius:50%;color:white;font-size:3rem;cursor:pointer;position:relative;overflow:hidden;outline:none !important}.AvatarEditable label input{display:none}.AvatarEditable label img{position:absolute;top:0;left:0;width:100%;height:100%}.AvatarEditable label i{transform:scale(1);transition:transform .15s linear;z-index:var(--z-register-add-avatar)}.Transition>div:not(.active) .AvatarEditable label input,.Transition>div:not(.active) .AvatarEditable label i,.Transition>div:not(.active) .AvatarEditable label::after,body.animating-right-column .AvatarEditable label input,body.animating-right-column .AvatarEditable label i,body.animating-right-column .AvatarEditable label::after{display:none !important}.Transition>div:not(.active) .AvatarEditable label img,body.animating-right-column .AvatarEditable label img{position:static !important}.AvatarEditable label:hover i{transform:scale(1.2)}.AvatarEditable label.filled{background-color:var(--color-background)}.AvatarEditable label.filled::after{content:'';display:block;position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4)}.AvatarEditable label.disabled{pointer-events:none}.AvatarEditable label.disabled i{display:none}.AvatarEditable label.disabled::after{display:none}\n",".ShowMoreButton{color:var(--text-color) !important;display:flex;align-items:center;text-align:left;text-transform:none;padding-left:.75rem !important;opacity:1 !important}.ShowMoreButton i{font-size:1.5rem;margin-right:2rem;color:var(--color-text-secondary)}.ShowMoreButton .Spinner{top:0.4375rem}\n",".SettingsFoldersChatsPicker{height:calc(100% - var(--header-height))}.SettingsFoldersChatsPicker .picker-header{box-shadow:0 0 2px var(--color-default-shadow)}.SettingsFoldersChatsPicker .picker-header .max-items-reached{margin-bottom:0.5rem;margin-left:0.5rem;flex-grow:1}.SettingsFoldersChatsPicker .picker-header .max-items-reached{color:var(--color-text-secondary)}.SettingsFoldersChatsPicker .picker-list{padding:0 0.5rem 0.5rem}.SettingsFoldersChatsPicker .picker-list .no-results{height:10rem}.SettingsFoldersChatsPicker .ListItem.picker-list-item.chat-type-item .ListItem-button{padding:0.875rem 0.75rem}.SettingsFoldersChatsPicker .ListItem.picker-list-item.chat-item .ListItem-button{padding:0.5rem 0.75rem}.SettingsFoldersChatsPicker .ListItem.picker-list-item .Checkbox{margin-left:auto;padding-left:3.25rem}.SettingsFoldersChatsPicker .ListItem.picker-list-item .chat-type{font-size:1rem;font-weight:400;margin:0}.SettingsFoldersChatsPicker .ListItem.picker-list-item[dir=rtl] .Checkbox{margin-left:0;margin-right:auto;padding-left:0;padding-right:3.25rem}.SettingsFoldersChatsPicker .settings-item-header{margin-left:0.75rem;margin-top:1rem;margin-bottom:0.5rem}.SettingsFoldersChatsPicker .picker-list-divider{margin:0.5rem -0.5rem 0;border-bottom:1px solid var(--color-borders)}\n",".settings-folders-recommended-item{width:100%;display:flex;align-items:center;justify-content:space-between}.settings-folders-list-item .ChatInfo{display:flex;align-items:center}.settings-folders-list-item .ChatInfo .Avatar{margin-left:-0.25rem;margin-right:1.5rem}.settings-folders-list-item .ChatInfo .title{display:flex;justify-content:flex-start;align-items:center}.settings-folders-list-item .ChatInfo .title h3{font-size:1rem;font-weight:500;line-height:1.3125;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:left}.settings-folders-list-item .ChatInfo .status{display:none}.settings-folders-list-item .ChatInfo[dir=rtl] .title h3{text-align:right}.settings-folders-list-item .ListItem-button i{opacity:0.9}.settings-folders-list-item.color-primary .ListItem-button{color:var(--color-primary)}.settings-folders-list-item.color-primary .ListItem-button i{opacity:1;color:inherit}.settings-folders-list-item[dir=rtl] .Avatar{margin-left:1.5rem;margin-right:-0.25rem}.settings-item .ShowMoreButton{margin:0 -1rem;width:calc(100% + 2rem);padding-left:1rem !important}\n",".RangeSlider{--slider-color: var(--color-primary);margin-bottom:1rem}.RangeSlider.disabled{pointer-events:none;--slider-color: var(--color-text-secondary)}.RangeSlider .slider-top-row{display:flex;justify-content:space-between;margin-bottom:0.625rem}.RangeSlider .slider-top-row .value{flex-shrink:0;margin-left:1rem;color:var(--color-text-secondary)}.RangeSlider .slider-top-row[dir=rtl] .value{margin-left:0;margin-right:1rem}.RangeSlider .slider-main{position:relative;z-index:1}.RangeSlider .slider-main::before{content:'';position:absolute;width:100%;left:0;top:0.3125rem;height:0.125rem;background-color:var(--color-borders);border-radius:0.125rem;opacity:0.5;z-index:-1}.RangeSlider .slider-fill-track{position:absolute;width:100%;left:0;top:0.3125rem;height:0.125rem;background-color:var(--slider-color);border-radius:0.125rem;pointer-events:none}.RangeSlider input[type=\"range\"]{-webkit-appearance:none;display:block;width:100%;height:0.75rem;margin-bottom:0.5rem;background:transparent}.RangeSlider input[type=\"range\"]:focus{outline:none}.RangeSlider input[type=\"range\"]::-ms-track{width:100%;cursor:pointer;background:transparent;border-color:transparent;color:transparent}.RangeSlider input[type=\"range\"]::-webkit-slider-thumb{-webkit-appearance:none}.RangeSlider input[type=\"range\"]::-webkit-slider-thumb{background:var(--slider-color);border:none;height:0.75rem;width:0.75rem;border-radius:50%;cursor:pointer;transform:scale(1);-webkit-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.RangeSlider input[type=\"range\"]::-webkit-slider-thumb:hover{transform:scale(1.2)}.RangeSlider input[type=\"range\"]::-moz-range-thumb{background:var(--slider-color);border:none;height:0.75rem;width:0.75rem;border-radius:50%;cursor:pointer;transform:scale(1);-moz-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.RangeSlider input[type=\"range\"]::-moz-range-thumb:hover{transform:scale(1.2)}.RangeSlider input[type=\"range\"]::-ms-thumb{background:var(--slider-color);border:none;height:0.75rem;width:0.75rem;border-radius:50%;cursor:pointer;transform:scale(1);-ms-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.RangeSlider input[type=\"range\"]::-ms-thumb:hover{transform:scale(1.2)}.RangeSlider .slider-options{display:grid;grid-template-rows:auto;grid-auto-columns:1fr;grid-auto-flow:column}.RangeSlider .slider-option{font-size:0.825rem;text-align:center;cursor:pointer;color:var(--color-text-secondary);transition:color .2s ease}.RangeSlider .slider-option:hover,.RangeSlider .slider-option.active{color:var(--color-text)}.RangeSlider .slider-option.active{font-weight:500}.RangeSlider .slider-option:first-child{text-align:left}.RangeSlider .slider-option:last-child{text-align:right}\n",".StickerButton{display:inline-block;width:4rem;height:4rem;margin:0.5rem;border-radius:var(--border-radius-messages-small);background:transparent no-repeat center;background-size:contain;cursor:pointer;transition:background-color .15s ease, opacity .3s ease !important;position:relative}@media (max-width: 600px){.StickerButton{margin:0.25rem}}.StickerButton.set-button{width:2.75rem !important;height:2.75rem;margin:0 0.5rem}.StickerButton .AnimatedSticker,.StickerButton img{position:absolute;top:0;left:0;width:100%;height:100%}.StickerButton img{object-fit:contain}.StickerButton .sticker-unfave-button{position:absolute;top:-0.5rem;right:-0.5rem;width:1.25rem;height:1.25rem;padding:0.125rem;opacity:0}.StickerButton .sticker-unfave-button i{font-size:1rem}.StickerButton:hover{background-color:var(--color-interactive-element-hover)}.StickerButton:hover .sticker-unfave-button{opacity:1}\n",".settings-item .SettingsStickerSet.ListItem{margin-bottom:.5rem}.SettingsStickerSet .StickerButton,.SettingsStickerSet .Button{width:3rem;height:3rem;margin:0 .5rem 0 0;padding:0;flex:0 0 3rem}.SettingsStickerSet img{max-width:100%;max-height:100%}.SettingsStickerSet .multiline-menu-item{display:flex;flex-direction:column;justify-content:center}.SettingsStickerSet[dir=rtl] .StickerButton,.SettingsStickerSet[dir=rtl] .Button{margin:0 0 0 .5rem}\n",".WallpaperTile{height:0;padding-bottom:100%;cursor:pointer;position:relative}.WallpaperTile .media-inner,.WallpaperTile::after{position:absolute;left:0;top:0;width:100%;height:100%}.WallpaperTile .media-inner{overflow:hidden;transform:scale(1);transition:transform .15s ease}.WallpaperTile .media-inner img,.WallpaperTile .media-inner canvas{position:absolute;left:0;top:0;width:100%;height:100%;object-fit:cover}.WallpaperTile::after{content:\"\";display:block;border:2px solid var(--color-primary);opacity:0;transition:opacity .15s ease}.WallpaperTile.selected::after{opacity:1}.WallpaperTile.selected .media-inner{transform:scale(0.9)}.WallpaperTile .spinner-container{height:100%;display:flex;align-items:center;justify-content:center}\n",".SettingsGeneralBackground .settings-wallpapers{display:grid;padding:.5rem;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.SettingsGeneralBackground .Loading{height:auto !important;margin-top:5rem}\n",".SettingsGeneralBackgroundColor:not(.is-dragging) .handle{transition:transform 300ms ease}.SettingsGeneralBackgroundColor .color-picker,.SettingsGeneralBackgroundColor .hue-picker{position:relative}.SettingsGeneralBackgroundColor .color-picker{margin-top:1rem;height:12rem;touch-action:none}.SettingsGeneralBackgroundColor .hue-picker{margin:2rem 0;height:0.5rem}.SettingsGeneralBackgroundColor canvas{display:block;width:100%;height:100%;border-radius:var(--border-radius-default);cursor:pointer}.SettingsGeneralBackgroundColor .handle{position:absolute;top:-0.75rem;left:-0.75rem;width:1.5rem;height:1.5rem;border:0.125rem solid var(--color-white);border-radius:0.75rem;cursor:grab}.SettingsGeneralBackgroundColor .hue-picker .handle{top:-0.5rem}.SettingsGeneralBackgroundColor .tools{margin-bottom:0.625rem;display:flex}.SettingsGeneralBackgroundColor .tools .input-group{margin-bottom:0}.SettingsGeneralBackgroundColor .tools .input-group[dir=rtl] label{transform:scale(0.75) translate(1.25rem, -2.25rem)}.SettingsGeneralBackgroundColor .tools .input-group:first-child{margin-right:0.5rem}.SettingsGeneralBackgroundColor .tools .input-group:last-child{margin-left:0.5rem}.SettingsGeneralBackgroundColor .predefined-colors{display:grid;padding:.5rem;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.SettingsGeneralBackgroundColor .predefined-colors div{cursor:pointer;box-shadow:inset 0 0 0 0 var(--color-background);transition:box-shadow 300ms ease}.SettingsGeneralBackgroundColor .predefined-colors div.active{border:0.125rem solid var(--color-primary);box-shadow:inset 0 0 0 0.3125rem var(--color-background)}.SettingsGeneralBackgroundColor .predefined-colors div:before{display:block;content:\"\";width:100%;padding-top:100%;pointer-events:none}\n","#monkey{position:relative;display:block;margin-left:auto;margin-right:auto;width:7.5rem;height:7.5rem;margin-bottom:1.75rem}@media (min-width: 600px) and (min-height: 450px){#monkey{width:10rem;height:10rem;margin-bottom:2.5rem}}#monkey.big{width:10rem;height:10rem}#monkey .AnimatedSticker{position:absolute;left:0;top:0;width:100%;height:100%}#monkey .AnimatedSticker.hidden{display:none}#monkey .monkey-preview{width:100%;height:100%;background-size:100%;background:url(monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg) center}\n","#Settings{height:100%}#Settings>div{display:flex;flex-direction:column;overflow:hidden}.settings-main-header{display:flex;flex-grow:1;justify-content:space-between;align-items:center}.settings-more-menu .bubble{width:auto}.settings-more-menu .bubble .MenuItem button{padding-left:1rem !important;padding-right:2rem !important}.settings-content{background:var(--color-background);height:calc(100% - var(--header-height));overflow-y:auto}.settings-content.infinite-scroll{display:flex;flex-direction:column}.settings-content.infinite-scroll>.custom-scroll{flex:1 1 auto;height:auto}.settings-content #monkey{margin-top:.5rem;margin-bottom:1rem}.settings-content .AnimatedEmoji{margin-top:.5rem;margin-bottom:1.5rem}.settings-content-header{display:flex;flex-direction:column;align-items:center;padding:0 1.5rem 1rem;text-align:center}.settings-content-header .input-group{width:100%}.settings-content-icon{width:5rem;height:5rem;margin-bottom:2.5rem;position:relative}.settings-content-icon .AnimatedSticker{position:absolute;left:0;top:0;width:100%;height:100%}.settings-content-icon .AnimatedSticker.hidden{display:none}.settings-main-menu{padding:0 0.5rem 1rem}.settings-current-user{margin-bottom:1.125rem;text-align:center}.settings-current-user .Avatar{margin:0 auto 1.5rem}.settings-current-user .name{display:flex;justify-content:center;align-items:center;font-weight:500;font-size:1.5rem;line-height:2rem;margin:0}.settings-current-user .name .VerifiedIcon{margin-left:0.25rem;margin-top:0.1rem}.settings-current-user .phone{font-size:0.875rem;color:#868e96;margin:0}.settings-item{border-top:1px solid var(--color-borders);padding:1.5rem 1.5rem 1rem}.settings-item.no-border{border-top:none}.settings-item-header{font-size:1rem;color:var(--color-text-secondary);margin-bottom:2rem;position:relative}.settings-item-header[dir=rtl]{text-align:right}.settings-item-description{font-size:0.875rem;color:var(--color-text-secondary);margin-top:-0.5rem;margin-bottom:1.5rem}.settings-content.two-fa .settings-item-description{font-size:1rem}.settings-item-description[dir=rtl]{text-align:right;unicode-bidi:plaintext}.settings-item-description-larger{font-size:1rem;line-height:1.3125rem;color:var(--color-text-secondary);margin-top:2rem;margin-bottom:0.75rem}.settings-item-description-larger[dir=rtl]{text-align:right}.settings-item .ListItem{margin:0 -1rem 1rem}.settings-item .ListItem:last-child{margin-bottom:0}.settings-item .ListItem .multiline-menu-item{white-space:initial}.settings-item .ListItem .multiline-menu-item.full-size{width:100%}.settings-item .ListItem .multiline-menu-item .date{float:right;font-size:0.75rem;margin-left:1rem;color:var(--color-text-secondary)}.settings-item .ListItem .multiline-menu-item .title,.settings-item .ListItem .multiline-menu-item .subtitle{display:block;text-align:left}.settings-item .ListItem .multiline-menu-item .title{line-height:1.25rem}.settings-item .ListItem .multiline-menu-item .subtitle{font-size:0.875rem;line-height:1.5rem;color:var(--color-text-secondary)}.settings-item .ListItem .multiline-menu-item .subtitle+.subtitle{margin-top:-0.25rem}.settings-item .ListItem .multiline-menu-item .subtitle.black{color:var(--color-text)}.settings-item .ListItem .multiline-menu-item .subtitle.tight{line-height:1.3125rem;margin-bottom:.1875rem}.settings-item .ListItem.destructive .ListItem-button{color:var(--color-error)}.settings-item .ListItem.destructive .ListItem-button i{color:inherit}.settings-item .ListItem.blocked-list-item{margin-bottom:0.5rem}.settings-item .ListItem.blocked-list-item .ListItem-button{align-items:center;text-align:left;padding:0.5rem}.settings-item .ListItem.blocked-list-item .Avatar{width:3rem;height:3rem;margin-right:1rem}.settings-item .ListItem.blocked-list-item .contact-name{font-size:1rem;line-height:1rem;margin-bottom:0.25rem;font-weight:500}.settings-item .ListItem.blocked-list-item .contact-phone{font-size:0.875rem;line-height:1rem;color:var(--color-text-secondary)}.settings-item .ListItem[dir=rtl] .multiline-menu-item .title,.settings-item .ListItem[dir=rtl] .multiline-menu-item .subtitle{text-align:right}.settings-item .ListItem[dir=rtl] .multiline-menu-item .date{float:left;margin-left:0;margin-right:1rem}.settings-item .RangeSlider{margin-bottom:1.0625rem}.settings-item .Checkbox,.settings-item .radio-group{margin:0 -1rem 0.5rem}.settings-item .radio-group .Radio:last-child{margin-bottom:0}.settings-item .Radio+.Radio,.settings-item .Checkbox+.Checkbox{margin-top:2rem}.settings-fab-wrapper{height:calc(100% - var(--header-height));position:relative;overflow:hidden}.settings-fab-wrapper .settings-content{height:100%}.settings-fab-wrapper .FloatingActionButton{right:1.5rem}.settings-edit-profile{padding:0 1.5rem}.username-link{color:var(--color-links)}\n",".NewChat{height:100%;overflow:hidden;position:relative}.NewChat-inner{height:calc(100% - var(--header-height));overflow:hidden}.NewChat-inner.step-2{padding:0 1.25rem;display:flex;flex-direction:column}.NewChat-inner.step-2 .note,.NewChat-inner.step-2 .error{font-size:0.875rem;line-height:1.25rem;margin:1.5rem 0.25rem}.NewChat-inner.step-2 .error{color:var(--color-error)}.NewChat-inner.step-2 .note{margin-top:-0.5625rem;color:var(--color-text-secondary)}.NewChat-inner.step-2 .chat-members-heading{color:var(--color-text-secondary);font-size:1rem;font-weight:500;margin:1rem 0.25rem}.NewChat-inner.step-2 .chat-members-list{margin:0 -1.25rem;padding:0 1rem 1rem;overflow-x:hidden;flex-grow:1}\n",".ArchivedChats{height:100%;overflow:hidden}.ArchivedChats .chat-list{height:calc(100% - var(--header-height))}\n",".MessageContextMenu{position:absolute;font-size:1rem}.MessageContextMenu .bubble{transform:scale(0.5);transition:opacity 0.15s cubic-bezier(0.2, 0, 0.2, 1),transform 0.15s cubic-bezier(0.2, 0, 0.2, 1) !important}.MessageContextMenu .backdrop{position:absolute;touch-action:none}\n",".StickerSetModal .modal-dialog{width:26.25rem;max-width:100%}@media (max-width: 600px){.StickerSetModal .modal-dialog{width:18.875rem}}.StickerSetModal .modal-header{padding:0.5rem 1rem}.StickerSetModal .modal-content{text-align:center;padding:0}.StickerSetModal .stickers{position:relative;width:100%;height:19rem;max-height:50vh;overflow-y:auto;padding:0 0.25rem;text-align:left}.StickerSetModal .button-wrapper{padding:0.5rem 0;border-top:1px solid var(--color-borders);box-shadow:0 0 2px var(--color-default-shadow)}.StickerSetModal .button-wrapper button{display:inline-block}.StickerSetModal .Loading{width:100%;height:22.8125rem;max-height:calc(50vh + 3.8125rem)}\n",".HeaderMenuContainer{position:fixed;top:0;left:0;right:0;height:100vh;z-index:var(--z-header-menu)}.HeaderMenuContainer .Menu{position:absolute;font-size:1rem}.HeaderMenuContainer .Menu .backdrop{z-index:var(--z-header-menu-backdrop)}.HeaderMenuContainer .Menu .bubble{z-index:var(--z-header-menu);--offset-y: calc(100% + 1rem)}\n","#MobileSearch>.header{position:absolute;top:0;left:0;z-index:var(--z-mobile-search);width:100%;height:3.5rem;background:var(--color-background);display:flex;align-items:center;padding:0 0.5rem 0 0.25rem}#MobileSearch>.header>.SearchInput{margin-left:0.25rem;flex:1}#MobileSearch>.footer{position:absolute;bottom:0;left:0;z-index:var(--z-mobile-search);width:100%;height:3.5rem;background:var(--color-background);display:flex;align-items:center;padding-left:1rem;padding-right:0.5rem}#MobileSearch>.footer>.counter{flex:1;color:var(--color-text-secondary)}#MobileSearch:not(.active) .header,#MobileSearch:not(.active) .footer{transform:translateX(-999rem)}\n",".MentionTooltip{width:calc(100% - 4rem);max-width:20rem;flex-direction:column;z-index:-1}@media (max-width: 600px){.MentionTooltip{width:calc(100% - 3rem)}}.MentionTooltip .ListItem.chat-item-clickable{margin:0}.MentionTooltip .ListItem.chat-item-clickable .ListItem-button{border-radius:0}.MentionTooltip .ListItem.chat-item-clickable .info{display:flex}.MentionTooltip .ListItem.chat-item-clickable .title{margin-inline-end:.625rem;max-width:70%}.MentionTooltip .ListItem.chat-item-clickable .handle{font-size:1rem}.MentionTooltip .ListItem.chat-item-clickable[dir=rtl] .status{width:auto}.MentionTooltip .ChatInfo .title h3{line-height:1.25}.MentionTooltip .ChatInfo .Avatar{margin-right:0.7em}.MentionTooltip .ChatInfo .handle::before{content:'@'}.MentionTooltip .ChatInfo .user-status{display:none !important}\n",".AttachmentModal{--border-radius-default: 0.625rem}.AttachmentModal .modal-dialog{max-width:26.25rem}@media (max-width: 600px){.AttachmentModal .modal-dialog{max-height:100%;padding-bottom:1.5rem}}.AttachmentModal .modal-content{padding:.5rem 1.25rem 1.875rem;max-height:calc(100vh - 3.25rem)}@media (max-width: 600px){.AttachmentModal .modal-content{padding-bottom:.25rem}}.AttachmentModal .media-wrapper{max-height:26rem;overflow:auto;display:flex;flex-wrap:wrap;margin-bottom:1.5rem}.AttachmentModal .media-wrapper video,.AttachmentModal .media-wrapper img{flex:1;width:calc(50% - 0.15rem);height:12rem;margin-bottom:0.3rem;border-radius:var(--border-radius-default);object-fit:cover}.AttachmentModal .media-wrapper video:only-child,.AttachmentModal .media-wrapper img:only-child{height:auto;max-height:25rem;margin-bottom:0}.AttachmentModal .media-wrapper video:nth-child(even),.AttachmentModal .media-wrapper img:nth-child(even){margin-left:0.3rem}.AttachmentModal .document-wrapper{max-height:25rem;overflow:auto;flex-shrink:0;display:flex;flex-direction:column;margin:.75rem 0 1.75rem}.AttachmentModal .document-wrapper .File:not(:last-child){margin-bottom:1.5rem}.AttachmentModal .document-wrapper .file-icon{cursor:default !important}.AttachmentModal .attachment-caption-wrapper{position:relative}.AttachmentModal .attachment-caption-wrapper .form-control{background:var(--color-background)}.AttachmentModal .attachment-caption-wrapper .MentionTooltip{right:0 !important;z-index:0}.AttachmentModal .drop-target{position:relative}.AttachmentModal .drop-target::before,.AttachmentModal .drop-target::after{content:'';position:absolute;left:0;top:0;right:0;bottom:0;border-radius:var(--border-radius-default);pointer-events:none;opacity:0;transition:250ms opacity;z-index:1}.AttachmentModal .drop-target::before{background-image:var(--drag-target-border-hovered);background-color:var(--color-background)}.AttachmentModal .drop-target::after{content:attr(data-attach-description);display:flex;justify-content:center;align-items:center;color:var(--color-primary)}.AttachmentModal.hovered .drop-target::before{opacity:.95}.AttachmentModal.hovered .drop-target::after{opacity:1}.AttachmentModal.hovered .attachment-caption-wrapper,.AttachmentModal.hovered .document-wrapper,.AttachmentModal.hovered .media-wrapper{pointer-events:none}.AttachmentModal.hovered .document-wrapper,.AttachmentModal.hovered .media-wrapper{border-radius:var(--border-radius-default)}\n",".PollModal .modal-dialog{max-width:26.25rem;max-height:calc(100vh - 5rem)}.PollModal .modal-content{padding:.5rem 1.25rem 1.875rem;min-height:4.875rem}.PollModal .modal-header-condensed{margin-bottom:1rem}.PollModal .options-header{color:var(--color-text-secondary);font-size:1rem;font-weight:500;margin:1.5rem 0.25rem}.PollModal .options-list{margin:1rem -0.75rem -0.5rem;padding:0 0.75rem;border-top:1px solid var(--color-chat-hover);max-height:20rem;overflow:auto}.PollModal .options-list.overflown{padding:0 0.4rem 0.5rem 0.75rem}@media (max-width: 600px){.PollModal .options-list{overflow:hidden;max-height:none}.PollModal .options-list,.PollModal .options-list.overflown{padding:0 0.75rem}}.PollModal .option-wrapper{position:relative}.PollModal .option-wrapper .form-control{padding-right:3rem}.PollModal .option-wrapper .option-remove-button{position:absolute;top:0.3125rem;right:0.3125rem}.PollModal .quiz-mode{margin-top:1.5rem}.PollModal .quiz-mode .options-header{margin-bottom:0.5rem}.PollModal .quiz-mode .note{margin-top:0.5rem}.PollModal .note{font-size:smaller;color:var(--color-text-secondary)}.PollModal .error{font-size:smaller;color:var(--color-error);margin:-1rem 0 1rem .25rem}.PollModal .input-group:last-child{margin-bottom:0.5rem}\n",".EmojiButton{display:inline-flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;margin:0.125rem;border-radius:var(--border-radius-messages-small);cursor:pointer;font-size:1.75rem;line-height:2.5rem;background-color:transparent;transition:background-color .15s ease}.mac-os-fix .EmojiButton{line-height:inherit}.EmojiButton.focus,.EmojiButton:hover{background-color:var(--color-background-selected)}.EmojiButton>img{width:2rem;height:2rem}\n",".EmojiPicker{height:100%}.EmojiPicker-main{height:calc(100% - 3rem);overflow-y:auto;padding:0.5rem}@media (max-width: 600px){.EmojiPicker-main{padding:0.5rem 0.25rem}}.EmojiPicker-main .symbol-set-container{display:flex;flex-wrap:wrap}.EmojiPicker-header{height:3rem;border-bottom:1px solid var(--color-borders);display:flex;align-items:center;justify-content:space-around;box-shadow:0 0 2px var(--color-default-shadow)}@media (max-width: 600px){.EmojiPicker-header{overflow-x:auto;overflow-y:hidden;display:block;white-space:nowrap;padding:0.4375rem 0;scrollbar-width:none;scrollbar-color:rgba(0,0,0,0)}.EmojiPicker-header::-webkit-scrollbar{height:0}.EmojiPicker-header::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0)}.EmojiPicker-header .symbol-set-button{display:inline-flex;vertical-align:middle}.EmojiPicker-header::after{content:\"\";display:block;flex-shrink:0;width:0.1px;height:1rem}}\n",".StickerPicker{height:100%}.StickerPicker-main{position:relative;height:calc(100% - 3rem);overflow-y:auto;padding:0.5rem}@media (max-width: 600px){.StickerPicker-main{padding:0.5rem 0.25rem}}.StickerPicker-header{height:3rem;border-bottom:1px solid var(--color-borders);padding:0.125rem 0;overflow-x:auto;overflow-y:hidden;white-space:nowrap;box-shadow:0 0 2px var(--color-default-shadow);scrollbar-width:none;scrollbar-color:rgba(0,0,0,0)}.StickerPicker-header::-webkit-scrollbar{height:0}.StickerPicker-header::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0)}.StickerPicker-header::after{content:\"\";display:block;flex-shrink:0;width:0.1px;height:1rem}.StickerPicker-header .sticker-set-button{display:inline-flex;vertical-align:middle}.StickerPicker-header .sticker-set-button.StickerButton{background-size:2rem}.StickerPicker-header .sticker-set-button.StickerButton img,.StickerPicker-header .sticker-set-button.StickerButton .AnimatedSticker{top:0.375rem;left:0.375rem;width:2rem;height:2rem}.StickerPicker-header .sticker-set-button .sticker-set-cover{width:2rem;height:2rem;position:relative;display:flex;align-items:center;justify-content:center}.StickerPicker-header .sticker-set-button .sticker-set-cover img,.StickerPicker-header .sticker-set-button .sticker-set-cover .AnimatedSticker{width:100%;height:100%;position:absolute;top:0;left:0}.StickerPicker .symbol-set-container{width:25rem;line-height:0}@media (max-width: 600px){.StickerPicker .symbol-set-container{width:100%}}.StickerPicker .sticker-set-button{width:2.75rem !important;height:2.75rem;margin:0 0.25rem;border-radius:var(--border-radius-messages-small)}\n",".GifButton{display:flex;align-items:center;justify-content:center;height:6.25rem;background-color:transparent;cursor:pointer;overflow:hidden;position:relative}.GifButton:last-child{margin-bottom:1rem}.GifButton.vertical{grid-column-end:span 1}.GifButton.horizontal{grid-column-end:span 2}.GifButton .thumbnail{background-size:cover !important;background:transparent no-repeat center}.GifButton .thumbnail ~ video{position:absolute}.GifButton .thumbnail,.GifButton video{width:100%;height:100%;object-fit:cover}.GifButton:not(.shown){display:block !important;visibility:hidden}.GifButton .Spinner{position:absolute;pointer-events:none}\n",".GifPicker{display:grid;grid-template-columns:repeat(6, 1fr);grid-auto-rows:6.25rem;grid-gap:0.25rem;grid-auto-flow:dense;height:100%;overflow-y:auto;padding:0.25rem}.GifPicker .Loading,.GifPicker .picker-disabled{grid-column:1 / -1;height:var(--menu-height)}\n",".SymbolMenu.mobile-menu{position:fixed;left:0;right:0;bottom:0;background:var(--color-background);transform:translate3d(0, calc(var(--symbol-menu-height) + var(--symbol-menu-footer-height)), 0);z-index:1;transition:transform var(--layer-transition)}.SymbolMenu.mobile-menu.open{transform:translate3d(0, 0, 0)}body.is-media-viewer-open .SymbolMenu.mobile-menu.open{transform:translate3d(0, calc(var(--symbol-menu-height) + var(--symbol-menu-footer-height)), 0)}body.animation-level-0 .SymbolMenu.mobile-menu{transition:none}.SymbolMenu.mobile-menu:not(.middle-column-open){transform:translate3d(100vw, 0, 0) !important}.SymbolMenu-main{width:var(--symbol-menu-width);height:var(--symbol-menu-height);max-height:calc(100vh - var(--symbol-menu-footer-height))}.SymbolMenu-footer{height:var(--symbol-menu-footer-height);border-top:1px solid var(--color-borders);display:flex;align-items:center;justify-content:center;box-shadow:0 0 2px var(--color-default-shadow);position:relative}.SymbolMenu-footer .Button{flex-shrink:0;width:2.125rem !important;height:2.125rem;margin:0 .25rem;padding:0}.SymbolMenu-footer .Button.activated{pointer-events:none}.SymbolMenu-footer .Button.symbol-tab-button{margin:0 0.75rem}.SymbolMenu-footer .Button.symbol-search-button{position:absolute;left:0.25rem}.SymbolMenu-footer .Button.symbol-delete-button{position:absolute;right:0.25rem}.SymbolMenu .Transition.slide{height:100%}.SymbolMenu .Transition.slide .Loading{height:var(--symbol-menu-height)}.is-pointer-env .SymbolMenu>.backdrop{position:absolute;top:-1rem;left:0;right:auto;width:3.5rem;height:4.5rem}.SymbolMenu .bubble{padding:0;width:var(--symbol-menu-width);overflow:hidden}.SymbolMenu .picker-disabled{height:var(--symbol-menu-height);display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary)}.SymbolMenu .symbol-close-button{display:none;position:absolute;right:.25rem;top:.25rem}@media (orientation: landscape){.SymbolMenu .symbol-close-button{display:block}}.symbol-set{margin-bottom:1rem}.symbol-set-name{font-size:1rem;line-height:1.6875rem;font-weight:500;margin:0;padding-left:0.5rem;color:rgba(var(--color-text-secondary-rgb), 0.75);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:initial;unicode-bidi:plaintext}.symbol-set-container{text-align:initial}.symbol-set-button{flex-shrink:0;width:2.125rem !important;height:2.125rem;margin:0 0.25rem;padding:0}.Transition>div:not(.active) .symbol-set,body.animating-right-column .symbol-set{overflow:hidden}.symbol-set .symbol-set-container:not(.shown){display:block}.symbol-set .symbol-set-container.closing{transition:none}\n",".AttachMenu{position:relative}.is-pointer-env .AttachMenu>.backdrop{position:absolute;top:-1rem;left:auto;right:0;width:3.5rem}.AttachMenu .media-disabled>button{white-space:normal}\n",".StickerTooltip{display:grid;grid-template-columns:repeat(auto-fill, minmax(5rem, 1fr));grid-auto-rows:auto;place-items:center}.StickerTooltip.hidden{display:none}\n",".KeyboardMenu .bubble{width:100% !important;max-width:27rem;border-radius:var(--border-radius-default-small)}.KeyboardMenu .content{display:flex;flex-direction:column;padding:.1875rem .625rem;max-height:80vh;overflow:auto}@media (max-width: 600px){.KeyboardMenu .content{max-height:75vh}}.KeyboardMenu .content .row{display:flex;flex-direction:row}.KeyboardMenu .content .row+.row{margin-top:.375rem}.KeyboardMenu .content .Button{flex:1;width:auto;height:auto;min-height:3.0625rem;border-radius:var(--border-radius-messages-small);border:2px solid var(--color-primary);background:var(--color-background);color:var(--color-primary);font-weight:500;text-transform:none}.KeyboardMenu .content .Button:hover{color:#fff;border-color:var(--color-primary-shade)}.KeyboardMenu .content .Button+.Button{margin-left:.375rem}\n",".CustomSendMenu{position:relative;bottom:3.5rem}.is-pointer-env .CustomSendMenu>.backdrop{position:absolute;top:-1rem;left:auto;right:0;width:3.5rem}.CustomSendMenu .media-disabled>button{white-space:normal}.CustomSendMenu .bubble{width:16rem}\n",".EmojiTooltip{display:flex;padding-left:.25rem;overflow-x:auto;overflow-x:overlay;overflow-y:hidden}.EmojiTooltip .EmojiButton{flex:0 0 2.5rem}\n",".BaseResult.chat-item-clickable>.ListItem-button{padding-left:1.25rem !important;padding-right:1.25rem !important}.BaseResult.chat-item-clickable>.ListItem-button .title{display:block;text-overflow:ellipsis}.BaseResult .thumb{background-color:var(--color-background-secondary);flex:0 0 3rem;width:3rem;height:3rem;line-height:3rem;border-radius:var(--border-radius-default-tiny);display:inline-flex;align-content:center;justify-content:center;margin-inline-end:.5rem;overflow:hidden;font-size:1.5rem}.BaseResult .thumb img:not(.emoji){width:100%;object-fit:cover}.BaseResult .thumb img.emoji{width:1.5rem;height:1.5rem;margin:.75rem 0 0}.BaseResult .content-inner{min-width:0}.BaseResult .title{font-weight:500;text-align:left;unicode-bidi:plaintext}.BaseResult .description{white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;text-align:left;unicode-bidi:plaintext}.BaseResult[dir=rtl] .title,.BaseResult[dir=rtl] .description{text-align:right}\n",".MediaResult{height:0;padding-bottom:100%;overflow:hidden;position:relative;cursor:pointer}.MediaResult img{position:absolute;left:0;top:0;width:100%;height:100%;object-fit:cover}\n",".InlineBotTooltip{--border-radius-default: 0}.InlineBotTooltip .switch-pm .title{margin:0 auto;font-weight:500}.InlineBotTooltip.gallery{display:grid;grid-template-columns:repeat(4, 1fr);grid-gap:1px;padding:0}@media (max-width: 600px){.InlineBotTooltip.gallery{grid-template-columns:repeat(3, 1fr)}}.InlineBotTooltip.gallery .switch-pm{grid-column:1 / -1}.InlineBotTooltip.gallery .switch-pm .ListItem-button{border-bottom-left-radius:0;border-bottom-right-radius:0}.InlineBotTooltip.gallery .GifButton{grid-column-end:initial}.InlineBotTooltip.gallery .StickerButton{width:initial;height:0;margin:0;padding-bottom:100%;border-radius:0}.InlineBotTooltip.gallery .StickerButton .AnimatedSticker,.InlineBotTooltip.gallery .StickerButton img,.InlineBotTooltip.gallery .StickerButton canvas{position:absolute;top:0;left:0;width:100% !important;height:100% !important}@media (min-width: 600px){.InlineBotTooltip.gallery .StickerButton .AnimatedSticker,.InlineBotTooltip.gallery .StickerButton img,.InlineBotTooltip.gallery .StickerButton canvas{top:.25rem;left:.25rem;width:calc(100% - .5rem) !important;height:calc(100% - .5rem) !important}}\n",".RightSearch{height:100%;padding:0 0.5rem;overflow-y:auto}.RightSearch .helper-text{padding:1rem;margin-bottom:0.125rem;font-weight:500;color:var(--color-text-secondary);unicode-bidi:plaintext;text-align:initial}\n",".StickerSearch{height:100%;padding:0 0.5rem;overflow-y:auto}.StickerSearch .helper-text{padding:1rem;margin-bottom:0.125rem;font-weight:500;color:var(--color-text-secondary)}.StickerSearch .sticker-set{margin-bottom:1rem}.StickerSearch .sticker-set-header{display:flex;justify-content:space-between;padding:0.5rem}.StickerSearch .sticker-set-header .title-wrapper{overflow:hidden}.StickerSearch .sticker-set-header .title{font-size:1rem;line-height:1.6875rem;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.StickerSearch .sticker-set-header .count{color:var(--color-text-secondary);margin:0}.StickerSearch .sticker-set-header .Button{flex-shrink:0;margin-left:1rem}.StickerSearch .sticker-set-header .Button.is-added{background:var(--color-chat-hover);color:var(--color-text-secondary)}.StickerSearch .sticker-set-header .Button.is-added:hover,.StickerSearch .sticker-set-header .Button.is-added:active{background:var(--color-item-active) !important}.StickerSearch .sticker-set-main{display:flex;flex-wrap:nowrap;overflow:hidden}.StickerSearch .sticker-set[dir=rtl] .title-wrapper{text-align:right}.StickerSearch .sticker-set[dir=rtl] .Button{margin-left:0;margin-right:1rem}.StickerSearch .StickerButton{margin:0.125rem}\n",".GifSearch{height:100%;padding:0.25rem}.GifSearch .gif-container{height:100%;overflow:auto}.GifSearch .gif-container.grid{display:grid;grid-template-columns:repeat(6, 1fr);grid-auto-rows:6.25rem;grid-gap:0.25rem;grid-auto-flow:dense}.GifSearch .helper-text{color:var(--color-text-meta);margin-top:2rem;text-align:center}\n",".PollAnswerResults{border-bottom:1px solid var(--color-borders);padding:0 .5rem .625rem;display:flex;flex-direction:column-reverse}.PollAnswerResults .answer-head{display:flex;align-items:center;font-size:.9375rem;line-height:1.3125rem;font-weight:500;color:var(--color-text-secondary);padding:1rem .75rem .5rem 1rem;position:sticky;top:0;background:var(--color-background)}@media (max-width: 600px){.PollAnswerResults .answer-head{padding:.5rem .25rem .5rem .5rem}}.PollAnswerResults .answer-percent{margin-left:auto}.PollAnswerResults .answer-percent[dir=auto]{margin-left:0;margin-right:auto}.PollAnswerResults .poll-voters{padding:0 .75rem;position:relative;min-height:3rem}@media (max-width: 600px){.PollAnswerResults .poll-voters{padding:0 .25rem}}.PollAnswerResults .poll-voters .Spinner{--spinner-size: 1.25rem}.PollAnswerResults .chat-item-clickable .ChatInfo .Avatar.size-tiny{margin-right:1.75rem}.PollAnswerResults .chat-item-clickable[dir=rtl] .ChatInfo .Avatar.size-tiny{margin-left:1.75rem;margin-right:0}.PollAnswerResults .ShowMoreButton{margin:.25rem 0 0 -0.5rem;width:calc(100% + 1rem)}.PollAnswerResults .ShowMoreButton[dir=rtl] .icon-down{margin-left:2rem;margin-right:0}.PollAnswerResults .icon-down{vertical-align:middle;margin-right:2rem;font-size:1.5rem}\n",".PollResults{height:100%;position:relative;display:flex;flex-direction:column;pointer-events:auto}.PollResults>.Loading{position:absolute;top:0;left:0;bottom:0;right:0;background:rgba(255,255,255,0.75)}.PollResults .poll-question{padding:.75rem 1.5rem;flex-shrink:0;font-size:1.25rem}@media (max-width: 600px){.PollResults .poll-question{padding:0 1rem}}.PollResults .poll-results-list{border-top:1px solid var(--color-borders);flex-grow:1;overflow:auto}\n",".Management{position:relative;height:100%}.Management>.custom-scroll{height:100%;overflow-y:scroll;overflow-x:hidden}.Management .section{padding:1rem 1.5rem;border-top:1px solid var(--color-borders)}.Management .section.wide{padding:1.5rem}.Management .section:first-of-type{border-top:none;padding-top:1rem}.Management .section.no-border{border-top:none}.Management .section>.ChatInfo{margin:0 0 2rem !important}.Management .section>.ChatInfo .title h3{margin-bottom:0}.Management .section .section-icon{width:8.75rem;height:8.75rem;margin:0 auto 2rem;position:relative}.Management .section .section-icon .AnimatedSticker{position:absolute;left:0;top:0;width:100%;height:100%}.Management .section .section-icon .AnimatedSticker.hidden{display:none}.Management .section .ListItem{margin:0 -.75rem}.Management .section .ListItem:last-child{margin-bottom:0}.Management .section .ListItem .multiline-item .subtitle{line-height:1.25rem}.Management .section .ListItem:not(.picker-list-item) .Checkbox{margin-top:2rem;margin-bottom:2rem}.Management .section .ListItem.narrow .Checkbox{margin-top:1rem;margin-bottom:1rem}.Management .section .ListItem.exceptions-member .ChatInfo .status{white-space:pre-wrap}.Management .section .section-heading{font-weight:500;font-size:.9375rem;color:var(--color-text-secondary)}.Management .section .section-heading[dir=auto]{text-align:initial}.Management .section .section-help{color:var(--color-text-secondary);line-height:1.375rem}.Management .section .section-help[dir=auto]{text-align:initial}.Management .section .section-info{color:var(--color-text-secondary);font-size:.875rem}.Management .section[dir=rtl]{text-align:right}.Management textarea.form-control{height:auto}.Management .group-link{color:var(--color-text)}.Management .radio-group{margin-top:2rem}.Management .radio-group .Radio{padding-left:3.5rem;margin-bottom:2rem}.Management .radio-group .Radio:last-child{margin-bottom:.625rem}.Management .radio-group .Radio-main::before{left:0.125rem;top:.25rem;transform:none}.Management .radio-group .Radio-main::after{left:0.4375rem;top:.5625rem;transform:none}.ManageGroupMembers{padding:0.5rem 1rem}\n",".ShippingInfo{padding:0.5rem 1rem}.ShippingInfo h5{font-size:0.9rem;color:var(--color-text-secondary);margin:1rem 0 1.1rem}\n",".Shipping{padding:0.5rem 1rem}.Shipping form p{color:var(--color-text-secondary);font-weight:500;margin:.5rem 0 2rem}.Shipping form .Radio{margin-bottom:2rem}\n",".Checkout{padding:0.5rem 0}.Checkout .description{display:flex;flex-direction:row;margin:0 1rem}.Checkout .description img{height:6rem;margin:.5rem}.Checkout .description .text h5{margin-top:.5rem;font-size:1.125rem}.Checkout .description .text p{font-size:0.8rem;line-height:1rem;color:var(--color-text-secondary)}.Checkout .price-info{margin:1rem}.Checkout .price-info .price-info-item{margin:1rem .5rem;display:flex;flex-direction:row;align-content:space-between;color:var(--color-text-secondary);font-weight:500}.Checkout .price-info .price-info-item-main{color:var(--color-text)}.Checkout .price-info .price-info-item .title{display:flex;flex:1 auto}.Checkout .invoice-info{border-top:1px var(--color-borders) solid;padding:1rem}.Checkout .invoice-info .checkout-info-item{display:flex;padding:.75rem .5rem 1rem;text-align:left}.Checkout .invoice-info .checkout-info-item i{font-size:1.5rem;color:var(--color-text-secondary);margin-right:2rem;width:1.5rem}.Checkout .invoice-info .checkout-info-item i.stripe-provider{background:url(stripe-logo.c0c5683dcd30037389c35a31040908ed.png) no-repeat center;background-size:2rem;border-radius:1rem;height:1.5rem}.Checkout .invoice-info .checkout-info-item .info .title{font-size:1rem;line-height:1.4375rem;margin-bottom:0;font-weight:400;word-break:break-word;color:var(--color-text);text-transform:capitalize}.Checkout .invoice-info .checkout-info-item .info .data{margin-bottom:0;font-size:0.875rem;color:var(--color-text-secondary)}\n",".CardInput{position:relative}.CardInput .input-group.has-left-addon .form-control{padding-left:4rem}.CardInput .left-addon{position:absolute;top:.8rem;left:1rem;z-index:8}.CardInput .left-addon img{max-width:2rem}\n",".PaymentInfo{padding:0.5rem 1rem}.PaymentInfo h5{font-size:0.9rem;color:var(--color-text-secondary);margin:1rem 0 1.1rem}.PaymentInfo .inline-inputs{display:flex;justify-content:space-between}.PaymentInfo .inline-inputs .input-group{flex:1 10rem;max-width:45%;display:flex}\n",".PaymentModal .modal-backdrop{pointer-events:none}.PaymentModal .header{position:relative;border-top-left-radius:10px;border-top-right-radius:10px;width:100%;padding:.25rem 1rem;display:flex;align-items:center;flex-direction:row;background:var(--color-background);border-bottom:1px var(--color-borders) solid}.PaymentModal .header h3{margin-bottom:0;margin-left:1.5rem;unicode-bidi:plaintext;text-align:initial}.PaymentModal .Transition{height:25rem}.PaymentModal .empty-content{height:25rem;max-height:90%;display:flex;align-items:center;justify-content:center}.PaymentModal .receipt-content{height:25rem;overflow-y:auto}.PaymentModal .content{overflow:auto;width:100%;height:100%;position:relative}.PaymentModal .footer{position:relative;border-bottom-left-radius:10px;border-bottom-right-radius:10px;width:100%;padding:.75rem 1rem;background:var(--color-background);border-top:1px var(--color-borders) solid}.PaymentModal .footer button{text-transform:none;font-weight:500}.PaymentModal .modal-dialog{width:25rem}.PaymentModal .modal-content{padding:0;overflow:hidden}@media screen and (max-device-width: 640px) and (max-height: 640px) and (orientation: landscape){.PaymentModal .modal-dialog{max-height:100%}.PaymentModal .Transition{height:10rem}}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/3.c4d4bc793e11d4bb6728.js b/dist/3.c4d4bc793e11d4bb6728.js deleted file mode 100644 index e1465a565..000000000 --- a/dist/3.c4d4bc793e11d4bb6728.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[3],Array(106).concat([function(e,t,a){"use strict";a.r(t),a.d(t,"MediaViewer",(function(){return me})),a.d(t,"ForwardPicker",(function(){return Ce})),a.d(t,"Dialogs",(function(){return Ne})),a.d(t,"Notifications",(function(){return Se})),a.d(t,"SafeLinkModal",(function(){return Me})),a.d(t,"HistoryCalendar",(function(){return Te})),a.d(t,"CalendarModal",(function(){return Re})),a.d(t,"DeleteMessageModal",(function(){return De})),a.d(t,"PinMessageModal",(function(){return Be})),a.d(t,"UnpinAllMessagesModal",(function(){return xe})),a.d(t,"MessageSelectToolbar",(function(){return He})),a.d(t,"LeftSearch",(function(){return It})),a.d(t,"Settings",(function(){return En})),a.d(t,"ContactList",(function(){return jn})),a.d(t,"NewChat",(function(){return wn})),a.d(t,"NewChatStep1",(function(){return yn})),a.d(t,"NewChatStep2",(function(){return kn})),a.d(t,"ArchivedChats",(function(){return In})),a.d(t,"ContextMenuContainer",(function(){return Gn})),a.d(t,"StickerSetModal",(function(){return qn})),a.d(t,"HeaderMenuContainer",(function(){return _n})),a.d(t,"MobileSearch",(function(){return Vn})),a.d(t,"AttachmentModal",(function(){return sc})),a.d(t,"PollModal",(function(){return oc})),a.d(t,"SymbolMenu",(function(){return Ac})),a.d(t,"AttachMenu",(function(){return Lc})),a.d(t,"MentionTooltip",(function(){return nc})),a.d(t,"StickerTooltip",(function(){return Rc})),a.d(t,"BotKeyboardMenu",(function(){return Tc})),a.d(t,"CustomSendMenu",(function(){return Dc})),a.d(t,"DropArea",(function(){return Bc.b})),a.d(t,"TextFormatter",(function(){return xc.a})),a.d(t,"EmojiTooltip",(function(){return Gc})),a.d(t,"InlineBotTooltip",(function(){return Wc})),a.d(t,"RightSearch",(function(){return Yc})),a.d(t,"StickerSearch",(function(){return Xc})),a.d(t,"GifSearch",(function(){return es})),a.d(t,"PollResults",(function(){return as})),a.d(t,"Management",(function(){return vs})),a.d(t,"PaymentModal",(function(){return zs})),a.d(t,"ReceiptModal",(function(){return $s}));var n=a(0),c=a(1),s=a(8),r=a(13),o=a(2),l=a(6),i=a(54),d=a(118),m=a(7),u=a(4),b=a(3),h=a(136),g=a(49),p=a(182),v=a(31),O=a(110),E=a(123),f=a(197),j=a(29),C=a(37),y=a(149);function k(e,t,a,n,c,s){const{mediaEl:l}=P(t,s);if(!l)return;const{width:m}=i.a.get(),{width:u,height:b}=Object(d.l)(e,c),{width:h,height:g}=Object(d.f)(u,b,n.width,n.height),p=(m-h)/2,v=function(e){const t=window.matchMedia(d.c);let a=4.125;e&&(a+=t.matches?.875:3.375);return a*d.d}(e)+(b-g)/2;let{top:O,left:E,width:f,height:j}=l.getBoundingClientRect();if([r.h.SharedMedia,r.h.Album,r.h.ScheduledAlbum,r.h.SearchResult].includes(t)){const e=function(e,t,a,n,c,s){if(e===t){const r=Math.max(c,s)*(e/t);n-=(r-c)/2,a-=(r-s)/2,c=r,s=r}else if(e>t){const a=c;n-=((c=s*(e/t))-a)/2}else if(t>e){const n=s;a-=((s=c*(t/e))-n)/2}return{top:a,left:n,width:c,height:s}}(h,g,O,E,f,j);O=e.top,E=e.left,f=e.width,j=e.height}const C=E+f/2-(p+h/2),y=O+j/2-(v+g/2),k=f/h,N=j/g,S=w(a||l);I(S,{top:v+"px",left:p+"px",width:h+"px",height:g+"px",transform:`translate3d(${C}px, ${y}px, 0) scale(${k}, ${N})`}),M(S,t),document.body.classList.add("ghost-animating"),requestAnimationFrame(()=>{document.body.appendChild(S),requestAnimationFrame(()=>{S.style.transform="",function(e){e.firstChild.style.objectFit="default",e.classList.remove("rounded-corners","circle")}(S),setTimeout(()=>{requestAnimationFrame(()=>{document.body.contains(S)&&document.body.removeChild(S),document.body.classList.remove("ghost-animating")})},200+o.c)})})}function N(e,t,a){const{container:n,mediaEl:c}=P(e,a);if(!c)return;const s=document.getElementById("MediaViewer").querySelector(".active .media-viewer-content img, .active .media-viewer-content video");if(!s||!c)return;const{top:l,left:d,width:m,height:u}=s.getBoundingClientRect(),{top:b,left:h,width:g,height:p}=c.getBoundingClientRect();let v=b;if(!function(e){if("none"===e.style.display)return!1;const t=e.getBoundingClientRect(),{height:a}=i.a.get();return t.top<=a&&t.top+t.height>=0}(n)){const{height:e}=i.a.get();v=bj?f=j:j>f&&(j=f));const y=document.getElementsByClassName("ghost")[0],k=y||w(t||c,e===r.h.ProfileAvatar);y||I(k,{top:v+"px",left:h+"px",width:g+"px",height:p+"px",transform:`translate3d(${O}px, ${E}px, 0) scale(${f}, ${j})`}),requestAnimationFrame(()=>{if(y){const{top:e,left:t,width:a,height:n}=y.getBoundingClientRect();I(k,{transition:"none",top:v+"px",left:h+"px",transformOrigin:"top left",transform:`translate3d(${t-h}px, ${e-v}px, 0) scale(${a/g}, ${n/p})`,width:g+"px",height:p+"px"})}document.body.classList.add("ghost-animating"),y||document.body.appendChild(k),requestAnimationFrame(()=>{y&&(y.style.transition=""),k.style.transform="",C&&(k.style.opacity="0"),M(k,e),setTimeout(()=>{requestAnimationFrame(()=>{document.body.contains(k)&&document.body.removeChild(k),document.body.classList.remove("ghost-animating")})},200+o.c)})})}function w(e,t=!1){const a=document.createElement("div");a.classList.add("ghost");const n=new Image;if("string"==typeof e?n.src=e:e instanceof HTMLVideoElement?n.src=e.poster:n.src=e.src,a.appendChild(n),t){a.classList.add("ProfileInfo");const e=document.querySelector("#RightColumn .ProfileInfo .info");e&&a.appendChild(e.cloneNode(!0))}return a}function S(e,t){const a=document.querySelector(".active > .MessageList");let n=e.offsetTop+t.closest(".content-inner, .WebPage").offsetTop;return e.id.includes("album-media-")&&(n+=e.parentElement.offsetTop+e.closest(".Message").offsetTop),n>a.scrollTop&&n+t.offsetHeight{if(n&&t)return{sender:Object(u.ob)(t)?Object(m.Jb)(e,t):Object(m.g)(e,t)};if(!a||!t)return{};const c=Object(m.l)(e,t,a);return{message:c,sender:c&&Object(m.vb)(e,c)}},(e,t)=>Object(b.l)(t,["closeMediaViewer","focusMessage"]))(({chatId:e,messageId:t,sender:a,isAvatar:c,message:s,closeMediaViewer:r,focusMessage:o})=>{const l=Object(n.m)(()=>{r(),o({chatId:e,messageId:t})},[e,o,t,r]),i=Object(F.a)();if(!a||!s&&!c)return;const d=a.id<0,m=Object(u.X)(i,a);return n.a.createElement("div",{className:"SenderInfo",onClick:l},d?n.a.createElement(U.a,{key:a.id,size:"medium",chat:a}):n.a.createElement(U.a,{key:a.id,size:"medium",user:a}),n.a.createElement("div",{className:"meta"},n.a.createElement("div",{className:"title",dir:"auto"},m&&Object(x.a)(m)),n.a.createElement("div",{className:"date",dir:"auto"},c?i("lng_mediaview_profile_photo"):Object(B.d)(i,1e3*s.date))))}),q=a(185),z=a(63),_=a(43),H=a(124);a(261);var $=({mediaData:e,isVideo:t,isZoomed:a,message:c,fileName:s,isAvatar:r,onCloseMediaViewer:o,onForward:i,onZoomToggle:d})=>{const{isDownloadStarted:m,downloadProgress:b,handleDownloadClick:h}=Object(q.a)(c&&t?Object(u.E)(c,"download"):void 0,s),g=Object(F.a)(),p=Object(n.p)(()=>({onTrigger:e,isOpen:t})=>n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",className:t?"active":void 0,onClick:e,ariaLabel:"More actions"},n.a.createElement("i",{className:"icon-more"})),[]);return l.l?n.a.createElement("div",{className:"MediaViewerActions-mobile"},n.a.createElement(z.a,{trigger:p,positionX:"right"},!r&&n.a.createElement(_.a,{icon:"forward",onClick:i},g("Forward")),t?n.a.createElement(_.a,{icon:m?"close":"download",onClick:h},m?Math.round(100*b)+"% Downloading...":"Download"):n.a.createElement(_.a,{icon:"download",href:e,download:s},g("AccActionDownload"))),m&&n.a.createElement(H.a,{progress:b,size:"s",noCross:!0})):n.a.createElement("div",{className:"MediaViewerActions"},!r&&n.a.createElement(n.a.Fragment,null,n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:g("Forward"),onClick:i},n.a.createElement("i",{className:"icon-forward"}))),t?n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:g("AccActionDownload"),onClick:h},m?n.a.createElement(H.a,{progress:b,size:"s",onClick:h}):n.a.createElement("i",{className:"icon-download"})):n.a.createElement(D.a,{href:e,download:s,round:!0,size:"smaller",color:"translucent-white",ariaLabel:g("AccActionDownload")},n.a.createElement("i",{className:"icon-download"})),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:a?"Zoom Out":"Zoom In",onClick:d},n.a.createElement("i",{className:a?"icon-zoom-out":"icon-zoom-in"})),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:g("Close"),onClick:o},n.a.createElement("i",{className:"icon-close"})))},V=a(10),W=a(9);a(262);var K=({text:e="",isHidden:t,isForVideo:a,onClick:c})=>{const[s,r]=Object(n.r)(!1);Object(n.n)(()=>{const e=document.querySelector(".MediaViewerFooter .media-text"),t=()=>{const t=e?e.clientHeight:0;r(t>2*d.d)};t();const a=Object(V.h)(t,500,!0);return window.addEventListener("resize",a,!1),()=>{window.removeEventListener("resize",a,!1)}},[]);const o=Object(W.a)("MediaViewerFooter",a&&"is-for-video",t&&"is-hidden");return n.a.createElement("div",{className:o,onClick:function(t){e&&t.stopPropagation()}},e&&n.a.createElement("div",{className:"media-viewer-footer-content",onClick:l.l?void 0:c},n.a.createElement("p",{className:"media-text custom-scroll "+(s?"multiline":""),dir:"auto"},e)))},Y=a(40),Q=a(140);const Z=function(){if(void 0!==document.fullscreenElement)return"fullscreenElement";if(void 0!==document.mozFullScreenElement)return"mozFullScreenElement";if(void 0!==document.webkitFullscreenElement)return"webkitFullscreenElement";return""}();var J=a(150),X=a(139);const ee=["bytes","kB","MB","GB","TB","PB"];var te=e=>{const t=0===e?0:Math.floor(Math.log(e)/Math.log(1024));return`${(e/1024**Math.floor(t)).toFixed(1)} ${ee[t]}`};a(263);const ae=e=>{e.stopPropagation()};var ne=({bufferedProgress:e,currentTime:t,duration:a,fileSize:c,isForceVisible:s,isForceMobileVersion:r,isPlayed:o,isFullscreenSupported:i,isFullscreen:d,onChangeFullscreen:m,onPlayPause:u,onSeek:b})=>{const[h,g]=Object(n.r)(!0);Object(n.n)(()=>{s&&g(s)},[s]),Object(n.n)(()=>{let e;return s||(l.l?g(!1):e=window.setTimeout(()=>{g(!1)},800)),()=>{e&&window.clearTimeout(e)}},[s]),Object(n.n)(()=>((h||s)&&document.body.classList.add("video-controls-visible"),()=>{document.body.classList.remove("video-controls-visible")}),[s,h]);const p=Object(F.a)();var v,O;if(h||s)return n.a.createElement("div",{className:"VideoPlayerControls "+(r?"mobile":""),onClick:ae},function(e,t,a,c){const s=e/t*100,r=100*a;return n.a.createElement("div",{className:"player-seekline"},n.a.createElement("div",{className:"player-seekline-track"},n.a.createElement("div",{className:"player-seekline-buffered",style:`width: ${r||0}%`}),n.a.createElement("div",{className:"player-seekline-played",style:`width: ${s||0}%`}),n.a.createElement("input",{min:"0",max:"100",step:.01,type:"range",onInput:c,className:"player-seekline-input",value:s||0})))}(t,a,e,b),n.a.createElement(D.a,{ariaLabel:p("AccActionPlay"),size:"tiny",ripple:!l.l,color:"translucent-white",className:"play",onClick:u},n.a.createElement("i",{className:o?"icon-pause":"icon-play"})),function(e,t){return n.a.createElement("div",{className:"player-time"},`${Object(B.e)(e)} / ${Object(B.e)(t)}`)}(t,a),e<1&&(v=e,O=c,n.a.createElement("div",{className:"player-file-size"},`${te(O*v)} / ${te(O)}`)),i&&n.a.createElement(D.a,{ariaLabel:"Fullscreen",size:"tiny",color:"translucent-white",className:"fullscreen",onClick:m},n.a.createElement("i",{className:""+(d?"icon-smallscreen":"icon-fullscreen")})))};a(264);function ce(){return(ce=Object.assign||function(e){for(var t=1;t{const m=Object(n.q)(null),[u,b]=Object(n.r)(!l.n||!l.e),[h,g]=Object(n.r)(0),[p,v]=Object(n.r)(!0),[O,E,f]=function(e,t){const[a,c]=Object(n.r)(Boolean(Z&&document[Z]));return Object(n.o)(()=>{const a=()=>{c(Boolean(Z&&document[Z]))},n=()=>{c(!0)},s=()=>{c(!1),t(!1)},r=e.current;return document.addEventListener("fullscreenchange",a,!1),document.addEventListener("webkitfullscreenchange",a,!1),document.addEventListener("mozfullscreenchange",a,!1),r&&(r.addEventListener("webkitbeginfullscreen",n,!1),r.addEventListener("webkitendfullscreen",s,!1)),()=>{document.removeEventListener("fullscreenchange",a,!1),document.removeEventListener("webkitfullscreenchange",a,!1),document.removeEventListener("mozfullscreenchange",a,!1),r&&(r.removeEventListener("webkitbeginfullscreen",n,!1),r.removeEventListener("webkitendfullscreen",s,!1))}},[]),Z||"iOS"===l.r?[a,()=>{e.current&&(Z||"iOS"===l.r)&&(e.current.requestFullscreen?e.current.requestFullscreen():e.current.webkitRequestFullscreen?e.current.webkitRequestFullscreen():e.current.webkitEnterFullscreen?e.current.webkitEnterFullscreen():e.current.mozRequestFullScreen&&e.current.mozRequestFullScreen(),c(!0))},()=>{e.current&&(document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.webkitExitFullscreen&&document.webkitExitFullscreen(),c(!1))}]:[!1]}(m,b),{isBuffered:j,bufferedProgress:C,bufferingHandlers:y}=Object(Q.a)(),{shouldRender:k,transitionClassNames:N}=Object(Y.a)(!j,void 0,void 0,"slow"),{shouldRender:w,transitionClassNames:S}=Object(Y.a)(l.e&&!u&&!k,void 0,void 0,"slow");Object(n.n)(()=>{i||!o?m.current.pause():e&&!l.n&&Object(X.a)(m.current)},[i,o,e]),Object(n.n)(()=>{m.current.currentTime===m.current.duration?(g(0),b(!1)):g(m.current.currentTime)},[h]);const I=Object(n.m)(e=>{e.stopPropagation(),u?(m.current.pause(),b(!1)):(m.current.play(),b(!0))},[u]);Object(J.a)(m,[]);const P=Object(n.m)(()=>{v(!0)},[]),M=Object(n.m)(()=>{v(!1)},[]),F=Object(n.m)(e=>{g(e.currentTarget.currentTime)},[]),A=Object(n.m)(()=>{g(0),b(!1)},[]),L=Object(n.m)(()=>{O&&f?f():!O&&E&&E()},[f,O,E]),R=Object(n.m)(e=>{e.stopPropagation(),m.current.currentTime=Number(e.target.value)*m.current.duration/100},[]),T=Object(n.m)(e=>{e.stopPropagation(),v(!p)},[p]);Object(n.n)(()=>{const e=e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),I(e))};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}},[I]);const B=c&&`width: ${c.width}px; height: ${c.height}px`,x=`background-image: url(${a})`;return n.a.createElement("div",{className:"VideoPlayer",onClick:!t&&l.l?T:void 0,onMouseOver:t?void 0:P,onMouseOut:t?void 0:M},n.a.createElement("div",{style:B},n.a.createElement("video",ce({ref:m,autoPlay:l.n,playsInline:!0,loop:t,muted:t,id:"media-viewer-video",style:x,onEnded:A,onClick:l.l?void 0:I,onDoubleClick:L},y,{onTimeUpdate:F}),e&&n.a.createElement("source",{src:e}))),w&&n.a.createElement(D.a,{round:!0,className:"play-button "+S,onClick:I},n.a.createElement("i",{className:"icon-play"})),k&&n.a.createElement("div",{className:["spinner-container",N].join(" ")},!j&&n.a.createElement("div",{className:"buffering"},"Buffering..."),n.a.createElement(H.a,{size:"xl",progress:j?1:s,square:!0,onClick:d})),!t&&!k&&n.a.createElement(ne,{isPlayed:u,bufferedProgress:C,currentTime:h,isFullscreenSupported:Boolean(E),isFullscreen:O,fileSize:r,duration:m.current?m.current.duration:0,isForceVisible:!u||p,isForceMobileVersion:c&&c.width<400,onSeek:R,onChangeFullscreen:L,onPlayPause:I}))});a(265);var re=Object(n.h)(({isShown:e,onChangeZoom:t})=>{const{transitionClassNames:a}=Object(Y.a)(e),c=Object(j.a)(e),s=Object(n.q)(null),[r,o]=Object(n.r)(1),i=Object(n.q)(!1);Object(n.n)(()=>{e&&!c&&o(1.5)},[e,c]);const d=Object(n.m)(()=>{i.current=!0},[]),m=Object(n.m)(()=>{i.current=!1,1===r&&t(r,!i.current)},[t,r]);Object(n.n)(()=>{t(r,!i.current)},[r,t]);const u=Object(F.a)(),b=Object(W.a)("ZoomControls",a);return n.a.createElement("div",{className:b},n.a.createElement(D.a,{disabled:1===r,size:"tiny",color:"translucent-white",ariaLabel:u("ZoomOut"),className:"zoom-out",ripple:!l.l,onClick:()=>{s.current&&o(Math.max(1,r-.5))}},n.a.createElement("i",{className:"icon-zoom-out"})),n.a.createElement(D.a,{disabled:3===r,size:"tiny",color:"translucent-white",ariaLabel:"Zoom In",className:"zoom-in",ripple:!l.l,onClick:()=>{s.current&&o(Math.min(3,r+.5))}},n.a.createElement("i",{className:"icon-zoom-in"})),n.a.createElement("div",{className:"seekline"},n.a.createElement("div",{className:"seekline-track"},n.a.createElement("div",{className:"seekline-played",style:`width: ${50*(r-1)}%`}),n.a.createElement("input",{ref:s,min:1,max:3,step:"0.5",value:r,type:"range",className:"seekline-input",onChange:e=>{o(Math.min(3,Math.max(Number(e.target.value),1)))},onMouseDown:d,onMouseUp:m}))))});a(266);const oe=[1,0,0,1,0,0],le={1:1,1.5:1.5,2:2.2,2.5:3.3,3:5.5};var ie=Object(n.h)(({children:e,className:t,noWrap:a,canPan:c,zoomLevel:s,panDeltaX:r,panDeltaY:o,onPan:l})=>{const i=le[s]||s,[d,m]=Object(n.r)(!1),[u,h]=Object(n.r)({dx:r,dy:o,x:0,y:0}),[g,p]=Object(n.r)(oe),v=Object(n.q)(null),O=Object(n.q)(null);Object(n.n)(()=>{const e=i||g[0],t=r||g[4],a=o||g[5],n=[...g];g[0]!==e&&(n[0]=e||n[0],n[3]=e||n[3]),g[4]!==t&&(n[4]=t),g[5]!==a&&(n[5]=a),Object(b.a)(g,n)||p(function(e,t,a){const n=a&&a.querySelector(".active img");if(!a||!n)return t;const c=a.getBoundingClientRect(),s=n.getBoundingClientRect(),r=s.width/e*t[0],o=s.height/e*t[3],l=(c.width-r)/2+t[4],i=(c.height-o)/2+t[5];return c.width&&c.width-150{c||p(oe)},[c]),Object(n.n)(()=>{O.current&&(O.current.style.transform=`matrix(${g.toString()})`)},[a,g]);return a?e:n.a.createElement("div",{ref:v,className:"pan-wrapper "+(t||""),onMouseDown:e=>{if(!c)return;e.stopPropagation(),e.preventDefault();const t={dx:g[4],dy:g[5],x:e.pageX,y:e.pageY};h(t),m(!0),v.current&&v.current.classList.add("move")},onMouseUp:()=>{m(!1),v.current&&v.current.classList.remove("move"),l&&l(g[4],g[5])},onMouseMove:e=>{if(d){const t=function(e,t){const a=[...g],n=u.x-e,c=u.y-t;return a[4]=u.dx-n,a[5]=u.dy-c,a}(e.pageX,e.pageY);p(t),O.current&&(O.current.style.transform=`matrix(${g.toString()})`)}}},n.a.createElement("div",{ref:O,className:"pan-container"},e))});a(267);function de(e,t,a){return e?n.a.createElement("img",{src:e,alt:"",style:t?`width: ${t.width}px`:"",draggable:Boolean(a)}):n.a.createElement("div",{className:"spinner-wrapper",style:t?`width: ${t.width}px`:""},n.a.createElement(L.a,{color:"white"}))}var me=Object(n.h)(Object(c.h)(e=>{const{chatId:t,threadId:a,messageId:n,avatarOwnerId:c,profilePhotoIndex:s,origin:o}=e.mediaViewer,{animationLevel:l}=e.settings.byKey;if(o===r.h.SearchResult){if(!t||!n)return{animationLevel:l};const a=Object(m.l)(e,t,n);return a?{chatId:t,messageId:n,senderId:a.senderId,origin:o,message:a,animationLevel:l}:{animationLevel:l}}if(c){return{messageId:-1,senderId:c,avatarOwner:Object(m.Jb)(e,c)||Object(m.g)(e,c),profilePhotoIndex:s||0,animationLevel:l,origin:o}}if(!(t&&a&&n))return{animationLevel:l};let i,d,u;if(i=o&&[r.h.ScheduledAlbum,r.h.ScheduledInline].includes(o)?Object(m.rb)(e,t,n):Object(m.l)(e,t,n),!i)return{animationLevel:l};if(d=o&&[r.h.ScheduledAlbum,r.h.ScheduledInline].includes(o)?Object(m.sb)(e,t):Object(m.n)(e,t),o===r.h.Inline||o===r.h.Album)u=Object(m.hb)(e,t,a)||Object(m.Z)(e,t,a);else if(o===r.h.SharedMedia){const t=Object(m.w)(e),{foundIds:a}=t&&t.resultsByType&&t.resultsByType.media||{};u=a}return{chatId:t,threadId:a,messageId:n,senderId:i.senderId,origin:o,message:i,chatMessages:d,collectionIds:u,animationLevel:l}},(e,t)=>Object(b.l)(t,["openMediaViewer","closeMediaViewer","openForwardMenu","focusMessage"]))(({chatId:e,threadId:t,messageId:a,senderId:c,origin:m,avatarOwner:b,profilePhotoIndex:w,message:S,chatMessages:I,collectionIds:P,openMediaViewer:M,closeMediaViewer:L,openForwardMenu:B,focusMessage:x,animationLevel:U})=>{const q=Boolean(b||a),z=m===r.h.SharedMedia,_=m===r.h.SearchResult,H=S?Object(u.H)(S):void 0,V=S?Object(u.Q)(S):void 0,W=S?Object(u.S)(S):void 0,Y=S?Object(u.T)(S):void 0,Q=!!S&&Object(u.vb)(S),Z=!!S&&Object(u.wb)(S),J=Boolean(V||Y||Z),X=Boolean(!J&&(H||W||Q)),{isGif:ee}=V||Y||{},te=Boolean(b),ae=Boolean(W||Y),ne=Object(n.p)(()=>ae&&a?[a]:Object(u.h)(I||{},P||[],z),[ae,a,I,P,z]),ce=a?ne.indexOf(a):-1,oe=0===ce||-1===ce,le=ce===ne.length-1||-1===ce,me=Object(n.q)(),ue=Object(j.a)(c);!q||ue&&ue===c&&me.current||(me.current=ce);const be=U>=1?"mv-slide":"none",he=2===U?"slide-fade":"none",ge=2===U,[pe,ve]=Object(n.r)(!1),[Oe,Ee]=Object(n.r)(!1),[fe,je]=Object(n.r)(!1),[Ce,ye]=Object(n.r)(1),[ke,Ne]=Object(n.r)({x:0,y:0});function we(e){if(te&&void 0!==w){const{photos:t}=b;return t&&t[w]?`photo${t[w].id}?size=c`:Object(u.e)(b,e?"big":"normal")}return S&&Object(u.E)(S,e?"viewerFull":"viewerPreview")}const Se=Object(O.a)(S&&(z||_)&&Object(u.E)(S,"pictogram"),void 0,s.ApiMediaFormat.BlobUrl,void 0,ge&&350),Ie=we(),Pe=Object(O.a)(Ie,void 0,te&&Ie&&Ie.startsWith("profilePhoto")?s.ApiMediaFormat.DataUri:s.ApiMediaFormat.BlobUrl,void 0,ge&&350),{mediaData:Me,downloadProgress:Fe}=Object(E.a)(we(!0),void 0,S&&Object(u.D)(S,"viewerFull"),void 0,ge&&350),Ae=H||V?(H||V).blobUrl:void 0;let Le=!J&&(Ae||Me)||Pe||Se;const Re=Object(f.a)(!Le&&S&&Object(u.F)(S));Le||m===r.h.SearchResult||(Le=Re);const Te=S?Object(u.A)(S):void 0,De=S?Object(u.z)(S):te?`avatar${b.id}-${w}.jpg`:void 0;let Be;S?Q||Z?Be=Object(u.y)(S).mediaSize:H||W?Be=Object(u.U)(H||W):(V||Y)&&(Be=Object(u.db)(V||Y)):Be=d.a,Object(n.n)(()=>{l.l&&document.body.classList.toggle("is-media-viewer-open",q)},[q]);const xe=Object(v.a)();Object(n.n)(()=>{const e=window.matchMedia(d.c);return"function"==typeof e.addEventListener?e.addEventListener("change",xe):"function"==typeof e.addListener&&e.addListener(xe),()=>{"function"==typeof e.removeEventListener?e.removeEventListener("change",xe):"function"==typeof e.removeListener&&e.removeListener(xe)}},[xe]);const Ue=Object(j.a)(S),Ge=Object(j.a)(m),qe=Object(j.a)(b),ze=Object(j.a)(Le);Object(n.n)(()=>{if(ge&&q&&!Ue&&!qe){Object(C.d)(350+o.c);const e=S?Object(y.a)(S):void 0;k(Boolean(e),m,Le,Be,J,S)}ge&&!q&&(Ue||qe)&&(Object(C.d)(350+o.c),N(Ge,ze,Ue||void 0))},[ge,q,m,Ge,S,Ue,qe,Le,ze,Be,J]),Object(n.n)(()=>{let e;return fe?Ee(!0):e=window.setTimeout(()=>{Ee(!1)},350),()=>{e&&window.clearTimeout(e)}},[fe]);const _e=()=>{je(!1),ye(1),Ne({x:0,y:0})},He=Object(n.m)(()=>{je(!fe),ye(fe?1:1.5),fe&&Ne({x:0,y:0})},[fe]),$e=Object(n.m)((e,t=!1)=>{ye(e),1===e&&t&&_e()},[]),Ve=Object(n.m)(()=>{L(),_e()},[L]),We=Object(n.m)(()=>{Ve(),x({chatId:e,threadId:t,messageId:a})},[Ve,e,t,x,a]),Ke=Object(n.m)(()=>{B({fromChatId:e,messageIds:[a]}),_e()},[B,e,a]);Object(n.n)(()=>q?Object(g.a)(()=>{fe?_e():Ve()}):void 0,[Ve,q,fe]),Object(n.n)(()=>{J&&!ee&&Object(p.b)()},[ee,J]),Object(n.n)(()=>{if(q)return i.a.disableRefresh(),()=>{i.a.enableRefresh()}},[q]);const Ye=Object(n.m)((e,t)=>{let a=ne.indexOf(e);return(-1===t&&a>0||1===t&&a{oe||M({chatId:e,threadId:t,messageId:a?Ye(a,-1):void 0,origin:m})},[e,t,Ye,oe,a,M,m]),Ze=Object(n.m)(()=>{le||M({chatId:e,threadId:t,messageId:a?Ye(a,1):void 0,origin:m})},[e,t,Ye,le,a,M,m]);Object(n.n)(()=>{const e=e=>{switch(e.key){case"Left":case"ArrowLeft":Qe();break;case"Right":case"ArrowRight":Ze()}};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}}),Object(n.n)(()=>{const e=document.querySelector(".slide-container > .active, .slide-container > .to");if(!e)return;const t=ee&&!l.e;return Object(h.b)(e,{excludedClosestSelector:".backdrop, .navigation, .media-viewer-head, .media-viewer-footer"+(t?"":", .VideoPlayer"),onClick:()=>{fe||l.n||Ve()},onSwipe:l.n?(e,t)=>{t===h.a.Right?Qe():t===h.a.Left?Ze():e.target&&e.target.closest(".MediaViewerFooter")||Ve()}:void 0})},[Ve,pe,ee,X,fe,Ze,Qe]);const Je=Object(n.m)((e,t)=>{Ne({x:e,y:t})},[]),Xe=Object(n.m)(()=>{l.n&&(X||ee)&&ve(!pe)},[pe,ee,X]),et=Object(F.a)();function tt(t){if(te)return n.a.createElement("div",{key:e,className:"media-viewer-content"},de(Me||Pe,Object(d.h)(d.a,!1),!l.l&&!fe));if(S){const e=Object(y.a)(S),c=Boolean(e);return n.a.createElement("div",{key:a,className:"media-viewer-content "+(c?"has-footer":""),onClick:Xe},X&&de(Ae||Me||Pe||Se,S&&Object(d.h)(Be,c),!l.l&&!fe),J&&n.a.createElement(se,{key:a,url:Ae||Me,isGif:ee,posterData:Le,posterSize:S&&Object(d.h)(Be,c,!0),downloadProgress:Fe,fileSize:Te,isMediaViewerOpen:q,noPlay:!t,onClose:Ve}),e&&n.a.createElement(K,{text:e,onClick:We,isHidden:pe&&(!J||ee),isForVideo:J&&!ee}))}}function at(){return te?n.a.createElement(G,{key:b.id,chatId:b.id,isAvatar:!0}):n.a.createElement(G,{key:a,chatId:e,messageId:a})}return Object(A.a)(q,L,M,{chatId:e,threadId:t,messageId:a,origin:m,avatarOwnerId:b&&b.id}),n.a.createElement(R.a,{id:"MediaViewer",className:fe?"zoomed":"",isOpen:q},()=>n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:"media-viewer-head",dir:et.isRtl?"rtl":void 0},l.l&&n.a.createElement(D.a,{className:"media-viewer-close",round:!0,size:"smaller",color:"translucent-white",ariaLabel:et("Close"),onClick:Ve},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(T.a,{activeKey:me.current,name:he},at),n.a.createElement($,{mediaData:Me||Pe,isVideo:J,isZoomed:fe,message:S,fileName:De,onCloseMediaViewer:Ve,onForward:Ke,onZoomToggle:He,isAvatar:te})),n.a.createElement(ie,{noWrap:!Oe,canPan:fe,panDeltaX:ke.x,panDeltaY:ke.y,zoomLevel:Ce,onPan:Je},n.a.createElement(T.a,{className:"slide-container",activeKey:ce,name:be},tt)),!oe&&n.a.createElement("button",{type:"button",className:"navigation prev "+(J&&!ee&&"inline"),"aria-label":et("AccDescrPrevious"),dir:et.isRtl?"rtl":void 0,onClick:Qe}),!le&&n.a.createElement("button",{type:"button",className:"navigation next "+(J&&!ee&&"inline"),"aria-label":et("Next"),dir:et.isRtl?"rtl":void 0,onClick:Ze}),n.a.createElement(re,{isShown:fe,onChangeZoom:$e})))})),ue=a(53),be=a(131),he=a(64),ge=a(20),pe=a(112),ve=a(47),Oe=a(115),Ee=a(108),fe=a(111),je=a(128);a(268);var Ce=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t,listIds:a,orderedPinnedIds:n},currentUserId:c}=e;return{chatsById:t,pinnedIds:n.active,activeListIds:a.active,archivedListIds:a.archived,currentUserId:c}},(e,t)=>Object(b.l)(t,["setForwardChatId","exitForwardMode","loadMoreChats"]))(({chatsById:e,pinnedIds:t,activeListIds:a,archivedListIds:c,currentUserId:r,isOpen:o,setForwardChatId:i,exitForwardMode:d,loadMoreChats:m})=>{const[h,g]=Object(n.r)(""),p=Object(n.q)(null),v=Object(F.a)();Object(n.n)(()=>{o?l.l||setTimeout(()=>{requestAnimationFrame(()=>{p.current&&p.current.focus()})},500):(p.current&&p.current.blur(),setTimeout(()=>{g("")},300))},[o]);const O=Object(n.p)(()=>{const n=[...a||[],...c||[]];let o=t||[];return r&&(o=Object(b.o)([r,...o])),Object(u.Ib)([...n.filter(t=>{const a=e[t];return!a||!!Object(u.d)(a,s.MAIN_THREAD_ID)&&(!h||Object(ue.a)(Object(u.k)(v,e[t],void 0,t===r),h))})],e,void 0,o)},[a,c,e,r,h,v,t]),[E,f]=Object(be.a)(m,O,Boolean(h)),j=Object(n.m)(e=>{g(e.currentTarget.value)},[]),C=Object(n.q)(null),y=Object(he.a)(C,o,e=>{E&&E.length>0&&i({id:E[-1===e?0:e]})},".ListItem-button",!0),k=n.a.createElement("div",{className:"modal-header",dir:v.isRtl?"rtl":void 0},n.a.createElement(D.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:v("Close"),onClick:d},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(ve.a,{ref:p,value:h,onChange:j,onKeyDown:y,placeholder:v("ForwardTo")}));return n.a.createElement(pe.a,{isOpen:o,onClose:d,className:"ForwardPicker",header:k},E&&E.length?n.a.createElement(Oe.a,{className:"picker-list custom-scroll",items:E,onLoadMore:f,noScrollRestore:Boolean(h),ref:C,onKeyDown:y},E.map(e=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable force-rounded-corners",onClick:()=>i({id:e})},Object(u.ob)(e)?n.a.createElement(fe.a,{status:e===r?v("SavedMessagesInfo"):void 0,userId:e}):n.a.createElement(je.a,{chatId:e})))):E&&!E.length?n.a.createElement("p",{className:"no-results"},"Sorry, nothing found."):n.a.createElement(ge.a,null))})),ye=a(174);a(269);function ke(e){return e.isSlowMode?"Slowmode enabled":e.hasErrorKey?"Something went wrong":"Telegram"}var Ne=Object(n.h)(Object(c.h)(e=>Object(b.l)(e,["dialogs"]),(e,t)=>Object(b.l)(t,["dismissDialog","acceptInviteConfirmation"]))(({dialogs:e,dismissDialog:t,acceptInviteConfirmation:a})=>{const c=Object(F.a)();if(!e.length)return;return n.a.createElement("div",{id:"Dialogs"},e.map(e=>{return"hash"in e?(e=>{const{hash:s,title:r,participantsCount:o,isChannel:l}=e,i=c(l?"Subscribers":"Members",o,"i"),d=c(l?"ChannelJoin":"JoinGroup");return n.a.createElement(pe.a,{isOpen:!0,onClose:t,className:"error",title:r},void 0!==o&&n.a.createElement("p",null,i),n.a.createElement(D.a,{isText:!0,className:"confirm-dialog-button",onClick:()=>{a({hash:s}),t()}},d),n.a.createElement(D.a,{isText:!0,className:"confirm-dialog-button",onClick:t},c("Cancel")))})(e):(s=e,n.a.createElement(pe.a,{isOpen:!0,onClose:t,className:"error",title:ke(s)},s.hasErrorKey?Object(ye.a)(s):Object(x.a)(s.message,["emoji","br"]),n.a.createElement("div",null,n.a.createElement(D.a,{isText:!0,onClick:t},c("OK")))));var s}))})),we=a(186);var Se=Object(n.h)(Object(c.h)(e=>Object(b.l)(e,["notifications"]),(e,t)=>Object(b.l)(t,["dismissNotification"]))(({notifications:e,dismissNotification:t})=>{if(e.length)return n.a.createElement("div",{id:"Notifications"},e.map(({message:e})=>n.a.createElement(we.a,{message:Object(x.a)(e,["emoji","br","links","simple_markdown"]),onDismiss:t})))})),Ie=a(138),Pe=a(120);var Me=Object(n.h)(Object(c.h)(void 0,(e,t)=>Object(b.l)(t,["toggleSafeLinkModal"]))(({url:e,toggleSafeLinkModal:t})=>{const a=Object(F.a)(),c=Object(n.m)(()=>{window.open(e),t({url:void 0})},[t,e]),s=Object(n.m)(()=>{t({url:void 0})},[t]),r=Object(Ie.a)(e);return n.a.createElement(Pe.a,{isOpen:Boolean(e),onClose:s,title:a("OpenUrlTitle"),textParts:Object(x.a)(a("OpenUrlAlert2",r),["links"]),confirmLabel:a("OpenUrlTitle"),confirmHandler:c})}));a(270);const Fe=["lng_weekday1","lng_weekday2","lng_weekday3","lng_weekday4","lng_weekday5","lng_weekday6","lng_weekday7"];function Ae(e,t,a,n,c){const s=new Date(e,t,a,0,0,0,0),r=n&&new Date(n.getFullYear(),n.getMonth(),n.getDate(),0,0,0,0),o=c&&new Date(c.getFullYear(),c.getMonth(),c.getDate(),0,0,0,0);return!!(o&&s>o)||!!(r&&s{const u=Object(F.a)(),b=new Date,h=Object(n.p)(()=>e?new Date(e):new Date,[e]),g=t?new Date(t):void 0,p=Object(j.a)(s),[v,O]=Object(n.r)(h),[E,f]=Object(n.r)(Le(h.getHours())),[C,y]=Object(n.r)(Le(h.getMinutes())),k=v.getFullYear(),N=v.getMonth(),w=v.getDate();Object(n.n)(()=>{!p&&s&&O(h)},[s,h,p]);const S=c&&k>=b.getFullYear()&&N>=b.getMonth()||g&&k>=g.getFullYear()&&N>=g.getMonth(),I=a&&k<=b.getFullYear()&&N<=b.getMonth(),P=Object(n.p)(()=>function(e,t){const a=[],n=new Date;n.setFullYear(e),n.setMonth(t),n.setDate(1);const c=n.getDay()||7;for(let e=1;e{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return f(""),void(e.target.value="");const a=Math.max(0,Math.min(Number(t),23)),n=new Date(v.getTime());n.setHours(a),O(n);const c=Le(a);f(c),e.target.value=c},[v]),A=Object(n.m)(e=>{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return y(""),void(e.target.value="");const a=Math.max(0,Math.min(Number(t),59)),n=new Date(v.getTime());n.setMinutes(a),O(n);const c=Le(a);y(c),e.target.value=c},[v]);return n.a.createElement(pe.a,{isOpen:s,onClose:i,className:"CalendarModal"},n.a.createElement("div",{className:"container"},n.a.createElement("div",{className:"month-selector"},n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:i},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h4",null,u("lng_month"+(v.getMonth()+1))," ",v.getFullYear()),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",disabled:I,onClick:I?void 0:function(){O(e=>{const t=new Date(e);return t.setMonth(t.getMonth()-1),t})}},n.a.createElement("i",{className:"icon-previous"})),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",disabled:S,onClick:S?void 0:function(){O(e=>{const t=new Date(e);return t.setMonth(t.getMonth()+1),t})}},n.a.createElement("i",{className:"icon-next"})))),n.a.createElement("div",{className:"calendar-wrapper"},n.a.createElement("div",{className:"calendar-grid"},Fe.map(e=>n.a.createElement("div",{className:"day-button faded weekday"},n.a.createElement("span",null,u(e)))),P.map(e=>n.a.createElement("div",{role:"button",tabIndex:0,onClick:()=>{return t=e,void O(e=>{const a=new Date(e);return a.setDate(t),a});var t},className:Object(W.a)("day-button",Ae(k,N,e,a?b:void 0,c?b:g)?"disabled":""+(e?"clickable":""),e===w&&"selected")},!!e&&n.a.createElement("span",null,e))))),r&&n.a.createElement("div",{className:"timepicker"},n.a.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:E,onChange:M}),":",n.a.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:C,onChange:A})),n.a.createElement("div",{className:"footer"},n.a.createElement(D.a,{onClick:function(){d(v)}},r?function(e,t){const a=Object(B.a)(t,e.code),n=Object(B.a)(new Date,e.code);if(a===n)return e("Conversation.ScheduleMessage.SendToday",Object(B.h)(t));return e("Conversation.ScheduleMessage.SendOn",[a,Object(B.h)(t)])}(u,v):o),l&&n.a.createElement(D.a,{onClick:m,isText:!0},l)))});var Te=Object(n.h)(Object(c.h)(e=>({selectedAt:e.historyCalendarSelectedAt}),(e,t)=>Object(b.l)(t,["searchMessagesByDate","closeHistoryCalendar"]))(({isOpen:e,selectedAt:t,searchMessagesByDate:a,closeHistoryCalendar:c})=>{const s=Object(n.m)(e=>{a({timestamp:e.valueOf()/1e3}),c()},[c,a]),r=Object(F.a)();return n.a.createElement(Re,{isOpen:e,selectedAt:t,isPastMode:!0,submitButtonLabel:r("JumpToDate"),onClose:c,onSubmit:s})}));var De=Object(n.h)(Object(c.h)((e,{message:t,isSchedule:a})=>{const{threadId:n}=Object(m.z)(e)||{},{canDeleteForAll:c}=n&&Object(m.b)(e,t,n)||{},s=Object(m.g)(e,t.chatId);return{canDeleteForAll:!a&&c,contactName:s&&Object(u.ob)(s.id)?Object(u.ab)(Object(m.Jb)(e,Object(u.W)(s))):void 0,willDeleteForCurrentUserOnly:s&&Object(u.lb)(s)&&!c,willDeleteForAll:s&&Object(u.qb)(s)}},(e,t)=>Object(b.l)(t,["deleteMessages","deleteScheduledMessages"]))(({isOpen:e,isSchedule:t,message:a,album:c,canDeleteForAll:s,contactName:r,willDeleteForCurrentUserOnly:o,willDeleteForAll:l,onClose:i,deleteMessages:d,deleteScheduledMessages:m})=>{const u=Object(n.m)(()=>{const e=c&&c.messages?c.messages.map(({id:e})=>e):[a.id];d({messageIds:e,shouldDeleteForAll:!0}),i()},[d,a.id,i,c]),b=Object(n.m)(()=>{const e=c&&c.messages?c.messages.map(({id:e})=>e):[a.id];t?m({messageIds:e}):d({messageIds:e,shouldDeleteForAll:!1}),i()},[c,a.id,t,i,m,d]),h=Object(F.a)();return n.a.createElement(pe.a,{isOpen:e,onClose:i,onEnter:e&&!s?b:void 0,className:"delete",title:h("DeleteSingleMessagesTitle")},n.a.createElement("p",null,h("AreYouSureDeleteSingleMessage")),o&&n.a.createElement("p",null,h("lng_delete_for_me_chat_hint",1,"i")),l&&n.a.createElement("p",null,h("lng_delete_for_everyone_hint",1,"i")),s&&n.a.createElement(D.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:u},r&&Object(x.a)(h("Conversation.DeleteMessagesFor",r)),!r&&h("Conversation.DeleteMessagesForEveryone")),n.a.createElement(D.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:b},h(s?"ChatList.DeleteForCurrentUser":"Delete")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:i},h("Cancel")))}));var Be=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(u.ob)(t),n=Object(m.P)(e,t),c=Object(m.g)(e,t),s=!!c&&Object(u.mb)(c),r=!!c&&Object(u.lb)(c),o=!!c&&Object(u.qb)(c);return{isPrivateChat:a,isChatWithSelf:n,isChannel:s,isGroup:r,isSuperGroup:o,canPinForAll:a&&!n||o||r,contactName:c&&Object(u.ob)(c.id)?Object(u.ab)(Object(m.Jb)(e,Object(u.W)(c))):void 0}},(e,t)=>Object(b.l)(t,["pinMessage"]))(({isOpen:e,messageId:t,chatId:a,isChannel:c,isGroup:s,isSuperGroup:r,canPinForAll:o,contactName:l,onClose:i,pinMessage:d})=>{const m=Object(n.m)(()=>{d({chatId:a,messageId:t,isUnpin:!1}),i()},[d,a,t,i]),u=Object(n.m)(()=>{d({chatId:a,messageId:t,isUnpin:!1,isOneSide:!0,isSilent:!0}),i()},[a,t,i,d]),b=Object(F.a)();return n.a.createElement(pe.a,{isOpen:e,onClose:i,className:"pin",title:b("PinMessageAlertTitle")},n.a.createElement("p",null,b(c?"PinMessageAlertChannel":s||r?"PinMessageAlert":"PinMessageAlertChat")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:u},b("DialogPin")),o&&n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:m},l?Object(x.a)(b("Conversation.PinMessagesFor",l)):b("Conversation.PinMessageAlert.PinAndNotifyMembers")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:i},b("Cancel")))}));var xe=Object(n.h)(({isOpen:e,pinnedMessagesCount:t=0,onClose:a,onUnpin:c})=>{const s=Object(F.a)();return n.a.createElement(pe.a,{isOpen:e,onClose:a,className:"unpin-all",title:s("Chat.PanelUnpinAllMessages")},n.a.createElement("p",null,s("Chat.UnpinAllMessagesConfirmation",t,"i")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:c},s("DialogUnpin")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:a},s("Cancel")))}),Ue=a(25),Ge=a(56);var qe=Object(n.h)(Object(c.h)((e,{isSchedule:t})=>{const{messageIds:a}=e.selectedMessages||{},{canDeleteForAll:n}=Object(m.e)(e),c=Object(m.s)(e);return{selectedMessageIds:a,canDeleteForAll:!t&&n,contactName:c&&Object(u.ob)(c.id)?Object(u.ab)(Object(m.Jb)(e,Object(u.W)(c))):void 0,willDeleteForCurrentUserOnly:c&&Object(u.lb)(c)&&!n,willDeleteForAll:c&&Object(u.qb)(c)}},(e,t)=>Object(b.l)(t,["deleteMessages","deleteScheduledMessages","exitMessageSelectMode"]))(({isOpen:e,isSchedule:t,selectedMessageIds:a,canDeleteForAll:c,contactName:s,willDeleteForCurrentUserOnly:r,willDeleteForAll:o,onClose:l,deleteMessages:i,deleteScheduledMessages:d,exitMessageSelectMode:m})=>{const u=Object(j.a)(e),b=Object(n.m)(()=>{l(),i({messageIds:a,shouldDeleteForAll:!0})},[i,a,l]),h=Object(n.m)(()=>{t?d({messageIds:a}):i({messageIds:a,shouldDeleteForAll:!1}),l()},[t,l,d,a,i]),g=Object(F.a)();if(Object(n.n)(()=>{!e&&u&&m()},[m,e,u]),a)return n.a.createElement(pe.a,{isOpen:e,onClose:l,onEnter:c?void 0:h,className:"delete",title:g("Conversation.DeleteManyMessages")},n.a.createElement("p",null,g("AreYouSureDeleteFewMessages")),r&&n.a.createElement("p",null,"This will delete them just for you, not for other participants in the chat."),o&&n.a.createElement("p",null,"This will delete them for everyone in this chat."),c&&n.a.createElement(D.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:b},s?Object(x.a)(g("ChatList.DeleteForEveryone",s)):g("Conversation.DeleteMessagesForEveryone")),n.a.createElement(D.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:h},g(c?"ChatList.DeleteForCurrentUser":"Delete")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:l},g("Cancel")))})),ze=a(125);var _e=Object(n.h)(Object(c.h)(void 0,(e,t)=>Object(b.l)(t,["reportMessages","exitMessageSelectMode"]))(({isOpen:e,messageIds:t,reportMessages:a,exitMessageSelectMode:c,onClose:s})=>{const[r,o]=Object(n.r)("spam"),[l,i]=Object(n.r)(""),d=()=>{a({messageIds:t,reason:r,description:l}),c(),s()},m=Object(n.m)(e=>{o(e)},[]),u=Object(n.m)(e=>{i(e.target.value)},[]),b=Object(F.a)(),h=[{value:"spam",label:b("lng_report_reason_spam")},{value:"violence",label:b("lng_report_reason_violence")},{value:"pornography",label:b("lng_report_reason_pornography")},{value:"childAbuse",label:b("lng_report_reason_child_abuse")},{value:"copyright",label:b("ReportPeer.ReasonCopyright")},{value:"other",label:b("lng_report_reason_other")}];if(t)return n.a.createElement(pe.a,{isOpen:e,onClose:s,onEnter:e?d:void 0,className:"report",title:b("lng_report_message_title")},n.a.createElement(ze.a,{name:"report-message",options:h,onChange:m,selected:r}),n.a.createElement(ve.a,{label:b("lng_report_reason_description"),value:l,onChange:u}),n.a.createElement(D.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:d},b("lng_report_button")),n.a.createElement(D.a,{className:"confirm-dialog-button",isText:!0,onClick:s},b("Cancel")))}));a(271);var He=Object(n.h)(Object(c.h)(e=>{const{type:t}=Object(m.z)(e)||{},{canDelete:a}=Object(m.e)(e),n=Object(m.f)(e),{messageIds:c}=e.selectedMessages||{};return{isSchedule:"scheduled"===t,selectedMessagesCount:Object(m.ub)(e),canDeleteMessages:a,canReportMessages:n,selectedMessageIds:c}},(e,t)=>Object(b.l)(t,["exitMessageSelectMode","openForwardMenuForSelectedMessages"]))(({canPost:e,isActive:t,messageListType:a,isSchedule:c,selectedMessagesCount:s,canDeleteMessages:r,canReportMessages:o,selectedMessageIds:l,exitMessageSelectMode:i,openForwardMenuForSelectedMessages:d})=>{const[m,u,b]=Object(Ue.a)(),[h,g,p]=Object(Ue.a)();Object(n.n)(()=>!t||m||h?void 0:Object(Ge.a)({onBackspace:u,onDelete:u,onEsc:i}),[t,m,h,u,i]);const v=Object(j.a)(s||void 0,!0),O=t?s:v,E=Object(F.a)(),f=E("VoiceOver.Chat.MessagesSelected",O),C=Object(W.a)("MessageSelectToolbar",e&&"with-composer",t&&"shown");return n.a.createElement("div",{className:C},n.a.createElement("div",{className:"MessageSelectToolbar-inner"},n.a.createElement(D.a,{color:"translucent",round:!0,onClick:i,ariaLabel:"Exit select mode"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("span",{className:"MessageSelectToolbar-count",title:f},f),!!s&&n.a.createElement("div",{className:"MessageSelectToolbar-actions"},"scheduled"!==a&&n.a.createElement(_.a,{icon:"forward",ariaLabel:"Forward Messages",onClick:d},n.a.createElement("span",{className:"item-text"},E("Forward"))),o&&n.a.createElement(_.a,{icon:"flag",onClick:g,disabled:!o,ariaLabel:E("Conversation.ReportMessages")},n.a.createElement("span",{className:"item-text"},E("Report"))),n.a.createElement(_.a,{destructive:!0,icon:"delete",onClick:u,disabled:!r,ariaLabel:E("EditAdminGroupDeleteMessages")},n.a.createElement("span",{className:"item-text"},E("Delete"))))),n.a.createElement(qe,{isOpen:m,isSchedule:c,onClose:b}),n.a.createElement(_e,{isOpen:h,onClose:p,messageIds:l}))})),$e=a(173),Ve=a(51),We=a(176),Ke=e=>{const t=Object(n.q)(null),a=Object(n.m)(a=>{if("Enter"!==a.key)return;t.current===document.activeElement&&e()},[e]);return Object(n.n)(()=>(window.addEventListener("keydown",a,!1),()=>window.removeEventListener("keydown",a)),[a]),t},Ye=a(159);var Qe=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),n=a&&Object(u.W)(a);return{chat:a,privateChatUser:n?Object(m.Jb)(e,n):void 0,isPinned:Object(m.N)(e,t),isMuted:a?Object(u.Hb)(a,Object(m.fb)(e),Object(m.eb)(e)):void 0}})(({chatId:e,chat:t,privateChatUser:a,isPinned:c,isMuted:s,withUsername:r,onClick:o})=>{const[l,i,d]=Object(Ue.a)(),m=Object(We.a)({chat:t,privateChatUser:a,isPinned:c,isMuted:s,handleDelete:i}),b=()=>{o(e)},h=Ke(b);if(t)return n.a.createElement(Ee.a,{className:"chat-item-clickable search-result",onClick:b,contextActions:m,buttonRef:h},Object(u.ob)(e)?n.a.createElement(fe.a,{userId:e,withUsername:r,avatarSize:"large"}):n.a.createElement(je.a,{chatId:e,withUsername:r,avatarSize:"large"}),n.a.createElement(Ye.a,{isOpen:l,onClose:d,chat:t}))})),Ze=a(146);a(272);const Je=Object(V.h)(e=>e(),6e4,!0);var Xe=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.topPeers,a=e.users.byId,{recentlyFoundChatIds:n}=e.globalSearch;return{topUserIds:t,usersById:a,recentlyFoundChatIds:n}},(e,t)=>Object(b.l)(t,["loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats"]))(({topUserIds:e,usersById:t,recentlyFoundChatIds:a,onReset:c,loadTopUsers:s,loadContactList:r,openChat:o,addRecentlyFoundChatId:l,clearRecentlyFoundChats:i})=>{const d=Object(n.q)(null);Object(n.n)(()=>{Je(()=>{s(),r()})},[s,r]),Object(Ze.a)(d.current,!e);const m=Object(n.m)(e=>{o({id:e,shouldReplaceHistory:!0}),c(),setTimeout(()=>{l({id:e})},250)},[o,l,c]),b=Object(F.a)();return n.a.createElement("div",{className:"RecentContacts custom-scroll"},e&&n.a.createElement("div",{className:"top-peers-section",dir:b.isRtl?"rtl":void 0},n.a.createElement("div",{ref:d,className:"top-peers no-selection"},e.map(e=>n.a.createElement("div",{className:"top-peer-item",onClick:()=>m(e),dir:b.isRtl?"rtl":void 0},n.a.createElement(U.a,{user:t[e]}),n.a.createElement("div",{className:"top-peer-name"},Object(x.a)(Object(u.ab)(t[e])||" ")))))),a&&n.a.createElement("div",{className:"search-section pt-1"},n.a.createElement("h3",{className:"section-heading mt-0 recent-chats-header",dir:b.isRtl?"rtl":void 0},b("Recent"),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",ariaLabel:"Clear recent chats",onClick:i,isRtl:b.isRtl},n.a.createElement("i",{className:"icon-close"}))),a.map(e=>n.a.createElement(Qe,{chatId:e,onClick:m}))))})),et=a(137),tt=a(32);a(273);var at=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t);if(!a)return{};const n=Object(u.W)(a);return{chat:a,lastSyncTime:e.lastSyncTime,...n&&{privateChatUser:Object(m.Jb)(e,n)}}},(e,t)=>Object(b.l)(t,["focusMessage"]))(({message:e,searchQuery:t,chatId:a,chat:c,privateChatUser:s,focusMessage:r,lastSyncTime:o})=>{const i=Object(u.F)(e),d=Object(O.a)(Object(u.E)(e,"micro")),m=Boolean(Object(u.J)(e)),b=Object(n.m)(()=>{r({chatId:a,messageId:e.id})},[a,r,e.id]),h=Object(F.a)(),g=Ke(b);if(c)return n.a.createElement(Ee.a,{className:"ChatMessage chat-item-clickable",ripple:!l.l,onClick:b,buttonRef:g},n.a.createElement(U.a,{chat:c,user:s,withOnlineStatus:!0,isSavedMessages:s&&s.isSelf,lastSyncTime:o}),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"info-row"},n.a.createElement("div",{className:"title"},n.a.createElement("h3",{dir:"auto"},Object(x.a)(Object(u.k)(h,c,s))),c.isVerified&&n.a.createElement(et.a,null)),n.a.createElement("div",{className:"message-date"},n.a.createElement(tt.a,{className:"date"},Object(B.g)(h,1e3*e.date)))),n.a.createElement("div",{className:"subtitle"},n.a.createElement("div",{className:"message",dir:"auto"},function(e,t,a,c,s){if(!a)return Object(x.a)(Object(u.O)(e,t));return n.a.createElement("span",{className:"media-preview"},n.a.createElement("img",{src:a,alt:"",className:s?"round":void 0}),Object(u.Q)(t)&&n.a.createElement("i",{className:"icon-play"}),Object(x.a)(Object(u.O)(e,t,!0),["emoji","highlight"],{highlight:c}))}(h,e,d||i,t,m)))))}));a(274);var nt=Object(n.h)(({searchDate:e,onSelect:t})=>{const a=Object(n.p)(()=>function(e){if(e.match(/^\d{2,4}-\d{2}-\d{2}$/g)){const t=new Date(e);return[{date:t,text:Object(B.a)(t)}]}const t=[],a=new Date,n=a.getFullYear(),c=a.getTime()>new Date(`${n}-${e}`).getTime()?n:n-1;for(let a=0;a<8;a++){const n=new Date(`${c-a}-${e}`);t.push({date:n,text:Object(B.a)(n)})}return t}(e),[e]);return n.a.createElement("section",{className:"DateSuggest custom-scroll custom-scroll-x"},a.map(({date:e,text:a})=>n.a.createElement("div",{onClick:()=>t(e),className:"date-item",key:a},n.a.createElement("i",{className:"icon-calendar"}),n.a.createElement("span",null,a))))}),ct=a(121),st=a(144);const rt=Object(V.h)(e=>e(),500,!0);var ot=Object(n.h)(Object(c.h)(e=>{const{byId:t}=e.chats,{byId:a}=e.users,{userIds:n}=e.contactList||{};if(!n)return{chatsById:t,usersById:a};const{currentUserId:c,messages:s,lastSyncTime:r}=e,{fetchingStatus:o,globalResults:l,localResults:i,resultsByType:d}=e.globalSearch,{chatIds:m,userIds:u}=l||{},{chatIds:b,userIds:h}=i||{},{byChatId:g}=s,{foundIds:p}=d&&d.text||{};return{currentUserId:c,localContactIds:n,localChatIds:b,localUserIds:h,globalChatIds:m,globalUserIds:u,foundIds:p,globalMessagesByChatId:g,chatsById:t,usersById:a,fetchingStatus:o,lastSyncTime:r}},(e,t)=>Object(b.l)(t,["openChat","addRecentlyFoundChatId","searchMessagesGlobal","setGlobalSearchChatId"]))(({searchQuery:e,searchDate:t,dateSearchQuery:a,currentUserId:c,localContactIds:s,localChatIds:o,localUserIds:i,globalChatIds:d,globalUserIds:m,foundIds:h,globalMessagesByChatId:g,chatsById:p,usersById:v,fetchingStatus:O,lastSyncTime:E,onReset:f,onSearchDateSelect:j,openChat:C,addRecentlyFoundChatId:y,searchMessagesGlobal:k,setGlobalSearchChatId:N})=>{const w=Object(F.a)(),[S,I]=Object(n.r)(!1),[P,M]=Object(n.r)(!1),A=Object(n.m)(({direction:t})=>{E&&t===r.e.Backwards&&rt(()=>{k({type:"text",query:e})})},[E,k,e]),L=Object(n.m)(e=>{C({id:e,shouldReplaceHistory:!0}),e!==c&&y({id:e}),l.l||f()},[c,C,y,f]),R=Object(n.m)(e=>{N({id:e})},[N]),T=Object(n.p)(()=>{if(!e||e.startsWith("@")&&e.length<2)return Ve.a;const t=s?s.filter(t=>{const a=v[t];if(!a)return!1;const n=Object(u.bb)(a);return n&&Object(ue.a)(n,e)||Object(ue.a)(a.username,e)}):[];return[...c&&Object(ue.a)(w("SavedMessages"),e)?[c]:[],...Object(u.Ib)(Object(b.o)([...t,...o||[],...i||[]]),p)]},[e,s,c,w,o,i,p,v]),D=Object(n.p)(()=>!e||e.length<4||!d||!m?Ve.a:Object(u.Ib)(Object(b.o)([...d,...m]),p,!0),[p,d,m,e]),B=Object(n.p)(()=>(e||t)&&h&&0!==h.length?h.map(e=>{const[t,a]=e.split("_").map(Number);return g&&g[t]&&g[t].byId[a]}).filter(Boolean).sort((e,t)=>t.date-e.date):Ve.a,[h,g,e,t]),x=Object(n.m)(()=>{I(!S)},[S]),U=Object(n.m)(()=>{M(!P)},[P]);const G=O&&!O.chats&&!O.messages&&!T.length&&!D.length&&!B.length;return e||t?n.a.createElement(Oe.a,{className:"LeftSearch custom-scroll",items:B,onLoadMore:A,noScrollRestoreOnTop:!0,noFastList:!0},a&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar"},n.a.createElement(nt,{searchDate:a,onSelect:j})),G&&n.a.createElement(ct.a,{text:w("ChatList.Search.NoResults"),description:w("ChatList.Search.NoResultsDescription")}),!!T.length&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar",dir:w.isRtl?"rtl":void 0},T.map(e=>n.a.createElement(st.a,{chatOrUserId:e,onClick:R,clickArg:e}))),!!T.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading",dir:w.isRtl?"auto":void 0},T.length>3&&n.a.createElement(tt.a,{onClick:x},w(S?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),w("DialogList.SearchSectionDialogs")),T.map((e,t)=>{if(S||!(t>=3))return n.a.createElement(Qe,{chatId:e,onClick:L})})),!!D.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading",dir:w.isRtl?"auto":void 0},D.length>3&&n.a.createElement(tt.a,{onClick:U},w(P?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),w("DialogList.SearchSectionGlobal")),D.map((e,t)=>{if(P||!(t>=3))return n.a.createElement(Qe,{chatId:e,withUsername:!0,onClick:L})})),!!B.length&&n.a.createElement("div",{className:"search-section"},n.a.createElement("h3",{className:"section-heading",dir:w.isRtl?"auto":void 0},w("SearchMessages")),B.map((function(t){const a=Object(u.O)(w,t),c=p[t.chatId];if(a&&c)return n.a.createElement(at,{chatId:t.chatId,message:t,searchQuery:e})})))):n.a.createElement(Xe,{onReset:f})}));const lt=Object(V.h)(e=>e(),500,!0);var it=Object(n.h)(Object(c.h)(e=>{const{byId:t}=e.chats,{currentUserId:a,messages:{byChatId:n},lastSyncTime:c}=e,{fetchingStatus:s,resultsByType:r}=e.globalSearch,{foundIds:o}=r&&r.text||{};return{currentUserId:a,foundIds:o,globalMessagesByChatId:n,chatsById:t,fetchingStatus:s,lastSyncTime:c}},(e,t)=>Object(b.l)(t,["searchMessagesGlobal"]))(({searchQuery:e,currentUserId:t,dateSearchQuery:a,foundIds:c,globalMessagesByChatId:s,chatsById:o,fetchingStatus:l,lastSyncTime:i,searchMessagesGlobal:d,onSearchDateSelect:m})=>{const b=Object(F.a)(),h=Object(n.m)(({direction:a})=>{i&&a===r.e.Backwards&<(()=>{d({type:"text",query:e,chatId:t})})},[t,i,d,e]),g=Object(n.p)(()=>c&&0!==c.length?c.map(e=>{const[t,a]=e.split("_").map(Number);return s&&s[t]&&s[t].byId[a]}).filter(Boolean).sort((e,t)=>t.date-e.date):Ve.a,[c,s]);const p=l&&!l.chats&&!l.messages&&!g.length;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(Oe.a,{className:"search-content custom-scroll chat-list",items:g,onLoadMore:h,noFastList:!0},a&&n.a.createElement("div",{className:"chat-selection no-selection no-scrollbar"},n.a.createElement(nt,{searchDate:a,onSelect:m})),p&&n.a.createElement(ct.a,{text:b("ChatList.Search.NoResults"),description:b("ChatList.Search.NoResultsDescription")}),!!g.length&&g.map((function(t){const a=Object(u.O)(b,t),c=o[t.chatId];if(a&&c)return n.a.createElement(at,{chatId:t.chatId,message:t,searchQuery:e})}))))}));function dt(e){return(t,a)=>{const{byId:n}=t.chats,{byId:c}=t.users,{fetchingStatus:s,resultsByType:r,chatId:o}=t.globalSearch,l="audio"!==e?e:a&&a.isVoice?"voice":"audio",{byChatId:i}=t.messages,{foundIds:d}=r&&r[l]||{};return{theme:Object(m.Db)(t),isLoading:void 0===d||!!s&&Boolean(s.chats||s.messages),chatsById:n,usersById:c,globalMessagesByChatId:i,foundIds:d,searchChatId:o,lastSyncTime:t.lastSyncTime}}}var mt=a(122),ut=a(169);const bt=Object(V.h)(e=>e(),500,!0);var ht=Object(n.h)(Object(c.h)(dt("media"),(e,t)=>Object(b.l)(t,["searchMessagesGlobal","openMediaViewer"]))(({searchQuery:e,searchChatId:t,isLoading:a,globalMessagesByChatId:c,foundIds:s,lastSyncTime:l,searchMessagesGlobal:i,openMediaViewer:d})=>{const m=Object(F.a)(),u=Object(n.m)(({direction:a})=>{l&&a===r.e.Backwards&&bt(()=>{i({type:"media",query:e,chatId:t})})},[l,i,e,t]),b=Object(n.p)(()=>s&&c?s.map(e=>{const[t,a]=e.split("_").map(Number);return c[t]&&c[t].byId[a]}).filter(Boolean):Ve.a,[c,s]),h=Object(n.m)((e,t)=>{d({chatId:t,messageId:e,origin:r.h.SearchResult})},[d]);const g=Object(mt.a)([e],o.Bb)&&!a,p=g&&s&&s.length>0&&!e,v=g&&s&&s.length>0&&e,O=Object(W.a)("search-content custom-scroll",v&&"chat-list");return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(Oe.a,{className:O,items:b,itemSelector:e?".ListItem":".Media",onLoadMore:u,noFastList:!0},!g&&n.a.createElement(ge.a,null),g&&(!s||0===s.length)&&n.a.createElement(ct.a,{text:m("ChatList.Search.NoResults"),description:m("ChatList.Search.NoResultsDescription")}),p&&n.a.createElement("div",{className:"media-list",dir:m.isRtl?"rtl":void 0},b.map(e=>n.a.createElement(ut.a,{key:e.id,idPrefix:"search-media",message:e,onClick:h}))),v&&b.map(e=>n.a.createElement(at,{key:e.id,chatId:e.chatId,message:e}))))}));function gt(e,t,a,n){const{senderId:c}=t;if(!c)return;const s=Object(u.ob)(c)?n[c]:a[c];let r=Object(u.X)(e,s);const o=a[t.chatId];return o&&(Object(u.ob)(c)&&s.isSelf?r=`${e("FromYou")} → ${Object(u.k)(e,o)}`:Object(u.nb)(o)&&(r+=" → "+Object(u.k)(e,o))),r}var pt=a(191);const vt=Object(V.h)(e=>e(),500,!0);var Ot=Object(n.h)(Object(c.h)(dt("links"),(e,t)=>Object(b.l)(t,["searchMessagesGlobal","focusMessage"]))(({searchQuery:e,searchChatId:t,isLoading:a,chatsById:c,usersById:s,globalMessagesByChatId:l,foundIds:i,lastSyncTime:d,searchMessagesGlobal:m,focusMessage:u})=>{const b=Object(F.a)(),h=Object(n.m)(({direction:a})=>{d&&a===r.e.Backwards&&vt(()=>{m({type:"links",query:e,chatId:t})})},[d,m,e,t]),g=Object(n.p)(()=>i&&l?i.map(e=>{const[t,a]=e.split("_").map(Number);return l[t]&&l[t].byId[a]}).filter(Boolean):Ve.a,[l,i]),p=Object(n.m)((e,t)=>{u({chatId:t,messageId:e})},[u]);const v=Object(mt.a)([e],o.Bb)&&!a;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(Oe.a,{className:"search-content documents-list custom-scroll",items:g,onLoadMore:h,noFastList:!0},!v&&n.a.createElement(ge.a,null),v&&(!i||0===i.length)&&n.a.createElement(ct.a,{text:b("ChatList.Search.NoResults"),description:b("ChatList.Search.NoResultsDescription")}),v&&i&&i.length>0&&g.map((e,t)=>{const a=0===t||Object(B.n)(e.date)!==Object(B.n)(g[t-1].date);return n.a.createElement("div",{className:"ListItem",dir:b.isRtl?"rtl":void 0,key:e.id},a&&n.a.createElement("p",{className:"section-heading",dir:b.isRtl?"rtl":void 0},Object(B.f)(b,new Date(1e3*e.date))),n.a.createElement(pt.a,{key:e.id,message:e,senderTitle:gt(b,e,c,s),onMessageClick:p}))})))})),Et=a(163);const ft=Object(V.h)(e=>e(),500,!0);var jt=Object(n.h)(Object(c.h)(dt("documents"),(e,t)=>Object(b.l)(t,["searchMessagesGlobal","focusMessage"]))(({searchQuery:e,searchChatId:t,isLoading:a,chatsById:c,usersById:s,globalMessagesByChatId:l,foundIds:i,lastSyncTime:d,searchMessagesGlobal:m,focusMessage:b})=>{const h=Object(F.a)(),g=Object(n.m)(({direction:a})=>{d&&a===r.e.Backwards&&ft(()=>{m({type:"documents",query:e,chatId:t})})},[d,m,e,t]),p=Object(n.p)(()=>i&&l?i.map(e=>{const[t,a]=e.split("_").map(Number),n=l[t]&&l[t].byId[a];return n&&Object(u.y)(n)?n:void 0}).filter(Boolean):Ve.a,[l,i]),v=Object(n.m)((e,t)=>{b({chatId:t,messageId:e})},[b]);const O=Object(mt.a)([e],o.Bb)&&!a;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(Oe.a,{className:"search-content documents-list custom-scroll",items:p,onLoadMore:g,noFastList:!0},!O&&n.a.createElement(ge.a,null),O&&(!i||0===i.length)&&n.a.createElement(ct.a,{text:h("ChatList.Search.NoResults"),description:h("ChatList.Search.NoResultsDescription")}),O&&i&&i.length>0&&p.map((e,t)=>{const a=0===t||Object(B.n)(e.date)!==Object(B.n)(p[t-1].date);return n.a.createElement("div",{className:"ListItem",key:e.id},a&&n.a.createElement("p",{className:"section-heading"},Object(B.f)(h,new Date(1e3*e.date))),n.a.createElement(Et.a,{message:e,withDate:!0,datetime:e.date,smaller:!0,sender:gt(h,e,c,s),className:"scroll-item",onDateClick:v}))})))})),Ct=a(172);const yt=Object(V.h)(e=>e(),500,!0);var kt=Object(n.h)(Object(c.h)(dt("audio"),(e,t)=>Object(b.l)(t,["searchMessagesGlobal","focusMessage","openAudioPlayer"]))(({theme:e,isVoice:t,searchQuery:a,searchChatId:c,isLoading:s,chatsById:l,usersById:i,globalMessagesByChatId:d,foundIds:m,lastSyncTime:u,searchMessagesGlobal:b,focusMessage:h,openAudioPlayer:g})=>{const p=Object(F.a)(),v=t?"voice":"audio",O=Object(n.m)(({direction:e})=>{u&&e===r.e.Backwards&&yt(()=>{b({type:v,query:a,chatId:c})})},[v,u,b,a,c]),E=Object(n.p)(()=>m&&d?m.map(e=>{const[t,a]=e.split("_").map(Number);return d[t]&&d[t].byId[a]}).filter(Boolean):Ve.a,[d,m]),f=Object(n.m)((e,t)=>{h({chatId:t,messageId:e})},[h]),j=Object(n.m)((e,t)=>{g({chatId:t,messageId:e})},[g]);const C=Object(mt.a)([a],o.Bb)&&!s;return n.a.createElement("div",{className:"LeftSearch"},n.a.createElement(Oe.a,{className:"search-content documents-list custom-scroll",items:E,onLoadMore:O,noFastList:!0},!C&&n.a.createElement(ge.a,null),C&&(!m||0===m.length)&&n.a.createElement(ct.a,{text:p("ChatList.Search.NoResults"),description:p("ChatList.Search.NoResultsDescription")}),C&&m&&m.length>0&&E.map((t,a)=>{const c=0===a||Object(B.n)(t.date)!==Object(B.n)(E[a-1].date);return n.a.createElement("div",{className:"ListItem",key:t.id},c&&n.a.createElement("p",{className:"section-heading",dir:p.isRtl?"rtl":void 0},Object(B.f)(p,new Date(1e3*t.date))),n.a.createElement(Ct.a,{key:t.id,theme:e,message:t,target:"searchResult",senderTitle:gt(p,t,l,i),date:t.date,lastSyncTime:u,className:"scroll-item",onPlay:j,onDateClick:f}))})))}));a(275);const Nt=[{type:r.c.ChatList,title:"SearchAllChatsShort"},{type:r.c.Media,title:"SharedMediaTab2"},{type:r.c.Links,title:"SharedLinksTab2"},{type:r.c.Files,title:"SharedFilesTab2"},{type:r.c.Music,title:"SharedMusicTab2"},{type:r.c.Voice,title:"SharedVoiceTab2"}],wt=[{type:r.c.ChatList,title:"All Messages"},...Nt.slice(1)],St=Object.keys(r.c).length/2;var It=Object(n.h)(Object(c.h)(e=>{const{currentContent:t,chatId:a}=e.globalSearch;return{currentContent:t,chatId:a}},(e,t)=>Object(b.l)(t,["setGlobalSearchContent","setGlobalSearchDate"]))(({searchQuery:e,searchDate:t,isActive:a,currentContent:c=r.c.ChatList,chatId:s,setGlobalSearchContent:o,setGlobalSearchDate:l,onReset:i})=>{const d=Object(F.a)(),[m,u]=Object(n.r)(c),b=Object(n.p)(()=>Object(B.l)(e),[e]),h=Object(n.m)(e=>{const t=Nt[e];o({content:t.type}),u(e)},[o]),g=Object(n.m)(e=>{l({date:e.getTime()/1e3})},[l]);Object(A.a)(a,i,void 0,void 0,!0);const p=Object(n.q)(null),v=Object(he.a)(p,a,void 0,".ListItem-button",!0);return n.a.createElement("div",{className:"LeftSearch",ref:p,onKeyDown:v},n.a.createElement($e.a,{activeTab:m,tabs:s?wt:Nt,onSwitchTab:h}),n.a.createElement(T.a,{name:d.isRtl?"slide-reversed":"slide",renderCount:St,activeKey:c},()=>{switch(c){case r.c.ChatList:return s?n.a.createElement(it,{searchQuery:e,dateSearchQuery:b,onReset:i,onSearchDateSelect:g}):n.a.createElement(ot,{searchQuery:e,searchDate:t,dateSearchQuery:b,onReset:i,onSearchDateSelect:g});case r.c.Media:return n.a.createElement(ht,{searchQuery:e});case r.c.Links:return n.a.createElement(Ot,{searchQuery:e});case r.c.Files:return n.a.createElement(jt,{searchQuery:e});case r.c.Music:return n.a.createElement(kt,{key:"audio",searchQuery:e});case r.c.Voice:return n.a.createElement(kt,{key:"voice",isVoice:!0,searchQuery:e});default:return}}))}));function Pt(e,t){const a=Object(n.q)(e),[c,s]=Object(n.r)(t);return[c,Object(n.m)(e=>{s(t=>a.current(t,e))},[])]}const Mt=[{icon:"user",title:"FilterContacts",key:"contacts"},{icon:"non-contacts",title:"FilterNonContacts",key:"nonContacts"},{icon:"group",title:"FilterGroups",key:"groups"},{icon:"channel",title:"FilterChannels",key:"channels"},{icon:"bots",title:"FilterBots",key:"bots"}],Ft=[{icon:"mute",title:"FilterMuted",key:"excludeMuted"},{icon:"archive",title:"FilterArchived",key:"excludeArchived"},{icon:"readchats",title:"FilterRead",key:"excludeRead"}],At=["includedChatIds","bots","channels","groups","contacts","nonContacts"],Lt=["excludedChatIds","excludeArchived","excludeMuted","excludeRead"];function Rt(e,t,a){let n=[],c=[];if("included"===t){const{includedChatIds:t,...s}=a?e.includeFilters||{}:Object(b.l)(e.folder,At);n=t||[],c=Object.keys(s).filter(e=>Boolean(s[e]))}else{const{excludedChatIds:t,...s}=a?e.excludeFilters||{}:Object(b.l)(e.folder,Lt);n=t||[],c=Object.keys(s).filter(e=>Boolean(s[e]))}return{selectedChatIds:n,selectedChatTypes:c}}function Tt(e){if(e){const{includedChatIds:t,...a}=e;if(Object.values(a).filter(Boolean).length>1||t&&t.length)return"";if(a.bots)return"Bots";if(a.groups)return"Groups";if(a.channels)return"Channels";if(a.contacts)return"Contacts";if(a.nonContacts)return"Non-Contacts"}return""}const Dt={mode:"create",chatFilter:"",folder:{title:"",includedChatIds:[],excludedChatIds:[]}},Bt=(e,t)=>{switch(t.type){case"setTitle":return{...e,folder:{...e.folder,title:t.payload},isTouched:!0};case"editIncludeFilters":return{...e,includeFilters:Object(b.l)(e.folder,At)};case"editExcludeFilters":return{...e,excludeFilters:Object(b.l)(e.folder,Lt)};case"setIncludeFilters":return{...e,includeFilters:t.payload,chatFilter:""};case"setExcludeFilters":return{...e,excludeFilters:t.payload,chatFilter:""};case"saveFilters":return e.includeFilters?{...e,folder:{...Object(b.j)(e.folder,At),title:e.folder.title?e.folder.title:Tt(e.includeFilters),...e.includeFilters},includeFilters:void 0,chatFilter:"",isTouched:!0}:e.excludeFilters?{...e,folder:{...Object(b.j)(e.folder,Lt),...e.excludeFilters},excludeFilters:void 0,chatFilter:"",isTouched:!0}:e;case"editFolder":{const{id:e,description:a,...n}=t.payload;return{mode:"edit",folderId:e,folder:n,chatFilter:""}}case"setChatFilter":return{...e,chatFilter:t.payload};case"setIsLoading":return{...e,isLoading:t.payload};case"setError":return{...e,error:t.payload};case"reset":return Dt;default:return e}};const xt={currentPassword:"",password:"",hint:"",email:""},Ut=(e,t)=>{switch(t.type){case"setCurrentPassword":return{...e,currentPassword:t.payload};case"setPassword":return{...e,password:t.payload};case"setHint":return{...e,hint:t.payload};case"setEmail":return{...e,email:t.payload};case"reset":return xt;default:return e}};var Gt=Object(n.h)(Object(c.h)(void 0,(e,t)=>Object(b.l)(t,["signOut","deleteChatFolder"]))(({currentScreen:e,editedFolderId:t,onReset:a,onSaveFilter:c,signOut:s,deleteChatFolder:o})=>{const[i,d]=Object(n.r)(!1),[m,u]=Object(n.r)(!1),b=Object(n.m)(()=>{d(!0)},[]),h=Object(n.m)(()=>{d(!1)},[]),g=Object(n.m)(()=>{u(!0)},[]),p=Object(n.m)(()=>{u(!1)},[]),v=Object(n.m)(()=>{h(),s()},[h,s]),O=Object(n.m)(()=>{p(),o({id:t}),a()},[t,p,o,a]),E=Object(n.p)(()=>({onTrigger:e,isOpen:t})=>n.a.createElement(D.a,{round:!0,ripple:!l.l,size:"smaller",color:"translucent",className:t?"active":"",onClick:e,ariaLabel:"More actions"},n.a.createElement("i",{className:"icon-more"})),[]),f=Object(F.a)();return n.a.createElement("div",{className:"left-header"},n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:a,ariaLabel:f("AccDescrGoBack")},n.a.createElement("i",{className:"icon-arrow-left"})),function(){switch(e){case r.n.EditProfile:return n.a.createElement("h3",null,f("lng_settings_information"));case r.n.General:return n.a.createElement("h3",null,f("General"));case r.n.Notifications:return n.a.createElement("h3",null,f("Notifications"));case r.n.Privacy:return n.a.createElement("h3",null,f("PrivacySettings"));case r.n.Language:return n.a.createElement("h3",null,f("Language"));case r.n.GeneralChatBackground:return n.a.createElement("h3",null,f("ChatBackground"));case r.n.GeneralChatBackgroundColor:return n.a.createElement("h3",null,f("SetColor"));case r.n.PrivacyPhoneNumber:return n.a.createElement("h3",null,f("PrivacyPhone"));case r.n.PrivacyLastSeen:return n.a.createElement("h3",null,f("PrivacyLastSeen"));case r.n.PrivacyProfilePhoto:return n.a.createElement("h3",null,f("Privacy.ProfilePhoto"));case r.n.PrivacyForwarding:return n.a.createElement("h3",null,f("PrivacyForwards"));case r.n.PrivacyGroupChats:return n.a.createElement("h3",null,f("AutodownloadGroupChats"));case r.n.PrivacyPhoneNumberAllowedContacts:case r.n.PrivacyLastSeenAllowedContacts:case r.n.PrivacyProfilePhotoAllowedContacts:case r.n.PrivacyForwardingAllowedContacts:case r.n.PrivacyGroupChatsAllowedContacts:return n.a.createElement("h3",null,f("AlwaysShareWith"));case r.n.PrivacyPhoneNumberDeniedContacts:case r.n.PrivacyLastSeenDeniedContacts:case r.n.PrivacyProfilePhotoDeniedContacts:case r.n.PrivacyForwardingDeniedContacts:case r.n.PrivacyGroupChatsDeniedContacts:return n.a.createElement("h3",null,f("NeverShareWith"));case r.n.PrivacyActiveSessions:return n.a.createElement("h3",null,f("SessionsTitle"));case r.n.PrivacyBlockedUsers:return n.a.createElement("h3",null,f("BlockedUsers"));case r.n.TwoFaDisabled:case r.n.TwoFaEnabled:return n.a.createElement("h3",null,f("TwoStepVerification"));case r.n.TwoFaNewPassword:case r.n.TwoFaChangePasswordNew:case r.n.TwoFaChangePasswordConfirm:return n.a.createElement("h3",null,f("PleaseEnterCurrentPassword"));case r.n.TwoFaNewPasswordConfirm:return n.a.createElement("h3",null,f("PleaseReEnterPassword"));case r.n.TwoFaNewPasswordHint:case r.n.TwoFaChangePasswordHint:return n.a.createElement("h3",null,f("PasswordHint"));case r.n.TwoFaNewPasswordEmail:case r.n.TwoFaRecoveryEmail:return n.a.createElement("h3",null,f("RecoveryEmailTitle"));case r.n.TwoFaNewPasswordEmailCode:case r.n.TwoFaRecoveryEmailCode:return n.a.createElement("h3",null,"Recovery Email Code");case r.n.TwoFaCongratulations:return n.a.createElement("h3",null,f("TwoStepVerificationPasswordSet"));case r.n.TwoFaChangePasswordCurrent:case r.n.TwoFaTurnOff:case r.n.TwoFaRecoveryEmailCurrentPassword:return n.a.createElement("h3",null,f("PleaseEnterCurrentPassword"));case r.n.Folders:return n.a.createElement("h3",null,f("Filters"));case r.n.FoldersCreateFolder:return n.a.createElement("h3",null,f("FilterNew"));case r.n.FoldersEditFolder:return n.a.createElement("div",{className:"settings-main-header"},n.a.createElement("h3",null,f("FilterEdit")),t&&n.a.createElement(z.a,{className:"settings-more-menu",trigger:E,positionX:"right"},n.a.createElement(_.a,{icon:"delete",destructive:!0,onClick:g},f("Delete"))));case r.n.FoldersIncludedChats:case r.n.FoldersExcludedChats:return n.a.createElement("div",{className:"settings-main-header"},e===r.n.FoldersIncludedChats?n.a.createElement("h3",null,f("FilterInclude")):n.a.createElement("h3",null,f("FilterExclude")),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",className:"color-primary",onClick:c,ariaLabel:f("AutoDeleteConfirm")},n.a.createElement("i",{className:"icon-check"})));default:return n.a.createElement("div",{className:"settings-main-header"},n.a.createElement("h3",null,f("SETTINGS")),n.a.createElement(z.a,{className:"settings-more-menu",trigger:E,positionX:"right"},n.a.createElement(_.a,{icon:"logout",onClick:b},f("LogOutTitle"))))}}(),n.a.createElement(Pe.a,{isOpen:i,onClose:h,text:f("lng_sure_logout"),confirmLabel:f("AccountSettings.Logout"),confirmHandler:v,confirmIsDestructive:!0}),n.a.createElement(Pe.a,{isOpen:m,onClose:p,text:f("FilterDeleteAlert"),confirmLabel:f("Delete"),confirmHandler:O,confirmIsDestructive:!0}))})),qt=a(23);var zt=Object(n.h)(Object(c.h)(e=>{const{currentUserId:t}=e;return{currentUser:t?Object(m.Jb)(e,t):void 0}})(({isActive:e,onScreenSelect:t,onReset:a,currentUser:c})=>{const s=Object(F.a)(),o=Object(u.bb)(c);return Object(A.a)(e,a,t,r.n.Main),n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-main-menu"},c&&n.a.createElement("div",{className:"settings-current-user"},n.a.createElement(U.a,{user:c,size:"jumbo"}),n.a.createElement("p",{className:"name"},o&&Object(x.a)(o)),n.a.createElement("p",{className:"phone"},Object(qt.c)(c.phoneNumber))),n.a.createElement(Ee.a,{icon:"edit",onClick:()=>t(r.n.EditProfile)},s("lng_settings_information")),n.a.createElement(Ee.a,{icon:"folder",onClick:()=>t(r.n.Folders)},s("Filters")),n.a.createElement(Ee.a,{icon:"settings",onClick:()=>t(r.n.General)},s("Telegram.GeneralSettingsViewController")),n.a.createElement(Ee.a,{icon:"unmute",onClick:()=>t(r.n.Notifications)},s("Notifications")),n.a.createElement(Ee.a,{icon:"lock",onClick:()=>t(r.n.Privacy)},s("PrivacySettings")),n.a.createElement(Ee.a,{icon:"language",onClick:()=>t(r.n.Language)},s("Language"))))})),_t=a(135),Ht=a(116);const $t=/https:\/\/t\.me\/?/i,Vt=/^([a-zA-Z0-9_]+)$/,Wt=Object(V.a)(e=>e(),250,!1);var Kt=Object(n.h)(({currentUsername:e,asLink:t,isLoading:a,isUsernameAvailable:c,checkUsername:s,onChange:r})=>{const[o,l]=Object(n.r)(e||""),i=Object(F.a)(),d=t?"SetUrl":"Username",m=i(t?"SetUrlPlaceholder":"Username"),[u,b]=Object(n.p)(()=>o.length?o.length<5?[void 0,m+" is too short"]:o.length>32?[void 0,m+" is too long"]:Vt.test(o)?void 0===c?[]:[c?i(d+"Available","Username"):void 0,!1===c?i(d+"InUse"):void 0]:[void 0,m+" contains invalid characters"]:[],[o,c,i,d,m]);Object(n.n)(()=>{l(e||"")},[t,e]);const h=Object(n.m)(e=>{const a=e.target.value.trim().replace($t,"");l(a),e.target.value=`${t?"https://t.me/":""}${a}`;const n=function(e){return e.length>=5&&e.length<=32&&Vt.test(e)}(a);n&&Wt(()=>{s({username:a})}),r&&r(!!n&&a)},[t,s,r]);return n.a.createElement(ve.a,{value:`${t?"https://t.me/":""}${o}`,onChange:h,label:m,error:b,success:u,readOnly:a})});const Yt=Object(V.h)(e=>e(),6e4,!0);var Qt=Object(n.h)(Object(c.h)(e=>{const{currentUserId:t}=e,{progress:a,isUsernameAvailable:n}=e.profileEdit||{},c=t?Object(m.Jb)(e,t):void 0;if(!c)return{progress:a,isUsernameAvailable:n};const{firstName:s,lastName:r,username:o,fullInfo:l}=c,{bio:i}=l||{};return{currentAvatarHash:Object(u.e)(c),currentFirstName:s,currentLastName:r,currentBio:i,currentUsername:o,progress:a,isUsernameAvailable:n}},(e,t)=>Object(b.l)(t,["loadCurrentUser","updateProfile","checkUsername"]))(({isActive:e,onScreenSelect:t,onReset:a,currentAvatarHash:c,currentFirstName:o,currentLastName:l,currentBio:i,currentUsername:d,progress:m,isUsernameAvailable:u,loadCurrentUser:b,updateProfile:h,checkUsername:g})=>{const p=Object(F.a)(),[v,E]=Object(n.r)(!1),[f,j]=Object(n.r)(!1),[C,y]=Object(n.r)(),[k,N]=Object(n.r)(),[w,S]=Object(n.r)(o||""),[I,P]=Object(n.r)(l||""),[M,R]=Object(n.r)(i||""),[T,D]=Object(n.r)(d||""),B=Object(O.a)(c,!1,s.ApiMediaFormat.BlobUrl),U=m===r.k.InProgress,G=!1===T,q=Object(n.p)(()=>!G&&(Boolean(k)||f||!0===u),[k,f,G,u]);Object(A.a)(e,a,t,r.n.EditProfile),Object(n.n)(()=>{Yt(()=>{b()})},[b]),Object(n.n)(()=>{N(void 0)},[B]),Object(n.n)(()=>{S(o||""),P(l||""),R(i||"")},[o,l,i]),Object(n.n)(()=>{D(d||"")},[d]),Object(n.n)(()=>{m===r.k.Complete&&(j(!1),E(!1),y(void 0))},[m]);const z=Object(n.m)(e=>{N(e)},[]),_=Object(n.m)(e=>{S(e.target.value),j(!0)},[]),H=Object(n.m)(e=>{P(e.target.value),j(!0)},[]),$=Object(n.m)(e=>{R(e.target.value),j(!0)},[]),V=Object(n.m)(e=>{D(e),E(!0)},[]),W=Object(n.m)(()=>{const e=w.trim(),t=I.trim(),a=M.trim();e.length?a.length>70?y("Bio can' be longer than 70 characters"):h({photo:k,...f&&{firstName:e,lastName:t,bio:a},...v&&{username:T}}):y("Please provide your first name")},[k,w,I,M,f,T,v,h]);return n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-edit-profile"},n.a.createElement(_t.a,{currentAvatarBlobUrl:B,onChange:z,title:"Edit your profile photo",disabled:U}),n.a.createElement(ve.a,{value:w,onChange:_,label:p("FirstName"),disabled:U,error:"Please provide your first name"===C?C:void 0}),n.a.createElement(ve.a,{value:I,onChange:H,label:p("LastName"),disabled:U}),n.a.createElement(ve.a,{value:M,onChange:$,label:p("UserBio"),disabled:U,error:"Bio can' be longer than 70 characters"===C?C:void 0}),n.a.createElement("p",{className:"settings-item-description",dir:p.isRtl?"rtl":void 0},Object(x.a)(p("lng_settings_about_bio"),["br","simple_markdown"]))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:p.isRtl?"rtl":void 0},p("Username")),n.a.createElement(Kt,{currentUsername:T||"",isLoading:U,isUsernameAvailable:u,checkUsername:g,onChange:V}),n.a.createElement("p",{className:"settings-item-description",dir:p.isRtl?"rtl":void 0},Object(x.a)(p("UsernameHelp"),["br","simple_markdown"])),T&&n.a.createElement("p",{className:"settings-item-description",dir:p.isRtl?"rtl":void 0},p("lng_username_link"),n.a.createElement("br",null),n.a.createElement("span",{className:"username-link"},"https://t.me/",T)))),n.a.createElement(Ht.a,{isShown:q,onClick:W,disabled:U,ariaLabel:"Save changes"},U?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))})),Zt=a(130),Jt=a(119);const Xt=Object(V.h)(e=>e(),6e4,!0);var ea=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t},users:{byId:a}}=e,{orderedIds:n,byId:c,recommended:s}=e.chatFolders;return{chatsById:t,usersById:a,orderedFolderIds:n,foldersById:c,recommendedChatFolders:s,notifySettings:Object(m.fb)(e),notifyExceptions:Object(m.eb)(e)}},(e,t)=>Object(b.l)(t,["loadRecommendedChatFolders","addChatFolder","showDialog"]))(({onCreateFolder:e,onEditFolder:t,isActive:a,onScreenSelect:c,onReset:s,chatsById:l,usersById:i,orderedFolderIds:d,foldersById:m,recommendedChatFolders:b,notifySettings:h,notifyExceptions:g,loadRecommendedChatFolders:p,addChatFolder:v,showDialog:O})=>{const[E,f]=Object(n.r)(),[j,C]=Object(n.r)(!1),y=Object(n.m)(()=>C(!0),[]);Object(n.n)(()=>{E||Object(Zt.a)("FoldersAll").then(f)},[E]),Object(n.n)(()=>{Xt(()=>{p()})},[p]);const k=Object(n.m)(()=>{Object.keys(m).length>=10?O({data:{message:"DIALOG_FILTERS_TOO_MUCH",hasErrorKey:!0}}):e()},[m,O,e]),N=Object(F.a)();Object(A.a)(a,s,c,r.n.Folders);const w=Object(n.p)(()=>{if(!d)return;const e=Object.keys(l).map(Number);return d.map(t=>{const a=m[t];return{id:a.id,title:a.title,subtitle:Object(u.n)(N,l,i,a,e,h,g)}})},[d,l,m,i,h,g,N]),S=Object(n.m)(e=>{Object.keys(m).length>=10?O({data:{message:"DIALOG_FILTERS_TOO_MUCH",hasErrorKey:!0}}):v({folder:e})},[m,v,O]);return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement("div",{className:"settings-content-icon"},E&&n.a.createElement(Jt.a,{id:"settingsFoldersMain",size:o.Fb,animationData:E,play:j,noLoop:!0,onLoad:y})),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},N("CreateNewFilterInfo")),n.a.createElement(D.a,{className:"with-icon mb-2",color:"primary",size:"smaller",pill:!0,fluid:!0,onClick:k,isRtl:N.isRtl},n.a.createElement("i",{className:"icon-add"}),N("CreateNewFilter"))),n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3",dir:N.isRtl?"rtl":void 0},N("Filters")),w&&w.length?w.map(e=>n.a.createElement(Ee.a,{className:"mb-2",narrow:!0,multiline:!0,onClick:()=>t(m[e.id])},n.a.createElement("span",{className:"title"},e.title),n.a.createElement("span",{className:"subtitle"},e.subtitle))):w&&!w.length?n.a.createElement("p",{className:"settings-item-description my-4",dir:"auto"},"You have no folders yet."):n.a.createElement(ge.a,null)),b&&!!b.length&&n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3",dir:N.isRtl?"rtl":void 0},N("FilterRecommended")),b.map(e=>n.a.createElement(Ee.a,{className:"mb-2",narrow:!0,onClick:()=>S(e)},n.a.createElement("div",{className:"settings-folders-recommended-item"},n.a.createElement("div",{className:"multiline-item"},n.a.createElement("span",{className:"title"},e.title),n.a.createElement("span",{className:"subtitle"},e.description)),n.a.createElement(D.a,{className:"px-3",color:"primary",size:"tiny",pill:!0,fluid:!0,isRtl:N.isRtl},N("Add")))))))}));a(276);var ta=({count:e,itemName:t,itemPluralName:a,isLoading:c,onClick:s})=>{const r=Object(F.a)();return n.a.createElement(D.a,{className:"ShowMoreButton",color:"translucent",size:"smaller",isText:!0,isLoading:c,isRtl:r.isRtl,onClick:s},n.a.createElement("i",{className:"icon-down"}),"Show ",e," more ",e>1?a||t+"s":t)};const aa="Please provide a title for this folder.",na="Please select at least one chat for this folder.";var ca=Object(n.h)(Object(c.h)(e=>{const{listIds:t}=e.chats;return{loadedActiveChatIds:t.active,loadedArchivedChatIds:t.archived}},(e,t)=>Object(b.l)(t,["editChatFolder","addChatFolder","loadMoreChats"]))(({state:e,dispatch:t,onAddIncludedChats:a,onAddExcludedChats:c,isActive:s,onScreenSelect:l,onReset:i,onBack:d,loadedActiveChatIds:m,loadedArchivedChatIds:h,editChatFolder:g,addChatFolder:p,loadMoreChats:v})=>{const[O,E]=Object(n.r)(),[f,j]=Object(n.r)(!1),C=Object(n.m)(()=>j(!0),[]),[y,k]=Object(n.r)(!1),[N,w]=Object(n.r)(!1),{selectedChatIds:S,selectedChatTypes:I}=Rt(e,"included"),{selectedChatIds:P,selectedChatTypes:M}=Rt(e,"excluded");Object(n.n)(()=>{O||Object(Zt.a)("FoldersNew").then(E)},[O]),Object(n.n)(()=>{k(!1),w(!1)},[e.folderId]);const[R,T]=Object(n.p)(()=>{const e=new Set([...m||[],...h||[]]),t=Object(b.f)(S,e),a=Object(b.f)(P,e);return[y?t:t.slice(0,5-I.length),N?a:a.slice(0,5-M.length)]},[P,S,I,M,N,y,m,h]);Object(n.n)(()=>{(R.lengthk(!0):()=>w(!0);return n.a.createElement(n.a.Fragment,null,t.map(t=>function(e,t){const a="included"===t?Mt.find(({key:t})=>t===e):Ft.find(({key:t})=>t===e);if(a)return n.a.createElement(Ee.a,{key:a.key,className:"settings-folders-list-item mb-1",icon:a.icon,narrow:!0,inactive:!0},D(a.title))}(t,e)),a.map(e=>n.a.createElement(Ee.a,{className:"settings-folders-list-item mb-1",narrow:!0,inactive:!0},Object(u.ob)(e)?n.a.createElement(fe.a,{avatarSize:"small",userId:e}):n.a.createElement(je.a,{avatarSize:"small",chatId:e}))),!c&&s>0&&n.a.createElement(ta,{count:s,itemName:"chat",onClick:r}))}return Object(A.a)(s,d,l,"edit"===e.mode?r.n.FoldersEditFolder:r.n.FoldersCreateFolder),n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement("div",{className:"settings-content-icon"},O&&n.a.createElement(Jt.a,{id:"settingsFoldersEdit",size:o.Fb,animationData:O,play:f&&String(e.folderId),noLoop:!0,onLoad:C})),"create"===e.mode&&n.a.createElement("p",{className:"settings-item-description mb-3",dir:D.isRtl?"rtl":void 0},D("FilterIncludeInfo")),n.a.createElement(ve.a,{className:"mb-0",label:D("FilterNameHint"),value:e.folder.title,onChange:function(e){const{currentTarget:a}=e;t({type:"setTitle",payload:a.value.trim()})},error:e.error&&e.error===aa?aa:void 0})),n.a.createElement("div",{className:"settings-item no-border pt-3"},e.error&&e.error===na&&n.a.createElement("p",{className:"settings-item-description color-danger mb-2",dir:D.isRtl?"rtl":void 0},e.error),n.a.createElement("h4",{className:"settings-item-header mb-3",dir:D.isRtl?"rtl":void 0},D("FilterInclude")),n.a.createElement(Ee.a,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:a},D("FilterAddChats")),B("included")),n.a.createElement("div",{className:"settings-item no-border pt-3"},n.a.createElement("h4",{className:"settings-item-header mb-3",dir:D.isRtl?"rtl":void 0},D("FilterExclude")),n.a.createElement(Ee.a,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:c},D("FilterAddChats")),B("excluded"))),n.a.createElement(Ht.a,{isShown:!!e.isTouched,disabled:e.isLoading,onClick:function(){const{title:a}=e.folder;a?S.length||Object.keys(I).length?(t({type:"setIsLoading",payload:!0}),"edit"===e.mode?g({id:e.folderId,folderUpdate:e.folder}):p({folder:e.folder}),setTimeout(()=>{i()},500)):t({type:"setError",payload:na}):t({type:"setError",payload:aa})},ariaLabel:"edit"===e.mode?"Save changes":"Create folder"},e.isLoading?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))})),sa=a(48);a(192),a(277);var ra=Object(n.h)(({mode:e,chatIds:t,selectedIds:a,selectedChatTypes:c,filterValue:s,onSelectedIdsChange:r,onSelectedChatTypesChange:o,onFilterChange:l,onLoadMore:i})=>{const d=Object(n.q)(null),m="included"===e?Mt:Ft,b=a.length+c.length>10,h=a.length>=100;Object(n.n)(()=>{setTimeout(()=>{requestAnimationFrame(()=>{d.current.focus()})},500)},[]);const g=Object(n.m)(e=>{const t=[...a];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),r(t)},[a,r]),p=Object(n.m)(e=>{const t=[...c];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),o(t)},[c,o]),v=Object(n.m)(e=>{const{value:t}=e.currentTarget;l(t)},[l]),O=Object(F.a)();const[E,f]=Object(be.a)(i,t,Boolean(s));return n.a.createElement("div",{className:"Picker SettingsFoldersChatsPicker"},n.a.createElement("div",{className:"picker-header custom-scroll"},c.map((function(e){const t=m.find(({key:t})=>e===t);if(t)return n.a.createElement(st.a,{icon:t.icon,title:O(t.title),isMinimized:b,canClose:!0,onClick:p,clickArg:t.key})})),a.map((e,t)=>n.a.createElement(st.a,{chatOrUserId:e,isMinimized:b&&tp(e.key),ripple:!0},n.a.createElement("i",{className:"icon-"+e.icon}),n.a.createElement("h3",{className:"chat-type",dir:"auto"},O(e.title)),n.a.createElement(sa.a,{label:"",checked:c.includes(e.key),round:!0}))})),n.a.createElement("div",{key:"divider",className:"picker-list-divider"}),n.a.createElement("h4",{key:"header2",className:"settings-item-header",dir:O.isRtl?"rtl":void 0},O("FilterChats"))),E&&E.length?E.map((function(e){const t=a.includes(e);return n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable picker-list-item chat-item",onClick:()=>g(e),ripple:!0,disabled:!t&&h},Object(u.ob)(e)?n.a.createElement(fe.a,{userId:e}):n.a.createElement(je.a,{chatId:e,withChatType:!0}),n.a.createElement(sa.a,{label:"",checked:t,round:!0}))})):E&&!E.length?n.a.createElement("p",{className:"no-results",key:"no-results"},"Sorry, nothing found."):n.a.createElement(ge.a,{key:"loading"})))});var oa=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t,listIds:a,orderedPinnedIds:n}}=e;return{chatsById:t,listIds:a.active,orderedPinnedIds:n.active,archivedPinnedIds:n.archived,archivedListIds:a.archived}},(e,t)=>Object(b.l)(t,["loadMoreChats"]))(({isActive:e,onScreenSelect:t,onReset:a,mode:c,state:s,dispatch:o,chatsById:l,listIds:i,orderedPinnedIds:d,archivedListIds:m,archivedPinnedIds:b,loadMoreChats:h})=>{const{chatFilter:g}=s,{selectedChatIds:p,selectedChatTypes:v}=Rt(s,c,!0),O=Object(F.a)(),E=Object(n.p)(()=>{const e=i?Object(u.Fb)(l,i,d,"all"):void 0,t=m?Object(u.Fb)(l,m,b,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]},[l,i,d,m,b]),f=Object(n.p)(()=>{if(E)return E.filter(e=>!g||Object(ue.a)(Object(u.k)(O,e),g)||p.includes(e.id)).map(({id:e})=>e)},[E,g,O,p]),j=Object(n.m)(e=>{o({type:"setChatFilter",payload:e})},[o]),C=Object(n.m)(e=>{o("included"===c?{type:"setIncludeFilters",payload:{...s.includeFilters,includedChatIds:e}}:{type:"setExcludeFilters",payload:{...s.excludeFilters,excludedChatIds:e}})},[c,s,o]),y=Object(n.m)(e=>{const t={};e.forEach(e=>{t[e]=!0}),o("included"===c?{type:"setIncludeFilters",payload:{includedChatIds:p,...t}}:{type:"setExcludeFilters",payload:{excludedChatIds:p,...t}})},[c,p,o]);return Object(A.a)(e,a,t,"included"===c?r.n.FoldersIncludedChats:r.n.FoldersExcludedChats),f?n.a.createElement(ra,{mode:c,chatIds:f,selectedIds:p,selectedChatTypes:v,filterValue:g,onSelectedIdsChange:C,onSelectedChatTypesChange:y,onFilterChange:j,onLoadMore:h}):n.a.createElement(ge.a,null)}));a(278);var la=Object(n.h)(({currentScreen:e,shownScreen:t,state:a,dispatch:c,isActive:s,onScreenSelect:o,onReset:l})=>{const i=Object(n.m)(()=>{e!==r.n.FoldersCreateFolder&&e!==r.n.FoldersEditFolder||setTimeout(()=>{c({type:"reset"})},200),e!==r.n.FoldersIncludedChats&&e!==r.n.FoldersExcludedChats?l():"create"===a.mode?o(r.n.FoldersCreateFolder):o(r.n.FoldersEditFolder)},[a.mode,c,e,l,o]),d=Object(n.m)(()=>{c({type:"reset"}),o(r.n.FoldersCreateFolder)},[o,c]),m=Object(n.m)(e=>{c({type:"editFolder",payload:e}),o(r.n.FoldersEditFolder)},[c,o]),u=Object(n.m)(()=>{c({type:"editIncludeFilters"}),o(r.n.FoldersIncludedChats)},[c,o]),b=Object(n.m)(()=>{c({type:"editExcludeFilters"}),o(r.n.FoldersExcludedChats)},[c,o]);switch(e){case r.n.Folders:return n.a.createElement(ea,{onCreateFolder:d,onEditFolder:m,onScreenSelect:o,isActive:s||[r.n.FoldersCreateFolder,r.n.FoldersEditFolder,r.n.FoldersIncludedChats,r.n.FoldersExcludedChats].includes(t),onReset:l});case r.n.FoldersCreateFolder:case r.n.FoldersEditFolder:return n.a.createElement(ca,{state:a,dispatch:c,onAddIncludedChats:u,onAddExcludedChats:b,onReset:i,onScreenSelect:o,isActive:s||[r.n.FoldersIncludedChats,r.n.FoldersExcludedChats].includes(t),onBack:l});case r.n.FoldersIncludedChats:return n.a.createElement(oa,{mode:"included",state:a,dispatch:c,onReset:i,onScreenSelect:o,isActive:s});case r.n.FoldersExcludedChats:return n.a.createElement(oa,{mode:"excluded",state:a,dispatch:c,onReset:i,onScreenSelect:o,isActive:s});default:return}}),ia=a(109);a(279);var da=Object(n.h)(({options:e,range:t,label:a,value:c,disabled:s,onChange:r})=>{const o=Object(F.a)(),l=Object(n.m)(e=>{r(Number(e.currentTarget.value))},[r]),i=Object(W.a)("RangeSlider",s&&"disabled"),d=Object(n.p)(()=>{if(e)return c/(e.length-1)*100;if(t){const e=(t.max-t.min)/(t.step||1);return(c-t.min)/e*100}return 0},[c,e,t]),[m,u,b]=Object(n.p)(()=>e?[0,e.length-1,1]:t?[t.min,t.max,t.step||1]:[0,0,0],[t,e]);return n.a.createElement("div",{className:i},a&&n.a.createElement("div",{className:"slider-top-row",dir:o.isRtl?"rtl":void 0},n.a.createElement("span",{className:"label",dir:"auto"},a),t&&n.a.createElement("span",{className:"value",dir:"auto"},c)),n.a.createElement("div",{className:"slider-main"},n.a.createElement("div",{className:"slider-fill-track",style:`width: ${d}%`}),n.a.createElement("input",{min:m,max:u,value:c,step:b,type:"range",onChange:l}),e&&n.a.createElement("div",{className:"slider-options"},e.map((e,t)=>n.a.createElement("div",{className:Object(W.a)("slider-option no-selection",t===c&&"active"),onClick:()=>r(t)},e)))))}),ma=a(117),ua=a(50);var ba=Object(n.h)(({size:e=o.Mb,stickerSet:t,observeIntersection:a})=>{const c=Object(n.q)(null),r=Object(ia.b)(c,a),l="stickerSet"+t.id,i=Object(O.a)(l,!r,s.ApiMediaFormat.Lottie),{shouldRenderFullMedia:d,transitionClassNames:m}=Object(ma.a)(i,"slow");return n.a.createElement("div",{ref:c,className:"sticker-set-cover"},!d&&Object(ua.c)(t.title,2),d&&i&&n.a.createElement(Jt.a,{id:l,size:e,animationData:i,className:m}))});var ha=Object(n.h)(({stickerSet:e,observeIntersection:t})=>{const a=Object(n.q)(null),c=Object(ia.b)(a,t),s=Object(O.a)(e.hasThumbnail&&"stickerSet"+e.id,!c),{shouldRenderFullMedia:r,transitionClassNames:o}=Object(ma.a)(s,"slow");return n.a.createElement("div",{ref:a,className:"sticker-set-cover"},!r&&Object(ua.c)(e.title,2),r&&n.a.createElement("img",{src:s,className:o,alt:""}))});a(280);var ga=Object(n.h)(({sticker:e,size:t,observeIntersection:a,noAnimate:c,title:r,className:o,onClick:l,clickArg:i,onUnfaveClick:d})=>{const m=Object(n.q)(null),u="sticker"+e.id,b="sticker-button-"+e.id,h=Object(ia.b)(m,a),g=e.thumbnail?e.thumbnail.dataUri:void 0,p=Object(O.a)(u+"?size=m",!h,s.ApiMediaFormat.BlobUrl),v=h&&!c,E=Object(O.a)(e.isAnimated&&u,!v,s.ApiMediaFormat.Lottie),[f,j,C]=Object(Ue.a)(Boolean(E)),y=f&&v,{shouldRenderThumb:k,shouldRenderFullMedia:N,transitionClassNames:w}=Object(ma.a)(p||y,"slow");Object(n.n)(()=>{v||C()},[C,v]);const S=Object(W.a)("StickerButton",e.isAnimated&&"animated",b,o),I=k&&g?`background-image: url('${g}');`:"";return n.a.createElement("div",{ref:m,className:S,title:r||e&&e.emoji,style:I,"data-sticker-id":e.id,onClick:function(){l&&l(i)}},N&&!y&&n.a.createElement("img",{src:p,className:w}),v&&E&&n.a.createElement(Jt.a,{id:u,animationData:E,play:!0,size:t,isLowPriority:!0,onLoad:j}),d&&n.a.createElement(D.a,{className:"sticker-unfave-button",color:"dark",round:!0,onClick:function(t){t.stopPropagation(),t.preventDefault(),d(e)}},n.a.createElement("i",{className:"icon-close"})))});a(281);var pa=Object(n.h)(({stickerSet:e,observeIntersection:t,onClick:a})=>{const c=Object(F.a)();if(!e||!e.stickers)return;const s=e.stickers&&e.stickers[0];return e.hasThumbnail||!s?n.a.createElement(Ee.a,{narrow:!0,className:"SettingsStickerSet",inactive:!s,onClick:()=>s&&a(s)},n.a.createElement(D.a,{ariaLabel:e.title,color:"translucent",isRtl:c.isRtl},e.isAnimated?n.a.createElement(ba,{size:o.Gb,stickerSet:e,observeIntersection:t}):n.a.createElement(ha,{stickerSet:e,observeIntersection:t})),n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("div",{className:"title"},e.title),n.a.createElement("div",{className:"subtitle"},c("StickerPack.StickerCount",e.count,"i")))):n.a.createElement(Ee.a,{narrow:!0,className:"SettingsStickerSet",onClick:()=>a(s)},n.a.createElement(ga,{sticker:s,size:o.Gb,title:e.title,observeIntersection:t}),n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("div",{className:"title"},e.title),n.a.createElement("div",{className:"subtitle"},c("StickerPack.StickerCount",e.count,"i"))))}),va=a(164);const Oa=["Solid and Steady","Nice and Fast","Lots of Stuff"];var Ea=Object(n.h)(Object(c.h)(e=>({...Object(b.l)(e.settings.byKey,["messageTextSize","animationLevel","messageSendKeyCombo","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayGifs","shouldAutoPlayVideos","shouldSuggestStickers","shouldLoopStickers","isSensitiveEnabled","canChangeSensitive"]),stickerSetIds:e.stickers.added.setIds,stickerSetsById:e.stickers.setsById}),(e,t)=>Object(b.l)(t,["setSettingOption","loadStickerSets","loadAddedStickers"]))(({isActive:e,onScreenSelect:t,onReset:a,stickerSetIds:c,stickerSetsById:s,messageTextSize:o,animationLevel:i,messageSendKeyCombo:d,shouldAutoDownloadMediaFromContacts:m,shouldAutoDownloadMediaInPrivateChats:u,shouldAutoDownloadMediaInGroups:b,shouldAutoDownloadMediaInChannels:h,shouldAutoPlayGifs:g,shouldAutoPlayVideos:p,shouldSuggestStickers:v,shouldLoopStickers:O,setSettingOption:E,loadStickerSets:f,loadAddedStickers:j})=>{const C=Object(n.q)(null),{observe:y}=Object(ia.a)({rootRef:C}),[k,N,w]=Object(Ue.a)(),[S,I]=Object(n.r)(),P=Object(F.a)(),M=l.n?void 0:[{value:"enter",label:P("lng_settings_send_enter"),subLabel:"New line by Shift + Enter"},{value:"ctrl-enter",label:P(l.f?"lng_settings_send_cmdenter":"lng_settings_send_ctrlenter"),subLabel:"New line by Enter"}];Object(n.n)(()=>{f()},[f]),Object(n.n)(()=>{c&&c.length&&j()},[c,j]);const L=Object(n.m)(e=>{Oa.forEach((t,a)=>{document.body.classList.toggle("animation-level-"+a,e===a)}),E({animationLevel:e})},[E]),R=Object(n.m)(e=>{document.documentElement.style.setProperty("--composer-text-size",Math.max(e,l.e?16:15)+"px"),document.documentElement.style.setProperty("--message-text-size",e+"px"),E({messageTextSize:e})},[E]),T=Object(n.m)(e=>{I(e),N()},[N]),D=c&&c.map(e=>!!(s&&s[e]&&s[e].installedDate)&&s[e]).filter(Boolean);return Object(A.a)(e,a,t,r.n.General),n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("h4",{className:"settings-item-header",dir:P.isRtl?"rtl":void 0},P("SETTINGS")),n.a.createElement(da,{label:P("TextSize"),range:{min:12,max:20},value:o,onChange:R}),n.a.createElement(Ee.a,{icon:"photo",onClick:()=>t(r.n.GeneralChatBackground)},P("ChatBackground"))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:P.isRtl?"rtl":void 0},"Animation Level"),n.a.createElement("p",{className:"settings-item-description",dir:P.isRtl?"rtl":void 0},"Choose the desired animations amount."),n.a.createElement(da,{options:Oa,value:i,onChange:L})),M&&n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:P.isRtl?"rtl":void 0},P("VoiceOver.Keyboard")),n.a.createElement(ze.a,{name:"keyboard-send-settings",options:M,onChange:e=>E({messageSendKeyCombo:e}),selected:d})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:P.isRtl?"rtl":void 0},P("AutoDownloadMedia")),n.a.createElement(sa.a,{label:P("Contacts"),checked:m,onCheck:e=>E({shouldAutoDownloadMediaFromContacts:e})}),n.a.createElement(sa.a,{label:P("AutodownloadPrivateChats"),checked:u,onCheck:e=>E({shouldAutoDownloadMediaInPrivateChats:e})}),n.a.createElement(sa.a,{label:P("AutodownloadGroupChats"),checked:b,onCheck:e=>E({shouldAutoDownloadMediaInGroups:e})}),n.a.createElement(sa.a,{label:P("FilterChannels"),checked:h,onCheck:e=>E({shouldAutoDownloadMediaInChannels:e})})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:P.isRtl?"rtl":void 0},P("AutoplayMedia")),n.a.createElement(sa.a,{label:P("GifsTab2"),checked:g,onCheck:e=>E({shouldAutoPlayGifs:e})}),n.a.createElement(sa.a,{label:P("DataAndStorage.Autoplay.Videos"),checked:p,onCheck:e=>E({shouldAutoPlayVideos:e})})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:P.isRtl?"rtl":void 0},P("AccDescrStickers")),n.a.createElement(sa.a,{label:P("SuggestStickers"),checked:v,onCheck:e=>E({shouldSuggestStickers:e})}),n.a.createElement(sa.a,{label:P("LoopAnimatedStickers"),checked:O,onCheck:e=>E({shouldLoopStickers:e})}),n.a.createElement("div",{className:"mt-4",ref:C},D&&D.map(e=>n.a.createElement(pa,{key:e.id,stickerSet:e,observeIntersection:y,onClick:T}))),S&&n.a.createElement(va.a,{isOpen:k,fromSticker:S,onClose:w})))}));let fa;function ja(e="*",t,a=!1){fa||(fa=document.createElement("input"),fa.setAttribute("type","file")),fa.setAttribute("accept",e),a?fa.removeAttribute("multiple"):fa.setAttribute("multiple","multiple"),fa.onchange=null,fa.value="",fa.onchange=t,fa.click()}var Ca=a(17);function ya(e){return[parseInt(e.substring(0,2),16),parseInt(e.substring(2,4),16),parseInt(e.substring(4,6),16)]}function ka(e){const t=e[0].toString(16),a=e[1].toString(16),n=e[2].toString(16);return(1==t.length?"0"+t:t)+(1==a.length?"0"+a:a)+(1==n.length?"0"+n:n)}function Na([e,t,a]){e/=255,t/=255,a/=255;let n,c,s=Math.max(e,t,a),r=Math.min(e,t,a),o=s,l=s-r;if(c=0==s?0:l/s,s==r)n=0;else{switch(s){case e:n=(t-a)/l+(t.5?Math.max(0,.65*n):Math.max(0,Math.min(1,1-.65*n)),`hsla(${360*t}, ${100*a}%, ${100*n}%, .4)`}var Ia=a(12),Pa=a(165);a(282);var Ma=Object(n.h)(({wallpaper:e,theme:t,isSelected:a,onClick:c})=>{const{slug:s,document:l}=e,i="wallpaper"+l.id,d=l.previewBlobUrl,m=Object(O.a)(i+"?size=m"),u=Object(Pa.a)(l.thumbnail&&l.thumbnail.dataUri,Boolean(m),!0),{shouldRenderThumb:b,shouldRenderFullMedia:h,transitionClassNames:g}=Object(ma.a)(m||d,"slow"),[p,v]=Object(n.r)(!1),{mediaData:f,downloadProgress:C}=Object(E.a)(i,!p),y=!1===Object(j.a)(p),{shouldRender:k,transitionClassNames:N}=Object(Y.a)(p&&!f||s===r.o,void 0,y,"slow"),w=Object(n.q)();w.current=t;const S=Object(n.m)(()=>{(async()=>{const e=await Object(Ca.e)(f);await Ia.d(o.o,w.current,e),c(s)})()},[f,c,s]);Object(n.n)(()=>{f&&S()},[f,S]);const I=Object(n.m)(()=>{f?S():v(e=>!e)},[f,S]),P=Object(W.a)("WallpaperTile",a&&"selected");return n.a.createElement("div",{className:P,onClick:I},n.a.createElement("div",{className:"media-inner"},b&&n.a.createElement("canvas",{ref:u,className:"thumbnail"}),h&&n.a.createElement("img",{src:m||d,className:"full-media "+g,alt:""}),k&&n.a.createElement("div",{className:Object(W.a)("spinner-container",N)},n.a.createElement(H.a,{progress:C,onClick:I}))))});a(283);const Fa=Object(V.h)(e=>e(),6e4,!0);var Aa=Object(n.h)(Object(c.h)(e=>{const t=Object(m.Db)(e),{background:a,isBlurred:n}=e.settings.themes[t]||{},{loadedWallpapers:c}=e.settings;return{background:a,isBlurred:n,loadedWallpapers:c,theme:t}},(e,t)=>Object(b.l)(t,["loadWallpapers","uploadWallpaper","setThemeSettings"]))(({isActive:e,onScreenSelect:t,onReset:a,background:c,isBlurred:s,loadedWallpapers:l,theme:i,loadWallpapers:d,uploadWallpaper:m,setThemeSettings:u})=>{const b=Object(n.q)();b.current=i,Object(n.n)(()=>{Fa(()=>{d()})},[d]);const h=Object(n.m)(e=>{const{files:t}=e.target;t&&t.length>0&&m(t[0])},[m]),g=Object(n.m)(()=>{ja("image/jpeg",h,!0)},[h]),p=Object(n.m)(()=>{t(r.n.GeneralChatBackgroundColor)},[t]),v=Object(n.m)(()=>{u({theme:i,background:void 0,backgroundColor:void 0,isBlurred:!0,patternColor:"dark"===i?o.q:o.x})},[u,i]),O=Object(n.m)(e=>{u({theme:b.current,background:e});const t=l&&l.find(t=>t.slug===e);t&&t.document.thumbnail&&async function(e){const t=[0,0,0];let a,n,c,s,r=-4,o=[0,0,0],l=0;const i=document.createElement("canvas"),d=i.getContext&&i.getContext("2d");if(!d)return t;const m=await Object(Ca.g)(e);c=m.naturalHeight||m.offsetHeight||m.height,n=m.naturalWidth||m.offsetWidth||m.width,i.height=c,i.width=n,d.drawImage(m,0,0);try{a=d.getImageData(0,0,n,c)}catch(e){return t}for(s=a.data.length;(r+=20){const t=Sa(e),a="#"+ka(e);u({theme:b.current,backgroundColor:a,patternColor:t})})},[l,u]),E=Object(n.m)(e=>{u({theme:b.current,isBlurred:e.target.checked})},[u]),f=Object(F.a)();Object(A.a)(e,a,t,r.n.GeneralChatBackground);const j=l&&l[0]&&l[0].slug===r.o;return n.a.createElement("div",{className:"SettingsGeneralBackground settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement(Ee.a,{icon:"camera-add",className:"mb-0",disabled:j,onClick:g},f("UploadImage")),n.a.createElement(Ee.a,{icon:"colorize",className:"mb-0",onClick:p},f("SetColor")),n.a.createElement(Ee.a,{icon:"favorite",onClick:v},f("ThemeResetToDefaults")),n.a.createElement(sa.a,{label:f("BackgroundBlurred"),checked:Boolean(s),onChange:E})),l?n.a.createElement("div",{className:"settings-wallpapers"},l.map(e=>n.a.createElement(Ma,{wallpaper:e,theme:i,isSelected:c===e.slug,onClick:O}))):n.a.createElement(ge.a,null))}));a(284);const La=Na(ya("e6ebee")),Ra=["#e6ebee","#b2cee1","#008dd0","#c6e7cb","#c4e1a6","#60b16e","#ccd0af","#a6a997","#7a7072","#fdd7af","#fdb76e","#dd8851"];function Ta(e,t){return{colorPosition:[Math.round(e[1]*(t.colorRect.width-1)),Math.round((1-e[2])*(t.colorRect.height-1))],huePosition:Math.round(e[0]*(t.hueRect.width-1))}}function Da({colorPosition:e,huePosition:t},a){return[t/(a.hueRect.width-1),e[0]/(a.colorRect.width-1),1-e[1]/(a.colorRect.height-1)]}var Ba=Object(n.h)(Object(c.h)(e=>{const t=Object(m.Db)(e),{backgroundColor:a}=e.settings.themes[t]||{};return{backgroundColor:a,theme:t}},(e,t)=>Object(b.l)(t,["setThemeSettings"]))(({isActive:e,onScreenSelect:t,onReset:a,theme:c,backgroundColor:s,setThemeSettings:o})=>{const l=Object(n.q)();l.current=c;const i=Object(n.q)(null),d=Object(n.q)(null),m=Object(n.q)(null),u=Object(n.q)(!0),[g,p]=Object(n.r)(function(e){return e&&e.startsWith("#")?Na(ya(e.replace("#",""))):La}(s)),v=Object(n.q)(g);Object(n.n)(()=>{v.current=g},[g]);const[O,E,f]=Object(Ue.a)(),[j,C]=Object(n.r)(""),[y,k]=Object(n.r)(""),N=Object(n.q)(),w=Object(n.q)();Object(n.n)(()=>{const e={offsetLeft:d.current.offsetLeft,...Object(b.l)(d.current.getBoundingClientRect(),["top","width","height"])},t={offsetLeft:m.current.offsetLeft,...Object(b.l)(m.current.getBoundingClientRect(),["width"])};function a(t){const a=[Math.min(Math.max(0,t.pageX-e.offsetLeft),e.width-1),Math.min(Math.max(0,t.pageY-e.top+i.current.scrollTop),e.height-1)],{huePosition:n}=Ta(v.current,N.current);p(Da({colorPosition:a,huePosition:n},N.current)),E()}function n(e){const{colorPosition:a}=Ta(v.current,N.current),n=Math.min(Math.max(0,e.pageX-t.offsetLeft),t.width-1);p(Da({colorPosition:a,huePosition:n},N.current)),E()}N.current={colorRect:e,hueRect:t},Object(h.b)(d.current,{onCapture:a,onDrag:a,onRelease:f,onClick:f,withCursor:!0}),Object(h.b)(m.current,{onCapture:n,onDrag:n,onRelease:f,onClick:f,withCursor:!0})},[E,f]);const{colorPosition:S=[0,0],huePosition:I=0}=N.current?Ta(g,N.current):{},P=ka(wa(g)),M=g[0],F=ka(wa([M,1,1]));Object(n.n)(()=>{const e=wa(g),t="#"+ka(e);if(C(e.join(", ")),k(t),!u.current){const a=Sa(e);o({theme:l.current,background:void 0,backgroundColor:t,patternColor:a})}u.current=!1},[g,o]),Object(n.n)(()=>{!function(e,t,a,n){let c,s,r;a.current&&n.current?(c=n.current.colorRect.width,s=n.current.colorRect.height,r=a.current):(c=e.offsetWidth,s=e.offsetHeight,r=e.getContext("2d"),e.width=c,e.height=s,a.current=r);const o=r.createImageData(c,s),l=o.data,i=wa([t,1,1]);let d=0;for(let e=0;e{!function(e){const t=e.offsetWidth;e.width=t,e.height=1;const a=e.getContext("2d"),n=a.createImageData(t,1),c=n.data;let s=0;for(let e=0;e{const t=e.currentTarget.value.replace(/[^\d, ]/g,"").slice(0,13);if(t.match(/^\d{1,3},\s?\d{1,3},\s?\d{1,3}$/)){const e=t.split(",").map(e=>Number(e.trim()));p(Na(e))}e.currentTarget.value=t},[]),R=Object(n.m)(e=>{const t=e.currentTarget.value.replace(/[^0-9a-fA-F]/g,"").slice(0,6);t.match(/^#?[0-9a-fA-F]{6}$/)&&p(Na(ya(t.replace("#","")))),e.currentTarget.value=t},[]),T=Object(n.m)(e=>{p(Na(ya(e.currentTarget.dataset.color.replace("#",""))))},[]),D=Object(W.a)("SettingsGeneralBackgroundColor settings-content custom-scroll",O&&"is-dragging");return Object(A.a)(e,a,t,r.n.GeneralChatBackgroundColor),n.a.createElement("div",{ref:i,className:D},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement("div",{ref:d,className:"color-picker"},n.a.createElement("canvas",null),n.a.createElement("div",{className:"handle",style:`transform: translate(${S[0]}px, ${S[1]}px); background-color: #${P};`})),n.a.createElement("div",{ref:m,className:"hue-picker"},n.a.createElement("canvas",null),n.a.createElement("div",{className:"handle",style:`transform: translateX(${I}px); background-color: #${F};`})),n.a.createElement("div",{className:"tools"},n.a.createElement(ve.a,{value:y,label:"HEX",onChange:R}),n.a.createElement(ve.a,{value:j,label:"RGB",onChange:L}))),n.a.createElement("div",{className:"predefined-colors"},Ra.map(e=>n.a.createElement("div",{className:e==="#"+P?"active":void 0,"data-color":e,style:`background-color: ${e};`,onClick:T}))))}));var xa=Object(n.h)(Object(c.h)(e=>({hasPrivateChatsNotifications:Boolean(e.settings.byKey.hasPrivateChatsNotifications),hasPrivateChatsMessagePreview:Boolean(e.settings.byKey.hasPrivateChatsMessagePreview),hasGroupNotifications:Boolean(e.settings.byKey.hasGroupNotifications),hasGroupMessagePreview:Boolean(e.settings.byKey.hasGroupMessagePreview),hasBroadcastNotifications:Boolean(e.settings.byKey.hasBroadcastNotifications),hasBroadcastMessagePreview:Boolean(e.settings.byKey.hasBroadcastMessagePreview),hasContactJoinedNotifications:Boolean(e.settings.byKey.hasContactJoinedNotifications)}),(e,t)=>Object(b.l)(t,["loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings"]))(({isActive:e,onScreenSelect:t,onReset:a,hasPrivateChatsNotifications:c,hasPrivateChatsMessagePreview:s,hasGroupNotifications:o,hasGroupMessagePreview:l,hasBroadcastNotifications:i,hasBroadcastMessagePreview:d,hasContactJoinedNotifications:m,loadNotificationSettings:u,updateContactSignUpNotification:b,updateNotificationSettings:h})=>{Object(n.n)(()=>{u()},[u]);const g=Object(n.m)((e,t,a)=>{const n="contact"===t?!c:!("group"===t?o:i),r="contact"===t?s:"group"===t?l:d;h({peerType:t,..."silent"===a&&{isSilent:!e.target.checked,shouldShowPreviews:r},..."showPreviews"===a&&{shouldShowPreviews:e.target.checked,isSilent:n}})},[d,i,l,o,s,c,h]),p=Object(n.m)(e=>{b({isSilent:!e.target.checked})},[b]),v=Object(F.a)();return Object(A.a)(e,a,t,r.n.Notifications),n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:v.isRtl?"rtl":void 0},v("AutodownloadPrivateChats")),n.a.createElement(sa.a,{label:v("NotificationsForPrivateChats"),subLabel:v(c?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:c,onChange:e=>{g(e,"contact","silent")}}),n.a.createElement(sa.a,{label:v("MessagePreview"),subLabel:v(s?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:s,onChange:e=>{g(e,"contact","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:v.isRtl?"rtl":void 0},v("FilterGroups")),n.a.createElement(sa.a,{label:v("NotificationsForGroups"),subLabel:v(o?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:o,onChange:e=>{g(e,"group","silent")}}),n.a.createElement(sa.a,{label:v("MessagePreview"),subLabel:v(l?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:l,onChange:e=>{g(e,"group","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:v.isRtl?"rtl":void 0},v("FilterChannels")),n.a.createElement(sa.a,{label:v("NotificationsForChannels"),subLabel:v(i?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:i,onChange:e=>{g(e,"broadcast","silent")}}),n.a.createElement(sa.a,{label:v("MessagePreview"),subLabel:v(d?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:d,onChange:e=>{g(e,"broadcast","showPreviews")}})),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:v.isRtl?"rtl":void 0},v("PhoneOther")),n.a.createElement(sa.a,{label:v("ContactJoined"),checked:m,onChange:p})))}));var Ua=Object(n.h)(Object(c.h)(e=>{const{settings:{byKey:{hasPassword:t,isSensitiveEnabled:a,canChangeSensitive:n},privacy:c},blocked:s,activeSessions:r}=e;return{hasPassword:t,blockedCount:s.totalCount,sessionsCount:r.length,isSensitiveEnabled:a,canChangeSensitive:n,visibilityPrivacyPhoneNumber:c.phoneNumber&&c.phoneNumber.visibility,visibilityPrivacyLastSeen:c.lastSeen&&c.lastSeen.visibility,visibilityPrivacyProfilePhoto:c.profilePhoto&&c.profilePhoto.visibility,visibilityPrivacyForwarding:c.forwards&&c.forwards.visibility,visibilityPrivacyGroupChats:c.chatInvite&&c.chatInvite.visibility}},(e,t)=>Object(b.l)(t,["loadBlockedContacts","loadAuthorizations","loadPrivacySettings","loadContentSettings","updateContentSettings"]))(({isActive:e,onScreenSelect:t,onReset:a,hasPassword:c,blockedCount:s,sessionsCount:o,isSensitiveEnabled:l,canChangeSensitive:i,visibilityPrivacyPhoneNumber:d,visibilityPrivacyLastSeen:m,visibilityPrivacyProfilePhoto:u,visibilityPrivacyForwarding:b,visibilityPrivacyGroupChats:h,loadPrivacySettings:g,loadBlockedContacts:p,loadAuthorizations:v,loadContentSettings:O,updateContentSettings:E})=>{Object(n.n)(()=>{p(),v(),g(),O()},[p,v,g,O]);const f=Object(F.a)();function j(e){switch(e){case"everybody":return f("P2PEverybody");case"contacts":return f("P2PContacts");case"nobody":return f("P2PNobody")}}return Object(A.a)(e,a,t,r.n.Privacy),n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item pt-3"},n.a.createElement(Ee.a,{icon:"delete-user",narrow:!0,onClick:()=>t(r.n.PrivacyBlockedUsers)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},f("BlockedUsers")),s>0&&n.a.createElement("span",{className:"subtitle",dir:"auto"},f("Users",s)))),n.a.createElement(Ee.a,{icon:"lock",narrow:!0,onClick:()=>t(c?r.n.TwoFaEnabled:r.n.TwoFaDisabled)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},f("TwoStepVerification")),n.a.createElement("span",{className:"subtitle",dir:"auto"},f(c?"PasswordOn":"PasswordOff")))),n.a.createElement(Ee.a,{icon:"active-sessions",narrow:!0,onClick:()=>t(r.n.PrivacyActiveSessions)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},f("SessionsTitle")),o>0&&n.a.createElement("span",{className:"subtitle",dir:"auto"},1===o?"1 session":o+" sessions")))),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:f.isRtl?"rtl":void 0},f("PrivacyTitle")),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>t(r.n.PrivacyPhoneNumber)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},f("PrivacyPhoneTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},j(d)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>t(r.n.PrivacyLastSeen)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},f("LastSeenTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},j(m)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>t(r.n.PrivacyProfilePhoto)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},f("PrivacyProfilePhotoTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},j(u)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>t(r.n.PrivacyForwarding)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},f("PrivacyForwardsTitle")),n.a.createElement("span",{className:"subtitle",dir:"auto"},j(b)))),n.a.createElement(Ee.a,{narrow:!0,onClick:()=>t(r.n.PrivacyGroupChats)},n.a.createElement("div",{className:"multiline-menu-item"},n.a.createElement("span",{className:"title"},f("WhoCanAddMe")),n.a.createElement("span",{className:"subtitle",dir:"auto"},j(h))))),i&&n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:f.isRtl?"rtl":void 0},f("lng_settings_sensitive_title")),n.a.createElement(sa.a,{label:f("lng_settings_sensitive_disable_filtering"),subLabel:f("lng_settings_sensitive_about"),checked:Boolean(l),disabled:!i,onCheck:E})))})),Ga=a(14);var qa=Object(n.h)(Object(c.h)(e=>({languages:e.settings.byKey.languages,language:e.settings.byKey.language}),(e,t)=>Object(b.l)(t,["loadLanguages","setSettingOption"]))(({isActive:e,onScreenSelect:t,onReset:a,languages:c,language:s,loadLanguages:o,setSettingOption:l})=>{const[i,d]=Object(n.r)(s),[m,u,b]=Object(Ue.a)();Object(n.n)(()=>{o()},[o]);const h=Object(n.m)(e=>{d(e),u(),Object(Ga.d)(e,()=>{b(),l({language:e})})},[u,b,l]),g=Object(n.p)(()=>c?function(e){const t=(window.navigator.language||"en").toLowerCase(),a=t.substr(0,2);return e.map(({langCode:e,nativeName:t,name:a})=>({value:e,label:t,subLabel:a})).sort(e=>!t||e.value!==t&&e.value!==a?0:-1)}(c):void 0,[c]);return Object(A.a)(e,a,t,r.n.Language),n.a.createElement("div",{className:"settings-content settings-item settings-language custom-scroll"},g?n.a.createElement(ze.a,{name:"keyboard-send-settings",options:g,selected:i,loadingOption:m?i:void 0,onChange:h}):n.a.createElement(ge.a,null))}));function za(e){switch(e){case r.n.PrivacyPhoneNumber:case r.n.PrivacyPhoneNumberAllowedContacts:case r.n.PrivacyPhoneNumberDeniedContacts:return"phoneNumber";case r.n.PrivacyLastSeen:case r.n.PrivacyLastSeenAllowedContacts:case r.n.PrivacyLastSeenDeniedContacts:return"lastSeen";case r.n.PrivacyProfilePhoto:case r.n.PrivacyProfilePhotoAllowedContacts:case r.n.PrivacyProfilePhotoDeniedContacts:return"profilePhoto";case r.n.PrivacyForwarding:case r.n.PrivacyForwardingAllowedContacts:case r.n.PrivacyForwardingDeniedContacts:return"forwards";case r.n.PrivacyGroupChats:case r.n.PrivacyGroupChatsAllowedContacts:case r.n.PrivacyGroupChatsDeniedContacts:return"chatInvite"}}var _a=Object(n.h)(Object(c.h)((e,{screen:t})=>{let a;const{chats:{byId:n},settings:{privacy:c}}=e;switch(t){case r.n.PrivacyPhoneNumber:a=c.phoneNumber;break;case r.n.PrivacyLastSeen:a=c.lastSeen;break;case r.n.PrivacyProfilePhoto:a=c.profilePhoto;break;case r.n.PrivacyForwarding:a=c.forwards;break;case r.n.PrivacyGroupChats:a=c.chatInvite}return a?{...a,chatsById:n}:{}},(e,t)=>Object(b.l)(t,["setPrivacyVisibility"]))(({screen:e,isActive:t,onScreenSelect:a,onReset:c,visibility:s,allowUserIds:o,allowChatIds:l,blockUserIds:i,blockChatIds:d,chatsById:m,setPrivacyVisibility:u})=>{const b=Object(F.a)(),h=Object(n.p)(()=>{switch(e){case r.n.PrivacyProfilePhoto:case r.n.PrivacyGroupChats:return[{value:"everybody",label:b("P2PEverybody")},{value:"contacts",label:b("P2PContacts")}];default:return[{value:"everybody",label:b("P2PEverybody")},{value:"contacts",label:b("P2PContacts")},{value:"nobody",label:b("P2PNobody")}]}},[b,e]),g={shouldShowDenied:"nobody"!==s,shouldShowAllowed:"everybody"!==s},p=za(e),v=Object(n.p)(()=>{switch(e){case r.n.PrivacyPhoneNumber:return b("PrivacyPhoneTitle");case r.n.PrivacyLastSeen:return b("LastSeenTitle");case r.n.PrivacyProfilePhoto:return b("PrivacyProfilePhotoTitle");case r.n.PrivacyForwarding:return b("PrivacyForwardsTitle");case r.n.PrivacyGroupChats:return b("WhoCanAddMe");default:return}},[b,e]);Object(A.a)(t,c,a,e);const O=Object(n.p)(()=>{switch(e){case r.n.PrivacyLastSeen:return b("CustomHelp");default:return}},[b,e]),E=(()=>{switch(e){case r.n.PrivacyPhoneNumber:return r.n.PrivacyPhoneNumberAllowedContacts;case r.n.PrivacyLastSeen:return r.n.PrivacyLastSeenAllowedContacts;case r.n.PrivacyProfilePhoto:return r.n.PrivacyProfilePhotoAllowedContacts;case r.n.PrivacyForwarding:return r.n.PrivacyForwardingAllowedContacts;default:return r.n.PrivacyGroupChatsAllowedContacts}})(),f=(()=>{switch(e){case r.n.PrivacyPhoneNumber:return r.n.PrivacyPhoneNumberDeniedContacts;case r.n.PrivacyLastSeen:return r.n.PrivacyLastSeenDeniedContacts;case r.n.PrivacyProfilePhoto:return r.n.PrivacyProfilePhotoDeniedContacts;case r.n.PrivacyForwarding:return r.n.PrivacyForwardingDeniedContacts;default:return r.n.PrivacyGroupChatsDeniedContacts}})(),j=Object(n.p)(()=>o&&l&&m?l.reduce((e,t)=>e+(m[t]?m[t].membersCount:0),o.length):0,[l,o,m]),C=Object(n.p)(()=>i&&d&&m?d.reduce((e,t)=>e+(m[t]?m[t].membersCount:0),i.length):0,[d,i,m]),y=Object(n.m)(e=>{u({privacyKey:p,visibility:e})},[p,u]);return n.a.createElement("div",{className:"settings-content custom-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header",dir:b.isRtl?"rtl":void 0},v),n.a.createElement(ze.a,{name:"visibility-"+p,options:h,onChange:y,selected:s}),O&&n.a.createElement("p",{className:"settings-item-description-larger",dir:b.isRtl?"rtl":void 0},O)),n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:b.isRtl?"rtl":void 0},b("PrivacyExceptions")),g.shouldShowAllowed&&n.a.createElement(Ee.a,{narrow:!0,icon:"add-user",onClick:()=>{a(E)}},n.a.createElement("div",{className:"multiline-menu-item full-size"},j>0&&n.a.createElement("span",{className:"date",dir:"auto"},"+",j),n.a.createElement("span",{className:"title"},b("AlwaysShareWith")),n.a.createElement("span",{className:"subtitle"},b("EditAdminAddUsers")))),g.shouldShowDenied&&n.a.createElement(Ee.a,{narrow:!0,icon:"delete-user",onClick:()=>{a(f)}},n.a.createElement("div",{className:"multiline-menu-item full-size"},C>0&&n.a.createElement("span",{className:"date",dir:"auto"},"−",C),n.a.createElement("span",{className:"title"},b("NeverShareWith")),n.a.createElement("span",{className:"subtitle"},b("EditAdminAddUsers"))))))}));function Ha(e){return[e.region,e.country].filter(Boolean).join(", ")}function $a(e){return`${e.deviceModel}${e.deviceModel?", ":""} ${e.platform} ${e.systemVersion}`}var Va=Object(n.h)(Object(c.h)(e=>({activeSessions:e.activeSessions}),(e,t)=>Object(b.l)(t,["loadAuthorizations","terminateAuthorization","terminateAllAuthorizations"]))(({isActive:e,onScreenSelect:t,onReset:a,activeSessions:c,loadAuthorizations:s,terminateAuthorization:o,terminateAllAuthorizations:l})=>{const[i,d,m]=Object(Ue.a)();Object(n.n)(()=>{s()},[s]);const u=Object(n.m)(e=>{o({hash:e})},[o]),b=Object(n.m)(()=>{m(),l()},[m,l]),h=Object(n.p)(()=>c.find(e=>e.isCurrent),[c]),g=Object(n.p)(()=>c.filter(e=>!e.isCurrent),[c]),p=Object(F.a)();function v(e){return n.a.createElement(Ee.a,{key:e.hash,ripple:!0,narrow:!0,contextActions:[{title:"Terminate",icon:"stop",handler:()=>{u(e.hash)}}]},n.a.createElement("div",{className:"multiline-menu-item full-size",dir:"auto"},n.a.createElement("span",{className:"date"},Object(B.g)(p,1e3*e.dateActive)),n.a.createElement("span",{className:"title"},e.appName),n.a.createElement("span",{className:"subtitle black tight"},$a(e)),n.a.createElement("span",{className:"subtitle"},e.ip," - ",Ha(e))))}return Object(A.a)(e,a,t,r.n.PrivacyActiveSessions),n.a.createElement("div",{className:"settings-content custom-scroll"},h&&(E=h,n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:p.isRtl?"rtl":void 0},p("AuthSessions.CurrentSession")),n.a.createElement(Ee.a,{narrow:!0,inactive:!0},n.a.createElement("div",{className:"multiline-menu-item",dir:"auto"},n.a.createElement("span",{className:"title",dir:"auto"},E.appName),n.a.createElement("span",{className:"subtitle black tight"},$a(E)),n.a.createElement("span",{className:"subtitle"},E.ip," - ",Ha(E)))),n.a.createElement(Ee.a,{className:"destructive mb-0",icon:"stop",ripple:!0,narrow:!0,onClick:d},p("TerminateAllSessions")))),g&&(O=g,n.a.createElement("div",{className:"settings-item"},n.a.createElement("h4",{className:"settings-item-header mb-4",dir:p.isRtl?"rtl":void 0},p("OtherSessions")),O.map(v))),g&&n.a.createElement(Pe.a,{isOpen:i,onClose:m,text:"Are you sure you want to terminate all other sessions?",confirmLabel:"Terminate All Other Sessions",confirmHandler:b,confirmIsDestructive:!0}));var O,E}));var Wa=Object(n.h)(Object(c.h)(e=>{const{chats:{byId:t},users:{byId:a},blocked:{ids:n}}=e;return{chatsByIds:t,usersByIds:a,blockedIds:n}},(e,t)=>Object(b.l)(t,["unblockContact"]))(({isActive:e,onScreenSelect:t,onReset:a,chatsByIds:c,usersByIds:s,blockedIds:l,unblockContact:i})=>{const d=Object(n.m)(e=>{i({contactId:e})},[i]),m=Object(F.a)();return Object(A.a)(e,a,t,r.n.PrivacyBlockedUsers),n.a.createElement("div",{className:"settings-fab-wrapper"},n.a.createElement("div",{className:"settings-content infinite-scroll"},n.a.createElement("div",{className:"settings-item"},n.a.createElement("p",{className:"settings-item-description-larger mt-0 mb-2",dir:m.isRtl?"rtl":void 0},m("BlockedUsersInfo"))),n.a.createElement("div",{className:"chat-list custom-scroll"},l&&l.length?n.a.createElement("div",{className:"scroll-container"},l.map((e,t)=>function(e,t,a){const r=Object(u.ob)(e),l=r?s[e]:void 0,i=r?void 0:c[e],b=Object(W.a)("Chat chat-item-clickable blocked-list-item",r?"private":"group");return n.a.createElement(Ee.a,{key:e,className:b,ripple:!0,narrow:!0,contextActions:[{title:"Unblock",icon:"unlock",handler:()=>{d(e)}}],style:`top: ${(a+t)*o.k}px;`},n.a.createElement(U.a,{size:"medium",user:l,chat:i}),n.a.createElement("div",{className:"contact-info",dir:"auto"},n.a.createElement("h3",{dir:"auto"},Object(x.a)((r?Object(u.bb)(l):Object(u.k)(m,i))||"")),l&&l.phoneNumber&&n.a.createElement("div",{className:"contact-phone",dir:"auto"},Object(qt.c)(l.phoneNumber)),l&&!l.phoneNumber&&l.username&&n.a.createElement("div",{className:"contact-username",dir:"auto"},"@",l.username)))}(e,t,0))):l&&!l.length?n.a.createElement("div",{className:"no-results",dir:"auto"},"List is empty"):n.a.createElement(ge.a,{key:"loading"}))),n.a.createElement(Ht.a,{isShown:!0,onClick:()=>{},className:"not-implemented",ariaLabel:"Add a blocked user"},n.a.createElement("i",{className:"icon-add"})))})),Ka=a(133);var Ya=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(m.c)(e,"🔐")}))(({isActive:e,onReset:t,animatedEmoji:a,onScreenSelect:c})=>{const s=Object(F.a)();return Object(A.a)(e,t,c,r.n.TwoFaEnabled),n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ka.a,{sticker:a}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},Object(x.a)(s("EnabledPasswordText"),["br"]))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(Ee.a,{icon:"edit",onClick:()=>c(r.n.TwoFaChangePasswordCurrent)},s("ChangePassword")),n.a.createElement(Ee.a,{icon:"password-off",onClick:()=>c(r.n.TwoFaTurnOff)},s("TurnPasswordOff")),n.a.createElement(Ee.a,{icon:"email",onClick:()=>c(r.n.TwoFaRecoveryEmailCurrentPassword)},s("SetRecoveryEmail"))))})),Qa=a(151),Za=a(152);var Ja=Object(n.h)(({screen:e,isActive:t,onScreenSelect:a,onReset:c,error:s,isLoading:r,expectedPassword:o,placeholder:l="Current Password",hint:i,submitLabel:d,clearError:m,onSubmit:u})=>{const[b,h]=Object(n.r)(""),[g,p]=Object(n.r)(!1),v=Object(n.m)(e=>{o&&e!==o?h("Passwords Should Be Equal"):u(e)},[u,o]),O=Object(n.m)(()=>{m&&m(),h("")},[m]),E=Object(F.a)();return Object(A.a)(t,c,a,e),n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Qa.a,{isBig:!0,isPasswordVisible:g})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(Za.a,{error:b||s,hint:i,placeholder:l,submitLabel:d||E("Next"),clearError:O,isLoading:r,isPasswordVisible:g,onChangePasswordVisibility:p,onSubmit:v})))});var Xa=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(m.c)(e,"🔐")}))(({isActive:e,onScreenSelect:t,onReset:a,animatedEmoji:c,onStart:s})=>{const o=Object(F.a)();return Object(A.a)(e,a,t,r.n.TwoFaDisabled),n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ka.a,{sticker:c}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},o("SetAdditionalPasswordInfo"))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(D.a,{onClick:s},o("EditAdminTransferSetPassword"))))}));const en=l.l?550:400;var tn=Object(n.h)(Object(c.h)((e,{icon:t})=>({animatedEmoji:Object(m.c)(e,"email"===t?"💌":"💡")}))(({animatedEmoji:e,type:t="text",isLoading:a,error:c,placeholder:s,shouldConfirm:r,clearError:o,onSubmit:i,isActive:d,onScreenSelect:m,onReset:u,screen:b})=>{const h=Object(n.q)(null),[g,p]=Object(n.r)(""),[v,O,E]=Object(Ue.a)(!1);Object(n.n)(()=>{l.n||setTimeout(()=>{h.current.focus()},en)},[]);const f=Object(F.a)();return Object(A.a)(d,u,m,b),n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ka.a,{sticker:e})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement("form",{action:"",onSubmit:e=>{e.preventDefault(),h.current&&i(g)}},n.a.createElement(ve.a,{ref:h,value:g,inputMode:t,label:s,error:c,onChange:e=>{c&&o&&o(),p(e.target.value)}}),g?n.a.createElement(D.a,{type:"submit",isLoading:a,ripple:!0},f("Continue")):n.a.createElement(D.a,{isText:!0,isLoading:a,ripple:!0,onClick:r?O:()=>{i()}},f("YourEmailSkip"))),r&&n.a.createElement(pe.a,{className:"narrow",isOpen:v,title:f("YourEmailSkipWarning"),onClose:E},Object(x.a)(f("YourEmailSkipWarningText"),["br","simple_markdown"]),n.a.createElement("div",{className:"dialog-buttons"},n.a.createElement(D.a,{color:"danger",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:()=>{E(),i()}},f("YourEmailSkip")),n.a.createElement(D.a,{color:"primary",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:E},f("Cancel"))))))}));var an=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(m.c)(e,"🥳")}))(({isActive:e,onReset:t,animatedEmoji:a,onScreenSelect:c})=>{const s=Object(F.a)();return Object(A.a)(e,t,c,r.n.TwoFaCongratulations),n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ka.a,{sticker:a}),n.a.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},s("TwoStepVerificationPasswordSetInfo"))),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(D.a,{onClick:()=>{c(r.n.Privacy)}},s("TwoStepVerificationPasswordReturnSettings"))))}));const nn=l.l?550:400;var cn=Object(n.h)(Object(c.h)(e=>({animatedEmoji:Object(m.c)(e,"💌"),codeLength:e.twoFaSettings.waitingEmailCodeLength}))(({animatedEmoji:e,codeLength:t,isLoading:a,error:c,clearError:s,onSubmit:r,isActive:o,onScreenSelect:i,onReset:d,screen:m})=>{const u=Object(n.q)(null),[b,h]=Object(n.r)("");Object(n.n)(()=>{l.n||setTimeout(()=>{u.current.focus()},nn)},[]);const g=Object(F.a)();Object(A.a)(o,d,i,m);return n.a.createElement("div",{className:"settings-content two-fa custom-scroll"},n.a.createElement("div",{className:"settings-content-header"},n.a.createElement(Ka.a,{sticker:e})),n.a.createElement("div",{className:"settings-item pt-0 no-border"},n.a.createElement(ve.a,{value:b,ref:u,inputMode:"decimal",label:g("YourEmailCode"),error:c,onChange:e=>{c&&s&&s();const a=e.target.value.slice(0,t);a.length===t&&r(a),h(a),e.target.value=a}}),a&&n.a.createElement(ge.a,null)))}));var sn=Object(n.h)(Object(c.h)(e=>({...e.twoFaSettings}),(e,t)=>Object(b.l)(t,["updatePassword","updateRecoveryEmail","clearPassword","provideTwoFaEmailCode","checkPassword","clearTwoFaError"]))(({currentScreen:e,shownScreen:t,state:a,hint:c,isLoading:s,error:o,waitingEmailCodeLength:l,dispatch:i,isActive:d,onScreenSelect:m,onReset:u,updatePassword:b,checkPassword:h,clearTwoFaError:g,updateRecoveryEmail:p,provideTwoFaEmailCode:v,clearPassword:O})=>{Object(n.n)(()=>{l&&(e===r.n.TwoFaNewPasswordEmail?m(r.n.TwoFaNewPasswordEmailCode):e===r.n.TwoFaRecoveryEmail&&m(r.n.TwoFaRecoveryEmailCode))},[e,m,l]);const E=Object(n.m)(()=>{i({type:"reset"}),m(r.n.TwoFaNewPassword)},[i,m]),f=Object(n.m)(e=>{i({type:"setPassword",payload:e}),m(r.n.TwoFaNewPasswordConfirm)},[i,m]),j=Object(n.m)(()=>{m(r.n.TwoFaNewPasswordHint)},[m]),C=Object(n.m)(e=>{i({type:"setHint",payload:e}),m(r.n.TwoFaNewPasswordEmail)},[i,m]),y=Object(n.m)(e=>{i({type:"setEmail",payload:e}),b({...a,email:e,onSuccess:()=>{m(r.n.TwoFaCongratulations)}})},[i,m,a,b]),k=Object(n.m)(e=>{i({type:"setCurrentPassword",payload:e}),h({currentPassword:e,onSuccess:()=>{m(r.n.TwoFaChangePasswordNew)}})},[h,i,m]),N=Object(n.m)(e=>{i({type:"setPassword",payload:e}),m(r.n.TwoFaChangePasswordConfirm)},[i,m]),w=Object(n.m)(()=>{m(r.n.TwoFaChangePasswordHint)},[m]),S=Object(n.m)(e=>{i({type:"setHint",payload:e}),b({...a,hint:e,onSuccess:()=>{m(r.n.TwoFaCongratulations)}})},[i,m,a,b]),I=Object(n.m)(e=>{O({currentPassword:e,onSuccess:()=>{m(r.n.Privacy)}})},[O,m]),P=Object(n.m)(e=>{i({type:"setCurrentPassword",payload:e}),h({currentPassword:e,onSuccess:()=>{m(r.n.TwoFaRecoveryEmail)}})},[h,i,m]),M=Object(n.m)(e=>{i({type:"setEmail",payload:e}),p({...a,email:e,onSuccess:()=>{m(r.n.TwoFaCongratulations)}})},[i,m,a,p]),A=Object(n.m)(e=>{v({code:e})},[v]),L=Object(F.a)();switch(e){case r.n.TwoFaDisabled:return n.a.createElement(Xa,{onStart:E,onScreenSelect:m,isActive:d||[r.n.TwoFaNewPassword,r.n.TwoFaNewPasswordConfirm,r.n.TwoFaNewPasswordHint,r.n.TwoFaNewPasswordEmail,r.n.TwoFaNewPasswordEmailCode,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaNewPassword:return n.a.createElement(Ja,{screen:e,placeholder:L("PleaseEnterPassword"),submitLabel:L("Continue"),onSubmit:f,onScreenSelect:m,isActive:d||[r.n.TwoFaNewPasswordConfirm,r.n.TwoFaNewPasswordHint,r.n.TwoFaNewPasswordEmail,r.n.TwoFaNewPasswordEmailCode,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaNewPasswordConfirm:return n.a.createElement(Ja,{screen:e,expectedPassword:a.password,placeholder:L("PleaseReEnterPassword"),submitLabel:L("Continue"),onSubmit:j,onScreenSelect:m,isActive:d||[r.n.TwoFaNewPasswordHint,r.n.TwoFaNewPasswordEmail,r.n.TwoFaNewPasswordEmailCode,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaNewPasswordHint:return n.a.createElement(tn,{icon:"hint",placeholder:L("PasswordHintPlaceholder"),onSubmit:C,screen:e,onScreenSelect:m,isActive:d||[r.n.TwoFaNewPasswordEmail,r.n.TwoFaNewPasswordEmailCode,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaNewPasswordEmail:return n.a.createElement(tn,{icon:"email",type:"email",isLoading:s,error:o,clearError:g,placeholder:L("RecoveryEmailTitle"),shouldConfirm:!0,onSubmit:y,screen:e,onScreenSelect:m,isActive:d||[r.n.TwoFaNewPasswordEmailCode,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaNewPasswordEmailCode:return n.a.createElement(cn,{isLoading:s,error:o,clearError:g,onSubmit:A,screen:e,onScreenSelect:m,isActive:d||t===r.n.TwoFaCongratulations,onReset:u});case r.n.TwoFaCongratulations:return n.a.createElement(an,{onScreenSelect:m,isActive:d,onReset:u});case r.n.TwoFaEnabled:return n.a.createElement(Ya,{onScreenSelect:m,isActive:d||[r.n.TwoFaChangePasswordCurrent,r.n.TwoFaChangePasswordNew,r.n.TwoFaChangePasswordConfirm,r.n.TwoFaChangePasswordHint,r.n.TwoFaTurnOff,r.n.TwoFaRecoveryEmailCurrentPassword,r.n.TwoFaRecoveryEmail,r.n.TwoFaRecoveryEmailCode,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaChangePasswordCurrent:return n.a.createElement(Ja,{screen:e,isLoading:s,error:o,clearError:g,hint:c,onSubmit:k,onScreenSelect:m,isActive:d||[r.n.TwoFaChangePasswordNew,r.n.TwoFaChangePasswordConfirm,r.n.TwoFaChangePasswordHint,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaChangePasswordNew:return n.a.createElement(Ja,{screen:e,placeholder:L("PleaseEnterNewFirstPassword"),onSubmit:N,onScreenSelect:m,isActive:d||[r.n.TwoFaChangePasswordConfirm,r.n.TwoFaChangePasswordHint,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaChangePasswordConfirm:return n.a.createElement(Ja,{screen:e,expectedPassword:a.password,placeholder:L("PleaseReEnterPassword"),onSubmit:w,onScreenSelect:m,isActive:d||[r.n.TwoFaChangePasswordHint,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaChangePasswordHint:return n.a.createElement(tn,{isLoading:s,error:o,clearError:g,icon:"hint",placeholder:L("PasswordHintPlaceholder"),onSubmit:S,onScreenSelect:m,isActive:d||t===r.n.TwoFaCongratulations,onReset:u,screen:e});case r.n.TwoFaTurnOff:return n.a.createElement(Ja,{isLoading:s,error:o,clearError:g,hint:c,onSubmit:I,onScreenSelect:m,isActive:d,onReset:u,screen:e});case r.n.TwoFaRecoveryEmailCurrentPassword:return n.a.createElement(Ja,{screen:e,isLoading:s,error:o,clearError:g,hint:c,onSubmit:P,onScreenSelect:m,isActive:d||[r.n.TwoFaRecoveryEmail,r.n.TwoFaRecoveryEmailCode,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaRecoveryEmail:return n.a.createElement(tn,{screen:e,icon:"email",type:"email",placeholder:L("RecoveryEmailTitle"),onSubmit:M,onScreenSelect:m,isActive:d||[r.n.TwoFaRecoveryEmailCode,r.n.TwoFaCongratulations].includes(t),onReset:u});case r.n.TwoFaRecoveryEmailCode:return n.a.createElement(cn,{screen:e,isLoading:s,error:o,clearError:g,onSubmit:A,onScreenSelect:m,isActive:d||t===r.n.TwoFaCongratulations,onReset:u});default:return}})),rn=a(170);function on(e,t){const{privacy:a}=e.settings;switch(t){case r.n.PrivacyPhoneNumberAllowedContacts:case r.n.PrivacyPhoneNumberDeniedContacts:return a.phoneNumber;case r.n.PrivacyLastSeenAllowedContacts:case r.n.PrivacyLastSeenDeniedContacts:return a.lastSeen;case r.n.PrivacyProfilePhotoAllowedContacts:case r.n.PrivacyProfilePhotoDeniedContacts:return a.profilePhoto;case r.n.PrivacyForwardingAllowedContacts:case r.n.PrivacyForwardingDeniedContacts:return a.forwards;case r.n.PrivacyGroupChatsDeniedContacts:case r.n.PrivacyGroupChatsAllowedContacts:return a.chatInvite}}var ln=Object(n.h)(Object(c.h)((e,{screen:t})=>{const{chats:{byId:a,listIds:n,orderedPinnedIds:c},currentUserId:s}=e;return{currentUserId:s,chatsById:a,listIds:n.active,orderedPinnedIds:c.active,archivedPinnedIds:c.archived,archivedListIds:n.archived,settings:on(e,t)}},(e,t)=>Object(b.l)(t,["setPrivacySettings"]))(({currentUserId:e,isAllowList:t,screen:a,settings:c,chatsById:s,listIds:o,orderedPinnedIds:l,archivedListIds:i,archivedPinnedIds:d,setPrivacySettings:m,isActive:b,onScreenSelect:h,onReset:g})=>{const p=Object(F.a)(),v=Object(n.p)(()=>c?t?[...c.allowUserIds,...c.allowChatIds]:[...c.blockUserIds,...c.blockChatIds]:[],[t,c]),[O,E]=Object(n.r)(""),[f,j]=Object(n.r)(!1),[C,y]=Object(n.r)(v),k=Object(n.p)(()=>{const e=o?Object(u.Fb)(s,o,l,"all"):void 0,t=i?Object(u.Fb)(s,i,d,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]},[s,o,l,i,d]),N=Object(n.p)(()=>{if(k)return k.filter(t=>(Object(u.ob)(t.id)&&t.id!==e||Object(u.nb)(t))&&(!O||Object(ue.a)(Object(u.k)(p,t),O)||v.includes(t.id))).map(({id:e})=>e)},[k,e,p,O,v]),w=Object(n.m)(e=>{y(e),j(!0)},[]),S=Object(n.m)(()=>{m({privacyKey:za(a),isAllowList:Boolean(t),contactsIds:C}),h(r.n.Privacy)},[t,C,h,a,m]);return Object(A.a)(b,g,h,a),n.a.createElement("div",{className:"NewChat-inner step-1"},n.a.createElement(rn.a,{itemIds:N||[],selectedIds:C,filterValue:O,filterPlaceholder:p(t?"AlwaysShareWithPlaceholder":"NeverShareWithPlaceholder"),searchInputId:"new-group-picker-search",onSelectedIdsChange:w,onFilterChange:E}),n.a.createElement(Ht.a,{isShown:f,onClick:S,ariaLabel:p(t?"AlwaysShareWithTitle":"NeverShareWithTitle")},n.a.createElement("i",{className:"icon-arrow-right"})))}));a(285);const dn=Object.keys(r.n).length/2,mn=[r.n.TwoFaDisabled,r.n.TwoFaNewPassword,r.n.TwoFaNewPasswordConfirm,r.n.TwoFaNewPasswordHint,r.n.TwoFaNewPasswordEmail,r.n.TwoFaNewPasswordEmailCode,r.n.TwoFaCongratulations,r.n.TwoFaEnabled,r.n.TwoFaChangePasswordCurrent,r.n.TwoFaChangePasswordNew,r.n.TwoFaChangePasswordConfirm,r.n.TwoFaChangePasswordHint,r.n.TwoFaTurnOff,r.n.TwoFaRecoveryEmailCurrentPassword,r.n.TwoFaRecoveryEmail,r.n.TwoFaRecoveryEmailCode],un=[r.n.Folders,r.n.FoldersCreateFolder,r.n.FoldersEditFolder,r.n.FoldersIncludedChats,r.n.FoldersExcludedChats],bn=[r.n.PrivacyBlockedUsers,r.n.PrivacyActiveSessions],hn=[r.n.PrivacyPhoneNumberAllowedContacts,r.n.PrivacyPhoneNumberDeniedContacts],gn=[r.n.PrivacyLastSeenAllowedContacts,r.n.PrivacyLastSeenDeniedContacts],pn=[r.n.PrivacyProfilePhotoAllowedContacts,r.n.PrivacyProfilePhotoDeniedContacts],vn=[r.n.PrivacyForwardingAllowedContacts,r.n.PrivacyForwardingDeniedContacts],On=[r.n.PrivacyGroupChatsAllowedContacts,r.n.PrivacyGroupChatsDeniedContacts];var En=Object(n.h)(({isActive:e,currentScreen:t,onScreenSelect:a,onReset:c,shouldSkipTransition:s})=>{const[o,i]=Pt(Bt,Dt),[d,m]=Pt(Ut,xt),u=Object(n.m)(()=>{t!==r.n.FoldersCreateFolder&&t!==r.n.FoldersEditFolder||setTimeout(()=>{i({type:"reset"})},200),t!==r.n.FoldersIncludedChats&&t!==r.n.FoldersExcludedChats?c():"create"===o.mode?a(r.n.FoldersCreateFolder):a(r.n.FoldersEditFolder)},[o.mode,i,t,c,a]),b=Object(n.m)(()=>{i({type:"saveFilters"}),u()},[i,u]);function h(c,s,l){return n.a.createElement(n.a.Fragment,null,n.a.createElement(Gt,{currentScreen:t,onReset:u,onSaveFilter:b,editedFolderId:o.folderId}),function(c,s){const l={[r.n.PrivacyPhoneNumber]:hn.includes(s),[r.n.PrivacyLastSeen]:gn.includes(s),[r.n.PrivacyProfilePhoto]:pn.includes(s),[r.n.PrivacyForwarding]:vn.includes(s),[r.n.PrivacyGroupChats]:On.includes(s)},b=mn.includes(s),h=un.includes(s),g=bn.includes(s)||b||Object.keys(l).includes(s.toString())||Object.values(l).find(e=>!0===e);switch(t){case r.n.Main:return n.a.createElement(zt,{onScreenSelect:a,isActive:e,onReset:u});case r.n.EditProfile:return n.a.createElement(Qt,{onScreenSelect:a,isActive:e&&c,onReset:u});case r.n.General:return n.a.createElement(Ea,{onScreenSelect:a,isActive:c||s===r.n.GeneralChatBackgroundColor||s===r.n.GeneralChatBackground||g||h,onReset:u});case r.n.Notifications:return n.a.createElement(xa,{onScreenSelect:a,isActive:c,onReset:u});case r.n.Privacy:return n.a.createElement(Ua,{onScreenSelect:a,isActive:c||g||b,onReset:u});case r.n.Language:return n.a.createElement(qa,{onScreenSelect:a,isActive:c,onReset:u});case r.n.GeneralChatBackground:return n.a.createElement(Aa,{onScreenSelect:a,isActive:c||s===r.n.GeneralChatBackgroundColor,onReset:u});case r.n.GeneralChatBackgroundColor:return n.a.createElement(Ba,{onScreenSelect:a,isActive:c,onReset:u});case r.n.PrivacyActiveSessions:return n.a.createElement(Va,{onScreenSelect:a,isActive:c,onReset:u});case r.n.PrivacyBlockedUsers:return n.a.createElement(Wa,{onScreenSelect:a,isActive:c,onReset:u});case r.n.PrivacyPhoneNumber:case r.n.PrivacyLastSeen:case r.n.PrivacyProfilePhoto:case r.n.PrivacyForwarding:case r.n.PrivacyGroupChats:return n.a.createElement(_a,{screen:t,onScreenSelect:a,isActive:c||l[t],onReset:u});case r.n.PrivacyPhoneNumberAllowedContacts:case r.n.PrivacyLastSeenAllowedContacts:case r.n.PrivacyProfilePhotoAllowedContacts:case r.n.PrivacyForwardingAllowedContacts:case r.n.PrivacyGroupChatsAllowedContacts:return n.a.createElement(ln,{isAllowList:!0,screen:t,onScreenSelect:a,isActive:c||l[t],onReset:u});case r.n.PrivacyPhoneNumberDeniedContacts:case r.n.PrivacyLastSeenDeniedContacts:case r.n.PrivacyProfilePhotoDeniedContacts:case r.n.PrivacyForwardingDeniedContacts:case r.n.PrivacyGroupChatsDeniedContacts:return n.a.createElement(ln,{screen:t,onScreenSelect:a,isActive:c,onReset:u});case r.n.Folders:case r.n.FoldersCreateFolder:case r.n.FoldersEditFolder:case r.n.FoldersIncludedChats:case r.n.FoldersExcludedChats:return n.a.createElement(la,{currentScreen:t,shownScreen:s,state:o,dispatch:i,isActive:c,onScreenSelect:a,onReset:u});case r.n.TwoFaDisabled:case r.n.TwoFaNewPassword:case r.n.TwoFaNewPasswordConfirm:case r.n.TwoFaNewPasswordHint:case r.n.TwoFaNewPasswordEmail:case r.n.TwoFaNewPasswordEmailCode:case r.n.TwoFaCongratulations:case r.n.TwoFaEnabled:case r.n.TwoFaChangePasswordCurrent:case r.n.TwoFaChangePasswordNew:case r.n.TwoFaChangePasswordConfirm:case r.n.TwoFaChangePasswordHint:case r.n.TwoFaTurnOff:case r.n.TwoFaRecoveryEmailCurrentPassword:case r.n.TwoFaRecoveryEmail:case r.n.TwoFaRecoveryEmailCode:return n.a.createElement(sn,{currentScreen:t,state:d,dispatch:m,shownScreen:s,isActive:c,onScreenSelect:a,onReset:u});default:return}}(c,l))}return n.a.createElement(T.a,{id:"Settings",name:s?"none":l.p,activeKey:t,renderCount:dn},h)});const fn=Object(V.h)(e=>e(),6e4,!0);var jn=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.contactList||{},{byId:a}=e.users;return{usersById:a,contactIds:t,serverTimeOffset:e.serverTimeOffset}},(e,t)=>Object(b.l)(t,["loadContactList","openChat"]))(({isActive:e,onReset:t,filter:a,usersById:c,contactIds:s,loadContactList:r,openChat:o,serverTimeOffset:i})=>{Object(n.n)(()=>{fn(()=>{r()})}),Object(A.a)(e,t);const d=Object(n.m)(e=>{o({id:e,shouldReplaceHistory:!0})},[o]),m=Object(n.p)(()=>{if(!s)return;const e=a?s.filter(e=>{const t=c[e];if(!t)return!1;const n=Object(u.bb)(t);return n&&Object(ue.a)(n,a)}):s;return Object(u.Jb)(e,c,void 0,i)},[s,a,c,i]),[b,h]=Object(be.a)(void 0,m,Boolean(a));return n.a.createElement(Oe.a,{items:b,onLoadMore:h,className:"chat-list custom-scroll"},b&&b.length?b.map(e=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable",onClick:()=>d(e),ripple:!l.l},n.a.createElement(fe.a,{userId:e,forceShowSelf:!0,avatarSize:"large"}))):b&&!b.length?n.a.createElement("p",{className:"no-results",key:"no-results",dir:"auto"},a.length?"No contacts matched your search.":"Contact list is empty."):n.a.createElement(ge.a,{key:"loading"}))}));const Cn=Object(V.h)(e=>e(),6e4,!0);var yn=Object(n.h)(Object(c.h)(e=>{const{userIds:t}=e.contactList||{},{byId:a}=e.users,{byId:n}=e.chats,{currentUserId:c}=e,{query:s,fetchingStatus:r,globalResults:o,localResults:l}=e.globalSearch,{userIds:i}=o||{},{userIds:d}=l||{};return{currentUserId:c,usersById:a,chatsById:n,localContactIds:t,searchQuery:s,isSearching:r&&r.chats,globalUserIds:i,localUserIds:d}},(e,t)=>Object(b.l)(t,["loadContactList","setGlobalSearchQuery"]))(({isChannel:e,isActive:t,selectedMemberIds:a,onSelectedMemberIdsChange:c,onNextStep:s,onReset:r,currentUserId:o,usersById:l,chatsById:i,localContactIds:d,searchQuery:m,isSearching:h,localUserIds:g,globalUserIds:p,loadContactList:v,setGlobalSearchQuery:O})=>{Object(n.n)(()=>{Cn(()=>{v()})});const E=Object(F.a)();Object(A.a)(t,r);const f=Object(n.m)(e=>{O({query:e})},[O]),j=Object(n.p)(()=>{const e=d?Object(u.Ib)(d.filter(e=>e!==o),i):[];if(!m)return e;const t=e.filter(e=>{const t=l[e];if(!t)return!1;const a=Object(u.bb)(t);return a&&Object(ue.a)(a,m)});return Object(u.Ib)(Object(b.o)([...t,...g||[],...p||[]]).filter(e=>{const t=l[e];return!t||!Object(u.Bb)(t)||t.canBeInvitedToGroup}),i,!1,a)},[d,i,m,g,p,a,o,l]),C=Object(n.m)(()=>{(a.length||e)&&(O({query:""}),s())},[a.length,e,O,s]);return n.a.createElement("div",{className:"NewChat step-1"},n.a.createElement("div",{className:"left-header"},n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:r,ariaLabel:"Return to Chat List"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,E("GroupAddMembers"))),n.a.createElement("div",{className:"NewChat-inner step-1"},n.a.createElement(rn.a,{itemIds:j,selectedIds:a,filterValue:m,filterPlaceholder:E("SendMessageTo"),searchInputId:"new-group-picker-search",isLoading:h,onSelectedIdsChange:c,onFilterChange:f}),n.a.createElement(Ht.a,{isShown:Boolean(a.length||e),onClick:C,ariaLabel:e?"Continue To Channel Info":"Continue To Group Info"},n.a.createElement("i",{className:"icon-arrow-right"}))))}));var kn=Object(n.h)(Object(c.h)(e=>{const{progress:t,error:a}=e.chatCreation||{};return{creationProgress:t,creationError:a}},(e,t)=>Object(b.l)(t,["createGroupChat","createChannel"]))(({isChannel:e,isActive:t,memberIds:a,onReset:c,creationProgress:s,creationError:o,createGroupChat:l,createChannel:i})=>{const d=Object(F.a)();Object(A.a)(t,c);const[m,u]=Object(n.r)(""),[b,h]=Object(n.r)(""),[g,p]=Object(n.r)(),[v,O]=Object(n.r)(),E=s===r.a.InProgress,f=Object(n.m)(e=>{const{value:t}=e.currentTarget,a=t.replace(/^\s+/,"");u(a),a!==t&&(e.currentTarget.value=a)},[]),j=Object(n.m)(e=>{h(e.currentTarget.value)},[]),C=Object(n.m)(()=>{m.length?a.length>199?O("Sorry, creating supergroups is not yet supported"):l({title:m,photo:g,memberIds:a}):O("Chat title can't be empty")},[m,a,l,g,"Chat title can't be empty","Sorry, creating supergroups is not yet supported"]),y=Object(n.m)(()=>{m.length?i({title:m,about:b,photo:g,memberIds:a}):O("Channel title can't be empty")},[m,i,b,g,a,"Channel title can't be empty"]);Object(n.n)(()=>{s===r.a.Complete&&c(!0)},[s,c]);const k=o||("Chat title can't be empty"!==v&&"Channel title can't be empty"!==v?v:void 0);return n.a.createElement("div",{className:"NewChat"},n.a.createElement("div",{className:"left-header"},n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:()=>c(),ariaLabel:"Return to member selection"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,d(e?"NewChannel":"NewGroup"))),n.a.createElement("div",{className:"NewChat-inner step-2"},n.a.createElement(_t.a,{onChange:p,title:d("AddPhoto")}),n.a.createElement(ve.a,{value:m,onChange:f,label:d(e?"EnterChannelName":"GroupName"),error:"Chat title can't be empty"===v||"Channel title can't be empty"===v?v:void 0}),e&&n.a.createElement(n.a.Fragment,null,n.a.createElement(ve.a,{value:b,onChange:j,label:d("DescriptionOptionalPlaceholder")}),n.a.createElement("p",{className:"note"},d("DescriptionInfo"))),k&&n.a.createElement("p",{className:"error"},k),a.length>0&&n.a.createElement(n.a.Fragment,null,n.a.createElement("h3",{className:"chat-members-heading"},d("GroupInfo.ParticipantCount",a.length,"i")),n.a.createElement("div",{className:"chat-members-list custom-scroll"},a.map(e=>n.a.createElement(Ee.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(fe.a,{userId:e})))))),n.a.createElement(Ht.a,{isShown:0!==m.length,onClick:e?y:C,disabled:E,ariaLabel:e?d("ChannelIntro.CreateChannel"):"Create Group"},E?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-arrow-right"})))}));a(286);const Nn=Object.keys(r.d).length/2;var wn=Object(n.h)(({isActive:e,isChannel:t=!1,content:a,onContentChange:c,onReset:s})=>{const[o,i]=Object(n.r)([]),d=Object(n.m)(()=>{c(t?r.d.NewChannelStep2:r.d.NewGroupStep2)},[t,c]);return n.a.createElement(T.a,{id:"NewChat",name:l.p,renderCount:Nn,activeKey:a},c=>{switch(a){case r.d.NewChannelStep1:case r.d.NewGroupStep1:return n.a.createElement(yn,{isChannel:t,isActive:e,selectedMemberIds:o,onSelectedMemberIdsChange:i,onNextStep:d,onReset:s});case r.d.NewChannelStep2:case r.d.NewGroupStep2:return n.a.createElement(kn,{isChannel:t,isActive:c&&e,memberIds:o,onReset:s});default:return}})}),Sn=a(195);a(287);var In=Object(n.h)(({isActive:e,onReset:t,onContentChange:a})=>{const c=Object(F.a)();return Object(A.a)(e,t,a,r.d.Archived),n.a.createElement("div",{className:"ArchivedChats"},n.a.createElement("div",{className:"left-header"},n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:t,ariaLabel:"Return to chat list"},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement("h3",null,c("ArchivedChats"))),n.a.createElement(Sn.a,{folderType:"archived",noChatsText:"Archive is empty.",isActive:e}))});const Pn={Down:!0,ArrowDown:!0,Up:!0,ArrowUp:!0,Left:!0,ArrowLeft:!0,Right:!0,ArrowRight:!0," ":!0,PageUp:!0,PageDown:!0,End:!0,Home:!0,Tab:!0};const Mn=e=>{e.preventDefault()};function Fn(e){Pn[e.key]&&!function(e){if(!(e&&e instanceof HTMLElement))return!1;const t=e,a=t.tagName.toLowerCase();if("textarea"===a)return!0;if("input"!==a)return!1;const n=t.getAttribute("type");return!!n&&["text","password","number","email","tel","url","search","date","datetime","datetime-local","time","month","week"].indexOf(n.toLowerCase())>-1}(e.target)&&Mn(e)}function An(){document.addEventListener("wheel",Mn,{passive:!1}),window.ontouchmove=Mn,document.onkeydown=Fn}function Ln(){document.removeEventListener("wheel",Mn),window.ontouchmove=null,document.onkeydown=null}var Rn=a(57),Tn=a(168);function Dn(e){return e?"lng_context_copy_selected":"lng_context_copy_text"}var Bn=a(179),xn=a(55);a(288);var Un=({isOpen:e,message:t,anchor:a,canSendNow:c,canReschedule:r,canReply:o,canEdit:l,canPin:i,canUnpin:d,canDelete:m,canReport:b,canForward:h,canFaveSticker:g,canUnfaveSticker:p,canCopy:v,canCopyLink:O,canSelect:E,onReply:f,onEdit:j,onPin:C,onUnpin:y,onForward:k,onDelete:N,onReport:w,onFaveSticker:S,onUnfaveSticker:I,onSelect:P,onSend:M,onReschedule:A,onClose:L,onCloseAnimationEnd:R,onCopyLink:T})=>{const D=function(e,t,a){const n=[],c=Object(u.P)(e),r=Object(u.H)(e)||(Object(u.T)(e)?void 0:Object(u.S)(e)),o=Object(u.E)(e,"inline"),l=r&&(o||Object(u.eb)(e))&&Tn.a,i=window.getSelection();if(l&&n.push({label:"lng_context_copy_image",handler:()=>{Promise.resolve(o?Rn.b(o,s.ApiMediaFormat.BlobUrl):r.blobUrl).then(Tn.b),t&&t()}}),c){const e=Boolean(i&&i.anchorNode&&i.anchorNode.parentNode&&i.anchorNode.parentNode.closest(".Message .content-inner")&&""!==i.toString().replace(/(?:\r\n|\r|\n)/g,""));n.push({label:Dn(e),handler:()=>{const a=e&&i?i.toString():c;Object(Tn.c)(a),t&&t()}})}return a&&n.push({label:"lng_context_copy_message_link",handler:()=>{a(),t&&t()}}),n}(t,L,O?T:void 0),B=Object(n.m)(()=>document.querySelector(`.active > .MessageList div[data-message-id="${t.id}"]`),[t.id]),x=Object(n.m)(()=>document.querySelector(".active > .MessageList"),[]),U=Object(n.m)(()=>document.querySelector(".MessageContextMenu .bubble"),[]),{positionX:G,positionY:q,style:z}=Object(Bn.a)(a,B,x,U,10,document.querySelector(".MiddleHeader").offsetHeight),H=Object(F.a)();return n.a.createElement(xn.a,{isOpen:e,positionX:G,positionY:q,style:z,className:"MessageContextMenu fluid",onClose:L,onCloseAnimationEnd:R},c&&n.a.createElement(_.a,{icon:"send-outline",onClick:M},H("MessageScheduleSend")),r&&n.a.createElement(_.a,{icon:"schedule",onClick:A},H("MessageScheduleEditTime")),o&&n.a.createElement(_.a,{icon:"reply",onClick:f},H("Reply")),l&&n.a.createElement(_.a,{icon:"edit",onClick:j},H("Edit")),g&&n.a.createElement(_.a,{icon:"favorite",onClick:S},H("AddToFavorites")),p&&n.a.createElement(_.a,{icon:"favorite",onClick:I},H("Stickers.RemoveFromFavorites")),v&&D.map(e=>n.a.createElement(_.a,{key:e.label,icon:"copy",onClick:e.handler},H(e.label))),i&&n.a.createElement(_.a,{icon:"pin",onClick:C},H("DialogPin")),d&&n.a.createElement(_.a,{icon:"unpin",onClick:y},H("DialogUnpin")),h&&n.a.createElement(_.a,{icon:"forward",onClick:k},H("Forward")),E&&n.a.createElement(_.a,{icon:"select",onClick:P},H("Common.Select")),b&&n.a.createElement(_.a,{icon:"flag",onClick:w},H("lng_context_report_msg")),m&&n.a.createElement(_.a,{destructive:!0,icon:"delete",onClick:N},H("Delete")))};var Gn=Object(n.h)(Object(c.h)((e,{message:t,messageListType:a})=>{const{threadId:n}=Object(m.z)(e)||{},{noOptions:c,canReply:s,canPin:r,canUnpin:o,canDelete:l,canReport:i,canEdit:d,canForward:u,canFaveSticker:b,canUnfaveSticker:h,canCopy:g,canCopyLink:p,canSelect:v}=n&&Object(m.b)(e,t,n)||{},O="pinned"===a,E="scheduled"===a;return{noOptions:c,canSendNow:E,canReschedule:E,canReply:!O&&!E&&s,canPin:!E&&r,canUnpin:!E&&o,canDelete:l,canReport:i,canEdit:!O&&d,canForward:!E&&u,canFaveSticker:!E&&b,canUnfaveSticker:!E&&h,canCopy:g,canCopyLink:!E&&p,canSelect:v}},(e,t)=>Object(b.l)(t,["setReplyingToId","setEditingId","pinMessage","openForwardMenu","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage"]))(({isOpen:e,messageListType:t,chatUsername:a,message:c,album:s,anchor:r,onClose:o,onCloseAnimationEnd:l,noOptions:i,canSendNow:d,canReschedule:m,canReply:u,canPin:b,canUnpin:h,canDelete:g,canReport:p,canEdit:v,canForward:O,canFaveSticker:E,canUnfaveSticker:f,canCopy:j,canCopyLink:C,canSelect:y,setReplyingToId:k,setEditingId:N,pinMessage:w,openForwardMenu:S,faveSticker:I,unfaveSticker:P,toggleMessageSelection:M,sendScheduledMessages:F,rescheduleMessage:A})=>{const{transitionClassNames:L}=Object(Y.a)(e,l,void 0,!1),[R,T]=Object(n.r)(!0),[D,x]=Object(n.r)(!1),[U,G]=Object(n.r)(!1),[q,z]=Object(n.r)(!1),[_,H,$]=Object(Ue.a)(),V=Object(n.m)(()=>{T(!1),x(!0)},[]),W=Object(n.m)(()=>{T(!1),G(!0)},[]),K=Object(n.m)(()=>{T(!1),o()},[o]),Q=Object(n.m)(()=>{x(!1),o()},[o]),Z=Object(n.m)(()=>{G(!1),o()},[o]),J=Object(n.m)(()=>{z(!1),o()},[o]),X=Object(n.m)(()=>{$(),o()},[$,o]),ee=Object(n.m)(()=>{k({messageId:c.id}),K()},[k,c.id,K]),te=Object(n.m)(()=>{N({messageId:c.id}),K()},[N,c.id,K]),ae=Object(n.m)(()=>{T(!1),z(!0)},[]),ne=Object(n.m)(()=>{w({messageId:c.id,isUnpin:!0}),K()},[w,c.id,K]),ce=Object(n.m)(()=>{if(K(),s&&s.messages){const e=s.messages.map(({id:e})=>e);S({fromChatId:c.chatId,messageIds:e})}else S({fromChatId:c.chatId,messageIds:[c.id]})},[S,c,K,s]),se=Object(n.m)(()=>{K(),I({sticker:c.content.sticker})},[K,c.content.sticker,I]),re=Object(n.m)(()=>{K(),P({sticker:c.content.sticker})},[K,c.content.sticker,P]),oe=Object(n.m)(()=>{const e=s&&s.messages?{messageId:c.id,childMessageIds:s.messages.map(({id:e})=>e),withShift:!1}:{messageId:c.id,withShift:!1};M(e),K()},[K,c.id,M,s]),le=Object(n.m)(()=>{F({chatId:c.chatId,id:c.id}),K()},[K,c.chatId,c.id,F]),ie=Object(n.m)(()=>{T(!1),H()},[H]),de=Object(n.m)(e=>{A({chatId:c.chatId,messageId:c.id,scheduledAt:Math.round(e.getTime()/1e3)})},[c.chatId,c.id,A]),me=Object(n.m)(()=>{Object(Tn.c)(`https://t.me/${a||"c/"+Math.abs(c.chatId)}/${c.id}`),K()},[a,K,c.chatId,c.id]);Object(n.n)(()=>(An(),Ln),[]);const ue=Object(n.p)(()=>(s?s.messages:[c]).map(({id:e})=>e),[s,c]);if(i)return void K();const be=new Date;return be.setFullYear(be.getFullYear()+1),n.a.createElement("div",{className:["ContextMenuContainer",L].join(" ")},n.a.createElement(Un,{message:c,isOpen:R,anchor:r,canSendNow:d,canReschedule:m,canReply:u,canDelete:g,canReport:p,canPin:b,canUnpin:h,canEdit:v,canForward:O,canFaveSticker:E,canUnfaveSticker:f,canCopy:j,canCopyLink:C,canSelect:y,onReply:ee,onEdit:te,onPin:ae,onUnpin:ne,onForward:ce,onDelete:V,onReport:W,onFaveSticker:se,onUnfaveSticker:re,onSelect:oe,onSend:le,onReschedule:ie,onClose:K,onCopyLink:me}),n.a.createElement(De,{isOpen:D,isSchedule:"scheduled"===t,onClose:Q,album:s,message:c}),n.a.createElement(_e,{isOpen:U,onClose:Z,messageIds:ue}),n.a.createElement(Be,{isOpen:q,messageId:c.id,chatId:c.chatId,onClose:J}),n.a.createElement(Re,{isOpen:_,withTimePicker:!0,selectedAt:1e3*c.date,maxAt:Object(B.k)(be),isFutureMode:!0,onClose:X,onSubmit:de}))}));a(289);var qn=Object(n.h)(Object(c.h)((e,{fromSticker:t})=>({stickerSet:Object(m.zb)(e,t.stickerSetId)}),(e,t)=>Object(b.l)(t,["loadStickers","toggleStickerSet","sendMessage"]))(({isOpen:e,fromSticker:t,stickerSet:a,onClose:c,loadStickers:s,toggleStickerSet:r,sendMessage:l})=>{const i=Object(n.q)(null),d=Object(F.a)(),{observe:m}=Object(ia.a)({rootRef:i,throttleMs:200,isDisabled:!e});Object(n.n)(()=>{if(e){const{stickerSetId:e,stickerSetAccessHash:a}=t;s({stickerSetId:e,stickerSetAccessHash:a})}},[e,t,s]);const u=Object(n.m)(e=>{e={...e,isPreloadedGlobally:!0},l({sticker:e}),c()},[c,l]),b=Object(n.m)(()=>{r({stickerSetId:t.stickerSetId}),c()},[t.stickerSetId,c,r]);return n.a.createElement(pe.a,{className:"StickerSetModal",isOpen:e,onClose:c,hasCloseButton:!0,title:a?Object(x.a)(a.title,["emoji","links"]):d("AccDescrStickerSet")},a&&a.stickers?n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{ref:i,className:"stickers custom-scroll"},a.stickers.map(e=>n.a.createElement(ga,{sticker:e,size:o.Kb,observeIntersection:m,onClick:u,clickArg:e}))),n.a.createElement("div",{className:"button-wrapper"},n.a.createElement(D.a,{size:"smaller",fluid:!0,color:a.installedDate?"danger":"primary",onClick:b},d(a.installedDate?"StickerPack.RemoveStickerCount":"StickerPack.AddStickerCount",a.count,"i")))):n.a.createElement(ge.a,null))})),zn=a(127);a(290);var _n=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t);return!a||a.isRestricted?{}:{chat:a,isMuted:Object(u.Hb)(a,Object(m.fb)(e),Object(m.eb)(e)),isPrivate:Object(u.ob)(a.id),canDeleteChat:Object(u.c)(a)}},(e,t)=>Object(b.l)(t,["updateChatMutedState","enterMessageSelectMode","sendBotCommand","restartBot"]))(({chatId:e,isOpen:t,anchor:a,isChannel:c,canStartBot:s,canRestartBot:r,canSubscribe:o,canSearch:i,canMute:d,canSelect:m,canLeave:u,chat:b,isPrivate:h,isMuted:g,canDeleteChat:p,onSubscribeChannel:v,onSearchClick:O,onClose:E,onCloseAnimationEnd:f,updateChatMutedState:j,enterMessageSelectMode:C,sendBotCommand:y,restartBot:k})=>{const[N,w]=Object(n.r)(!0),[S,I]=Object(n.r)(!1),{x:P,y:M}=a;Object(Y.a)(t,f,void 0,!1);const A=Object(n.m)(()=>{w(!1),I(!0)},[]),L=Object(n.m)(()=>{w(!1),E()},[E]),R=Object(n.m)(()=>{I(!1),E()},[E]),T=Object(n.m)(()=>{y({command:"/start"})},[y]),D=Object(n.m)(()=>{k({chatId:e})},[e,k]),B=Object(n.m)(()=>{j({chatId:e,isMuted:!g}),L()},[e,L,g,j]),x=Object(n.m)(()=>{v(),L()},[L,v]),U=Object(n.m)(()=>{O(),L()},[L,O]),G=Object(n.m)(()=>{C(),L()},[L,C]);Object(n.n)(()=>(An(),Ln),[]);const q=Object(F.a)();return n.a.createElement(zn.a,null,n.a.createElement("div",{className:"HeaderMenuContainer"},n.a.createElement(xn.a,{isOpen:N,positionX:"right",style:`left: ${P}px;top: ${M}px;`,onClose:L},l.l&&s&&n.a.createElement(_.a,{icon:"bots",onClick:T},q("BotStart")),l.l&&r&&n.a.createElement(_.a,{icon:"bots",onClick:D},q("BotRestart")),l.l&&o&&n.a.createElement(_.a,{icon:c?"channel":"group",onClick:x},q(c?"Subscribe":"Join Group")),l.l&&i&&n.a.createElement(_.a,{icon:"search",onClick:U},q("Search")),d&&n.a.createElement(_.a,{icon:g?"unmute":"mute",onClick:B},q(g?"ChatsUnmute":"ChatsMute")),m&&n.a.createElement(_.a,{icon:"select",onClick:G},q("ReportSelectMessages")),u&&n.a.createElement(_.a,{destructive:!0,icon:"delete",onClick:A},q(h?"Delete":p?"GroupInfo.DeleteAndExit":c?"LeaveChannel":"Group.LeaveGroup"))),b&&n.a.createElement(Ye.a,{isOpen:S,onClose:R,chat:b})))})),Hn=a(156);a(291);const $n=Object(V.a)(e=>e(),200,!1);var Vn=Object(n.h)(Object(c.h)(e=>{const t=Object(m.s)(e);if(!t)return{};const{query:a,results:n}=Object(m.B)(e)||{},{totalCount:c,foundIds:s}=n||{};return{chat:t,query:a,totalCount:c,foundIds:s,isHistoryCalendarOpen:Boolean(e.historyCalendarSelectedAt)}},(e,t)=>Object(b.l)(t,["setLocalTextSearchQuery","searchTextMessagesLocal","focusMessage","closeLocalTextSearch","openHistoryCalendar"]))(({isActive:e,chat:t,query:a,totalCount:c,foundIds:s,isHistoryCalendarOpen:r,setLocalTextSearchQuery:o,searchTextMessagesLocal:l,focusMessage:i,closeLocalTextSearch:d,openHistoryCalendar:m})=>{const u=Object(n.q)(null),[b,h]=Object(n.r)(0);Object(n.n)(()=>{const{visualViewport:e}=window;if(!e)return;const t=document.getElementById("Main"),a=()=>{const{activeElement:a}=document;if(a&&a===u.current){const{pageTop:a,height:n}=e;t.style.transform=`translateY(${a}px)`,t.style.height=n+"px",document.documentElement.scrollTop=a}else t.style.transform="",t.style.height=""};return e.addEventListener("resize",a),()=>{e.removeEventListener("resize",a)}},[]),Object(n.n)(()=>{t&&s&&s.length?(i({chatId:t.id,messageId:s[s.length-1]}),h(0)):h(-1)},[t,i,s]),Object(n.n)(()=>{Array.from(document.querySelectorAll("input")).forEach(t=>{t.disabled=Boolean(e&&t!==u.current)}),Array.from(document.querySelectorAll("div[contenteditable]")).forEach(t=>{t.contentEditable=e?"false":"true"})},[e]),Object(n.n)(()=>{e||u.current.blur()},[e]),Object(n.o)(()=>{document.querySelector("#MobileSearch input").blur()},[r]);const g=Object(n.m)(e=>{o({query:e}),e.length&&$n(l)},[l,o]),p=Object(n.m)(()=>{if(t&&s){const e=b+1;i({chatId:t.id,messageId:s[s.length-1-e]}),h(e)}},[t,b,i,s]),v=Object(n.m)(()=>{if(t&&s){const e=b-1;i({chatId:t.id,messageId:s[s.length-1-e]}),h(e)}},[t,b,i,s]);return n.a.createElement("div",{id:"MobileSearch",className:e?"active":""},n.a.createElement("div",{className:"header"},n.a.createElement(D.a,{size:"smaller",round:!0,color:"translucent",onClick:d},n.a.createElement("i",{className:"icon-arrow-left"})),n.a.createElement(Hn.a,{ref:u,value:a,onChange:g})),n.a.createElement("div",{className:"footer"},n.a.createElement("div",{className:"counter"},a?s&&s.length?`${b+1} of ${c}`:s&&!s.length?"No results":"":n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:()=>m({selectedAt:Object(B.k)(Date.now())}),ariaLabel:"Search messages by date"},n.a.createElement("i",{className:"icon-calendar"}))),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:p,disabled:!s||!s.length||b===s.length-1},n.a.createElement("i",{className:"icon-up"})),n.a.createElement(D.a,{round:!0,size:"smaller",color:"translucent",onClick:v,disabled:!s||!s.length||0===b},n.a.createElement("i",{className:"icon-down"}))))})),Wn=a(60),Kn=a(196),Yn=a(188),Qn=a(184),Zn=a(190);function Jn(e,t,a=0,n=!1,c=!1,s=!1){const r=e[s?"scrollLeft":"scrollTop"],o=r+e[s?"offsetWidth":"offsetHeight"],l="string"==typeof t?e.querySelectorAll(t):t,{length:i}=l,d=[];let m=!1;for(let e=0;e=r-a&&u<=o+a:i<=o+a&&u>=r-a)d.push(e),m=!0;else if(m&&!n)break}return{allElements:l,visibleIndexes:d}}var Xn=function(e,t,a=!1){const n=e[a?"scrollLeft":"scrollTop"],c=n+e[a?"offsetWidth":"offsetHeight"],s=t[a?"offsetLeft":"offsetTop"],r=s+t[a?"offsetWidth":"offsetHeight"];return s>n&&rc[c.length-1]?"start":"end";Object(ec.a)(n,s[t],e,10)}}var ac=a(132);a(292);var nc=Object(n.h)(({isOpen:e,filter:t,onClose:a,onInsertUserName:c,usersById:s,filteredUsers:r})=>{const o=Object(n.q)(null),{shouldRender:l,transitionClassNames:i}=Object(Y.a)(e,void 0,void 0,!1),d=Object(n.m)(e=>{if(!r)return-1;const t=r.length;return Object(ac.a)(t,e)},[r]),[m,u]=Object(n.r)(-1),b=Object(n.m)((e,t)=>{t.preventDefault(),u(t=>d(t+e))},[u,d]),h=Object(n.m)((e,t=!1)=>{const a=s&&s[e];a&&c(a,t)},[s,c]),g=Object(n.m)(e=>{if(r&&r.length&&m>-1){const t=r[m];t&&(e.preventDefault(),h(t.id,!0))}},[r,m,h]);Object(n.n)(()=>e?Object(Ge.a)({onEsc:a,onUp:e=>b(-1,e),onDown:e=>b(1,e),onEnter:g,onTab:g}):void 0,[e,a,b,g]),Object(n.n)(()=>{r&&!r.length&&a()},[r,a]),Object(n.n)(()=>{u(0)},[t]),Object(n.n)(()=>{tc(".chat-item-clickable",m,o)},[m]);const p=Object(j.a)(r&&r.length?r:void 0,l),v=r&&!r.length?p:r;if(!l||v&&!v.length)return;const O=Object(W.a)("MentionTooltip composer-tooltip custom-scroll",i);return n.a.createElement("div",{className:O,ref:o},v&&v.map(({id:e},t)=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable scroll-item",onClick:()=>h(e),focus:m===t},n.a.createElement(fe.a,{userId:e,avatarSize:"small",withUsername:!0}))))}),cc=a(189);a(293);var sc=Object(n.h)(({attachments:e,caption:t,isReady:a,currentUserId:c,groupChatMembers:s,usersById:r,recentEmojis:l,baseEmojiKeywords:i,emojiKeywords:d,addRecentEmoji:m,onCaptionUpdate:u,onSend:b,onFileAppend:h,onClear:p})=>{const v=Object(n.q)(null),O=Object(j.a)(e),E=e.length?e:O,f=Boolean(e.length),[C,y,k]=Object(Ue.a)(),N=Boolean(E&&E.every(e=>e.quick)),w=Object(F.a)(),{isMentionTooltipOpen:S,mentionFilter:I,closeMentionTooltip:P,insertMention:M,mentionFilteredUsers:A}=Object(Kn.a)(f,t,u,o.A,s,void 0,c,r),{isEmojiTooltipOpen:L,closeEmojiTooltip:R,filteredEmojis:T,insertEmoji:B}=Object(Yn.a)(f,t,l,o.A,u,i,d,!a);Object(n.n)(()=>f?Object(g.a)(p):void 0,[f,p]);const x=Object(n.m)(()=>{f&&b()},[f,b]),U=Object(n.m)(e=>{e.preventDefault(),k();const{dataTransfer:{files:t}}=e;if(t&&t.length){const e=N?Array.from(t).filter(e=>e.type&&o.n.has(e.type)):Array.from(t);h(e,N)}},[N,h,k]);if(!E)return;const G=E.every(e=>e.mimeType.startsWith("image/")),q=E.every(e=>e.mimeType.startsWith("video/"));let z="";return z=w(G?"PreviewSender.SendPhoto":q?"PreviewSender.SendVideo":"PreviewSender.SendFile",E.length,"i"),n.a.createElement(pe.a,{isOpen:f,onClose:p,header:function(){if(E)return n.a.createElement("div",{className:"modal-header-condensed",dir:w.isRtl?"rtl":void 0},n.a.createElement(D.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel attachments",onClick:p},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("div",{className:"modal-title"},z),n.a.createElement(D.a,{color:"primary",size:"smaller",className:"modal-action-button",onClick:x},w("Send")))}(),className:"AttachmentModal "+(C?"hovered":"")},n.a.createElement("div",{className:"drop-target",onDragEnter:y,onDrop:U,onDragOver:function(e){e.preventDefault(),e.stopPropagation(),v.current&&window.clearTimeout(v.current)},onDragLeave:e=>{const{relatedTarget:t,target:a}=e;a.matches(".drop-target")&&!t&&(v.current=window.setTimeout(k,150)),a&&a.closest(".AttachmentModal.hovered")||(t&&e.stopPropagation(),k())},"data-attach-description":w("Preview.Dragging.AddItems",10)},N?n.a.createElement("div",{className:"media-wrapper custom-scroll"},E.map(e=>e.mimeType.startsWith("image/")?n.a.createElement("img",{src:e.blobUrl,alt:""}):n.a.createElement("video",{src:e.blobUrl,autoPlay:!0,muted:!0,loop:!0}))):n.a.createElement("div",{className:"document-wrapper custom-scroll"},E.map(e=>n.a.createElement(Qn.a,{name:e.filename,extension:Object(Wn.d)(e.filename,e.mimeType),previewData:e.previewBlobUrl,size:e.size,smaller:!0}))),n.a.createElement("div",{className:"attachment-caption-wrapper"},n.a.createElement(nc,{isOpen:S,onClose:P,filter:I,onInsertUserName:M,filteredUsers:A,usersById:r}),n.a.createElement(cc.a,{isOpen:L,emojis:T,onClose:R,onEmojiSelect:B,addRecentEmoji:m}),n.a.createElement(Zn.a,{id:"caption-input-text",isAttachmentModalInput:!0,html:t,editableInputId:o.A,placeholder:w("Caption"),onUpdate:u,onSend:b,shouldSetFocus:f}))))}),rc=a(141);a(294);var oc=Object(n.h)(({isOpen:e,onSend:t,onClear:a})=>{const c=Object(n.q)(null),s=Object(n.q)(null),r=Object(n.q)(null),[o,l]=Object(n.r)(""),[i,d]=Object(n.r)([""]),[m,u]=Object(n.r)(!0),[b,h]=Object(n.r)(!1),[p,v]=Object(n.r)(!1),[O,E]=Object(n.r)(),[f,j]=Object(n.r)(),[C,y]=Object(n.r)(!1),k=Object(F.a)(),N=Object(n.m)(t=>{e&&t.current&&t.current.focus()},[e]);Object(n.n)(()=>e?Object(g.a)(a):void 0,[e,a]),Object(n.n)(()=>{e||(l(""),d([""]),u(!0),h(!1),v(!1),E(""),j(""),y(!1))},[e]),Object(n.n)(()=>N(c),[N,e]),Object(n.o)(()=>{const e=r.current;e&&O!==e.innerHTML&&(e.innerHTML=O)},[O]);const w=Object(n.m)((e=[])=>{d([...e,""]),requestAnimationFrame(()=>{const e=s.current;e&&(e.classList.toggle("overflown",e.scrollHeight>320),e.scrollTo({top:e.scrollHeight,behavior:"smooth"}))})},[]),S=Object(n.m)(()=>{if(y(!1),!e)return;const a=o.trim().substring(0,255),n=i.map(e=>e.trim().substring(0,100)).filter(e=>e.length);if(!a||n.length<2)return l(a),n.length?n.length<2?w(n):d(n):w(),void y(!0);if(p&&(!f||!n[Number(f)]))return void y(!0);const c={summary:{question:a,answers:n.map((e,t)=>({text:e.trim(),option:String(t),...String(t)===f&&{correct:!0}})),...!m&&{isPublic:!0},...b&&{multipleChoice:!0},...p&&{quiz:!0}}};if(p){const{text:e,entities:t}=O&&Object(rc.a)(O.substring(0,200))||{};c.quiz={correctAnswers:[f],...e&&{solution:e},...t&&{solutionEntities:t}}}t(c)},[e,o,i,p,f,m,b,t,w,O]),I=Object(n.m)((e,t)=>{const a=[...i];a[e]=t,a[a.length-1].trim().length&&a.length<10?w(a):d(a)},[i,w]),P=Object(n.m)(e=>{const t=[...i];t.splice(e,1),d(t),requestAnimationFrame(()=>{s.current&&s.current.classList.toggle("overflown",s.current.scrollHeight>320)})},[i]),M=Object(n.m)(e=>{j(e)},[j]),A=Object(n.m)(e=>{u(e.target.checked)},[]),L=Object(n.m)(e=>{h(e.target.checked)},[]),R=Object(n.m)(e=>{v(e.target.checked)},[]),T=Object(n.m)(e=>{13===e.keyCode&&S()},[S]),B=Object(n.m)(()=>{if(C&&!o.trim().length)return k("lng_polls_choose_question")},[C,k,o]),x=Object(n.m)(e=>{const t=i.map(e=>e.trim()).filter(e=>e.length);if(C&&t.length<2&&!i[e].trim().length)return k("lng_polls_choose_answers")},[C,k,i]);function U(){return i.map((e,t)=>n.a.createElement("div",{className:"option-wrapper"},n.a.createElement(ve.a,{label:t!==i.length-1||10===i.length?k("OptionHint"):k("CreatePoll.AddOption"),error:x(t),value:e,onChange:e=>I(t,e.currentTarget.value),onKeyPress:T}),t!==i.length-1&&n.a.createElement(D.a,{className:"option-remove-button",round:!0,color:"translucent",size:"smaller",ariaLabel:k("Delete"),onClick:()=>P(t)},n.a.createElement("i",{className:"icon-close"}))))}return n.a.createElement(pe.a,{isOpen:e,onClose:a,header:n.a.createElement("div",{className:"modal-header-condensed"},n.a.createElement(D.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel poll creation",onClick:a},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("div",{className:"modal-title"},k("NewPoll")),n.a.createElement(D.a,{color:"primary",size:"smaller",className:"modal-action-button",onClick:S},k("Create"))),className:"PollModal"},n.a.createElement(ve.a,{ref:c,label:k("AskAQuestion"),value:o,error:B(),onChange:e=>l(e.currentTarget.value),onKeyPress:T}),n.a.createElement("div",{className:"options-divider"}),n.a.createElement("div",{className:"options-list custom-scroll",ref:s},n.a.createElement("h3",{className:"options-header"},k("PollOptions")),C&&function(){const e=i.map(e=>e.trim()).filter(e=>e.length);return p&&(!f||!e[Number(f)])&&n.a.createElement("p",{className:"error"},k("lng_polls_choose_correct"))}(),p?n.a.createElement(ze.a,{name:"correctOption",options:U().map((e,t)=>({value:String(t),label:e,hidden:t===i.length-1})),onChange:M}):U()),n.a.createElement("div",{className:"options-divider"}),n.a.createElement("div",{className:"quiz-mode"},n.a.createElement(sa.a,{label:k("PollAnonymous"),checked:m,onChange:A}),n.a.createElement(sa.a,{label:k("PollMultiple"),checked:b,disabled:p,onChange:L}),n.a.createElement(sa.a,{label:k("PollQuiz"),checked:p,disabled:b,onChange:R}),p&&n.a.createElement(n.a.Fragment,null,n.a.createElement("h3",{className:"options-header"},k("lng_polls_solution_title")),n.a.createElement("div",{ref:r,className:"form-control",contentEditable:!0,dir:"auto",onChange:e=>E(e.currentTarget.innerHTML)}),n.a.createElement("div",{className:"note"},k("CreatePoll.ExplanationInfo")))))});let lc;function ic(e,t,a=250,c=!1){const s=Object(n.q)(!1);Object(n.n)(()=>{lc&&(clearTimeout(lc),lc=void 0),!e||l.n||c||(lc=window.setTimeout(()=>{s.current||t()},2*a))},[c,e,a,t]);return[Object(n.m)(()=>{s.current=!0},[]),Object(n.m)(()=>{s.current=!1,lc&&(clearTimeout(lc),lc=void 0),lc=window.setTimeout(()=>{s.current||t()},a)},[a,t])]}var dc=a(66),mc=a(145);a(295);var uc=Object(n.h)(({emoji:e,focus:t,onClick:a})=>{const c=Object(n.m)(t=>{t.preventDefault(),a(e.native,e.id)},[e,a]);return n.a.createElement("div",{className:"EmojiButton "+(t?"focus":""),onMouseDown:c,title:`:${e.names[0]}:`},l.d?e.native:n.a.createElement("img",{src:`./img-apple-64/${e.image}.png`,alt:"",loading:"lazy"}))});var bc=Object(n.h)(({category:e,index:t,allEmojis:a,observeIntersection:c,shouldRender:s,onEmojiSelect:r})=>{const o=Object(n.q)(null);Object(ia.c)(o,c);const{transitionClassNames:d}=Object(Y.a)(s,void 0,void 0,"slow"),m=Object(F.a)(),u=l.l?Math.floor((i.a.get().width-8)/44):9,b=44*Math.ceil(e.emojis.length/u);return n.a.createElement("div",{ref:o,key:e.id,id:"emoji-category-"+t,className:"symbol-set"},n.a.createElement("p",{className:"symbol-set-name",dir:"auto"},m("recent"===e.id?"RecentStickers":"Emoji"+t)),n.a.createElement("div",{className:Object(W.a)("symbol-set-container",d),style:`height: ${b}px;`,dir:m.isRtl?"rtl":void 0},s&&e.emojis.map(e=>{const t=a[e],c="id"in t?t:t[1];return n.a.createElement(uc,{key:c.id,emoji:c,onClick:r})})))});a(296);const hc={recent:"icon-recent",people:"icon-smile",nature:"icon-animals",foods:"icon-eats",activity:"icon-sport",places:"icon-car",objects:"icon-lamp",symbols:"icon-language",flags:"icon-flag"},gc=[];let pc,vc,Oc;var Ec=Object(n.h)(Object(c.h)(e=>Object(b.l)(e,["recentEmojis"]))(({className:e,onEmojiSelect:t,recentEmojis:c})=>{const s=Object(n.q)(null),r=Object(n.q)(null),[i,d]=Object(n.r)(),[m,u]=Object(n.r)(),[b,h]=Object(n.r)(0),{observe:g}=Object(ia.a)({rootRef:s,throttleMs:200},e=>{e.forEach(e=>{const{id:t}=e.target;if(!t||!t.startsWith("emoji-category-"))return;const a=Number(t.replace("emoji-category-",""));gc[a]=e.isIntersecting});const t=gc.map((e,t)=>({index:t,isIntersecting:e})).filter(({isIntersecting:e})=>e);t.length&&h(t[Math.floor(t.length/2)].index)});Object(Ze.a)(r.current,!l.l),Object(n.n)(()=>{if(!i)return;const e=r.current;if(!e)return;const t=42*b-e.offsetWidth/2+21;Object(mc.a)(e,t)},[i,b]);const p=Object(F.a)(),v=Object(n.p)(()=>{if(!i)return Ve.a;const e=[...i];return c&&c.length&&e.unshift({id:"recent",name:p("RecentStickers"),emojis:c}),e},[i,p,c]);Object(n.n)(()=>{setTimeout(()=>{const e=()=>{d(Oc.categories),u(Oc.emojis)};Oc?e():async function(){pc||(pc=a.e(1).then(a.t.bind(null,325,3)),vc=(await pc).default,Oc=Object(dc.b)(vc));return pc}().then(e)},200)},[]);const O=Object(n.m)(e=>{h(e);const t=document.getElementById("emoji-category-"+e);Object(ec.a)(s.current,t,"start",50,800)},[]),E=Object(n.m)((e,a)=>{t(e,a)},[t]),f=Object(mt.a)([],o.eb);const j=Object(W.a)("EmojiPicker",e);return m&&f?n.a.createElement("div",{className:j},n.a.createElement("div",{ref:r,className:"EmojiPicker-header",dir:p.isRtl?"rtl":""},v.map((function(e,t){const a=hc[e.id];return a&&n.a.createElement(D.a,{className:"symbol-set-button "+(t===b?"activated":""),round:!0,faded:!0,color:"translucent",onClick:()=>O(t),ariaLabel:e.name},n.a.createElement("i",{className:a}))}))),n.a.createElement("div",{ref:s,className:Object(W.a)("EmojiPicker-main no-selection",l.n?"no-scrollbar":"custom-scroll")},v.map((e,t)=>n.a.createElement(bc,{category:e,index:t,allEmojis:m,observeIntersection:g,shouldRender:b>=t-1&&b<=t+1,onEmojiSelect:E})))):n.a.createElement("div",{className:j},n.a.createElement(ge.a,null))}));const fc=l.l?8:16;var jc=Object(n.h)(({stickerSet:e,loadAndPlay:t,index:a,observeIntersection:c,shouldRender:s,onStickerSelect:r,onStickerUnfave:d})=>{const m=Object(n.q)(null);Object(ia.c)(m,c);const{transitionClassNames:u}=Object(Y.a)(s,void 0,void 0,"slow"),b=l.l?Math.floor((i.a.get().width-8)/(o.Lb+fc)):5,h=Math.ceil(e.count/b)*(o.Lb+fc);return n.a.createElement("div",{ref:m,key:e.id,id:"sticker-set-"+a,className:"symbol-set"},n.a.createElement("p",{className:"symbol-set-name"},e.title),n.a.createElement("div",{className:Object(W.a)("symbol-set-container",u),style:`height: ${h}px;`},s&&e.stickers&&e.stickers.map(a=>n.a.createElement(ga,{key:a.id,sticker:a,size:o.Lb,observeIntersection:c,noAnimate:!t,onClick:r,clickArg:a,onUnfaveClick:"favorite"===e.id?d:void 0}))))});a(297);const Cc=[];var yc=Object(n.h)(Object(c.h)(e=>{const{setsById:t,added:a,recent:n,favorite:c}=e.stickers;return{recentStickers:n.stickers,favoriteStickers:c.stickers,stickerSetsById:t,addedSetIds:a.setIds,shouldPlay:e.settings.byKey.shouldLoopStickers}},(e,t)=>Object(b.l)(t,["loadStickerSets","loadRecentStickers","loadFavoriteStickers","loadAddedStickers","addRecentSticker","unfaveSticker"]))(({className:e,loadAndPlay:t,canSendStickers:a,recentStickers:c,favoriteStickers:s,addedSetIds:r,stickerSetsById:i,shouldPlay:d,onStickerSelect:m,loadStickerSets:u,loadRecentStickers:b,loadFavoriteStickers:h,loadAddedStickers:g,addRecentSticker:p,unfaveSticker:v})=>{const O=Object(n.q)(null),E=Object(n.q)(null),[f,j]=Object(n.r)(0),{observe:C}=Object(ia.a)({rootRef:O,throttleMs:200},e=>{e.forEach(e=>{const{id:t}=e.target;if(!t||!t.startsWith("sticker-set-"))return;const a=Number(t.replace("sticker-set-",""));Cc[a]=e.isIntersecting});const t=Cc.map((e,t)=>({index:t,isIntersecting:e})).filter(({isIntersecting:e})=>e);t.length&&j(t[Math.floor(t.length/2)].index)}),{observe:y}=Object(ia.a)({rootRef:E}),k=Object(F.a)(),N=Boolean(r),w=Object(n.p)(()=>r?[{id:"recent",title:k("RecentStickers"),stickers:c,count:c.length},{id:"favorite",title:k("FavoriteStickers"),stickers:s,count:s.length},...r.map(e=>i[e]).filter(Boolean)]:Ve.a,[r,k,c,s,i]),S=Object(n.p)(()=>N&&0===w.filter(e=>e.stickers&&e.stickers.length).length,[w,N]);Object(n.n)(()=>{t&&(u(),b(),h())},[t,h,b,u]),Object(n.n)(()=>{r&&r.length&&g()},[r,g]),Object(Ze.a)(E.current),Object(n.n)(()=>{if(!N)return;const e=E.current;if(!e)return;const t=52*f-(e.offsetWidth/2-26);Object(mc.a)(e,t)},[N,f]);const I=Object(n.m)(e=>{j(e);const t=document.getElementById("sticker-set-"+e);Object(ec.a)(O.current,t,"start",void 0,500)},[]),P=Object(n.m)(e=>{m(e),p({sticker:e})},[p,m]),M=Object(n.m)(e=>{v({sticker:e})},[v]),A=Object(mt.a)([],o.Bb);const L=Object(W.a)("StickerPicker",e);return N&&A&&!S&&a?n.a.createElement("div",{className:L},n.a.createElement("div",{ref:E,className:"StickerPicker-header no-selection no-scrollbar"},w.map((function(e,t){const a=e.stickers&&e.stickers[0],c=Object(W.a)("symbol-set-button sticker-set-button",t===f&&"activated");return"recent"===e.id||"favorite"===e.id||e.hasThumbnail||!a?n.a.createElement(D.a,{key:e.id,className:c,ariaLabel:e.title,round:!0,faded:"recent"===e.id||"favorite"===e.id,color:"translucent",onClick:()=>I(t)},"recent"===e.id?n.a.createElement("i",{className:"icon-recent"}):"favorite"===e.id?n.a.createElement("i",{className:"icon-favorite"}):e.isAnimated?n.a.createElement(ba,{stickerSet:e,observeIntersection:y}):n.a.createElement(ha,{stickerSet:e,observeIntersection:y})):n.a.createElement(ga,{key:e.id,sticker:a,size:o.Mb,title:e.title,className:c,observeIntersection:y,onClick:I,clickArg:t})}))),n.a.createElement("div",{ref:O,className:Object(W.a)("StickerPicker-main no-selection",l.n?"no-scrollbar":"custom-scroll")},w.map((e,a)=>n.a.createElement(jc,{key:e.id,stickerSet:e,loadAndPlay:Boolean(d&&t),index:a,observeIntersection:C,shouldRender:f>=a-1&&f<=a+1,onStickerSelect:P,onStickerUnfave:M})))):n.a.createElement("div",{className:L},a?S?n.a.createElement("div",{className:"picker-disabled"},"You have no saved Stickers."):n.a.createElement(ge.a,null):n.a.createElement("div",{className:"picker-disabled"},"Sending stickers is not allowed in this chat."))}));a(298);function kc(){return(kc=Object.assign||function(e){for(var t=1;t{const o=Object(n.q)(null),l=Object(n.q)(null),i=e.thumbnail&&!!e.thumbnail.dataUri,d="gif"+e.id,m=Object(ia.b)(o,t)&&!a,u=Object(O.a)(d+"?size=m",!m,s.ApiMediaFormat.BlobUrl),b=Object(Pa.a)(e.thumbnail&&e.thumbnail.dataUri,Boolean(u)),h=Object(O.a)(d,!m,s.ApiMediaFormat.BlobUrl),g=Boolean(m&&h),{transitionClassNames:p}=Object(ma.a)(i||u||h,"slow"),{isBuffered:v,bufferingHandlers:E}=Object(Q.a)(!0),f=m&&!v;Object(J.a)(l,[g]);const j=Object(n.m)(()=>r({...e,blobUrl:h}),[r,e,h]),C=Object(W.a)("GifButton",e.width&&e.height&&e.width({savedGifs:e.gifs.saved.gifs}),(e,t)=>Object(b.l)(t,["loadSavedGifs"]))(({className:e,loadAndPlay:t,canSendGifs:a,savedGifs:c,onGifSelect:s,loadSavedGifs:r})=>{const i=Object(n.q)(null),{observe:d}=Object(ia.a)({rootRef:i,debounceMs:300});Object(n.n)(()=>{t&&r()},[t,r]);const m=Object(mt.a)([],o.Bb);return n.a.createElement("div",{ref:i,className:Object(W.a)("GifPicker",e,l.n?"no-scrollbar":"custom-scroll")},a?m&&c&&c.length?c.map(e=>n.a.createElement(Nc,{key:e.id,gif:e,observeIntersection:d,isDisabled:!t,onClick:s})):m&&c?n.a.createElement("div",{className:"picker-disabled"},"No saved GIFs."):n.a.createElement(ge.a,null):n.a.createElement("div",{className:"picker-disabled"},"Sending GIFs is not allowed in this chat."))}));let Sc;!function(e){e[e.Emoji=0]="Emoji",e[e.Stickers=1]="Stickers",e[e.GIFs=2]="GIFs"}(Sc||(Sc={}));const Ic=Object.values(Sc).filter(e=>"string"==typeof e),Pc={[Sc.Emoji]:"icon-smile",[Sc.Stickers]:"icon-stickers",[Sc.GIFs]:"icon-gifs"};var Mc=Object(n.h)(({activeTab:e,onSwitchTab:t,onRemoveSymbol:a,onSearchOpen:c})=>{const s=Object(F.a)();function r(a){return n.a.createElement(D.a,{className:"symbol-tab-button "+(e===a?"activated":""),onClick:()=>t(a),ariaLabel:Ic[a],round:!0,faded:!0,color:"translucent"},n.a.createElement("i",{className:Pc[a]}))}const o=Object(n.m)(()=>{c(e===Sc.Stickers?"stickers":"gifs")},[e,c]);return n.a.createElement("div",{className:"SymbolMenu-footer",onClick:function(e){e.stopPropagation()},dir:s.isRtl?"rtl":void 0},e!==Sc.Emoji&&n.a.createElement(D.a,{className:"symbol-search-button",ariaLabel:e===Sc.Stickers?"Search Stickers":"Search GIFs",round:!0,faded:!0,color:"translucent",onClick:o},n.a.createElement("i",{className:"icon-search"})),r(Sc.Emoji),r(Sc.Stickers),r(Sc.GIFs),e===Sc.Emoji&&n.a.createElement(D.a,{className:"symbol-delete-button",onClick:a,ariaLabel:"Remove Symbol",round:!0,faded:!0,color:"translucent"},n.a.createElement("i",{className:"icon-delete-left"})))});a(300);let Fc=!1;var Ac=Object(n.h)(Object(c.h)(e=>({isLeftColumnShown:e.isLeftColumnShown}))(({isOpen:e,allowedAttachmentOptions:t,isLeftColumnShown:a,onLoad:c,onClose:s,onEmojiSelect:r,onStickerSelect:o,onGifSelect:i,onRemoveSymbol:d,onSearchOpen:m,addRecentEmoji:u})=>{const[b,h]=Object(n.r)(0),[g,p]=Object(n.r)([]),[v,O]=ic(e,s,void 0,l.l),{shouldRender:E,transitionClassNames:f}=Object(Y.a)(e,s,!1,!1);!Fc&&e&&(Fc=!0),Object(n.n)(()=>{c()},[c]),Object(n.o)(()=>{if(l.l)return e&&(document.body.classList.add("enable-symbol-menu-transforms"),document.body.classList.add("is-symbol-menu-open")),()=>{e&&Object(V.b)(()=>{document.body.classList.remove("is-symbol-menu-open"),setTimeout(()=>{document.body.classList.remove("enable-symbol-menu-transforms")},350)})}},[e]);const j=Object(n.q)(g);j.current=g,Object(n.n)(()=>{j.current.length&&(j.current.forEach(e=>{u({emoji:e})}),p([]))},[e,b,u]);const C=Object(n.m)((e,t)=>{p(e=>[...e,t]),r(e)},[r]),y=Object(n.m)(e=>{s(),m(e)},[s,m]),k=Object(n.m)(e=>{o(e,!0)},[o]),N=Object(F.a)(),{canSendStickers:w,canSendGifs:S}=t;function I(t,a){switch(b){case Sc.Emoji:return n.a.createElement(Ec,{className:"picker-tab",onEmojiSelect:C});case Sc.Stickers:return n.a.createElement(yc,{className:"picker-tab",loadAndPlay:!!w&&(e&&(t||a)),canSendStickers:w,onStickerSelect:k});case Sc.GIFs:return n.a.createElement(wc,{className:"picker-tab",loadAndPlay:!!S&&(e&&(t||a)),canSendGifs:S,onGifSelect:i})}}const P=n.a.createElement(n.a.Fragment,null,n.a.createElement("div",{className:"SymbolMenu-main",onClick:function(e){e.stopPropagation()}},Fc&&n.a.createElement(T.a,{name:"slide",activeKey:b,renderCount:Ic.length},I)),l.l&&n.a.createElement(D.a,{round:!0,faded:!0,color:"translucent",ariaLabel:N("Close"),className:"symbol-close-button",size:"tiny",onClick:s},n.a.createElement("i",{className:"icon-close"})),n.a.createElement(Mc,{activeTab:b,onSwitchTab:h,onRemoveSymbol:d,onSearchOpen:y}));if(l.l){if(!E)return;const e=Object(W.a)("SymbolMenu mobile-menu",f,!a&&"middle-column-open");return n.a.createElement(zn.a,null,n.a.createElement("div",{className:e},P))}return n.a.createElement(xn.a,{isOpen:e,positionX:"left",positionY:"bottom",onClose:s,className:"SymbolMenu",onCloseAnimationEnd:s,onMouseEnter:l.n?void 0:v,onMouseLeave:l.n?void 0:O,noCloseOnBackdrop:!l.n},P)}));a(301);var Lc=Object(n.h)(({isOpen:e,allowedAttachmentOptions:t,onFileSelect:a,onPollCreate:c,onClose:s})=>{const[r,i]=ic(e,s),d=Object(n.m)((e,t)=>{const{files:n}=e.target;n&&n.length>0&&a(Array.from(n),t)},[a]),m=Object(n.m)(()=>{ja(Array.from(o.n).join(","),e=>d(e,!0))},[d]),u=Object(n.m)(()=>{ja("*",e=>d(e,!1))},[d]),b=Object(F.a)(),{canAttachMedia:h,canAttachPolls:g}=t;return n.a.createElement(xn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:s,className:"AttachMenu fluid",onCloseAnimationEnd:s,onMouseEnter:l.n?void 0:r,onMouseLeave:l.n?void 0:i,noCloseOnBackdrop:!l.n},!h&&n.a.createElement(_.a,{className:"media-disabled",disabled:!0},"Posting media content is not allowed in this group."),h&&n.a.createElement(n.a.Fragment,null,n.a.createElement(_.a,{icon:"photo",onClick:m},b("AttachmentMenu.PhotoOrVideo")),n.a.createElement(_.a,{icon:"document",onClick:u},b("AttachDocument"))),g&&n.a.createElement(_.a,{icon:"poll",onClick:c},b("Poll")))});a(302);var Rc=Object(n.h)(Object(c.h)(e=>{const{stickers:t}=e.stickers.forEmoji;return{stickers:t}},(e,t)=>Object(b.l)(t,["clearStickersForEmoji"]))(({isOpen:e,onStickerSelect:t,stickers:a,clearStickersForEmoji:c})=>{const s=Object(n.q)(null),{shouldRender:r,transitionClassNames:i}=Object(Y.a)(e,void 0,void 0,!1),d=Object(j.a)(a,!0),m=a||d,{observe:u}=Object(ia.a)({rootRef:s,throttleMs:200});Object(n.n)(()=>e?Object(g.a)(c):void 0,[e,c]);const b=Object(W.a)("StickerTooltip composer-tooltip custom-scroll",i,!(m&&m.length)&&"hidden");return n.a.createElement("div",{ref:s,className:b,onMouseEnter:l.n?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:l.n?void 0:()=>{document.body.classList.remove("no-select")}},r&&m?m.map(e=>n.a.createElement(ga,{key:e.id,sticker:e,size:o.Lb,observeIntersection:u,onClick:t,clickArg:e})):r?n.a.createElement(ge.a,null):void 0)}));a(303);var Tc=Object(n.h)(Object(c.h)((e,{messageId:t})=>{const{chatId:a}=Object(m.z)(e)||{};return a?{message:Object(m.l)(e,a,t)}:{}},(e,t)=>Object(b.l)(t,["clickInlineButton"]))(({isOpen:e,message:t,onClose:a,clickInlineButton:c})=>{const[s,r]=ic(e,a);if(t&&t.keyboardButtons)return n.a.createElement(xn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:a,className:"KeyboardMenu",onCloseAnimationEnd:a,onMouseEnter:l.n?void 0:s,onMouseLeave:l.n?void 0:r,noCloseOnBackdrop:!l.n},n.a.createElement("div",{className:"content"},t.keyboardButtons.map(e=>n.a.createElement("div",{className:"row"},e.map(e=>n.a.createElement(D.a,{ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>c({button:e})},e.text))))))}));a(304);var Dc=Object(n.h)(({isOpen:e,onSilentSend:t,onScheduleSend:a,onClose:c,onCloseAnimationEnd:s})=>{const[r,o]=ic(e,c),i=Object(F.a)();return n.a.createElement(xn.a,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",className:"CustomSendMenu",onClose:c,onCloseAnimationEnd:s,onMouseEnter:l.n?void 0:r,onMouseLeave:l.n?void 0:o,noCloseOnBackdrop:!l.n},t&&n.a.createElement(_.a,{icon:"mute",onClick:t},i("SendWithoutSound")),a&&n.a.createElement(_.a,{icon:"schedule",onClick:a},i("ScheduleMessage")))}),Bc=a(142),xc=a(167),Uc=a(180);a(305);var Gc=Object(n.h)(({isOpen:e,emojis:t,onClose:a,onEmojiSelect:c,addRecentEmoji:s})=>{const r=Object(n.q)(null),{shouldRender:o,transitionClassNames:i}=Object(Y.a)(e,void 0,void 0,!1),d=Object(Uc.a)(t.length?t:void 0,350)||[],[m,u]=Object(n.r)(-1);Object(n.n)(()=>{u(0)},[t]),Object(n.n)(()=>{!function(e,t){const a=t.current;if(!a)return;const{visibleIndexes:n,allElements:c}=Jn(a,".EmojiButton",8,!0,!0,!0);if(!c.length||!c[e])return;const s=n[0];if(!n.includes(e)||e===s&&!Xn(a,c[s],!0)){const t="start"===(e>n[n.length-1]?"start":"end")?44*e:0;Object(mc.a)(a,t)}}(m,r)},[m]);const b=Object(n.m)(e=>{if(!t.length)return-1;const a=t.length;return Object(ac.a)(a,e)},[t]),h=Object(n.m)((e,t)=>{t.preventDefault(),u(t=>b(t+e))},[u,b]),g=Object(n.m)(e=>{if(t.length&&m>-1){const a=t[m];a&&(e.preventDefault(),c(a.native),s({emoji:a.id}))}},[s,t,c,m]),p=Object(n.m)((e,t)=>{c(e),s({emoji:t})},[s,c]);Object(n.n)(()=>e?Object(Ge.a)({onEsc:a,onLeft:e=>h(-1,e),onRight:e=>h(1,e),onEnter:g}):void 0,[h,g,e,a]);const v=Object(W.a)("EmojiTooltip composer-tooltip custom-scroll-x",i);return n.a.createElement("div",{ref:r,className:v,onMouseEnter:l.n?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:l.n?void 0:()=>{document.body.classList.remove("no-select")}},o&&d?d.map((e,t)=>n.a.createElement(uc,{key:e.id,emoji:e,focus:m===t,onClick:p})):o?n.a.createElement(ge.a,null):void 0)});a(306);var qc=Object(n.h)(({title:e,description:t,thumbnail:a,thumbUrl:c,focus:s,transitionClassNames:r="",onClick:o})=>{let l="";const i=Object(O.a)(a?"webDocument:"+a.url:void 0);return(c=c||i)?l=n.a.createElement("img",{src:c,className:r,alt:"",decoding:"async",draggable:"false"}):e&&(l=Object(ua.c)(e,1)),n.a.createElement(Ee.a,{focus:s,className:"BaseResult chat-item-clickable",onClick:o},n.a.createElement("span",{className:"thumb"},"string"==typeof l?Object(x.a)(l):l),n.a.createElement("div",{className:"content-inner"},e&&n.a.createElement("div",{className:"title"},e),t&&n.a.createElement("div",{className:"description"},t)))});a(307);var zc=Object(n.h)(({focus:e,isForGallery:t,inlineResult:a,onClick:c})=>{let s,r,o;"photo"in a&&(s=a.photo),"thumbnail"in a&&(r=a.thumbnail),"webThumbnail"in a&&t&&(o=a.webThumbnail);const l=Object(O.a)(o?"webDocument:"+o.url:void 0),i=Object(O.a)(s&&`photo${s.id}?size=m`),{shouldRenderThumb:d,shouldRenderFullMedia:m,transitionClassNames:u}=Object(ma.a)(i,"slow"),b=Object(n.m)(()=>{c(a)},[a,c]);if(t)return n.a.createElement("div",{className:"MediaResult chat-item-clickable",onClick:b},d&&n.a.createElement("img",{src:s&&s.thumbnail&&s.thumbnail.dataUri||l,alt:""}),m&&n.a.createElement("img",{src:i,className:u+" full-media",alt:""}));const{title:h,description:g}=a;return n.a.createElement(qc,{focus:e,thumbUrl:m?i:r&&r.dataUri||l,transitionClassNames:m?u:void 0,title:h,description:g,onClick:b})});var _c=Object(n.h)(({focus:e,inlineResult:t,onClick:a})=>{const{title:c,url:s,description:r,webThumbnail:o}=t,l=Object(n.m)(()=>{a(t)},[t,a]);return n.a.createElement(qc,{focus:e,thumbnail:o,title:c||s,description:r,onClick:l})});var Hc=Object(n.h)(({inlineResult:e,observeIntersection:t,onClick:a})=>{const{gif:c}=e,s=Object(n.m)(()=>{a(e)},[e,a]);if(c)return n.a.createElement(Nc,{gif:c,observeIntersection:t,className:"chat-item-clickable",onClick:s})});var $c=Object(n.h)(({inlineResult:e,observeIntersection:t,onClick:a})=>{const{sticker:c}=e;if(c)return n.a.createElement(ga,{sticker:c,size:o.Hb,observeIntersection:t,title:c.emoji,className:"chat-item-clickable",onClick:a,clickArg:e})});a(308);const Vc=Object(V.h)(e=>e(),500,!0);var Wc=Object(n.h)(Object(c.h)(void 0,(e,t)=>Object(b.l)(t,["sendBotCommand","openChat","sendInlineBotResult"]))(({isOpen:e,botId:t,isGallery:a,inlineBotResults:c,switchPm:s,loadMore:o,onClose:i,openChat:d,sendBotCommand:m,onSelectResult:u})=>{const b=Object(n.q)(null),{shouldRender:h,transitionClassNames:g}=Object(Y.a)(e,void 0,void 0,!1),[p,v]=Object(n.r)(-1),{observe:O}=Object(ia.a)({rootRef:b,debounceMs:200,isDisabled:!e});Object(n.n)(()=>{v(a?-1:0)},[c,a]),Object(n.n)(()=>{tc(".chat-item-clickable",p,b)},[p]);const E=Object(n.m)(e=>c&&c.length?Object(ac.a)(c.length,e):-1,[c]),f=Object(n.m)((e,t)=>{a||(t.preventDefault(),v(t=>E(t+e)))},[a,E]),C=Object(n.m)(e=>{if(c&&c.length&&p>-1){const t=c[p];t&&(e.preventDefault(),u(t))}},[c,u,p]),y=Object(n.m)(({direction:e})=>{e===r.e.Backwards&&Vc(o)},[o]);Object(n.n)(()=>e?Object(Ge.a)({onEsc:i,onUp:e=>f(-1,e),onDown:e=>f(1,e),onEnter:C}):void 0,[f,C,a,e,i]);const k=Object(n.m)(()=>{d({id:t}),m({chatId:t,command:"/start "+s.startParam})},[t,d,m,s]),N=Object(j.a)(c&&c.length?c:void 0,h),w=c&&!c.length?N:c;if(!h||!w||!w.length&&!s)return;const S=Object(W.a)("InlineBotTooltip composer-tooltip",l.n?"no-scrollbar":"custom-scroll",a&&"gallery",g);return n.a.createElement(Oe.a,{ref:b,className:S,items:w,itemSelector:".chat-item-clickable",noFastList:!0,onLoadMore:y,sensitiveArea:160},s&&n.a.createElement(Ee.a,{ripple:!0,className:"switch-pm scroll-item",onClick:k},n.a.createElement("span",{className:"title"},s.text)),w.map((e,t)=>{switch(e.type){case"gif":return n.a.createElement(Hc,{key:e.id,inlineResult:e,observeIntersection:O,onClick:u});case"photo":return n.a.createElement(zc,{key:e.id,isForGallery:a,inlineResult:e,onClick:u});case"sticker":return n.a.createElement($c,{key:e.id,inlineResult:e,observeIntersection:O,onClick:u});case"video":case"game":return n.a.createElement(zc,{key:e.id,focus:p===t,inlineResult:e,onClick:u});case"article":case"audio":return n.a.createElement(_c,{key:e.id,focus:p===t,inlineResult:e,onClick:u});default:return}}))})),Kc=a(177);a(309);var Yc=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),n=a&&Object(m.n)(e,a.id);if(!a||!n)return{};const{query:c,results:s}=Object(m.B)(e)||{},{totalCount:r,foundIds:o}=s||{};return{chat:a,messagesById:n,query:c,totalCount:r,foundIds:o}},(e,t)=>Object(b.l)(t,["searchTextMessagesLocal","focusMessage"]))(({chatId:e,threadId:t,onClose:a,isActive:s,chat:r,messagesById:o,query:l,totalCount:i,foundIds:d,searchTextMessagesLocal:h,focusMessage:g})=>{const p=Object(F.a)(),v=Object(n.p)(()=>{if(!(l&&d&&d.length&&o))return Ve.a;const a=d.map(a=>{const n=o[a];if(!n)return;const s=n.senderId?Object(m.Jb)(Object(c.e)(),n.senderId):void 0;let l;if(r&&Object(u.mb)(r))l=r;else if(n.forwardInfo){const{isChannelPost:e,fromChatId:t}=n.forwardInfo;l=e&&t?Object(m.g)(Object(c.e)(),t):void 0}else l=n.senderId?Object(m.g)(Object(c.e)(),n.senderId):void 0;return{message:n,senderUser:s,senderChat:l,onClick:()=>g({chatId:e,threadId:t,messageId:a})}}).filter(Boolean);return Object(b.k)(a,({message:e})=>e.date,"desc")},[e,t,g,d,r,o,l]);Object(A.a)(s,a);const O=Object(n.q)(null),E=Object(he.a)(O,!0,e=>{const t=v&&v[-1===e?0:e];t&&t.onClick()},".ListItem-button",!0);return n.a.createElement(Oe.a,{className:"RightSearch custom-scroll",items:v,preloadBackwards:0,onLoadMore:h,noFastList:!0,onKeyDown:E,ref:O},n.a.createElement("p",{className:"helper-text",dir:"auto"},l?0!==i&&v.length?1===i?"1 message found":(v.length&&(i||v.length))+" messages found":p("lng_search_no_results"):p("lng_dlg_search_for_messages")),v.map(({message:e,senderUser:t,senderChat:a,onClick:c})=>{const s=a?Object(u.k)(p,a):Object(u.bb)(t),r=Object(u.O)(p,e);return n.a.createElement(Ee.a,{className:"chat-item-clickable search-result-message m-0",onClick:c},n.a.createElement(U.a,{chat:a,user:t}),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"title"},n.a.createElement("h3",{dir:"auto"},s&&Object(x.a)(s)),n.a.createElement(Kc.a,{message:e})),n.a.createElement("div",{className:"subtitle",dir:"auto"},Object(x.a)(r,["emoji","highlight"],{highlight:l}))))}))})),Qc=a(52);var Zc=Object(n.h)(Object(c.h)((e,{stickerSetId:t})=>({set:Object(m.zb)(e,t),shouldPlay:Object(m.yb)(e)}),(e,t)=>Object(b.l)(t,["loadStickers","toggleStickerSet"]))(({stickerSetId:e,observeIntersection:t,set:a,shouldPlay:c,loadStickers:s,toggleStickerSet:r,isSomeModalOpen:l,onModalToggle:i})=>{const d=Object(F.a)(),m=a&&Boolean(a.installedDate),u=Boolean(a&&a.stickers),[b,h,g]=Object(Ue.a)();Object(Qc.a)(()=>{i(b)},[b,i]);const p=Object(n.p)(()=>{if(!a)return[];const e=(a.covers||[]).map(({id:e})=>e),t=a.stickers?a.stickers.filter(({id:t})=>!e.includes(t)):[];return[...a.covers||[],...t].slice(0,5)},[a]);Object(n.n)(()=>{!u&&p.length<5&&s({stickerSetId:e})},[u,p.length,s,e]);const v=Object(n.m)(()=>{r({stickerSetId:e})},[r,e]);if(!a)return;const O=p.length>0;return n.a.createElement("div",{key:a.id,className:"sticker-set",dir:d.isRtl?"rtl":void 0},n.a.createElement("div",{className:"sticker-set-header"},n.a.createElement("div",{className:"title-wrapper"},n.a.createElement("h3",{className:"title",dir:"auto"},a.title),n.a.createElement("p",{className:"count",dir:"auto"},d("Stickers",a.count,"i"))),n.a.createElement(D.a,{className:m?"is-added":void 0,color:"primary",size:"tiny",pill:!0,fluid:!0,onClick:v},d(m?"Stickers.Installed":"Stickers.Install"))),n.a.createElement("div",{className:"sticker-set-main"},!O&&n.a.createElement(L.a,null),O&&p.map(e=>n.a.createElement(ga,{sticker:e,size:o.Nb,observeIntersection:t,noAnimate:!c||b||l,onClick:h}))),O&&n.a.createElement(va.a,{isOpen:b,fromSticker:p[0],onClose:g}))}));a(310);const Jc=Object(V.h)(e=>e(),6e4,!0);var Xc=Object(n.h)(Object(c.h)(e=>{const t=Object(m.A)(e),{query:a,resultIds:n}=t||{},{featured:c}=e.stickers;return{query:a,featuredIds:c.setIds,resultIds:n}},(e,t)=>Object(b.l)(t,["loadFeaturedStickers"]))(({onClose:e,isActive:t,query:a,featuredIds:c,resultIds:s,loadFeaturedStickers:r})=>{const o=Object(n.q)(null),l=Object(F.a)(),[i,d]=Object(n.r)(!1),{observe:m}=Object(ia.a)({rootRef:o,throttleMs:200});return Object(n.n)(()=>{Jc(()=>{r()})}),Object(A.a)(t,e),n.a.createElement("div",{ref:o,className:"StickerSearch custom-scroll",dir:l.isRtl?"rtl":void 0},function(){if(void 0!==a)return!a&&c?c.map(e=>n.a.createElement(Zc,{key:e,stickerSetId:e,observeIntersection:m,isSomeModalOpen:i,onModalToggle:d})):s?s.length?s.map(e=>n.a.createElement(Zc,{key:e,stickerSetId:e,observeIntersection:m,isSomeModalOpen:i,onModalToggle:d})):n.a.createElement("p",{className:"helper-text",dir:"auto"},"Nothing found."):n.a.createElement(ge.a,null)}())}));a(311);var es=Object(n.h)(Object(c.h)(e=>{const t=Object(m.t)(e),{query:a,results:n}=t||{},{chatId:c}=Object(m.z)(e)||{},s=c?Object(m.g)(e,c):void 0;return{query:a,results:n,chat:s,isChatWithBot:s?Object(m.O)(e,s):void 0}},(e,t)=>Object(b.l)(t,["searchMoreGifs","sendMessage","setGifSearchQuery"]))(({onClose:e,isActive:t,query:a,results:c,chat:s,isChatWithBot:r,searchMoreGifs:o,sendMessage:i,setGifSearchQuery:d})=>{const m=Object(n.q)(null),{observe:b}=Object(ia.a)({rootRef:m,debounceMs:300}),{canSendGifs:h}=Object(u.b)(s,r),g=Object(n.m)(e=>{h&&i({gif:e}),l.n&&d({query:void 0})},[h,i,d]),p=Object(F.a)();Object(A.a)(t,e);const v=Boolean(void 0!==a&&c&&c.length);return n.a.createElement("div",{className:"GifSearch",dir:p.isRtl?"rtl":void 0},n.a.createElement(Oe.a,{ref:m,className:Object(W.a)("gif-container custom-scroll",v&&"grid"),items:c,itemSelector:".GifButton",preloadBackwards:96,noFastList:!0,onLoadMore:o},function(){if(void 0!==a)return c?c.length?c.map(e=>n.a.createElement(Nc,{key:e.id,gif:e,observeIntersection:b,onClick:g})):n.a.createElement("p",{className:"helper-text",dir:"auto"},p("NoGIFsFound")):n.a.createElement(ge.a,null)}()))}));a(312);var ts=Object(n.h)(Object(c.h)((e,{answer:t})=>{const{voters:a,offsets:n}=e.pollResults;return{voters:a&&a[t.option],offset:n&&n[t.option]||""}},(e,t)=>Object(b.l)(t,["loadPollOptionResults","openChat","closePollResults"]))(({chat:e,message:t,answer:a,answerVote:c,totalVoters:s,voters:r,offset:o,loadPollOptionResults:l,openChat:i,closePollResults:d})=>{const m=Object(j.a)(c.votersCount),[u,b]=Object(n.r)(!0),h=Boolean(r),{option:g,text:p}=a,v=Object(F.a)();Object(n.n)(()=>{h&&m===c.votersCount||l({chat:e,messageId:t.id,option:g,offset:o,limit:4,shouldResetVoters:!0})},[c.votersCount,h]);const O=Object(n.m)(()=>{b(!0),l({chat:e,messageId:t.id,option:g,offset:o,limit:50})},[e,l,t.id,o,g]);Object(n.n)(()=>{b(!1)},[r]);const E=Object(n.m)(e=>{i({id:e}),d()},[d,i]);return n.a.createElement("div",{className:"PollAnswerResults"},n.a.createElement("div",{className:"poll-voters"},r?r.map(e=>n.a.createElement(Ee.a,{key:e,className:"chat-item-clickable",onClick:()=>E(e)},n.a.createElement(fe.a,{avatarSize:"tiny",userId:e,forceShowSelf:!0,noStatusOrTyping:!0}))):n.a.createElement(ge.a,null),r&&function(){const e=c.votersCount-r.length;return c.votersCount>4&&e>0&&n.a.createElement(ta,{count:e,itemName:"voter",isLoading:u,onClick:O})}()),n.a.createElement("div",{className:"answer-head",dir:v.isRtl?"rtl":void 0},n.a.createElement("span",{className:"answer-title",dir:"auto"},p),n.a.createElement("span",{className:"answer-percent",dir:v.isRtl?"auto":void 0},(f=c.votersCount,(C=s)>0?(f/C*100).toFixed():0),"%")));var f,C}));a(313);var as=Object(n.h)(Object(c.h)(e=>{const{pollResults:{chatId:t,messageId:a},lastSyncTime:n}=e;if(!t||!a)return{};return{chat:Object(m.g)(e,t),message:Object(m.l)(e,t,a),lastSyncTime:n}})(({onClose:e,isActive:t,chat:a,message:c,lastSyncTime:s})=>{const r=Object(F.a)();if(Object(A.a)(t,e),!c||!a)return n.a.createElement(ge.a,null);const{summary:o,results:l}=Object(u.I)(c);if(!l.results)return;const i=Object(b.c)(l.results,"option");return n.a.createElement("div",{className:"PollResults",dir:r.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"poll-question",dir:"auto"},o.question),n.a.createElement("div",{className:"poll-results-list custom-scroll"},s&&o.answers.map(e=>n.a.createElement(ts,{key:`${c.id}-${e.option}`,chat:a,message:c,answer:e,answerVote:i[e.option],totalVoters:l.totalVoters})),!s&&n.a.createElement(ge.a,null)))}));a(171);var ns=Object(n.h)(Object(c.h)((e,{userId:t})=>{const a=Object(m.Jb)(e,t),n=Object(m.g)(e,t),{progress:c}=e.management;return{user:a,chat:n,progress:c,isMuted:Object(u.Hb)(n,Object(m.fb)(e),Object(m.eb)(e))}},(e,t)=>Object(b.l)(t,["updateContact","deleteUser","closeManagement","openChat","deleteHistory"]))(({userId:e,user:t,chat:a,progress:c,isMuted:s,updateContact:o,deleteUser:l,deleteHistory:i,closeManagement:d,openChat:m,onClose:u,isActive:b})=>{const[h,g,p]=Object(Ue.a)(),[v,O]=Object(n.r)(!1),[E,f]=Object(n.r)(),j=Object(F.a)();Object(A.a)(b,u);const C=t&&t.firstName||"",y=t&&t.lastName||"",[k,N]=Object(n.r)(C),[w,S]=Object(n.r)(y),[I,P]=Object(n.r)(!s);Object(n.n)(()=>{P(!s)},[s]),Object(n.n)(()=>{O(!1),p()},[p,e]),Object(n.n)(()=>{N(C),S(y)},[C,y,t]),Object(n.n)(()=>{c===r.f.Complete&&(O(!1),f(void 0),p())},[p,c]);const M=Object(n.m)(e=>{N(e.target.value),O(!0)},[]),R=Object(n.m)(e=>{S(e.target.value),O(!0)},[]),T=Object(n.m)(e=>{P(e.target.checked),O(!0)},[]),D=Object(n.m)(()=>{const t=k.trim(),a=w.trim();t.length||f("Please provide first name"),o({userId:e,isMuted:!I,firstName:t,lastName:a})},[k,w,o,e,I]),B=Object(n.m)(()=>{i({chatId:a.id,shouldDeleteForAll:!1}),l({userId:e}),p(),d(),m({id:void 0})},[a.id,p,d,i,l,m,e]);if(!t)return;const x=c===r.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(fe.a,{userId:t.id,avatarSize:"jumbo",status:"original name",withFullInfo:!0}),n.a.createElement(ve.a,{id:"user-first-name",label:j("UserInfo.FirstNamePlaceholder"),onChange:M,value:k,error:"Please provide first name"===E?E:void 0}),n.a.createElement(ve.a,{id:"user-last-name",label:j("UserInfo.LastNamePlaceholder"),onChange:R,value:w}),n.a.createElement("div",{className:"ListItem no-selection narrow"},n.a.createElement(sa.a,{checked:I,label:j("Notifications"),subLabel:j(I?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),onChange:T}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:g},j("DeleteContact")))),n.a.createElement(Ht.a,{isShown:v,onClick:D,disabled:x,ariaLabel:j("Save")},x?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Pe.a,{isOpen:h,onClose:p,text:j("AreYouSureDeleteContact"),confirmLabel:j("DeleteContact"),confirmHandler:B,confirmIsDestructive:!0}))}));var cs=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),{progress:n}=e.management,c=Boolean(a.fullInfo&&a.fullInfo.linkedChatId),s=Object(u.lb)(a);return{chat:a,progress:n,isBasicGroup:s,hasLinkedChannel:c,canChangeInfo:s?a.isCreator:Object(u.p)(a,"changeInfo"),canBanUsers:s?a.isCreator:Object(u.p)(a,"banUsers")}},(e,t)=>Object(b.l)(t,["togglePreHistoryHidden","updateChat","closeManagement","leaveChannel","deleteChannel","deleteChat","openChat"]))(({chatId:e,chat:t,progress:a,isBasicGroup:c,hasLinkedChannel:o,canChangeInfo:l,canBanUsers:i,onScreenSelect:d,togglePreHistoryHidden:m,updateChat:b,deleteChat:h,leaveChannel:g,deleteChannel:p,closeManagement:v,openChat:E,onClose:f,isActive:j})=>{const[C,y,k]=Object(Ue.a)(),N=t.title,w=t.fullInfo&&t.fullInfo.about||"",[S,I]=Object(n.r)(!1),[P,M]=Object(n.r)(N),[R,T]=Object(n.r)(w),[D,B]=Object(n.r)(),[U,G]=Object(n.r)(),q=Object(u.e)(t),z=Object(O.a)(q,!1,s.ApiMediaFormat.BlobUrl),_=Object(F.a)();Object(A.a)(j,f),Object(n.n)(()=>{a===r.f.Complete&&(I(!1),G(void 0))},[a]);const H=Object(n.m)(()=>{d(r.g.ChatPrivacyType)},[d]),$=Object(n.m)(()=>{d(r.g.Discussion)},[d]),V=Object(n.m)(()=>{d(r.g.GroupPermissions)},[d]),W=Object(n.m)(()=>{d(r.g.ChatAdministrators)},[d]),K=Object(n.m)(e=>{B(e),I(!0)},[]),Y=Object(n.m)(e=>{M(e.target.value),I(!0)},[]),Q=Object(n.m)(e=>{T(e.target.value),I(!0)},[]),Z=Object(n.m)(()=>{const t=P.trim(),a=R.trim();t.length?b({chatId:e,title:t,about:a,photo:D}):G("Group title can't be empty")},[R,e,D,P,b]),J=Object(n.m)(()=>{d(r.g.GroupMembers)},[d]),X=Object(n.m)(()=>{if(!t.fullInfo)return;const{isPreHistoryHidden:e}=t.fullInfo;m({chatId:t.id,isEnabled:!e})},[t,m]),ee=Object(n.p)(()=>{if(!t.defaultBannedRights)return 0;let e=["sendMessages","sendMedia","embedLinks","sendPolls","changeInfo","inviteUsers","pinMessages"].filter(e=>!t.defaultBannedRights[e]).length;const{sendStickers:a,sendGifs:n}=t.defaultBannedRights;return a||n||(e+=1),e},[t]),te=t.fullInfo&&t.fullInfo.adminMembers&&t.fullInfo.adminMembers.length||0,ae=Object(n.m)(()=>{c?h({chatId:t.id}):t.isCreator?p({chatId:t.id}):g({chatId:t.id}),k(),v(),E({id:void 0})},[c,t.isCreator,t.id,k,v,g,p,h,E]);if(t.isRestricted)return;const ne=a===r.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(_t.a,{currentAvatarBlobUrl:z,onChange:K,disabled:!l}),n.a.createElement(ve.a,{id:"group-title",label:_("GroupName"),onChange:Y,value:P,error:"Group title can't be empty"===U?U:void 0,disabled:!l}),n.a.createElement(ve.a,{id:"group-about",className:"mb-2",label:_("DescriptionPlaceholder"),onChange:Q,value:R,disabled:!l}),t.isCreator&&n.a.createElement(Ee.a,{icon:"lock",multiline:!0,onClick:H},n.a.createElement("span",{className:"title"},_("GroupType")),n.a.createElement("span",{className:"subtitle"},t.username?_("TypePublic"):_("TypePrivate"))),o&&n.a.createElement(Ee.a,{icon:"message",multiline:!0,onClick:$},n.a.createElement("span",{className:"title"},_("LinkedChannel")),n.a.createElement("span",{className:"subtitle"},_("DiscussionUnlink"))),n.a.createElement(Ee.a,{icon:"permissions",multiline:!0,onClick:V,disabled:!i},n.a.createElement("span",{className:"title"},_("ChannelPermissions")),n.a.createElement("span",{className:"subtitle",dir:"auto"},ee,"/",8)),n.a.createElement(Ee.a,{icon:"admin",multiline:!0,onClick:W},n.a.createElement("span",{className:"title"},_("ChannelAdministrators")),n.a.createElement("span",{className:"subtitle"},Object(ua.a)(te)))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"group",multiline:!0,onClick:J},n.a.createElement("span",{className:"title"},_("GroupMembers")),n.a.createElement("span",{className:"subtitle"},Object(ua.a)(t.membersCount))),t.fullInfo&&n.a.createElement("div",{className:"ListItem narrow no-selection"},n.a.createElement(sa.a,{checked:!t.fullInfo.isPreHistoryHidden,label:_("ChatHistory"),onChange:X,disabled:!i}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:y},_("DeleteMega")))),n.a.createElement(Ht.a,{isShown:S,onClick:Z,disabled:ne,ariaLabel:_("Save")},ne?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Pe.a,{isOpen:C,onClose:k,textParts:Object(x.a)(c||!t.isCreator?_("AreYouSureDeleteAndExit"):_("AreYouSureDeleteThisChatWithGroup",t.title),["br","simple_markdown"]),confirmLabel:c||!t.isCreator?_("DeleteMega"):_("DeleteGroupForAll"),confirmHandler:ae,confirmIsDestructive:!0}))}));var ss=Object(n.h)(Object(c.h)((e,{chatId:t})=>({chat:Object(m.g)(e,t),currentUserId:e.currentUserId}),(e,t)=>Object(b.l)(t,["updateChatDefaultBannedRights"]))(({onScreenSelect:e,onChatMemberSelect:t,chat:a,currentUserId:c,updateChatDefaultBannedRights:s,onClose:o,isActive:l})=>{const[i,d]=Object(n.r)({}),[m,u]=Object(n.r)(!1),[b,h]=Object(n.r)(!1),g=Object(F.a)();Object(A.a)(l,o);const p=Object(n.m)(()=>{e(r.g.GroupRemovedUsers)},[e]),v=Object(n.m)(()=>{e(r.g.GroupUserPermissionsCreate)},[e]),O=Object(n.m)(a=>{t(a.userId,a.promotedByUserId===c),e(r.g.GroupUserPermissions)},[c,t,e]);Object(n.n)(()=>{d(a&&a.defaultBannedRights||{}),u(!1),setTimeout(()=>{h(!1)},250)},[a]);const E=Object(n.m)(e=>{const{name:t}=e.target;function a(e){return!e||void 0}d(e=>({...e,[t]:a(e[t]),..."sendStickers"===t&&{sendGifs:a(e[t])}})),u(!0)},[]),f=Object(n.m)(()=>{a&&(h(!0),s({chatId:a.id,bannedRights:i}))},[a,i,s]),j=Object(n.p)(()=>a&&a.fullInfo&&a.fullInfo.kickedMembers?a.fullInfo.kickedMembers.length:0,[a]),C=Object(n.p)(()=>a&&a.fullInfo&&a.fullInfo.members?a.fullInfo.members.filter(({bannedRights:e})=>!!e):[],[a]),y=Object(n.m)(e=>{const{bannedRights:t}=e;if(!t||!a)return;const{defaultBannedRights:n}=a;return Object.keys(t).reduce((e,a)=>{if(!t[a]||n&&n[a]||"sendInline"===a||"viewMessages"===a||"sendGames"===a)return e;const c=function(e){switch(e){case"sendMessages":return"UserRestrictionsNoSend";case"sendMedia":return"UserRestrictionsNoSendMedia";case"sendStickers":return"UserRestrictionsNoSendStickers";case"embedLinks":return"UserRestrictionsNoEmbedLinks";case"sendPolls":return"UserRestrictionsNoSendPolls";case"changeInfo":return"UserRestrictionsNoChangeInfo";case"inviteUsers":return"UserRestrictionsInviteUsers";case"pinMessages":return"UserRestrictionsPinMessages";default:return}}(a);if(!c)return e;const s=g(c);return`${e}${e.length?", "+s:s}`},"")},[a,g]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement("h3",{className:"section-heading",dir:"auto"},g("ChannelPermissionsHeader")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"sendMessages",checked:!i.sendMessages,label:g("UserRestrictionsSend"),blocking:!0,onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"sendMedia",checked:!i.sendMedia,label:g("UserRestrictionsSendMedia"),blocking:!0,onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"sendStickers",checked:!i.sendStickers&&!i.sendGifs,label:g("UserRestrictionsSendStickers"),blocking:!0,onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"sendPolls",checked:!i.sendPolls,label:g("UserRestrictionsSendPolls"),blocking:!0,onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"embedLinks",checked:!i.embedLinks,label:g("UserRestrictionsEmbedLinks"),blocking:!0,onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"inviteUsers",checked:!i.inviteUsers,label:g("UserRestrictionsInviteUsers"),blocking:!0,onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"pinMessages",checked:!i.pinMessages,label:g("UserRestrictionsPinMessages"),blocking:!0,onChange:E})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"changeInfo",checked:!i.changeInfo,label:g("UserRestrictionsChangeInfo"),blocking:!0,onChange:E}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete-user",multiline:!0,narrow:!0,onClick:p},n.a.createElement("span",{className:"title"},g("ChannelBlockedUsers")),n.a.createElement("span",{className:"subtitle"},j))),n.a.createElement("div",{className:"section"},n.a.createElement("h3",{className:"section-heading",dir:"auto"},g("PrivacyExceptions")),n.a.createElement(Ee.a,{icon:"add-user",onClick:v},g("ChannelAddException")),C.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable exceptions-member",onClick:()=>O(e)},n.a.createElement(fe.a,{userId:e.userId,status:y(e)}))))),n.a.createElement(Ht.a,{isShown:m,onClick:f,ariaLabel:g("Save"),disabled:b},b?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))}));var rs=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),{byId:n}=e.users;return{chat:a,usersById:n}},(e,t)=>Object(b.l)(t,["updateChatMemberBannedRights"]))(({chat:e,usersById:t,updateChatMemberBannedRights:a,onClose:c,isActive:s})=>{const r=Object(F.a)();Object(A.a)(s,c);const o=Object(n.p)(()=>e&&e.fullInfo&&e.fullInfo.kickedMembers?e.fullInfo.kickedMembers:[],[e]),l=Object(n.m)(e=>{if(!e.kickedByUserId)return;const a=t[e.kickedByUserId];return a?r("UserRemovedBy",Object(u.bb)(a)):void 0},[r,t]),i=Object(n.m)(t=>{if(e)return[{title:r("Unblock"),icon:"delete",destructive:!0,handler:()=>a({chatId:e.id,userId:t.userId,bannedRights:{}})}]},[r,e,a]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",dir:r.isRtl?"rtl":void 0},n.a.createElement("p",{className:"text-muted"},r("NoBlockedGroup2")),o.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable",ripple:!0,contextActions:i(e)},n.a.createElement(fe.a,{userId:e.userId,status:l(e)}))))))}));var os=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),{progress:n}=e.management;return{chat:a,progress:n,isSignaturesShown:Boolean(a&&a.isSignaturesShown),canChangeInfo:Object(u.p)(a,"changeInfo")}},(e,t)=>Object(b.l)(t,["toggleSignatures","updateChat","closeManagement","leaveChannel","deleteChannel","openChat"]))(({chatId:e,chat:t,progress:a,isSignaturesShown:c,canChangeInfo:o,onScreenSelect:l,updateChat:i,toggleSignatures:d,closeManagement:m,leaveChannel:b,deleteChannel:h,openChat:g,onClose:p,isActive:v})=>{const E=t&&t.title||"",f=t&&t.fullInfo&&t.fullInfo.about||"",j=t&&t.fullInfo&&t.fullInfo.linkedChatId,[C,y,k]=Object(Ue.a)(),[N,w]=Object(n.r)(!1),[S,I]=Object(n.r)(E),[P,M]=Object(n.r)(f),[R,T]=Object(n.r)(),[D,B]=Object(n.r)(),x=t&&Object(u.e)(t),U=Object(O.a)(x,!1,s.ApiMediaFormat.BlobUrl),G=Object(F.a)();Object(A.a)(v,p),Object(n.n)(()=>{a===r.f.Complete&&(w(!1),B(void 0))},[a]);const q=t&&t.fullInfo&&t.fullInfo.adminMembers&&t.fullInfo.adminMembers.length||0,z=Object(n.m)(()=>{l(r.g.ChatPrivacyType)},[l]),_=Object(n.m)(()=>{l(r.g.Discussion)},[l]),H=Object(n.m)(()=>{l(r.g.ChatAdministrators)},[l]),$=Object(n.m)(e=>{T(e),w(!0)},[]),V=Object(n.m)(e=>{I(e.target.value),w(!0)},[]),W=Object(n.m)(e=>{M(e.target.value),w(!0)},[]),K=Object(n.m)(()=>{const t=S.trim(),a=P.trim();t.length?i({chatId:e,title:t,about:a,photo:R}):B("Channel title can't be empty")},[P,e,R,S,i]),Y=Object(n.m)(()=>{d({chatId:e,isEnabled:!c})},[e,c,d]),Q=Object(n.m)(()=>{l(r.g.ChannelSubscribers)},[l]),Z=Object(n.m)(()=>{t.isCreator?h({chatId:t.id}):b({chatId:t.id}),k(),m(),g({id:void 0})},[t.isCreator,t.id,k,m,b,h,g]);if(t.isRestricted)return;const J=a===r.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(_t.a,{currentAvatarBlobUrl:U,onChange:$,disabled:!o}),n.a.createElement(ve.a,{id:"channel-title",label:G("EnterChannelName"),onChange:V,value:S,error:"Channel title can't be empty"===D?D:void 0,disabled:!o}),n.a.createElement(ve.a,{id:"channel-about",className:"mb-2",label:G("DescriptionPlaceholder"),onChange:W,value:P,disabled:!o}),t.isCreator&&n.a.createElement(Ee.a,{icon:"lock",multiline:!0,onClick:z},n.a.createElement("span",{className:"title"},G("ChannelType")),n.a.createElement("span",{className:"subtitle"},t.username?G("TypePublic"):G("TypePrivate"))),n.a.createElement(Ee.a,{icon:"message",multiline:!0,onClick:_,disabled:!o},n.a.createElement("span",{className:"title"},G("Discussion")),n.a.createElement("span",{className:"subtitle"},G(j?"DiscussionUnlink":"Add"))),n.a.createElement(Ee.a,{icon:"admin",multiline:!0,onClick:H},n.a.createElement("span",{className:"title"},G("ChannelAdministrators")),n.a.createElement("span",{className:"subtitle"},q)),n.a.createElement("div",{className:"ListItem no-selection narrow"},n.a.createElement(sa.a,{checked:c,label:G("ChannelSignMessages"),onChange:Y}))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"group",multiline:!0,onClick:Q},n.a.createElement("span",{className:"title",dir:"auto"},G("ChannelSubscribers")),n.a.createElement("span",{className:"subtitle",dir:"auto"},G("Subscribers",t.membersCount,"i")))),n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:y},t.isCreator?G("ChannelDelete"):G("LeaveChannel")))),n.a.createElement(Ht.a,{isShown:N,onClick:K,disabled:J,ariaLabel:G("Save")},J?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Pe.a,{isOpen:C,onClose:k,text:t.isCreator?G("ChannelDeleteAlert"):G("ChannelLeaveAlert"),confirmLabel:t.isCreator?G("ChannelDelete"):G("LeaveChannel"),confirmHandler:Z,confirmIsDestructive:!0}))})),ls=a(59);var is=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),{isUsernameAvailable:n}=Object(m.ab)(e,t);return{chat:a,isChannel:Object(u.mb)(a),progress:e.management.progress,isUsernameAvailable:n}},(e,t)=>Object(b.l)(t,["checkPublicLink","updatePublicLink","updatePrivateLink"]))(({chat:e,onClose:t,isActive:a,isChannel:c,progress:s,isUsernameAvailable:o,checkPublicLink:l,updatePublicLink:i,updatePrivateLink:d})=>{const m=Boolean(e.username),u=e.fullInfo&&e.fullInfo.inviteLink,[b,h]=Object(n.r)(m?"public":"private"),[g,p]=Object(n.r)(),[v,O,E]=Object(Ue.a)(),f="public"===b&&g&&o||"private"===b&&m;Object(A.a)(a,t),Object(n.n)(()=>{b&&!u&&d()},[b,u,d]);const j=Object(n.m)(e=>{h(e)},[]),C=Object(n.m)(()=>{i({username:"public"===b?g:""})},[b,i,g]),y=Object(n.m)(()=>{E(),d()},[E,d]),k=Object(F.a)(),N=c?"Channel":"Mega",w=c?"Channel":"Group",S=[{value:"private",label:k(N+"Private"),subLabel:k(N+"PrivateInfo")},{value:"public",label:k(N+"Public"),subLabel:k(N+"PublicInfo")}],I=s===r.f.InProgress;return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",dir:k.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"section-heading"},k(w+"Type")),n.a.createElement(ze.a,{selected:b,name:"channel-type",options:S,onChange:j})),"private"===b?n.a.createElement("div",{className:"section",dir:k.isRtl?"rtl":void 0},u?n.a.createElement(n.a.Fragment,null,n.a.createElement(ls.a,{url:u,className:"group-link",text:u}),n.a.createElement("p",{className:"section-info",dir:k.isRtl?"rtl":void 0},k(N+"PrivateLinkHelp")),n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:O},k("RevokeLink")),n.a.createElement(Pe.a,{isOpen:v,onClose:E,text:k("RevokeAlert"),confirmLabel:k("RevokeButton"),confirmHandler:y,confirmIsDestructive:!0})):n.a.createElement(ge.a,null)):n.a.createElement("div",{className:"section no-border"},n.a.createElement(Kt,{asLink:!0,currentUsername:e.username,isLoading:I,isUsernameAvailable:o,checkUsername:l,onChange:p}),n.a.createElement("p",{className:"section-info",dir:"auto"},k(w+".Username.CreatePublicLinkHelp")))),n.a.createElement(Ht.a,{isShown:f,disabled:I,ariaLabel:k("Save"),onClick:C},I?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})))}));var ds=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),{forDiscussionIds:n,byId:c}=e.chats;return{chat:a,chatsByIds:c,forDiscussionIds:n,linkedChat:a&&a.fullInfo&&a.fullInfo.linkedChatId?Object(m.g)(e,a.fullInfo.linkedChatId):void 0,isChannel:a&&Object(u.mb)(a)}},(e,t)=>Object(b.l)(t,["loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup"]))(({chat:e,onClose:t,isActive:a,chatId:c,chatsByIds:s,linkedChat:l,forDiscussionIds:i,isChannel:d,onScreenSelect:m,loadGroupsForDiscussion:u,linkDiscussionGroup:b,unlinkDiscussionGroup:h})=>{const[g,p]=Object(n.r)(),[v,O]=Object(n.r)(),[E,f]=Object(n.r)(!1),j=Object(n.m)(()=>f(!0),[]),[C,y,k]=Object(Ue.a)(),[N,w,S]=Object(Ue.a)(),I=Object(F.a)(),P=l&&l.id;Object(A.a)(a,t),Object(n.n)(()=>{u()},[u]),Object(n.n)(()=>{v||Object(Zt.a)("DiscussionGroups").then(O)},[v]);const M=Object(n.m)(()=>{k(),h({channelId:d?c:P}),d||m(r.g.Initial)},[k,h,d,c,P,m]),L=Object(n.m)(()=>{S(),b({channelId:c,chatId:g})},[S,b,c,g]);function R(){const e=s[g];if(e)return n.a.createElement("div",{className:"modal-header"},n.a.createElement(U.a,{size:"tiny",chat:e}),n.a.createElement("div",{className:"modal-title"},I("Channel.DiscussionGroup.LinkGroup")))}function T(){const t=s[g];if(t)return t.hasPrivateLink?Object(x.a)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?`,["br","simple_markdown"]):Object(x.a)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?\n\nAnyone from the channel will be able to see messages in this group.`,["br","simple_markdown"])}return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement("div",{className:"section-icon"},v&&n.a.createElement(Jt.a,{id:"discussionGroupsDucks",size:o.Eb,animationData:v,play:E,noLoop:!0,onLoad:j})),l&&n.a.createElement("div",null,n.a.createElement(Ee.a,{className:"chat-item-clickable",inactive:!0},n.a.createElement(je.a,{chatId:l.id})),n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:y},I(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel")),n.a.createElement(Pe.a,{isOpen:C,onClose:k,header:n.a.createElement("div",{className:"modal-header"},n.a.createElement(U.a,{size:"tiny",chat:l}),n.a.createElement("div",{className:"modal-title"},I(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"))),textParts:Object(x.a)(I(d?"DiscussionUnlinkChannelAlert":"DiscussionUnlinkGroupAlert",l.title),["br","simple_markdown"]),confirmLabel:I(d?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"),confirmHandler:M,confirmIsDestructive:!0})),!l&&n.a.createElement("div",null,n.a.createElement("p",{className:"section-help",dir:"auto"},I("DiscussionChannelHelp")),n.a.createElement("div",{teactFastList:!0},n.a.createElement(Ee.a,{key:"create-group",icon:"group",ripple:!0,teactOrderKey:0,className:"not-implemented"},I("DiscussionCreateGroup")),i?i.map((e,t)=>n.a.createElement(Ee.a,{key:e,teactOrderKey:t+1,className:"chat-item-clickable scroll-item",onClick:()=>{p(e),w()}},n.a.createElement(je.a,{chatId:e}))):n.a.createElement(ct.a,{key:"nothing-found",teactOrderKey:0,text:"No discussion groups found"})),n.a.createElement("p",{className:"mt-4 mb-0 section-help",dir:"auto"},I("DiscussionChannelHelp2")),n.a.createElement(Pe.a,{isOpen:N,onClose:S,header:R(),textParts:T(),confirmLabel:I("DiscussionLinkGroup"),confirmHandler:L,isButtonsInOneRow:!0})))))}));var ms=Object(n.h)(Object(c.h)((e,{chatId:t,isPromotedByCurrentUser:a})=>{const n=Object(m.g)(e,t);return{chat:n,isFormFullyDisabled:!(n.isCreator||a)}},(e,t)=>Object(b.l)(t,["updateChatMemberBannedRights"]))(({chat:e,selectedChatMemberId:t,onScreenSelect:a,updateChatMemberBannedRights:c,isFormFullyDisabled:s,onClose:o,isActive:l})=>{const[i,d]=Object(n.r)({}),[m,u]=Object(n.r)(!1),[b,h]=Object(n.r)(!1),[g,p,v]=Object(Ue.a)(),O=Object(F.a)();Object(A.a)(l,o);const E=Object(n.p)(()=>{if(e&&e.fullInfo&&e.fullInfo.members)return e.fullInfo.members.find(({userId:e})=>e===t)},[e,t]);Object(n.n)(()=>{e&&e.fullInfo&&t&&!E&&a(r.g.GroupPermissions)},[e,a,E,t]),Object(n.n)(()=>{d(E&&E.bannedRights||e&&e.defaultBannedRights||{}),u(!1),h(!1)},[e,E]);const f=Object(n.m)(e=>{const{name:t}=e.target;function a(e){return!e||void 0}d(e=>({...e,[t]:a(e[t]),..."sendStickers"===t&&{sendGifs:a(e[t])}})),u(!0)},[]),j=Object(n.m)(()=>{e&&t&&(h(!0),c({chatId:e.id,userId:t,bannedRights:i}))},[e,t,i,c]),C=Object(n.m)(()=>{e&&t&&c({chatId:e.id,userId:t,bannedRights:{viewMessages:!0}})},[e,t,c]),y=Object(n.m)(t=>!!s||!(!e||!e.defaultBannedRights)&&e.defaultBannedRights[t],[e,s]);if(E)return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(fe.a,{userId:E.userId})),n.a.createElement("h3",{className:"section-heading mt-4",dir:"auto"},O("UserRestrictionsCanDo")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"sendMessages",checked:!i.sendMessages,label:O("UserRestrictionsSend"),blocking:!0,disabled:y("sendMessages"),onChange:f})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"sendMedia",checked:!i.sendMedia,label:O("UserRestrictionsSendMedia"),blocking:!0,disabled:y("sendMedia"),onChange:f})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"sendStickers",checked:!i.sendStickers&&!i.sendGifs,label:O("UserRestrictionsSendStickers"),blocking:!0,disabled:y("sendStickers"),onChange:f})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"sendPolls",checked:!i.sendPolls,label:O("UserRestrictionsSendPolls"),blocking:!0,disabled:y("sendPolls"),onChange:f})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"embedLinks",checked:!i.embedLinks,label:O("UserRestrictionsEmbedLinks"),blocking:!0,disabled:y("embedLinks"),onChange:f})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"inviteUsers",checked:!i.inviteUsers,label:O("UserRestrictionsInviteUsers"),blocking:!0,disabled:y("inviteUsers"),onChange:f})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"pinMessages",checked:!i.pinMessages,label:O("UserRestrictionsPinMessages"),blocking:!0,disabled:y("pinMessages"),onChange:f})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"changeInfo",checked:!i.changeInfo,label:O("UserRestrictionsChangeInfo"),blocking:!0,disabled:y("changeInfo"),onChange:f}))),!s&&n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"delete-user",ripple:!0,destructive:!0,onClick:p},O("UserRestrictionsBlock")))),n.a.createElement(Ht.a,{isShown:m,onClick:j,ariaLabel:O("Save"),disabled:b},b?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Pe.a,{isOpen:g,onClose:v,text:"Are you sure you want to ban and remove this user from the group?",confirmLabel:"Remove",confirmHandler:C,confirmIsDestructive:!0}))}));var us=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),{byId:n}=e.users;return{chat:a,currentUserId:e.currentUserId,isChannel:Object(u.mb)(a),usersById:n}})(({chat:e,isChannel:t,currentUserId:a,usersById:c,onScreenSelect:s,onChatMemberSelect:o,onClose:l,isActive:i})=>{const d=Object(F.a)();Object(A.a)(i,l);const m=Object(n.p)(()=>e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort((e,t)=>e.isOwner?-1:t.isOwner?1:0):[],[e]),b=Object(n.m)(e=>{o(e.userId,e.promotedByUserId===a),s(r.g.ChatAdminRights)},[a,o,s]),h=Object(n.m)(e=>{if(e.isOwner)return d("ChannelCreator");const t=e.promotedByUserId?c[e.promotedByUserId]:void 0;return t?d("EditAdminPromotedBy",Object(u.bb)(t)):d("ChannelAdmin")},[d,c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{icon:"recent",multiline:!0,onClick:function(){s(r.g.GroupRecentActions)}},n.a.createElement("span",{className:"title"},d("EventLog")),n.a.createElement("span",{className:"subtitle"},d(t?"EventLogInfoDetailChannel":"EventLogInfoDetail")))),n.a.createElement("div",{className:"section",dir:d.isRtl?"rtl":void 0},n.a.createElement("p",{className:"text-muted",dir:"auto"},t?"You can add administrators to help you manage your channel.":"You can add administrators to help you manage your group."),m.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable",onClick:()=>b(e)},n.a.createElement(fe.a,{userId:e.userId,status:h(e),forceShowSelf:!0}))))))}));var bs=Object(n.h)(Object(c.h)((e,{chatId:t})=>({chat:Object(m.g)(e,t)}))(({chat:e,onClose:t,isActive:a})=>{const c=Object(F.a)();Object(A.a)(a,t);const s=Object(n.p)(()=>e&&e.fullInfo&&e.fullInfo.adminMembers?e.fullInfo.adminMembers.sort((e,t)=>e.isOwner?-1:t.isOwner?1:0):[],[e]),r=Object(n.m)(e=>e.isOwner?c("ChannelCreator"):c("ChannelAdmin"),[c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section not-implemented",dir:c.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"section-heading",dir:"auto"},"Actions"),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"changeInfo",checked:!0,label:c("EventLogAllEvents"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"changeInfo",checked:!0,label:c("EventLogFilterNewAdmins"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"changeInfo",checked:!0,label:c("EventLogFilterNewMembers"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"changeInfo",checked:!0,label:c("EventLogFilterChannelInfo"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"changeInfo",checked:!0,label:c("EventLogFilterDeletedMessages"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"changeInfo",checked:!0,label:c("EventLogFilterEditedMessages"),onChange:void 0})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"changeInfo",checked:!0,label:c("EventLogFilterLeavingMembers"),onChange:void 0}))),n.a.createElement("div",{className:"section not-implemented",dir:c.isRtl?"rtl":void 0},n.a.createElement("h3",{className:"section-heading",dir:"auto"},c("Channel.Management.Title")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"changeInfo",checked:!0,label:c("EventLogAllAdmins"),onChange:void 0})),s.map(e=>n.a.createElement(Ee.a,{key:e.userId,className:"chat-item-clickable picker-list-item",onClick:void 0,ripple:!0},n.a.createElement(sa.a,{label:"",checked:!0}),n.a.createElement(fe.a,{userId:e.userId,status:r(e),forceShowSelf:!0}))))))}));var hs=Object(n.h)(Object(c.h)((e,{chatId:t,isPromotedByCurrentUser:a})=>{const n=Object(m.g)(e,t),{byId:c}=e.users,{currentUserId:s}=e;return{chat:n,usersById:c,currentUserId:s,isChannel:Object(u.mb)(n),isFormFullyDisabled:!(n.isCreator||a)}},(e,t)=>Object(b.l)(t,["updateChatAdmin"]))(({selectedChatMemberId:e,onScreenSelect:t,chat:a,usersById:c,currentUserId:s,isChannel:o,isFormFullyDisabled:l,updateChatAdmin:i,onClose:d,isActive:m})=>{const[b,h]=Object(n.r)({}),[g,p]=Object(n.r)(!1),[v,O]=Object(n.r)(!1),[E,f,j]=Object(Ue.a)(),[C,y]=Object(n.r)(""),k=Object(F.a)();Object(A.a)(m,d);const N=Object(n.p)(()=>{if(a.fullInfo&&a.fullInfo.adminMembers)return a.fullInfo.adminMembers.find(({userId:t})=>t===e)},[a,e]);Object(n.n)(()=>{a&&a.fullInfo&&e&&!N&&t(r.g.ChatAdministrators)},[a,t,N,e]),Object(n.n)(()=>{h(N&&N.adminRights||{}),y((N&&N.customTitle||"").substr(0,16)),p(!1),O(!1)},[N]);const w=Object(n.m)(e=>{const{name:t}=e.target;h(e=>{return{...e,[t]:(a=e[t],!a||void 0)};var a}),p(!0)},[]),S=Object(n.m)(()=>{e&&(O(!0),i({chatId:a.id,userId:e,adminRights:b,customTitle:C}))},[a,e,b,C,i]),I=Object(n.m)(()=>{e&&(i({chatId:a.id,userId:e,adminRights:{}}),j())},[a.id,j,e,i]),P=Object(n.m)(e=>!Object(u.lb)(a)&&(!(!l&&a.adminRights)||!a.adminRights[e]),[a,l]),M=Object(n.p)(()=>{if(!N)return;if(N.isOwner)return k("ChannelCreator");const e=N.promotedByUserId?c[N.promotedByUserId]:void 0;return e?k("EditAdminPromotedBy",Object(u.bb)(e)):k("ChannelAdmin")},[N,c,k]),R=Object(n.m)(e=>{const{value:t}=e.target;y(t),p(!0)},[]);if(N)return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section"},n.a.createElement(Ee.a,{inactive:!0,className:"chat-item-clickable"},n.a.createElement(fe.a,{userId:N.userId,status:M,forceShowSelf:!0})),n.a.createElement("h3",{className:"section-heading mt-4",dir:"auto"},k("EditAdminWhatCanDo")),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"changeInfo",checked:!!b.changeInfo,label:k(o?"EditAdminChangeChannelInfo":"EditAdminChangeGroupInfo"),blocking:!0,disabled:P("changeInfo"),onChange:w})),o&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"postMessages",checked:!!b.postMessages,label:k("EditAdminPostMessages"),blocking:!0,disabled:P("postMessages"),onChange:w})),o&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"editMessages",checked:!!b.editMessages,label:k("EditAdminEditMessages"),blocking:!0,disabled:P("editMessages"),onChange:w})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"deleteMessages",checked:!!b.deleteMessages,label:k(o?"EditAdminDeleteMessages":"EditAdminGroupDeleteMessages"),blocking:!0,disabled:P("deleteMessages"),onChange:w})),!o&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"banUsers",checked:!!b.banUsers,label:k("EditAdminBanUsers"),blocking:!0,disabled:P("banUsers"),onChange:w})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"inviteUsers",checked:!!b.inviteUsers,label:k("EditAdminAddUsers"),blocking:!0,disabled:P("inviteUsers"),onChange:w})),!o&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"pinMessages",checked:!!b.pinMessages,label:k("EditAdminPinMessages"),blocking:!0,disabled:P("pinMessages"),onChange:w})),n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"addAdmins",checked:!!b.addAdmins,label:k("EditAdminAddAdmins"),blocking:!0,disabled:P("addAdmins"),onChange:w})),!o&&n.a.createElement("div",{className:"ListItem no-selection"},n.a.createElement(sa.a,{name:"anonymous",checked:!!b.anonymous,label:k("EditAdminSendAnonymously"),blocking:!0,disabled:P("anonymous"),onChange:w})),l&&n.a.createElement("p",{className:"section-info mb-4",dir:"auto"},k("Channel.EditAdmin.CannotEdit")),!o&&n.a.createElement(ve.a,{id:"admin-title",label:k("EditAdminRank"),onChange:R,value:C,disabled:l,maxLength:16}),s!==e&&!l&&n.a.createElement(Ee.a,{icon:"delete",ripple:!0,destructive:!0,onClick:f},k("EditAdminRemoveAdmin")))),n.a.createElement(Ht.a,{isShown:g,onClick:S,ariaLabel:k("Save"),disabled:v},v?n.a.createElement(L.a,{color:"white"}):n.a.createElement("i",{className:"icon-check"})),n.a.createElement(Pe.a,{isOpen:E,onClose:j,text:"Are you sure you want to dismiss this admin?",confirmLabel:"Dismiss",confirmHandler:I,confirmIsDestructive:!0}))}));var gs=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),{byId:n}=e.users;return{members:a&&a.fullInfo&&a.fullInfo.members,usersById:n,isChannel:a&&Object(u.mb)(a),serverTimeOffset:e.serverTimeOffset}},(e,t)=>Object(b.l)(t,["openUserInfo"]))(({members:e,usersById:t,isChannel:a,openUserInfo:c,onClose:s,isActive:r,serverTimeOffset:o})=>{const l=Object(n.p)(()=>{if(e&&t)return Object(u.Jb)(e.map(({userId:e})=>e),t,void 0,o)},[e,o,t]),i=Object(n.m)(e=>{c({id:e})},[c]);return Object(A.a)(r,s),n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",teactFastList:!0},l?l.map((e,t)=>n.a.createElement(Ee.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>i(e)},n.a.createElement(fe.a,{userId:e,forceShowSelf:!0}))):n.a.createElement(ct.a,{teactOrderKey:0,key:"nothing-found",text:a?"No subscribers found":"No members found"}))))}));var ps=Object(n.h)(Object(c.h)((e,{chatId:t})=>{const a=Object(m.g)(e,t),{byId:n}=e.users;return{members:a&&a.fullInfo&&a.fullInfo.members,usersById:n,isChannel:a&&Object(u.mb)(a),serverTimeOffset:e.serverTimeOffset}})(({usersById:e,members:t,isChannel:a,onScreenSelect:c,onChatMemberSelect:s,onClose:o,isActive:l,serverTimeOffset:i})=>{Object(A.a)(l,o);const d=Object(n.p)(()=>{if(t&&e)return Object(u.Jb)(t.filter(e=>!e.isOwner).map(({userId:e})=>e),e,void 0,i)},[t,i,e]),m=Object(n.m)(e=>{s(e),c(r.g.GroupUserPermissions)},[s,c]);return n.a.createElement("div",{className:"Management"},n.a.createElement("div",{className:"custom-scroll"},n.a.createElement("div",{className:"section",teactFastList:!0},d?d.map((e,t)=>n.a.createElement(Ee.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>m(e)},n.a.createElement(fe.a,{userId:e,forceShowSelf:!0}))):n.a.createElement(ct.a,{teactOrderKey:0,key:"nothing-found",text:a?"No subscribers found":"No members found"}))))}));var vs=Object(n.h)(Object(c.h)(e=>({managementType:Object(m.v)(e)}))(({chatId:e,currentScreen:t,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:s,onChatMemberSelect:o,onClose:l,isActive:i,managementType:d})=>{switch(t){case r.g.Initial:switch(d){case"user":return n.a.createElement(ns,{key:e,userId:e,onClose:l,isActive:i});case"group":return n.a.createElement(cs,{key:e,chatId:e,onScreenSelect:s,onClose:l,isActive:i||[r.g.ChatPrivacyType,r.g.Discussion,r.g.GroupPermissions,r.g.ChatAdministrators,r.g.GroupRemovedUsers,r.g.GroupUserPermissionsCreate,r.g.GroupUserPermissions,r.g.ChatAdminRights,r.g.GroupRecentActions].includes(t)});case"channel":return n.a.createElement(os,{key:e,chatId:e,onScreenSelect:s,onClose:l,isActive:i||[r.g.ChannelSubscribers,r.g.ChatAdministrators,r.g.Discussion,r.g.ChatPrivacyType,r.g.ChatAdminRights,r.g.GroupRecentActions].includes(t)})}break;case r.g.ChatPrivacyType:return n.a.createElement(is,{chatId:e,isActive:i,onClose:l});case r.g.Discussion:return n.a.createElement(ds,{chatId:e,onScreenSelect:s,isActive:i,onClose:l});case r.g.GroupPermissions:return n.a.createElement(ss,{chatId:e,onScreenSelect:s,onChatMemberSelect:o,isActive:i||[r.g.GroupRemovedUsers,r.g.GroupUserPermissionsCreate,r.g.GroupUserPermissions].includes(t),onClose:l});case r.g.GroupRemovedUsers:return n.a.createElement(rs,{chatId:e,isActive:i,onClose:l});case r.g.GroupUserPermissionsCreate:return n.a.createElement(ps,{chatId:e,onChatMemberSelect:o,onScreenSelect:s,isActive:i||[r.g.GroupUserPermissions].includes(t),onClose:l});case r.g.GroupUserPermissions:return n.a.createElement(ms,{chatId:e,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:s,isActive:i,onClose:l});case r.g.ChatAdministrators:return n.a.createElement(us,{chatId:e,onScreenSelect:s,onChatMemberSelect:o,isActive:i||[r.g.ChatAdminRights,r.g.GroupRecentActions].includes(t),onClose:l});case r.g.GroupRecentActions:return n.a.createElement(bs,{chatId:e,isActive:i,onClose:l});case r.g.ChatAdminRights:return n.a.createElement(hs,{chatId:e,selectedChatMemberId:a,isPromotedByCurrentUser:c,onScreenSelect:s,isActive:i,onClose:l});case r.g.ChannelSubscribers:case r.g.GroupMembers:return n.a.createElement(gs,{chatId:e,isActive:i,onClose:l})}}));const Os={USD:"$",EUR:"€",GBP:"£",JPY:"¥",RUB:"₽",UAH:"₴",INR:"₹",AED:"د.إ"};function Es(e){return e&&Os[e]||""}const fs=/^4[0-9]{12}(?:[0-9]{1,3})?$/,js=/^5[1-5][0-9]{11,14}$/,Cs=/^2[2-7][0-9]{11,14}$/;let ys;!function(e){e[e.Default=0]="Default",e[e.Visa=1]="Visa",e[e.Mastercard=2]="Mastercard"}(ys||(ys={}));const ks={[ys.Default]:"",[ys.Visa]:"visa",[ys.Mastercard]:"mastercard"};function Ns(e){return e=e.replace(/\s/g,""),fs.test(e)?ys.Visa:js.test(e)||Cs.test(e)?ys.Mastercard:ys.Default}var ws=a(61);const Ss={streetLine1:"",streetLine2:"",city:"",state:"",countryIso2:"",postCode:"",fullName:"",email:"",phone:"",shipping:"",cardNumber:"",cardholder:"",expiry:"",cvv:"",billingCountry:"",billingZip:"",saveInfo:!0,saveCredentials:!1,formErrors:{}},Is=(e,t)=>{switch(t.type){case"changeAddress1":return{...e,streetLine1:t.payload,formErrors:{...e.formErrors,streetLine1:void 0}};case"changeAddress2":return{...e,streetLine2:t.payload,formErrors:{...e.formErrors,streetLine2:void 0}};case"changeCity":return{...e,city:t.payload,formErrors:{...e.formErrors,city:void 0}};case"changeState":return{...e,state:t.payload,formErrors:{...e.formErrors,state:void 0}};case"changeCountry":return{...e,countryIso2:t.payload,billingCountry:Ps(t.payload),formErrors:{...e.formErrors,countryIso2:void 0}};case"changePostCode":return{...e,postCode:t.payload,formErrors:{...e.formErrors,postCode:void 0}};case"changeFullName":return{...e,fullName:t.payload,formErrors:{...e.formErrors,fullName:void 0}};case"changeEmail":return{...e,email:t.payload,formErrors:{...e.formErrors,email:void 0}};case"changePhone":return{...e,phone:t.payload,formErrors:{...e.formErrors,phone:void 0}};case"changeShipping":return{...e,shipping:t.payload};case"changeCardNumber":return{...e,cardNumber:t.payload,formErrors:{...e.formErrors,cardNumber:void 0}};case"changeCardholder":return{...e,cardholder:t.payload,formErrors:{...e.formErrors,cardholder:void 0}};case"changeExpiryDate":return{...e,expiry:t.payload,formErrors:{...e.formErrors,expiry:void 0}};case"changeCvvCode":return{...e,cvv:t.payload,formErrors:{...e.formErrors,cvv:void 0}};case"changeBillingCountry":return{...e,billingCountry:t.payload,formErrors:{...e.formErrors,billingCountry:void 0}};case"changeBillingZip":return{...e,billingZip:t.payload,formErrors:{...e.formErrors,billingZip:void 0}};case"changeSaveInfo":return{...e,saveInfo:t.payload};case"changeSaveCredentials":return{...e,saveCredentials:t.payload};case"updateUserInfo":return t.payload.countryIso2?{...e,...t.payload,billingCountry:Ps(t.payload.countryIso2)}:{...e,...t.payload};case"setFormErrors":return{...e,formErrors:{...e.formErrors,...t.payload}};default:return e}};function Ps(e){const t=qt.a.find(({id:t})=>t===e);return t?t.name:""}function Ms(e,t=400){Object(n.n)(()=>{l.n||setTimeout(()=>{Object(V.b)(()=>{e.current&&e.current.focus()})},t)},[e,t])}var Fs=Object(n.h)(e=>{const{id:t,value:a,label:c,hasArrow:s,error:r,ref:o,placeholder:l,onChange:i,children:d}=e,m=r||c,u=Object(W.a)("input-group",a&&"touched",r&&"error",m&&"with-label",s&&"with-arrow","input-group");return n.a.createElement("div",{className:u},n.a.createElement("select",{className:"form-control",id:t,value:a||"",onChange:i,placeholder:l||c,ref:o},d),m&&t&&n.a.createElement("label",{htmlFor:t},m))});a(314);var As=Object(n.h)(({state:e,needEmail:t,needPhone:a,needName:c,needAddress:s,dispatch:r})=>{const o=Object(n.q)(null),l=Object(n.q)(null),i=Object(n.q)(null);Object(n.n)(()=>{i.current&&i.current.value!==e.countryIso2&&(i.current.value=e.countryIso2)},[e.countryIso2]);const d=Object(F.a)();Ms(o);const m=Object(n.m)(e=>{r({type:"changeAddress1",payload:e.target.value})},[r]),u=Object(n.m)(e=>{r({type:"changeAddress2",payload:e.target.value})},[r]),b=Object(n.m)(e=>{r({type:"changeCity",payload:e.target.value})},[r]),h=Object(n.m)(e=>{r({type:"changeState",payload:e.target.value})},[r]),g=Object(n.m)(e=>{r({type:"changeCountry",payload:e.target.value})},[r]),p=Object(n.m)(e=>{r({type:"changePostCode",payload:e.target.value})},[r]),v=Object(n.m)(e=>{r({type:"changeFullName",payload:e.target.value})},[r]),O=Object(n.m)(e=>{r({type:"changeEmail",payload:e.target.value})},[r]),E=Object(n.m)(e=>{let{value:t}=e.target;t="+"+t.replace(/\D/g,""),l.current&&(l.current.value=t),r({type:"changePhone",payload:t})},[r]),f=Object(n.m)(e=>{r({type:"changeSaveInfo",payload:e.target.value})},[r]),{formErrors:j}=e;return n.a.createElement("div",{className:"ShippingInfo"},n.a.createElement("form",null,s?n.a.createElement("div",null,n.a.createElement("h5",null,d("PaymentShippingAddress")),n.a.createElement(ve.a,{ref:o,label:"Address1 (Street)",onChange:m,value:e.streetLine1,inputMode:"text",error:j.streetLine1}),n.a.createElement(ve.a,{label:"Address2 (Street)",onChange:u,value:e.streetLine2,inputMode:"text",error:j.streetLine2}),n.a.createElement(ve.a,{label:"City",onChange:b,value:e.city,inputMode:"text",error:j.city}),n.a.createElement(ve.a,{label:"State",onChange:h,value:e.state,inputMode:"text",error:j.state}),n.a.createElement(Fs,{label:"Country",placeholder:"Country",onChange:g,value:e.countryIso2,hasArrow:Boolean(!0),id:"shipping-country",error:j.countryIso2,ref:i},qt.a.map(({name:e,id:t})=>n.a.createElement("option",{value:t,className:"county-item"},e))),n.a.createElement(ve.a,{label:"Post Code",onChange:p,value:e.postCode,inputMode:"text",error:j.postCode})):void 0,c||t||a?n.a.createElement("h5",null,d("PaymentShippingReceiver")):void 0,c&&n.a.createElement(ve.a,{label:"Full name",onChange:v,value:e.fullName,inputMode:"text",error:j.fullName}),t&&n.a.createElement(ve.a,{label:"Email",onChange:O,value:e.email,inputMode:"email",error:j.email}),a&&n.a.createElement(ve.a,{label:"Phone number",onChange:E,value:e.phone,inputMode:"tel",error:j.phone,ref:l}),n.a.createElement(sa.a,{label:d("PaymentShippingSave"),subLabel:d("PaymentShippingSaveInfo"),checked:Boolean(e.saveInfo),onChange:f})))});a(315);var Ls=Object(n.h)(({state:e,shippingOptions:t,currency:a,dispatch:c})=>{Object(n.n)(()=>{t&&!e.shipping&&c({type:"changeShipping",payload:t[0].id})},[t,e.shipping,c]);const s=Object(n.m)(e=>{c({type:"changeShipping",payload:e})},[c]),r=Object(n.p)(()=>t.map(({id:e,title:t,amount:n})=>({label:t,subLabel:`${a} ${String(n/100)}`,value:e})),[t,a]);return n.a.createElement("div",{className:"Shipping"},n.a.createElement("form",null,n.a.createElement("p",null,"Select shipping method"),n.a.createElement(ze.a,{name:"shipping-options",options:r,onChange:s,selected:e.shipping})))});a(316);function Rs(e,t,a,c=!1){return n.a.createElement("div",{className:"price-info-item "+(c?"price-info-item-main":"")},n.a.createElement("div",{className:"title"},e),n.a.createElement("div",{className:"value"},`${a||""} ${(t/100).toFixed(2)}`))}function Ts(e,t,a){return n.a.createElement("div",{className:"checkout-info-item"},n.a.createElement("i",{className:e}," "),n.a.createElement("div",{className:"info"},n.a.createElement("div",{className:"title"},t),n.a.createElement("p",{className:"data"},a)))}var Ds=Object(n.h)(({invoiceContent:e,prices:t,shippingPrices:a,checkoutInfo:c,currency:s,totalPrice:r})=>{const{photoUrl:o,title:l,text:i}=e||{},{paymentMethod:d,paymentProvider:m,shippingAddress:u,name:b,phone:h,shippingMethod:g}=c||{};return n.a.createElement("div",{className:"Checkout"},n.a.createElement("div",{className:"description has-image"},o&&n.a.createElement("img",{src:o,alt:""}),n.a.createElement("div",{className:"text"},n.a.createElement("h5",null,l),n.a.createElement("p",null,i))),n.a.createElement("div",{className:"price-info"},t&&t.map(e=>Rs(e.label,e.amount,s,!1)),a&&a.map(e=>Rs(e.label,e.amount,s,!1)),void 0!==r&&Rs("Total",r,s,!0)),n.a.createElement("div",{className:"invoice-info"},d&&Ts("icon-card",d,"Payment method"),m&&Ts("stripe-provider",m,"Payment provider"),u&&Ts("icon-location",u,"Shipping address"),b&&Ts("icon-user",b,"Name"),h&&Ts("icon-phone",h,"Phone number"),g&&Ts("icon-truck",g,"Shipping method")))});var Bs=Object(n.h)(({value:e,error:t,onChange:a})=>{const c=Object(n.q)(null),s=Object(n.m)(t=>{if("Backspace"===t.key&&"/"===e.charAt(e.length-1)){const t=e.slice(0,e.length-1);c.current&&(c.current.value=t)}},[e]),r=Object(n.m)(e=>{a(function(e){const t=(e=e.replace(/[^\d]/g,"").slice(0,4)).match(/.{1,2}/g);return t&&t[0]&&Number(t[0])>12&&(t[0]="12"),t&&t[0]&&2===t[0].length&&!t[1]&&(t[1]=""),t?t.join("/"):""}(e.target.value))},[a]);return n.a.createElement(ve.a,{label:"Expiry date",ref:c,onChange:r,onKeyDown:s,value:e,error:t,inputMode:"numeric",maxLength:5})}),xs=(a(317),a.p+"mastercard.4216118edafe23cc2dec7b8807ba4622.svg"),Us=a.p+"visa.e5a7c336e1deb4b92a636e2e053878c4.svg";var Gs=Object(n.h)(({value:e,error:t,onChange:a})=>{const c=Object(n.q)(null);Ms(c);const[s,r]=Object(n.r)(ys.Default);Object(n.n)(()=>{const t=Ns(e);r(t)},[]);const o=Object(n.m)(e=>{const t=function(e){const t=(e=e.replace(/[^\d]/g,"")).match(/.{1,4}/g);return t?t.join(" "):""}(e.target.value),n=Ns(e.target.value);r(n),a(t),c.current&&(c.current.value=t)},[a,c]),l=function(e){switch(e){case ys.Mastercard:return n.a.createElement("img",{src:xs,alt:""});case ys.Visa:return n.a.createElement("img",{src:Us,alt:""});default:return}}(s);return n.a.createElement("div",{className:"CardInput"},n.a.createElement("span",{className:"left-addon"},l),n.a.createElement(ve.a,{ref:c,label:"Card number",onChange:o,value:e,inputMode:"numeric",className:s?"has-left-addon":"",error:t,maxLength:23}))});a(318);var qs=Object(n.h)(({state:e,canSaveCredentials:t,needCardholderName:a,needCountry:c,needZip:s,dispatch:r})=>{const o=Object(n.q)(null);Object(n.n)(()=>{o.current&&o.current.value!==e.billingCountry&&(o.current.value=e.billingCountry)},[e.billingCountry]);const l=Object(n.m)(e=>{r({type:"changeCardNumber",payload:e})},[r]),i=Object(n.m)(e=>{r({type:"changeCardholder",payload:e.target.value.toUpperCase()})},[r]),d=Object(n.m)(e=>{r({type:"changeExpiryDate",payload:e})},[r]),m=Object(n.m)(e=>{r({type:"changeCvvCode",payload:e.target.value})},[r]),u=Object(n.m)(e=>{r({type:"changeBillingCountry",payload:e.target.value})},[r]),b=Object(n.m)(e=>{r({type:"changeBillingZip",payload:e.target.value})},[r]),h=Object(n.m)(e=>{r({type:"changeSaveCredentials",payload:e.target.value})},[r]),g=Object(F.a)(),{formErrors:p={}}=e;return n.a.createElement("div",{className:"PaymentInfo"},n.a.createElement("form",null,n.a.createElement("h5",null,g("PaymentCardTitle")),n.a.createElement(Gs,{onChange:l,value:e.cardNumber,error:p.cardNumber}),a&&n.a.createElement(ve.a,{label:"Name on card",onChange:i,value:e.cardholder,inputMode:"text",error:p.cardholder}),n.a.createElement("section",{className:"inline-inputs"},n.a.createElement(Bs,{value:e.expiry,onChange:d,error:p.expiry}),n.a.createElement(ve.a,{label:"CVV code",onChange:m,value:e.cvv,inputMode:"numeric",maxLength:3,error:p.cvv})),c||s?n.a.createElement("h5",null,g("PaymentBillingAddress")):void 0,c&&n.a.createElement(Fs,{label:"Country",placeholder:"Country",onChange:u,value:e.billingCountry,hasArrow:Boolean(!0),id:"billing-country",error:p.billingCountry,ref:o},qt.a.map(({name:e})=>n.a.createElement("option",{value:e,className:"county-item"},e))),s&&n.a.createElement(ve.a,{label:"Post Code",onChange:b,value:e.billingZip,inputMode:"text",error:p.billingZip}),t&&n.a.createElement(sa.a,{label:g("PaymentCardSavePaymentInformation"),checked:e.saveCredentials,onChange:h})))});a(193);var zs=Object(n.h)(Object(c.h)(e=>{const{step:t,shippingOptions:a,savedInfo:n,canSaveCredentials:c,invoice:s,invoiceContent:r,nativeProvider:o,nativeParams:l,passwordMissing:i,error:d}=e.payment,m=Boolean(s&&(!o||"stripe"!==o)),{needCardholderName:u,needCountry:b,needZip:h}=l||{},{nameRequested:g,phoneRequested:p,emailRequested:v,shippingAddressRequested:O,flexible:E,phoneToProvider:f,emailToProvider:j,currency:C,prices:y}=s||{};return{step:t,shippingOptions:a,savedInfo:n,canSaveCredentials:c,nativeProvider:o,passwordMissing:i,nameRequested:g,shippingAddressRequested:O,phoneRequested:p,emailRequested:v,flexible:E,phoneToProvider:f,emailToProvider:j,currency:C,prices:y,isProviderError:m,invoiceContent:r,needCardholderName:u,needCountry:b,needZip:h,error:d,globalDialogs:e.dialogs}},(e,t)=>Object(b.l)(t,["validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError"]))(({isOpen:e,onClose:t,step:a,shippingOptions:c,savedInfo:s,canSaveCredentials:o,nameRequested:l,shippingAddressRequested:i,phoneRequested:d,emailRequested:m,phoneToProvider:u,emailToProvider:b,currency:h,passwordMissing:g,isProviderError:p,invoiceContent:v,nativeProvider:O,prices:E,needCardholderName:f,needCountry:j,needZip:C,error:y,globalDialogs:k,validateRequestedInfo:N,sendPaymentForm:w,setPaymentStep:S,sendCredentialsInfo:I,clearPaymentError:P})=>{const[M,A]=Pt(Is,Ss),R=Es(h),[B,x]=Object(n.r)(!1),U=Object(F.a)();Object(n.n)(()=>{(a||y||k)&&x(!1)},[a,y,k]),Object(n.n)(()=>{if(y&&y.field)A({type:"setFormErrors",payload:{[y.field]:y.fieldError}});else if(k&&k.length){const e=Object(ws.a)(k);A({type:"setFormErrors",payload:{...e}})}},[y,k,A]),Object(n.n)(()=>{if(s){const{name:e,phone:t,email:a,shippingAddress:n}=s;A({type:"updateUserInfo",payload:{fullName:e,phone:t&&"+"!==t.charAt(0)?"+"+t:t,email:a,...n||{}}})}},[s,A]);const G=Object(n.m)(()=>{P()},[P]),q=Object(n.p)(()=>a!==r.j.Checkout?0:function(e=[],t,a){const n=t?Hs(t,a):[];let c=0;const s=e.concat(n||[]);return c=s.reduce((e,t)=>e+t.amount,c),c}(E,c,M.shipping),[a,M.shipping,E,c]),z=Object(n.p)(()=>{if(a===r.j.Checkout)return function(e,t,a){const n=`${function(e){const t=Ns(e);return ks[t]||""}(e.cardNumber)} *${e.cardNumber.slice(-4)}`,c=e.streetLine1?`${e.streetLine1}, ${e.city}, ${e.countryIso2}`:void 0,{phone:s,fullName:r}=e,o=t?_s(t,e.shipping):void 0,l=o?o.title:void 0;return{paymentMethod:n,paymentProvider:a,shippingAddress:c,name:r,phone:s,shippingMethod:l}}(M,c,O||"")},[a,M,c,O]);const _=Object(n.m)(()=>{const{saveInfo:e}=M,t=function(e){const{streetLine1:t,streetLine2:a,city:n,state:c,countryIso2:s,postCode:r,fullName:o,phone:l,email:i}=e;return{name:o,phone:l,email:i,shippingAddress:{streetLine1:t,streetLine2:a,city:n,state:c,countryIso2:s,postCode:r}}}(M);N({requestInfo:t,saveInfo:e})},[N,M]),H=Object(n.m)(()=>{const e=function(e){const{cardNumber:t,cardholder:a,expiry:n,cvv:c,billingCountry:s,billingZip:r}=e,[o,l]=n.split("/");return{data:{cardNumber:t,cardholder:a,expiryMonth:o,expiryYear:l,cvv:c,country:s,zip:r}}}(M);I({credentials:e})},[I,M]),$=Object(n.m)(()=>{w({shippingOptionId:M.shipping,saveCredentials:M.saveCredentials})},[w,M]),V=Object(n.m)(e=>{S({step:e})},[S]),W=Object(n.m)(()=>{switch(x(!0),a){case r.j.ShippingInfo:return _();case r.j.Shipping:return V(r.j.PaymentInfo);case r.j.PaymentInfo:return H();case r.j.Checkout:return $();default:return()=>{}}},[a,_,V,H,$]),K=Object(n.p)(()=>{switch(a){case r.j.ShippingInfo:return U("PaymentShippingInfo");case r.j.Shipping:return U("PaymentShippingMethod");case r.j.PaymentInfo:return U("PaymentCardInfo");case r.j.Checkout:return U("PaymentCheckout");default:return""}},[a,U]),Y=Object(n.p)(()=>{switch(a){case r.j.Checkout:return U("Checkout.PayPrice",`${R}${(q/100).toFixed(2)}`);default:return U("Next")}},[a,U,R,q]);return p?n.a.createElement(pe.a,{className:"error",isOpen:e,onClose:t},n.a.createElement("p",null,"Sorry, Telegram WebZ doesn't support payments with this provider yet. ",n.a.createElement("br",null),"Please use one of our mobile apps to do this."),n.a.createElement(D.a,{isText:!0,onClick:t},U("OK"))):n.a.createElement(pe.a,{className:"PaymentModal",isOpen:e,onClose:t},n.a.createElement("div",{className:"header",dir:U.isRtl?"rtl":void 0},n.a.createElement(D.a,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h3",null,K)),void 0!==a?n.a.createElement(T.a,{name:"slide",activeKey:a},()=>n.a.createElement("div",{className:"content custom-scroll"},function(e){switch(e){case r.j.ShippingInfo:return n.a.createElement(As,{state:M,dispatch:A,needAddress:Boolean(i),needEmail:Boolean(m||b),needPhone:Boolean(d||u),needName:Boolean(l)});case r.j.Shipping:return n.a.createElement(Ls,{state:M,dispatch:A,shippingOptions:c||[],currency:R});case r.j.PaymentInfo:return n.a.createElement(qs,{state:M,dispatch:A,canSaveCredentials:Boolean(!g&&o),needCardholderName:f,needCountry:j,needZip:C});case r.j.Checkout:return n.a.createElement(Ds,{prices:E,shippingPrices:M.shipping&&c?Hs(c,M.shipping):void 0,totalPrice:q,invoiceContent:v,checkoutInfo:z,currency:R});default:return}}(a))):n.a.createElement("div",{className:"empty-content"},n.a.createElement(L.a,{color:"gray"})),n.a.createElement("div",{className:"footer"},n.a.createElement(D.a,{type:"submit",onClick:W,disabled:B,isLoading:B},Y)),y&&!y.field&&function(){if(y)return n.a.createElement(pe.a,{className:"error",isOpen:Boolean(y),onClose:G},n.a.createElement("h4",null,y.description||"Error"),n.a.createElement("p",null,y.description||"Error"),n.a.createElement(D.a,{isText:!0,onClick:P},U("OK")))}())}));function _s(e,t){return e.find(({id:e})=>e===t)}function Hs(e,t){const a=_s(e,t);return a?a.prices:void 0}var $s=Object(n.h)(Object(c.h)(e=>{const{receipt:t}=e.payment,{currency:a,prices:n,info:c,totalAmount:s,credentialsTitle:r,shippingPrices:o,shippingMethod:l,photoUrl:i,text:d,title:m}=t||{};return{currency:a,prices:n,info:c,totalAmount:s,credentialsTitle:r,shippingPrices:o,shippingMethod:l,photoUrl:i,text:d,title:m}})(({isOpen:e,onClose:t,prices:a,shippingPrices:c,totalAmount:s,currency:r,info:o,photoUrl:l,text:i,title:d,credentialsTitle:m,shippingMethod:u})=>{const b=Object(F.a)(),h=Es(r),g=Object(n.p)(()=>function(e,t,a){if(!t)return{paymentMethod:e};const{shippingAddress:n}=t,c=n&&n.streetLine1?`${n.streetLine1}, ${n.city}, ${n.countryIso2}`:void 0,{phone:s,name:r}=t;return{paymentMethod:e,paymentProvider:"Stripe",shippingAddress:c,name:r,phone:s,shippingMethod:a}}(m,o,u),[o,u,m]);return n.a.createElement(pe.a,{className:"PaymentModal PaymentModal-receipt",isOpen:e,onClose:t},n.a.createElement("div",null,n.a.createElement("div",{className:"header",dir:b.isRtl?"rtl":void 0},n.a.createElement(D.a,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("h3",null," ",b("PaymentReceipt")," ")),n.a.createElement("div",{className:"receipt-content custom-scroll"},n.a.createElement(Ds,{prices:a,shippingPrices:c,totalPrice:s,invoiceContent:{photoUrl:l,text:i,title:d},checkoutInfo:g,currency:h}))))}))},,,,,,,,,,,,,,,,,,,,,,,,function(e,t,a){"use strict";a.d(t,"a",(function(){return r}));var n=a(8),c=a(57);const s={MonkeyIdle:a.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs",MonkeyTracking:a.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs",MonkeyClose:a.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs",MonkeyPeek:a.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs",FoldersAll:a.p+"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs",FoldersNew:a.p+"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs",DiscussionGroups:a.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs"};function r(e){const t=s[e].replace(window.location.origin,"");return c.b("file"+t,n.ApiMediaFormat.Lottie)}},,,,,function(e,t,a){"use strict";var n=a(0),c=a(9),s=a(2),r=a(17),o=a(16),l=a(21),i=a(112),d=a(20);a(154);const m={type:"blob",quality:.8,format:"jpeg",circle:!1};let u,b,h;var g=Object(n.h)(({file:e,onChange:t,onClose:c})=>{const[g,p]=Object(n.r)(!1);Object(n.n)(()=>{e&&(g?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:a,offsetHeight:n}=t;h=new u(t,{enableZoom:!0,boundary:{width:a,height:n},viewport:{width:a-16,height:n-16,type:"circle"}});const c=await Object(r.a)(e);await h.bind({url:c})}catch(e){s.r&&console.error(e)}}(e):async function(){return b||(b=Promise.all([a.e(6),a.e(8)]).then(a.bind(null,327)),u=(await b).default),b}().then(()=>p(!0)))},[e,g]);const v=Object(o.a)();return n.a.createElement(i.a,{isOpen:Boolean(e),onClose:c,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},g?n.a.createElement("div",{id:"avatar-crop"}):n.a.createElement(d.a,null),n.a.createElement(l.a,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!h)return;const e=await h.result(m),a="string"==typeof e?e:Object(r.b)(e,"avatar.jpg");t(a)},ariaLabel:v("CropImage")},n.a.createElement("i",{className:"icon-check"})))});a(155);t.a=Object(n.h)(({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:a,onChange:s})=>{const[r,o]=Object(n.r)(),[l,i]=Object(n.r)(a);Object(n.n)(()=>{i(a)},[a]);const d=Object(c.a)(l&&"filled",t&&"disabled");return n.a.createElement("div",{className:"AvatarEditable"},n.a.createElement("label",{className:d,role:"button",tabIndex:0,title:e},n.a.createElement("input",{type:"file",onChange:function(e){const t=e.target;t&&t.files&&t.files[0]&&(o(t.files[0]),t.value="")},accept:"image/png, image/jpeg"}),n.a.createElement("i",{className:"icon-camera-add"}),l&&n.a.createElement("img",{src:l,alt:"Avatar"})),n.a.createElement(g,{file:r,onClose:function(){o(void 0)},onChange:function(e){o(void 0),s(e),l&&URL.revokeObjectURL(l),i(URL.createObjectURL(e))}}))})},,,,,,,,function(e,t,a){},,,,,,,,function(e,t,a){"use strict";var n=a(0),c=a(2),s=a(6),r=a(130),o=a(119);a(143);const l=[0,50],i=[0,20],d=[20,0],m=s.l?c.Db:c.Cb;t.a=Object(n.h)(({isPasswordVisible:e,isBig:t})=>{const[a,s]=Object(n.r)(),[u,b]=Object(n.r)(),[h,g]=Object(n.r)(!1),[p,v]=Object(n.r)(!1);Object(n.n)(()=>{a?setTimeout(()=>v(!0),2e3):Object(r.a)("MonkeyClose").then(s)},[a]),Object(n.n)(()=>{u||Object(r.a)("MonkeyPeek").then(b)},[u]);const O=Object(n.m)(()=>g(!0),[]);return n.a.createElement("div",{id:"monkey",className:t?"big":""},!h&&n.a.createElement("div",{className:"monkey-preview"}),a&&n.a.createElement(o.a,{id:"closeMonkey",size:t?c.Ob:m,className:p?"hidden":"shown",animationData:a,playSegment:l,noLoop:!0,onLoad:O}),u&&n.a.createElement(o.a,{id:"peekMonkey",size:t?c.Ob:m,className:p?"shown":"hidden",animationData:u,playSegment:e?i:d,noLoop:!0}))})},function(e,t,a){"use strict";var n=a(0),c=a(2),s=a(6),r=a(9),o=a(16),l=a(21);const i=s.l?550:400;t.a=Object(n.h)(({isLoading:e=!1,isPasswordVisible:t,error:a,hint:d,placeholder:m="Password",submitLabel:u="Next",clearError:b,onChangePasswordVisibility:h,onInputChange:g,onSubmit:p})=>{const v=Object(n.q)(null),O=Object(o.a)(),[E,f]=Object(n.r)(""),[j,C]=Object(n.r)(!1);return Object(n.n)(()=>{s.n||setTimeout(()=>{v.current.focus()},i)},[]),Object(n.n)(()=>{a&&requestAnimationFrame(()=>{v.current.focus(),v.current.select()})},[a]),n.a.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||j&&p(E)},autoComplete:"off"},n.a.createElement("div",{className:Object(r.a)("input-group password-input",E&&"touched",a&&"error"),dir:O.isRtl?"rtl":void 0},n.a.createElement("input",{ref:v,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:E||"",autoComplete:"current-password",onChange:function(e){a&&b();const{target:t}=e;f(t.value),C(t.value.length>=c.jb),g&&g(t.value)},dir:"auto"}),n.a.createElement("label",null,a||d||m),n.a.createElement("div",{className:"toggle-password",onClick:function(){h(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},n.a.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),j&&n.a.createElement(l.a,{type:"submit",ripple:!0,isLoading:e},u))})},,function(e,t,a){},function(e,t,a){},,,,,,,,,,,,,,,,function(e,t,a){},,,,,,,,,,,,,,,,,,,,,,function(e,t,a){},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){}])]); -//# sourceMappingURL=3.c4d4bc793e11d4bb6728.js.map \ No newline at end of file diff --git a/dist/3.c4d4bc793e11d4bb6728.js.map b/dist/3.c4d4bc793e11d4bb6728.js.map deleted file mode 100644 index 18db41a57..000000000 --- a/dist/3.c4d4bc793e11d4bb6728.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/mediaViewer/helpers/ghostAnimation.ts","webpack:///./src/components/mediaViewer/SenderInfo.tsx","webpack:///./src/components/mediaViewer/MediaViewerActions.tsx","webpack:///./src/components/mediaViewer/MediaViewerFooter.tsx","webpack:///./src/hooks/useFullscreen.ts","webpack:///./src/components/mediaViewer/helpers/formatFileSize.ts","webpack:///./src/components/mediaViewer/VideoPlayerControls.tsx","webpack:///./src/components/mediaViewer/VideoPlayer.tsx","webpack:///./src/components/mediaViewer/ZoomControls.tsx","webpack:///./src/components/mediaViewer/PanZoom.tsx","webpack:///./src/components/mediaViewer/MediaViewer.tsx","webpack:///./src/components/main/ForwardPicker.tsx","webpack:///./src/components/main/Dialogs.tsx","webpack:///./src/components/main/Notifications.tsx","webpack:///./src/components/main/SafeLinkModal.tsx","webpack:///./src/components/common/CalendarModal.tsx","webpack:///./src/components/main/HistoryCalendar.tsx","webpack:///./src/components/common/DeleteMessageModal.tsx","webpack:///./src/components/common/PinMessageModal.tsx","webpack:///./src/components/common/UnpinAllMessagesModal.tsx","webpack:///./src/components/middle/DeleteSelectedMessageModal.tsx","webpack:///./src/components/common/ReportMessageModal.tsx","webpack:///./src/components/middle/MessageSelectToolbar.tsx","webpack:///./src/hooks/useSelectWithEnter.ts","webpack:///./src/components/left/search/LeftSearchResultChat.tsx","webpack:///./src/components/left/search/RecentContacts.tsx","webpack:///./src/components/left/search/ChatMessage.tsx","webpack:///./src/components/left/search/DateSuggest.tsx","webpack:///./src/components/left/search/ChatResults.tsx","webpack:///./src/components/left/search/ChatMessageResults.tsx","webpack:///./src/components/left/search/helpers/createMapStateToProps.ts","webpack:///./src/components/left/search/MediaResults.tsx","webpack:///./src/components/left/search/helpers/getSenderName.ts","webpack:///./src/components/left/search/LinkResults.tsx","webpack:///./src/components/left/search/FileResults.tsx","webpack:///./src/components/left/search/AudioResults.tsx","webpack:///./src/components/left/search/LeftSearch.tsx","webpack:///./src/hooks/useReducer.ts","webpack:///./src/hooks/reducers/useFoldersReducer.ts","webpack:///./src/hooks/reducers/useTwoFaReducer.ts","webpack:///./src/components/left/settings/SettingsHeader.tsx","webpack:///./src/components/left/settings/SettingsMain.tsx","webpack:///./src/components/common/UsernameInput.tsx","webpack:///./src/components/left/settings/SettingsEditProfile.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersMain.tsx","webpack:///./src/components/ui/ShowMoreButton.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersEdit.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersChatsPicker.tsx","webpack:///./src/components/left/settings/folders/SettingsFoldersChatFilters.tsx","webpack:///./src/components/left/settings/folders/SettingsFolders.tsx","webpack:///./src/components/ui/RangeSlider.tsx","webpack:///./src/components/middle/composer/StickerSetCoverAnimated.tsx","webpack:///./src/components/middle/composer/StickerSetCover.tsx","webpack:///./src/components/common/StickerButton.tsx","webpack:///./src/components/left/settings/SettingsStickerSet.tsx","webpack:///./src/components/left/settings/SettingsGeneral.tsx","webpack:///./src/util/systemFilesDialog.ts","webpack:///./src/util/colors.ts","webpack:///./src/components/left/settings/WallpaperTile.tsx","webpack:///./src/components/left/settings/SettingsGeneralBackground.tsx","webpack:///./src/components/left/settings/SettingsGeneralBackgroundColor.tsx","webpack:///./src/components/left/settings/SettingsNotifications.tsx","webpack:///./src/components/left/settings/SettingsPrivacy.tsx","webpack:///./src/components/left/settings/SettingsLanguage.tsx","webpack:///./src/components/left/settings/helper/privacy.ts","webpack:///./src/components/left/settings/SettingsPrivacyVisibility.tsx","webpack:///./src/components/left/settings/SettingsPrivacyActiveSessions.tsx","webpack:///./src/components/left/settings/SettingsPrivacyBlockedUsers.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaEnabled.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaPassword.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaStart.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaSkippableForm.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaCongratulations.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFaEmailCode.tsx","webpack:///./src/components/left/settings/twoFa/SettingsTwoFa.tsx","webpack:///./src/components/left/settings/SettingsPrivacyVisibilityExceptionList.tsx","webpack:///./src/components/left/settings/Settings.tsx","webpack:///./src/components/left/main/ContactList.tsx","webpack:///./src/components/left/newChat/NewChatStep1.tsx","webpack:///./src/components/left/newChat/NewChatStep2.tsx","webpack:///./src/components/left/newChat/NewChat.tsx","webpack:///./src/components/left/ArchivedChats.tsx","webpack:///./src/util/scrollLock.ts","webpack:///./src/components/middle/message/helpers/copyOptions.ts","webpack:///./src/components/middle/message/MessageContextMenu.tsx","webpack:///./src/components/middle/message/ContextMenuContainer.tsx","webpack:///./src/components/common/StickerSetModal.tsx","webpack:///./src/components/middle/HeaderMenuContainer.tsx","webpack:///./src/components/middle/MobileSearch.tsx","webpack:///./src/util/findInViewport.ts","webpack:///./src/util/isFullyVisible.ts","webpack:///./src/util/setTooltipItemVisible.ts","webpack:///./src/components/middle/composer/MentionTooltip.tsx","webpack:///./src/components/middle/composer/AttachmentModal.tsx","webpack:///./src/components/middle/composer/PollModal.tsx","webpack:///./src/hooks/useMouseInside.ts","webpack:///./src/components/middle/composer/EmojiButton.tsx","webpack:///./src/components/middle/composer/EmojiCategory.tsx","webpack:///./src/components/middle/composer/EmojiPicker.tsx","webpack:///./src/components/middle/composer/StickerSet.tsx","webpack:///./src/components/middle/composer/StickerPicker.tsx","webpack:///./src/components/common/GifButton.tsx","webpack:///./src/components/middle/composer/GifPicker.tsx","webpack:///./src/components/middle/composer/SymbolMenuFooter.tsx","webpack:///./src/components/middle/composer/SymbolMenu.tsx","webpack:///./src/components/middle/composer/AttachMenu.tsx","webpack:///./src/components/middle/composer/StickerTooltip.tsx","webpack:///./src/components/middle/composer/BotKeyboardMenu.tsx","webpack:///./src/components/middle/composer/CustomSendMenu.tsx","webpack:///./src/components/middle/composer/EmojiTooltip.tsx","webpack:///./src/components/middle/composer/inlineResults/BaseResult.tsx","webpack:///./src/components/middle/composer/inlineResults/MediaResult.tsx","webpack:///./src/components/middle/composer/inlineResults/ArticleResult.tsx","webpack:///./src/components/middle/composer/inlineResults/GifResult.tsx","webpack:///./src/components/middle/composer/inlineResults/StickerResult.tsx","webpack:///./src/components/middle/composer/InlineBotTooltip.tsx","webpack:///./src/components/right/RightSearch.tsx","webpack:///./src/components/right/StickerSetResult.tsx","webpack:///./src/components/right/StickerSearch.tsx","webpack:///./src/components/right/GifSearch.tsx","webpack:///./src/components/right/PollAnswerResults.tsx","webpack:///./src/components/right/PollResults.tsx","webpack:///./src/components/right/management/ManageUser.tsx","webpack:///./src/components/right/management/ManageGroup.tsx","webpack:///./src/components/right/management/ManageGroupPermissions.tsx","webpack:///./src/components/right/management/ManageGroupRemovedUsers.tsx","webpack:///./src/components/right/management/ManageChannel.tsx","webpack:///./src/components/right/management/ManageChatPrivacyType.tsx","webpack:///./src/components/right/management/ManageDiscussion.tsx","webpack:///./src/components/right/management/ManageGroupUserPermissions.tsx","webpack:///./src/components/right/management/ManageChatAdministrators.tsx","webpack:///./src/components/right/management/ManageGroupRecentActions.tsx","webpack:///./src/components/right/management/ManageGroupAdminRights.tsx","webpack:///./src/components/right/management/ManageGroupMembers.tsx","webpack:///./src/components/right/management/ManageGroupUserPermissionsCreate.tsx","webpack:///./src/components/right/management/Management.tsx","webpack:///./src/components/middle/helpers/getCurrencySign.ts","webpack:///./src/components/common/helpers/detectCardType.ts","webpack:///./src/hooks/reducers/usePaymentReducer.ts","webpack:///./src/hooks/useFocusAfterAnimation.tsx","webpack:///./src/components/ui/Select.tsx","webpack:///./src/components/payment/ShippingInfo.tsx","webpack:///./src/components/payment/Shipping.tsx","webpack:///./src/components/payment/Checkout.tsx","webpack:///./src/components/payment/ExpiryInput.tsx","webpack:///./src/components/middle/helpers/inputFormatters.ts","webpack:///./src/assets/mastercard.svg","webpack:///./src/assets/visa.svg","webpack:///./src/components/payment/CardInput.tsx","webpack:///./src/components/payment/PaymentInfo.tsx","webpack:///./src/components/payment/PaymentModal.tsx","webpack:///./src/components/payment/ReceiptModal.tsx","webpack:///./src/components/common/helpers/animatedAssets.ts","webpack:///./src/assets/TwoFactorSetupMonkeyIdle.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyTracking.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyClose.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyPeek.tgs","webpack:///./src/assets/FoldersAll.tgs","webpack:///./src/assets/FoldersNew.tgs","webpack:///./src/assets/DiscussionGroupsDucks.tgs","webpack:///./src/components/ui/CropModal.tsx","webpack:///./src/components/ui/AvatarEditable.tsx","webpack:///./src/components/common/PasswordMonkey.tsx","webpack:///./src/components/common/PasswordForm.tsx"],"names":["animateOpening","hasFooter","origin","bestImageData","dimensions","isVideo","message","mediaEl","fromImage","getNodes","width","windowWidth","windowSize","get","availableWidth","height","availableHeight","getMediaViewerAvailableDimensions","toWidth","toHeight","calculateDimensions","toLeft","toTop","mql","window","matchMedia","MEDIA_VIEWER_MEDIA_QUERY","topOffsetRem","matches","REM","getTopOffset","top","fromTop","left","fromLeft","fromWidth","fromHeight","getBoundingClientRect","MediaViewerOrigin","SharedMedia","Album","ScheduledAlbum","SearchResult","includes","uncovered","realWidth","realHeight","size","Math","max","srcWidth","srcHeight","uncover","fromTranslateX","fromTranslateY","fromScaleX","fromScaleY","ghost","createGhost","applyStyles","transform","applyShape","document","body","classList","add","requestAnimationFrame","appendChild","style","firstChild","objectFit","remove","clearShape","setTimeout","contains","removeChild","ANIMATION_END_DELAY","animateClosing","container","toImage","getElementById","querySelector","targetTop","el","display","rect","windowHeight","isElementInViewport","shouldFadeOut","Inline","ScheduledInline","isMessageImageFullyVisible","existingGhost","getElementsByClassName","ProfileAvatar","transition","transformOrigin","opacity","source","shouldAppendProfileInfo","createElement","img","Image","src","HTMLVideoElement","poster","profileInfo","cloneNode","imageEl","messageListElement","imgOffsetTop","offsetTop","closest","id","parentElement","scrollTop","offsetHeight","element","styles","Object","assign","containerSelector","mediaSelector","MiddleHeaderAvatar","mediaEls","querySelectorAll","length","withGlobal","global","chatId","messageId","isAvatar","sender","isChatPrivate","selectUser","selectChat","selectChatMessage","selectSender","setGlobal","actions","pick","closeMediaViewer","focusMessage","handleFocusMessage","useCallback","lang","useLang","isFromChat","senderTitle","getSenderTitle","className","onClick","Avatar","key","chat","user","dir","renderText","formatMediaDateTime","date","MediaViewerActions","mediaData","isZoomed","fileName","onCloseMediaViewer","onForward","onZoomToggle","isDownloadStarted","downloadProgress","handleDownloadClick","useMediaDownload","getMessageMediaHash","undefined","MenuButton","useMemo","onTrigger","isOpen","Button","round","color","ariaLabel","IS_SINGLE_COLUMN_LAYOUT","DropdownMenu","trigger","positionX","MenuItem","icon","href","download","ProgressSpinner","progress","noCross","MediaViewerFooter","text","isHidden","isForVideo","isMultiline","setIsMultiline","useState","useEffect","footerContent","checkIsMultiline","clientHeight","handleResize","throttle","addEventListener","removeEventListener","classNames","buildClassName","e","stopPropagation","prop","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","getBrowserFullscreenElementProp","units","bytes","number","floor","log","toFixed","stopEvent","VideoPlayerControls","bufferedProgress","currentTime","duration","fileSize","isForceVisible","isForceMobileVersion","isPlayed","isFullscreenSupported","isFullscreen","onChangeFullscreen","onPlayPause","onSeek","isVisible","setVisibility","timeout","clearTimeout","downloadedPercent","totalSize","percentagePlayed","percentageBuffered","min","step","type","onInput","value","renderSeekLine","ripple","formatMediaDuration","renderTime","formatFileSize","memo","url","isGif","posterData","posterSize","isMediaViewerOpen","noPlay","onClose","videoRef","useRef","setIsPlayed","IS_TOUCH_ENV","IS_IOS","setCurrentTime","isControlsVisible","setIsControlsVisible","setFullscreen","exitFullscreen","elRef","setIsFullscreen","Boolean","useLayoutEffect","listener","listenerEnter","listenerExit","video","current","PLATFORM_ENV","requestFullscreen","webkitRequestFullscreen","webkitEnterFullscreen","mozRequestFullScreen","mozCancelFullScreen","webkitCancelFullScreen","webkitExitFullscreen","useFullscreenStatus","isBuffered","bufferingHandlers","useBuffering","shouldRender","shouldRenderSpinner","transitionClassNames","spinnerClassNames","useShowTransition","shouldRenderPlayButton","playButtonClassNames","pause","safePlay","togglePlayState","play","useVideoCleanup","handleMouseOver","handleMouseOut","handleTimeUpdate","currentTarget","handleEnded","handleFullscreenChange","handleSeek","Number","target","toggleControls","togglePayingStateBySpace","preventDefault","wrapperStyle","videoStyle","onMouseOver","onMouseOut","ref","autoPlay","playsInline","loop","muted","onEnded","onDoubleClick","onTimeUpdate","join","square","isShown","onChangeZoom","prevIsShown","usePrevious","inputRef","zoomLevel","setZoomLevel","isSeeking","handleStartSeek","handleStopSeek","disabled","onChange","onMouseDown","onMouseUp","INITIAL_MATRIX","SCALE_VALUES","1","1.5","2","2.5","3","children","noWrap","canPan","panDeltaX","panDeltaY","onPan","tunedZoomLevel","isDragging","setIsDragging","dragData","setDragData","dx","dy","x","y","matrixData","setMatrixData","panWrapperRef","panContainerRef","newZoomLevel","newPandx","newPandy","newMatrixData","areSortedArraysEqual","oldScale","wrapper","image","wrapperRect","imageRect","newImgWidth","newImgHeight","newImgX","newImgY","calculateSafeZoneOnZoom","toString","newDragData","pageX","pageY","onMouseMove","deltaX","deltaY","getNewMatrixData","renderPhoto","blobUrl","imageSize","canDrag","alt","draggable","Spinner","threadId","avatarOwnerId","profilePhotoIndex","mediaViewer","animationLevel","settings","byKey","senderId","avatarOwner","chatMessages","collectionIds","selectScheduledMessage","selectScheduledMessages","selectChatMessages","selectOutlyingIds","selectListedIds","currentSearch","selectCurrentMediaSearch","foundIds","resultsByType","media","openMediaViewer","openForwardMenu","isFromSharedMedia","isFromSearch","photo","getMessagePhoto","getMessageVideo","webPagePhoto","getMessageWebPagePhoto","webPageVideo","getMessageWebPageVideo","isDocumentPhoto","isMessageDocumentPhoto","isDocumentVideo","isMessageDocumentVideo","isPhoto","isSingleSlide","messageIds","getChatMediaMessageIds","selectedMediaMessageIndex","indexOf","isFirst","isLast","animationKey","prevSenderId","slideAnimation","headerAnimation","isGhostAnimation","isFooterHidden","setIsFooterHidden","canPanZoomWrap","setCanPanZoomWrap","setIsZoomed","panDelta","setPanDelta","getMediaHash","isFull","photos","getChatAvatarHash","blobUrlPictogram","useMedia","ApiMediaFormat","BlobUrl","previewMediaHash","blobUrlPreview","startsWith","DataUri","fullMediaData","useMediaWithDownloadProgress","getMessageMediaFormat","localBlobUrl","thumbDataUri","useBlurSync","getMessageMediaThumbDataUri","videoSize","getMessageFileSize","getMessageFileName","getMessageDocument","mediaSize","getPhotoFullDimensions","getVideoDimensions","AVATAR_FULL_DIMENSIONS","toggle","forceUpdate","useForceUpdate","addListener","removeListener","prevMessage","prevOrigin","prevAvatarOwner","prevBestImageData","dispatchHeavyAnimationEvent","textParts","renderMessageText","timer","closeZoom","handleZoomToggle","handleZoomValue","level","canCloseZoom","close","handleFooterClick","handleForward","fromChatId","captureEscKeyListener","stopCurrentAudio","disableRefresh","enableRefresh","getMessageId","fromId","direction","index","selectPreviousMedia","selectNextMedia","handleKeyDown","shouldCloseOnVideo","captureEvents","excludedClosestSelector","onSwipe","SwipeDirection","Right","Left","handlePan","handleToggleFooterVisibility","renderSlide","isActive","calculateMediaViewerDimensions","renderSenderInfo","useHistoryBack","ShowTransition","isRtl","Transition","activeKey","name","aria-label","chats","byId","chatsById","listIds","orderedPinnedIds","currentUserId","pinnedIds","active","activeListIds","archivedListIds","archived","setForwardChatId","exitForwardMode","loadMoreChats","filter","setFilter","focus","blur","chatIds","priorityIds","unique","sortChatIds","getCanPostInChat","MAIN_THREAD_ID","searchWords","getChatTitle","viewportIds","getMore","useInfiniteScroll","handleFilterChange","containerRef","useKeyboardListNavigation","modalHeader","InputText","onKeyDown","placeholder","Modal","header","InfiniteScroll","items","onLoadMore","noScrollRestore","map","ListItem","PrivateChatInfo","status","userId","GroupChatInfo","Loading","getErrorHeader","error","isSlowMode","hasErrorKey","dialogs","dismissDialog","acceptInviteConfirmation","dialog","invite","hash","title","participantsCount","isChannel","participantsText","joinText","isText","renderInvite","getReadableErrorText","notifications","dismissNotification","Notification","onDismiss","toggleSafeLinkModal","handleOpen","open","handleDismiss","renderingUrl","useCurrentOrPrev","ConfirmDialog","confirmLabel","confirmHandler","WEEKDAY_LETTERS","isDisabledDay","year","month","day","minDate","maxDate","selectedDay","Date","fixedMinDate","getFullYear","getMonth","getDate","fixedMaxDate","formatInputTime","String","padStart","selectedAt","maxAt","isFutureMode","isPastMode","withTimePicker","submitButtonLabel","secondButtonLabel","onSubmit","onSecondButtonClick","now","defaultSelectedDate","prevIsOpen","selectedDate","setSelectedDate","selectedHours","setSelectedHours","getHours","selectedMinutes","setSelectedMinutes","getMinutes","currentYear","currentMonth","currentDate","shouldDisableNextMonth","shouldDisablePrevMonth","calendarGrid","grid","setFullYear","setMonth","setDate","monthStartDay","getDay","i","push","gridDate","buildCalendarGrid","handleChangeHours","replace","hours","getTime","setHours","hoursStr","handleChangeMinutes","minutes","setMinutes","minutesStr","d","dateCopy","role","tabIndex","handleDateSelect","inputMode","formatDateToString","code","today","formatTime","formatSubmitLabel","historyCalendarSelectedAt","searchMessagesByDate","closeHistoryCalendar","handleJumpToDate","timestamp","valueOf","isSchedule","selectCurrentMessageList","canDeleteForAll","selectAllowedMessageActions","contactName","getUserFirstOrLastName","getPrivateChatUserId","willDeleteForCurrentUserOnly","isChatBasicGroup","willDeleteForAll","isChatSuperGroup","album","deleteMessages","deleteScheduledMessages","handleDeleteMessageForAll","messages","shouldDeleteForAll","handleDeleteMessageForSelf","onEnter","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","isChatChannel","isGroup","isSuperGroup","canPinForAll","pinMessage","handlePinMessageForAll","isUnpin","handlePinMessage","isOneSide","isSilent","pinnedMessagesCount","onUnpin","selectedMessageIds","selectedMessages","selectCanDeleteSelectedMessages","selectCurrentChat","exitMessageSelectMode","reportMessages","selectedReason","setSelectedReason","description","setDescription","handleReport","reason","handleSelectReason","handleDescriptionChange","REPORT_OPTIONS","label","RadioGroup","options","selected","messageListType","canDelete","canReport","selectCanReportSelectedMessages","selectedMessagesCount","selectSelectedMessagesCount","canDeleteMessages","canReportMessages","canPost","openForwardMenuForSelectedMessages","isDeleteModalOpen","openDeleteModal","closeDeleteModal","useFlag","isReportModalOpen","openReportModal","closeReportModal","captureKeyboardListeners","onBackspace","onDelete","onEsc","prevSelectedMessagesCount","renderingSelectedMessagesCount","formattedMessagesCount","destructive","onSelect","buttonRef","activeElement","privateChatUserId","privateChatUser","isPinned","selectIsChatPinned","isMuted","selectIsChatMuted","selectNotifySettings","selectNotifyExceptions","withUsername","contextActions","useChatContextActions","handleDelete","handleClick","useSelectWithEnter","avatarSize","DeleteChatModal","runThrottled","cb","userIds","topUserIds","topPeers","usersById","users","recentlyFoundChatIds","globalSearch","onReset","loadTopUsers","loadContactList","openChat","addRecentlyFoundChatId","clearRecentlyFoundChats","topUsersRef","useHorizontalScroll","shouldReplaceHistory","lastSyncTime","searchQuery","mediaThumbnail","mediaBlobUrl","isRoundVideo","getMessageRoundVideo","withOnlineStatus","isSavedMessages","isSelf","isVerified","VerifiedIcon","Link","formatPastTimeShort","getMessageSummaryText","highlight","renderMessageSummary","searchDate","suggestions","match","suggestion","latestYear","getSuggestionsFromDate","localContactIds","contactList","fetchingStatus","globalResults","localResults","globalChatIds","globalUserIds","localChatIds","localUserIds","byChatId","globalMessagesByChatId","dateSearchQuery","onSearchDateSelect","searchMessagesGlobal","setGlobalSearchChatId","shouldShowMoreLocal","setShouldShowMoreLocal","shouldShowMoreGlobal","setShouldShowMoreGlobal","handleLoadMore","LoadMoreDirection","Backwards","query","handleChatClick","handlePickerItemClick","MEMO_EMPTY_ARRAY","foundContactIds","fullName","getUserFullName","username","foundMessages","split","sort","a","b","handleClickShowMoreLocal","handleClickShowMoreGlobal","nothingFound","noScrollRestoreOnTop","noFastList","NothingFound","PickerSelectedItem","chatOrUserId","clickArg","createMapStateToProps","props","currentType","isVoice","theme","selectTheme","isLoading","searchChatId","handleSelectMedia","canRenderContents","useAsyncRendering","SLIDE_TRANSITION_DURATION","isMediaGrid","isMessageList","itemSelector","Media","idPrefix","getSenderName","senderName","isChatGroup","handleMessageFocus","shouldDrawDateDivider","toYearMonth","formatMonthAndYear","WebLink","onMessageClick","Document","withDate","datetime","smaller","onDateClick","openAudioPlayer","handlePlayAudio","Audio","onPlay","TABS","GlobalSearchContent","ChatList","Links","Files","Music","Voice","CHAT_TABS","slice","TRANSITION_RENDER_COUNT","keys","currentContent","setGlobalSearchContent","setGlobalSearchDate","activeTab","setActiveTab","parseDateString","handleSwitchTab","tab","content","handleSearchDateSelect","TabList","tabs","onSwitchTab","renderCount","useReducer","reducer","initialState","reducerRef","state","setState","action","currentState","INCLUDED_CHAT_TYPES","EXCLUDED_CHAT_TYPES","INCLUDE_FILTER_FIELDS","EXCLUDE_FILTER_FIELDS","selectChatFilters","mode","selectTemp","selectedChatIds","selectedChatTypes","includedChatIds","includeFilters","folder","excludedChatIds","excludeFilters","getSuggestedFolderName","filters","values","bots","groups","channels","contacts","nonContacts","INITIAL_STATE","chatFilter","foldersReducer","payload","isTouched","omit","folderId","currentPassword","password","hint","email","twoFaReducer","currentScreen","editedFolderId","onSaveFilter","signOut","deleteChatFolder","isSignOutDialogOpen","setIsSignOutDialogOpen","isDeleteFolderDialogOpen","setIsDeleteFolderDialogOpen","openSignOutConfirmation","closeSignOutConfirmation","openDeleteFolderConfirmation","closeDeleteFolderConfirmation","handleSignOutMessage","handleDeleteFolderMessage","SettingsMenuButton","SettingsScreens","EditProfile","General","Notifications","Privacy","Language","GeneralChatBackground","GeneralChatBackgroundColor","PrivacyPhoneNumber","PrivacyLastSeen","PrivacyProfilePhoto","PrivacyForwarding","PrivacyGroupChats","PrivacyPhoneNumberAllowedContacts","PrivacyLastSeenAllowedContacts","PrivacyProfilePhotoAllowedContacts","PrivacyForwardingAllowedContacts","PrivacyGroupChatsAllowedContacts","PrivacyPhoneNumberDeniedContacts","PrivacyLastSeenDeniedContacts","PrivacyProfilePhotoDeniedContacts","PrivacyForwardingDeniedContacts","PrivacyGroupChatsDeniedContacts","PrivacyActiveSessions","PrivacyBlockedUsers","TwoFaDisabled","TwoFaEnabled","TwoFaNewPassword","TwoFaChangePasswordNew","TwoFaChangePasswordConfirm","TwoFaNewPasswordConfirm","TwoFaNewPasswordHint","TwoFaChangePasswordHint","TwoFaNewPasswordEmail","TwoFaRecoveryEmail","TwoFaNewPasswordEmailCode","TwoFaRecoveryEmailCode","TwoFaCongratulations","TwoFaChangePasswordCurrent","TwoFaTurnOff","TwoFaRecoveryEmailCurrentPassword","Folders","FoldersCreateFolder","FoldersEditFolder","FoldersIncludedChats","FoldersExcludedChats","renderHeaderContent","confirmIsDestructive","currentUser","onScreenSelect","Main","formatPhoneNumberWithCode","phoneNumber","LINK_PREFIX_REGEX","USERNAME_REGEX","runDebouncedForCheckUsername","debounce","currentUsername","asLink","isUsernameAvailable","checkUsername","setUsername","langPrefix","usernameSuccess","usernameError","test","handleUsernameChange","newUsername","trim","isValid","isUsernameValid","success","readOnly","profileEdit","firstName","currentFirstName","lastName","currentLastName","fullInfo","bio","currentBio","currentAvatarHash","loadCurrentUser","updateProfile","isUsernameTouched","setIsUsernameTouched","isProfileFieldsTouched","setIsProfileFieldsTouched","setError","setPhoto","setFirstName","setLastName","setBio","currentAvatarBlobUrl","ProfileEditProgress","InProgress","isUsernameError","isSaveButtonShown","Complete","handlePhotoChange","newPhoto","handleFirstNameChange","handleLastNameChange","handleBioChange","handleProfileSave","trimmedFirstName","trimmedLastName","trimmedBio","AvatarEditable","UsernameInput","FloatingActionButton","runThrottledForLoadRecommended","orderedIds","orderedFolderIds","foldersById","recommended","recommendedChatFolders","chatFolders","notifySettings","notifyExceptions","onCreateFolder","onEditFolder","loadRecommendedChatFolders","addChatFolder","showDialog","animationData","setAnimationData","isAnimationLoaded","setIsAnimationLoaded","handleAnimationLoad","getAnimationData","then","handleCreateFolder","data","userFolders","subtitle","getFolderDescriptionText","handleCreateFolderFromRecommended","AnimatedSticker","STICKER_SIZE_FOLDER_SETTINGS","noLoop","onLoad","pill","fluid","narrow","multiline","ShowMoreButton","count","itemName","itemPluralName","ERROR_NO_TITLE","ERROR_NO_CHATS","loadedActiveChatIds","loadedArchivedChatIds","dispatch","onAddIncludedChats","onAddExcludedChats","onBack","editChatFolder","isIncludedChatsListExpanded","setIsIncludedChatsListExpanded","isExcludedChatsListExpanded","setIsExcludedChatsListExpanded","includedChatTypes","excludedChatTypes","visibleIncludedChatIds","visibleExcludedChatIds","allLoadedChatsSet","Set","loadedIncludedChatIds","findIntersectionWithSet","loadedExcludedChatIds","listType","renderChats","visibleChatIds","isExpanded","leftChatsCount","clickHandler","chatType","find","typeKey","inactive","renderChatType","event","folderUpdate","selectedIds","filterValue","onSelectedIdsChange","onSelectedChatTypesChange","onFilterChange","chatTypes","shouldMinimize","hasMaxChats","handleItemClick","newSelectedIds","splice","handleChatTypeClick","newSelectedChatTypes","selectedType","isMinimized","canClose","Checkbox","checked","isSelected","withChatType","archivedPinnedIds","activeChatArrays","prepareChatList","archivedChatArrays","pinnedChats","otherChats","displayedIds","newFilter","handleSelectedIdsChange","ids","handleSelectedChatTypesChange","newFilters","forEach","shownScreen","handleReset","handleEditFolder","handleAddIncludedChats","handleAddExcludedChats","range","handleChange","trackWidth","possibleValuesLength","option","STICKER_SIZE_PICKER_HEADER","stickerSet","observeIntersection","isIntersecting","useIsIntersecting","mediaHash","lottieData","Lottie","shouldRenderFullMedia","useTransitionForMedia","getFirstLetters","hasThumbnail","sticker","noAnimate","onUnfaveClick","localMediaHash","stickerSelector","thumbnail","dataUri","previewBlobUrl","shouldPlay","isAnimated","markLoaded","unmarkLoaded","canAnimatedPlay","shouldRenderThumb","shouldRenderPreview","previewTransitionClassNames","fullClassName","emoji","data-sticker-id","isLowPriority","stickers","firstSticker","STICKER_SIZE_GENERAL_SETTINGS","ANIMATION_LEVEL_OPTIONS","stickerSetIds","added","setIds","stickerSetsById","setsById","messageTextSize","messageSendKeyCombo","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayGifs","shouldAutoPlayVideos","shouldSuggestStickers","shouldLoopStickers","setSettingOption","loadStickerSets","loadAddedStickers","stickerSettingsRef","observe","observeIntersectionForCovers","useIntersectionObserver","rootRef","isModalOpen","openModal","closeModal","setSticker","KEYBOARD_SEND_OPTIONS","subLabel","IS_MAC_OS","handleAnimationLevelChange","newLevel","_","handleMessageTextSizeChange","newSize","documentElement","setProperty","handleStickerSetClick","stickerSets","installedDate","onCheck","isChecked","fromSticker","fileSelector","openSystemFilesDialog","accept","callback","noMultiple","setAttribute","removeAttribute","onchange","click","hex2rgb","param","parseInt","substring","rgb2hex","p0","p1","p2","rgb2hsb","r","g","h","s","v","hsb2rgb","f","p","q","t","getPatternColor","rgbColor","hue","saturation","wallpaper","slug","thumbRef","useCanvasBlur","isDownloadAllowed","setIsDownloadAllowed","fullMedia","wasDownloadDisabled","UPLOADING_WALLPAPER_SLUG","cacheKeyRef","handleSelect","blob","fetchBlob","cacheApi","CUSTOM_BG_CACHE_NAME","isAllowed","background","isBlurred","themes","loadedWallpapers","loadWallpapers","uploadWallpaper","setThemeSettings","themeRef","handleFileSelect","files","handleUploadWallpaper","handleSetColor","handleResetToDefault","backgroundColor","patternColor","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","handleWallPaperSelect","currentWallpaper","async","defaultRGB","rgb","canvas","context","getContext","preloadImage","naturalHeight","naturalWidth","offsetWidth","drawImage","getImageData","blockSize","getAverageColor","handleWallPaperBlurChange","isUploading","DEFAULT_HSB","PREDEFINED_COLORS","hsb2positions","hsb","rects","colorPosition","colorRect","huePosition","hueRect","positions2hsb","colorPickerRef","huePickerRef","isFirstRunRef","setHsb","getInitialHsb","hsbRef","markIsDragging","unmarkIsDragging","rgbInput","setRgbInput","hexInput","setHexInput","rectsRef","colorCtxRef","offsetLeft","handleColorDrag","handleHueDrag","onCapture","onDrag","onRelease","withCursor","hex","hueHex","w","ctx","imgData","createImageData","pixels","col","perY","st","ed","perX","putImageData","drawColor","drawHue","handleRgbChange","rgbValue","channel","handleHexChange","hexValue","handlePredefinedColorClick","dataset","data-color","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","hasContactJoinedNotifications","loadNotificationSettings","updateContactSignUpNotification","updateNotificationSettings","handleSettingsChange","peerType","setting","currentIsSilent","currentShouldShowPreviews","shouldShowPreviews","handleContactNotificationChange","hasPassword","isSensitiveEnabled","canChangeSensitive","privacy","blocked","activeSessions","blockedCount","totalCount","sessionsCount","visibilityPrivacyPhoneNumber","visibility","visibilityPrivacyLastSeen","lastSeen","visibilityPrivacyProfilePhoto","profilePhoto","visibilityPrivacyForwarding","forwards","visibilityPrivacyGroupChats","chatInvite","loadPrivacySettings","loadBlockedContacts","loadAuthorizations","loadContentSettings","updateContentSettings","getVisibilityValue","languages","language","loadLanguages","selectedLanguage","setSelectedLanguage","markIsLoading","unmarkIsLoading","langCode","setLanguage","currentLangCode","navigator","toLowerCase","shortLangCode","substr","nativeName","buildOptions","loadingOption","getPrivacyKey","screen","privacySettings","allowUserIds","allowChatIds","blockUserIds","blockChatIds","setPrivacyVisibility","visibilityOptions","exceptionLists","shouldShowDenied","shouldShowAllowed","privacyKey","headerText","descriptionText","allowedContactsScreen","deniedContactsScreen","allowedCount","reduce","result","membersCount","blockCount","handleVisibilityChange","getLocation","session","region","country","getDeviceEnvironment","deviceModel","platform","systemVersion","terminateAuthorization","terminateAllAuthorizations","isConfirmTerminateAllDialogOpen","openConfirmTerminateAllDialog","closeConfirmTerminateAllDialog","handleTerminateSessionClick","handleTerminateAllSessions","currentSession","isCurrent","otherSessions","renderSession","handler","dateActive","appName","ip","sessions","chatsByIds","usersByIds","blockedIds","unblockContact","handleUnblockClick","contactId","viewportOffset","isPrivate","CHAT_HEIGHT_PX","renderContact","animatedEmoji","selectAnimatedEmoji","AnimatedEmoji","expectedPassword","submitLabel","clearError","validationError","setValidationError","shouldShowPassword","setShouldShowPassword","handleSubmit","newPassword","handleClearError","PasswordMonkey","isBig","isPasswordVisible","PasswordForm","onChangePasswordVisibility","onStart","FOCUS_DELAY_TIMEOUT_MS","shouldConfirm","setValue","isConfirmShown","markIsConfirmShown","unmarkIsConfirmShown","codeLength","twoFaSettings","waitingEmailCodeLength","newValue","updatePassword","checkPassword","clearTwoFaError","updateRecoveryEmail","provideTwoFaEmailCode","clearPassword","handleStartWizard","handleNewPassword","handleNewPasswordConfirm","handleNewPasswordHint","handleNewPasswordEmail","onSuccess","handleChangePasswordCurrent","handleChangePasswordNew","handleChangePasswordConfirm","handleChangePasswordHint","handleTurnOff","handleRecoveryEmailCurrentPassword","handleRecoveryEmail","handleEmailCode","getCurrentPrivacySettings","isAllowList","setPrivacySettings","selectedContactIds","setSearchQuery","isSubmitShown","setIsSubmitShown","newSelectedContactIds","setNewSelectedContactIds","handleSelectedContactIdsChange","contactsIds","itemIds","filterPlaceholder","searchInputId","TWO_FA_SCREENS","FOLDERS_SCREENS","PRIVACY_SCREENS","PRIVACY_PHONE_NUMBER_SCREENS","PRIVACY_LAST_SEEN_PHONE_SCREENS","PRIVACY_PROFILE_PHOTO_SCREENS","PRIVACY_FORWARDING_SCREENS","PRIVACY_GROUP_CHATS_SCREENS","shouldSkipTransition","foldersState","foldersDispatch","twoFaState","twoFaDispatch","handleSaveFilter","renderCurrentSection","isScreenActive","isFrom","currentKey","privacyAllowScreens","isTwoFaScreen","isFoldersScreen","isPrivacyScreen","renderCurrentSectionContent","LAYERS_ANIMATION_NAME","contactIds","serverTimeOffset","resultIds","sortUserIds","forceShowSelf","isSearching","selectedMemberIds","onSelectedMemberIdsChange","onNextStep","setGlobalSearchQuery","isUserBot","canBeInvitedToGroup","handleNextStep","creationProgress","creationError","chatCreation","memberIds","createGroupChat","createChannel","setTitle","about","setAbout","ChatCreationProgress","handleTitleChange","handleCreateGroup","handleCreateChannel","renderedError","RENDER_COUNT","LeftColumnContent","onContentChange","newChatMemberIds","setNewChatMemberIds","NewChannelStep2","NewGroupStep2","isStepActive","NewChannelStep1","NewGroupStep1","Archived","folderType","noChatsText","IGNORED_KEYS","Down","ArrowDown","Up","ArrowUp","ArrowLeft","ArrowRight","PageUp","PageDown","End","Home","Tab","preventDefaultForScrollKeys","HTMLElement","tagName","getAttribute","isTextBox","disableScrolling","passive","ontouchmove","onkeydown","enableScrolling","getCopyLabel","hasSelection","MessageContextMenu","anchor","canSendNow","canReschedule","canReply","canEdit","canPin","canUnpin","canForward","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","onReply","onEdit","onPin","onReport","onFaveSticker","onUnfaveSticker","onSend","onReschedule","onCloseAnimationEnd","onCopyLink","copyOptions","afterEffect","getMessageText","canImageBeCopied","hasMessageLocalBlobUrl","CLIPBOARD_ITEM_SUPPORTED","selection","getSelection","Promise","resolve","mediaLoader","copyImageToClipboard","anchorNode","parentNode","clipboardText","copyTextToClipboard","getMessageCopyOptions","getTriggerElement","getRootElement","getMenuElement","positionY","useContextMenuPosition","Menu","noOptions","isScheduled","chatUsername","setReplyingToId","setEditingId","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","isMenuOpen","setIsMenuOpen","setIsDeleteModalOpen","setIsReportModalOpen","isPinModalOpen","setIsPinModalOpen","isCalendarOpen","openCalendar","closeCalendar","closeMenu","closePinModal","handleCloseCalendar","handleReply","handleEdit","handlePin","handleUnpin","handleFaveSticker","handleUnfaveSticker","handleSelectMessage","params","childMessageIds","withShift","handleScheduledMessageSend","handleOpenCalendar","handleRescheduleMessage","scheduledAt","handleCopyLink","abs","reportMessageIds","scheduledMaxDate","getDayStartAt","selectStickerSet","stickerSetId","loadStickers","toggleStickerSet","sendMessage","throttleMs","isDisabled","stickerSetAccessHash","isPreloadedGlobally","handleButtonClick","hasCloseButton","STICKER_SIZE_MODAL","isRestricted","canDeleteChat","getCanDeleteChat","canStartBot","canRestartBot","canSubscribe","canSearch","canMute","canLeave","onSubscribeChannel","onSearchClick","updateChatMutedState","enterMessageSelectMode","sendBotCommand","restartBot","handleStartBot","command","handleRestartBot","handleToggleMuteClick","handleSubscribe","handleSearch","handleSelectMessages","Portal","runDebouncedForSearch","results","selectCurrentTextSearch","isHistoryCalendarOpen","setLocalTextSearchQuery","searchTextMessagesLocal","closeLocalTextSearch","openHistoryCalendar","focusedIndex","setFocusedIndex","visualViewport","mainEl","pageTop","Array","from","input","div","contentEditable","handleMessageSearchQueryChange","newQuery","handleUp","newFocusIndex","handleDown","SearchInput","findInViewport","selectorOrElements","margin","isDense","shouldContainBottom","isHorizontal","viewportY1","viewportY2","allElements","visibleIndexes","isFound","y1","y2","isFullyVisible","setTooltipItemVisible","selector","first","position","fastSmoothScroll","onInsertUserName","filteredUsers","getSelectedIndex","newIndex","cycleRestrict","selectedMentionIndex","setSelectedMentionIndex","handleArrowKey","handleUserSelect","forceFocus","handleSelectMention","member","onUp","onDown","onTab","prevChatMembers","renderedChatMembers","attachments","caption","isReady","groupChatMembers","recentEmojis","baseEmojiKeywords","emojiKeywords","addRecentEmoji","onCaptionUpdate","onFileAppend","onClear","hideTimeoutRef","prevAttachments","renderingAttachments","isHovered","markHovered","unmarkHovered","isQuick","every","quick","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","insertMention","mentionFilteredUsers","useMentionTooltip","EDITABLE_INPUT_MODAL_ID","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","sendAttachments","handleFilesDrop","dataTransfer","newFiles","file","CONTENT_TYPES_FOR_QUICK_UPLOAD","has","areAllPhotos","mimeType","areAllVideos","renderHeader","onDragEnter","onDrop","onDragOver","onDragLeave","relatedTarget","toTarget","fromTarget","data-attach-description","attachment","File","filename","extension","getFileExtension","previewData","emojis","onEmojiSelect","MessageInput","isAttachmentModalInput","html","editableInputId","onUpdate","shouldSetFocus","questionInputRef","optionsListRef","solutionRef","question","setQuestion","setOptions","isAnonymous","setIsAnonymous","isMultipleAnswers","setIsMultipleAnswers","isQuizMode","setIsQuizMode","solution","setSolution","correctOption","setCorrectOption","hasErrors","setHasErrors","focusInput","solutionEl","innerHTML","addNewOption","newOptions","list","scrollHeight","scrollTo","behavior","handleCreate","questionTrimmed","optionsTrimmed","o","summary","answers","correct","isPublic","multipleChoice","quiz","entities","parseMessageInput","correctAnswers","solutionEntities","updateOption","removeOption","handleCorrectOptionChange","handleIsAnonymousChange","handleMultipleAnswersChange","handleQuizModeChange","handleKeyPress","keyCode","getQuestionError","getOptionsError","renderOptions","onKeyPress","renderQuizNoOptionError","hidden","closeTimeout","useMouseInside","menuCloseTimeout","isMouseInside","native","names","IS_EMOJI_SUPPORTED","loading","category","allEmojis","useOnIntersect","emojisPerRow","ceil","displayedEmoji","ICONS_BY_CATEGORY","recent","people","nature","foods","activity","places","objects","symbols","flags","categoryIntersections","emojiDataPromise","emojiRawData","emojiData","headerRef","categories","setCategories","setEmojis","activeCategoryIndex","setActiveCategoryIndex","entries","entry","intersectingWithIndexes","newLeft","HEADER_BUTTON_WIDTH","fastSmoothScrollHorizontal","allCategories","themeCategories","unshift","exec","default","uncompressEmoji","ensureEmojiData","selectCategory","categoryEl","handleEmojiSelect","MENU_TRANSITION_DURATION","containerClassName","faded","STICKER_MARGIN","loadAndPlay","onStickerSelect","onStickerUnfave","stickersPerRow","STICKER_SIZE_PICKER","stickerSetIntersections","favorite","recentStickers","favoriteStickers","addedSetIds","canSendStickers","loadRecentStickers","loadFavoriteStickers","addRecentSticker","activeSetIndex","setActiveSetIndex","areAddedLoaded","allSets","noPopulatedSets","set","stickerSetEl","handleStickerSelect","handleStickerUnfave","buttonClassName","gif","videoData","shouldRenderVideo","preload","savedGifs","gifs","saved","canSendGifs","onGifSelect","loadSavedGifs","debounceMs","SymbolMenuTabs","SYMBOL_MENU_TAB_TITLES","SYMBOL_MENU_TAB_ICONS","Emoji","Stickers","GIFs","onRemoveSymbol","onSearchOpen","renderTabButton","handleSearchOpen","isActivated","isLeftColumnShown","allowedAttachmentOptions","setRecentEmojis","handleMouseEnter","handleMouseLeave","fastRaf","recentEmojisRef","renderContent","onMouseEnter","onMouseLeave","noCloseOnBackdrop","onFileSelect","onPollCreate","handleQuickSelect","handleDocumentSelect","canAttachMedia","canAttachPolls","autoClose","forEmoji","clearStickersForEmoji","prevStickers","displayedStickers","clickInlineButton","keyboardButtons","row","button","onSilentSend","onScheduleSend","listEmojis","usePrevDuringAnimation","selectedIndex","setSelectedIndex","setItemVisible","emojisCount","handleSelectEmoji","onLeft","onRight","thumbUrl","thumbnailDataUrl","decoding","isForGallery","inlineResult","webThumbnail","STICKER_SIZE_INLINE_BOT_RESULT","botId","isGallery","inlineBotResults","switchPm","loadMore","onSelectResult","handleSelectInlineBotResult","handleSendPm","startParam","prevInlineBotResults","renderedInlineBotResults","sensitiveArea","inlineBotResult","messagesById","foundResults","senderUser","getGlobal","senderChat","forwardInfo","isChannelPost","orderBy","foundResult","preloadBackwards","LastMessageMeta","selectShouldLoopStickers","isSomeModalOpen","onModalToggle","isAdded","areStickersLoaded","useOnChange","coverStickerIds","covers","otherStickers","handleAddClick","canRenderStickers","STICKER_SIZE_SEARCH","selectCurrentStickerSearch","featured","featuredIds","loadFeaturedStickers","setIsModalOpen","selectCurrentGifSearch","isChatWithBot","selectIsChatWithBot","searchMoreGifs","setGifSearchQuery","getAllowedAttachmentOptions","handleGifClick","hasResults","answer","voters","offsets","pollResults","offset","answerVote","totalVoters","loadPollOptionResults","closePollResults","prevVotersCount","votersCount","setIsLoading","areVotersLoaded","limit","shouldResetVoters","handleViewMoreClick","handleMemberClick","noStatusOrTyping","leftVotersCount","renderViewMoreButton","total","getMessagePoll","resultsByOption","buildCollectionByKey","management","updateContact","deleteUser","deleteHistory","closeManagement","isDeleteDialogOpen","openDeleteDialog","closeDeleteDialog","isNotificationsEnabled","setIsNotificationsEnabled","ManagementProgress","handleNotificationChange","handleDeleteContact","withFullInfo","hasLinkedChannel","linkedChatId","isBasicGroup","canChangeInfo","isCreator","getHasAdminRight","canBanUsers","togglePreHistoryHidden","updateChat","deleteChat","leaveChannel","deleteChannel","currentTitle","currentAbout","imageHash","handleClickEditType","ManagementScreens","ChatPrivacyType","handleClickDiscussion","Discussion","handleClickPermissions","GroupPermissions","handleClickAdministrators","ChatAdministrators","handleSetPhoto","handleAboutChange","handleUpdateGroup","trimmedTitle","trimmedAbout","handleClickMembers","GroupMembers","handleTogglePreHistory","isPreHistoryHidden","isEnabled","enabledPermissionsCount","defaultBannedRights","sendStickers","sendGifs","adminsCount","adminMembers","handleDeleteGroup","formatInteger","onChatMemberSelect","updateChatDefaultBannedRights","permissions","setPermissions","havePermissionChanged","setHavePermissionChanged","handleRemovedUsersClick","GroupRemovedUsers","handleAddExceptionClick","GroupUserPermissionsCreate","handleExceptionMemberClick","promotedByUserId","GroupUserPermissions","handlePermissionChange","getUpdatedPermissionValue","handleSavePermissions","bannedRights","removedUsersCount","kickedMembers","exceptionMembers","members","getMemberExceptions","langKey","getLangKeyForBannedRightKey","translatedString","sendMessages","blocking","sendMedia","sendPolls","embedLinks","inviteUsers","pinMessages","changeInfo","updateChatMemberBannedRights","removedMembers","getRemovedBy","kickedByUserId","kickedByUser","getContextActions","isSignaturesShown","toggleSignatures","hasLinkedChat","handleUpdateChannel","handleToggleSignatures","handleClickSubscribers","ChannelSubscribers","handleDeleteChannel","selectManagement","checkPublicLink","updatePublicLink","updatePrivateLink","privateLink","inviteLink","privacyType","setPrivacyType","isRevokeConfirmDialogOpen","openRevokeConfirmDialog","closeRevokeConfirmDialog","canUpdate","handleOptionChange","handleSave","handleRevokePrivateLink","langPrefix1","langPrefix2","SafeLink","forDiscussionIds","linkedChat","loadGroupsForDiscussion","linkDiscussionGroup","unlinkDiscussionGroup","linkedGroupId","setLinkedGroupId","isConfirmUnlinkGroupDialogOpen","openConfirmUnlinkGroupDialog","closeConfirmUnlinkGroupDialog","isConfirmLinkGroupDialogOpen","openConfirmLinkGroupDialog","closeConfirmLinkGroupDialog","handleUnlinkGroupSessions","channelId","Initial","handleLinkGroupSessions","renderLinkGroupHeader","linkedGroup","renderLinkGroupConfirmText","hasPrivateLink","STICKER_SIZE_DISCUSSION_GROUPS","teactFastList","teactOrderKey","isButtonsInOneRow","isPromotedByCurrentUser","isFormFullyDisabled","selectedChatMemberId","isBanConfirmationDialogOpen","openBanConfirmationDialog","closeBanConfirmationDialog","selectedChatMember","handleBanFromGroup","viewMessages","getControlIsDisabled","isOwner","handleAdminMemberClick","ChatAdminRights","getMemberStatus","promotedByUser","GroupRecentActions","updateChatAdmin","setIsTouched","isDismissConfirmationDialogOpen","openDismissConfirmationDialog","closeDismissConfirmationDialog","customTitle","setCustomTitle","adminRights","handleDismissAdmin","memberStatus","handleCustomTitleChange","postMessages","editMessages","banUsers","addAdmins","anonymous","maxLength","openUserInfo","memberId","managementType","selectCurrentManagementType","CURRENCIES","USD","EUR","GBP","JPY","RUB","UAH","INR","AED","getCurrencySign","currency","VISA","MASTERCARD1","MASTERCARD2","CardType","cards","Default","Visa","Mastercard","detectCardType","cardNumber","streetLine1","streetLine2","city","countryIso2","postCode","phone","shipping","cardholder","expiry","cvv","billingCountry","billingZip","saveInfo","saveCredentials","formErrors","getBillingCountry","countryCode","countryList","useFocusAfterAnimation","animationDuration","hasArrow","labelText","htmlFor","needEmail","needPhone","needName","needAddress","phoneRef","selectCountryRef","handleAddress1Change","handleAddress2Change","handleCityChange","handleStateChange","handleCountryChange","handlePostCodeChange","handleFullNameChange","handleEmailChange","handlePhoneChange","handleSaveInfoChange","shippingOptions","handleShippingSelect","amount","renderPaymentItem","main","renderCheckoutItem","invoiceContent","prices","shippingPrices","checkoutInfo","totalPrice","photoUrl","paymentMethod","paymentProvider","shippingAddress","shippingMethod","item","expiryInputRef","charAt","parts","formatCardExpiry","cardNumberRef","cardType","setCardType","newCardType","formatCardNumber","cardIcon","mastercardIconPath","visaIconPath","getCardIcon","canSaveCredentials","needCardholderName","needCountry","needZip","handleCardNumberChange","handleCardholderChange","toUpperCase","handleExpiryChange","handleCvvChange","handleBillingPostCodeChange","handleChangeSaveCredentials","savedInfo","invoice","nativeProvider","nativeParams","passwordMissing","payment","isProviderError","nameRequested","phoneRequested","emailRequested","shippingAddressRequested","flexible","phoneToProvider","emailToProvider","globalDialogs","validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError","paymentState","paymentDispatch","currencySign","field","fieldError","errors","getShippingErrors","handleErrorModalClose","PaymentStep","Checkout","shippingOption","getShippingPrices","totalPrices","concat","acc","cur","getTotalPrice","detectCardTypeText","findShippingOption","getCheckoutInfo","validateRequest","requestInfo","getRequestInfo","sendCredentials","credentials","expiryMonth","expiryYear","zip","getCredentials","sendForm","shippingOptionId","setStep","nextStep","ShippingInfo","Shipping","PaymentInfo","buttonText","cuurentStep","renderModalContent","renderError","optionId","receipt","mapedPrices","info","totalAmount","credentialsTitle","fullAddress","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","path","location","cropperResultOptions","quality","format","circle","Croppie","croppiePromise","cropper","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","enableZoom","boundary","viewport","blobToDataUri","bind","err","DEBUG","console","initCropper","ensureCroppie","croppedImg","blobToFile","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","URL","revokeObjectURL","createObjectURL","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","STICKER_SIZE","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","isPeekShown","setIsPeekShown","handleFirstMonkeyLoad","STICKER_SIZE_TWO_FA","playSegment","onInputChange","setPassword","canSubmit","setCanSubmit","select","autoComplete","MIN_PASSWORD_LENGTH"],"mappings":"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","file":"3.c4d4bc793e11d4bb6728.js","sourcesContent":["import { ApiMessage, ApiDimensions } from '../../../api/types';\n\nimport { MediaViewerOrigin } from '../../../types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport {\n calculateDimensions,\n getMediaViewerAvailableDimensions,\n MEDIA_VIEWER_MEDIA_QUERY,\n REM,\n} from '../../common/helpers/mediaDimensions';\nimport windowSize from '../../../util/windowSize';\n\nconst ANIMATION_DURATION = 200;\n\nexport function animateOpening(\n hasFooter: boolean,\n origin: MediaViewerOrigin,\n bestImageData: string,\n dimensions: ApiDimensions,\n isVideo: boolean,\n message?: ApiMessage,\n) {\n const { mediaEl: fromImage } = getNodes(origin, message);\n if (!fromImage) {\n return;\n }\n\n const { width: windowWidth } = windowSize.get();\n const {\n width: availableWidth, height: availableHeight,\n } = getMediaViewerAvailableDimensions(hasFooter, isVideo);\n const { width: toWidth, height: toHeight } = calculateDimensions(\n availableWidth, availableHeight, dimensions.width, dimensions.height,\n );\n const toLeft = (windowWidth - toWidth) / 2;\n const toTop = getTopOffset(hasFooter) + (availableHeight - toHeight) / 2;\n\n let {\n top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight,\n } = fromImage.getBoundingClientRect();\n\n if ([\n MediaViewerOrigin.SharedMedia,\n MediaViewerOrigin.Album,\n MediaViewerOrigin.ScheduledAlbum,\n MediaViewerOrigin.SearchResult,\n ].includes(origin)) {\n const uncovered = uncover(toWidth, toHeight, fromTop, fromLeft, fromWidth, fromHeight);\n fromTop = uncovered.top;\n fromLeft = uncovered.left;\n fromWidth = uncovered.width;\n fromHeight = uncovered.height;\n }\n\n const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2);\n const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2);\n const fromScaleX = fromWidth / toWidth;\n const fromScaleY = fromHeight / toHeight;\n\n const ghost = createGhost(bestImageData || fromImage);\n applyStyles(ghost, {\n top: `${toTop}px`,\n left: `${toLeft}px`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`,\n });\n applyShape(ghost, origin);\n\n document.body.classList.add('ghost-animating');\n\n requestAnimationFrame(() => {\n document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n ghost.style.transform = '';\n clearShape(ghost);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (document.body.contains(ghost)) {\n document.body.removeChild(ghost);\n }\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nexport function animateClosing(origin: MediaViewerOrigin, bestImageData: string, message?: ApiMessage) {\n const { container, mediaEl: toImage } = getNodes(origin, message);\n if (!toImage) {\n return;\n }\n\n const fromImage = document.getElementById('MediaViewer')!.querySelector(\n '.active .media-viewer-content img, .active .media-viewer-content video',\n );\n if (!fromImage || !toImage) {\n return;\n }\n\n const {\n top: fromTop, left: fromLeft, width: fromWidth, height: fromHeight,\n } = fromImage.getBoundingClientRect();\n const {\n top: targetTop, left: toLeft, width: toWidth, height: toHeight,\n } = toImage.getBoundingClientRect();\n\n let toTop = targetTop;\n if (!isElementInViewport(container)) {\n const { height: windowHeight } = windowSize.get();\n toTop = targetTop < fromTop ? -toHeight : windowHeight;\n }\n\n const fromTranslateX = (fromLeft + fromWidth / 2) - (toLeft + toWidth / 2);\n const fromTranslateY = (fromTop + fromHeight / 2) - (toTop + toHeight / 2);\n let fromScaleX = fromWidth / toWidth;\n let fromScaleY = fromHeight / toHeight;\n\n const shouldFadeOut = (\n [MediaViewerOrigin.Inline, MediaViewerOrigin.ScheduledInline].includes(origin)\n && !isMessageImageFullyVisible(container, toImage)\n ) || (\n [MediaViewerOrigin.Album, MediaViewerOrigin.ScheduledAlbum].includes(origin)\n && !isMessageImageFullyVisible(container, toImage)\n );\n\n if ([\n MediaViewerOrigin.SharedMedia,\n MediaViewerOrigin.Album,\n MediaViewerOrigin.ScheduledAlbum,\n MediaViewerOrigin.SearchResult,\n ].includes(origin)) {\n if (fromScaleX > fromScaleY) {\n fromScaleX = fromScaleY;\n } else if (fromScaleY > fromScaleX) {\n fromScaleY = fromScaleX;\n }\n }\n\n const existingGhost = document.getElementsByClassName('ghost')[0] as HTMLDivElement;\n\n const ghost = existingGhost || createGhost(bestImageData || toImage, origin === MediaViewerOrigin.ProfileAvatar);\n if (!existingGhost) {\n applyStyles(ghost, {\n top: `${toTop}px`,\n left: `${toLeft}px`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n transform: `translate3d(${fromTranslateX}px, ${fromTranslateY}px, 0) scale(${fromScaleX}, ${fromScaleY})`,\n });\n }\n\n requestAnimationFrame(() => {\n if (existingGhost) {\n const {\n top,\n left,\n width,\n height,\n } = existingGhost.getBoundingClientRect();\n const scaleX = width / toWidth;\n const scaleY = height / toHeight;\n\n applyStyles(ghost, {\n transition: 'none',\n top: `${toTop}px`,\n left: `${toLeft}px`,\n transformOrigin: 'top left',\n transform: `translate3d(${left - toLeft}px, ${top - toTop}px, 0) scale(${scaleX}, ${scaleY})`,\n width: `${toWidth}px`,\n height: `${toHeight}px`,\n });\n }\n document.body.classList.add('ghost-animating');\n if (!existingGhost) document.body.appendChild(ghost);\n\n requestAnimationFrame(() => {\n if (existingGhost) {\n existingGhost.style.transition = '';\n }\n\n ghost.style.transform = '';\n\n if (shouldFadeOut) {\n ghost.style.opacity = '0';\n }\n\n applyShape(ghost, origin);\n\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (document.body.contains(ghost)) {\n document.body.removeChild(ghost);\n }\n document.body.classList.remove('ghost-animating');\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n });\n });\n}\n\nfunction createGhost(source: string | HTMLImageElement | HTMLVideoElement, shouldAppendProfileInfo = false) {\n const ghost = document.createElement('div');\n ghost.classList.add('ghost');\n\n const img = new Image();\n\n if (typeof source === 'string') {\n img.src = source;\n } else if (source instanceof HTMLVideoElement) {\n img.src = source.poster;\n } else {\n img.src = source.src;\n }\n\n ghost.appendChild(img);\n\n if (shouldAppendProfileInfo) {\n ghost.classList.add('ProfileInfo');\n const profileInfo = document.querySelector('#RightColumn .ProfileInfo .info');\n if (profileInfo) {\n ghost.appendChild(profileInfo.cloneNode(true));\n }\n }\n\n return ghost;\n}\n\nfunction uncover(realWidth: number, realHeight: number, top: number, left: number, width: number, height: number) {\n if (realWidth === realHeight) {\n const size = Math.max(width, height) * (realWidth / realHeight);\n left -= (size - width) / 2;\n top -= (size - height) / 2;\n width = size;\n height = size;\n } else if (realWidth > realHeight) {\n const srcWidth = width;\n width = height * (realWidth / realHeight);\n left -= (width - srcWidth) / 2;\n } else if (realHeight > realWidth) {\n const srcHeight = height;\n height = width * (realHeight / realWidth);\n top -= (height - srcHeight) / 2;\n }\n\n return {\n top, left, width, height,\n };\n}\n\nfunction isElementInViewport(el: HTMLElement) {\n if (el.style.display === 'none') {\n return false;\n }\n\n const rect = el.getBoundingClientRect();\n const { height: windowHeight } = windowSize.get();\n\n return (rect.top <= windowHeight) && ((rect.top + rect.height) >= 0);\n}\n\nfunction isMessageImageFullyVisible(container: HTMLElement, imageEl: HTMLElement) {\n const messageListElement = document.querySelector('.active > .MessageList')!;\n let imgOffsetTop = container.offsetTop + imageEl.closest('.content-inner, .WebPage')!.offsetTop;\n if (container.id.includes('album-media-')) {\n imgOffsetTop += container.parentElement!.offsetTop + container.closest('.Message')!.offsetTop;\n }\n\n return imgOffsetTop > messageListElement.scrollTop\n && imgOffsetTop + imageEl.offsetHeight < messageListElement.scrollTop + messageListElement.offsetHeight;\n}\n\nfunction getTopOffset(hasFooter: boolean) {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n let topOffsetRem = 4.125;\n if (hasFooter) {\n topOffsetRem += mql.matches ? 0.875 : 3.375;\n }\n\n return topOffsetRem * REM;\n}\n\nfunction applyStyles(element: HTMLElement, styles: Record) {\n Object.assign(element.style, styles);\n}\n\nfunction getNodes(origin: MediaViewerOrigin, message?: ApiMessage) {\n let containerSelector;\n let mediaSelector;\n\n switch (origin) {\n case MediaViewerOrigin.Album:\n case MediaViewerOrigin.ScheduledAlbum:\n containerSelector = `.active > .MessageList #album-media-${message!.id}`;\n mediaSelector = '.full-media';\n break;\n\n case MediaViewerOrigin.SharedMedia:\n containerSelector = `#shared-media${message!.id}`;\n mediaSelector = 'img';\n break;\n\n case MediaViewerOrigin.SearchResult:\n containerSelector = `#search-media${message!.id}`;\n mediaSelector = 'img';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\n containerSelector = '.MiddleHeader .ChatInfo .Avatar';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ProfileAvatar:\n containerSelector = '#RightColumn .ProfileInfo .active .ProfilePhoto';\n mediaSelector = 'img.avatar-media';\n break;\n\n case MediaViewerOrigin.ScheduledInline:\n case MediaViewerOrigin.Inline:\n default:\n containerSelector = `.active > .MessageList #message${message!.id}`;\n mediaSelector = '.message-content .full-media, .message-content .thumbnail';\n }\n\n const container = document.querySelector(containerSelector)!;\n const mediaEls = container && container.querySelectorAll(mediaSelector);\n\n return {\n container,\n mediaEl: mediaEls && mediaEls[mediaEls.length - 1],\n };\n}\n\nfunction applyShape(ghost: HTMLDivElement, origin: MediaViewerOrigin) {\n switch (origin) {\n case MediaViewerOrigin.Album:\n case MediaViewerOrigin.ScheduledAlbum:\n case MediaViewerOrigin.Inline:\n case MediaViewerOrigin.ScheduledInline:\n ghost.classList.add('rounded-corners');\n break;\n\n case MediaViewerOrigin.SharedMedia:\n case MediaViewerOrigin.ProfileAvatar:\n case MediaViewerOrigin.SearchResult:\n (ghost.firstChild as HTMLElement).style.objectFit = 'cover';\n break;\n\n case MediaViewerOrigin.MiddleHeaderAvatar:\n ghost.classList.add('circle');\n break;\n }\n}\n\nfunction clearShape(ghost: HTMLDivElement) {\n (ghost.firstChild as HTMLElement).style.objectFit = 'default';\n ghost.classList.remove('rounded-corners', 'circle');\n}\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiMessage, ApiUser } from '../../api/types';\n\nimport { getSenderTitle, isChatPrivate } from '../../modules/helpers';\nimport { formatMediaDateTime } from '../../util/dateFormat';\nimport renderText from '../common/helpers/renderText';\nimport {\n selectChat,\n selectChatMessage,\n selectSender,\n selectUser,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from '../common/Avatar';\n\nimport './SenderInfo.scss';\n\ntype OwnProps = {\n chatId?: number;\n messageId?: number;\n isAvatar?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiUser | ApiChat;\n message?: ApiMessage;\n};\n\ntype DispatchProps = Pick;\n\nconst SenderInfo: FC = ({\n chatId, messageId, sender, isAvatar, message, closeMediaViewer, focusMessage,\n}) => {\n const handleFocusMessage = useCallback(() => {\n closeMediaViewer();\n focusMessage({ chatId, messageId });\n }, [chatId, focusMessage, messageId, closeMediaViewer]);\n\n const lang = useLang();\n\n if (!sender || (!message && !isAvatar)) {\n return undefined;\n }\n\n const isFromChat = sender.id < 0;\n const senderTitle = getSenderTitle(lang, sender);\n\n return (\n
\n {isFromChat ? (\n \n ) : (\n \n )}\n
\n
\n {senderTitle && renderText(senderTitle)}\n
\n
\n {isAvatar ? lang('lng_mediaview_profile_photo') : formatMediaDateTime(lang, message!.date * 1000)}\n
\n
\n
\n );\n};\n\nexport default withGlobal(\n (global, { chatId, messageId, isAvatar }): StateProps => {\n if (isAvatar && chatId) {\n return {\n sender: isChatPrivate(chatId) ? selectUser(global, chatId) : selectChat(global, chatId),\n };\n }\n\n if (!messageId || !chatId) {\n return {};\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n\n return {\n message,\n sender: message && selectSender(global, message),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['closeMediaViewer', 'focusMessage']),\n)(SenderInfo);\n","import React, { FC, useMemo } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { getMessageMediaHash } from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport useMediaDownload from '../../hooks/useMediaDownload';\n\nimport Button from '../ui/Button';\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport ProgressSpinner from '../ui/ProgressSpinner';\n\nimport './MediaViewerActions.scss';\n\ntype OwnProps = {\n mediaData?: string;\n isVideo: boolean;\n isZoomed: boolean;\n message?: ApiMessage;\n fileName?: string;\n isAvatar?: boolean;\n onCloseMediaViewer: NoneToVoidFunction;\n onForward: NoneToVoidFunction;\n onZoomToggle: NoneToVoidFunction;\n};\n\nconst MediaViewerActions: FC = ({\n mediaData,\n isVideo,\n isZoomed,\n message,\n fileName,\n isAvatar,\n onCloseMediaViewer,\n onForward,\n onZoomToggle,\n}) => {\n const {\n isDownloadStarted,\n downloadProgress,\n handleDownloadClick,\n } = useMediaDownload(\n message && isVideo ? getMessageMediaHash(message, 'download') : undefined,\n fileName,\n );\n\n const lang = useLang();\n\n const MenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, []);\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n return (\n
\n \n {!isAvatar && (\n \n {lang('Forward')}\n \n )}\n {isVideo ? (\n \n {isDownloadStarted ? `${Math.round(downloadProgress * 100)}% Downloading...` : 'Download'}\n \n ) : (\n \n {lang('AccActionDownload')}\n \n )}\n \n {isDownloadStarted && }\n
\n );\n }\n\n return (\n
\n {!isAvatar && (\n <>\n \n \n \n \n )}\n {isVideo ? (\n \n {isDownloadStarted ? (\n \n ) : (\n \n )}\n \n ) : (\n \n \n \n )}\n \n \n \n \n \n \n
\n );\n};\n\nexport default MediaViewerActions;\n","import React, { FC, useEffect, useState } from '../../lib/teact/teact';\n\nimport { throttle } from '../../util/schedulers';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport buildClassName from '../../util/buildClassName';\nimport { REM } from '../common/helpers/mediaDimensions';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\n\nimport './MediaViewerFooter.scss';\n\nconst RESIZE_THROTTLE_MS = 500;\n\ntype OwnProps = {\n text: TextPart | TextPart[];\n onClick: () => void;\n isHidden?: boolean;\n isForVideo: boolean;\n};\n\nconst MediaViewerFooter: FC = ({\n text = '', isHidden, isForVideo, onClick,\n}) => {\n const [isMultiline, setIsMultiline] = useState(false);\n useEffect(() => {\n const footerContent = document.querySelector('.MediaViewerFooter .media-text') as HTMLDivElement | null;\n\n const checkIsMultiline = () => {\n const height = footerContent ? footerContent.clientHeight : 0;\n\n setIsMultiline(height > REM * 2);\n };\n\n // First run for initial detection of multiline footer text\n checkIsMultiline();\n\n const handleResize = throttle(checkIsMultiline, RESIZE_THROTTLE_MS, true);\n\n window.addEventListener('resize', handleResize, false);\n\n return () => {\n window.removeEventListener('resize', handleResize, false);\n };\n }, []);\n\n function stopEvent(e: React.MouseEvent) {\n if (text) {\n e.stopPropagation();\n }\n }\n\n const classNames = buildClassName(\n 'MediaViewerFooter',\n isForVideo && 'is-for-video',\n isHidden && 'is-hidden',\n );\n\n return (\n
\n {text && (\n
\n

{text}

\n
\n )}\n
\n );\n};\n\nexport default MediaViewerFooter;\n","import { useLayoutEffect, useState } from '../lib/teact/teact';\nimport { PLATFORM_ENV } from '../util/environment';\n\ntype RefType = {\n current: HTMLElement | null;\n};\n\ntype ReturnType = [boolean, () => void, () => void] | [false];\ntype CallbackType = (isPlayed: boolean) => void;\n\nconst prop = getBrowserFullscreenElementProp();\n\nexport default function useFullscreenStatus(elRef: RefType, setIsPlayed: CallbackType): ReturnType {\n const [isFullscreen, setIsFullscreen] = useState(Boolean(prop && document[prop]));\n\n const setFullscreen = () => {\n if (!elRef.current || !(prop || PLATFORM_ENV === 'iOS')) {\n return;\n }\n\n if (elRef.current.requestFullscreen) {\n elRef.current.requestFullscreen();\n } else if (elRef.current.webkitRequestFullscreen) {\n elRef.current.webkitRequestFullscreen();\n } else if (elRef.current.webkitEnterFullscreen) {\n elRef.current.webkitEnterFullscreen();\n } else if (elRef.current.mozRequestFullScreen) {\n elRef.current.mozRequestFullScreen();\n }\n\n setIsFullscreen(true);\n };\n\n const exitFullscreen = () => {\n if (!elRef.current) {\n return;\n }\n\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.webkitCancelFullScreen) {\n document.webkitCancelFullScreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n }\n\n setIsFullscreen(false);\n };\n\n useLayoutEffect(() => {\n const listener = () => { setIsFullscreen(Boolean(prop && document[prop])); };\n const listenerEnter = () => { setIsFullscreen(true); };\n const listenerExit = () => {\n setIsFullscreen(false);\n setIsPlayed(false);\n };\n const video = elRef.current;\n\n document.addEventListener('fullscreenchange', listener, false);\n document.addEventListener('webkitfullscreenchange', listener, false);\n document.addEventListener('mozfullscreenchange', listener, false);\n\n if (video) {\n video.addEventListener('webkitbeginfullscreen', listenerEnter, false);\n video.addEventListener('webkitendfullscreen', listenerExit, false);\n }\n\n return () => {\n document.removeEventListener('fullscreenchange', listener, false);\n document.removeEventListener('webkitfullscreenchange', listener, false);\n document.removeEventListener('mozfullscreenchange', listener, false);\n if (video) {\n video.removeEventListener('webkitbeginfullscreen', listenerEnter, false);\n video.removeEventListener('webkitendfullscreen', listenerExit, false);\n }\n };\n // eslint-disable-next-line\n }, []);\n\n if (!prop && PLATFORM_ENV !== 'iOS') {\n return [false];\n }\n\n return [isFullscreen, setFullscreen, exitFullscreen];\n}\n\nfunction getBrowserFullscreenElementProp() {\n if (typeof document.fullscreenElement !== 'undefined') {\n return 'fullscreenElement';\n } else if (typeof document.mozFullScreenElement !== 'undefined') {\n return 'mozFullScreenElement';\n } else if (typeof document.webkitFullscreenElement !== 'undefined') {\n return 'webkitFullscreenElement';\n }\n\n return '';\n}\n","const units = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'];\n\nexport default (bytes: number) => {\n const number = bytes === 0 ? 0 : Math.floor(Math.log(bytes) / Math.log(1024));\n\n return `${(bytes / 1024 ** Math.floor(number)).toFixed(1)} ${units[number]}`;\n};\n","import React, { FC, useState, useEffect } from '../../lib/teact/teact';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { formatMediaDuration } from '../../util/dateFormat';\nimport formatFileSize from './helpers/formatFileSize';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './VideoPlayerControls.scss';\n\ntype IProps = {\n bufferedProgress: number;\n currentTime: number;\n duration: number;\n fileSize: number;\n isForceVisible: boolean;\n isForceMobileVersion?: boolean;\n isPlayed: boolean;\n isFullscreenSupported: boolean;\n isFullscreen: boolean;\n onChangeFullscreen: (e: React.MouseEvent) => void;\n onPlayPause: (e: React.MouseEvent) => void;\n onSeek: OnChangeHandler;\n};\n\ntype OnChangeHandler = (e: React.ChangeEvent) => void;\n\nconst stopEvent = (e: React.MouseEvent) => {\n e.stopPropagation();\n};\n\nconst HIDE_CONTROLS_TIMEOUT_MS = 800;\n\nconst VideoPlayerControls: FC = ({\n bufferedProgress,\n currentTime,\n duration,\n fileSize,\n isForceVisible,\n isForceMobileVersion,\n isPlayed,\n isFullscreenSupported,\n isFullscreen,\n onChangeFullscreen,\n onPlayPause,\n onSeek,\n}) => {\n const [isVisible, setVisibility] = useState(true);\n\n useEffect(() => {\n if (isForceVisible) {\n setVisibility(isForceVisible);\n }\n }, [isForceVisible]);\n\n useEffect(() => {\n let timeout: number | undefined;\n\n if (!isForceVisible) {\n if (IS_SINGLE_COLUMN_LAYOUT) {\n setVisibility(false);\n } else {\n timeout = window.setTimeout(() => {\n setVisibility(false);\n }, HIDE_CONTROLS_TIMEOUT_MS);\n }\n }\n\n return () => {\n if (timeout) {\n window.clearTimeout(timeout);\n }\n };\n }, [isForceVisible]);\n\n useEffect(() => {\n if (isVisible || isForceVisible) {\n document.body.classList.add('video-controls-visible');\n }\n\n return () => {\n document.body.classList.remove('video-controls-visible');\n };\n }, [isForceVisible, isVisible]);\n\n const lang = useLang();\n\n if (!isVisible && !isForceVisible) {\n return undefined;\n }\n\n return (\n
\n {renderSeekLine(currentTime, duration, bufferedProgress, onSeek)}\n \n \n \n {renderTime(currentTime, duration)}\n {bufferedProgress < 1 && renderFileSize(bufferedProgress, fileSize)}\n {isFullscreenSupported && (\n \n \n \n )}\n
\n );\n};\n\nfunction renderTime(currentTime: number, duration: number) {\n return (\n
\n {`${formatMediaDuration(currentTime)} / ${formatMediaDuration(duration)}`}\n
\n );\n}\n\nfunction renderFileSize(downloadedPercent: number, totalSize: number) {\n return (\n
\n {`${formatFileSize(totalSize * downloadedPercent)} / ${formatFileSize(totalSize)}`}\n
\n );\n}\n\nfunction renderSeekLine(currentTime: number, duration: number, bufferedProgress: number, onSeek: OnChangeHandler) {\n const percentagePlayed = (currentTime / duration) * 100;\n const percentageBuffered = bufferedProgress * 100;\n\n return (\n
\n
\n \n \n \n
\n
\n );\n}\n\nexport default VideoPlayerControls;\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { ApiDimensions } from '../../api/types';\n\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../util/environment';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBuffering from '../../hooks/useBuffering';\nimport useFullscreenStatus from '../../hooks/useFullscreen';\nimport useVideoCleanup from '../../hooks/useVideoCleanup';\nimport safePlay from '../../util/safePlay';\n\nimport VideoPlayerControls from './VideoPlayerControls';\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Button from '../ui/Button';\n\nimport './VideoPlayer.scss';\n\ntype OwnProps = {\n url?: string;\n isGif?: boolean;\n posterData?: string;\n posterSize?: ApiDimensions;\n downloadProgress?: number;\n fileSize: number;\n isMediaViewerOpen?: boolean;\n noPlay?: boolean;\n onClose: (e: React.MouseEvent) => void;\n};\n\nconst MOBILE_VERSION_CONTROL_WIDTH = 400;\n\nconst VideoPlayer: FC = ({\n url,\n isGif,\n posterData,\n posterSize,\n downloadProgress,\n fileSize,\n isMediaViewerOpen,\n noPlay,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n const [isPlayed, setIsPlayed] = useState(!IS_TOUCH_ENV || !IS_IOS);\n const [currentTime, setCurrentTime] = useState(0);\n const [isControlsVisible, setIsControlsVisible] = useState(true);\n\n const [isFullscreen, setFullscreen, exitFullscreen] = useFullscreenStatus(videoRef, setIsPlayed);\n\n const { isBuffered, bufferedProgress, bufferingHandlers } = useBuffering();\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(!isBuffered, undefined, undefined, 'slow');\n const {\n shouldRender: shouldRenderPlayButton,\n transitionClassNames: playButtonClassNames,\n } = useShowTransition(IS_IOS && !isPlayed && !shouldRenderSpinner, undefined, undefined, 'slow');\n\n useEffect(() => {\n if (noPlay || !isMediaViewerOpen) {\n videoRef.current!.pause();\n } else if (url && !IS_TOUCH_ENV) {\n // Chrome does not automatically start playing when `url` becomes available (even with `autoPlay`),\n // so we force it here. Contrary, iOS does not allow to call `play` without mouse event,\n // so we need to use `autoPlay` instead to allow pre-buffering.\n safePlay(videoRef.current!);\n }\n }, [noPlay, isMediaViewerOpen, url]);\n\n useEffect(() => {\n if (videoRef.current!.currentTime === videoRef.current!.duration) {\n setCurrentTime(0);\n setIsPlayed(false);\n } else {\n setCurrentTime(videoRef.current!.currentTime);\n }\n }, [currentTime]);\n\n const togglePlayState = useCallback((e: React.MouseEvent | KeyboardEvent) => {\n e.stopPropagation();\n if (isPlayed) {\n videoRef.current!.pause();\n setIsPlayed(false);\n } else {\n videoRef.current!.play();\n setIsPlayed(true);\n }\n }, [isPlayed]);\n\n useVideoCleanup(videoRef, []);\n\n const handleMouseOver = useCallback(() => {\n setIsControlsVisible(true);\n }, []);\n\n const handleMouseOut = useCallback(() => {\n setIsControlsVisible(false);\n }, []);\n\n const handleTimeUpdate = useCallback((e: React.SyntheticEvent) => {\n setCurrentTime(e.currentTarget.currentTime);\n }, []);\n\n const handleEnded = useCallback(() => {\n setCurrentTime(0);\n setIsPlayed(false);\n }, []);\n\n const handleFullscreenChange = useCallback(() => {\n if (isFullscreen && exitFullscreen) {\n exitFullscreen();\n } else if (!isFullscreen && setFullscreen) {\n setFullscreen();\n }\n }, [exitFullscreen, isFullscreen, setFullscreen]);\n\n const handleSeek = useCallback((e: React.ChangeEvent) => {\n e.stopPropagation();\n\n videoRef.current!.currentTime = (Number(e.target.value) * videoRef.current!.duration) / 100;\n }, []);\n\n const toggleControls = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n setIsControlsVisible(!isControlsVisible);\n }, [isControlsVisible]);\n\n useEffect(() => {\n const togglePayingStateBySpace = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n togglePlayState(e);\n }\n };\n\n document.addEventListener('keydown', togglePayingStateBySpace, false);\n\n return () => {\n document.removeEventListener('keydown', togglePayingStateBySpace, false);\n };\n }, [togglePlayState]);\n\n const wrapperStyle = posterSize && `width: ${posterSize.width}px; height: ${posterSize.height}px`;\n const videoStyle = `background-image: url(${posterData})`;\n\n return (\n \n \n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n {url && }\n \n \n {shouldRenderPlayButton && (\n \n )}\n {shouldRenderSpinner && (\n
\n {!isBuffered &&
Buffering...
}\n \n
\n )}\n {!isGif && !shouldRenderSpinner && (\n \n )}\n \n );\n};\n\nexport default memo(VideoPlayer);\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport usePrevious from '../../hooks/usePrevious';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './ZoomControls.scss';\n\ntype OwnProps = {\n isShown: boolean;\n onChangeZoom: (level: number, canCloseZoom?: boolean) => void;\n};\n\nexport const MAX_ZOOM_LEVEL = 3;\nexport const MIN_ZOOM_LEVEL = 1;\nconst ONE_STEP_PERCENT = 100 / (MAX_ZOOM_LEVEL - MIN_ZOOM_LEVEL);\nconst RESET_ZOOM_LEVEL = 1.5;\n\nconst ZoomControls: FC = ({ isShown, onChangeZoom }) => {\n const { transitionClassNames } = useShowTransition(isShown);\n const prevIsShown = usePrevious(isShown);\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [zoomLevel, setZoomLevel] = useState(1);\n const isSeeking = useRef(false);\n\n useEffect(() => {\n if (isShown && !prevIsShown) {\n setZoomLevel(RESET_ZOOM_LEVEL);\n }\n }, [isShown, prevIsShown]);\n\n const handleZoomOut = () => {\n if (inputRef.current) {\n setZoomLevel(Math.max(MIN_ZOOM_LEVEL, zoomLevel - 0.5));\n }\n };\n\n const handleZoomIn = () => {\n if (inputRef.current) {\n setZoomLevel(Math.min(MAX_ZOOM_LEVEL, zoomLevel + 0.5));\n }\n };\n\n const handleStartSeek = useCallback(() => {\n isSeeking.current = true;\n }, []);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n if (zoomLevel === 1) {\n onChangeZoom(zoomLevel, !isSeeking.current);\n }\n }, [onChangeZoom, zoomLevel]);\n\n const handleSeeklineChange = (e:React.ChangeEvent) => {\n setZoomLevel(Math.min(MAX_ZOOM_LEVEL, Math.max(Number(e.target.value), MIN_ZOOM_LEVEL)));\n };\n\n useEffect(() => {\n onChangeZoom(zoomLevel, !isSeeking.current);\n }, [zoomLevel, onChangeZoom]);\n\n const lang = useLang();\n\n const className = buildClassName(\n 'ZoomControls',\n transitionClassNames,\n );\n\n return (\n
\n \n \n \n \n \n \n
\n
\n \n \n
\n
\n
\n );\n};\n\nexport default memo(ZoomControls);\n","/*\n @source https://github.com/ajainarayanan/react-pan-zoom\n\n Heavily inspired/lifted from this idea: https://stackoverflow.com/a/39311435/661768\n without jqueryUI or jquery dependency.\n*/\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { areSortedArraysEqual } from '../../util/iteratees';\n\nimport './PanZoom.scss';\n\nexport interface IDragData {\n x: number;\n y: number;\n dx: number;\n dy: number;\n}\n\nexport interface OwnProps {\n children: any;\n className?: string;\n noWrap: boolean;\n canPan: boolean;\n zoomLevel: number;\n panDeltaX: number;\n panDeltaY: number;\n onPan?: (x: number, y: number) => void;\n}\n\nconst INITIAL_MATRIX = [\n 1, 0, 0, 1, 0, 0,\n];\n\nconst SCALE_VALUES = {\n 1: 1,\n 1.5: 1.5,\n 2: 2.2,\n 2.5: 3.3,\n 3: 5.5,\n};\n\nconst ZOOM_SAFE_AREA = 150;\n\nfunction calculateSafeZoneOnZoom(oldScale: number, matrixData: number[], wrapper: HTMLDivElement | null) {\n const image = wrapper && wrapper.querySelector('.active img');\n if (!wrapper || !image) {\n return matrixData;\n }\n const wrapperRect = wrapper.getBoundingClientRect();\n const imageRect = image.getBoundingClientRect();\n\n const newImgWidth = (imageRect.width / oldScale) * matrixData[0];\n const newImgHeight = (imageRect.height / oldScale) * matrixData[3];\n const newImgX = (wrapperRect.width - newImgWidth) / 2 + matrixData[4];\n const newImgY = (wrapperRect.height - newImgHeight) / 2 + matrixData[5];\n if (wrapperRect.width && wrapperRect.width - ZOOM_SAFE_AREA < newImgX) {\n matrixData[4] -= newImgX + wrapperRect.width - ZOOM_SAFE_AREA;\n } else if (newImgWidth && newImgWidth + newImgX < ZOOM_SAFE_AREA) {\n matrixData[4] -= newImgWidth + newImgX - ZOOM_SAFE_AREA;\n }\n if (wrapperRect.height && wrapperRect.height - ZOOM_SAFE_AREA < newImgY) {\n matrixData[5] -= newImgY + wrapperRect.height - ZOOM_SAFE_AREA;\n } else if (newImgHeight && newImgHeight + newImgY < ZOOM_SAFE_AREA) {\n matrixData[5] -= newImgHeight + newImgY - ZOOM_SAFE_AREA;\n }\n\n return matrixData;\n}\n\nconst PanZoom: FC = ({\n children,\n className,\n noWrap,\n canPan,\n zoomLevel,\n panDeltaX,\n panDeltaY,\n onPan,\n}) => {\n const tunedZoomLevel = SCALE_VALUES[zoomLevel as keyof typeof SCALE_VALUES] || zoomLevel;\n const [isDragging, setIsDragging] = useState(false);\n const [dragData, setDragData] = useState({\n dx: panDeltaX, dy: panDeltaY, x: 0, y: 0,\n });\n // [zoom, skew, skew, zoom, dx, dy] - see https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/matrix()\n const [matrixData, setMatrixData] = useState(INITIAL_MATRIX);\n // Used to set cursor while moving.\n // eslint-disable-next-line no-null/no-null\n const panWrapperRef = useRef(null);\n // Used to set transform for pan.\n // eslint-disable-next-line no-null/no-null\n const panContainerRef = useRef(null);\n\n useEffect(() => {\n const newZoomLevel = tunedZoomLevel || matrixData[0];\n const newPandx = panDeltaX || matrixData[4];\n const newPandy = panDeltaY || matrixData[5];\n\n const newMatrixData = [...matrixData];\n if (matrixData[0] !== newZoomLevel) {\n newMatrixData[0] = newZoomLevel || newMatrixData[0];\n newMatrixData[3] = newZoomLevel || newMatrixData[3];\n }\n if (matrixData[4] !== newPandx) {\n newMatrixData[4] = newPandx;\n }\n if (matrixData[5] !== newPandy) {\n newMatrixData[5] = newPandy;\n }\n\n if (!areSortedArraysEqual(matrixData, newMatrixData)) {\n setMatrixData(calculateSafeZoneOnZoom(matrixData[0], newMatrixData, panWrapperRef.current));\n }\n // eslint-disable-next-line\n }, [panDeltaX, panDeltaY, tunedZoomLevel]);\n\n useEffect(() => {\n if (!canPan) {\n setMatrixData(INITIAL_MATRIX);\n }\n }, [canPan]);\n\n useEffect(() => {\n if (panContainerRef.current) {\n panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`;\n }\n }, [noWrap, matrixData]);\n\n const handleMouseDown = (e: React.MouseEvent) => {\n if (!canPan) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n\n const offsetX = matrixData[4];\n const offsetY = matrixData[5];\n const newDragData: IDragData = {\n dx: offsetX,\n dy: offsetY,\n x: e.pageX,\n y: e.pageY,\n };\n setDragData(newDragData);\n setIsDragging(true);\n\n if (panWrapperRef.current) {\n panWrapperRef.current.classList.add('move');\n }\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n\n if (panWrapperRef.current) {\n panWrapperRef.current.classList.remove('move');\n }\n\n if (onPan) {\n onPan(matrixData[4], matrixData[5]);\n }\n };\n\n function getNewMatrixData(x: number, y: number): number[] {\n const newMatrixData = [...matrixData];\n const deltaX = dragData.x - x;\n const deltaY = dragData.y - y;\n newMatrixData[4] = dragData.dx - deltaX;\n newMatrixData[5] = dragData.dy - deltaY;\n\n return newMatrixData;\n }\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (isDragging) {\n const newMatrixData = getNewMatrixData(e.pageX, e.pageY);\n setMatrixData(newMatrixData);\n\n if (panContainerRef.current) {\n panContainerRef.current.style.transform = `matrix(${matrixData.toString()})`;\n }\n }\n };\n\n if (noWrap) {\n return children;\n }\n\n return (\n \n \n {children}\n \n \n );\n};\n\nexport default memo(PanZoom);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiChat, ApiMediaFormat, ApiMessage, ApiUser, ApiDimensions,\n} from '../../api/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../util/environment';\nimport windowSize from '../../util/windowSize';\nimport {\n AVATAR_FULL_DIMENSIONS,\n MEDIA_VIEWER_MEDIA_QUERY,\n calculateMediaViewerDimensions,\n} from '../common/helpers/mediaDimensions';\nimport {\n selectChat,\n selectChatMessage,\n selectChatMessages,\n selectCurrentMediaSearch,\n selectListedIds,\n selectOutlyingIds,\n selectScheduledMessage,\n selectScheduledMessages,\n selectUser,\n} from '../../modules/selectors';\nimport {\n getChatAvatarHash,\n getChatMediaMessageIds,\n getMessageFileName,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessagePhoto,\n getMessageVideo,\n getMessageDocument,\n isMessageDocumentPhoto,\n isMessageDocumentVideo,\n getMessageWebPagePhoto,\n getMessageWebPageVideo,\n getPhotoFullDimensions,\n getVideoDimensions, getMessageFileSize,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { stopCurrentAudio } from '../../util/audioPlayer';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaWithDownloadProgress from '../../hooks/useMediaWithDownloadProgress';\nimport useBlurSync from '../../hooks/useBlurSync';\nimport usePrevious from '../../hooks/usePrevious';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport { renderMessageText } from '../common/helpers/renderMessageText';\nimport { animateClosing, animateOpening } from './helpers/ghostAnimation';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Spinner from '../ui/Spinner';\nimport ShowTransition from '../ui/ShowTransition';\nimport Transition from '../ui/Transition';\nimport Button from '../ui/Button';\nimport SenderInfo from './SenderInfo';\nimport MediaViewerActions from './MediaViewerActions';\nimport MediaViewerFooter from './MediaViewerFooter';\nimport VideoPlayer from './VideoPlayer';\nimport ZoomControls from './ZoomControls';\nimport PanZoom from './PanZoom';\n\nimport './MediaViewer.scss';\n\ntype StateProps = {\n chatId?: number;\n threadId?: number;\n messageId?: number;\n senderId?: number;\n origin?: MediaViewerOrigin;\n avatarOwner?: ApiChat | ApiUser;\n profilePhotoIndex?: number;\n message?: ApiMessage;\n chatMessages?: Record;\n collectionIds?: number[];\n animationLevel: 0 | 1 | 2;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_DURATION = 350;\n\nconst MediaViewer: FC = ({\n chatId,\n threadId,\n messageId,\n senderId,\n origin,\n avatarOwner,\n profilePhotoIndex,\n message,\n chatMessages,\n collectionIds,\n openMediaViewer,\n closeMediaViewer,\n openForwardMenu,\n focusMessage,\n animationLevel,\n}) => {\n const isOpen = Boolean(avatarOwner || messageId);\n\n const isFromSharedMedia = origin === MediaViewerOrigin.SharedMedia;\n const isFromSearch = origin === MediaViewerOrigin.SearchResult;\n\n /* Content */\n const photo = message ? getMessagePhoto(message) : undefined;\n const video = message ? getMessageVideo(message) : undefined;\n const webPagePhoto = message ? getMessageWebPagePhoto(message) : undefined;\n const webPageVideo = message ? getMessageWebPageVideo(message) : undefined;\n const isDocumentPhoto = message ? isMessageDocumentPhoto(message) : false;\n const isDocumentVideo = message ? isMessageDocumentVideo(message) : false;\n const isVideo = Boolean(video || webPageVideo || isDocumentVideo);\n const isPhoto = Boolean(!isVideo && (photo || webPagePhoto || isDocumentPhoto));\n const { isGif } = video || webPageVideo || {};\n const isAvatar = Boolean(avatarOwner);\n\n /* Navigation */\n const isSingleSlide = Boolean(webPagePhoto || webPageVideo);\n const messageIds = useMemo(() => {\n return isSingleSlide && messageId\n ? [messageId]\n : getChatMediaMessageIds(chatMessages || {}, collectionIds || [], isFromSharedMedia);\n }, [isSingleSlide, messageId, chatMessages, collectionIds, isFromSharedMedia]);\n\n const selectedMediaMessageIndex = messageId ? messageIds.indexOf(messageId) : -1;\n const isFirst = selectedMediaMessageIndex === 0 || selectedMediaMessageIndex === -1;\n const isLast = selectedMediaMessageIndex === messageIds.length - 1 || selectedMediaMessageIndex === -1;\n\n /* Animation */\n const animationKey = useRef();\n const prevSenderId = usePrevious(senderId);\n if (isOpen && (!prevSenderId || prevSenderId !== senderId || !animationKey.current)) {\n animationKey.current = selectedMediaMessageIndex;\n }\n const slideAnimation = animationLevel >= 1 ? 'mv-slide' : 'none';\n const headerAnimation = animationLevel === 2 ? 'slide-fade' : 'none';\n const isGhostAnimation = animationLevel === 2;\n\n /* Controls */\n const [isFooterHidden, setIsFooterHidden] = useState(false);\n const [canPanZoomWrap, setCanPanZoomWrap] = useState(false);\n const [isZoomed, setIsZoomed] = useState(false);\n const [zoomLevel, setZoomLevel] = useState(1);\n const [panDelta, setPanDelta] = useState({ x: 0, y: 0 });\n\n /* Media data */\n function getMediaHash(isFull?: boolean) {\n if (isAvatar && profilePhotoIndex !== undefined) {\n const { photos } = avatarOwner!;\n return photos && photos[profilePhotoIndex]\n ? `photo${photos[profilePhotoIndex].id}?size=c`\n : getChatAvatarHash(avatarOwner!, isFull ? 'big' : 'normal');\n }\n\n return message && getMessageMediaHash(message, isFull ? 'viewerFull' : 'viewerPreview');\n }\n\n const blobUrlPictogram = useMedia(\n message && (isFromSharedMedia || isFromSearch) && getMessageMediaHash(message, 'pictogram'),\n undefined,\n ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const previewMediaHash = getMediaHash();\n const blobUrlPreview = useMedia(\n previewMediaHash,\n undefined,\n isAvatar && previewMediaHash && previewMediaHash.startsWith('profilePhoto')\n ? ApiMediaFormat.DataUri\n : ApiMediaFormat.BlobUrl,\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n const { mediaData: fullMediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMediaHash(true),\n undefined,\n message && getMessageMediaFormat(message, 'viewerFull'),\n undefined,\n isGhostAnimation && ANIMATION_DURATION,\n );\n\n const localBlobUrl = (photo || video) ? (photo || video)!.blobUrl : undefined;\n let bestImageData = (!isVideo && (localBlobUrl || fullMediaData)) || blobUrlPreview || blobUrlPictogram;\n const thumbDataUri = useBlurSync(!bestImageData && message && getMessageMediaThumbDataUri(message));\n if (!bestImageData && origin !== MediaViewerOrigin.SearchResult) {\n bestImageData = thumbDataUri;\n }\n\n const videoSize = message ? getMessageFileSize(message) : undefined;\n const fileName = message\n ? getMessageFileName(message)\n : isAvatar\n ? `avatar${avatarOwner!.id}-${profilePhotoIndex}.jpg`\n : undefined;\n\n let dimensions!: ApiDimensions;\n if (message) {\n if (isDocumentPhoto || isDocumentVideo) {\n dimensions = getMessageDocument(message)!.mediaSize!;\n } else if (photo || webPagePhoto) {\n dimensions = getPhotoFullDimensions((photo || webPagePhoto)!)!;\n } else if (video || webPageVideo) {\n dimensions = getVideoDimensions((video || webPageVideo)!)!;\n }\n } else {\n dimensions = AVATAR_FULL_DIMENSIONS;\n }\n\n useEffect(() => {\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n return;\n }\n\n document.body.classList.toggle('is-media-viewer-open', isOpen);\n }, [isOpen]);\n\n const forceUpdate = useForceUpdate();\n useEffect(() => {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', forceUpdate);\n } else if (typeof mql.addListener === 'function') {\n mql.addListener(forceUpdate);\n }\n\n return () => {\n if (typeof mql.removeEventListener === 'function') {\n mql.removeEventListener('change', forceUpdate);\n } else if (typeof mql.removeListener === 'function') {\n mql.removeListener(forceUpdate);\n }\n };\n }, [forceUpdate]);\n\n const prevMessage = usePrevious(message);\n const prevOrigin = usePrevious(origin);\n const prevAvatarOwner = usePrevious(avatarOwner);\n const prevBestImageData = usePrevious(bestImageData);\n useEffect(() => {\n if (isGhostAnimation && isOpen && !prevMessage && !prevAvatarOwner) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n const textParts = message ? renderMessageText(message) : undefined;\n const hasFooter = Boolean(textParts);\n animateOpening(hasFooter, origin!, bestImageData!, dimensions, isVideo, message);\n }\n\n if (isGhostAnimation && !isOpen && (prevMessage || prevAvatarOwner)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION + ANIMATION_END_DELAY);\n animateClosing(prevOrigin!, prevBestImageData!, prevMessage || undefined);\n }\n }, [\n isGhostAnimation, isOpen, origin, prevOrigin, message, prevMessage, prevAvatarOwner,\n bestImageData, prevBestImageData, dimensions, isVideo,\n ]);\n\n useEffect(() => {\n let timer: number | undefined;\n\n if (isZoomed) {\n setCanPanZoomWrap(true);\n } else {\n timer = window.setTimeout(() => {\n setCanPanZoomWrap(false);\n }, ANIMATION_DURATION);\n }\n\n return () => {\n if (timer) {\n window.clearTimeout(timer);\n }\n };\n }, [isZoomed]);\n\n const closeZoom = () => {\n setIsZoomed(false);\n setZoomLevel(1);\n setPanDelta({ x: 0, y: 0 });\n };\n\n const handleZoomToggle = useCallback(() => {\n setIsZoomed(!isZoomed);\n setZoomLevel(!isZoomed ? 1.5 : 1);\n if (isZoomed) {\n setPanDelta({ x: 0, y: 0 });\n }\n }, [isZoomed]);\n\n const handleZoomValue = useCallback((level: number, canCloseZoom = false) => {\n setZoomLevel(level);\n if (level === 1 && canCloseZoom) {\n closeZoom();\n }\n }, []);\n\n const close = useCallback(() => {\n closeMediaViewer();\n closeZoom();\n }, [closeMediaViewer]);\n\n const handleFooterClick = useCallback(() => {\n close();\n focusMessage({ chatId, threadId, messageId });\n }, [close, chatId, threadId, focusMessage, messageId]);\n\n const handleForward = useCallback(() => {\n openForwardMenu({ fromChatId: chatId, messageIds: [messageId] });\n closeZoom();\n }, [openForwardMenu, chatId, messageId]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(() => {\n if (isZoomed) {\n closeZoom();\n } else {\n close();\n }\n }) : undefined), [close, isOpen, isZoomed]);\n\n useEffect(() => {\n if (isVideo && !isGif) {\n stopCurrentAudio();\n }\n }, [isGif, isVideo]);\n\n // Prevent refresh when rotating device to watch a video\n useEffect(() => {\n if (!isOpen) {\n return undefined;\n }\n\n windowSize.disableRefresh();\n\n return () => {\n windowSize.enableRefresh();\n };\n }, [isOpen]);\n\n const getMessageId = useCallback((fromId: number, direction: number): number => {\n let index = messageIds.indexOf(fromId);\n if ((direction === -1 && index > 0) || (direction === 1 && index < messageIds.length - 1)) {\n index += direction;\n }\n\n return messageIds[index];\n }, [messageIds]);\n\n const selectPreviousMedia = useCallback(() => {\n if (isFirst) {\n return;\n }\n\n openMediaViewer({\n chatId,\n threadId,\n messageId: messageId ? getMessageId(messageId, -1) : undefined,\n origin,\n });\n }, [chatId, threadId, getMessageId, isFirst, messageId, openMediaViewer, origin]);\n\n const selectNextMedia = useCallback(() => {\n if (isLast) {\n return;\n }\n\n openMediaViewer({\n chatId,\n threadId,\n messageId: messageId ? getMessageId(messageId, 1) : undefined,\n origin,\n });\n }, [chatId, threadId, getMessageId, isLast, messageId, openMediaViewer, origin]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Left': // IE/Edge specific value\n case 'ArrowLeft':\n selectPreviousMedia();\n break;\n\n case 'Right': // IE/Edge specific value\n case 'ArrowRight':\n selectNextMedia();\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n });\n\n // Support for swipe gestures and closing on click\n useEffect(() => {\n const element = document.querySelector('.slide-container > .active, .slide-container > .to');\n if (!element) {\n return undefined;\n }\n\n const shouldCloseOnVideo = isGif && !IS_IOS;\n\n return captureEvents(element, {\n // eslint-disable-next-line max-len\n excludedClosestSelector: `.backdrop, .navigation, .media-viewer-head, .media-viewer-footer${!shouldCloseOnVideo ? ', .VideoPlayer' : ''}`,\n onClick: () => {\n if (!isZoomed && !IS_TOUCH_ENV) {\n close();\n }\n },\n onSwipe: IS_TOUCH_ENV ? (e, direction) => {\n if (direction === SwipeDirection.Right) {\n selectPreviousMedia();\n } else if (direction === SwipeDirection.Left) {\n selectNextMedia();\n } else if (!(e.target && (e.target as HTMLElement).closest('.MediaViewerFooter'))) {\n close();\n }\n } : undefined,\n });\n }, [close, isFooterHidden, isGif, isPhoto, isZoomed, selectNextMedia, selectPreviousMedia]);\n\n const handlePan = useCallback((x: number, y: number) => {\n setPanDelta({ x, y });\n }, []);\n\n const handleToggleFooterVisibility = useCallback(() => {\n if (IS_TOUCH_ENV && (isPhoto || isGif)) {\n setIsFooterHidden(!isFooterHidden);\n }\n }, [isFooterHidden, isGif, isPhoto]);\n\n const lang = useLang();\n\n useHistoryBack(isOpen, closeMediaViewer, openMediaViewer, {\n chatId,\n threadId,\n messageId,\n origin,\n avatarOwnerId: avatarOwner && avatarOwner.id,\n });\n\n function renderSlide(isActive: boolean) {\n if (isAvatar) {\n return (\n
\n {renderPhoto(\n fullMediaData || blobUrlPreview,\n calculateMediaViewerDimensions(AVATAR_FULL_DIMENSIONS, false),\n !IS_SINGLE_COLUMN_LAYOUT && !isZoomed,\n )}\n
\n );\n } else if (message) {\n const textParts = renderMessageText(message);\n const hasFooter = Boolean(textParts);\n\n return (\n \n {isPhoto && renderPhoto(\n localBlobUrl || fullMediaData || blobUrlPreview || blobUrlPictogram,\n message && calculateMediaViewerDimensions(dimensions!, hasFooter),\n !IS_SINGLE_COLUMN_LAYOUT && !isZoomed,\n )}\n {isVideo && (\n \n )}\n {textParts && (\n \n )}\n \n );\n }\n\n return undefined;\n }\n\n function renderSenderInfo() {\n return isAvatar ? (\n \n ) : (\n \n );\n }\n\n return (\n \n {() => (\n <>\n
\n {IS_SINGLE_COLUMN_LAYOUT && (\n \n \n \n )}\n \n {renderSenderInfo}\n \n \n
\n \n \n {renderSlide}\n \n \n {!isFirst && (\n \n )}\n {!isLast && (\n \n )}\n \n \n )}\n \n );\n};\n\nfunction renderPhoto(blobUrl?: string, imageSize?: ApiDimensions, canDrag?: boolean) {\n return blobUrl\n ? (\n \n )\n : (\n \n \n \n );\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chatId, threadId, messageId, avatarOwnerId, profilePhotoIndex, origin,\n } = global.mediaViewer;\n const {\n animationLevel,\n } = global.settings.byKey;\n\n if (origin === MediaViewerOrigin.SearchResult) {\n if (!(chatId && messageId)) {\n return { animationLevel };\n }\n\n const message = selectChatMessage(global, chatId, messageId);\n if (!message) {\n return { animationLevel };\n }\n\n return {\n chatId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n animationLevel,\n };\n }\n\n if (avatarOwnerId) {\n const sender = selectUser(global, avatarOwnerId) || selectChat(global, avatarOwnerId);\n\n return {\n messageId: -1,\n senderId: avatarOwnerId,\n avatarOwner: sender,\n profilePhotoIndex: profilePhotoIndex || 0,\n animationLevel,\n origin,\n };\n }\n\n if (!(chatId && threadId && messageId)) {\n return { animationLevel };\n }\n\n let message: ApiMessage | undefined;\n if (origin && [MediaViewerOrigin.ScheduledAlbum, MediaViewerOrigin.ScheduledInline].includes(origin)) {\n message = selectScheduledMessage(global, chatId, messageId);\n } else {\n message = selectChatMessage(global, chatId, messageId);\n }\n\n if (!message) {\n return { animationLevel };\n }\n\n let chatMessages: Record | undefined;\n\n if (origin && [MediaViewerOrigin.ScheduledAlbum, MediaViewerOrigin.ScheduledInline].includes(origin)) {\n chatMessages = selectScheduledMessages(global, chatId);\n } else {\n chatMessages = selectChatMessages(global, chatId);\n }\n let collectionIds: number[] | undefined;\n\n if (origin === MediaViewerOrigin.Inline || origin === MediaViewerOrigin.Album) {\n collectionIds = selectOutlyingIds(global, chatId, threadId) || selectListedIds(global, chatId, threadId);\n } else if (origin === MediaViewerOrigin.SharedMedia) {\n const currentSearch = selectCurrentMediaSearch(global);\n const { foundIds } = (currentSearch && currentSearch.resultsByType && currentSearch.resultsByType.media) || {};\n collectionIds = foundIds;\n }\n\n return {\n chatId,\n threadId,\n messageId,\n senderId: message.senderId,\n origin,\n message,\n chatMessages,\n collectionIds,\n animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openMediaViewer', 'closeMediaViewer', 'openForwardMenu', 'focusMessage',\n ]),\n)(MediaViewer));\n","import React, {\n FC, useMemo, useState, memo, useRef, useEffect, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, MAIN_THREAD_ID } from '../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport {\n getCanPostInChat, getChatTitle, isChatPrivate, sortChatIds,\n} from '../../modules/helpers';\nimport searchWords from '../../util/searchWords';\nimport { pick, unique } from '../../util/iteratees';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\n\nimport Loading from '../ui/Loading';\nimport Modal from '../ui/Modal';\nimport InputText from '../ui/InputText';\nimport Button from '../ui/Button';\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport GroupChatInfo from '../common/GroupChatInfo';\n\nimport './ForwardPicker.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n chatsById: Record;\n pinnedIds?: number[];\n activeListIds?: number[];\n archivedListIds?: number[];\n orderedPinnedIds?: number[];\n currentUserId?: number;\n};\n\ntype DispatchProps = Pick;\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\nconst MODAL_HIDE_DELAY_MS = 300;\n\nconst ForwardPicker: FC = ({\n chatsById,\n pinnedIds,\n activeListIds,\n archivedListIds,\n currentUserId,\n isOpen,\n setForwardChatId,\n exitForwardMode,\n loadMoreChats,\n}) => {\n const [filter, setFilter] = useState('');\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const lang = useLang();\n\n useEffect(() => {\n if (isOpen) {\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n });\n }, FOCUS_DELAY_MS);\n }\n } else {\n if (inputRef.current) {\n inputRef.current.blur();\n }\n\n setTimeout(() => {\n setFilter('');\n }, MODAL_HIDE_DELAY_MS);\n }\n }, [isOpen]);\n\n const chatIds = useMemo(() => {\n const listIds = [\n ...activeListIds || [],\n ...archivedListIds || [],\n ];\n\n let priorityIds = pinnedIds || [];\n if (currentUserId) {\n priorityIds = unique([currentUserId, ...priorityIds]);\n }\n\n return sortChatIds([\n ...listIds.filter((id) => {\n const chat = chatsById[id];\n if (!chat) {\n return true;\n }\n\n if (!getCanPostInChat(chat, MAIN_THREAD_ID)) {\n return false;\n }\n\n if (!filter) {\n return true;\n }\n\n return searchWords(getChatTitle(lang, chatsById[id], undefined, id === currentUserId), filter);\n }),\n ], chatsById, undefined, priorityIds);\n }, [activeListIds, archivedListIds, chatsById, currentUserId, filter, lang, pinnedIds]);\n\n const [viewportIds, getMore] = useInfiniteScroll(loadMoreChats, chatIds, Boolean(filter));\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n setFilter(e.currentTarget.value);\n }, []);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, isOpen, (index) => {\n if (viewportIds && viewportIds.length > 0) {\n setForwardChatId({ id: viewportIds[index === -1 ? 0 : index] });\n }\n }, '.ListItem-button', true);\n\n const modalHeader = (\n
\n \n \n \n \n
\n );\n\n return (\n \n {viewportIds && viewportIds.length ? (\n \n {viewportIds.map((id) => (\n setForwardChatId({ id })}\n >\n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : viewportIds && !viewportIds.length ? (\n

Sorry, nothing found.

\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n currentUserId,\n } = global;\n\n return {\n chatsById,\n pinnedIds: orderedPinnedIds.active,\n activeListIds: listIds.active,\n archivedListIds: listIds.archived,\n currentUserId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setForwardChatId', 'exitForwardMode', 'loadMoreChats']),\n)(ForwardPicker));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiError, ApiInviteInfo } from '../../api/types';\n\nimport getReadableErrorText from '../../util/getReadableErrorText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport renderText from '../common/helpers/renderText';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './Dialogs.scss';\n\ntype StateProps = {\n dialogs: (ApiError | ApiInviteInfo)[];\n};\n\ntype DispatchProps = Pick;\n\nconst Dialogs: FC = ({ dialogs, dismissDialog, acceptInviteConfirmation }) => {\n const lang = useLang();\n\n if (!dialogs.length) {\n return undefined;\n }\n\n const renderInvite = (invite: ApiInviteInfo) => {\n const {\n hash, title, participantsCount, isChannel,\n } = invite;\n\n const handleJoinClick = () => {\n acceptInviteConfirmation({\n hash,\n });\n dismissDialog();\n };\n\n const participantsText = isChannel\n ? lang('Subscribers', participantsCount, 'i')\n : lang('Members', participantsCount, 'i');\n\n const joinText = isChannel ? lang('ChannelJoin') : lang('JoinGroup');\n\n return (\n \n {participantsCount !== undefined &&

{participantsText}

}\n \n \n \n );\n };\n\n const renderError = (error: ApiError) => {\n return (\n \n {error.hasErrorKey ? getReadableErrorText(error) : renderText(error.message!, ['emoji', 'br'])}\n
\n \n
\n \n );\n };\n\n const renderDialog = (dialog: ApiError | ApiInviteInfo) => {\n if ('hash' in dialog) {\n return renderInvite(dialog);\n }\n\n return renderError(dialog);\n };\n\n return (\n
\n {dialogs.map(renderDialog)}\n
\n );\n};\n\nfunction getErrorHeader(error: ApiError) {\n if (error.isSlowMode) {\n return 'Slowmode enabled';\n }\n\n if (!error.hasErrorKey) {\n return 'Telegram';\n }\n\n return 'Something went wrong';\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['dialogs']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissDialog', 'acceptInviteConfirmation']),\n)(Dialogs));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiNotification } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\n\nimport Notification from '../ui/Notification';\nimport renderText from '../common/helpers/renderText';\n\ntype StateProps = {\n notifications: ApiNotification[];\n};\n\ntype DispatchProps = Pick;\n\nconst Notifications: FC = ({ notifications, dismissNotification }) => {\n if (!notifications.length) {\n return undefined;\n }\n\n return (\n
\n {notifications.map(({ message }) => (\n \n ))}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['notifications']),\n (setGlobal, actions): DispatchProps => pick(actions, ['dismissNotification']),\n)(Notifications));\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\n\nimport ConfirmDialog from '../ui/ConfirmDialog';\n\nexport type OwnProps = {\n url?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst SafeLinkModal: FC = ({ url, toggleSafeLinkModal }) => {\n const lang = useLang();\n\n const handleOpen = useCallback(() => {\n window.open(url);\n toggleSafeLinkModal({ url: undefined });\n }, [toggleSafeLinkModal, url]);\n\n const handleDismiss = useCallback(() => {\n toggleSafeLinkModal({ url: undefined });\n }, [toggleSafeLinkModal]);\n\n const renderingUrl = useCurrentOrPrev(url);\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['toggleSafeLinkModal']),\n)(SafeLinkModal));\n","import React, {\n FC, memo, useState, useEffect, useMemo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport { formatTime, formatDateToString } from '../../util/dateFormat';\nimport useLang, { LangFn } from '../../hooks/useLang';\nimport usePrevious from '../../hooks/usePrevious';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './CalendarModal.scss';\n\nexport type OwnProps = {\n selectedAt?: number;\n maxAt?: number;\n isFutureMode?: boolean;\n isPastMode?: boolean;\n isOpen: boolean;\n withTimePicker?: boolean;\n submitButtonLabel?: string;\n secondButtonLabel?: string;\n onClose: () => void;\n onSubmit: (date: Date) => void;\n onSecondButtonClick?: NoneToVoidFunction;\n};\n\nconst WEEKDAY_LETTERS = [\n 'lng_weekday1',\n 'lng_weekday2',\n 'lng_weekday3',\n 'lng_weekday4',\n 'lng_weekday5',\n 'lng_weekday6',\n 'lng_weekday7',\n];\n\nconst CalendarModal: FC = ({\n selectedAt,\n maxAt,\n isFutureMode,\n isPastMode,\n isOpen,\n withTimePicker,\n submitButtonLabel,\n secondButtonLabel,\n onClose,\n onSubmit,\n onSecondButtonClick,\n}) => {\n const lang = useLang();\n const now = new Date();\n const defaultSelectedDate = useMemo(() => (selectedAt ? new Date(selectedAt) : new Date()), [selectedAt]);\n const maxDate = maxAt ? new Date(maxAt) : undefined;\n const prevIsOpen = usePrevious(isOpen);\n\n const [selectedDate, setSelectedDate] = useState(defaultSelectedDate);\n const [selectedHours, setSelectedHours] = useState(\n formatInputTime(defaultSelectedDate.getHours()),\n );\n const [selectedMinutes, setSelectedMinutes] = useState(\n formatInputTime(defaultSelectedDate.getMinutes()),\n );\n\n const currentYear = selectedDate.getFullYear();\n const currentMonth = selectedDate.getMonth();\n const currentDate = selectedDate.getDate();\n\n useEffect(() => {\n if (!prevIsOpen && isOpen) {\n setSelectedDate(defaultSelectedDate);\n }\n }, [isOpen, defaultSelectedDate, prevIsOpen]);\n\n const shouldDisableNextMonth = (isPastMode && currentYear >= now.getFullYear() && currentMonth >= now.getMonth())\n || (maxDate && currentYear >= maxDate.getFullYear() && currentMonth >= maxDate.getMonth());\n const shouldDisablePrevMonth = isFutureMode && currentYear <= now.getFullYear() && currentMonth <= now.getMonth();\n\n const calendarGrid = useMemo(() => (\n buildCalendarGrid(currentYear, currentMonth)\n ), [currentMonth, currentYear]);\n\n function handlePrevMonth() {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() - 1);\n\n return dateCopy;\n });\n }\n\n function handleNextMonth() {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setMonth(dateCopy.getMonth() + 1);\n\n return dateCopy;\n });\n }\n\n function handleDateSelect(date: number) {\n setSelectedDate((d) => {\n const dateCopy = new Date(d);\n dateCopy.setDate(date);\n\n return dateCopy;\n });\n }\n\n function handleSubmit() {\n onSubmit(selectedDate);\n }\n\n const handleChangeHours = useCallback((e: React.ChangeEvent) => {\n const value = e.target.value.replace(/[^\\d]+/g, '');\n if (!value.length) {\n setSelectedHours('');\n e.target.value = '';\n return;\n }\n\n const hours = Math.max(0, Math.min(Number(value), 23));\n\n const date = new Date(selectedDate.getTime());\n date.setHours(hours);\n setSelectedDate(date);\n\n const hoursStr = formatInputTime(hours);\n setSelectedHours(hoursStr);\n e.target.value = hoursStr;\n }, [selectedDate]);\n\n const handleChangeMinutes = useCallback((e: React.ChangeEvent) => {\n const value = e.target.value.replace(/[^\\d]+/g, '');\n if (!value.length) {\n setSelectedMinutes('');\n e.target.value = '';\n return;\n }\n\n const minutes = Math.max(0, Math.min(Number(value), 59));\n\n const date = new Date(selectedDate.getTime());\n date.setMinutes(minutes);\n setSelectedDate(date);\n\n const minutesStr = formatInputTime(minutes);\n setSelectedMinutes(minutesStr);\n e.target.value = minutesStr;\n }, [selectedDate]);\n\n function renderTimePicker() {\n return (\n
\n \n :\n \n
\n );\n }\n\n return (\n \n
\n
\n \n \n \n\n

\n {lang(`lng_month${selectedDate.getMonth() + 1}`)}\n {' '}\n {selectedDate.getFullYear()}\n

\n\n \n \n \n\n \n \n \n
\n
\n\n
\n
\n {WEEKDAY_LETTERS.map((day) => (\n
\n {lang(day)}\n
\n ))}\n {calendarGrid.map((gridDate) => (\n handleDateSelect(gridDate)}\n className={buildClassName(\n 'day-button',\n isDisabledDay(\n currentYear, currentMonth, gridDate, isFutureMode ? now : undefined, isPastMode ? now : maxDate,\n )\n ? 'disabled'\n : `${gridDate ? 'clickable' : ''}`,\n gridDate === currentDate && 'selected',\n )}\n >\n {!!gridDate && (\n {gridDate}\n )}\n
\n ))}\n
\n \n\n {withTimePicker && renderTimePicker()}\n\n
\n \n {secondButtonLabel && (\n \n )}\n
\n \n );\n};\n\nfunction buildCalendarGrid(year: number, month: number) {\n const grid: number[] = [];\n\n const date = new Date();\n date.setFullYear(year);\n date.setMonth(month);\n date.setDate(1);\n\n const monthStartDay = date.getDay() || 7;\n // Fill empty cells\n for (let i = 1; i < monthStartDay; i++) {\n grid.push(0);\n }\n\n while (date.getMonth() === month) {\n const gridDate = date.getDate();\n grid.push(gridDate);\n date.setDate(gridDate + 1);\n }\n\n return grid;\n}\n\nfunction isDisabledDay(year: number, month: number, day: number, minDate?: Date, maxDate?: Date) {\n const selectedDay = new Date(year, month, day, 0, 0, 0, 0);\n const fixedMinDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), 0, 0, 0, 0);\n const fixedMaxDate = maxDate && new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate(), 0, 0, 0, 0);\n\n if (fixedMaxDate && selectedDay > fixedMaxDate) {\n return true;\n } else if (fixedMinDate && selectedDay < fixedMinDate) {\n return true;\n }\n\n return false;\n}\n\nfunction formatInputTime(value: string | number) {\n return String(value).padStart(2, '0');\n}\n\nfunction formatSubmitLabel(lang: LangFn, date: Date) {\n const day = formatDateToString(date, lang.code);\n const today = formatDateToString(new Date(), lang.code);\n\n if (day === today) {\n return lang('Conversation.ScheduleMessage.SendToday', formatTime(date));\n }\n\n return lang('Conversation.ScheduleMessage.SendOn', [day, formatTime(date)]);\n}\n\nexport default memo(CalendarModal);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport CalendarModal from '../common/CalendarModal';\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\ntype StateProps = {\n selectedAt?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst HistoryCalendar: FC = ({\n isOpen, selectedAt, searchMessagesByDate, closeHistoryCalendar,\n}) => {\n const handleJumpToDate = useCallback((date: Date) => {\n searchMessagesByDate({ timestamp: date.valueOf() / 1000 });\n closeHistoryCalendar();\n }, [closeHistoryCalendar, searchMessagesByDate]);\n\n const lang = useLang();\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n selectedAt: global.historyCalendarSelectedAt,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesByDate', 'closeHistoryCalendar',\n ]),\n)(HistoryCalendar));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../api/types';\nimport { IAlbum } from '../../types';\n\nimport { GlobalActions } from '../../global/types';\n\nimport {\n selectAllowedMessageActions,\n selectChat,\n selectCurrentMessageList,\n selectUser,\n} from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n isSchedule: boolean;\n message: ApiMessage;\n album?: IAlbum;\n onClose: () => void;\n};\n\ntype StateProps = {\n canDeleteForAll?: boolean;\n contactName?: string;\n willDeleteForCurrentUserOnly?: boolean;\n willDeleteForAll?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteMessageModal: FC = ({\n isOpen,\n isSchedule,\n message,\n album,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n deleteMessages,\n deleteScheduledMessages,\n}) => {\n const handleDeleteMessageForAll = useCallback(() => {\n const messageIds = album && album.messages\n ? album.messages.map(({ id }) => id)\n : [message.id];\n deleteMessages({ messageIds, shouldDeleteForAll: true });\n onClose();\n }, [deleteMessages, message.id, onClose, album]);\n\n const handleDeleteMessageForSelf = useCallback(() => {\n const messageIds = album && album.messages\n ? album.messages.map(({ id }) => id)\n : [message.id];\n if (isSchedule) {\n deleteScheduledMessages({ messageIds });\n } else {\n deleteMessages({\n messageIds,\n shouldDeleteForAll: false,\n });\n }\n onClose();\n }, [album, message.id, isSchedule, onClose, deleteScheduledMessages, deleteMessages]);\n\n const lang = useLang();\n\n return (\n \n

{lang('AreYouSureDeleteSingleMessage')}

\n {willDeleteForCurrentUserOnly && (\n

{lang('lng_delete_for_me_chat_hint', 1, 'i')}

\n )}\n {willDeleteForAll && (\n

{lang('lng_delete_for_everyone_hint', 1, 'i')}

\n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { message, isSchedule }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const { canDeleteForAll } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {};\n const chat = selectChat(global, message.chatId);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll;\n const willDeleteForAll = chat && isChatSuperGroup(chat);\n\n return {\n canDeleteForAll: !isSchedule && canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'deleteMessages', 'deleteScheduledMessages',\n ]),\n)(DeleteMessageModal));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { selectChat, selectIsChatWithSelf, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n isChatChannel,\n} from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport renderText from './helpers/renderText';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId: number;\n messageId: number;\n onClose: () => void;\n};\n\ntype StateProps = {\n isChannel: boolean;\n isPrivateChat: boolean;\n isChatWithSelf: boolean;\n isGroup: boolean;\n isSuperGroup: boolean;\n canPinForAll: boolean;\n contactName?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst PinMessageModal: FC = ({\n isOpen,\n messageId,\n chatId,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n onClose,\n pinMessage,\n}) => {\n const handlePinMessageForAll = useCallback(() => {\n pinMessage({\n chatId, messageId, isUnpin: false,\n });\n onClose();\n }, [pinMessage, chatId, messageId, onClose]);\n\n const handlePinMessage = useCallback(() => {\n pinMessage({\n chatId, messageId, isUnpin: false, isOneSide: true, isSilent: true,\n });\n onClose();\n }, [chatId, messageId, onClose, pinMessage]);\n\n const lang = useLang();\n\n function renderMessage() {\n if (isChannel) {\n return lang('PinMessageAlertChannel');\n }\n\n if (isGroup || isSuperGroup) {\n return lang('PinMessageAlert');\n }\n\n return lang('PinMessageAlertChat');\n }\n\n return (\n \n

{renderMessage()}

\n \n {canPinForAll && (\n \n )}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const isPrivateChat = isChatPrivate(chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const chat = selectChat(global, chatId);\n const isChannel = !!chat && isChatChannel(chat);\n const isGroup = !!chat && isChatBasicGroup(chat);\n const isSuperGroup = !!chat && isChatSuperGroup(chat);\n const canPinForAll = (isPrivateChat && !isChatWithSelf) || isSuperGroup || isGroup;\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['pinMessage']),\n)(PinMessageModal));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatId?: number;\n pinnedMessagesCount?: number;\n onClose: () => void;\n onUnpin: () => void;\n};\n\nconst UnpinAllMessagesModal: FC = ({\n isOpen,\n pinnedMessagesCount = 0,\n onClose,\n onUnpin,\n}) => {\n const lang = useLang();\n\n return (\n \n

{lang('Chat.UnpinAllMessagesConfirmation', pinnedMessagesCount, 'i')}

\n \n \n \n );\n};\n\nexport default memo(UnpinAllMessagesModal);\n","import React, {\n FC, useCallback, memo, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { selectCanDeleteSelectedMessages, selectCurrentChat, selectUser } from '../../modules/selectors';\nimport {\n isChatPrivate,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\nimport usePrevious from '../../hooks/usePrevious';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n isSchedule: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n selectedMessageIds?: number[];\n canDeleteForAll?: boolean;\n contactName?: string;\n willDeleteForCurrentUserOnly?: boolean;\n willDeleteForAll?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteSelectedMessageModal: FC = ({\n isOpen,\n isSchedule,\n selectedMessageIds,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n deleteMessages,\n deleteScheduledMessages,\n exitMessageSelectMode,\n}) => {\n const prevIsOpen = usePrevious(isOpen);\n\n const handleDeleteMessageForAll = useCallback(() => {\n onClose();\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: true });\n }, [deleteMessages, selectedMessageIds, onClose]);\n\n const handleDeleteMessageForSelf = useCallback(() => {\n if (isSchedule) {\n deleteScheduledMessages({ messageIds: selectedMessageIds });\n } else {\n deleteMessages({ messageIds: selectedMessageIds, shouldDeleteForAll: false });\n }\n\n onClose();\n }, [isSchedule, onClose, deleteScheduledMessages, selectedMessageIds, deleteMessages]);\n\n const lang = useLang();\n\n // Returning `undefined` from FC instead of `` doesn't trigger useHistoryBack\n useEffect(() => {\n if (!isOpen && prevIsOpen) {\n exitMessageSelectMode();\n }\n }, [exitMessageSelectMode, isOpen, prevIsOpen]);\n\n if (!selectedMessageIds) {\n return undefined;\n }\n\n return (\n \n

{lang('AreYouSureDeleteFewMessages')}

\n {willDeleteForCurrentUserOnly && (\n

This will delete them just for you, not for other participants in the chat.

\n )}\n {willDeleteForAll && (\n

This will delete them for everyone in this chat.

\n )}\n {canDeleteForAll && (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { isSchedule }): StateProps => {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { canDeleteForAll } = selectCanDeleteSelectedMessages(global);\n const chat = selectCurrentChat(global);\n const contactName = chat && isChatPrivate(chat.id)\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n const willDeleteForCurrentUserOnly = chat && isChatBasicGroup(chat) && !canDeleteForAll;\n const willDeleteForAll = chat && isChatSuperGroup(chat);\n\n return {\n selectedMessageIds,\n canDeleteForAll: !isSchedule && canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'deleteMessages',\n 'deleteScheduledMessages',\n 'exitMessageSelectMode',\n ]),\n)(DeleteSelectedMessageModal));\n","import { ChangeEvent } from 'react';\n\nimport React, {\n FC, memo, useCallback, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiReportReason } from '../../api/types';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport RadioGroup from '../ui/RadioGroup';\nimport InputText from '../ui/InputText';\n\nexport type OwnProps = {\n isOpen: boolean;\n messageIds?: number[];\n onClose: () => void;\n};\n\ntype DispatchProps = Pick;\n\nconst ReportMessageModal: FC = ({\n isOpen,\n messageIds,\n reportMessages,\n exitMessageSelectMode,\n onClose,\n}) => {\n const [selectedReason, setSelectedReason] = useState('spam');\n const [description, setDescription] = useState('');\n\n const handleReport = () => {\n reportMessages({ messageIds, reason: selectedReason, description });\n exitMessageSelectMode();\n onClose();\n };\n\n const handleSelectReason = useCallback((value: string) => {\n setSelectedReason(value as ApiReportReason);\n }, []);\n\n const handleDescriptionChange = useCallback((e: ChangeEvent) => {\n setDescription(e.target.value);\n }, []);\n\n const lang = useLang();\n\n const REPORT_OPTIONS: {value: ApiReportReason; label: string}[] = [\n { value: 'spam', label: lang('lng_report_reason_spam') },\n { value: 'violence', label: lang('lng_report_reason_violence') },\n { value: 'pornography', label: lang('lng_report_reason_pornography') },\n { value: 'childAbuse', label: lang('lng_report_reason_child_abuse') },\n { value: 'copyright', label: lang('ReportPeer.ReasonCopyright') },\n { value: 'other', label: lang('lng_report_reason_other') },\n ];\n\n if (!messageIds) {\n return undefined;\n }\n\n return (\n \n \n \n \n \n \n );\n};\n\nexport default memo(withGlobal(\n undefined, (setGlobal, actions): DispatchProps => pick(actions, [\n 'reportMessages', 'exitMessageSelectMode',\n ]),\n)(ReportMessageModal));\n","import React, { FC, memo, useEffect } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\n\nimport {\n selectCanDeleteSelectedMessages,\n selectCanReportSelectedMessages,\n selectCurrentMessageList,\n selectSelectedMessagesCount,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport useFlag from '../../hooks/useFlag';\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport buildClassName from '../../util/buildClassName';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport MenuItem from '../ui/MenuItem';\n\nimport DeleteSelectedMessageModal from './DeleteSelectedMessageModal';\nimport ReportMessageModal from '../common/ReportMessageModal';\n\nimport './MessageSelectToolbar.scss';\n\nexport type OwnProps = {\n isActive?: boolean;\n canPost?: boolean;\n messageListType?: MessageListType;\n};\n\ntype StateProps = {\n isSchedule: boolean;\n selectedMessagesCount?: number;\n canDeleteMessages?: boolean;\n canReportMessages?: boolean;\n selectedMessageIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst MessageSelectToolbar: FC = ({\n canPost,\n isActive,\n messageListType,\n isSchedule,\n selectedMessagesCount,\n canDeleteMessages,\n canReportMessages,\n selectedMessageIds,\n exitMessageSelectMode,\n openForwardMenuForSelectedMessages,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n const [isReportModalOpen, openReportModal, closeReportModal] = useFlag();\n\n useEffect(() => {\n return isActive && !isDeleteModalOpen && !isReportModalOpen\n ? captureKeyboardListeners({\n onBackspace: openDeleteModal,\n onDelete: openDeleteModal,\n onEsc: exitMessageSelectMode,\n })\n : undefined;\n }, [isActive, isDeleteModalOpen, isReportModalOpen, openDeleteModal, exitMessageSelectMode]);\n\n const prevSelectedMessagesCount = usePrevious(selectedMessagesCount || undefined, true);\n const renderingSelectedMessagesCount = isActive ? selectedMessagesCount : prevSelectedMessagesCount;\n\n const lang = useLang();\n\n const formattedMessagesCount = lang('VoiceOver.Chat.MessagesSelected', renderingSelectedMessagesCount);\n\n const className = buildClassName(\n 'MessageSelectToolbar',\n canPost && 'with-composer',\n isActive && 'shown',\n );\n\n return (\n
\n
\n \n \n \n \n {formattedMessagesCount}\n \n\n {!!selectedMessagesCount && (\n
\n {messageListType !== 'scheduled' && (\n \n \n {lang('Forward')}\n \n \n )}\n {canReportMessages && (\n \n \n {lang('Report')}\n \n \n )}\n \n \n {lang('Delete')}\n \n \n
\n )}\n
\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { type: messageListType } = selectCurrentMessageList(global) || {};\n const { canDelete } = selectCanDeleteSelectedMessages(global);\n const canReport = selectCanReportSelectedMessages(global);\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n\n return {\n isSchedule: messageListType === 'scheduled',\n selectedMessagesCount: selectSelectedMessagesCount(global),\n canDeleteMessages: canDelete,\n canReportMessages: canReport,\n selectedMessageIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['exitMessageSelectMode', 'openForwardMenuForSelectedMessages']),\n)(MessageSelectToolbar));\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nexport default (\n onSelect: NoneToVoidFunction,\n) => {\n // eslint-disable-next-line no-null/no-null\n const buttonRef = useRef(null);\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (e.key !== 'Enter') return;\n const isFocused = buttonRef.current === document.activeElement;\n\n if (isFocused) {\n onSelect();\n }\n }, [onSelect]);\n\n useEffect(() => {\n window.addEventListener('keydown', handleKeyDown, false);\n\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n\n return buttonRef;\n};\n","import React, {\n FC, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport useChatContextActions from '../../../hooks/useChatContextActions';\nimport useFlag from '../../../hooks/useFlag';\nimport { isChatPrivate, getPrivateChatUserId, selectIsChatMuted } from '../../../modules/helpers';\nimport {\n selectChat, selectUser, selectIsChatPinned, selectNotifySettings, selectNotifyExceptions,\n} from '../../../modules/selectors';\nimport useSelectWithEnter from '../../../hooks/useSelectWithEnter';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport DeleteChatModal from '../../common/DeleteChatModal';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n withUsername?: boolean;\n onClick: (id: number) => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n isPinned?: boolean;\n isMuted?: boolean;\n};\n\nconst LeftSearchResultChat: FC = ({\n chatId,\n chat,\n privateChatUser,\n isPinned,\n isMuted,\n withUsername,\n onClick,\n}) => {\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n\n const contextActions = useChatContextActions({\n chat,\n privateChatUser,\n isPinned,\n isMuted,\n handleDelete: openDeleteModal,\n });\n\n const handleClick = () => {\n onClick(chatId);\n };\n\n const buttonRef = useSelectWithEnter(handleClick);\n\n if (!chat) {\n return undefined;\n }\n\n return (\n \n {isChatPrivate(chatId) ? (\n \n ) : (\n \n )}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const privateChatUserId = chat && getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n const isPinned = selectIsChatPinned(global, chatId);\n const isMuted = chat\n ? selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global))\n : undefined;\n\n return {\n chat,\n privateChatUser,\n isPinned,\n isMuted,\n };\n },\n)(LeftSearchResultChat));\n","import React, {\n FC, useEffect, useCallback, useRef, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { getUserFirstOrLastName } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Avatar from '../../common/Avatar';\nimport Button from '../../ui/Button';\nimport LeftSearchResultChat from './LeftSearchResultChat';\n\nimport './RecentContacts.scss';\n\ntype OwnProps = {\n onReset: () => void;\n};\n\ntype StateProps = {\n topUserIds?: number[];\n usersById: Record;\n recentlyFoundChatIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SEARCH_CLOSE_TIMEOUT_MS = 250;\nconst NBSP = '\\u00A0';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst RecentContacts: FC = ({\n topUserIds, usersById, recentlyFoundChatIds,\n onReset, loadTopUsers, loadContactList, openChat,\n addRecentlyFoundChatId, clearRecentlyFoundChats,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const topUsersRef = useRef(null);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadTopUsers();\n // Loading full contact list for quick local search before user enters the query\n loadContactList();\n });\n }, [loadTopUsers, loadContactList]);\n\n useHorizontalScroll(topUsersRef.current, !topUserIds);\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id, shouldReplaceHistory: true });\n onReset();\n setTimeout(() => {\n addRecentlyFoundChatId({ id });\n }, SEARCH_CLOSE_TIMEOUT_MS);\n },\n [openChat, addRecentlyFoundChatId, onReset],\n );\n\n const lang = useLang();\n\n return (\n
\n {topUserIds && (\n
\n
\n {topUserIds.map((userId) => (\n
handleClick(userId)} dir={lang.isRtl ? 'rtl' : undefined}>\n \n
{renderText(getUserFirstOrLastName(usersById[userId]) || NBSP)}
\n
\n ))}\n
\n
\n )}\n {recentlyFoundChatIds && (\n
\n

\n {lang('Recent')}\n\n \n \n \n

\n {recentlyFoundChatIds.map((id) => (\n \n ))}\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: topUserIds } = global.topPeers;\n const usersById = global.users.byId;\n const { recentlyFoundChatIds } = global.globalSearch;\n\n return {\n topUserIds,\n usersById,\n recentlyFoundChatIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadTopUsers',\n 'loadContactList',\n 'openChat',\n 'addRecentlyFoundChatId',\n 'clearRecentlyFoundChats',\n ]),\n)(RecentContacts));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus,\n} from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport {\n getChatTitle,\n getPrivateChatUserId,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n getMessageRoundVideo,\n} from '../../../modules/helpers';\nimport { selectChat, selectUser } from '../../../modules/selectors';\nimport renderText from '../../common/helpers/renderText';\nimport { pick } from '../../../util/iteratees';\nimport useMedia from '../../../hooks/useMedia';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useLang, { LangFn } from '../../../hooks/useLang';\nimport useSelectWithEnter from '../../../hooks/useSelectWithEnter';\n\nimport Avatar from '../../common/Avatar';\nimport VerifiedIcon from '../../common/VerifiedIcon';\nimport ListItem from '../../ui/ListItem';\nimport Link from '../../ui/Link';\n\nimport './ChatMessage.scss';\n\ntype OwnProps = {\n searchQuery?: string;\n message: ApiMessage;\n chatId: number;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n privateChatUser?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ChatMessage: FC = ({\n message,\n searchQuery,\n chatId,\n chat,\n privateChatUser,\n focusMessage,\n lastSyncTime,\n}) => {\n const mediaThumbnail = getMessageMediaThumbDataUri(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'micro'));\n const isRoundVideo = Boolean(getMessageRoundVideo(message));\n\n const handleClick = useCallback(() => {\n focusMessage({ chatId, messageId: message.id });\n }, [chatId, focusMessage, message.id]);\n\n const lang = useLang();\n\n const buttonRef = useSelectWithEnter(handleClick);\n\n if (!chat) {\n return undefined;\n }\n\n return (\n \n \n
\n
\n
\n

{renderText(getChatTitle(lang, chat, privateChatUser))}

\n {chat.isVerified && }\n
\n
\n \n {formatPastTimeShort(lang, message.date * 1000)}\n \n
\n\n
\n
\n
\n {renderMessageSummary(lang, message, mediaBlobUrl || mediaThumbnail, searchQuery, isRoundVideo)}\n
\n
\n
\n \n );\n};\n\nfunction renderMessageSummary(\n lang: LangFn, message: ApiMessage, blobUrl?: string, searchQuery?: string, isRoundVideo?: boolean,\n) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(lang, message));\n }\n\n return (\n \n \"\"\n {getMessageVideo(message) && }\n {renderText(getMessageSummaryText(lang, message, true), ['emoji', 'highlight'], { highlight: searchQuery })}\n \n );\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return {};\n }\n\n const privateChatUserId = getPrivateChatUserId(chat);\n\n return {\n chat,\n lastSyncTime: global.lastSyncTime,\n ...(privateChatUserId && { privateChatUser: selectUser(global, privateChatUserId) }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'focusMessage',\n ]),\n)(ChatMessage));\n","import React, { FC, memo, useMemo } from '../../../lib/teact/teact';\nimport { formatDateToString } from '../../../util/dateFormat';\n\nimport './DateSuggest.scss';\n\nconst SUGGESTION_COUNT = 8;\n\nexport type OwnProps = {\n searchDate: string;\n onSelect: (value: Date) => void;\n};\n\nconst DateSuggest: FC = ({\n searchDate, onSelect,\n}) => {\n const suggestions = useMemo(() => getSuggestionsFromDate(searchDate), [searchDate]);\n return (\n
\n {suggestions.map(({ date, text }) => {\n return (\n onSelect(date)}\n className=\"date-item\"\n key={text}\n >\n \n {text}\n \n );\n })}\n
\n );\n};\n\nfunction getSuggestionsFromDate(searchDate: string) {\n const hasYear = searchDate.match(/^\\d{2,4}-\\d{2}-\\d{2}$/g);\n if (hasYear) {\n const date = new Date(searchDate);\n return [{ date, text: formatDateToString(date) }];\n }\n\n const suggestion = [];\n const currentDate = new Date();\n const currentYear = currentDate.getFullYear();\n const latestYear = currentDate.getTime() > (new Date(`${currentYear}-${searchDate}`)).getTime()\n ? currentYear\n : currentYear - 1;\n\n for (let i = 0; i < SUGGESTION_COUNT; i++) {\n const date = new Date(`${latestYear - i}-${searchDate}`);\n suggestion.push({ date, text: formatDateToString(date) });\n }\n\n return suggestion;\n}\n\nexport default memo(DateSuggest);\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser, ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport searchWords from '../../../util/searchWords';\nimport { unique, pick } from '../../../util/iteratees';\nimport { getUserFullName, getMessageSummaryText, sortChatIds } from '../../../modules/helpers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport LeftSearchResultChat from './LeftSearchResultChat';\nimport RecentContacts from './RecentContacts';\nimport ChatMessage from './ChatMessage';\nimport DateSuggest from './DateSuggest';\nimport Link from '../../ui/Link';\nimport NothingFound from '../../common/NothingFound';\nimport PickerSelectedItem from '../../common/PickerSelectedItem';\n\nexport type OwnProps = {\n searchQuery?: string;\n dateSearchQuery?: string;\n searchDate?: number;\n onReset: () => void;\n onSearchDateSelect: (value: Date) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n localContactIds?: number[];\n localChatIds?: number[];\n localUserIds?: number[];\n globalChatIds?: number[];\n globalUserIds?: number[];\n foundIds?: string[];\n globalMessagesByChatId?: Record }>;\n chatsById: Record;\n usersById: Record;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH = 4;\nconst LESS_LIST_ITEMS_AMOUNT = 3;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatResults: FC = ({\n searchQuery, searchDate, dateSearchQuery, currentUserId,\n localContactIds, localChatIds, localUserIds, globalChatIds, globalUserIds,\n foundIds, globalMessagesByChatId, chatsById, usersById, fetchingStatus, lastSyncTime,\n onReset, onSearchDateSelect, openChat, addRecentlyFoundChatId, searchMessagesGlobal, setGlobalSearchChatId,\n}) => {\n const lang = useLang();\n\n const [shouldShowMoreLocal, setShouldShowMoreLocal] = useState(false);\n const [shouldShowMoreGlobal, setShouldShowMoreGlobal] = useState(false);\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: 'text',\n query: searchQuery,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery]);\n\n const handleChatClick = useCallback(\n (id: number) => {\n openChat({ id, shouldReplaceHistory: true });\n\n if (id !== currentUserId) {\n addRecentlyFoundChatId({ id });\n }\n\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n onReset();\n }\n },\n [currentUserId, openChat, addRecentlyFoundChatId, onReset],\n );\n\n const handlePickerItemClick = useCallback((id: number) => {\n setGlobalSearchChatId({ id });\n }, [setGlobalSearchChatId]);\n\n const localResults = useMemo(() => {\n if (!searchQuery || (searchQuery.startsWith('@') && searchQuery.length < 2)) {\n return MEMO_EMPTY_ARRAY;\n }\n\n const foundContactIds = localContactIds\n ? localContactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n\n const fullName = getUserFullName(user);\n return (fullName && searchWords(fullName, searchQuery)) || searchWords(user.username, searchQuery);\n })\n : [];\n\n return [\n ...(currentUserId && searchWords(lang('SavedMessages'), searchQuery) ? [currentUserId] : []),\n ...sortChatIds(unique([\n ...foundContactIds,\n ...(localChatIds || []),\n ...(localUserIds || []),\n ]), chatsById),\n ];\n }, [\n searchQuery, localContactIds, currentUserId, lang, localChatIds, localUserIds, chatsById, usersById,\n ]);\n\n const globalResults = useMemo(() => {\n if (!searchQuery || searchQuery.length < MIN_QUERY_LENGTH_FOR_GLOBAL_SEARCH || !globalChatIds || !globalUserIds) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return sortChatIds(unique([...globalChatIds, ...globalUserIds]),\n chatsById, true);\n }, [chatsById, globalChatIds, globalUserIds, searchQuery]);\n\n const foundMessages = useMemo(() => {\n if ((!searchQuery && !searchDate) || !foundIds || foundIds.length === 0) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds\n .map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return (\n globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]\n );\n })\n .filter(Boolean as any)\n .sort((a, b) => b.date - a.date);\n }, [foundIds, globalMessagesByChatId, searchQuery, searchDate]);\n\n const handleClickShowMoreLocal = useCallback(() => {\n setShouldShowMoreLocal(!shouldShowMoreLocal);\n }, [shouldShowMoreLocal]);\n\n const handleClickShowMoreGlobal = useCallback(() => {\n setShouldShowMoreGlobal(!shouldShowMoreGlobal);\n }, [shouldShowMoreGlobal]);\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(lang, message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages\n && !localResults.length && !globalResults.length && !foundMessages.length;\n\n if (!searchQuery && !searchDate) {\n return ;\n }\n\n return (\n \n {dateSearchQuery && (\n
\n \n
\n )}\n {nothingFound && (\n \n )}\n {!!localResults.length && (\n
\n {localResults.map((id) => (\n \n ))}\n
\n )}\n {!!localResults.length && (\n
\n

\n {localResults.length > LESS_LIST_ITEMS_AMOUNT && (\n \n {lang(shouldShowMoreLocal ? 'ChatList.Search.ShowLess' : 'ChatList.Search.ShowMore')}\n \n )}\n {lang('DialogList.SearchSectionDialogs')}\n

\n {localResults.map((id, index) => {\n if (!shouldShowMoreLocal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n \n );\n })}\n
\n )}\n {!!globalResults.length && (\n
\n

\n {globalResults.length > LESS_LIST_ITEMS_AMOUNT && (\n \n {lang(shouldShowMoreGlobal ? 'ChatList.Search.ShowLess' : 'ChatList.Search.ShowMore')}\n \n )}\n {lang('DialogList.SearchSectionGlobal')}\n

\n {globalResults.map((id, index) => {\n if (!shouldShowMoreGlobal && index >= LESS_LIST_ITEMS_AMOUNT) {\n return undefined;\n }\n\n return (\n \n );\n })}\n
\n )}\n {!!foundMessages.length && (\n
\n

{lang('SearchMessages')}

\n {foundMessages.map(renderFoundMessage)}\n
\n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { byId: chatsById } = global.chats;\n const { byId: usersById } = global.users;\n\n const { userIds: localContactIds } = global.contactList || {};\n\n if (!localContactIds) {\n return {\n chatsById,\n usersById,\n };\n }\n\n const {\n currentUserId, messages, lastSyncTime,\n } = global;\n const {\n fetchingStatus, globalResults, localResults, resultsByType,\n } = global.globalSearch;\n const { chatIds: globalChatIds, userIds: globalUserIds } = globalResults || {};\n const { chatIds: localChatIds, userIds: localUserIds } = localResults || {};\n const { byChatId: globalMessagesByChatId } = messages;\n const { foundIds } = (resultsByType && resultsByType.text) || {};\n\n return {\n currentUserId,\n localContactIds,\n localChatIds,\n localUserIds,\n globalChatIds,\n globalUserIds,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n usersById,\n fetchingStatus,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'addRecentlyFoundChatId',\n 'searchMessagesGlobal',\n 'setGlobalSearchChatId',\n ]),\n)(ChatResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { getMessageSummaryText } from '../../../modules/helpers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport ChatMessage from './ChatMessage';\nimport NothingFound from '../../common/NothingFound';\nimport DateSuggest from './DateSuggest';\n\nexport type OwnProps = {\n searchQuery?: string;\n dateSearchQuery?: string;\n onReset: () => void;\n onSearchDateSelect: (value: Date) => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n foundIds?: string[];\n globalMessagesByChatId?: Record }>;\n chatsById: Record;\n fetchingStatus?: { chats?: boolean; messages?: boolean };\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst ChatMessageResults: FC = ({\n searchQuery,\n currentUserId,\n dateSearchQuery,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n fetchingStatus,\n lastSyncTime,\n searchMessagesGlobal,\n onSearchDateSelect,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: 'text',\n query: searchQuery,\n chatId: currentUserId,\n });\n });\n }\n }, [currentUserId, lastSyncTime, searchMessagesGlobal, searchQuery]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || foundIds.length === 0) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds\n .map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return (\n globalMessagesByChatId && globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId]\n );\n })\n .filter(Boolean as any)\n .sort((a, b) => b.date - a.date);\n }, [foundIds, globalMessagesByChatId]);\n\n function renderFoundMessage(message: ApiMessage) {\n const text = getMessageSummaryText(lang, message);\n const chat = chatsById[message.chatId];\n\n if (!text || !chat) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n const nothingFound = fetchingStatus && !fetchingStatus.chats && !fetchingStatus.messages && !foundMessages.length;\n\n return (\n
\n \n {dateSearchQuery && (\n
\n \n
\n )}\n {nothingFound && (\n \n )}\n {!!foundMessages.length && foundMessages.map(renderFoundMessage)}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { byId: chatsById } = global.chats;\n const { currentUserId, messages: { byChatId: globalMessagesByChatId }, lastSyncTime } = global;\n const { fetchingStatus, resultsByType } = global.globalSearch;\n\n const { foundIds } = (resultsByType && resultsByType.text) || {};\n\n return {\n currentUserId,\n foundIds,\n globalMessagesByChatId,\n chatsById,\n fetchingStatus,\n lastSyncTime,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['searchMessagesGlobal']),\n)(ChatMessageResults));\n","import { GlobalState } from '../../../../global/types';\nimport {\n ApiChat, ApiGlobalMessageSearchType, ApiMessage, ApiUser,\n} from '../../../../api/types';\nimport { ISettings } from '../../../../types';\n\nimport { selectTheme } from '../../../../modules/selectors';\n\nexport type StateProps = {\n theme: ISettings['theme'];\n isLoading?: boolean;\n chatsById: Record;\n usersById: Record;\n globalMessagesByChatId?: Record }>;\n foundIds?: string[];\n lastSyncTime?: number;\n searchChatId?: number;\n};\n\nexport function createMapStateToProps(type: ApiGlobalMessageSearchType) {\n return (global: GlobalState, props: any) => {\n const { byId: chatsById } = global.chats;\n const { byId: usersById } = global.users;\n const {\n fetchingStatus, resultsByType, chatId,\n } = global.globalSearch;\n\n // One component is used for two different types of results.\n // The differences between them are only in the isVoice property.\n // The rest of the search results use their own personal components.\n const currentType = type !== 'audio' ? type : (props && props.isVoice ? 'voice' : 'audio');\n\n const { byChatId: globalMessagesByChatId } = global.messages;\n const { foundIds } = (resultsByType && resultsByType[currentType]) || {};\n\n return {\n theme: selectTheme(global),\n isLoading: foundIds === undefined\n || (fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false),\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n searchChatId: chatId,\n lastSyncTime: global.lastSyncTime,\n };\n };\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection, MediaViewerOrigin } from '../../../types';\n\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport { throttle } from '../../../util/schedulers';\nimport useLang from '../../../hooks/useLang';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Media from '../../common/Media';\nimport ChatMessage from './ChatMessage';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'media';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst MediaResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n openMediaViewer,\n}) => {\n const lang = useLang();\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleSelectMedia = useCallback((messageId: number, chatId: number) => {\n openMediaViewer({\n chatId,\n messageId,\n origin: MediaViewerOrigin.SearchResult,\n });\n }, [openMediaViewer]);\n\n function renderGallery() {\n return (\n
\n {foundMessages.map((message) => (\n \n ))}\n
\n );\n }\n\n function renderSearchResult() {\n return foundMessages.map((message) => (\n \n ));\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n const isMediaGrid = canRenderContents && foundIds && foundIds.length > 0 && !searchQuery;\n const isMessageList = canRenderContents && foundIds && foundIds.length > 0 && searchQuery;\n\n const classNames = buildClassName(\n 'search-content custom-scroll',\n isMessageList && 'chat-list',\n );\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {isMediaGrid && renderGallery()}\n {isMessageList && renderSearchResult()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'openMediaViewer',\n ]),\n)(MediaResults));\n","import { ApiChat, ApiMessage, ApiUser } from '../../../../api/types';\nimport {\n getChatTitle,\n getSenderTitle,\n isChatPrivate,\n isChatGroup,\n} from '../../../../modules/helpers';\nimport { LangFn } from '../../../../hooks/useLang';\n\nexport function getSenderName(\n lang: LangFn, message: ApiMessage, chatsById: Record, usersById: Record,\n) {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n const sender = isChatPrivate(senderId) ? usersById[senderId] : chatsById[senderId];\n\n let senderName = getSenderTitle(lang, sender);\n\n const chat = chatsById[message.chatId];\n if (chat) {\n if (isChatPrivate(senderId) && (sender as ApiUser).isSelf) {\n senderName = `${lang('FromYou')} → ${getChatTitle(lang, chat)}`;\n } else if (isChatGroup(chat)) {\n senderName += ` → ${getChatTitle(lang, chat)}`;\n }\n }\n\n return senderName;\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport WebLink from '../../common/WebLink';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'links';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst LinkResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

\n {formatMonthAndYear(lang, new Date(message.date * 1000))}\n

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n ]),\n)(LinkResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport { getMessageDocument } from '../../../modules/helpers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport Document from '../../common/Document';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst CURRENT_TYPE = 'documents';\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst FileResults: FC = ({\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n}) => {\n const lang = useLang();\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: CURRENT_TYPE,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n const message = globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n\n return message && getMessageDocument(message) ? message : undefined;\n }).filter(Boolean) as ApiMessage[];\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

{formatMonthAndYear(lang, new Date(message.date * 1000))}

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps(CURRENT_TYPE),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n ]),\n)(FileResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { createMapStateToProps, StateProps } from './helpers/createMapStateToProps';\nimport { pick } from '../../../util/iteratees';\nimport { formatMonthAndYear, toYearMonth } from '../../../util/dateFormat';\nimport { getSenderName } from './helpers/getSenderName';\nimport { throttle } from '../../../util/schedulers';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useLang from '../../../hooks/useLang';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Audio from '../../common/Audio';\nimport NothingFound from '../../common/NothingFound';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n isVoice?: boolean;\n searchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nconst AudioResults: FC = ({\n theme,\n isVoice,\n searchQuery,\n searchChatId,\n isLoading,\n chatsById,\n usersById,\n globalMessagesByChatId,\n foundIds,\n lastSyncTime,\n searchMessagesGlobal,\n focusMessage,\n openAudioPlayer,\n}) => {\n const lang = useLang();\n const currentType = isVoice ? 'voice' : 'audio';\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (lastSyncTime && direction === LoadMoreDirection.Backwards) {\n runThrottled(() => {\n searchMessagesGlobal({\n type: currentType,\n query: searchQuery,\n chatId: searchChatId,\n });\n });\n }\n }, [currentType, lastSyncTime, searchMessagesGlobal, searchQuery, searchChatId]);\n\n const foundMessages = useMemo(() => {\n if (!foundIds || !globalMessagesByChatId) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return foundIds.map((id) => {\n const [chatId, messageId] = id.split('_').map(Number);\n\n return globalMessagesByChatId[chatId] && globalMessagesByChatId[chatId].byId[messageId];\n }).filter(Boolean);\n }, [globalMessagesByChatId, foundIds]);\n\n const handleMessageFocus = useCallback((messageId: number, chatId: number) => {\n focusMessage({ chatId, messageId });\n }, [focusMessage]);\n\n const handlePlayAudio = useCallback((messageId: number, chatId: number) => {\n openAudioPlayer({ chatId, messageId });\n }, [openAudioPlayer]);\n\n function renderList() {\n return foundMessages.map((message, index) => {\n const shouldDrawDateDivider = index === 0\n || toYearMonth(message.date) !== toYearMonth(foundMessages[index - 1].date);\n return (\n \n {shouldDrawDateDivider && (\n

\n {formatMonthAndYear(lang, new Date(message.date * 1000))}\n

\n )}\n \n \n );\n });\n }\n\n const canRenderContents = useAsyncRendering([searchQuery], SLIDE_TRANSITION_DURATION) && !isLoading;\n\n return (\n
\n \n {!canRenderContents && }\n {canRenderContents && (!foundIds || foundIds.length === 0) && (\n \n )}\n {canRenderContents && foundIds && foundIds.length > 0 && renderList()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n createMapStateToProps('audio'),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'searchMessagesGlobal',\n 'focusMessage',\n 'openAudioPlayer',\n ]),\n)(AudioResults));\n","import React, {\n FC, memo, useCallback, useState, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { GlobalSearchContent } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { parseDateString } from '../../../util/dateFormat';\nimport useKeyboardListNavigation from '../../../hooks/useKeyboardListNavigation';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport TabList from '../../ui/TabList';\nimport Transition from '../../ui/Transition';\nimport ChatResults from './ChatResults';\nimport UserChatResults from './ChatMessageResults';\nimport MediaResults from './MediaResults';\nimport LinkResults from './LinkResults';\nimport FileResults from './FileResults';\nimport AudioResults from './AudioResults';\n\nimport './LeftSearch.scss';\n\nexport type OwnProps = {\n searchQuery?: string;\n searchDate?: number;\n isActive: boolean;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentContent?: GlobalSearchContent;\n chatId?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst TABS = [\n { type: GlobalSearchContent.ChatList, title: 'SearchAllChatsShort' },\n { type: GlobalSearchContent.Media, title: 'SharedMediaTab2' },\n { type: GlobalSearchContent.Links, title: 'SharedLinksTab2' },\n { type: GlobalSearchContent.Files, title: 'SharedFilesTab2' },\n { type: GlobalSearchContent.Music, title: 'SharedMusicTab2' },\n { type: GlobalSearchContent.Voice, title: 'SharedVoiceTab2' },\n];\n\nconst CHAT_TABS = [\n { type: GlobalSearchContent.ChatList, title: 'All Messages' },\n ...TABS.slice(1),\n];\n\nconst TRANSITION_RENDER_COUNT = Object.keys(GlobalSearchContent).length / 2;\n\nconst LeftSearch: FC = ({\n searchQuery,\n searchDate,\n isActive,\n currentContent = GlobalSearchContent.ChatList,\n chatId,\n setGlobalSearchContent,\n setGlobalSearchDate,\n onReset,\n}) => {\n const lang = useLang();\n const [activeTab, setActiveTab] = useState(currentContent);\n const dateSearchQuery = useMemo(() => parseDateString(searchQuery), [searchQuery]);\n\n const handleSwitchTab = useCallback((index: number) => {\n const tab = TABS[index];\n setGlobalSearchContent({ content: tab.type });\n setActiveTab(index);\n }, [setGlobalSearchContent]);\n\n const handleSearchDateSelect = useCallback((value: Date) => {\n setGlobalSearchDate({ date: value.getTime() / 1000 });\n }, [setGlobalSearchDate]);\n\n useHistoryBack(isActive, onReset, undefined, undefined, true);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, isActive, undefined, '.ListItem-button', true);\n\n return (\n
\n \n \n {() => {\n switch (currentContent) {\n case GlobalSearchContent.ChatList:\n if (chatId) {\n return (\n \n );\n }\n return (\n \n );\n case GlobalSearchContent.Media:\n return ;\n case GlobalSearchContent.Links:\n return ;\n case GlobalSearchContent.Files:\n return ;\n case GlobalSearchContent.Music:\n return (\n \n );\n case GlobalSearchContent.Voice:\n return (\n \n );\n default:\n return undefined;\n }\n }}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentContent, chatId } = global.globalSearch;\n\n return { currentContent, chatId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setGlobalSearchContent', 'setGlobalSearchDate']),\n)(LeftSearch));\n","import { useState, useCallback, useRef } from '../lib/teact/teact';\n\nexport type ReducerAction = { type: Actions; payload?: any };\nexport type StateReducer = (state: State, action: ReducerAction) => State;\nexport type Dispatch = (action: ReducerAction) => void;\n\nexport default function useReducer(\n reducer: StateReducer,\n initialState: State,\n) {\n const reducerRef = useRef(reducer);\n const [state, setState] = useState(initialState);\n\n const dispatch = useCallback((action: ReducerAction) => {\n setState((currentState) => reducerRef.current(currentState, action));\n }, []);\n\n return [\n state,\n dispatch,\n ] as [State, Dispatch];\n}\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { ApiChatFolder } from '../../api/types';\nimport { pick, omit } from '../../util/iteratees';\n\nexport type FolderChatType = {\n icon: string;\n title: string;\n key: keyof Pick;\n};\n\nexport const INCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'user', title: 'FilterContacts', key: 'contacts' },\n { icon: 'non-contacts', title: 'FilterNonContacts', key: 'nonContacts' },\n { icon: 'group', title: 'FilterGroups', key: 'groups' },\n { icon: 'channel', title: 'FilterChannels', key: 'channels' },\n { icon: 'bots', title: 'FilterBots', key: 'bots' },\n];\n\nexport const EXCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'mute', title: 'FilterMuted', key: 'excludeMuted' },\n { icon: 'archive', title: 'FilterArchived', key: 'excludeArchived' },\n { icon: 'readchats', title: 'FilterRead', key: 'excludeRead' },\n];\n\nconst INCLUDE_FILTER_FIELDS: Array = [\n 'includedChatIds', 'bots', 'channels', 'groups', 'contacts', 'nonContacts',\n];\nconst EXCLUDE_FILTER_FIELDS: Array = [\n 'excludedChatIds', 'excludeArchived', 'excludeMuted', 'excludeRead',\n];\n\nexport function selectChatFilters(state: FoldersState, mode: 'included' | 'excluded', selectTemp?: boolean) {\n let selectedChatIds: number[] = [];\n let selectedChatTypes: FolderChatType['key'][] = [];\n\n if (mode === 'included') {\n const {\n includedChatIds,\n ...includeFilters\n } = selectTemp\n ? state.includeFilters || {}\n : pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = includedChatIds || [];\n selectedChatTypes = (Object.keys(includeFilters) as Array)\n .filter((key) => Boolean(includeFilters[key]));\n } else {\n const {\n excludedChatIds,\n ...excludeFilters\n } = selectTemp\n ? state.excludeFilters || {}\n : pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = excludedChatIds || [];\n selectedChatTypes = (Object.keys(excludeFilters) as Array)\n .filter((key) => Boolean(excludeFilters[key]));\n }\n\n return {\n selectedChatIds,\n selectedChatTypes,\n };\n}\n\nfunction getSuggestedFolderName(includeFilters?: FolderIncludeFilters) {\n if (includeFilters) {\n const {\n includedChatIds,\n ...filters\n } = includeFilters;\n\n if (\n Object.values(filters).filter(Boolean).length > 1\n || (includedChatIds && includedChatIds.length)\n ) {\n return '';\n }\n\n if (filters.bots) {\n return 'Bots';\n } else if (filters.groups) {\n return 'Groups';\n } else if (filters.channels) {\n return 'Channels';\n } else if (filters.contacts) {\n return 'Contacts';\n } else if (filters.nonContacts) {\n return 'Non-Contacts';\n }\n }\n\n return '';\n}\n\ntype FolderIncludeFilters = Pick;\ntype FolderExcludeFilters = Pick;\n\nexport type FoldersState = {\n mode: 'create' | 'edit';\n isLoading?: boolean;\n isTouched?: boolean;\n error?: string;\n folderId?: number;\n chatFilter: string;\n folder: Omit;\n includeFilters?: FolderIncludeFilters;\n excludeFilters?: FolderExcludeFilters;\n};\nexport type FoldersActions = (\n 'setTitle' | 'saveFilters' | 'editFolder' | 'reset' | 'setChatFilter' | 'setIsLoading' | 'setError' |\n 'editIncludeFilters' | 'editExcludeFilters' | 'setIncludeFilters' | 'setExcludeFilters'\n);\nexport type FolderEditDispatch = Dispatch;\n\nconst INITIAL_STATE: FoldersState = {\n mode: 'create',\n chatFilter: '',\n folder: {\n title: '',\n includedChatIds: [],\n excludedChatIds: [],\n },\n};\n\nconst foldersReducer: StateReducer = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setTitle':\n return {\n ...state,\n folder: {\n ...state.folder,\n title: action.payload,\n },\n isTouched: true,\n };\n case 'editIncludeFilters':\n return {\n ...state,\n includeFilters: pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n ),\n };\n case 'editExcludeFilters':\n return {\n ...state,\n excludeFilters: pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n ),\n };\n case 'setIncludeFilters':\n return {\n ...state,\n includeFilters: action.payload,\n chatFilter: '',\n };\n case 'setExcludeFilters':\n return {\n ...state,\n excludeFilters: action.payload,\n chatFilter: '',\n };\n case 'saveFilters':\n if (state.includeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, INCLUDE_FILTER_FIELDS),\n title: state.folder.title ? state.folder.title : getSuggestedFolderName(state.includeFilters),\n ...state.includeFilters,\n },\n includeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else if (state.excludeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, EXCLUDE_FILTER_FIELDS),\n ...state.excludeFilters,\n },\n excludeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else {\n return state;\n }\n case 'editFolder': {\n const { id: folderId, description, ...folder } = action.payload;\n\n return {\n mode: 'edit',\n folderId,\n folder,\n chatFilter: '',\n };\n }\n case 'setChatFilter': {\n return {\n ...state,\n chatFilter: action.payload,\n };\n }\n case 'setIsLoading': {\n return {\n ...state,\n isLoading: action.payload,\n };\n }\n case 'setError': {\n return {\n ...state,\n error: action.payload,\n };\n }\n case 'reset':\n return INITIAL_STATE;\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(foldersReducer, INITIAL_STATE);\n};\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\n\nexport type TwoFaActions = (\n 'setCurrentPassword' | 'setPassword' | 'setHint' | 'setEmail' | 'reset'\n);\nexport type TwoFaDispatch = Dispatch;\n\nexport type TwoFaState = {\n currentPassword: string;\n password: string;\n hint: string;\n email: string;\n};\n\nconst INITIAL_STATE: TwoFaState = {\n currentPassword: '',\n password: '',\n hint: '',\n email: '',\n};\n\nconst twoFaReducer: StateReducer = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setCurrentPassword':\n return {\n ...state,\n currentPassword: action.payload,\n };\n\n case 'setPassword':\n return {\n ...state,\n password: action.payload,\n };\n\n case 'setHint':\n return {\n ...state,\n hint: action.payload,\n };\n\n case 'setEmail':\n return {\n ...state,\n email: action.payload,\n };\n\n case 'reset':\n return INITIAL_STATE;\n\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(twoFaReducer, INITIAL_STATE);\n};\n","import React, {\n FC, useCallback, useMemo, memo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\n\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\nimport Button from '../../ui/Button';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n currentScreen: SettingsScreens;\n editedFolderId?: number;\n onReset: () => void;\n onSaveFilter: () => void;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsHeader: FC = ({\n currentScreen,\n editedFolderId,\n onReset,\n onSaveFilter,\n signOut,\n deleteChatFolder,\n}) => {\n const [isSignOutDialogOpen, setIsSignOutDialogOpen] = useState(false);\n const [isDeleteFolderDialogOpen, setIsDeleteFolderDialogOpen] = useState(false);\n\n const openSignOutConfirmation = useCallback(() => {\n setIsSignOutDialogOpen(true);\n }, []);\n\n const closeSignOutConfirmation = useCallback(() => {\n setIsSignOutDialogOpen(false);\n }, []);\n\n const openDeleteFolderConfirmation = useCallback(() => {\n setIsDeleteFolderDialogOpen(true);\n }, []);\n\n const closeDeleteFolderConfirmation = useCallback(() => {\n setIsDeleteFolderDialogOpen(false);\n }, []);\n\n const handleSignOutMessage = useCallback(() => {\n closeSignOutConfirmation();\n signOut();\n }, [closeSignOutConfirmation, signOut]);\n\n const handleDeleteFolderMessage = useCallback(() => {\n closeDeleteFolderConfirmation();\n deleteChatFolder({ id: editedFolderId });\n onReset();\n }, [editedFolderId, closeDeleteFolderConfirmation, deleteChatFolder, onReset]);\n\n const SettingsMenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, []);\n\n const lang = useLang();\n\n function renderHeaderContent() {\n switch (currentScreen) {\n case SettingsScreens.EditProfile:\n return

{lang('lng_settings_information')}

;\n case SettingsScreens.General:\n return

{lang('General')}

;\n case SettingsScreens.Notifications:\n return

{lang('Notifications')}

;\n case SettingsScreens.Privacy:\n return

{lang('PrivacySettings')}

;\n case SettingsScreens.Language:\n return

{lang('Language')}

;\n\n case SettingsScreens.GeneralChatBackground:\n return

{lang('ChatBackground')}

;\n case SettingsScreens.GeneralChatBackgroundColor:\n return

{lang('SetColor')}

;\n\n case SettingsScreens.PrivacyPhoneNumber:\n return

{lang('PrivacyPhone')}

;\n case SettingsScreens.PrivacyLastSeen:\n return

{lang('PrivacyLastSeen')}

;\n case SettingsScreens.PrivacyProfilePhoto:\n return

{lang('Privacy.ProfilePhoto')}

;\n case SettingsScreens.PrivacyForwarding:\n return

{lang('PrivacyForwards')}

;\n case SettingsScreens.PrivacyGroupChats:\n return

{lang('AutodownloadGroupChats')}

;\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return

{lang('AlwaysShareWith')}

;\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return

{lang('NeverShareWith')}

;\n\n case SettingsScreens.PrivacyActiveSessions:\n return

{lang('SessionsTitle')}

;\n case SettingsScreens.PrivacyBlockedUsers:\n return

{lang('BlockedUsers')}

;\n\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaEnabled:\n return

{lang('TwoStepVerification')}

;\n case SettingsScreens.TwoFaNewPassword:\n case SettingsScreens.TwoFaChangePasswordNew:\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return

{lang('PleaseEnterCurrentPassword')}

;\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return

{lang('PleaseReEnterPassword')}

;\n case SettingsScreens.TwoFaNewPasswordHint:\n case SettingsScreens.TwoFaChangePasswordHint:\n return

{lang('PasswordHint')}

;\n case SettingsScreens.TwoFaNewPasswordEmail:\n case SettingsScreens.TwoFaRecoveryEmail:\n return

{lang('RecoveryEmailTitle')}

;\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return

Recovery Email Code

;\n case SettingsScreens.TwoFaCongratulations:\n return

{lang('TwoStepVerificationPasswordSet')}

;\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return

{lang('PleaseEnterCurrentPassword')}

;\n\n case SettingsScreens.Folders:\n return

{lang('Filters')}

;\n case SettingsScreens.FoldersCreateFolder:\n return

{lang('FilterNew')}

;\n case SettingsScreens.FoldersEditFolder:\n return (\n
\n

{lang('FilterEdit')}

\n\n {editedFolderId && (\n \n \n {lang('Delete')}\n \n \n )}\n
\n );\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersExcludedChats:\n return (\n
\n {currentScreen === SettingsScreens.FoldersIncludedChats ? (\n

{lang('FilterInclude')}

\n ) : (\n

{lang('FilterExclude')}

\n )}\n\n \n \n \n
\n );\n\n default:\n return (\n
\n

{lang('SETTINGS')}

\n\n \n {lang('LogOutTitle')}\n \n
\n );\n }\n }\n\n return (\n
\n \n \n \n {renderHeaderContent()}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['signOut', 'deleteChatFolder']),\n)(SettingsHeader));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../types';\nimport { ApiUser } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { getUserFullName } from '../../../modules/helpers';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport renderText from '../../common/helpers/renderText';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Avatar from '../../common/Avatar';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUser?: ApiUser;\n};\n\nconst SettingsMain: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n currentUser,\n}) => {\n const lang = useLang();\n const fullName = getUserFullName(currentUser);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Main);\n\n return (\n
\n
\n {currentUser && (\n
\n \n

{fullName && renderText(fullName)}

\n

{formatPhoneNumberWithCode(currentUser.phoneNumber)}

\n
\n )}\n onScreenSelect(SettingsScreens.EditProfile)}\n >\n {lang('lng_settings_information')}\n \n onScreenSelect(SettingsScreens.Folders)}\n >\n {lang('Filters')}\n \n onScreenSelect(SettingsScreens.General)}\n >\n {lang('Telegram.GeneralSettingsViewController')}\n \n onScreenSelect(SettingsScreens.Notifications)}\n >\n {lang('Notifications')}\n \n onScreenSelect(SettingsScreens.Privacy)}\n >\n {lang('PrivacySettings')}\n \n onScreenSelect(SettingsScreens.Language)}\n >\n {lang('Language')}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentUserId } = global;\n\n return {\n currentUser: currentUserId ? selectUser(global, currentUserId) : undefined,\n };\n },\n)(SettingsMain));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useCallback, memo, useEffect, useMemo,\n} from '../../lib/teact/teact';\n\nimport { debounce } from '../../util/schedulers';\nimport useLang from '../../hooks/useLang';\n\nimport InputText from '../ui/InputText';\n\ntype OwnProps = {\n currentUsername?: string;\n asLink?: boolean;\n isLoading?: boolean;\n isUsernameAvailable?: boolean;\n checkUsername: AnyToVoidFunction;\n onChange: (value: string | false) => void;\n};\n\nconst MIN_USERNAME_LENGTH = 5;\nconst MAX_USERNAME_LENGTH = 32;\nconst LINK_PREFIX = 'https://t.me/';\nconst LINK_PREFIX_REGEX = /https:\\/\\/t\\.me\\/?/i;\nconst USERNAME_REGEX = /^([a-zA-Z0-9_]+)$/;\n\nconst runDebouncedForCheckUsername = debounce((cb) => cb(), 250, false);\n\nfunction isUsernameValid(username: string) {\n return username.length >= MIN_USERNAME_LENGTH\n && username.length <= MAX_USERNAME_LENGTH\n && USERNAME_REGEX.test(username);\n}\n\nconst SettingsEditProfile: FC = ({\n currentUsername,\n asLink,\n isLoading,\n isUsernameAvailable,\n checkUsername,\n onChange,\n}) => {\n const [username, setUsername] = useState(currentUsername || '');\n\n const lang = useLang();\n const langPrefix = asLink ? 'SetUrl' : 'Username';\n const label = asLink ? lang('SetUrlPlaceholder') : lang('Username');\n\n const [usernameSuccess, usernameError] = useMemo(() => {\n if (!username.length) {\n return [];\n }\n\n if (username.length < MIN_USERNAME_LENGTH) {\n return [undefined, `${label} is too short`];\n }\n if (username.length > MAX_USERNAME_LENGTH) {\n return [undefined, `${label} is too long`];\n }\n if (!USERNAME_REGEX.test(username)) {\n return [undefined, `${label} contains invalid characters`];\n }\n\n if (isUsernameAvailable === undefined) {\n return [];\n }\n\n // Variable `isUsernameAvailable` is initialized with `undefined`, so a strict false check is required\n return [\n isUsernameAvailable ? lang(`${langPrefix}Available`, 'Username') : undefined,\n isUsernameAvailable === false ? lang(`${langPrefix}InUse`) : undefined,\n ];\n }, [username, isUsernameAvailable, lang, langPrefix, label]);\n\n useEffect(() => {\n setUsername(currentUsername || '');\n }, [asLink, currentUsername]);\n\n const handleUsernameChange = useCallback((e: ChangeEvent) => {\n const newUsername = e.target.value.trim().replace(LINK_PREFIX_REGEX, '');\n setUsername(newUsername);\n e.target.value = `${asLink ? LINK_PREFIX : ''}${newUsername}`;\n\n const isValid = isUsernameValid(newUsername);\n\n if (isValid) {\n runDebouncedForCheckUsername(() => {\n checkUsername({ username: newUsername });\n });\n }\n\n if (onChange) {\n onChange(isValid ? newUsername : false);\n }\n }, [asLink, checkUsername, onChange]);\n\n return (\n \n );\n};\n\nexport default memo(SettingsEditProfile);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useCallback, memo, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { ProfileEditProgress, SettingsScreens } from '../../../types';\n\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport { selectUser } from '../../../modules/selectors';\nimport { getChatAvatarHash } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport InputText from '../../ui/InputText';\nimport renderText from '../../common/helpers/renderText';\nimport UsernameInput from '../../common/UsernameInput';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\ntype OwnProps = {\n isActive: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentAvatarHash?: string;\n currentFirstName?: string;\n currentLastName?: string;\n currentBio?: string;\n currentUsername?: string;\n progress?: ProfileEditProgress;\n isUsernameAvailable?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst MAX_BIO_LENGTH = 70;\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide your first name';\nconst ERROR_BIO_TOO_LONG = 'Bio can\\' be longer than 70 characters';\n\nconst SettingsEditProfile: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n loadCurrentUser,\n updateProfile,\n checkUsername,\n}) => {\n const lang = useLang();\n\n const [isUsernameTouched, setIsUsernameTouched] = useState(false);\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n\n const [photo, setPhoto] = useState();\n const [firstName, setFirstName] = useState(currentFirstName || '');\n const [lastName, setLastName] = useState(currentLastName || '');\n const [bio, setBio] = useState(currentBio || '');\n const [username, setUsername] = useState(currentUsername || '');\n\n const currentAvatarBlobUrl = useMedia(currentAvatarHash, false, ApiMediaFormat.BlobUrl);\n\n const isLoading = progress === ProfileEditProgress.InProgress;\n const isUsernameError = username === false;\n\n const isSaveButtonShown = useMemo(() => {\n if (isUsernameError) {\n return false;\n }\n\n return Boolean(photo) || isProfileFieldsTouched || isUsernameAvailable === true;\n }, [photo, isProfileFieldsTouched, isUsernameError, isUsernameAvailable]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.EditProfile);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadCurrentUser();\n });\n }, [loadCurrentUser]);\n\n useEffect(() => {\n setPhoto(undefined);\n }, [currentAvatarBlobUrl]);\n\n useEffect(() => {\n setFirstName(currentFirstName || '');\n setLastName(currentLastName || '');\n setBio(currentBio || '');\n }, [currentFirstName, currentLastName, currentBio]);\n\n useEffect(() => {\n setUsername(currentUsername || '');\n }, [currentUsername]);\n\n useEffect(() => {\n if (progress === ProfileEditProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setIsUsernameTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const handlePhotoChange = useCallback((newPhoto: File) => {\n setPhoto(newPhoto);\n }, []);\n\n const handleFirstNameChange = useCallback((e: ChangeEvent) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleBioChange = useCallback((e: ChangeEvent) => {\n setBio(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUsernameChange = useCallback((value: string | false) => {\n setUsername(value);\n setIsUsernameTouched(true);\n }, []);\n\n const handleProfileSave = useCallback(() => {\n const trimmedFirstName = firstName.trim();\n const trimmedLastName = lastName.trim();\n const trimmedBio = bio.trim();\n\n if (!trimmedFirstName.length) {\n setError(ERROR_FIRST_NAME_MISSING);\n return;\n }\n\n if (trimmedBio.length > MAX_BIO_LENGTH) {\n setError(ERROR_BIO_TOO_LONG);\n return;\n }\n\n updateProfile({\n photo,\n ...(isProfileFieldsTouched && {\n firstName: trimmedFirstName,\n lastName: trimmedLastName,\n bio: trimmedBio,\n }),\n ...(isUsernameTouched && {\n username,\n }),\n });\n }, [\n photo,\n firstName, lastName, bio, isProfileFieldsTouched,\n username, isUsernameTouched,\n updateProfile,\n ]);\n\n return (\n
\n
\n
\n \n \n \n \n\n

\n {renderText(lang('lng_settings_about_bio'), ['br', 'simple_markdown'])}\n

\n
\n\n
\n

{lang('Username')}

\n\n \n\n

\n {renderText(lang('UsernameHelp'), ['br', 'simple_markdown'])}\n

\n {username && (\n

\n {lang('lng_username_link')}
\n https://t.me/{username}\n

\n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { currentUserId } = global;\n const { progress, isUsernameAvailable } = global.profileEdit || {};\n const currentUser = currentUserId ? selectUser(global, currentUserId) : undefined;\n\n if (!currentUser) {\n return {\n progress,\n isUsernameAvailable,\n };\n }\n\n const {\n firstName: currentFirstName,\n lastName: currentLastName,\n username: currentUsername,\n fullInfo,\n } = currentUser;\n const { bio: currentBio } = fullInfo || {};\n const currentAvatarHash = getChatAvatarHash(currentUser);\n\n return {\n currentAvatarHash,\n currentFirstName,\n currentLastName,\n currentBio,\n currentUsername,\n progress,\n isUsernameAvailable,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadCurrentUser',\n 'updateProfile',\n 'checkUsername',\n ]),\n)(SettingsEditProfile));\n","import React, {\n FC, memo, useMemo, useCallback, useState, useEffect,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { ApiChatFolder, ApiChat, ApiUser } from '../../../../api/types';\nimport { NotifyException, NotifySettings, SettingsScreens } from '../../../../types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { pick } from '../../../../util/iteratees';\nimport { selectNotifyExceptions, selectNotifySettings } from '../../../../modules/selectors';\nimport { throttle } from '../../../../util/schedulers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport { getFolderDescriptionText } from '../../../../modules/helpers';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport ListItem from '../../../ui/ListItem';\nimport Button from '../../../ui/Button';\nimport Loading from '../../../ui/Loading';\nimport AnimatedSticker from '../../../common/AnimatedSticker';\n\ntype OwnProps = {\n onCreateFolder: () => void;\n onEditFolder: (folder: ApiChatFolder) => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n orderedFolderIds?: number[];\n foldersById: Record;\n recommendedChatFolders?: ApiChatFolder[];\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottledForLoadRecommended = throttle((cb) => cb(), 60000, true);\n\nconst MAX_ALLOWED_FOLDERS = 10;\n\nconst SettingsFoldersMain: FC = ({\n onCreateFolder,\n onEditFolder,\n isActive,\n onScreenSelect,\n onReset,\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings,\n notifyExceptions,\n loadRecommendedChatFolders,\n addChatFolder,\n showDialog,\n}) => {\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('FoldersAll').then(setAnimationData);\n }\n }, [animationData]);\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottledForLoadRecommended(() => {\n loadRecommendedChatFolders();\n });\n }, [loadRecommendedChatFolders]);\n\n const handleCreateFolder = useCallback(() => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showDialog({\n data: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n hasErrorKey: true,\n },\n });\n\n return;\n }\n\n onCreateFolder();\n }, [foldersById, showDialog, onCreateFolder]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Folders);\n\n const userFolders = useMemo(() => {\n if (!orderedFolderIds) {\n return undefined;\n }\n\n const chatIds = Object.keys(chatsById).map(Number);\n\n return orderedFolderIds.map((id) => {\n const folder = foldersById[id];\n\n return {\n id: folder.id,\n title: folder.title,\n subtitle: getFolderDescriptionText(\n lang, chatsById, usersById, folder, chatIds, notifySettings, notifyExceptions,\n ),\n };\n });\n }, [orderedFolderIds, chatsById, foldersById, usersById, notifySettings, notifyExceptions, lang]);\n\n const handleCreateFolderFromRecommended = useCallback((folder: ApiChatFolder) => {\n if (Object.keys(foldersById).length >= MAX_ALLOWED_FOLDERS) {\n showDialog({\n data: {\n message: 'DIALOG_FILTERS_TOO_MUCH',\n hasErrorKey: true,\n },\n });\n\n return;\n }\n\n addChatFolder({ folder });\n }, [foldersById, addChatFolder, showDialog]);\n\n return (\n
\n
\n
\n {animationData && (\n \n )}\n
\n\n

\n {lang('CreateNewFilterInfo')}\n

\n\n \n \n {lang('CreateNewFilter')}\n \n
\n\n
\n

{lang('Filters')}

\n\n {userFolders && userFolders.length ? userFolders.map((folder) => (\n onEditFolder(foldersById[folder.id])}\n >\n {folder.title}\n {folder.subtitle}\n \n )) : userFolders && !userFolders.length ? (\n

\n You have no folders yet.\n

\n ) : }\n
\n\n {(recommendedChatFolders && !!recommendedChatFolders.length) && (\n
\n

\n {lang('FilterRecommended')}\n

\n\n {recommendedChatFolders.map((folder) => (\n handleCreateFolderFromRecommended(folder)}\n >\n
\n
\n {folder.title}\n {folder.description}\n
\n\n \n {lang('Add')}\n \n
\n \n ))}\n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: { byId: chatsById },\n users: { byId: usersById },\n } = global;\n\n const {\n orderedIds: orderedFolderIds,\n byId: foldersById,\n recommended: recommendedChatFolders,\n } = global.chatFolders;\n\n return {\n chatsById,\n usersById,\n orderedFolderIds,\n foldersById,\n recommendedChatFolders,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadRecommendedChatFolders', 'addChatFolder', 'showDialog']),\n)(SettingsFoldersMain));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\n\nimport './ShowMoreButton.scss';\n\ntype OwnProps = {\n count: number;\n itemName: string;\n itemPluralName?: string;\n isLoading?: boolean;\n onClick: () => void;\n};\n\nconst ShowMoreButton: FC = ({\n count,\n itemName,\n itemPluralName,\n isLoading,\n onClick,\n}) => {\n const lang = useLang();\n\n return (\n \n \n Show {count} more {count > 1 ? itemPluralName || `${itemName}s` : itemName}\n \n );\n};\n\nexport default ShowMoreButton;\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { findIntersectionWithSet, pick } from '../../../../util/iteratees';\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport getAnimationData from '../../../common/helpers/animatedAssets';\nimport {\n EXCLUDED_CHAT_TYPES,\n FolderEditDispatch,\n FoldersState,\n INCLUDED_CHAT_TYPES,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedSticker from '../../../common/AnimatedSticker';\nimport InputText from '../../../ui/InputText';\nimport PrivateChatInfo from '../../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../../common/GroupChatInfo';\nimport FloatingActionButton from '../../../ui/FloatingActionButton';\nimport Spinner from '../../../ui/Spinner';\nimport ShowMoreButton from '../../../ui/ShowMoreButton';\n\ntype OwnProps = {\n state: FoldersState;\n dispatch: FolderEditDispatch;\n onAddIncludedChats: () => void;\n onAddExcludedChats: () => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n onBack: () => void;\n};\n\ntype StateProps = {\n loadedActiveChatIds?: number[];\n loadedArchivedChatIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SUBMIT_TIMEOUT = 500;\n\nconst INITIAL_CHATS_LIMIT = 5;\n\nconst ERROR_NO_TITLE = 'Please provide a title for this folder.';\nconst ERROR_NO_CHATS = 'Please select at least one chat for this folder.';\n\nconst SettingsFoldersEdit: FC = ({\n state,\n dispatch,\n onAddIncludedChats,\n onAddExcludedChats,\n isActive,\n onScreenSelect,\n onReset,\n onBack,\n loadedActiveChatIds,\n loadedArchivedChatIds,\n editChatFolder,\n addChatFolder,\n loadMoreChats,\n}) => {\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n\n const [isIncludedChatsListExpanded, setIsIncludedChatsListExpanded] = useState(false);\n const [isExcludedChatsListExpanded, setIsExcludedChatsListExpanded] = useState(false);\n\n const {\n selectedChatIds: includedChatIds,\n selectedChatTypes: includedChatTypes,\n } = selectChatFilters(state, 'included');\n const {\n selectedChatIds: excludedChatIds,\n selectedChatTypes: excludedChatTypes,\n } = selectChatFilters(state, 'excluded');\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('FoldersNew').then(setAnimationData);\n }\n }, [animationData]);\n\n useEffect(() => {\n setIsIncludedChatsListExpanded(false);\n setIsExcludedChatsListExpanded(false);\n }, [state.folderId]);\n\n const [visibleIncludedChatIds, visibleExcludedChatIds] = useMemo(() => {\n const allLoadedChatsSet = new Set([\n ...loadedActiveChatIds || [],\n ...loadedArchivedChatIds || [],\n ]);\n\n const loadedIncludedChatIds = findIntersectionWithSet(includedChatIds, allLoadedChatsSet);\n const loadedExcludedChatIds = findIntersectionWithSet(excludedChatIds, allLoadedChatsSet);\n\n return [\n isIncludedChatsListExpanded\n ? loadedIncludedChatIds\n : loadedIncludedChatIds.slice(0, INITIAL_CHATS_LIMIT - includedChatTypes.length),\n isExcludedChatsListExpanded\n ? loadedExcludedChatIds\n : loadedExcludedChatIds.slice(0, INITIAL_CHATS_LIMIT - excludedChatTypes.length),\n ];\n }, [\n excludedChatIds, includedChatIds, includedChatTypes, excludedChatTypes,\n isExcludedChatsListExpanded, isIncludedChatsListExpanded,\n loadedActiveChatIds, loadedArchivedChatIds,\n ]);\n\n useEffect(() => {\n if (\n visibleIncludedChatIds.length < includedChatIds.length\n || visibleExcludedChatIds.length < excludedChatIds.length\n ) {\n loadMoreChats({ listType: 'active' });\n }\n }, [\n loadMoreChats,\n excludedChatIds.length,\n includedChatIds.length,\n visibleExcludedChatIds.length,\n visibleIncludedChatIds.length,\n ]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onBack, onScreenSelect, state.mode === 'edit'\n ? SettingsScreens.FoldersEditFolder\n : SettingsScreens.FoldersCreateFolder);\n\n function handleChange(event: React.ChangeEvent) {\n const { currentTarget } = event;\n dispatch({ type: 'setTitle', payload: currentTarget.value.trim() });\n }\n\n function handleSubmit() {\n const { title } = state.folder;\n\n if (!title) {\n dispatch({ type: 'setError', payload: ERROR_NO_TITLE });\n return;\n }\n\n if (!includedChatIds.length && !Object.keys(includedChatTypes).length) {\n dispatch({ type: 'setError', payload: ERROR_NO_CHATS });\n return;\n }\n\n dispatch({ type: 'setIsLoading', payload: true });\n if (state.mode === 'edit') {\n editChatFolder({ id: state.folderId, folderUpdate: state.folder });\n } else {\n addChatFolder({ folder: state.folder });\n }\n\n setTimeout(() => {\n onReset();\n }, SUBMIT_TIMEOUT);\n }\n\n function renderChatType(key: string, mode: 'included' | 'excluded') {\n const chatType = mode === 'included'\n ? INCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key)\n : EXCLUDED_CHAT_TYPES.find(({ key: typeKey }) => typeKey === key);\n\n if (!chatType) {\n return undefined;\n }\n\n return (\n \n {lang(chatType.title)}\n \n );\n }\n\n function renderChats(mode: 'included' | 'excluded') {\n const selectedChatTypes = mode === 'included' ? includedChatTypes : excludedChatTypes;\n const visibleChatIds = mode === 'included' ? visibleIncludedChatIds : visibleExcludedChatIds;\n\n const isExpanded = mode === 'included' ? isIncludedChatsListExpanded : isExcludedChatsListExpanded;\n const allChatIds = mode === 'included' ? includedChatIds : excludedChatIds;\n const leftChatsCount = allChatIds.length - selectedChatTypes.length - visibleChatIds.length;\n const clickHandler = mode === 'included'\n ? () => setIsIncludedChatsListExpanded(true)\n : () => setIsExcludedChatsListExpanded(true);\n\n return (\n <>\n {selectedChatTypes.map((key) => renderChatType(key, mode))}\n {visibleChatIds.map((id) => (\n \n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n ))}\n {(!isExpanded && leftChatsCount > 0) && (\n \n )}\n \n );\n }\n\n return (\n
\n
\n
\n
\n {animationData && (\n \n )}\n
\n\n {state.mode === 'create' && (\n

\n {lang('FilterIncludeInfo')}\n

\n )}\n\n \n
\n\n
\n {state.error && state.error === ERROR_NO_CHATS && (\n

\n {state.error}\n

\n )}\n\n

{lang('FilterInclude')}

\n\n \n {lang('FilterAddChats')}\n \n\n {renderChats('included')}\n
\n\n
\n

{lang('FilterExclude')}

\n\n \n {lang('FilterAddChats')}\n \n\n {renderChats('excluded')}\n
\n
\n\n \n {state.isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { listIds } = global.chats;\n\n return {\n loadedActiveChatIds: listIds.active,\n loadedArchivedChatIds: listIds.archived,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['editChatFolder', 'addChatFolder', 'loadMoreChats']),\n)(SettingsFoldersEdit));\n","import React, {\n FC, useCallback, useRef, useEffect, memo,\n} from '../../../../lib/teact/teact';\n\nimport { isChatPrivate } from '../../../../modules/helpers';\nimport {\n INCLUDED_CHAT_TYPES,\n EXCLUDED_CHAT_TYPES,\n FolderChatType,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useInfiniteScroll from '../../../../hooks/useInfiniteScroll';\nimport useLang from '../../../../hooks/useLang';\n\nimport Checkbox from '../../../ui/Checkbox';\nimport InputText from '../../../ui/InputText';\nimport ListItem from '../../../ui/ListItem';\nimport PrivateChatInfo from '../../../common/PrivateChatInfo';\nimport GroupChatInfo from '../../../common/GroupChatInfo';\nimport PickerSelectedItem from '../../../common/PickerSelectedItem';\nimport InfiniteScroll from '../../../ui/InfiniteScroll';\nimport Loading from '../../../ui/Loading';\n\nimport '../../../common/Picker.scss';\nimport './SettingsFoldersChatsPicker.scss';\n\ntype OwnProps = {\n mode: 'included' | 'excluded';\n chatIds: number[];\n selectedIds: number[];\n selectedChatTypes: string[];\n filterValue?: string;\n onSelectedIdsChange: (ids: number[]) => void;\n onSelectedChatTypesChange: (types: string[]) => void;\n onFilterChange: (value: string) => void;\n onLoadMore: () => void;\n};\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\n\nconst MAX_CHATS = 100;\nconst MAX_FULL_ITEMS = 10;\nconst ALWAYS_FULL_ITEMS_COUNT = 5;\n\nconst SettingsFoldersChatsPicker: FC = ({\n mode,\n chatIds,\n selectedIds,\n selectedChatTypes,\n filterValue,\n onSelectedIdsChange,\n onSelectedChatTypesChange,\n onFilterChange,\n onLoadMore,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const chatTypes = mode === 'included' ? INCLUDED_CHAT_TYPES : EXCLUDED_CHAT_TYPES;\n const shouldMinimize = selectedIds.length + selectedChatTypes.length > MAX_FULL_ITEMS;\n const hasMaxChats = selectedIds.length >= MAX_CHATS;\n\n useEffect(() => {\n setTimeout(() => {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n });\n }, FOCUS_DELAY_MS);\n }, []);\n\n const handleItemClick = useCallback((id: number) => {\n const newSelectedIds = [...selectedIds];\n if (newSelectedIds.includes(id)) {\n newSelectedIds.splice(newSelectedIds.indexOf(id), 1);\n } else {\n newSelectedIds.push(id);\n }\n onSelectedIdsChange(newSelectedIds);\n }, [selectedIds, onSelectedIdsChange]);\n\n const handleChatTypeClick = useCallback((key: FolderChatType['key']) => {\n const newSelectedChatTypes = [...selectedChatTypes];\n if (newSelectedChatTypes.includes(key)) {\n newSelectedChatTypes.splice(newSelectedChatTypes.indexOf(key), 1);\n } else {\n newSelectedChatTypes.push(key);\n }\n onSelectedChatTypesChange(newSelectedChatTypes);\n }, [selectedChatTypes, onSelectedChatTypesChange]);\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n onFilterChange(value);\n }, [onFilterChange]);\n\n const lang = useLang();\n\n function renderSelectedChatType(key: string) {\n const selectedType = chatTypes.find(({ key: typeKey }) => key === typeKey);\n if (!selectedType) {\n return undefined;\n }\n\n return (\n \n );\n }\n\n function renderChatType(type: FolderChatType) {\n return (\n handleChatTypeClick(type.key)}\n ripple\n >\n \n

{lang(type.title)}

\n \n \n );\n }\n\n function renderItem(id: number) {\n const isSelected = selectedIds.includes(id);\n\n return (\n handleItemClick(id)}\n ripple\n disabled={!isSelected && hasMaxChats}\n >\n {isChatPrivate(id) ? (\n \n ) : (\n \n )}\n \n \n );\n }\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, chatIds, Boolean(filterValue));\n\n return (\n
\n
\n {selectedChatTypes.map(renderSelectedChatType)}\n {selectedIds.map((id, i) => (\n \n ))}\n {!hasMaxChats ? (\n \n ) : (\n

\n {`Sorry, you can't add more than ${MAX_CHATS} chats.`}\n

\n )}\n
\n \n {(!viewportIds || !viewportIds.length || viewportIds.includes(chatIds[0])) && (\n <>\n

\n {lang('FilterChatTypes')}\n

\n {chatTypes.map(renderChatType)}\n
\n

\n {lang('FilterChats')}\n

\n \n )}\n\n {viewportIds && viewportIds.length ? (\n viewportIds.map(renderItem)\n ) : viewportIds && !viewportIds.length ? (\n

Sorry, nothing found.

\n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(SettingsFoldersChatsPicker);\n","import React, {\n FC, memo, useMemo, useCallback,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../../global/types';\nimport { ApiChat } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport useLang from '../../../../hooks/useLang';\nimport { pick } from '../../../../util/iteratees';\nimport searchWords from '../../../../util/searchWords';\nimport { prepareChatList, getChatTitle } from '../../../../modules/helpers';\nimport {\n FoldersState,\n FolderEditDispatch,\n selectChatFilters,\n} from '../../../../hooks/reducers/useFoldersReducer';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport SettingsFoldersChatsPicker from './SettingsFoldersChatsPicker';\n\nimport Loading from '../../../ui/Loading';\n\ntype OwnProps = {\n mode: 'included' | 'excluded';\n state: FoldersState;\n dispatch: FolderEditDispatch;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsFoldersChatFilters: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n mode,\n state,\n dispatch,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n loadMoreChats,\n}) => {\n const { chatFilter } = state;\n const { selectedChatIds, selectedChatTypes } = selectChatFilters(state, mode, true);\n\n const lang = useLang();\n const chats = useMemo(() => {\n const activeChatArrays = listIds\n ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all')\n : undefined;\n const archivedChatArrays = archivedListIds\n ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived')\n : undefined;\n\n if (!activeChatArrays && !archivedChatArrays) {\n return undefined;\n }\n\n return [\n ...(activeChatArrays\n ? [...activeChatArrays.pinnedChats, ...activeChatArrays.otherChats]\n : []\n ),\n ...(archivedChatArrays ? archivedChatArrays.otherChats : []),\n ];\n }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]);\n\n const displayedIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (\n !chatFilter\n || searchWords(getChatTitle(lang, chat), chatFilter)\n || selectedChatIds.includes(chat.id)\n ))\n .map(({ id }) => id);\n }, [chats, chatFilter, lang, selectedChatIds]);\n\n const handleFilterChange = useCallback((newFilter: string) => {\n dispatch({\n type: 'setChatFilter',\n payload: newFilter,\n });\n }, [dispatch]);\n\n const handleSelectedIdsChange = useCallback((ids: number[]) => {\n if (mode === 'included') {\n dispatch({\n type: 'setIncludeFilters',\n payload: { ...state.includeFilters, includedChatIds: ids },\n });\n } else {\n dispatch({\n type: 'setExcludeFilters',\n payload: { ...state.excludeFilters, excludedChatIds: ids },\n });\n }\n }, [mode, state, dispatch]);\n\n const handleSelectedChatTypesChange = useCallback((keys: string[]) => {\n const newFilters: Record = {};\n keys.forEach((key) => {\n newFilters[key] = true;\n });\n\n if (mode === 'included') {\n dispatch({\n type: 'setIncludeFilters',\n payload: {\n includedChatIds: selectedChatIds,\n ...newFilters,\n },\n });\n } else {\n dispatch({\n type: 'setExcludeFilters',\n payload: {\n excludedChatIds: selectedChatIds,\n ...newFilters,\n },\n });\n }\n }, [mode, selectedChatIds, dispatch]);\n\n useHistoryBack(isActive, onReset, onScreenSelect,\n mode === 'included' ? SettingsScreens.FoldersIncludedChats : SettingsScreens.FoldersExcludedChats);\n\n if (!displayedIds) {\n return ;\n }\n\n return (\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n } = global;\n\n return {\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n archivedPinnedIds: orderedPinnedIds.archived,\n archivedListIds: listIds.archived,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMoreChats']),\n)(SettingsFoldersChatFilters));\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport { ApiChatFolder } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { FolderEditDispatch, FoldersState } from '../../../../hooks/reducers/useFoldersReducer';\n\nimport SettingsFoldersMain from './SettingsFoldersMain';\nimport SettingsFoldersEdit from './SettingsFoldersEdit';\nimport SettingsFoldersChatFilters from './SettingsFoldersChatFilters';\n\nimport './SettingsFolders.scss';\n\nconst TRANSITION_DURATION = 200;\n\nexport type OwnProps = {\n currentScreen: SettingsScreens;\n shownScreen: SettingsScreens;\n state: FoldersState;\n dispatch: FolderEditDispatch;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst SettingsFolders: FC = ({\n currentScreen,\n shownScreen,\n state,\n dispatch,\n isActive,\n onScreenSelect,\n onReset,\n}) => {\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n ) {\n setTimeout(() => {\n dispatch({ type: 'reset' });\n }, TRANSITION_DURATION);\n }\n\n if (\n currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersExcludedChats\n ) {\n if (state.mode === 'create') {\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n } else {\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }\n return;\n }\n\n onReset();\n }, [\n state.mode, dispatch,\n currentScreen, onReset, onScreenSelect,\n ]);\n\n const handleCreateFolder = useCallback(() => {\n dispatch({ type: 'reset' });\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n }, [onScreenSelect, dispatch]);\n\n const handleEditFolder = useCallback((folder: ApiChatFolder) => {\n dispatch({ type: 'editFolder', payload: folder });\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }, [dispatch, onScreenSelect]);\n\n const handleAddIncludedChats = useCallback(() => {\n dispatch({ type: 'editIncludeFilters' });\n onScreenSelect(SettingsScreens.FoldersIncludedChats);\n }, [dispatch, onScreenSelect]);\n\n const handleAddExcludedChats = useCallback(() => {\n dispatch({ type: 'editExcludeFilters' });\n onScreenSelect(SettingsScreens.FoldersExcludedChats);\n }, [dispatch, onScreenSelect]);\n\n switch (currentScreen) {\n case SettingsScreens.Folders:\n return (\n \n );\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n return (\n \n );\n case SettingsScreens.FoldersIncludedChats:\n return (\n \n );\n case SettingsScreens.FoldersExcludedChats:\n return (\n \n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(SettingsFolders);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, useMemo, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport './RangeSlider.scss';\n\ntype OwnProps = {\n options?: string[];\n range?: { min: number; max: number; step?: number };\n label?: string;\n value: number;\n disabled?: boolean;\n onChange: (value: number) => void;\n};\n\nconst RangeSlider: FC = ({\n options,\n range,\n label,\n value,\n disabled,\n onChange,\n}) => {\n const lang = useLang();\n const handleChange = useCallback((event: ChangeEvent) => {\n onChange(Number(event.currentTarget.value));\n }, [onChange]);\n\n const className = buildClassName(\n 'RangeSlider',\n disabled && 'disabled',\n );\n\n const trackWidth = useMemo(() => {\n if (options) {\n return (value / (options.length - 1)) * 100;\n } else if (range) {\n const possibleValuesLength = (range.max - range.min) / (range.step || 1);\n return ((value - range.min) / possibleValuesLength) * 100;\n }\n return 0;\n }, [value, options, range]);\n\n const [min, max, step] = useMemo(() => {\n if (options) {\n return [0, options.length - 1, 1];\n } else if (range) {\n return [range.min, range.max, range.step || 1];\n }\n\n return [0, 0, 0];\n }, [range, options]);\n\n return (\n
\n {label && (\n
\n {label}\n {range && (\n {value}\n )}\n
\n )}\n
\n \n \n {options && (\n
\n {options.map((option, index) => (\n onChange(index)}\n >\n {option}\n
\n ))}\n
\n )}\n
\n
\n );\n};\n\nexport default memo(RangeSlider);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiStickerSet } from '../../../api/types';\n\nimport { STICKER_SIZE_PICKER_HEADER } from '../../../config';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport { getFirstLetters } from '../../../util/textFormat';\n\nimport AnimatedSticker from '../../common/AnimatedSticker';\n\ntype OwnProps = {\n size?: number;\n stickerSet: ApiStickerSet;\n observeIntersection: ObserveFn;\n};\n\nconst StickerSetCoverAnimated: FC = ({\n size = STICKER_SIZE_PICKER_HEADER,\n stickerSet,\n observeIntersection,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaHash = `stickerSet${stickerSet.id}`;\n const lottieData = useMedia(mediaHash, !isIntersecting, ApiMediaFormat.Lottie);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(lottieData, 'slow');\n\n return (\n
\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && lottieData && (\n \n )}\n
\n );\n};\n\nexport default memo(StickerSetCoverAnimated);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiStickerSet } from '../../../api/types';\n\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport { getFirstLetters } from '../../../util/textFormat';\n\ntype OwnProps = {\n stickerSet: ApiStickerSet;\n observeIntersection: ObserveFn;\n};\n\nconst StickerSetCover: FC = ({ stickerSet, observeIntersection }) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaData = useMedia(stickerSet.hasThumbnail && `stickerSet${stickerSet.id}`, !isIntersecting);\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(mediaData, 'slow');\n\n return (\n
\n {!shouldRenderFullMedia && getFirstLetters(stickerSet.title, 2)}\n {shouldRenderFullMedia && (\n \"\"\n )}\n
\n );\n};\n\nexport default memo(StickerSetCover);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { useIsIntersecting, ObserveFn } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useFlag from '../../hooks/useFlag';\nimport buildClassName from '../../util/buildClassName';\n\nimport AnimatedSticker from './AnimatedSticker';\nimport Button from '../ui/Button';\n\nimport './StickerButton.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n size: number;\n observeIntersection: ObserveFn;\n noAnimate?: boolean;\n title?: string;\n className?: string;\n onClick?: (arg: any) => void;\n clickArg?: any;\n onUnfaveClick?: (sticker: ApiSticker) => void;\n};\n\nconst StickerButton: FC = ({\n sticker, size, observeIntersection, noAnimate, title, className, onClick, clickArg, onUnfaveClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const localMediaHash = `sticker${sticker.id}`;\n const stickerSelector = `sticker-button-${sticker.id}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const thumbDataUri = sticker.thumbnail ? sticker.thumbnail.dataUri : undefined;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl);\n\n const shouldPlay = isIntersecting && !noAnimate;\n const lottieData = useMedia(sticker.isAnimated && localMediaHash, !shouldPlay, ApiMediaFormat.Lottie);\n const [isAnimationLoaded, markLoaded, unmarkLoaded] = useFlag(Boolean(lottieData));\n const canAnimatedPlay = isAnimationLoaded && shouldPlay;\n\n const {\n shouldRenderThumb,\n shouldRenderFullMedia: shouldRenderPreview,\n transitionClassNames: previewTransitionClassNames,\n } = useTransitionForMedia(previewBlobUrl || canAnimatedPlay, 'slow');\n\n // To avoid flickering\n useEffect(() => {\n if (!shouldPlay) {\n unmarkLoaded();\n }\n }, [unmarkLoaded, shouldPlay]);\n\n function handleClick() {\n if (onClick) {\n onClick(clickArg);\n }\n }\n\n function handleUnfaveClick(e: ReactMouseEvent) {\n e.stopPropagation();\n e.preventDefault();\n\n onUnfaveClick!(sticker);\n }\n\n const fullClassName = buildClassName(\n 'StickerButton',\n sticker.isAnimated && 'animated',\n stickerSelector,\n className,\n );\n\n const style = shouldRenderThumb && thumbDataUri ? `background-image: url('${thumbDataUri}');` : '';\n\n return (\n \n {shouldRenderPreview && !canAnimatedPlay && (\n // eslint-disable-next-line jsx-a11y/alt-text\n \n )}\n {shouldPlay && lottieData && (\n \n )}\n {onUnfaveClick && (\n \n \n \n )}\n \n );\n};\n\nexport default memo(StickerButton);\n","import React, {\n FC, memo,\n} from '../../../lib/teact/teact';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { STICKER_SIZE_GENERAL_SETTINGS } from '../../../config';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\nimport useLang from '../../../hooks/useLang';\n\nimport ListItem from '../../ui/ListItem';\nimport Button from '../../ui/Button';\nimport StickerSetCoverAnimated from '../../middle/composer/StickerSetCoverAnimated';\nimport StickerSetCover from '../../middle/composer/StickerSetCover';\nimport StickerButton from '../../common/StickerButton';\n\nimport './SettingsStickerSet.scss';\n\ntype OwnProps = {\n stickerSet?: ApiStickerSet;\n observeIntersection: ObserveFn;\n onClick: (value: ApiSticker) => void;\n};\n\nconst SettingsStickerSet: FC = ({\n stickerSet,\n observeIntersection,\n onClick,\n}) => {\n const lang = useLang();\n\n if (!stickerSet || !stickerSet.stickers) {\n return undefined;\n }\n\n const firstSticker = stickerSet.stickers && stickerSet.stickers[0];\n\n if (stickerSet.hasThumbnail || !firstSticker) {\n return (\n firstSticker && onClick(firstSticker)}\n >\n \n {stickerSet.isAnimated ? (\n \n ) : (\n \n )}\n \n
\n
{stickerSet.title}
\n
{lang('StickerPack.StickerCount', stickerSet.count, 'i')}
\n
\n \n );\n } else {\n return (\n onClick(firstSticker)}\n >\n \n
\n
{stickerSet.title}
\n
{lang('StickerPack.StickerCount', stickerSet.count, 'i')}
\n
\n \n );\n }\n};\n\nexport default memo(SettingsStickerSet);\n","import React, {\n FC, useCallback, memo, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ISettings } from '../../../types';\nimport { ApiSticker, ApiStickerSet } from '../../../api/types';\n\nimport { IS_IOS, IS_MAC_OS, IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport RangeSlider from '../../ui/RangeSlider';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup from '../../ui/RadioGroup';\nimport SettingsStickerSet from './SettingsStickerSet';\nimport StickerSetModal from '../../common/StickerSetModal.async';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick & {\n stickerSetIds?: string[];\n stickerSetsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_LEVEL_OPTIONS = [\n 'Solid and Steady',\n 'Nice and Fast',\n 'Lots of Stuff',\n];\n\nconst SettingsGeneral: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n stickerSetIds,\n stickerSetsById,\n messageTextSize,\n animationLevel,\n messageSendKeyCombo,\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n shouldAutoPlayGifs,\n shouldAutoPlayVideos,\n shouldSuggestStickers,\n shouldLoopStickers,\n setSettingOption,\n loadStickerSets,\n loadAddedStickers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const stickerSettingsRef = useRef(null);\n const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: stickerSettingsRef });\n const [isModalOpen, openModal, closeModal] = useFlag();\n const [sticker, setSticker] = useState();\n\n const lang = useLang();\n\n const KEYBOARD_SEND_OPTIONS = !IS_TOUCH_ENV ? [\n { value: 'enter', label: lang('lng_settings_send_enter'), subLabel: 'New line by Shift + Enter' },\n {\n value: 'ctrl-enter',\n label: lang(IS_MAC_OS ? 'lng_settings_send_cmdenter' : 'lng_settings_send_ctrlenter'),\n subLabel: 'New line by Enter',\n },\n ] : undefined;\n\n useEffect(() => {\n loadStickerSets();\n }, [loadStickerSets]);\n\n useEffect(() => {\n if (stickerSetIds && stickerSetIds.length) {\n loadAddedStickers();\n }\n }, [stickerSetIds, loadAddedStickers]);\n\n const handleAnimationLevelChange = useCallback((newLevel: number) => {\n ANIMATION_LEVEL_OPTIONS.forEach((_, i) => {\n document.body.classList.toggle(`animation-level-${i}`, newLevel === i);\n });\n\n setSettingOption({ animationLevel: newLevel });\n }, [setSettingOption]);\n\n const handleMessageTextSizeChange = useCallback((newSize: number) => {\n document.documentElement.style.setProperty(\n '--composer-text-size', `${Math.max(newSize, IS_IOS ? 16 : 15)}px`,\n );\n document.documentElement.style.setProperty('--message-text-size', `${newSize}px`);\n\n setSettingOption({ messageTextSize: newSize });\n }, [setSettingOption]);\n\n const handleStickerSetClick = useCallback((value: ApiSticker) => {\n setSticker(value);\n openModal();\n }, [openModal]);\n\n const stickerSets = stickerSetIds && stickerSetIds.map((id: string) => {\n return stickerSetsById && stickerSetsById[id] && stickerSetsById[id].installedDate ? stickerSetsById[id] : false;\n }).filter(Boolean as any);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.General);\n\n return (\n
\n
\n

{lang('SETTINGS')}

\n\n \n\n onScreenSelect(SettingsScreens.GeneralChatBackground)}\n >\n {lang('ChatBackground')}\n \n
\n\n
\n

\n Animation Level\n

\n

\n Choose the desired animations amount.\n

\n\n \n
\n\n {KEYBOARD_SEND_OPTIONS && (\n
\n

{lang('VoiceOver.Keyboard')}

\n\n setSettingOption({ messageSendKeyCombo: value })}\n selected={messageSendKeyCombo}\n />\n
\n )}\n\n
\n

{lang('AutoDownloadMedia')}

\n\n setSettingOption({ shouldAutoDownloadMediaFromContacts: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInPrivateChats: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInGroups: isChecked })}\n />\n setSettingOption({ shouldAutoDownloadMediaInChannels: isChecked })}\n />\n
\n\n
\n

{lang('AutoplayMedia')}

\n\n setSettingOption({ shouldAutoPlayGifs: isChecked })}\n />\n setSettingOption({ shouldAutoPlayVideos: isChecked })}\n />\n
\n\n
\n

{lang('AccDescrStickers')}

\n\n setSettingOption({ shouldSuggestStickers: isChecked })}\n />\n setSettingOption({ shouldLoopStickers: isChecked })}\n />\n\n
\n {stickerSets && stickerSets.map((stickerSet: ApiStickerSet) => (\n \n ))}\n
\n {sticker && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n ...pick(global.settings.byKey, [\n 'messageTextSize',\n 'animationLevel',\n 'messageSendKeyCombo',\n 'shouldAutoDownloadMediaFromContacts',\n 'shouldAutoDownloadMediaInPrivateChats',\n 'shouldAutoDownloadMediaInGroups',\n 'shouldAutoDownloadMediaInChannels',\n 'shouldAutoPlayGifs',\n 'shouldAutoPlayVideos',\n 'shouldSuggestStickers',\n 'shouldLoopStickers',\n 'isSensitiveEnabled',\n 'canChangeSensitive',\n ]),\n stickerSetIds: global.stickers.added.setIds,\n stickerSetsById: global.stickers.setsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setSettingOption', 'loadStickerSets', 'loadAddedStickers',\n ]),\n)(SettingsGeneral));\n","let fileSelector: HTMLInputElement;\n\nexport function openSystemFilesDialog(accept = '*', callback: (e: Event) => void, noMultiple = false) {\n if (!fileSelector) {\n fileSelector = document.createElement('input');\n fileSelector.setAttribute('type', 'file');\n }\n\n fileSelector.setAttribute('accept', accept);\n\n if (noMultiple) {\n fileSelector.removeAttribute('multiple');\n } else {\n fileSelector.setAttribute('multiple', 'multiple');\n }\n\n // eslint-disable-next-line no-null/no-null\n fileSelector.onchange = null;\n fileSelector.value = '';\n fileSelector.onchange = callback;\n\n fileSelector.click();\n}\n","/* eslint-disable eqeqeq */\n/* eslint-disable prefer-template */\n/* eslint-disable prefer-const */\n/* eslint-disable prefer-destructuring */\n/* eslint-disable one-var */\n/* eslint-disable one-var-declaration-per-line */\n\nimport { preloadImage } from './files';\n\n/**\n * HEX > RGB\n * input: 'xxxxxx' (ex. 'ed15fa') case-insensitive\n * output: [r, g, b] ([0-255, 0-255, 0-255])\n */\nexport function hex2rgb(param: string): [number, number, number] {\n return [\n parseInt(param.substring(0, 2), 16),\n parseInt(param.substring(2, 4), 16),\n parseInt(param.substring(4, 6), 16),\n ];\n}\n\n/**\n * RGB > HEX\n * input: [r, g, b] ([0-255, 0-255, 0-255])\n * output: 'xxxxxx' (ex. 'ff0000')\n */\nexport function rgb2hex(param: [number, number, number]) {\n const p0 = param[0].toString(16);\n const p1 = param[1].toString(16);\n const p2 = param[2].toString(16);\n return (p0.length == 1 ? '0' + p0 : p0) + (p1.length == 1 ? '0' + p1 : p1) + (p2.length == 1 ? '0' + p2 : p2);\n}\n\n/**\n * Converts an RGB color value to HSV. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes r, g, and b are contained in the set [0, 255] and\n * returns h, s, and v in the set [0, 1].\n *\n * @param Number r The red color value\n * @param Number g The green color value\n * @param Number b The blue color value\n * @return Array The HSV representation\n */\nexport function rgb2hsb([r, g, b]: [number, number, number]): [number, number, number] {\n r /= 255;\n g /= 255;\n b /= 255;\n\n let max = Math.max(r, g, b), min = Math.min(r, g, b);\n let h!: number, s: number, v: number = max;\n\n let d = max - min;\n s = max == 0 ? 0 : d / max;\n\n if (max == min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n\n h /= 6;\n }\n\n return [h, s, v];\n}\n\n/**\n * Converts an HSV color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSV_color_space.\n * Assumes h, s, and v are contained in the set [0, 1] and\n * returns r, g, and b in the set [0, 255].\n *\n * @param Number h The hue\n * @param Number s The saturation\n * @param Number v The value\n * @return Array The RGB representation\n */\nexport function hsb2rgb([h, s, v]: [number, number, number]): [number, number, number] {\n let r!: number, g!: number, b!: number;\n\n let i = Math.floor(h * 6);\n let f = h * 6 - i;\n let p = v * (1 - s);\n let q = v * (1 - f * s);\n let t = v * (1 - (1 - f) * s);\n\n switch (i % 6) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n case 5:\n r = v;\n g = p;\n b = q;\n break;\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n ];\n}\n\nexport async function getAverageColor(url: string): Promise<[number, number, number]> {\n // Only visit every 5 pixels\n const blockSize = 5;\n const defaultRGB: [number, number, number] = [0, 0, 0];\n let data;\n let width;\n let height;\n let i = -4;\n let length;\n let rgb: [number, number, number] = [0, 0, 0];\n let count = 0;\n\n const canvas = document.createElement('canvas');\n const context = canvas.getContext && canvas.getContext('2d');\n if (!context) {\n return defaultRGB;\n }\n\n const image = await preloadImage(url);\n height = image.naturalHeight || image.offsetHeight || image.height;\n width = image.naturalWidth || image.offsetWidth || image.width;\n canvas.height = height;\n canvas.width = width;\n\n context.drawImage(image, 0, 0);\n\n try {\n data = context.getImageData(0, 0, width, height);\n } catch (e) {\n return defaultRGB;\n }\n\n length = data.data.length;\n\n // eslint-disable-next-line no-cond-assign\n while ((i += blockSize * 4) < length) {\n ++count;\n rgb[0] += data.data[i];\n rgb[1] += data.data[i + 1];\n rgb[2] += data.data[i + 2];\n }\n\n rgb[0] = Math.floor(rgb[0] / count);\n rgb[1] = Math.floor(rgb[1] / count);\n rgb[2] = Math.floor(rgb[2] / count);\n\n return rgb;\n}\n\n// eslint-disable-next-line max-len\n// Function was adapted from https://github.com/telegramdesktop/tdesktop/blob/35ff621b5b52f7e3553fb0f990ea13ade7101b8e/Telegram/SourceFiles/data/data_wall_paper.cpp#L518\nexport function getPatternColor(rgbColor: [number, number, number]) {\n let [hue, saturation, value] = rgb2hsb(rgbColor);\n\n saturation = Math.min(1, saturation + 0.05 + 0.1 * (1 - saturation));\n value = value > 0.5\n ? Math.max(0, value * 0.65)\n : Math.max(0, Math.min(1, 1 - value * 0.65));\n\n return `hsla(${hue * 360}, ${saturation * 100}%, ${value * 100}%, .4)`;\n}\n","import React, {\n FC, memo, useCallback, useEffect, useState, useRef,\n} from '../../../lib/teact/teact';\nimport { ApiWallpaper } from '../../../api/types';\nimport { ThemeKey, UPLOADING_WALLPAPER_SLUG } from '../../../types';\n\nimport { CUSTOM_BG_CACHE_NAME } from '../../../config';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { fetchBlob } from '../../../util/files';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport buildClassName from '../../../util/buildClassName';\nimport useMedia from '../../../hooks/useMedia';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useCanvasBlur from '../../../hooks/useCanvasBlur';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './WallpaperTile.scss';\n\ntype OwnProps = {\n wallpaper: ApiWallpaper;\n theme: ThemeKey;\n isSelected: boolean;\n onClick: (slug: string) => void;\n};\n\nconst WallpaperTile: FC = ({\n wallpaper,\n theme,\n isSelected,\n onClick,\n}) => {\n const { slug, document } = wallpaper;\n const localMediaHash = `wallpaper${document.id!}`;\n const localBlobUrl = document.previewBlobUrl;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`);\n const thumbRef = useCanvasBlur(\n document.thumbnail && document.thumbnail.dataUri,\n Boolean(previewBlobUrl),\n true,\n );\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(previewBlobUrl || localBlobUrl, 'slow');\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(false);\n const {\n mediaData: fullMedia, downloadProgress,\n } = useMediaWithDownloadProgress(localMediaHash, !isDownloadAllowed);\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const { shouldRender: shouldRenderSpinner, transitionClassNames: spinnerClassNames } = useShowTransition(\n (isDownloadAllowed && !fullMedia) || slug === UPLOADING_WALLPAPER_SLUG,\n undefined,\n wasDownloadDisabled,\n 'slow',\n );\n // To prevent triggering of the effect for useCallback\n const cacheKeyRef = useRef();\n cacheKeyRef.current = theme;\n\n const handleSelect = useCallback(() => {\n (async () => {\n const blob = await fetchBlob(fullMedia!);\n await cacheApi.save(CUSTOM_BG_CACHE_NAME, cacheKeyRef.current!, blob);\n onClick(slug);\n })();\n }, [fullMedia, onClick, slug]);\n\n useEffect(() => {\n if (fullMedia) {\n handleSelect();\n }\n }, [fullMedia, handleSelect]);\n\n const handleClick = useCallback(() => {\n if (fullMedia) {\n handleSelect();\n } else {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n }\n }, [fullMedia, handleSelect]);\n\n const className = buildClassName(\n 'WallpaperTile',\n isSelected && 'selected',\n );\n\n return (\n
\n
\n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n
\n
\n );\n};\n\nexport default memo(WallpaperTile);\n","import React, {\n FC, memo, useEffect, useCallback, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ThemeKey, UPLOADING_WALLPAPER_SLUG } from '../../../types';\nimport { ApiWallpaper } from '../../../api/types';\n\nimport { DARK_THEME_PATTERN_COLOR, DEFAULT_PATTERN_COLOR } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { getAverageColor, getPatternColor, rgb2hex } from '../../../util/colors';\nimport { selectTheme } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Loading from '../../ui/Loading';\nimport WallpaperTile from './WallpaperTile';\n\nimport './SettingsGeneralBackground.scss';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n background?: string;\n isBlurred?: boolean;\n loadedWallpapers?: ApiWallpaper[];\n theme: ThemeKey;\n};\n\ntype DispatchProps = Pick;\n\nconst SUPPORTED_TYPES = 'image/jpeg';\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst SettingsGeneralBackground: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n background,\n isBlurred,\n loadedWallpapers,\n theme,\n loadWallpapers,\n uploadWallpaper,\n setThemeSettings,\n}) => {\n const themeRef = useRef();\n themeRef.current = theme;\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadWallpapers();\n });\n }, [loadWallpapers]);\n\n const handleFileSelect = useCallback((e: Event) => {\n const { files } = e.target as HTMLInputElement;\n\n if (files && files.length > 0) {\n uploadWallpaper(files[0]);\n }\n }, [uploadWallpaper]);\n\n const handleUploadWallpaper = useCallback(() => {\n openSystemFilesDialog(SUPPORTED_TYPES, handleFileSelect, true);\n }, [handleFileSelect]);\n\n const handleSetColor = useCallback(() => {\n onScreenSelect(SettingsScreens.GeneralChatBackgroundColor);\n }, [onScreenSelect]);\n\n const handleResetToDefault = useCallback(() => {\n setThemeSettings({\n theme,\n background: undefined,\n backgroundColor: undefined,\n isBlurred: true,\n patternColor: theme === 'dark' ? DARK_THEME_PATTERN_COLOR : DEFAULT_PATTERN_COLOR,\n });\n }, [setThemeSettings, theme]);\n\n const handleWallPaperSelect = useCallback((slug: string) => {\n setThemeSettings({ theme: themeRef.current, background: slug });\n const currentWallpaper = loadedWallpapers && loadedWallpapers.find((wallpaper) => wallpaper.slug === slug);\n if (currentWallpaper && currentWallpaper.document.thumbnail) {\n getAverageColor(currentWallpaper.document.thumbnail.dataUri)\n .then((color) => {\n const patternColor = getPatternColor(color);\n const rgbColor = `#${rgb2hex(color)}`;\n setThemeSettings({ theme: themeRef.current, backgroundColor: rgbColor, patternColor });\n });\n }\n }, [loadedWallpapers, setThemeSettings]);\n\n const handleWallPaperBlurChange = useCallback((e: React.ChangeEvent) => {\n setThemeSettings({ theme: themeRef.current, isBlurred: e.target.checked });\n }, [setThemeSettings]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.GeneralChatBackground);\n\n const isUploading = loadedWallpapers && loadedWallpapers[0] && loadedWallpapers[0].slug === UPLOADING_WALLPAPER_SLUG;\n\n return (\n
\n
\n \n {lang('UploadImage')}\n \n\n \n {lang('SetColor')}\n \n\n \n {lang('ThemeResetToDefaults')}\n \n\n \n
\n\n {loadedWallpapers ? (\n
\n {loadedWallpapers.map((wallpaper) => (\n \n ))}\n
\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const theme = selectTheme(global);\n const { background, isBlurred } = global.settings.themes[theme] || {};\n const { loadedWallpapers } = global.settings;\n\n return {\n background,\n isBlurred,\n loadedWallpapers,\n theme,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadWallpapers', 'uploadWallpaper', 'setThemeSettings',\n ]),\n)(SettingsGeneralBackground));\n","import { ChangeEvent, MutableRefObject, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens, ThemeKey } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport {\n getPatternColor, hex2rgb, hsb2rgb, rgb2hex, rgb2hsb,\n} from '../../../util/colors';\nimport { captureEvents, RealTouchEvent } from '../../../util/captureEvents';\nimport { selectTheme } from '../../../modules/selectors';\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport InputText from '../../ui/InputText';\n\nimport './SettingsGeneralBackgroundColor.scss';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n backgroundColor?: string;\n theme: ThemeKey;\n};\n\ntype DispatchProps = Pick;\n\ninterface CanvasRects {\n colorRect: {\n offsetLeft: number;\n top: number;\n width: number;\n height: number;\n };\n hueRect: {\n offsetLeft: number;\n width: number;\n };\n}\n\nconst DEFAULT_HSB = rgb2hsb(hex2rgb('e6ebee'));\nconst PREDEFINED_COLORS = [\n '#e6ebee', '#b2cee1', '#008dd0', '#c6e7cb', '#c4e1a6', '#60b16e',\n '#ccd0af', '#a6a997', '#7a7072', '#fdd7af', '#fdb76e', '#dd8851',\n];\n\nconst SettingsGeneralBackground: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n theme,\n backgroundColor,\n setThemeSettings,\n}) => {\n const themeRef = useRef();\n themeRef.current = theme;\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const colorPickerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const huePickerRef = useRef(null);\n const isFirstRunRef = useRef(true);\n\n const [hsb, setHsb] = useState(getInitialHsb(backgroundColor));\n // Cache for drag handlers\n const hsbRef = useRef(hsb);\n useEffect(() => {\n hsbRef.current = hsb;\n }, [hsb]);\n\n const [isDragging, markIsDragging, unmarkIsDragging] = useFlag();\n const [rgbInput, setRgbInput] = useState('');\n const [hexInput, setHexInput] = useState('');\n\n const rectsRef = useRef();\n const colorCtxRef = useRef();\n\n // Setup: cache rects, subscribe for drag events\n useEffect(() => {\n // We use `offsetLeft` instead of `left` to support screen transition\n const colorRect = {\n offsetLeft: colorPickerRef.current!.offsetLeft,\n ...pick(colorPickerRef.current!.getBoundingClientRect(), ['top', 'width', 'height']),\n };\n const hueRect = {\n offsetLeft: huePickerRef.current!.offsetLeft,\n ...pick(huePickerRef.current!.getBoundingClientRect(), ['width']),\n };\n\n rectsRef.current = { colorRect, hueRect };\n\n function handleColorDrag(e: MouseEvent | RealTouchEvent) {\n const colorPosition = [\n Math.min(Math.max(0, e.pageX! - colorRect.offsetLeft), colorRect.width - 1),\n Math.min(Math.max(0, e.pageY! - colorRect.top + containerRef.current!.scrollTop), colorRect.height - 1),\n ];\n\n const { huePosition } = hsb2positions(hsbRef.current, rectsRef.current!);\n\n setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!));\n markIsDragging();\n }\n\n captureEvents(colorPickerRef.current!, {\n onCapture: handleColorDrag,\n onDrag: handleColorDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n withCursor: true,\n });\n\n function handleHueDrag(e: MouseEvent | RealTouchEvent) {\n const { colorPosition } = hsb2positions(hsbRef.current, rectsRef.current!);\n const huePosition = Math.min(Math.max(0, e.pageX! - hueRect.offsetLeft), hueRect.width - 1);\n\n setHsb(positions2hsb({ colorPosition, huePosition }, rectsRef.current!));\n markIsDragging();\n }\n\n captureEvents(huePickerRef.current!, {\n onCapture: handleHueDrag,\n onDrag: handleHueDrag,\n onRelease: unmarkIsDragging,\n onClick: unmarkIsDragging,\n withCursor: true,\n });\n }, [markIsDragging, unmarkIsDragging]);\n\n const { colorPosition = [0, 0], huePosition = 0 } = rectsRef.current ? hsb2positions(hsb, rectsRef.current) : {};\n const hex = rgb2hex(hsb2rgb(hsb));\n const hue = hsb[0];\n const hueHex = rgb2hex(hsb2rgb([hue, 1, 1]));\n\n // Save value and update inputs when HSL changes\n useEffect(() => {\n const rgb = hsb2rgb(hsb);\n const color = `#${rgb2hex(rgb)}`;\n\n setRgbInput(rgb.join(', '));\n setHexInput(color);\n\n if (!isFirstRunRef.current) {\n const patternColor = getPatternColor(rgb);\n setThemeSettings({\n theme: themeRef.current,\n background: undefined,\n backgroundColor: color,\n patternColor,\n });\n }\n isFirstRunRef.current = false;\n }, [hsb, setThemeSettings]);\n\n // Redraw color picker when hue changes\n useEffect(() => {\n drawColor(colorPickerRef.current!.firstChild as HTMLCanvasElement, hue, colorCtxRef, rectsRef);\n }, [hue]);\n\n // Initially draw hue picker\n useEffect(() => {\n drawHue(huePickerRef.current!.firstChild as HTMLCanvasElement);\n }, []);\n\n const handleRgbChange = useCallback((e: ChangeEvent) => {\n const rgbValue = e.currentTarget.value.replace(/[^\\d, ]/g, '').slice(0, 13);\n\n if (rgbValue.match(/^\\d{1,3},\\s?\\d{1,3},\\s?\\d{1,3}$/)) {\n const rgb = rgbValue.split(',').map((channel) => Number(channel.trim())) as [number, number, number];\n setHsb(rgb2hsb(rgb));\n }\n\n e.currentTarget.value = rgbValue;\n }, []);\n\n const handleHexChange = useCallback((e: ChangeEvent) => {\n const hexValue = e.currentTarget.value.replace(/[^0-9a-fA-F]/g, '').slice(0, 6);\n\n if (hexValue.match(/^#?[0-9a-fA-F]{6}$/)) {\n setHsb(rgb2hsb(hex2rgb(hexValue.replace('#', ''))));\n }\n\n e.currentTarget.value = hexValue;\n }, []);\n\n const handlePredefinedColorClick = useCallback((e: React.MouseEvent) => {\n setHsb(rgb2hsb(hex2rgb(e.currentTarget.dataset.color!.replace('#', ''))));\n }, []);\n\n const className = buildClassName(\n 'SettingsGeneralBackgroundColor settings-content custom-scroll',\n isDragging && 'is-dragging',\n );\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.GeneralChatBackgroundColor);\n\n return (\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n {PREDEFINED_COLORS.map((color) => (\n \n ))}\n
\n
\n );\n};\n\nfunction getInitialHsb(backgroundColor?: string) {\n return backgroundColor && backgroundColor.startsWith('#')\n ? rgb2hsb(hex2rgb(backgroundColor.replace('#', '')))\n : DEFAULT_HSB;\n}\n\nfunction hsb2positions(hsb: [number, number, number], rects: CanvasRects) {\n return {\n colorPosition: [\n Math.round((hsb[1]) * (rects.colorRect.width - 1)),\n Math.round((1 - hsb[2]) * (rects.colorRect.height - 1)),\n ],\n huePosition: Math.round(hsb[0] * (rects.hueRect.width - 1)),\n };\n}\n\nfunction positions2hsb(\n { colorPosition, huePosition }: { colorPosition: number[]; huePosition: number },\n rects: CanvasRects,\n): [number, number, number] {\n return [\n huePosition / (rects.hueRect.width - 1),\n colorPosition[0] / (rects.colorRect.width - 1),\n 1 - colorPosition[1] / (rects.colorRect.height - 1),\n ];\n}\n\nfunction drawColor(\n canvas: HTMLCanvasElement,\n hue: number,\n colorCtxRef: MutableRefObject,\n rectsRef: RefObject,\n) {\n let w: number;\n let h: number;\n let ctx: CanvasRenderingContext2D;\n\n if (!colorCtxRef.current || !rectsRef.current) {\n // First run\n w = canvas.offsetWidth;\n h = canvas.offsetHeight;\n ctx = canvas.getContext('2d')!;\n\n canvas.width = w;\n canvas.height = h;\n\n colorCtxRef.current = ctx;\n } else {\n w = rectsRef.current.colorRect.width;\n h = rectsRef.current.colorRect.height;\n ctx = colorCtxRef.current;\n }\n\n const imgData = ctx!.createImageData(w, h);\n const pixels = imgData.data;\n const col = hsb2rgb([hue, 1, 1]);\n\n let index = 0;\n\n for (let y = 0; y < h; y++) {\n const perY = 1 - y / (h - 1);\n const st = [255 * perY, 255 * perY, 255 * perY];\n const ed = [col[0] * perY, col[1] * perY, col[2] * perY];\n for (let x = 0; x < w; x++) {\n const perX = x / (w - 1);\n pixels[index++] = st[0] + (ed[0] - st[0]) * perX;\n pixels[index++] = st[1] + (ed[1] - st[1]) * perX;\n pixels[index++] = st[2] + (ed[2] - st[2]) * perX;\n pixels[index++] = 255;\n }\n }\n\n ctx!.putImageData(imgData, 0, 0);\n}\n\nfunction drawHue(canvas: HTMLCanvasElement) {\n const w = canvas.offsetWidth;\n const h = 1;\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d')!;\n\n const imgData = ctx.createImageData(w, h);\n const pixels = imgData.data;\n\n let index = 0;\n\n for (let x = 0; x < w; x++) {\n const hue = x / (w - 1);\n const rgb = hsb2rgb([hue, 1, 1]);\n /* eslint-disable prefer-destructuring */\n pixels[index++] = rgb[0];\n pixels[index++] = rgb[1];\n pixels[index++] = rgb[2];\n /* eslint-enable prefer-destructuring */\n pixels[index++] = 255;\n }\n\n ctx.putImageData(imgData, 0, 0);\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const theme = selectTheme(global);\n const { backgroundColor } = global.settings.themes[theme] || {};\n return {\n backgroundColor,\n theme,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setThemeSettings']),\n)(SettingsGeneralBackground));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Checkbox from '../../ui/Checkbox';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n hasPrivateChatsNotifications: boolean;\n hasPrivateChatsMessagePreview: boolean;\n hasGroupNotifications: boolean;\n hasGroupMessagePreview: boolean;\n hasBroadcastNotifications: boolean;\n hasBroadcastMessagePreview: boolean;\n hasContactJoinedNotifications: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsNotifications: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n hasPrivateChatsNotifications,\n hasPrivateChatsMessagePreview,\n hasGroupNotifications,\n hasGroupMessagePreview,\n hasBroadcastNotifications,\n hasBroadcastMessagePreview,\n hasContactJoinedNotifications,\n loadNotificationSettings,\n updateContactSignUpNotification,\n updateNotificationSettings,\n}) => {\n useEffect(() => {\n loadNotificationSettings();\n }, [loadNotificationSettings]);\n\n const handleSettingsChange = useCallback((\n e: ChangeEvent,\n peerType: 'contact' | 'group' | 'broadcast',\n setting: 'silent' | 'showPreviews',\n ) => {\n const currentIsSilent = peerType === 'contact'\n ? !hasPrivateChatsNotifications\n : !(peerType === 'group' ? hasGroupNotifications : hasBroadcastNotifications);\n const currentShouldShowPreviews = peerType === 'contact'\n ? hasPrivateChatsMessagePreview\n : (peerType === 'group' ? hasGroupMessagePreview : hasBroadcastMessagePreview);\n\n updateNotificationSettings({\n peerType,\n ...(setting === 'silent' && { isSilent: !e.target.checked, shouldShowPreviews: currentShouldShowPreviews }),\n ...(setting === 'showPreviews' && { shouldShowPreviews: e.target.checked, isSilent: currentIsSilent }),\n });\n }, [\n hasBroadcastMessagePreview, hasBroadcastNotifications,\n hasGroupMessagePreview, hasGroupNotifications,\n hasPrivateChatsMessagePreview, hasPrivateChatsNotifications,\n updateNotificationSettings,\n ]);\n\n const handleContactNotificationChange = useCallback((e: ChangeEvent) => {\n updateContactSignUpNotification({\n isSilent: !e.target.checked,\n });\n }, [updateContactSignUpNotification]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Notifications);\n\n return (\n
\n
\n

\n {lang('AutodownloadPrivateChats')}\n

\n\n { handleSettingsChange(e, 'contact', 'silent'); }}\n />\n { handleSettingsChange(e, 'contact', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('FilterGroups')}

\n\n { handleSettingsChange(e, 'group', 'silent'); }}\n />\n { handleSettingsChange(e, 'group', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('FilterChannels')}

\n\n { handleSettingsChange(e, 'broadcast', 'silent'); }}\n />\n { handleSettingsChange(e, 'broadcast', 'showPreviews'); }}\n />\n
\n\n
\n

{lang('PhoneOther')}

\n\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global): StateProps => {\n return {\n hasPrivateChatsNotifications: Boolean(global.settings.byKey.hasPrivateChatsNotifications),\n hasPrivateChatsMessagePreview: Boolean(global.settings.byKey.hasPrivateChatsMessagePreview),\n hasGroupNotifications: Boolean(global.settings.byKey.hasGroupNotifications),\n hasGroupMessagePreview: Boolean(global.settings.byKey.hasGroupMessagePreview),\n hasBroadcastNotifications: Boolean(global.settings.byKey.hasBroadcastNotifications),\n hasBroadcastMessagePreview: Boolean(global.settings.byKey.hasBroadcastMessagePreview),\n hasContactJoinedNotifications: Boolean(global.settings.byKey.hasContactJoinedNotifications),\n };\n},\n(setGlobal, actions): DispatchProps => pick(actions, [\n 'loadNotificationSettings',\n 'updateContactSignUpNotification',\n 'updateNotificationSettings',\n]))(SettingsNotifications));\n","import React, { FC, memo, useEffect } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { PrivacyVisibility, SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n hasPassword?: boolean;\n blockedCount: number;\n sessionsCount: number;\n isSensitiveEnabled?: boolean;\n canChangeSensitive?: boolean;\n visibilityPrivacyPhoneNumber?: PrivacyVisibility;\n visibilityPrivacyLastSeen?: PrivacyVisibility;\n visibilityPrivacyProfilePhoto?: PrivacyVisibility;\n visibilityPrivacyForwarding?: PrivacyVisibility;\n visibilityPrivacyGroupChats?: PrivacyVisibility;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacy: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n hasPassword,\n blockedCount,\n sessionsCount,\n isSensitiveEnabled,\n canChangeSensitive,\n visibilityPrivacyPhoneNumber,\n visibilityPrivacyLastSeen,\n visibilityPrivacyProfilePhoto,\n visibilityPrivacyForwarding,\n visibilityPrivacyGroupChats,\n loadPrivacySettings,\n loadBlockedContacts,\n loadAuthorizations,\n loadContentSettings,\n updateContentSettings,\n}) => {\n useEffect(() => {\n loadBlockedContacts();\n loadAuthorizations();\n loadPrivacySettings();\n loadContentSettings();\n }, [loadBlockedContacts, loadAuthorizations, loadPrivacySettings, loadContentSettings]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Privacy);\n\n function getVisibilityValue(visibility?: PrivacyVisibility) {\n switch (visibility) {\n case 'everybody':\n return lang('P2PEverybody');\n\n case 'contacts':\n return lang('P2PContacts');\n\n case 'nobody':\n return lang('P2PNobody');\n }\n\n return undefined;\n }\n\n return (\n
\n
\n onScreenSelect(SettingsScreens.PrivacyBlockedUsers)}\n >\n
\n {lang('BlockedUsers')}\n {blockedCount > 0 && (\n \n {lang('Users', blockedCount)}\n \n )}\n
\n \n onScreenSelect(\n hasPassword ? SettingsScreens.TwoFaEnabled : SettingsScreens.TwoFaDisabled,\n )}\n >\n
\n {lang('TwoStepVerification')}\n \n {lang(hasPassword ? 'PasswordOn' : 'PasswordOff')}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyActiveSessions)}\n >\n
\n {lang('SessionsTitle')}\n {sessionsCount > 0 && (\n \n {sessionsCount === 1 ? '1 session' : `${sessionsCount} sessions`}\n \n )}\n
\n \n
\n\n
\n

{lang('PrivacyTitle')}

\n\n onScreenSelect(SettingsScreens.PrivacyPhoneNumber)}\n >\n
\n {lang('PrivacyPhoneTitle')}\n \n {getVisibilityValue(visibilityPrivacyPhoneNumber)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyLastSeen)}\n >\n
\n {lang('LastSeenTitle')}\n \n {getVisibilityValue(visibilityPrivacyLastSeen)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyProfilePhoto)}\n >\n
\n {lang('PrivacyProfilePhotoTitle')}\n \n {getVisibilityValue(visibilityPrivacyProfilePhoto)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyForwarding)}\n >\n
\n {lang('PrivacyForwardsTitle')}\n \n {getVisibilityValue(visibilityPrivacyForwarding)}\n \n
\n \n onScreenSelect(SettingsScreens.PrivacyGroupChats)}\n >\n
\n {lang('WhoCanAddMe')}\n \n {getVisibilityValue(visibilityPrivacyGroupChats)}\n \n
\n \n
\n\n {canChangeSensitive && (\n
\n

\n {lang('lng_settings_sensitive_title')}\n

\n \n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: {\n byKey: { hasPassword, isSensitiveEnabled, canChangeSensitive },\n privacy,\n },\n blocked,\n activeSessions,\n } = global;\n\n return {\n hasPassword,\n blockedCount: blocked.totalCount,\n sessionsCount: activeSessions.length,\n isSensitiveEnabled,\n canChangeSensitive,\n visibilityPrivacyPhoneNumber: privacy.phoneNumber && privacy.phoneNumber.visibility,\n visibilityPrivacyLastSeen: privacy.lastSeen && privacy.lastSeen.visibility,\n visibilityPrivacyProfilePhoto: privacy.profilePhoto && privacy.profilePhoto.visibility,\n visibilityPrivacyForwarding: privacy.forwards && privacy.forwards.visibility,\n visibilityPrivacyGroupChats: privacy.chatInvite && privacy.chatInvite.visibility,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadBlockedContacts', 'loadAuthorizations', 'loadPrivacySettings', 'loadContentSettings', 'updateContentSettings',\n ]),\n)(SettingsPrivacy));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ISettings, SettingsScreens } from '../../../types';\nimport { ApiLanguage } from '../../../api/types';\n\nimport { setLanguage } from '../../../util/langProvider';\nimport { pick } from '../../../util/iteratees';\n\nimport RadioGroup from '../../ui/RadioGroup';\nimport Loading from '../../ui/Loading';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst SettingsLanguage: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n languages,\n language,\n loadLanguages,\n setSettingOption,\n}) => {\n const [selectedLanguage, setSelectedLanguage] = useState(language);\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n // TODO Throttle\n useEffect(() => {\n loadLanguages();\n }, [loadLanguages]);\n\n const handleChange = useCallback((langCode: string) => {\n setSelectedLanguage(langCode);\n markIsLoading();\n\n setLanguage(langCode, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: langCode });\n });\n }, [markIsLoading, unmarkIsLoading, setSettingOption]);\n\n const options = useMemo(() => {\n return languages ? buildOptions(languages) : undefined;\n }, [languages]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.Language);\n\n return (\n
\n {options ? (\n \n ) : (\n \n )}\n
\n );\n};\n\nfunction buildOptions(languages: ApiLanguage[]) {\n const currentLangCode = (window.navigator.language || 'en').toLowerCase();\n const shortLangCode = currentLangCode.substr(0, 2);\n\n return languages.map(({ langCode, nativeName, name }) => ({\n value: langCode,\n label: nativeName,\n subLabel: name,\n })).sort((a) => {\n return currentLangCode && (a.value === currentLangCode || a.value === shortLangCode) ? -1 : 0;\n });\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n languages: global.settings.byKey.languages,\n language: global.settings.byKey.language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadLanguages', 'setSettingOption',\n ]),\n)(SettingsLanguage));\n","import { ApiPrivacyKey, SettingsScreens } from '../../../../types';\n\nexport function getPrivacyKey(screen: SettingsScreens): ApiPrivacyKey | undefined {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n return 'phoneNumber';\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n return 'lastSeen';\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n return 'profilePhoto';\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n return 'forwards';\n case SettingsScreens.PrivacyGroupChats:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return 'chatInvite';\n }\n\n return undefined;\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\nimport { pick } from '../../../util/iteratees';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport { getPrivacyKey } from './helper/privacy';\n\ntype OwnProps = {\n screen: SettingsScreens;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Partial & {\n chatsById?: Record;\n usersById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibility: FC = ({\n screen,\n isActive,\n onScreenSelect,\n onReset,\n visibility,\n allowUserIds,\n allowChatIds,\n blockUserIds,\n blockChatIds,\n chatsById,\n setPrivacyVisibility,\n}) => {\n const lang = useLang();\n\n const visibilityOptions = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyGroupChats:\n return [\n { value: 'everybody', label: lang('P2PEverybody') },\n { value: 'contacts', label: lang('P2PContacts') },\n ];\n\n default:\n return [\n { value: 'everybody', label: lang('P2PEverybody') },\n { value: 'contacts', label: lang('P2PContacts') },\n { value: 'nobody', label: lang('P2PNobody') },\n ];\n }\n }, [lang, screen]);\n\n const exceptionLists = {\n shouldShowDenied: visibility !== 'nobody',\n shouldShowAllowed: visibility !== 'everybody',\n };\n\n const privacyKey = getPrivacyKey(screen);\n\n const headerText = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return lang('PrivacyPhoneTitle');\n case SettingsScreens.PrivacyLastSeen:\n return lang('LastSeenTitle');\n case SettingsScreens.PrivacyProfilePhoto:\n return lang('PrivacyProfilePhotoTitle');\n case SettingsScreens.PrivacyForwarding:\n return lang('PrivacyForwardsTitle');\n case SettingsScreens.PrivacyGroupChats:\n return lang('WhoCanAddMe');\n default:\n return undefined;\n }\n }, [lang, screen]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n const descriptionText = useMemo(() => {\n switch (screen) {\n case SettingsScreens.PrivacyLastSeen:\n return lang('CustomHelp');\n default:\n return undefined;\n }\n }, [lang, screen]);\n\n const allowedContactsScreen = (() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return SettingsScreens.PrivacyPhoneNumberAllowedContacts;\n case SettingsScreens.PrivacyLastSeen:\n return SettingsScreens.PrivacyLastSeenAllowedContacts;\n case SettingsScreens.PrivacyProfilePhoto:\n return SettingsScreens.PrivacyProfilePhotoAllowedContacts;\n case SettingsScreens.PrivacyForwarding:\n return SettingsScreens.PrivacyForwardingAllowedContacts;\n default:\n return SettingsScreens.PrivacyGroupChatsAllowedContacts;\n }\n })();\n\n const deniedContactsScreen = (() => {\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n return SettingsScreens.PrivacyPhoneNumberDeniedContacts;\n case SettingsScreens.PrivacyLastSeen:\n return SettingsScreens.PrivacyLastSeenDeniedContacts;\n case SettingsScreens.PrivacyProfilePhoto:\n return SettingsScreens.PrivacyProfilePhotoDeniedContacts;\n case SettingsScreens.PrivacyForwarding:\n return SettingsScreens.PrivacyForwardingDeniedContacts;\n default:\n return SettingsScreens.PrivacyGroupChatsDeniedContacts;\n }\n })();\n\n const allowedCount = useMemo(() => {\n if (!allowUserIds || !allowChatIds || !chatsById) {\n return 0;\n }\n\n return allowChatIds.reduce((result, chatId) => {\n return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0);\n }, allowUserIds.length);\n }, [allowChatIds, allowUserIds, chatsById]);\n\n const blockCount = useMemo(() => {\n if (!blockUserIds || !blockChatIds || !chatsById) {\n return 0;\n }\n\n return blockChatIds.reduce((result, chatId) => {\n return result + (chatsById[chatId] ? chatsById[chatId].membersCount! : 0);\n }, blockUserIds.length);\n }, [blockChatIds, blockUserIds, chatsById]);\n\n const handleVisibilityChange = useCallback((value) => {\n setPrivacyVisibility({\n privacyKey,\n visibility: value,\n });\n }, [privacyKey, setPrivacyVisibility]);\n\n return (\n
\n
\n

{headerText}

\n\n \n\n {descriptionText && (\n

{descriptionText}

\n )}\n
\n\n
\n

{lang('PrivacyExceptions')}

\n\n {exceptionLists.shouldShowAllowed && (\n { onScreenSelect(allowedContactsScreen); }}\n >\n
\n {allowedCount > 0 && +{allowedCount}}\n {lang('AlwaysShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n {exceptionLists.shouldShowDenied && (\n { onScreenSelect(deniedContactsScreen); }}\n >\n
\n {blockCount > 0 && −{blockCount}}\n {lang('NeverShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { screen }): StateProps => {\n let privacySettings: ApiPrivacySettings | undefined;\n\n const {\n chats: { byId: chatsById },\n settings: { privacy },\n } = global;\n\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumber:\n privacySettings = privacy.phoneNumber;\n break;\n\n case SettingsScreens.PrivacyLastSeen:\n privacySettings = privacy.lastSeen;\n break;\n\n case SettingsScreens.PrivacyProfilePhoto:\n privacySettings = privacy.profilePhoto;\n break;\n\n case SettingsScreens.PrivacyForwarding:\n privacySettings = privacy.forwards;\n break;\n\n case SettingsScreens.PrivacyGroupChats:\n privacySettings = privacy.chatInvite;\n break;\n }\n\n if (!privacySettings) {\n return {};\n }\n\n return {\n ...privacySettings,\n chatsById,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacyVisibility']),\n)(SettingsPrivacyVisibility));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiSession } from '../../../api/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { formatPastTimeShort } from '../../../util/dateFormat';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n activeSessions: ApiSession[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyActiveSessions: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n activeSessions,\n loadAuthorizations,\n terminateAuthorization,\n terminateAllAuthorizations,\n}) => {\n const [isConfirmTerminateAllDialogOpen, openConfirmTerminateAllDialog, closeConfirmTerminateAllDialog] = useFlag();\n useEffect(() => {\n loadAuthorizations();\n }, [loadAuthorizations]);\n\n const handleTerminateSessionClick = useCallback((hash: string) => {\n terminateAuthorization({ hash });\n }, [terminateAuthorization]);\n\n const handleTerminateAllSessions = useCallback(() => {\n closeConfirmTerminateAllDialog();\n terminateAllAuthorizations();\n }, [closeConfirmTerminateAllDialog, terminateAllAuthorizations]);\n\n const currentSession = useMemo(() => {\n return activeSessions.find((session) => session.isCurrent);\n }, [activeSessions]);\n\n const otherSessions = useMemo(() => {\n return activeSessions.filter((session) => !session.isCurrent);\n }, [activeSessions]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.PrivacyActiveSessions);\n\n function renderCurrentSession(session: ApiSession) {\n return (\n
\n

\n {lang('AuthSessions.CurrentSession')}\n

\n\n \n
\n {session.appName}\n {getDeviceEnvironment(session)}\n {session.ip} - {getLocation(session)}\n
\n
\n\n \n {lang('TerminateAllSessions')}\n \n
\n );\n }\n\n function renderOtherSessions(sessions: ApiSession[]) {\n return (\n
\n

\n {lang('OtherSessions')}\n

\n\n {sessions.map(renderSession)}\n
\n );\n }\n\n function renderSession(session: ApiSession) {\n return (\n {\n handleTerminateSessionClick(session.hash);\n },\n }]}\n >\n
\n {formatPastTimeShort(lang, session.dateActive * 1000)}\n {session.appName}\n {getDeviceEnvironment(session)}\n {session.ip} - {getLocation(session)}\n
\n \n );\n }\n\n return (\n
\n {currentSession && renderCurrentSession(currentSession)}\n {otherSessions && renderOtherSessions(otherSessions)}\n {otherSessions && (\n \n )}\n
\n );\n};\n\nfunction getLocation(session: ApiSession) {\n return [session.region, session.country].filter(Boolean).join(', ');\n}\n\nfunction getDeviceEnvironment(session: ApiSession) {\n return `${session.deviceModel}${session.deviceModel ? ', ' : ''} ${session.platform} ${session.systemVersion}`;\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n activeSessions: global.activeSessions,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadAuthorizations', 'terminateAuthorization', 'terminateAllAuthorizations',\n ]),\n)(SettingsPrivacyActiveSessions));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { CHAT_HEIGHT_PX } from '../../../config';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport { pick } from '../../../util/iteratees';\nimport {\n getChatTitle, getUserFullName, isChatPrivate,\n} from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport buildClassName from '../../../util/buildClassName';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Avatar from '../../common/Avatar';\nimport Loading from '../../ui/Loading';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n chatsByIds: Record;\n usersByIds: Record;\n blockedIds: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyBlockedUsers: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n chatsByIds,\n usersByIds,\n blockedIds,\n unblockContact,\n}) => {\n const handleUnblockClick = useCallback((contactId: number) => {\n unblockContact({ contactId });\n }, [unblockContact]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.PrivacyBlockedUsers);\n\n function renderContact(contactId: number, i: number, viewportOffset: number) {\n const isPrivate = isChatPrivate(contactId);\n const user = isPrivate ? usersByIds[contactId] : undefined;\n const chat = !isPrivate ? chatsByIds[contactId] : undefined;\n\n const className = buildClassName(\n 'Chat chat-item-clickable blocked-list-item',\n isPrivate ? 'private' : 'group',\n );\n\n return (\n {\n handleUnblockClick(contactId);\n },\n }]}\n style={`top: ${(viewportOffset + i) * CHAT_HEIGHT_PX}px;`}\n >\n \n
\n

{renderText((isPrivate ? getUserFullName(user) : getChatTitle(lang, chat!)) || '')}

\n {user && user.phoneNumber && (\n
{formatPhoneNumberWithCode(user.phoneNumber)}
\n )}\n {user && !user.phoneNumber && user.username && (\n
@{user.username}
\n )}\n
\n \n );\n }\n\n return (\n
\n
\n
\n

\n {lang('BlockedUsersInfo')}\n

\n
\n\n
\n {blockedIds && blockedIds.length ? (\n
\n {blockedIds!.map((contactId, i) => renderContact(contactId, i, 0))}\n
\n ) : blockedIds && !blockedIds.length ? (\n
\n List is empty\n
\n ) : (\n \n )}\n
\n
\n\n {\n }}\n className=\"not-implemented\"\n ariaLabel=\"Add a blocked user\"\n >\n \n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: {\n byId: chatsByIds,\n },\n users: {\n byId: usersByIds,\n },\n blocked: {\n ids,\n },\n } = global;\n\n return {\n chatsByIds,\n usersByIds,\n blockedIds: ids,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['unblockContact']),\n)(SettingsPrivacyBlockedUsers));\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport ListItem from '../../../ui/ListItem';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaEnabled: FC = ({\n isActive, onReset, animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaEnabled);\n\n return (\n
\n
\n \n\n

\n {renderText(lang('EnabledPasswordText'), ['br'])}\n

\n
\n\n
\n onScreenSelect(SettingsScreens.TwoFaChangePasswordCurrent)}\n >\n {lang('ChangePassword')}\n \n onScreenSelect(SettingsScreens.TwoFaTurnOff)}\n >\n {lang('TurnPasswordOff')}\n \n onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCurrentPassword)}\n >\n {lang('SetRecoveryEmail')}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🔐'),\n };\n})(SettingsTwoFaEnabled));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../../../lib/teact/teact';\n\nimport { SettingsScreens } from '../../../../types';\n\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport PasswordMonkey from '../../../common/PasswordMonkey';\nimport PasswordForm from '../../../common/PasswordForm';\n\ntype OwnProps = {\n screen: SettingsScreens;\n error?: string;\n isLoading?: boolean;\n expectedPassword?: string;\n placeholder?: string;\n hint?: string;\n submitLabel?: string;\n clearError?: NoneToVoidFunction;\n onSubmit: (password: string) => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\nconst EQUAL_PASSWORD_ERROR = 'Passwords Should Be Equal';\n\nconst SettingsTwoFaPassword: FC = ({\n screen,\n isActive,\n onScreenSelect,\n onReset,\n error,\n isLoading,\n expectedPassword,\n placeholder = 'Current Password',\n hint,\n submitLabel,\n clearError,\n onSubmit,\n}) => {\n const [validationError, setValidationError] = useState('');\n const [shouldShowPassword, setShouldShowPassword] = useState(false);\n\n const handleSubmit = useCallback((newPassword) => {\n if (expectedPassword && newPassword !== expectedPassword) {\n setValidationError(EQUAL_PASSWORD_ERROR);\n } else {\n onSubmit(newPassword);\n }\n }, [onSubmit, expectedPassword]);\n\n const handleClearError = useCallback(() => {\n if (clearError) {\n clearError();\n }\n setValidationError('');\n }, [clearError]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n return (\n
\n
\n \n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(SettingsTwoFaPassword);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n onStart: NoneToVoidFunction;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaStart: FC = ({\n isActive, onScreenSelect, onReset, animatedEmoji, onStart,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaDisabled);\n\n return (\n
\n
\n \n\n

\n {lang('SetAdditionalPasswordInfo')}\n

\n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🔐'),\n };\n})(SettingsTwoFaStart));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useFlag from '../../../../hooks/useFlag';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport Button from '../../../ui/Button';\nimport Modal from '../../../ui/Modal';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport InputText from '../../../ui/InputText';\nimport renderText from '../../../common/helpers/renderText';\n\ntype OwnProps = {\n icon: 'hint' | 'email';\n type?: 'text' | 'email';\n isLoading?: boolean;\n error?: string;\n placeholder: string;\n shouldConfirm?: boolean;\n clearError?: NoneToVoidFunction;\n onSubmit: (value?: string) => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n screen: SettingsScreens;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst SettingsTwoFaSkippableForm: FC = ({\n animatedEmoji,\n type = 'text',\n isLoading,\n error,\n placeholder,\n shouldConfirm,\n clearError,\n onSubmit,\n isActive,\n onScreenSelect,\n onReset,\n screen,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [value, setValue] = useState('');\n const [isConfirmShown, markIsConfirmShown, unmarkIsConfirmShown] = useFlag(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n const handleInputChange = (e: React.ChangeEvent) => {\n if (error && clearError) {\n clearError();\n }\n\n setValue(e.target.value);\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!inputRef.current) {\n return;\n }\n\n onSubmit(value);\n };\n\n const handleSkip = () => {\n onSubmit();\n };\n\n const handleSkipConfirm = () => {\n unmarkIsConfirmShown();\n onSubmit();\n };\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n return (\n
\n
\n \n
\n\n
\n
\n \n\n {value ? (\n \n ) : (\n \n {lang('YourEmailSkip')}\n \n )}\n \n {shouldConfirm && (\n \n {renderText(lang('YourEmailSkipWarningText'), ['br', 'simple_markdown'])}\n
\n \n {lang('YourEmailSkip')}\n \n \n {lang('Cancel')}\n \n
\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal((global, { icon }) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, icon === 'email' ? '💌' : '💡'),\n };\n})(SettingsTwoFaSkippableForm));\n","import React, { FC, memo } from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport Button from '../../../ui/Button';\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n};\n\nconst SettingsTwoFaCongratulations: FC = ({\n isActive, onReset, animatedEmoji, onScreenSelect,\n}) => {\n const lang = useLang();\n\n const handleClick = () => {\n onScreenSelect(SettingsScreens.Privacy);\n };\n\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.TwoFaCongratulations);\n\n return (\n
\n
\n \n\n

\n {lang('TwoStepVerificationPasswordSetInfo')}\n

\n
\n\n
\n \n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '🥳'),\n };\n})(SettingsTwoFaCongratulations));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../../util/environment';\nimport { selectAnimatedEmoji } from '../../../../modules/selectors';\nimport useLang from '../../../../hooks/useLang';\nimport useHistoryBack from '../../../../hooks/useHistoryBack';\n\nimport AnimatedEmoji from '../../../common/AnimatedEmoji';\nimport InputText from '../../../ui/InputText';\nimport Loading from '../../../ui/Loading';\n\ntype OwnProps = {\n isLoading?: boolean;\n error?: string;\n clearError: NoneToVoidFunction;\n onSubmit: (hint: string) => void;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n screen: SettingsScreens;\n};\n\ntype StateProps = {\n animatedEmoji: ApiSticker;\n codeLength: number;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst SettingsTwoFaEmailCode: FC = ({\n animatedEmoji,\n codeLength,\n isLoading,\n error,\n clearError,\n onSubmit,\n isActive,\n onScreenSelect,\n onReset,\n screen,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [value, setValue] = useState('');\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n const handleInputChange = (e: React.ChangeEvent) => {\n if (error && clearError) {\n clearError();\n }\n\n const newValue = e.target.value.slice(0, codeLength);\n\n if (newValue.length === codeLength) {\n onSubmit(newValue);\n }\n\n setValue(newValue);\n e.target.value = newValue;\n };\n\n return (\n
\n
\n \n
\n\n
\n \n {isLoading && }\n
\n
\n );\n};\n\nexport default memo(withGlobal((global) => {\n return {\n animatedEmoji: selectAnimatedEmoji(global, '💌'),\n codeLength: global.twoFaSettings.waitingEmailCodeLength,\n };\n})(SettingsTwoFaEmailCode));\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../../../global/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport { pick } from '../../../../util/iteratees';\nimport { TwoFaDispatch, TwoFaState } from '../../../../hooks/reducers/useTwoFaReducer';\nimport useLang from '../../../../hooks/useLang';\n\nimport SettingsTwoFaEnabled from './SettingsTwoFaEnabled';\nimport SettingsTwoFaPassword from './SettingsTwoFaPassword';\nimport SettingsTwoFaStart from './SettingsTwoFaStart';\nimport SettingsTwoFaSkippableForm from './SettingsTwoFaSkippableForm';\nimport SettingsTwoFaCongratulations from './SettingsTwoFaCongratulations';\nimport SettingsTwoFaEmailCode from './SettingsTwoFaEmailCode';\n\nexport type OwnProps = {\n state: TwoFaState;\n currentScreen: SettingsScreens;\n shownScreen: SettingsScreens;\n dispatch: TwoFaDispatch;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = GlobalState['twoFaSettings'];\n\ntype DispatchProps = Pick;\n\nconst SettingsTwoFa: FC = ({\n currentScreen,\n shownScreen,\n state,\n hint,\n isLoading,\n error,\n waitingEmailCodeLength,\n dispatch,\n isActive,\n onScreenSelect,\n onReset,\n updatePassword,\n checkPassword,\n clearTwoFaError,\n updateRecoveryEmail,\n provideTwoFaEmailCode,\n clearPassword,\n}) => {\n useEffect(() => {\n if (waitingEmailCodeLength) {\n if (currentScreen === SettingsScreens.TwoFaNewPasswordEmail) {\n onScreenSelect(SettingsScreens.TwoFaNewPasswordEmailCode);\n } else if (currentScreen === SettingsScreens.TwoFaRecoveryEmail) {\n onScreenSelect(SettingsScreens.TwoFaRecoveryEmailCode);\n }\n }\n }, [currentScreen, onScreenSelect, waitingEmailCodeLength]);\n\n const handleStartWizard = useCallback(() => {\n dispatch({ type: 'reset' });\n onScreenSelect(SettingsScreens.TwoFaNewPassword);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPassword = useCallback((value: string) => {\n dispatch({ type: 'setPassword', payload: value });\n onScreenSelect(SettingsScreens.TwoFaNewPasswordConfirm);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPasswordConfirm = useCallback(() => {\n onScreenSelect(SettingsScreens.TwoFaNewPasswordHint);\n }, [onScreenSelect]);\n\n const handleNewPasswordHint = useCallback((value?: string) => {\n dispatch({ type: 'setHint', payload: value });\n onScreenSelect(SettingsScreens.TwoFaNewPasswordEmail);\n }, [dispatch, onScreenSelect]);\n\n const handleNewPasswordEmail = useCallback((value?: string) => {\n dispatch({ type: 'setEmail', payload: value });\n updatePassword({\n ...state,\n email: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updatePassword]);\n\n const handleChangePasswordCurrent = useCallback((value: string) => {\n dispatch({ type: 'setCurrentPassword', payload: value });\n checkPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaChangePasswordNew);\n },\n });\n }, [checkPassword, dispatch, onScreenSelect]);\n\n const handleChangePasswordNew = useCallback((value: string) => {\n dispatch({ type: 'setPassword', payload: value });\n onScreenSelect(SettingsScreens.TwoFaChangePasswordConfirm);\n }, [dispatch, onScreenSelect]);\n\n const handleChangePasswordConfirm = useCallback(() => {\n onScreenSelect(SettingsScreens.TwoFaChangePasswordHint);\n }, [onScreenSelect]);\n\n const handleChangePasswordHint = useCallback((value?: string) => {\n dispatch({ type: 'setHint', payload: value });\n updatePassword({\n ...state,\n hint: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updatePassword]);\n\n const handleTurnOff = useCallback((value: string) => {\n clearPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.Privacy);\n },\n });\n }, [clearPassword, onScreenSelect]);\n\n const handleRecoveryEmailCurrentPassword = useCallback((value: string) => {\n dispatch({ type: 'setCurrentPassword', payload: value });\n checkPassword({\n currentPassword: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaRecoveryEmail);\n },\n });\n }, [checkPassword, dispatch, onScreenSelect]);\n\n const handleRecoveryEmail = useCallback((value?: string) => {\n dispatch({ type: 'setEmail', payload: value });\n updateRecoveryEmail({\n ...state,\n email: value,\n onSuccess: () => {\n onScreenSelect(SettingsScreens.TwoFaCongratulations);\n },\n });\n }, [dispatch, onScreenSelect, state, updateRecoveryEmail]);\n\n const handleEmailCode = useCallback((code: string) => {\n provideTwoFaEmailCode({ code });\n }, [provideTwoFaEmailCode]);\n\n const lang = useLang();\n\n switch (currentScreen) {\n case SettingsScreens.TwoFaDisabled:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPassword:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordConfirm:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordHint:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordEmail:\n return (\n \n );\n\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n return (\n \n );\n\n case SettingsScreens.TwoFaCongratulations:\n return (\n \n );\n\n case SettingsScreens.TwoFaEnabled:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordCurrent:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordNew:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordConfirm:\n return (\n \n );\n\n case SettingsScreens.TwoFaChangePasswordHint:\n return (\n \n );\n\n case SettingsScreens.TwoFaTurnOff:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmail:\n return (\n \n );\n\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return (\n \n );\n\n default:\n return undefined;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => ({ ...global.twoFaSettings }),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updatePassword', 'updateRecoveryEmail', 'clearPassword', 'provideTwoFaEmailCode',\n 'checkPassword', 'clearTwoFaError',\n ]),\n)(SettingsTwoFa));\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\nimport { pick } from '../../../util/iteratees';\nimport searchWords from '../../../util/searchWords';\nimport { getPrivacyKey } from './helper/privacy';\nimport {\n getChatTitle, isChatGroup, isChatPrivate, prepareChatList,\n} from '../../../modules/helpers';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\n\nexport type OwnProps = {\n isAllowList?: boolean;\n screen: SettingsScreens;\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n chatsById: Record;\n listIds?: number[];\n orderedPinnedIds?: number[];\n archivedListIds?: number[];\n archivedPinnedIds?: number[];\n settings?: ApiPrivacySettings;\n};\n\ntype DispatchProps = Pick;\n\nconst SettingsPrivacyVisibilityExceptionList: FC = ({\n currentUserId,\n isAllowList,\n screen,\n settings,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n setPrivacySettings,\n isActive,\n onScreenSelect,\n onReset,\n}) => {\n const lang = useLang();\n\n const selectedContactIds = useMemo(() => {\n if (!settings) {\n return [];\n }\n\n if (isAllowList) {\n return [...settings.allowUserIds, ...settings.allowChatIds];\n } else {\n return [...settings.blockUserIds, ...settings.blockChatIds];\n }\n }, [isAllowList, settings]);\n const [searchQuery, setSearchQuery] = useState('');\n const [isSubmitShown, setIsSubmitShown] = useState(false);\n const [newSelectedContactIds, setNewSelectedContactIds] = useState(selectedContactIds);\n\n const chats = useMemo(() => {\n const activeChatArrays = listIds\n ? prepareChatList(chatsById, listIds, orderedPinnedIds, 'all')\n : undefined;\n const archivedChatArrays = archivedListIds\n ? prepareChatList(chatsById, archivedListIds, archivedPinnedIds, 'archived')\n : undefined;\n\n if (!activeChatArrays && !archivedChatArrays) {\n return undefined;\n }\n\n return [\n ...(activeChatArrays\n ? [\n ...activeChatArrays.pinnedChats,\n ...activeChatArrays.otherChats,\n ]\n : []\n ),\n ...(archivedChatArrays ? archivedChatArrays.otherChats : []),\n ];\n }, [chatsById, listIds, orderedPinnedIds, archivedListIds, archivedPinnedIds]);\n\n const displayedIds = useMemo(() => {\n if (!chats) {\n return undefined;\n }\n\n return chats\n .filter((chat) => (\n ((isChatPrivate(chat.id) && chat.id !== currentUserId) || isChatGroup(chat))\n && (\n !searchQuery\n || searchWords(getChatTitle(lang, chat), searchQuery)\n || selectedContactIds.includes(chat.id)\n )\n ))\n .map(({ id }) => id);\n }, [chats, currentUserId, lang, searchQuery, selectedContactIds]);\n\n const handleSelectedContactIdsChange = useCallback((value: number[]) => {\n setNewSelectedContactIds(value);\n setIsSubmitShown(true);\n }, []);\n\n const handleSubmit = useCallback(() => {\n setPrivacySettings({\n privacyKey: getPrivacyKey(screen),\n isAllowList: Boolean(isAllowList),\n contactsIds: newSelectedContactIds,\n });\n\n onScreenSelect(SettingsScreens.Privacy);\n }, [isAllowList, newSelectedContactIds, onScreenSelect, screen, setPrivacySettings]);\n\n useHistoryBack(isActive, onReset, onScreenSelect, screen);\n\n\n return (\n
\n \n\n \n \n \n
\n );\n};\n\nfunction getCurrentPrivacySettings(global: GlobalState, screen: SettingsScreens) {\n const { privacy } = global.settings;\n switch (screen) {\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n return privacy.phoneNumber;\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n return privacy.lastSeen;\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n return privacy.profilePhoto;\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n return privacy.forwards;\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return privacy.chatInvite;\n }\n\n return undefined;\n}\n\nexport default memo(withGlobal(\n (global, { screen }): StateProps => {\n const {\n chats: {\n byId: chatsById,\n listIds,\n orderedPinnedIds,\n },\n currentUserId,\n } = global;\n\n return {\n currentUserId,\n chatsById,\n listIds: listIds.active,\n orderedPinnedIds: orderedPinnedIds.active,\n archivedPinnedIds: orderedPinnedIds.archived,\n archivedListIds: listIds.archived,\n settings: getCurrentPrivacySettings(global, screen),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setPrivacySettings']),\n)(SettingsPrivacyVisibilityExceptionList));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { SettingsScreens } from '../../../types';\n\nimport { LAYERS_ANIMATION_NAME } from '../../../util/environment';\nimport useFoldersReducer from '../../../hooks/reducers/useFoldersReducer';\nimport useTwoFaReducer from '../../../hooks/reducers/useTwoFaReducer';\n\nimport Transition from '../../ui/Transition';\nimport SettingsHeader from './SettingsHeader';\nimport SettingsMain from './SettingsMain';\nimport SettingsEditProfile from './SettingsEditProfile';\nimport SettingsFolders from './folders/SettingsFolders';\nimport SettingsGeneral from './SettingsGeneral';\nimport SettingsGeneralBackground from './SettingsGeneralBackground';\nimport SettingsGeneralBackgroundColor from './SettingsGeneralBackgroundColor';\nimport SettingsNotifications from './SettingsNotifications';\nimport SettingsPrivacy from './SettingsPrivacy';\nimport SettingsLanguage from './SettingsLanguage';\nimport SettingsPrivacyVisibility from './SettingsPrivacyVisibility';\nimport SettingsPrivacyActiveSessions from './SettingsPrivacyActiveSessions';\nimport SettingsPrivacyBlockedUsers from './SettingsPrivacyBlockedUsers';\nimport SettingsTwoFa from './twoFa/SettingsTwoFa';\nimport SettingsPrivacyVisibilityExceptionList from './SettingsPrivacyVisibilityExceptionList';\n\nimport './Settings.scss';\n\nconst TRANSITION_RENDER_COUNT = Object.keys(SettingsScreens).length / 2;\nconst TRANSITION_DURATION = 200;\n\nconst TWO_FA_SCREENS = [\n SettingsScreens.TwoFaDisabled,\n SettingsScreens.TwoFaNewPassword,\n SettingsScreens.TwoFaNewPasswordConfirm,\n SettingsScreens.TwoFaNewPasswordHint,\n SettingsScreens.TwoFaNewPasswordEmail,\n SettingsScreens.TwoFaNewPasswordEmailCode,\n SettingsScreens.TwoFaCongratulations,\n SettingsScreens.TwoFaEnabled,\n SettingsScreens.TwoFaChangePasswordCurrent,\n SettingsScreens.TwoFaChangePasswordNew,\n SettingsScreens.TwoFaChangePasswordConfirm,\n SettingsScreens.TwoFaChangePasswordHint,\n SettingsScreens.TwoFaTurnOff,\n SettingsScreens.TwoFaRecoveryEmailCurrentPassword,\n SettingsScreens.TwoFaRecoveryEmail,\n SettingsScreens.TwoFaRecoveryEmailCode,\n];\n\nconst FOLDERS_SCREENS = [\n SettingsScreens.Folders,\n SettingsScreens.FoldersCreateFolder,\n SettingsScreens.FoldersEditFolder,\n SettingsScreens.FoldersIncludedChats,\n SettingsScreens.FoldersExcludedChats,\n];\n\nconst PRIVACY_SCREENS = [\n SettingsScreens.PrivacyBlockedUsers,\n SettingsScreens.PrivacyActiveSessions,\n];\n\nconst PRIVACY_PHONE_NUMBER_SCREENS = [\n SettingsScreens.PrivacyPhoneNumberAllowedContacts,\n SettingsScreens.PrivacyPhoneNumberDeniedContacts,\n];\n\nconst PRIVACY_LAST_SEEN_PHONE_SCREENS = [\n SettingsScreens.PrivacyLastSeenAllowedContacts,\n SettingsScreens.PrivacyLastSeenDeniedContacts,\n];\n\nconst PRIVACY_PROFILE_PHOTO_SCREENS = [\n SettingsScreens.PrivacyProfilePhotoAllowedContacts,\n SettingsScreens.PrivacyProfilePhotoDeniedContacts,\n];\n\nconst PRIVACY_FORWARDING_SCREENS = [\n SettingsScreens.PrivacyForwardingAllowedContacts,\n SettingsScreens.PrivacyForwardingDeniedContacts,\n];\n\nconst PRIVACY_GROUP_CHATS_SCREENS = [\n SettingsScreens.PrivacyGroupChatsAllowedContacts,\n SettingsScreens.PrivacyGroupChatsDeniedContacts,\n];\n\nexport type OwnProps = {\n isActive: boolean;\n currentScreen: SettingsScreens;\n onScreenSelect: (screen: SettingsScreens) => void;\n shouldSkipTransition?: boolean;\n onReset: () => void;\n};\n\nconst Settings: FC = ({\n isActive,\n currentScreen,\n onScreenSelect,\n onReset,\n shouldSkipTransition,\n}) => {\n const [foldersState, foldersDispatch] = useFoldersReducer();\n const [twoFaState, twoFaDispatch] = useTwoFaReducer();\n\n const handleReset = useCallback(() => {\n if (\n currentScreen === SettingsScreens.FoldersCreateFolder\n || currentScreen === SettingsScreens.FoldersEditFolder\n ) {\n setTimeout(() => {\n foldersDispatch({ type: 'reset' });\n }, TRANSITION_DURATION);\n }\n\n if (\n currentScreen === SettingsScreens.FoldersIncludedChats\n || currentScreen === SettingsScreens.FoldersExcludedChats\n ) {\n if (foldersState.mode === 'create') {\n onScreenSelect(SettingsScreens.FoldersCreateFolder);\n } else {\n onScreenSelect(SettingsScreens.FoldersEditFolder);\n }\n return;\n }\n\n onReset();\n }, [\n foldersState.mode, foldersDispatch,\n currentScreen, onReset, onScreenSelect,\n ]);\n\n const handleSaveFilter = useCallback(() => {\n foldersDispatch({ type: 'saveFilters' });\n handleReset();\n }, [foldersDispatch, handleReset]);\n\n function renderCurrentSectionContent(isScreenActive: boolean, screen: SettingsScreens) {\n const privacyAllowScreens: Record = {\n [SettingsScreens.PrivacyPhoneNumber]: PRIVACY_PHONE_NUMBER_SCREENS.includes(screen),\n [SettingsScreens.PrivacyLastSeen]: PRIVACY_LAST_SEEN_PHONE_SCREENS.includes(screen),\n [SettingsScreens.PrivacyProfilePhoto]: PRIVACY_PROFILE_PHOTO_SCREENS.includes(screen),\n [SettingsScreens.PrivacyForwarding]: PRIVACY_FORWARDING_SCREENS.includes(screen),\n [SettingsScreens.PrivacyGroupChats]: PRIVACY_GROUP_CHATS_SCREENS.includes(screen),\n };\n\n const isTwoFaScreen = TWO_FA_SCREENS.includes(screen);\n const isFoldersScreen = FOLDERS_SCREENS.includes(screen);\n const isPrivacyScreen = PRIVACY_SCREENS.includes(screen)\n || isTwoFaScreen\n || Object.keys(privacyAllowScreens).includes(screen.toString())\n || Object.values(privacyAllowScreens).find((key) => key === true);\n\n switch (currentScreen) {\n case SettingsScreens.Main:\n return (\n \n );\n case SettingsScreens.EditProfile:\n return (\n \n );\n case SettingsScreens.General:\n return (\n \n );\n case SettingsScreens.Notifications:\n return (\n \n );\n case SettingsScreens.Privacy:\n return (\n \n );\n case SettingsScreens.Language:\n return (\n \n );\n case SettingsScreens.GeneralChatBackground:\n return (\n \n );\n case SettingsScreens.GeneralChatBackgroundColor:\n return (\n \n );\n case SettingsScreens.PrivacyActiveSessions:\n return (\n \n );\n case SettingsScreens.PrivacyBlockedUsers:\n return (\n \n );\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyGroupChats:\n return (\n \n );\n\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n return (\n \n );\n\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n return (\n \n );\n\n case SettingsScreens.Folders:\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n case SettingsScreens.FoldersIncludedChats:\n case SettingsScreens.FoldersExcludedChats:\n return (\n \n );\n\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaNewPassword:\n case SettingsScreens.TwoFaNewPasswordConfirm:\n case SettingsScreens.TwoFaNewPasswordHint:\n case SettingsScreens.TwoFaNewPasswordEmail:\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n case SettingsScreens.TwoFaCongratulations:\n case SettingsScreens.TwoFaEnabled:\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaChangePasswordNew:\n case SettingsScreens.TwoFaChangePasswordConfirm:\n case SettingsScreens.TwoFaChangePasswordHint:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n case SettingsScreens.TwoFaRecoveryEmail:\n case SettingsScreens.TwoFaRecoveryEmailCode:\n return (\n \n );\n\n default:\n return undefined;\n }\n }\n\n function renderCurrentSection(isScreenActive: boolean, isFrom: boolean, currentKey: SettingsScreens) {\n return (\n <>\n \n {renderCurrentSectionContent(isScreenActive, currentKey)}\n \n );\n }\n\n return (\n \n {renderCurrentSection}\n \n );\n};\n\nexport default memo(Settings);\n","import React, {\n FC, useEffect, useCallback, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser } from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { pick } from '../../../util/iteratees';\nimport { getUserFullName, sortUserIds } from '../../../modules/helpers';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport ListItem from '../../ui/ListItem';\nimport Loading from '../../ui/Loading';\n\nexport type OwnProps = {\n filter: string;\n isActive: boolean;\n onReset: () => void;\n};\n\ntype StateProps = {\n usersById: Record;\n contactIds?: number[];\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst ContactList: FC = ({\n isActive, onReset,\n filter, usersById, contactIds, loadContactList, openChat, serverTimeOffset,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n useHistoryBack(isActive, onReset);\n\n const handleClick = useCallback(\n (id: number) => {\n openChat({ id, shouldReplaceHistory: true });\n },\n [openChat],\n );\n\n const listIds = useMemo(() => {\n if (!contactIds) {\n return undefined;\n }\n\n const resultIds = filter ? contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, filter);\n }) : contactIds;\n\n return sortUserIds(resultIds, usersById, undefined, serverTimeOffset);\n }, [contactIds, filter, usersById, serverTimeOffset]);\n\n const [viewportIds, getMore] = useInfiniteScroll(undefined, listIds, Boolean(filter));\n\n return (\n \n {viewportIds && viewportIds.length ? (\n viewportIds.map((id) => (\n handleClick(id)}\n ripple={!IS_SINGLE_COLUMN_LAYOUT}\n >\n \n \n ))\n ) : viewportIds && !viewportIds.length ? (\n

\n {filter.length ? 'No contacts matched your search.' : 'Contact list is empty.'}\n

\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: contactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n\n return {\n usersById,\n contactIds,\n serverTimeOffset: global.serverTimeOffset,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'openChat']),\n)(ContactList));\n","import React, {\n FC, useCallback, useEffect, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport { pick, unique } from '../../../util/iteratees';\nimport { throttle } from '../../../util/schedulers';\nimport searchWords from '../../../util/searchWords';\nimport { getUserFullName, isUserBot, sortChatIds } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport Picker from '../../common/Picker';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Button from '../../ui/Button';\n\nexport type OwnProps = {\n isChannel?: boolean;\n isActive: boolean;\n selectedMemberIds: number[];\n onSelectedMemberIdsChange: (ids: number[]) => void;\n onNextStep: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n currentUserId?: number;\n usersById: Record;\n chatsById: Record;\n localContactIds?: number[];\n searchQuery?: string;\n isSearching?: boolean;\n localUserIds?: number[];\n globalUserIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst NewChatStep1: FC = ({\n isChannel,\n isActive,\n selectedMemberIds,\n onSelectedMemberIdsChange,\n onNextStep,\n onReset,\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching,\n localUserIds,\n globalUserIds,\n loadContactList,\n setGlobalSearchQuery,\n}) => {\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadContactList();\n });\n });\n\n const lang = useLang();\n\n useHistoryBack(isActive, onReset);\n\n const handleFilterChange = useCallback((query: string) => {\n setGlobalSearchQuery({ query });\n }, [setGlobalSearchQuery]);\n\n const displayedIds = useMemo(() => {\n const contactIds = localContactIds\n ? sortChatIds(localContactIds.filter((id) => id !== currentUserId), chatsById)\n : [];\n\n if (!searchQuery) {\n return contactIds;\n }\n\n const foundContactIds = contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, searchQuery);\n });\n\n return sortChatIds(\n unique([\n ...foundContactIds,\n ...(localUserIds || []),\n ...(globalUserIds || []),\n ]).filter((contactId) => {\n const user = usersById[contactId];\n\n return !user || !isUserBot(user) || user.canBeInvitedToGroup;\n }),\n chatsById,\n false,\n selectedMemberIds,\n );\n }, [\n localContactIds, chatsById, searchQuery, localUserIds, globalUserIds, selectedMemberIds,\n currentUserId, usersById,\n ]);\n\n const handleNextStep = useCallback(() => {\n if (selectedMemberIds.length || isChannel) {\n setGlobalSearchQuery({ query: '' });\n onNextStep();\n }\n }, [selectedMemberIds.length, isChannel, setGlobalSearchQuery, onNextStep]);\n\n return (\n
\n
\n \n \n \n

{lang('GroupAddMembers')}

\n
\n
\n \n\n \n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { userIds: localContactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n const { currentUserId } = global;\n\n const {\n query: searchQuery,\n fetchingStatus,\n globalResults,\n localResults,\n } = global.globalSearch;\n const { userIds: globalUserIds } = globalResults || {};\n const { userIds: localUserIds } = localResults || {};\n\n return {\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching: fetchingStatus && fetchingStatus.chats,\n globalUserIds,\n localUserIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'setGlobalSearchQuery']),\n)(NewChatStep1));\n","import React, {\n FC, useState, useCallback, useEffect, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ChatCreationProgress } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport InputText from '../../ui/InputText';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport Button from '../../ui/Button';\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nexport type OwnProps = {\n isChannel?: boolean;\n isActive: boolean;\n memberIds: number[];\n onReset: (forceReturnToChatList?: boolean) => void;\n};\n\ntype StateProps = {\n creationProgress?: ChatCreationProgress;\n creationError?: string;\n};\n\ntype DispatchProps = Pick;\n\n// TODO @implement\nconst MAX_USERS_FOR_LEGACY_CHAT = 199; // Accounting for current user\n\nconst NewChatStep2: FC = ({\n isChannel,\n isActive,\n memberIds,\n onReset,\n creationProgress,\n creationError,\n createGroupChat,\n createChannel,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset);\n\n const [title, setTitle] = useState('');\n const [about, setAbout] = useState('');\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n\n const chatTitleEmptyError = 'Chat title can\\'t be empty';\n const channelTitleEmptyError = 'Channel title can\\'t be empty';\n const chatTooManyUsersError = 'Sorry, creating supergroups is not yet supported';\n\n const isLoading = creationProgress === ChatCreationProgress.InProgress;\n\n const handleTitleChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n const newValue = value.replace(/^\\s+/, '');\n\n setTitle(newValue);\n\n if (newValue !== value) {\n e.currentTarget.value = newValue;\n }\n }, []);\n\n const handleDescriptionChange = useCallback((e: React.ChangeEvent) => {\n setAbout(e.currentTarget.value);\n }, []);\n\n const handleCreateGroup = useCallback(() => {\n if (!title.length) {\n setError(chatTitleEmptyError);\n return;\n }\n\n if (memberIds.length > MAX_USERS_FOR_LEGACY_CHAT) {\n setError(chatTooManyUsersError);\n return;\n }\n\n createGroupChat({\n title,\n photo,\n memberIds,\n });\n }, [title, memberIds, createGroupChat, photo, chatTitleEmptyError, chatTooManyUsersError]);\n\n const handleCreateChannel = useCallback(() => {\n if (!title.length) {\n setError(channelTitleEmptyError);\n return;\n }\n\n createChannel({\n title,\n about,\n photo,\n memberIds,\n });\n }, [title, createChannel, about, photo, memberIds, channelTitleEmptyError]);\n\n useEffect(() => {\n if (creationProgress === ChatCreationProgress.Complete) {\n onReset(true);\n }\n }, [creationProgress, onReset]);\n\n const renderedError = creationError || (\n error !== chatTitleEmptyError && error !== channelTitleEmptyError\n ? error\n : undefined\n );\n\n return (\n
\n
\n onReset()}\n ariaLabel=\"Return to member selection\"\n >\n \n \n

{lang(isChannel ? 'NewChannel' : 'NewGroup')}

\n
\n
\n \n \n {isChannel && (\n <>\n \n

{lang('DescriptionInfo')}

\n \n )}\n\n {renderedError && (\n

{renderedError}

\n )}\n\n {memberIds.length > 0 && (\n <>\n

{lang('GroupInfo.ParticipantCount', memberIds.length, 'i')}

\n\n
\n {memberIds.map((id) => (\n \n \n \n ))}\n
\n \n )}\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n progress: creationProgress,\n error: creationError,\n } = global.chatCreation || {};\n\n return {\n creationProgress,\n creationError,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'createGroupChat', 'createChannel',\n ]),\n)(NewChatStep2));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../../lib/teact/teact';\n\nimport { LeftColumnContent } from '../../../types';\n\nimport { LAYERS_ANIMATION_NAME } from '../../../util/environment';\n\nimport Transition from '../../ui/Transition';\nimport NewChatStep1 from './NewChatStep1';\nimport NewChatStep2 from './NewChatStep2';\n\nimport './NewChat.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n isChannel?: boolean;\n content: LeftColumnContent;\n onContentChange: (content: LeftColumnContent) => void;\n onReset: () => void;\n};\n\nconst RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\n\nconst NewChat: FC = ({\n isActive,\n isChannel = false,\n content,\n onContentChange,\n onReset,\n}) => {\n const [newChatMemberIds, setNewChatMemberIds] = useState([]);\n\n const handleNextStep = useCallback(() => {\n onContentChange(isChannel ? LeftColumnContent.NewChannelStep2 : LeftColumnContent.NewGroupStep2);\n }, [isChannel, onContentChange]);\n\n return (\n \n {(isStepActive) => {\n switch (content) {\n case LeftColumnContent.NewChannelStep1:\n case LeftColumnContent.NewGroupStep1:\n return (\n \n );\n case LeftColumnContent.NewChannelStep2:\n case LeftColumnContent.NewGroupStep2:\n return (\n \n );\n default:\n return undefined;\n }\n }}\n \n );\n};\n\nexport default memo(NewChat);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Button from '../ui/Button';\nimport ChatList from './main/ChatList';\nimport { LeftColumnContent } from '../../types';\n\nimport './ArchivedChats.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n onReset: () => void;\n onContentChange: (content: LeftColumnContent) => void;\n};\n\nconst ArchivedChats: FC = ({ isActive, onReset, onContentChange }) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onReset, onContentChange, LeftColumnContent.Archived);\n\n return (\n
\n
\n \n \n \n

{lang('ArchivedChats')}

\n
\n \n
\n );\n};\n\nexport default memo(ArchivedChats);\n","const IGNORED_KEYS: Record = {\n Down: true,\n ArrowDown: true,\n Up: true,\n ArrowUp: true,\n Left: true,\n ArrowLeft: true,\n Right: true,\n ArrowRight: true,\n ' ': true,\n PageUp: true,\n PageDown: true,\n End: true,\n Home: true,\n Tab: true,\n};\n\nfunction isTextBox(target: EventTarget | null) {\n if (!target || !(target instanceof HTMLElement)) return false;\n const element = target;\n const tagName = element.tagName.toLowerCase();\n if (tagName === 'textarea') return true;\n if (tagName !== 'input') return false;\n const type = element.getAttribute('type');\n if (!type) return false;\n const inputTypes = [\n 'text', 'password', 'number', 'email', 'tel', 'url',\n 'search', 'date', 'datetime', 'datetime-local', 'time', 'month', 'week',\n ];\n return inputTypes.indexOf(type.toLowerCase()) > -1;\n}\n\nconst preventDefault = (e: Event) => {\n e.preventDefault();\n};\n\nfunction preventDefaultForScrollKeys(e: KeyboardEvent) {\n if (IGNORED_KEYS[e.key] && !isTextBox(e.target)) {\n preventDefault(e);\n }\n}\n\nexport function disableScrolling() {\n // Disable scrolling in Chrome\n document.addEventListener('wheel', preventDefault, { passive: false });\n window.ontouchmove = preventDefault; // mobile\n document.onkeydown = preventDefaultForScrollKeys;\n}\n\nexport function enableScrolling() {\n document.removeEventListener('wheel', preventDefault); // Enable scrolling in Chrome\n // eslint-disable-next-line no-null/no-null\n window.ontouchmove = null;\n // eslint-disable-next-line no-null/no-null\n document.onkeydown = null;\n}\n","import { ApiMediaFormat, ApiMessage } from '../../../../api/types';\n\nimport * as mediaLoader from '../../../../util/mediaLoader';\nimport {\n getMessageMediaHash,\n getMessagePhoto,\n getMessageText,\n getMessageWebPagePhoto,\n getMessageWebPageVideo,\n hasMessageLocalBlobUrl,\n} from '../../../../modules/helpers';\nimport { CLIPBOARD_ITEM_SUPPORTED, copyImageToClipboard, copyTextToClipboard } from '../../../../util/clipboard';\n\ntype ICopyOptions = {\n label: string;\n handler: () => void;\n}[];\n\nexport function getMessageCopyOptions(\n message: ApiMessage, afterEffect?: () => void, onCopyLink?: () => void,\n): ICopyOptions {\n const options: ICopyOptions = [];\n const text = getMessageText(message);\n const photo = getMessagePhoto(message)\n || (!getMessageWebPageVideo(message) ? getMessageWebPagePhoto(message) : undefined);\n const mediaHash = getMessageMediaHash(message, 'inline');\n const canImageBeCopied = photo && (mediaHash || hasMessageLocalBlobUrl(message)) && CLIPBOARD_ITEM_SUPPORTED;\n const selection = window.getSelection();\n\n if (canImageBeCopied) {\n options.push({\n label: 'lng_context_copy_image',\n handler: () => {\n Promise.resolve(mediaHash ? mediaLoader.fetch(mediaHash, ApiMediaFormat.BlobUrl) : photo!.blobUrl)\n .then(copyImageToClipboard);\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n if (text) {\n // Detect if the user has selection in the current message\n const hasSelection = Boolean((\n selection\n && selection.anchorNode\n && selection.anchorNode.parentNode\n && (selection.anchorNode.parentNode as HTMLElement).closest('.Message .content-inner')\n && selection.toString().replace(/(?:\\r\\n|\\r|\\n)/g, '') !== ''\n ));\n\n options.push({\n label: getCopyLabel(hasSelection),\n handler: () => {\n const clipboardText = hasSelection && selection ? selection.toString() : text;\n copyTextToClipboard(clipboardText);\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n if (onCopyLink) {\n options.push({\n label: 'lng_context_copy_message_link',\n handler: () => {\n onCopyLink();\n\n if (afterEffect) {\n afterEffect();\n }\n },\n });\n }\n\n return options;\n}\n\nfunction getCopyLabel(hasSelection: boolean): string {\n if (hasSelection) {\n return 'lng_context_copy_selected';\n }\n return 'lng_context_copy_text';\n}\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IAnchorPosition } from '../../../types';\n\nimport { getMessageCopyOptions } from './helpers/copyOptions';\nimport useContextMenuPosition from '../../../hooks/useContextMenuPosition';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './MessageContextMenu.scss';\n\ntype OwnProps = {\n isOpen: boolean;\n anchor: IAnchorPosition;\n message: ApiMessage;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canReport?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n onReply: () => void;\n onEdit: () => void;\n onPin: () => void;\n onUnpin: () => void;\n onForward: () => void;\n onDelete: () => void;\n onReport: () => void;\n onFaveSticker: () => void;\n onUnfaveSticker: () => void;\n onSelect: () => void;\n onSend: () => void;\n onReschedule: () => void;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onCopyLink?: () => void;\n};\n\nconst SCROLLBAR_WIDTH = 10;\n\nconst MessageContextMenu: FC = ({\n isOpen,\n message,\n anchor,\n canSendNow,\n canReschedule,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n onReply,\n onEdit,\n onPin,\n onUnpin,\n onForward,\n onDelete,\n onReport,\n onFaveSticker,\n onUnfaveSticker,\n onSelect,\n onSend,\n onReschedule,\n onClose,\n onCloseAnimationEnd,\n onCopyLink,\n}) => {\n const copyOptions = getMessageCopyOptions(message, onClose, canCopyLink ? onCopyLink : undefined);\n\n const getTriggerElement = useCallback(() => {\n return document.querySelector(`.active > .MessageList div[data-message-id=\"${message.id}\"]`);\n }, [message.id]);\n\n const getRootElement = useCallback(\n () => document.querySelector('.active > .MessageList'),\n [],\n );\n\n const getMenuElement = useCallback(\n () => document.querySelector('.MessageContextMenu .bubble'),\n [],\n );\n\n const { positionX, positionY, style } = useContextMenuPosition(\n anchor,\n getTriggerElement,\n getRootElement,\n getMenuElement,\n SCROLLBAR_WIDTH,\n (document.querySelector('.MiddleHeader') as HTMLElement).offsetHeight,\n );\n\n const lang = useLang();\n\n return (\n \n {canSendNow && {lang('MessageScheduleSend')}}\n {canReschedule && (\n {lang('MessageScheduleEditTime')}\n )}\n {canReply && {lang('Reply')}}\n {canEdit && {lang('Edit')}}\n {canFaveSticker && (\n {lang('AddToFavorites')}\n )}\n {canUnfaveSticker && (\n {lang('Stickers.RemoveFromFavorites')}\n )}\n {canCopy && copyOptions.map((options) => (\n {lang(options.label)}\n ))}\n {canPin && {lang('DialogPin')}}\n {canUnpin && {lang('DialogUnpin')}}\n {canForward && {lang('Forward')}}\n {canSelect && {lang('Common.Select')}}\n {canReport && {lang('lng_context_report_msg')}}\n {canDelete && {lang('Delete')}}\n \n );\n};\n\nexport default MessageContextMenu;\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\nimport { IAlbum, IAnchorPosition } from '../../../types';\nimport { selectAllowedMessageActions, selectCurrentMessageList } from '../../../modules/selectors';\nimport { disableScrolling, enableScrolling } from '../../../util/scrollLock';\nimport { pick } from '../../../util/iteratees';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\n\nimport DeleteMessageModal from '../../common/DeleteMessageModal';\nimport ReportMessageModal from '../../common/ReportMessageModal';\nimport PinMessageModal from '../../common/PinMessageModal';\nimport MessageContextMenu from './MessageContextMenu';\nimport CalendarModal from '../../common/CalendarModal';\nimport { getDayStartAt } from '../../../util/dateFormat';\nimport { copyTextToClipboard } from '../../../util/clipboard';\n\nexport type OwnProps = {\n isOpen: boolean;\n chatUsername?: string;\n message: ApiMessage;\n album?: IAlbum;\n anchor: IAnchorPosition;\n messageListType: MessageListType;\n onClose: () => void;\n onCloseAnimationEnd: () => void;\n};\n\ntype StateProps = {\n noOptions?: boolean;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canReport?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ContextMenuContainer: FC = ({\n isOpen,\n messageListType,\n chatUsername,\n message,\n album,\n anchor,\n onClose,\n onCloseAnimationEnd,\n noOptions,\n canSendNow,\n canReschedule,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n setReplyingToId,\n setEditingId,\n pinMessage,\n openForwardMenu,\n faveSticker,\n unfaveSticker,\n toggleMessageSelection,\n sendScheduledMessages,\n rescheduleMessage,\n}) => {\n const { transitionClassNames } = useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const [isReportModalOpen, setIsReportModalOpen] = useState(false);\n const [isPinModalOpen, setIsPinModalOpen] = useState(false);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const handleReport = useCallback(() => {\n setIsMenuOpen(false);\n setIsReportModalOpen(true);\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(false);\n onClose();\n }, [onClose]);\n\n const closeReportModal = useCallback(() => {\n setIsReportModalOpen(false);\n onClose();\n }, [onClose]);\n\n const closePinModal = useCallback(() => {\n setIsPinModalOpen(false);\n onClose();\n }, [onClose]);\n\n const handleCloseCalendar = useCallback(() => {\n closeCalendar();\n onClose();\n }, [closeCalendar, onClose]);\n\n const handleReply = useCallback(() => {\n setReplyingToId({ messageId: message.id });\n closeMenu();\n }, [setReplyingToId, message.id, closeMenu]);\n\n const handleEdit = useCallback(() => {\n setEditingId({ messageId: message.id });\n closeMenu();\n }, [setEditingId, message.id, closeMenu]);\n\n const handlePin = useCallback(() => {\n setIsMenuOpen(false);\n setIsPinModalOpen(true);\n }, []);\n\n const handleUnpin = useCallback(() => {\n pinMessage({ messageId: message.id, isUnpin: true });\n closeMenu();\n }, [pinMessage, message.id, closeMenu]);\n\n const handleForward = useCallback(() => {\n closeMenu();\n if (album && album.messages) {\n const messageIds = album.messages.map(({ id }) => id);\n openForwardMenu({ fromChatId: message.chatId, messageIds });\n } else {\n openForwardMenu({ fromChatId: message.chatId, messageIds: [message.id] });\n }\n }, [openForwardMenu, message, closeMenu, album]);\n\n const handleFaveSticker = useCallback(() => {\n closeMenu();\n faveSticker({ sticker: message.content.sticker });\n }, [closeMenu, message.content.sticker, faveSticker]);\n\n const handleUnfaveSticker = useCallback(() => {\n closeMenu();\n unfaveSticker({ sticker: message.content.sticker });\n }, [closeMenu, message.content.sticker, unfaveSticker]);\n\n const handleSelectMessage = useCallback(() => {\n const params = album && album.messages\n ? {\n messageId: message.id,\n childMessageIds: album.messages.map(({ id }) => id),\n withShift: false,\n }\n : { messageId: message.id, withShift: false };\n\n toggleMessageSelection(params);\n closeMenu();\n }, [closeMenu, message.id, toggleMessageSelection, album]);\n\n const handleScheduledMessageSend = useCallback(() => {\n sendScheduledMessages({ chatId: message.chatId, id: message.id });\n closeMenu();\n }, [closeMenu, message.chatId, message.id, sendScheduledMessages]);\n\n const handleOpenCalendar = useCallback(() => {\n setIsMenuOpen(false);\n openCalendar();\n }, [openCalendar]);\n\n const handleRescheduleMessage = useCallback((date: Date) => {\n rescheduleMessage({\n chatId: message.chatId,\n messageId: message.id,\n scheduledAt: Math.round(date.getTime() / 1000),\n });\n }, [message.chatId, message.id, rescheduleMessage]);\n\n const handleCopyLink = useCallback(() => {\n copyTextToClipboard(`https://t.me/${chatUsername || `c/${Math.abs(message.chatId)}`}/${message.id}`);\n closeMenu();\n }, [chatUsername, closeMenu, message.chatId, message.id]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\n\n const reportMessageIds = useMemo(() => (album ? album.messages : [message]).map(({ id }) => id), [album, message]);\n\n if (noOptions) {\n closeMenu();\n\n return undefined;\n }\n\n const scheduledMaxDate = new Date();\n scheduledMaxDate.setFullYear(scheduledMaxDate.getFullYear() + 1);\n\n return (\n
\n \n \n \n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { message, messageListType }): StateProps => {\n const { threadId } = selectCurrentMessageList(global) || {};\n const {\n noOptions,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canEdit,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n } = (threadId && selectAllowedMessageActions(global, message, threadId)) || {};\n const isPinned = messageListType === 'pinned';\n const isScheduled = messageListType === 'scheduled';\n\n return {\n noOptions,\n canSendNow: isScheduled,\n canReschedule: isScheduled,\n canReply: !isPinned && !isScheduled && canReply,\n canPin: !isScheduled && canPin,\n canUnpin: !isScheduled && canUnpin,\n canDelete,\n canReport,\n canEdit: !isPinned && canEdit,\n canForward: !isScheduled && canForward,\n canFaveSticker: !isScheduled && canFaveSticker,\n canUnfaveSticker: !isScheduled && canUnfaveSticker,\n canCopy,\n canCopyLink: !isScheduled && canCopyLink,\n canSelect,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setReplyingToId',\n 'setEditingId',\n 'pinMessage',\n 'openForwardMenu',\n 'faveSticker',\n 'unfaveSticker',\n 'toggleMessageSelection',\n 'sendScheduledMessages',\n 'rescheduleMessage',\n ]),\n)(ContextMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiSticker, ApiStickerSet } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { STICKER_SIZE_MODAL } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport { selectStickerSet } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\nimport renderText from './helpers/renderText';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport Loading from '../ui/Loading';\nimport StickerButton from './StickerButton';\n\nimport './StickerSetModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n fromSticker: ApiSticker;\n onClose: () => void;\n};\n\ntype StateProps = {\n stickerSet?: ApiStickerSet;\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerSetModal: FC = ({\n isOpen,\n fromSticker,\n stickerSet,\n onClose,\n loadStickers,\n toggleStickerSet,\n sendMessage,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const lang = useLang();\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE, isDisabled: !isOpen });\n\n useEffect(() => {\n if (isOpen) {\n const { stickerSetId, stickerSetAccessHash } = fromSticker;\n loadStickers({ stickerSetId, stickerSetAccessHash });\n }\n }, [isOpen, fromSticker, loadStickers]);\n\n const handleSelect = useCallback((sticker: ApiSticker) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n sendMessage({ sticker });\n onClose();\n }, [onClose, sendMessage]);\n\n const handleButtonClick = useCallback(() => {\n toggleStickerSet({ stickerSetId: fromSticker.stickerSetId });\n onClose();\n }, [fromSticker.stickerSetId, onClose, toggleStickerSet]);\n\n return (\n \n {stickerSet && stickerSet.stickers ? (\n <>\n
\n {stickerSet.stickers.map((sticker) => (\n \n ))}\n
\n
\n \n {lang(\n stickerSet.installedDate ? 'StickerPack.RemoveStickerCount' : 'StickerPack.AddStickerCount',\n stickerSet.count,\n 'i',\n )}\n \n
\n \n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { fromSticker }: OwnProps) => {\n return { stickerSet: selectStickerSet(global, fromSticker.stickerSetId) };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadStickers',\n 'toggleStickerSet',\n 'sendMessage',\n ]),\n)(StickerSetModal));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat } from '../../api/types';\nimport { IAnchorPosition } from '../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { disableScrolling, enableScrolling } from '../../util/scrollLock';\nimport { selectChat, selectNotifySettings, selectNotifyExceptions } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { isChatPrivate, getCanDeleteChat, selectIsChatMuted } from '../../modules/helpers';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport Portal from '../ui/Portal';\nimport Menu from '../ui/Menu';\nimport MenuItem from '../ui/MenuItem';\nimport DeleteChatModal from '../common/DeleteChatModal';\n\nimport './HeaderMenuContainer.scss';\n\ntype DispatchProps = Pick;\n\nexport type OwnProps = {\n chatId: number;\n threadId: number;\n isOpen: boolean;\n anchor: IAnchorPosition;\n isChannel?: boolean;\n canStartBot?: boolean;\n canRestartBot?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canMute?: boolean;\n canSelect?: boolean;\n canLeave?: boolean;\n onSubscribeChannel: () => void;\n onSearchClick: () => void;\n onClose: () => void;\n onCloseAnimationEnd: () => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isPrivate?: boolean;\n isMuted?: boolean;\n canDeleteChat?: boolean;\n};\n\nconst HeaderMenuContainer: FC = ({\n chatId,\n isOpen,\n anchor,\n isChannel,\n canStartBot,\n canRestartBot,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n chat,\n isPrivate,\n isMuted,\n canDeleteChat,\n onSubscribeChannel,\n onSearchClick,\n onClose,\n onCloseAnimationEnd,\n updateChatMutedState,\n enterMessageSelectMode,\n sendBotCommand,\n restartBot,\n}) => {\n const [isMenuOpen, setIsMenuOpen] = useState(true);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const { x, y } = anchor;\n\n useShowTransition(isOpen, onCloseAnimationEnd, undefined, false);\n\n const handleDelete = useCallback(() => {\n setIsMenuOpen(false);\n setIsDeleteModalOpen(true);\n }, []);\n\n const closeMenu = useCallback(() => {\n setIsMenuOpen(false);\n onClose();\n }, [onClose]);\n\n const closeDeleteModal = useCallback(() => {\n setIsDeleteModalOpen(false);\n onClose();\n }, [onClose]);\n\n const handleStartBot = useCallback(() => {\n sendBotCommand({ command: '/start' });\n }, [sendBotCommand]);\n\n const handleRestartBot = useCallback(() => {\n restartBot({ chatId });\n }, [chatId, restartBot]);\n\n const handleToggleMuteClick = useCallback(() => {\n updateChatMutedState({ chatId, isMuted: !isMuted });\n closeMenu();\n }, [chatId, closeMenu, isMuted, updateChatMutedState]);\n\n const handleSubscribe = useCallback(() => {\n onSubscribeChannel();\n closeMenu();\n }, [closeMenu, onSubscribeChannel]);\n\n const handleSearch = useCallback(() => {\n onSearchClick();\n closeMenu();\n }, [closeMenu, onSearchClick]);\n\n const handleSelectMessages = useCallback(() => {\n enterMessageSelectMode();\n closeMenu();\n }, [closeMenu, enterMessageSelectMode]);\n\n useEffect(() => {\n disableScrolling();\n\n return enableScrolling;\n }, []);\n\n const lang = useLang();\n\n return (\n \n
\n \n {IS_SINGLE_COLUMN_LAYOUT && canStartBot && (\n \n {lang('BotStart')}\n \n )}\n {IS_SINGLE_COLUMN_LAYOUT && canRestartBot && (\n \n {lang('BotRestart')}\n \n )}\n {IS_SINGLE_COLUMN_LAYOUT && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {IS_SINGLE_COLUMN_LAYOUT && canSearch && (\n \n {lang('Search')}\n \n )}\n {canMute && (\n \n {lang(isMuted ? 'ChatsUnmute' : 'ChatsMute')}\n \n )}\n {canSelect && (\n \n {lang('ReportSelectMessages')}\n \n )}\n {canLeave && (\n \n {lang(isPrivate\n ? 'Delete'\n : (canDeleteChat ? 'GroupInfo.DeleteAndExit' : (isChannel ? 'LeaveChannel' : 'Group.LeaveGroup')))}\n \n )}\n \n {chat && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat || chat.isRestricted) {\n return {};\n }\n\n return {\n chat,\n isMuted: selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)),\n isPrivate: isChatPrivate(chat.id),\n canDeleteChat: getCanDeleteChat(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'updateChatMutedState',\n 'enterMessageSelectMode',\n 'sendBotCommand',\n 'restartBot',\n ]),\n)(HeaderMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState, useLayoutEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport { debounce } from '../../util/schedulers';\nimport { selectCurrentTextSearch, selectCurrentChat } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { getDayStartAt } from '../../util/dateFormat';\n\nimport Button from '../ui/Button';\nimport SearchInput from '../ui/SearchInput';\n\nimport './MobileSearch.scss';\n\nexport type OwnProps = {\n isActive: boolean;\n};\n\ntype StateProps = {\n isActive?: boolean;\n chat?: ApiChat;\n query?: string;\n totalCount?: number;\n foundIds?: number[];\n isHistoryCalendarOpen?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst runDebouncedForSearch = debounce((cb) => cb(), 200, false);\n\nconst MobileSearchFooter: FC = ({\n isActive,\n chat,\n query,\n totalCount,\n foundIds,\n isHistoryCalendarOpen,\n setLocalTextSearchQuery,\n searchTextMessagesLocal,\n focusMessage,\n closeLocalTextSearch,\n openHistoryCalendar,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const [focusedIndex, setFocusedIndex] = useState(0);\n\n // Fix for iOS keyboard\n useEffect(() => {\n const { visualViewport } = window as any;\n if (!visualViewport) {\n return undefined;\n }\n\n const mainEl = document.getElementById('Main') as HTMLDivElement;\n const handleResize = () => {\n const { activeElement } = document;\n if (activeElement && (activeElement === inputRef.current)) {\n const { pageTop, height } = visualViewport;\n mainEl.style.transform = `translateY(${pageTop}px)`;\n mainEl.style.height = `${height}px`;\n document.documentElement.scrollTop = pageTop;\n } else {\n mainEl.style.transform = '';\n mainEl.style.height = '';\n }\n };\n\n visualViewport.addEventListener('resize', handleResize);\n\n return () => {\n visualViewport.removeEventListener('resize', handleResize);\n };\n }, []);\n\n // Focus message\n useEffect(() => {\n if (chat && foundIds && foundIds.length) {\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1] });\n setFocusedIndex(0);\n } else {\n setFocusedIndex(-1);\n }\n }, [chat, focusMessage, foundIds]);\n\n // Disable native up/down buttons on iOS\n useEffect(() => {\n Array.from(document.querySelectorAll('input')).forEach((input) => {\n input.disabled = Boolean(isActive && input !== inputRef.current);\n });\n\n Array.from(document.querySelectorAll('div[contenteditable]')).forEach((div) => {\n div.contentEditable = isActive ? 'false' : 'true';\n });\n }, [isActive]);\n\n // Blur on exit\n useEffect(() => {\n if (!isActive) {\n inputRef.current!.blur();\n }\n }, [isActive]);\n\n useLayoutEffect(() => {\n const searchInput = document.querySelector('#MobileSearch input')!;\n searchInput.blur();\n }, [isHistoryCalendarOpen]);\n\n const handleMessageSearchQueryChange = useCallback((newQuery: string) => {\n setLocalTextSearchQuery({ query: newQuery });\n\n if (newQuery.length) {\n runDebouncedForSearch(searchTextMessagesLocal);\n }\n }, [searchTextMessagesLocal, setLocalTextSearchQuery]);\n\n const handleUp = useCallback(() => {\n if (chat && foundIds) {\n const newFocusIndex = focusedIndex + 1;\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] });\n setFocusedIndex(newFocusIndex);\n }\n }, [chat, focusedIndex, focusMessage, foundIds]);\n\n const handleDown = useCallback(() => {\n if (chat && foundIds) {\n const newFocusIndex = focusedIndex - 1;\n focusMessage({ chatId: chat.id, messageId: foundIds[foundIds.length - 1 - newFocusIndex] });\n setFocusedIndex(newFocusIndex);\n }\n }, [chat, focusedIndex, focusMessage, foundIds]);\n\n return (\n
\n
\n \n \n \n \n
\n
\n
\n {query ? (\n foundIds && foundIds.length ? (\n `${focusedIndex + 1} of ${totalCount}`\n ) : foundIds && !foundIds.length ? (\n 'No results'\n ) : (\n ''\n )\n ) : (\n openHistoryCalendar({ selectedAt: getDayStartAt(Date.now()) })}\n ariaLabel=\"Search messages by date\"\n >\n \n \n )}\n
\n \n \n \n \n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return {};\n }\n\n const { query, results } = selectCurrentTextSearch(global) || {};\n const { totalCount, foundIds } = results || {};\n\n return {\n chat,\n query,\n totalCount,\n foundIds,\n isHistoryCalendarOpen: Boolean(global.historyCalendarSelectedAt),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'searchTextMessagesLocal',\n 'focusMessage',\n 'closeLocalTextSearch',\n 'openHistoryCalendar',\n ]),\n)(MobileSearchFooter));\n","export default function findInViewport(\n container: HTMLElement,\n selectorOrElements: string | NodeListOf,\n margin = 0,\n isDense = false,\n shouldContainBottom = false,\n isHorizontal = false,\n) {\n const viewportY1 = container[isHorizontal ? 'scrollLeft' : 'scrollTop'];\n const viewportY2 = viewportY1 + container[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const allElements = typeof selectorOrElements === 'string'\n ? container.querySelectorAll(selectorOrElements)\n : selectorOrElements;\n const { length } = allElements;\n const visibleIndexes: number[] = [];\n let isFound = false;\n\n for (let i = 0; i < length; i++) {\n const element = allElements[i];\n const y1 = element[isHorizontal ? 'offsetLeft' : 'offsetTop'];\n const y2 = y1 + element[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const isVisible = shouldContainBottom\n ? y2 >= viewportY1 - margin && y2 <= viewportY2 + margin\n : y1 <= viewportY2 + margin && y2 >= viewportY1 - margin;\n\n if (isVisible) {\n visibleIndexes.push(i);\n isFound = true;\n } else if (isFound && !isDense) {\n break;\n }\n }\n\n return { allElements, visibleIndexes };\n}\n","function isFullyVisible(container: HTMLElement, element: HTMLElement, isHorizontal = false) {\n const viewportY1 = container[isHorizontal ? 'scrollLeft' : 'scrollTop'];\n const viewportY2 = viewportY1 + container[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n const y1 = element[isHorizontal ? 'offsetLeft' : 'offsetTop'];\n const y2 = y1 + element[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n return y1 > viewportY1 && y2 < viewportY2;\n}\n\nexport default isFullyVisible;\n","import findInViewport from './findInViewport';\nimport isFullyVisible from './isFullyVisible';\nimport fastSmoothScroll from './fastSmoothScroll';\n\nconst VIEWPORT_MARGIN = 8;\nconst SCROLL_MARGIN = 10;\n\nexport default function setTooltipItemVisible(selector: string, index: number, containerRef: Record) {\n const container = containerRef.current!;\n if (!container || index < 0) {\n return;\n }\n const { visibleIndexes, allElements } = findInViewport(\n container,\n selector,\n VIEWPORT_MARGIN,\n true,\n true,\n );\n\n if (!allElements.length || !allElements[index]) {\n return;\n }\n const first = visibleIndexes[0];\n if (!visibleIndexes.includes(index)\n || (index === first && !isFullyVisible(container, allElements[first]))) {\n const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';\n fastSmoothScroll(container, allElements[index], position, SCROLL_MARGIN);\n }\n}\n","import React, {\n FC, useCallback, useEffect, useState, useRef, memo,\n} from '../../../lib/teact/teact';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport { ApiUser } from '../../../api/types';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport setTooltipItemVisible from '../../../util/setTooltipItemVisible';\nimport cycleRestrict from '../../../util/cycleRestrict';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\nimport './MentionTooltip.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n filter: string;\n onClose: () => void;\n onInsertUserName: (user: ApiUser, forceFocus?: boolean) => void;\n filteredUsers?: ApiUser[];\n usersById?: Record;\n};\n\nconst MentionTooltip: FC = ({\n isOpen,\n filter,\n onClose,\n onInsertUserName,\n usersById,\n filteredUsers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!filteredUsers) {\n return -1;\n }\n const membersCount = filteredUsers!.length;\n return cycleRestrict(membersCount, newIndex);\n }, [filteredUsers]);\n\n const [selectedMentionIndex, setSelectedMentionIndex] = useState(-1);\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n e.preventDefault();\n setSelectedMentionIndex((index) => (getSelectedIndex(index + value)));\n }, [setSelectedMentionIndex, getSelectedIndex]);\n\n const handleUserSelect = useCallback((userId: number, forceFocus = false) => {\n const user = usersById && usersById[userId];\n if (!user) {\n return;\n }\n\n onInsertUserName(user, forceFocus);\n }, [usersById, onInsertUserName]);\n\n const handleSelectMention = useCallback((e: KeyboardEvent) => {\n if (filteredUsers && filteredUsers.length && selectedMentionIndex > -1) {\n const member = filteredUsers[selectedMentionIndex];\n if (member) {\n e.preventDefault();\n handleUserSelect(member.id, true);\n }\n }\n }, [filteredUsers, selectedMentionIndex, handleUserSelect]);\n\n useEffect(() => (isOpen ? captureKeyboardListeners({\n onEsc: onClose,\n onUp: (e: KeyboardEvent) => handleArrowKey(-1, e),\n onDown: (e: KeyboardEvent) => handleArrowKey(1, e),\n onEnter: handleSelectMention,\n onTab: handleSelectMention,\n }) : undefined), [isOpen, onClose, handleArrowKey, handleSelectMention]);\n\n useEffect(() => {\n if (filteredUsers && !filteredUsers.length) {\n onClose();\n }\n }, [filteredUsers, onClose]);\n\n useEffect(() => {\n setSelectedMentionIndex(0);\n }, [filter]);\n\n useEffect(() => {\n setTooltipItemVisible('.chat-item-clickable', selectedMentionIndex, containerRef);\n }, [selectedMentionIndex]);\n\n const prevChatMembers = usePrevious(\n filteredUsers && filteredUsers.length\n ? filteredUsers\n : undefined,\n shouldRender,\n );\n const renderedChatMembers = filteredUsers && !filteredUsers.length\n ? prevChatMembers\n : filteredUsers;\n\n if (!shouldRender || (renderedChatMembers && !renderedChatMembers.length)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'MentionTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n );\n\n return (\n
\n {renderedChatMembers && renderedChatMembers.map(({ id }, index) => (\n handleUserSelect(id)}\n focus={selectedMentionIndex === index}\n >\n \n \n ))}\n
\n );\n};\n\nexport default memo(MentionTooltip);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiAttachment, ApiChatMember, ApiUser } from '../../../api/types';\n\nimport { CONTENT_TYPES_FOR_QUICK_UPLOAD, EDITABLE_INPUT_MODAL_ID } from '../../../config';\nimport { getFileExtension } from '../../common/helpers/documentInfo';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useMentionTooltip from './hooks/useMentionTooltip';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport File from '../../common/File';\nimport MessageInput from './MessageInput';\nimport MentionTooltip from './MentionTooltip';\nimport EmojiTooltip from './EmojiTooltip.async';\n\nimport './AttachmentModal.scss';\n\nexport type OwnProps = {\n attachments: ApiAttachment[];\n caption: string;\n isReady?: boolean;\n currentUserId?: number;\n groupChatMembers?: ApiChatMember[];\n usersById?: Record;\n recentEmojis: string[];\n baseEmojiKeywords?: Record;\n emojiKeywords?: Record;\n addRecentEmoji: AnyToVoidFunction;\n onCaptionUpdate: (html: string) => void;\n onSend: () => void;\n onFileAppend: (files: File[], isQuick: boolean) => void;\n onClear: () => void;\n};\n\nconst DROP_LEAVE_TIMEOUT_MS = 150;\n\nconst AttachmentModal: FC = ({\n attachments,\n caption,\n isReady,\n currentUserId,\n groupChatMembers,\n usersById,\n recentEmojis,\n baseEmojiKeywords,\n emojiKeywords,\n addRecentEmoji,\n onCaptionUpdate,\n onSend,\n onFileAppend,\n onClear,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const hideTimeoutRef = useRef(null);\n const prevAttachments = usePrevious(attachments);\n const renderingAttachments = attachments.length ? attachments : prevAttachments;\n const isOpen = Boolean(attachments.length);\n const [isHovered, markHovered, unmarkHovered] = useFlag();\n const isQuick = Boolean(renderingAttachments && renderingAttachments.every((a) => a.quick));\n const lang = useLang();\n\n const {\n isMentionTooltipOpen, mentionFilter,\n closeMentionTooltip, insertMention,\n mentionFilteredUsers,\n } = useMentionTooltip(\n isOpen,\n caption,\n onCaptionUpdate,\n EDITABLE_INPUT_MODAL_ID,\n groupChatMembers,\n undefined,\n currentUserId,\n usersById,\n );\n const {\n isEmojiTooltipOpen, closeEmojiTooltip, filteredEmojis, insertEmoji,\n } = useEmojiTooltip(\n isOpen,\n caption,\n recentEmojis,\n EDITABLE_INPUT_MODAL_ID,\n onCaptionUpdate,\n baseEmojiKeywords,\n emojiKeywords,\n !isReady,\n );\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]);\n\n const sendAttachments = useCallback(() => {\n if (isOpen) {\n onSend();\n }\n }, [isOpen, onSend]);\n\n const handleDragLeave = (e: React.DragEvent) => {\n const { relatedTarget: toTarget, target: fromTarget } = e;\n\n // Esc button pressed during drag event\n if ((fromTarget as HTMLDivElement).matches('.drop-target') && !toTarget) {\n hideTimeoutRef.current = window.setTimeout(unmarkHovered, DROP_LEAVE_TIMEOUT_MS);\n }\n\n // Prevent DragLeave event from firing when the pointer moves inside the AttachmentModal drop target\n if (fromTarget && (fromTarget as HTMLElement).closest('.AttachmentModal.hovered')) {\n return;\n }\n\n if (toTarget) {\n e.stopPropagation();\n }\n\n unmarkHovered();\n };\n\n const handleFilesDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n unmarkHovered();\n\n const { dataTransfer: { files } } = e;\n\n if (files && files.length) {\n const newFiles = isQuick\n ? Array.from(files).filter((file) => {\n return file.type && CONTENT_TYPES_FOR_QUICK_UPLOAD.has(file.type);\n })\n : Array.from(files);\n\n onFileAppend(newFiles, isQuick);\n }\n }, [isQuick, onFileAppend, unmarkHovered]);\n\n function handleDragOver(e: React.MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n if (hideTimeoutRef.current) {\n window.clearTimeout(hideTimeoutRef.current);\n }\n }\n\n if (!renderingAttachments) {\n return undefined;\n }\n\n const areAllPhotos = renderingAttachments.every((a) => a.mimeType.startsWith('image/'));\n const areAllVideos = renderingAttachments.every((a) => a.mimeType.startsWith('video/'));\n\n let title = '';\n if (areAllPhotos) {\n title = lang('PreviewSender.SendPhoto', renderingAttachments.length, 'i');\n } else if (areAllVideos) {\n title = lang('PreviewSender.SendVideo', renderingAttachments.length, 'i');\n } else {\n title = lang('PreviewSender.SendFile', renderingAttachments.length, 'i');\n }\n\n function renderHeader() {\n if (!renderingAttachments) {\n return undefined;\n }\n\n return (\n
\n \n
{title}
\n \n {lang('Send')}\n \n
\n );\n }\n\n return (\n \n \n {isQuick ? (\n
\n {renderingAttachments.map((attachment) => (\n attachment.mimeType.startsWith('image/')\n ? \"\"\n :
\n ) : (\n
\n {renderingAttachments.map((attachment) => (\n \n ))}\n
\n )}\n\n
\n \n \n \n
\n \n \n );\n};\n\nexport default memo(AttachmentModal);\n","import { ChangeEvent, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiNewPoll } from '../../../api/types';\n\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Modal from '../../ui/Modal';\nimport InputText from '../../ui/InputText';\nimport Checkbox from '../../ui/Checkbox';\nimport RadioGroup from '../../ui/RadioGroup';\n\nimport './PollModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onSend: (pollSummary: ApiNewPoll) => void;\n onClear: () => void;\n};\n\nconst MAX_LIST_HEIGHT = 320;\nconst MAX_OPTIONS_COUNT = 10;\nconst MAX_OPTION_LENGTH = 100;\nconst MAX_QUESTION_LENGTH = 255;\nconst MAX_SOLUTION_LENGTH = 200;\n\nconst PollModal: FC = ({ isOpen, onSend, onClear }) => {\n // eslint-disable-next-line no-null/no-null\n const questionInputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const optionsListRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const solutionRef = useRef(null);\n\n const [question, setQuestion] = useState('');\n const [options, setOptions] = useState(['']);\n const [isAnonymous, setIsAnonymous] = useState(true);\n const [isMultipleAnswers, setIsMultipleAnswers] = useState(false);\n const [isQuizMode, setIsQuizMode] = useState(false);\n const [solution, setSolution] = useState();\n const [correctOption, setCorrectOption] = useState();\n const [hasErrors, setHasErrors] = useState(false);\n\n const lang = useLang();\n\n const focusInput = useCallback((ref: RefObject) => {\n if (isOpen && ref.current) {\n ref.current.focus();\n }\n }, [isOpen]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClear) : undefined), [isOpen, onClear]);\n useEffect(() => {\n if (!isOpen) {\n setQuestion('');\n setOptions(['']);\n setIsAnonymous(true);\n setIsMultipleAnswers(false);\n setIsQuizMode(false);\n setSolution('');\n setCorrectOption('');\n setHasErrors(false);\n }\n }, [isOpen]);\n\n useEffect(() => focusInput(questionInputRef), [focusInput, isOpen]);\n\n useLayoutEffect(() => {\n const solutionEl = solutionRef.current;\n\n if (solutionEl && solution !== solutionEl.innerHTML) {\n solutionEl.innerHTML = solution;\n }\n }, [solution]);\n\n const addNewOption = useCallback((newOptions: string[] = []) => {\n setOptions([...newOptions, '']);\n requestAnimationFrame(() => {\n const list = optionsListRef.current;\n if (!list) {\n return;\n }\n\n list.classList.toggle('overflown', list.scrollHeight > MAX_LIST_HEIGHT);\n list.scrollTo({ top: list.scrollHeight, behavior: 'smooth' });\n });\n }, []);\n\n const handleCreate = useCallback(() => {\n setHasErrors(false);\n if (!isOpen) {\n return;\n }\n\n const questionTrimmed = question.trim().substring(0, MAX_QUESTION_LENGTH);\n const optionsTrimmed = options.map((o) => o.trim().substring(0, MAX_OPTION_LENGTH)).filter((o) => o.length);\n\n if (!questionTrimmed || optionsTrimmed.length < 2) {\n setQuestion(questionTrimmed);\n if (optionsTrimmed.length) {\n if (optionsTrimmed.length < 2) {\n addNewOption(optionsTrimmed);\n } else {\n setOptions(optionsTrimmed);\n }\n } else {\n addNewOption();\n }\n setHasErrors(true);\n return;\n }\n\n if (isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)])) {\n setHasErrors(true);\n return;\n }\n\n const answers = optionsTrimmed\n .map((text, index) => ({\n text: text.trim(),\n option: String(index),\n ...(String(index) === correctOption && { correct: true }),\n }));\n\n const payload: ApiNewPoll = {\n summary: {\n question: questionTrimmed,\n answers,\n ...(!isAnonymous && { isPublic: true }),\n ...(isMultipleAnswers && { multipleChoice: true }),\n ...(isQuizMode && { quiz: true }),\n },\n };\n\n if (isQuizMode) {\n const { text, entities } = (solution && parseMessageInput(solution.substring(0, MAX_SOLUTION_LENGTH))) || {};\n\n payload.quiz = {\n correctAnswers: [correctOption],\n ...(text && { solution: text }),\n ...(entities && { solutionEntities: entities }),\n };\n }\n\n onSend(payload);\n }, [\n isOpen,\n question,\n options,\n isQuizMode,\n correctOption,\n isAnonymous,\n isMultipleAnswers,\n onSend,\n addNewOption,\n solution,\n ]);\n\n const updateOption = useCallback((index: number, text: string) => {\n const newOptions = [...options];\n newOptions[index] = text;\n if (newOptions[newOptions.length - 1].trim().length && newOptions.length < MAX_OPTIONS_COUNT) {\n addNewOption(newOptions);\n } else {\n setOptions(newOptions);\n }\n }, [options, addNewOption]);\n\n const removeOption = useCallback((index: number) => {\n const newOptions = [...options];\n newOptions.splice(index, 1);\n setOptions(newOptions);\n requestAnimationFrame(() => {\n if (!optionsListRef.current) {\n return;\n }\n\n optionsListRef.current.classList.toggle('overflown', optionsListRef.current.scrollHeight > MAX_LIST_HEIGHT);\n });\n }, [options]);\n\n const handleCorrectOptionChange = useCallback((newValue: string) => {\n setCorrectOption(newValue);\n }, [setCorrectOption]);\n\n const handleIsAnonymousChange = useCallback((e: ChangeEvent) => {\n setIsAnonymous(e.target.checked);\n }, []);\n\n const handleMultipleAnswersChange = useCallback((e: ChangeEvent) => {\n setIsMultipleAnswers(e.target.checked);\n }, []);\n\n const handleQuizModeChange = useCallback((e: ChangeEvent) => {\n setIsQuizMode(e.target.checked);\n }, []);\n\n const handleKeyPress = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode === 13) {\n handleCreate();\n }\n }, [handleCreate]);\n\n const getQuestionError = useCallback(() => {\n if (hasErrors && !question.trim().length) {\n return lang('lng_polls_choose_question');\n }\n\n return undefined;\n }, [hasErrors, lang, question]);\n\n const getOptionsError = useCallback((index: number) => {\n const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length);\n if (hasErrors && optionsTrimmed.length < 2 && !options[index].trim().length) {\n return lang('lng_polls_choose_answers');\n }\n return undefined;\n }, [hasErrors, lang, options]);\n\n function renderHeader() {\n return (\n
\n \n
{lang('NewPoll')}
\n \n {lang('Create')}\n \n
\n );\n }\n\n function renderOptions() {\n return options.map((option, index) => (\n
\n updateOption(index, e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n {index !== options.length - 1 && (\n removeOption(index)}\n >\n \n \n )}\n
\n ));\n }\n\n function renderRadioOptions() {\n return renderOptions()\n .map((label, index) => ({ value: String(index), label, hidden: index === options.length - 1 }));\n }\n\n function renderQuizNoOptionError() {\n const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length);\n\n return isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)]) && (\n

{lang('lng_polls_choose_correct')}

\n );\n }\n\n return (\n \n setQuestion(e.currentTarget.value)}\n onKeyPress={handleKeyPress}\n />\n
\n\n
\n

{lang('PollOptions')}

\n\n {hasErrors && renderQuizNoOptionError()}\n {isQuizMode ? (\n \n ) : (\n renderOptions()\n )}\n\n
\n\n
\n\n
\n \n \n \n {isQuizMode && (\n <>\n

{lang('lng_polls_solution_title')}

\n setSolution(e.currentTarget.innerHTML)}\n />\n
{lang('CreatePoll.ExplanationInfo')}
\n \n )}\n
\n \n );\n};\n\nexport default memo(PollModal);\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\n\nconst MENU_CLOSE_TIMEOUT = 250;\nlet closeTimeout: number | undefined;\n\nexport default function useMouseInside(\n isOpen: boolean, onClose: NoneToVoidFunction, menuCloseTimeout = MENU_CLOSE_TIMEOUT, isDisabled = false,\n) {\n const isMouseInside = useRef(false);\n\n useEffect(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n if (isOpen && !IS_TOUCH_ENV && !isDisabled) {\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout * 2);\n }\n }, [isDisabled, isOpen, menuCloseTimeout, onClose]);\n\n const handleMouseEnter = useCallback(() => {\n isMouseInside.current = true;\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout);\n }, [menuCloseTimeout, onClose]);\n\n return [handleMouseEnter, handleMouseLeave];\n}\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\n\nimport './EmojiButton.scss';\n\ntype OwnProps = {\n emoji: Emoji;\n focus?: boolean;\n onClick: (emoji: string, name: string) => void;\n};\n\nconst EmojiButton: FC = ({ emoji, focus, onClick }) => {\n const handleClick = useCallback((e: React.MouseEvent) => {\n // Preventing safari from losing focus on Composer MessageInput\n e.preventDefault();\n\n onClick(emoji.native, emoji.id);\n }, [emoji, onClick]);\n\n return (\n \n {IS_EMOJI_SUPPORTED ? emoji.native : \"\"}\n
\n );\n};\n\nexport default memo(EmojiButton);\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport windowSize from '../../../util/windowSize';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useLang from '../../../hooks/useLang';\n\nimport EmojiButton from './EmojiButton';\n\nconst EMOJIS_PER_ROW_ON_DESKTOP = 9;\nconst EMOJI_MARGIN = 4;\nconst MOBILE_CONTAINER_PADDING = 8;\nconst EMOJI_SIZE = 40;\n\ntype OwnProps = {\n category: EmojiCategory;\n index: number;\n allEmojis: AllEmojis;\n observeIntersection: ObserveFn;\n shouldRender: boolean;\n onEmojiSelect: (emoji: string, name: string) => void;\n};\n\nconst EmojiCategory: FC = ({\n category, index, allEmojis, observeIntersection, shouldRender, onEmojiSelect,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n\n const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow');\n\n const lang = useLang();\n\n const emojisPerRow = IS_SINGLE_COLUMN_LAYOUT\n ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (EMOJI_SIZE + EMOJI_MARGIN))\n : EMOJIS_PER_ROW_ON_DESKTOP;\n const height = Math.ceil(category.emojis.length / emojisPerRow) * (EMOJI_SIZE + EMOJI_MARGIN);\n\n return (\n \n

\n {lang(category.id === 'recent' ? 'RecentStickers' : `Emoji${index}`)}\n

\n \n {shouldRender && category.emojis.map((name) => {\n const emoji = allEmojis[name];\n // Some emojis have multiple skins and are represented as an Object with emojis for all skins.\n // For now, we select only the first emoji with 'neutral' skin.\n const displayedEmoji = 'id' in emoji ? emoji : emoji[1];\n\n return (\n \n );\n })}\n
\n \n );\n};\n\nexport default memo(EmojiCategory);\n","import React, {\n FC, useState, useEffect, memo, useRef, useMemo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { MENU_TRANSITION_DURATION } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../util/environment';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport {\n EmojiModule,\n EmojiRawData,\n EmojiData,\n uncompressEmoji,\n} from '../../../util/emoji';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Loading from '../../ui/Loading';\nimport EmojiCategory from './EmojiCategory';\n\nimport './EmojiPicker.scss';\n\ntype OwnProps = {\n className?: string;\n onEmojiSelect: (emoji: string, name: string) => void;\n};\n\ntype StateProps = Pick;\ntype EmojiCategoryData = { id: string; name: string; emojis: string[] };\n\nconst ICONS_BY_CATEGORY: Record = {\n recent: 'icon-recent',\n people: 'icon-smile',\n nature: 'icon-animals',\n foods: 'icon-eats',\n activity: 'icon-sport',\n places: 'icon-car',\n objects: 'icon-lamp',\n symbols: 'icon-language',\n flags: 'icon-flag',\n};\n\nconst OPEN_ANIMATION_DELAY = 200;\n// Only a few categories are above this height.\nconst SMOOTH_SCROLL_DISTANCE = 800;\nconst FOCUS_MARGIN = 50;\nconst HEADER_BUTTON_WIDTH = 42; // px. Includes margins\nconst INTERSECTION_THROTTLE = 200;\n\nconst categoryIntersections: boolean[] = [];\n\nlet emojiDataPromise: Promise;\nlet emojiRawData: EmojiRawData;\nlet emojiData: EmojiData;\n\nconst EmojiPicker: FC = ({\n className, onEmojiSelect, recentEmojis,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef(null);\n\n const [categories, setCategories] = useState();\n const [emojis, setEmojis] = useState();\n const [activeCategoryIndex, setActiveCategoryIndex] = useState(0);\n\n const { observe: observeIntersection } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE,\n }, (entries) => {\n entries.forEach((entry) => {\n const { id } = entry.target as HTMLDivElement;\n if (!id || !id.startsWith('emoji-category-')) {\n return;\n }\n\n const index = Number(id.replace('emoji-category-', ''));\n categoryIntersections[index] = entry.isIntersecting;\n });\n\n const intersectingWithIndexes = categoryIntersections\n .map((isIntersecting, index) => ({ index, isIntersecting }))\n .filter(({ isIntersecting }) => isIntersecting);\n\n if (!intersectingWithIndexes.length) {\n return;\n }\n\n setActiveCategoryIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index);\n });\n\n useHorizontalScroll(headerRef.current, !IS_SINGLE_COLUMN_LAYOUT);\n\n // Scroll header when active set updates\n useEffect(() => {\n if (!categories) {\n return;\n }\n\n const header = headerRef.current;\n if (!header) {\n return;\n }\n\n const newLeft = activeCategoryIndex * HEADER_BUTTON_WIDTH - header.offsetWidth / 2 + HEADER_BUTTON_WIDTH / 2;\n\n fastSmoothScrollHorizontal(header, newLeft);\n }, [categories, activeCategoryIndex]);\n\n const lang = useLang();\n\n const allCategories = useMemo(() => {\n if (!categories) {\n return MEMO_EMPTY_ARRAY;\n }\n const themeCategories = [...categories];\n if (recentEmojis && recentEmojis.length) {\n themeCategories.unshift({\n id: 'recent',\n name: lang('RecentStickers'),\n emojis: recentEmojis,\n });\n }\n\n return themeCategories;\n }, [categories, lang, recentEmojis]);\n\n // Initialize data on first render.\n useEffect(() => {\n setTimeout(() => {\n const exec = () => {\n setCategories(emojiData.categories);\n\n setEmojis(emojiData.emojis as AllEmojis);\n };\n\n if (emojiData) {\n exec();\n } else {\n ensureEmojiData()\n .then(exec);\n }\n }, OPEN_ANIMATION_DELAY);\n }, []);\n\n const selectCategory = useCallback((index: number) => {\n setActiveCategoryIndex(index);\n const categoryEl = document.getElementById(`emoji-category-${index}`)!;\n fastSmoothScroll(containerRef.current!, categoryEl, 'start', FOCUS_MARGIN, SMOOTH_SCROLL_DISTANCE);\n }, []);\n\n const handleEmojiSelect = useCallback((emoji: string, name: string) => {\n onEmojiSelect(emoji, name);\n }, [onEmojiSelect]);\n\n const canRenderContents = useAsyncRendering([], MENU_TRANSITION_DURATION);\n\n function renderCategoryButton(category: EmojiCategoryData, index: number) {\n const icon = ICONS_BY_CATEGORY[category.id];\n\n return icon && (\n selectCategory(index)}\n ariaLabel={category.name}\n >\n \n \n );\n }\n\n const containerClassName = buildClassName('EmojiPicker', className);\n\n if (!emojis || !canRenderContents) {\n return (\n
\n \n
\n );\n }\n\n return (\n
\n
\n {allCategories.map(renderCategoryButton)}\n
\n \n {allCategories.map((category, i) => (\n = i - 1 && activeCategoryIndex <= i + 1}\n onEmojiSelect={handleEmojiSelect}\n />\n ))}\n
\n \n );\n};\n\nasync function ensureEmojiData() {\n if (!emojiDataPromise) {\n emojiDataPromise = import('emoji-data-ios/emoji-data.json') as unknown as Promise;\n emojiRawData = (await emojiDataPromise).default;\n\n emojiData = uncompressEmoji(emojiRawData);\n }\n\n return emojiDataPromise;\n}\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['recentEmojis']),\n)(EmojiPicker));\n","import React, { FC, memo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiSticker } from '../../../api/types';\nimport { StickerSetOrRecent } from '../../../types';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_PICKER } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport windowSize from '../../../util/windowSize';\nimport StickerButton from '../../common/StickerButton';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\n\ntype OwnProps = {\n stickerSet: StickerSetOrRecent;\n loadAndPlay: boolean;\n index: number;\n observeIntersection: ObserveFn;\n shouldRender: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n onStickerUnfave: (sticker: ApiSticker) => void;\n};\n\nconst STICKERS_PER_ROW_ON_DESKTOP = 5;\nconst STICKER_MARGIN = IS_SINGLE_COLUMN_LAYOUT ? 8 : 16;\nconst MOBILE_CONTAINER_PADDING = 8;\n\nconst StickerSet: FC = ({\n stickerSet,\n loadAndPlay,\n index,\n observeIntersection,\n shouldRender,\n onStickerSelect,\n onStickerUnfave,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n\n const { transitionClassNames } = useShowTransition(shouldRender, undefined, undefined, 'slow');\n\n const stickersPerRow = IS_SINGLE_COLUMN_LAYOUT\n ? Math.floor((windowSize.get().width - MOBILE_CONTAINER_PADDING) / (STICKER_SIZE_PICKER + STICKER_MARGIN))\n : STICKERS_PER_ROW_ON_DESKTOP;\n const height = Math.ceil(stickerSet.count / stickersPerRow) * (STICKER_SIZE_PICKER + STICKER_MARGIN);\n\n return (\n \n

{stickerSet.title}

\n \n {shouldRender && stickerSet.stickers && stickerSet.stickers.map((sticker) => (\n \n ))}\n \n \n );\n};\n\nexport default memo(StickerSet);\n","import React, {\n FC, useState, useEffect, memo, useRef, useMemo, useCallback,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiStickerSet, ApiSticker } from '../../../api/types';\nimport { StickerSetOrRecent } from '../../../types';\n\nimport { SLIDE_TRANSITION_DURATION, STICKER_SIZE_PICKER_HEADER } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useLang from '../../../hooks/useLang';\n\nimport Loading from '../../ui/Loading';\nimport Button from '../../ui/Button';\nimport StickerButton from '../../common/StickerButton';\nimport StickerSet from './StickerSet';\nimport StickerSetCover from './StickerSetCover';\nimport StickerSetCoverAnimated from './StickerSetCoverAnimated';\n\nimport './StickerPicker.scss';\n\ntype OwnProps = {\n className: string;\n loadAndPlay: boolean;\n canSendStickers: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n recentStickers: ApiSticker[];\n favoriteStickers: ApiSticker[];\n stickerSetsById: Record;\n addedSetIds?: string[];\n shouldPlay?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst SMOOTH_SCROLL_DISTANCE = 500;\nconst HEADER_BUTTON_WIDTH = 52; // px (including margin)\nconst STICKER_INTERSECTION_THROTTLE = 200;\n\nconst stickerSetIntersections: boolean[] = [];\n\nconst StickerPicker: FC = ({\n className,\n loadAndPlay,\n canSendStickers,\n recentStickers,\n favoriteStickers,\n addedSetIds,\n stickerSetsById,\n shouldPlay,\n onStickerSelect,\n loadStickerSets,\n loadRecentStickers,\n loadFavoriteStickers,\n loadAddedStickers,\n addRecentSticker,\n unfaveSticker,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const headerRef = useRef(null);\n const [activeSetIndex, setActiveSetIndex] = useState(0);\n\n const { observe: observeIntersection } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: STICKER_INTERSECTION_THROTTLE,\n }, (entries) => {\n entries.forEach((entry) => {\n const { id } = entry.target as HTMLDivElement;\n if (!id || !id.startsWith('sticker-set-')) {\n return;\n }\n\n const index = Number(id.replace('sticker-set-', ''));\n stickerSetIntersections[index] = entry.isIntersecting;\n });\n\n const intersectingWithIndexes = stickerSetIntersections\n .map((isIntersecting, index) => ({ index, isIntersecting }))\n .filter(({ isIntersecting }) => isIntersecting);\n\n if (!intersectingWithIndexes.length) {\n return;\n }\n\n setActiveSetIndex(intersectingWithIndexes[Math.floor(intersectingWithIndexes.length / 2)].index);\n });\n const { observe: observeIntersectionForCovers } = useIntersectionObserver({ rootRef: headerRef });\n\n const lang = useLang();\n\n const areAddedLoaded = Boolean(addedSetIds);\n\n const allSets = useMemo(() => {\n if (!addedSetIds) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return [\n {\n id: 'recent',\n title: lang('RecentStickers'),\n stickers: recentStickers,\n count: recentStickers.length,\n },\n {\n id: 'favorite',\n title: lang('FavoriteStickers'),\n stickers: favoriteStickers,\n count: favoriteStickers.length,\n },\n ...addedSetIds.map((id) => stickerSetsById[id]).filter(Boolean),\n ];\n }, [addedSetIds, lang, recentStickers, favoriteStickers, stickerSetsById]);\n\n const noPopulatedSets = useMemo(() => (\n areAddedLoaded\n && allSets.filter((set) => set.stickers && set.stickers.length).length === 0\n ), [allSets, areAddedLoaded]);\n\n useEffect(() => {\n if (loadAndPlay) {\n loadStickerSets();\n loadRecentStickers();\n loadFavoriteStickers();\n }\n }, [loadAndPlay, loadFavoriteStickers, loadRecentStickers, loadStickerSets]);\n\n useEffect(() => {\n if (addedSetIds && addedSetIds.length) {\n loadAddedStickers();\n }\n }, [addedSetIds, loadAddedStickers]);\n\n useHorizontalScroll(headerRef.current);\n\n // Scroll container and header when active set changes\n useEffect(() => {\n if (!areAddedLoaded) {\n return;\n }\n\n const header = headerRef.current;\n if (!header) {\n return;\n }\n\n const newLeft = activeSetIndex * HEADER_BUTTON_WIDTH - (header.offsetWidth / 2 - HEADER_BUTTON_WIDTH / 2);\n\n fastSmoothScrollHorizontal(header, newLeft);\n }, [areAddedLoaded, activeSetIndex]);\n\n const selectStickerSet = useCallback((index: number) => {\n setActiveSetIndex(index);\n const stickerSetEl = document.getElementById(`sticker-set-${index}`)!;\n fastSmoothScroll(containerRef.current!, stickerSetEl, 'start', undefined, SMOOTH_SCROLL_DISTANCE);\n }, []);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n onStickerSelect(sticker);\n addRecentSticker({ sticker });\n }, [addRecentSticker, onStickerSelect]);\n\n const handleStickerUnfave = useCallback((sticker: ApiSticker) => {\n unfaveSticker({ sticker });\n }, [unfaveSticker]);\n\n const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION);\n\n function renderCover(stickerSet: StickerSetOrRecent, index: number) {\n const firstSticker = stickerSet.stickers && stickerSet.stickers[0];\n const buttonClassName = buildClassName(\n 'symbol-set-button sticker-set-button',\n index === activeSetIndex && 'activated',\n );\n\n if (stickerSet.id === 'recent' || stickerSet.id === 'favorite' || stickerSet.hasThumbnail || !firstSticker) {\n return (\n selectStickerSet(index)}\n >\n {stickerSet.id === 'recent' ? (\n \n ) : stickerSet.id === 'favorite' ? (\n \n ) : stickerSet.isAnimated ? (\n \n ) : (\n \n )}\n \n );\n } else {\n return (\n \n );\n }\n }\n\n const fullClassName = buildClassName('StickerPicker', className);\n\n if (!areAddedLoaded || !canRenderContents || noPopulatedSets || !canSendStickers) {\n return (\n
\n {!canSendStickers ? (\n
Sending stickers is not allowed in this chat.
\n ) : noPopulatedSets ? (\n
You have no saved Stickers.
\n ) : (\n \n )}\n
\n );\n }\n\n return (\n
\n \n {allSets.map(renderCover)}\n
\n \n {allSets.map((stickerSet, i) => (\n = i - 1 && activeSetIndex <= i + 1}\n onStickerSelect={handleStickerSelect}\n onStickerUnfave={handleStickerUnfave}\n />\n ))}\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n setsById,\n added,\n recent,\n favorite,\n } = global.stickers;\n\n return {\n recentStickers: recent.stickers,\n favoriteStickers: favorite.stickers,\n stickerSetsById: setsById,\n addedSetIds: added.setIds,\n shouldPlay: global.settings.byKey.shouldLoopStickers,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadStickerSets',\n 'loadRecentStickers',\n 'loadFavoriteStickers',\n 'loadAddedStickers',\n 'addRecentSticker',\n 'unfaveSticker',\n ]),\n)(StickerPicker));\n","import React, {\n FC, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiVideo } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useTransitionForMedia from '../../hooks/useTransitionForMedia';\nimport useVideoCleanup from '../../hooks/useVideoCleanup';\nimport useBuffering from '../../hooks/useBuffering';\nimport useCanvasBlur from '../../hooks/useCanvasBlur';\n\nimport Spinner from '../ui/Spinner';\n\nimport './GifButton.scss';\n\ntype OwnProps = {\n gif: ApiVideo;\n observeIntersection: ObserveFn;\n isDisabled?: boolean;\n className?: string;\n onClick: (gif: ApiVideo) => void;\n};\n\nconst GifButton: FC = ({\n gif, observeIntersection, isDisabled, className, onClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n\n const hasThumbnail = gif.thumbnail && !!gif.thumbnail.dataUri;\n const localMediaHash = `gif${gif.id}`;\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n const loadAndPlay = isIntersecting && !isDisabled;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const thumbRef = useCanvasBlur(gif.thumbnail && gif.thumbnail.dataUri, Boolean(previewBlobUrl));\n const videoData = useMedia(localMediaHash, !loadAndPlay, ApiMediaFormat.BlobUrl);\n const shouldRenderVideo = Boolean(loadAndPlay && videoData);\n const { transitionClassNames } = useTransitionForMedia(hasThumbnail || previewBlobUrl || videoData, 'slow');\n const { isBuffered, bufferingHandlers } = useBuffering(true);\n const shouldRenderSpinner = loadAndPlay && !isBuffered;\n\n useVideoCleanup(videoRef, [shouldRenderVideo]);\n\n const handleClick = useCallback(\n () => onClick({\n ...gif,\n blobUrl: videoData,\n }),\n [onClick, gif, videoData],\n );\n\n const fullClassName = buildClassName(\n 'GifButton',\n gif.width && gif.height && gif.width < gif.height ? 'vertical' : 'horizontal',\n transitionClassNames,\n localMediaHash,\n className,\n );\n\n return (\n \n {hasThumbnail && (\n \n )}\n {!hasThumbnail && previewBlobUrl && (\n \n )}\n {(shouldRenderVideo || previewBlobUrl) && (\n \n \n \n )}\n {shouldRenderSpinner && (\n \n )}\n \n );\n};\n\nexport default memo(GifButton);\n","import React, {\n FC, useEffect, memo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiVideo } from '../../../api/types';\n\nimport { SLIDE_TRANSITION_DURATION } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\n\nimport Loading from '../../ui/Loading';\nimport GifButton from '../../common/GifButton';\n\nimport './GifPicker.scss';\n\ntype OwnProps = {\n className: string;\n loadAndPlay: boolean;\n canSendGifs: boolean;\n onGifSelect: (gif: ApiVideo) => void;\n};\n\ntype StateProps = {\n savedGifs?: ApiVideo[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifPicker: FC = ({\n className,\n loadAndPlay,\n canSendGifs,\n savedGifs,\n onGifSelect,\n loadSavedGifs,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE });\n\n useEffect(() => {\n if (loadAndPlay) {\n loadSavedGifs();\n }\n }, [loadAndPlay, loadSavedGifs]);\n\n const canRenderContents = useAsyncRendering([], SLIDE_TRANSITION_DURATION);\n\n return (\n \n {!canSendGifs ? (\n
Sending GIFs is not allowed in this chat.
\n ) : canRenderContents && savedGifs && savedGifs.length ? (\n savedGifs.map((gif) => (\n \n ))\n ) : canRenderContents && savedGifs ? (\n
No saved GIFs.
\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n savedGifs: global.gifs.saved.gifs,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadSavedGifs']),\n)(GifPicker));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\n\ntype OwnProps = {\n activeTab: SymbolMenuTabs;\n onSwitchTab: (tab: SymbolMenuTabs) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n};\n\nexport enum SymbolMenuTabs {\n 'Emoji',\n 'Stickers',\n 'GIFs',\n}\n\n// Getting enum string values for display in Tabs.\n// See: https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings\nexport const SYMBOL_MENU_TAB_TITLES = Object.values(SymbolMenuTabs)\n .filter((value): value is string => typeof value === 'string');\n\nconst SYMBOL_MENU_TAB_ICONS = {\n [SymbolMenuTabs.Emoji]: 'icon-smile',\n [SymbolMenuTabs.Stickers]: 'icon-stickers',\n [SymbolMenuTabs.GIFs]: 'icon-gifs',\n};\n\nconst SymbolMenuFooter: FC = ({\n activeTab, onSwitchTab, onRemoveSymbol, onSearchOpen,\n}) => {\n const lang = useLang();\n\n function renderTabButton(tab: SymbolMenuTabs) {\n return (\n onSwitchTab(tab)}\n ariaLabel={SYMBOL_MENU_TAB_TITLES[tab]}\n round\n faded\n color=\"translucent\"\n >\n \n \n );\n }\n\n const handleSearchOpen = useCallback(() => {\n onSearchOpen(activeTab === SymbolMenuTabs.Stickers ? 'stickers' : 'gifs');\n }, [activeTab, onSearchOpen]);\n\n function stopPropagation(event: any) {\n event.stopPropagation();\n }\n\n return (\n
\n {activeTab !== SymbolMenuTabs.Emoji && (\n \n \n \n )}\n\n {renderTabButton(SymbolMenuTabs.Emoji)}\n {renderTabButton(SymbolMenuTabs.Stickers)}\n {renderTabButton(SymbolMenuTabs.GIFs)}\n\n {activeTab === SymbolMenuTabs.Emoji && (\n \n \n \n )}\n
\n );\n};\n\nexport default memo(SymbolMenuFooter);\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker, ApiVideo } from '../../../api/types';\n\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../util/environment';\nimport { fastRaf } from '../../../util/schedulers';\nimport buildClassName from '../../../util/buildClassName';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Menu from '../../ui/Menu';\nimport Transition from '../../ui/Transition';\nimport EmojiPicker from './EmojiPicker';\nimport StickerPicker from './StickerPicker';\nimport GifPicker from './GifPicker';\nimport SymbolMenuFooter, { SYMBOL_MENU_TAB_TITLES, SymbolMenuTabs } from './SymbolMenuFooter';\nimport Portal from '../../ui/Portal';\n\nimport './SymbolMenu.scss';\n\nconst ANIMATION_DURATION = 350;\n\nexport type OwnProps = {\n isOpen: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n onLoad: () => void;\n onClose: () => void;\n onEmojiSelect: (emoji: string) => void;\n onStickerSelect: (sticker: ApiSticker, shouldPreserveInput?: boolean) => void;\n onGifSelect: (gif: ApiVideo) => void;\n onRemoveSymbol: () => void;\n onSearchOpen: (type: 'stickers' | 'gifs') => void;\n addRecentEmoji: AnyToVoidFunction;\n};\n\ntype StateProps = {\n isLeftColumnShown: boolean;\n};\n\nlet isActivated = false;\n\nconst SymbolMenu: FC = ({\n isOpen, allowedAttachmentOptions, isLeftColumnShown,\n onLoad, onClose,\n onEmojiSelect, onStickerSelect, onGifSelect,\n onRemoveSymbol, onSearchOpen, addRecentEmoji,\n}) => {\n const [activeTab, setActiveTab] = useState(0);\n const [recentEmojis, setRecentEmojis] = useState([]);\n\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose, undefined, IS_SINGLE_COLUMN_LAYOUT);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, onClose, false, false);\n\n if (!isActivated && isOpen) {\n isActivated = true;\n }\n\n useEffect(() => {\n onLoad();\n }, [onLoad]);\n\n useLayoutEffect(() => {\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n return undefined;\n }\n\n if (isOpen) {\n document.body.classList.add('enable-symbol-menu-transforms');\n document.body.classList.add('is-symbol-menu-open');\n }\n\n return () => {\n if (isOpen) {\n fastRaf(() => {\n document.body.classList.remove('is-symbol-menu-open');\n setTimeout(() => {\n document.body.classList.remove('enable-symbol-menu-transforms');\n }, ANIMATION_DURATION);\n });\n }\n };\n }, [isOpen]);\n\n const recentEmojisRef = useRef(recentEmojis);\n recentEmojisRef.current = recentEmojis;\n useEffect(() => {\n if (!recentEmojisRef.current.length) {\n return;\n }\n\n recentEmojisRef.current.forEach((name) => {\n addRecentEmoji({ emoji: name });\n });\n\n setRecentEmojis([]);\n }, [isOpen, activeTab, addRecentEmoji]);\n\n const handleEmojiSelect = useCallback((emoji: string, name: string) => {\n setRecentEmojis((emojis) => {\n return [...emojis, name];\n });\n\n onEmojiSelect(emoji);\n }, [onEmojiSelect]);\n\n const handleSearch = useCallback((type: 'stickers' | 'gifs') => {\n onClose();\n onSearchOpen(type);\n }, [onClose, onSearchOpen]);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker) => {\n onStickerSelect(sticker, true);\n }, [onStickerSelect]);\n\n const lang = useLang();\n\n const { canSendStickers, canSendGifs } = allowedAttachmentOptions;\n\n function renderContent(isActive: boolean, isFrom: boolean) {\n switch (activeTab) {\n case SymbolMenuTabs.Emoji:\n return (\n \n );\n case SymbolMenuTabs.Stickers:\n return (\n \n );\n case SymbolMenuTabs.GIFs:\n return (\n \n );\n }\n\n return undefined;\n }\n\n function stopPropagation(event: any) {\n event.stopPropagation();\n }\n\n const content = (\n <>\n
\n {isActivated && (\n \n {renderContent}\n \n )}\n
\n {IS_SINGLE_COLUMN_LAYOUT && (\n \n \n \n )}\n \n \n );\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'SymbolMenu mobile-menu',\n transitionClassNames,\n !isLeftColumnShown && 'middle-column-open',\n );\n\n return (\n \n
\n {content}\n
\n
\n );\n }\n\n return (\n \n {content}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n return {\n isLeftColumnShown: global.isLeftColumnShown,\n };\n },\n)(SymbolMenu));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { CONTENT_TYPES_FOR_QUICK_UPLOAD } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { openSystemFilesDialog } from '../../../util/systemFilesDialog';\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './AttachMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n onFileSelect: (files: File[], isQuick: boolean) => void;\n onPollCreate: () => void;\n onClose: () => void;\n};\n\nconst AttachMenu: FC = ({\n isOpen, allowedAttachmentOptions, onFileSelect, onPollCreate, onClose,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n const handleFileSelect = useCallback((e: Event, isQuick: boolean) => {\n const { files } = e.target as HTMLInputElement;\n\n if (files && files.length > 0) {\n onFileSelect(Array.from(files), isQuick);\n }\n }, [onFileSelect]);\n\n const handleQuickSelect = useCallback(() => {\n openSystemFilesDialog(\n Array.from(CONTENT_TYPES_FOR_QUICK_UPLOAD).join(','),\n (e) => handleFileSelect(e, true),\n );\n }, [handleFileSelect]);\n\n const handleDocumentSelect = useCallback(() => {\n openSystemFilesDialog('*', (e) => handleFileSelect(e, false));\n }, [handleFileSelect]);\n\n const lang = useLang();\n\n const { canAttachMedia, canAttachPolls } = allowedAttachmentOptions;\n\n return (\n \n {/*\n ** Using ternary operator here causes some attributes from first clause\n ** transferring to the fragment content in the second clause\n */}\n {!canAttachMedia && (\n Posting media content is not allowed in this group.\n )}\n {canAttachMedia && (\n <>\n \n {lang('AttachmentMenu.PhotoOrVideo')}\n \n {lang('AttachDocument')}\n \n )}\n {canAttachPolls && (\n {lang('Poll')}\n )}\n \n );\n};\n\nexport default memo(AttachMenu);\n","import React, {\n FC, memo, useEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { STICKER_SIZE_PICKER } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport Loading from '../../ui/Loading';\nimport StickerButton from '../../common/StickerButton';\n\nimport './StickerTooltip.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n stickers?: ApiSticker[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerTooltip: FC = ({\n isOpen,\n onStickerSelect,\n stickers,\n clearStickersForEmoji,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n const prevStickers = usePrevious(stickers, true);\n const displayedStickers = stickers || prevStickers;\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE });\n\n useEffect(() => (isOpen ? captureEscKeyListener(clearStickersForEmoji) : undefined), [isOpen, clearStickersForEmoji]);\n\n const handleMouseEnter = () => {\n document.body.classList.add('no-select');\n };\n\n const handleMouseLeave = () => {\n document.body.classList.remove('no-select');\n };\n\n const className = buildClassName(\n 'StickerTooltip composer-tooltip custom-scroll',\n transitionClassNames,\n !(displayedStickers && displayedStickers.length) && 'hidden',\n );\n\n return (\n \n {shouldRender && displayedStickers ? (\n displayedStickers.map((sticker) => (\n \n ))\n ) : shouldRender ? (\n \n ) : undefined}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { stickers } = global.stickers.forEmoji;\n\n return { stickers };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['clearStickersForEmoji']),\n)(StickerTooltip));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport { selectChatMessage, selectCurrentMessageList } from '../../../modules/selectors';\nimport useMouseInside from '../../../hooks/useMouseInside';\n\nimport Menu from '../../ui/Menu';\nimport Button from '../../ui/Button';\n\nimport './BotKeyboardMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n messageId: number;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n message?: ApiMessage;\n};\n\ntype DispatchProps = Pick;\n\nconst BotKeyboardMenu: FC = ({\n isOpen, message, onClose, clickInlineButton,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n if (!message || !message.keyboardButtons) {\n return undefined;\n }\n\n return (\n \n
\n {message.keyboardButtons.map((row) => (\n
\n {row.map((button) => (\n clickInlineButton({ button })}\n >\n {button.text}\n \n ))}\n
\n ))}\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { messageId }): StateProps => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return {};\n }\n\n return { message: selectChatMessage(global, chatId, messageId) };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'clickInlineButton',\n ]),\n)(BotKeyboardMenu));\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\n\nimport './CustomSendMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onSilentSend?: NoneToVoidFunction;\n onScheduleSend?: NoneToVoidFunction;\n onClose: NoneToVoidFunction;\n onCloseAnimationEnd?: NoneToVoidFunction;\n};\n\nconst CustomSendMenu: FC = ({\n isOpen, onSilentSend, onScheduleSend, onClose, onCloseAnimationEnd,\n}) => {\n const [handleMouseEnter, handleMouseLeave] = useMouseInside(isOpen, onClose);\n\n const lang = useLang();\n\n return (\n \n {onSilentSend && {lang('SendWithoutSound')}}\n {onScheduleSend && {lang('ScheduleMessage')}}\n \n );\n};\n\nexport default memo(CustomSendMenu);\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport cycleRestrict from '../../../util/cycleRestrict';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport findInViewport from '../../../util/findInViewport';\nimport isFullyVisible from '../../../util/isFullyVisible';\nimport fastSmoothScrollHorizontal from '../../../util/fastSmoothScrollHorizontal';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevDuringAnimation from '../../../hooks/usePrevDuringAnimation';\n\nimport Loading from '../../ui/Loading';\nimport EmojiButton from './EmojiButton';\n\nimport './EmojiTooltip.scss';\n\nconst VIEWPORT_MARGIN = 8;\nconst EMOJI_BUTTON_WIDTH = 44;\nconst CLOSE_DURATION = 350;\nconst NO_EMOJI_SELECTED_INDEX = -1;\n\nfunction setItemVisible(index: number, containerRef: Record) {\n const container = containerRef.current!;\n if (!container) {\n return;\n }\n\n const { visibleIndexes, allElements } = findInViewport(\n container,\n '.EmojiButton',\n VIEWPORT_MARGIN,\n true,\n true,\n true,\n );\n\n if (!allElements.length || !allElements[index]) {\n return;\n }\n const first = visibleIndexes[0];\n if (!visibleIndexes.includes(index)\n || (index === first && !isFullyVisible(container, allElements[first], true))) {\n const position = index > visibleIndexes[visibleIndexes.length - 1] ? 'start' : 'end';\n const newLeft = position === 'start' ? index * EMOJI_BUTTON_WIDTH : 0;\n\n fastSmoothScrollHorizontal(container, newLeft);\n }\n}\n\nexport type OwnProps = {\n isOpen: boolean;\n onEmojiSelect: (text: string) => void;\n onClose: NoneToVoidFunction;\n addRecentEmoji: AnyToVoidFunction;\n emojis: Emoji[];\n};\n\nconst EmojiTooltip: FC = ({\n isOpen,\n emojis,\n onClose,\n onEmojiSelect,\n addRecentEmoji,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n const listEmojis: Emoji[] = usePrevDuringAnimation(emojis.length ? emojis : undefined, CLOSE_DURATION) || [];\n\n const [selectedIndex, setSelectedIndex] = useState(NO_EMOJI_SELECTED_INDEX);\n\n useEffect(() => {\n setSelectedIndex(0);\n }, [emojis]);\n\n useEffect(() => {\n setItemVisible(selectedIndex, containerRef);\n }, [selectedIndex]);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!emojis.length) {\n return NO_EMOJI_SELECTED_INDEX;\n }\n\n const emojisCount = emojis.length;\n return cycleRestrict(emojisCount, newIndex);\n }, [emojis]);\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n e.preventDefault();\n setSelectedIndex((index) => (getSelectedIndex(index + value)));\n }, [setSelectedIndex, getSelectedIndex]);\n\n const handleSelectEmoji = useCallback((e: KeyboardEvent) => {\n if (emojis.length && selectedIndex > NO_EMOJI_SELECTED_INDEX) {\n const emoji = emojis[selectedIndex];\n if (emoji) {\n e.preventDefault();\n onEmojiSelect(emoji.native);\n addRecentEmoji({ emoji: emoji.id });\n }\n }\n }, [addRecentEmoji, emojis, onEmojiSelect, selectedIndex]);\n\n const handleClick = useCallback((native: string, id: string) => {\n onEmojiSelect(native);\n addRecentEmoji({ emoji: id });\n }, [addRecentEmoji, onEmojiSelect]);\n\n useEffect(() => (isOpen ? captureKeyboardListeners({\n onEsc: onClose,\n onLeft: (e: KeyboardEvent) => handleArrowKey(-1, e),\n onRight: (e: KeyboardEvent) => handleArrowKey(1, e),\n onEnter: handleSelectEmoji,\n }) : undefined), [handleArrowKey, handleSelectEmoji, isOpen, onClose]);\n\n const handleMouseEnter = () => {\n document.body.classList.add('no-select');\n };\n\n const handleMouseLeave = () => {\n document.body.classList.remove('no-select');\n };\n\n const className = buildClassName(\n 'EmojiTooltip composer-tooltip custom-scroll-x',\n transitionClassNames,\n );\n\n return (\n \n {shouldRender && listEmojis ? (\n listEmojis.map((emoji, index) => (\n \n ))\n ) : shouldRender ? (\n \n ) : undefined}\n \n );\n};\n\nexport default memo(EmojiTooltip);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\n\nimport { ApiWebDocument } from '../../../../api/types';\n\nimport { getFirstLetters } from '../../../../util/textFormat';\nimport renderText from '../../../common/helpers/renderText';\nimport useMedia from '../../../../hooks/useMedia';\n\nimport ListItem from '../../../ui/ListItem';\n\nimport './BaseResult.scss';\n\nexport type OwnProps = {\n focus?: boolean;\n thumbnail?: ApiWebDocument;\n thumbUrl?: string;\n title?: string;\n description?: string;\n transitionClassNames?: string;\n onClick: NoneToVoidFunction;\n};\n\nconst BaseResult: FC = ({\n title,\n description,\n thumbnail,\n thumbUrl,\n focus,\n transitionClassNames = '',\n onClick,\n}) => {\n let content: string | undefined = '';\n\n const thumbnailDataUrl = useMedia(thumbnail ? `webDocument:${thumbnail.url}` : undefined);\n thumbUrl = thumbUrl || thumbnailDataUrl;\n\n if (thumbUrl) {\n content = (\n \"\"\n );\n } else if (title) {\n content = getFirstLetters(title, 1);\n }\n\n return (\n \n \n {typeof content === 'string' ? renderText(content) : content}\n \n
\n {title && (
{title}
)}\n {description && (
{description}
)}\n
\n \n );\n};\n\nexport default memo(BaseResult);\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport {\n ApiBotInlineMediaResult, ApiBotInlineResult, ApiPhoto, ApiThumbnail, ApiWebDocument,\n} from '../../../../api/types';\n\nimport useMedia from '../../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../../hooks/useTransitionForMedia';\n\nimport BaseResult from './BaseResult';\n\nimport './MediaResult.scss';\n\nexport type OwnProps = {\n focus?: boolean;\n isForGallery?: boolean;\n inlineResult: ApiBotInlineMediaResult | ApiBotInlineResult;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst MediaResult: FC = ({\n focus, isForGallery, inlineResult, onClick,\n}) => {\n let photo: ApiPhoto | undefined;\n let thumbnail: ApiThumbnail | undefined;\n let webThumbnail: ApiWebDocument | undefined;\n\n if ('photo' in inlineResult) {\n photo = inlineResult.photo;\n }\n // For results with type=video (for example @stikstokbot)\n if ('thumbnail' in inlineResult) {\n thumbnail = inlineResult.thumbnail;\n }\n if ('webThumbnail' in inlineResult && isForGallery) {\n webThumbnail = inlineResult.webThumbnail;\n }\n\n const thumbnailDataUrl = useMedia(webThumbnail ? `webDocument:${webThumbnail.url}` : undefined);\n const mediaBlobUrl = useMedia(photo && `photo${photo.id}?size=m`);\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(mediaBlobUrl, 'slow');\n\n const handleClick = useCallback(() => {\n onClick(inlineResult);\n }, [inlineResult, onClick]);\n\n if (isForGallery) {\n return (\n
\n {shouldRenderThumb && (\n \"\"\n )}\n {shouldRenderFullMedia && (\n \"\"\n )}\n
\n );\n }\n\n const { title, description } = inlineResult;\n\n return (\n \n );\n};\n\nexport default memo(MediaResult);\n","import React, { FC, memo, useCallback } from '../../../../lib/teact/teact';\n\nimport { ApiBotInlineResult } from '../../../../api/types';\n\nimport BaseResult from './BaseResult';\n\nexport type OwnProps = {\n focus?: boolean;\n inlineResult: ApiBotInlineResult;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst ArticleResult: FC = ({ focus, inlineResult, onClick }) => {\n const {\n title, url, description, webThumbnail,\n } = inlineResult;\n\n const handleClick = useCallback(() => {\n onClick(inlineResult);\n }, [inlineResult, onClick]);\n\n return (\n \n );\n};\n\nexport default memo(ArticleResult);\n","import React, {\n FC, memo, useCallback,\n} from '../../../../lib/teact/teact';\n\nimport { ApiBotInlineMediaResult, ApiBotInlineResult } from '../../../../api/types';\n\nimport { ObserveFn } from '../../../../hooks/useIntersectionObserver';\n\nimport GifButton from '../../../common/GifButton';\n\ntype OwnProps = {\n inlineResult: ApiBotInlineMediaResult;\n observeIntersection: ObserveFn;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst GifResult: FC = ({\n inlineResult, observeIntersection, onClick,\n}) => {\n const { gif } = inlineResult;\n\n const handleClick = useCallback(() => {\n onClick(inlineResult);\n }, [inlineResult, onClick]);\n\n if (!gif) {\n return undefined;\n }\n\n return (\n \n );\n};\n\nexport default memo(GifResult);\n","import React, { FC, memo } from '../../../../lib/teact/teact';\n\nimport { ApiBotInlineMediaResult, ApiBotInlineResult } from '../../../../api/types';\n\nimport { STICKER_SIZE_INLINE_BOT_RESULT } from '../../../../config';\nimport { ObserveFn } from '../../../../hooks/useIntersectionObserver';\n\nimport StickerButton from '../../../common/StickerButton';\n\ntype OwnProps = {\n inlineResult: ApiBotInlineMediaResult;\n observeIntersection: ObserveFn;\n onClick: (result: ApiBotInlineResult) => void;\n};\n\nconst StickerResult: FC = ({ inlineResult, observeIntersection, onClick }) => {\n const { sticker } = inlineResult;\n\n if (!sticker) {\n return undefined;\n }\n\n return (\n \n );\n};\n\nexport default memo(StickerResult);\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiBotInlineMediaResult, ApiBotInlineResult, ApiBotInlineSwitchPm } from '../../../api/types';\nimport { IAllowedAttachmentOptions } from '../../../modules/helpers';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport setTooltipItemVisible from '../../../util/setTooltipItemVisible';\nimport buildClassName from '../../../util/buildClassName';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport cycleRestrict from '../../../util/cycleRestrict';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport { throttle } from '../../../util/schedulers';\nimport { pick } from '../../../util/iteratees';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport MediaResult from './inlineResults/MediaResult';\nimport ArticleResult from './inlineResults/ArticleResult';\nimport GifResult from './inlineResults/GifResult';\nimport StickerResult from './inlineResults/StickerResult';\nimport ListItem from '../../ui/ListItem';\nimport InfiniteScroll from '../../ui/InfiniteScroll';\n\nimport './InlineBotTooltip.scss';\n\nconst INTERSECTION_DEBOUNCE_MS = 200;\nconst runThrottled = throttle((cb) => cb(), 500, true);\n\nexport type OwnProps = {\n isOpen: boolean;\n botId?: number;\n isGallery?: boolean;\n allowedAttachmentOptions: IAllowedAttachmentOptions;\n inlineBotResults?: (ApiBotInlineResult | ApiBotInlineMediaResult)[];\n switchPm?: ApiBotInlineSwitchPm;\n onSelectResult: (inlineResult: ApiBotInlineMediaResult | ApiBotInlineResult) => void;\n loadMore: NoneToVoidFunction;\n onClose: NoneToVoidFunction;\n};\n\ntype DispatchProps = Pick;\n\nconst InlineBotTooltip: FC = ({\n isOpen,\n botId,\n isGallery,\n inlineBotResults,\n switchPm,\n loadMore,\n onClose,\n openChat,\n sendBotCommand,\n onSelectResult,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen, undefined, undefined, false);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({\n rootRef: containerRef,\n debounceMs: INTERSECTION_DEBOUNCE_MS,\n isDisabled: !isOpen,\n });\n\n useEffect(() => {\n setSelectedIndex(isGallery ? -1 : 0);\n }, [inlineBotResults, isGallery]);\n\n useEffect(() => {\n setTooltipItemVisible('.chat-item-clickable', selectedIndex, containerRef);\n }, [selectedIndex]);\n\n const getSelectedIndex = useCallback((newIndex: number) => {\n if (!inlineBotResults || !inlineBotResults.length) {\n return -1;\n }\n\n return cycleRestrict(inlineBotResults.length, newIndex);\n }, [inlineBotResults]);\n\n const handleArrowKey = useCallback((value: number, e: KeyboardEvent) => {\n if (isGallery) {\n return;\n }\n\n e.preventDefault();\n setSelectedIndex((index) => (getSelectedIndex(index + value)));\n }, [isGallery, getSelectedIndex]);\n\n const handleSelectInlineBotResult = useCallback((e: KeyboardEvent) => {\n if (inlineBotResults && inlineBotResults.length && selectedIndex > -1) {\n const inlineResult = inlineBotResults[selectedIndex];\n if (inlineResult) {\n e.preventDefault();\n onSelectResult(inlineResult);\n }\n }\n }, [inlineBotResults, onSelectResult, selectedIndex]);\n\n const handleLoadMore = useCallback(({ direction }: { direction: LoadMoreDirection }) => {\n if (direction === LoadMoreDirection.Backwards) {\n runThrottled(loadMore);\n }\n }, [loadMore]);\n\n\n useEffect(() => (isOpen ? captureKeyboardListeners({\n onEsc: onClose,\n onUp: (e: KeyboardEvent) => handleArrowKey(-1, e),\n onDown: (e: KeyboardEvent) => handleArrowKey(1, e),\n onEnter: handleSelectInlineBotResult,\n }) : undefined), [handleArrowKey, handleSelectInlineBotResult, isGallery, isOpen, onClose]);\n\n const handleSendPm = useCallback(() => {\n openChat({ id: botId });\n sendBotCommand({ chatId: botId, command: `/start ${switchPm!.startParam}` });\n }, [botId, openChat, sendBotCommand, switchPm]);\n\n\n const prevInlineBotResults = usePrevious(\n inlineBotResults && inlineBotResults.length\n ? inlineBotResults\n : undefined,\n shouldRender,\n );\n const renderedInlineBotResults = inlineBotResults && !inlineBotResults.length\n ? prevInlineBotResults\n : inlineBotResults;\n\n if (!shouldRender || !renderedInlineBotResults || (!renderedInlineBotResults.length && !switchPm)) {\n return undefined;\n }\n\n const className = buildClassName(\n 'InlineBotTooltip composer-tooltip',\n IS_TOUCH_ENV ? 'no-scrollbar' : 'custom-scroll',\n isGallery && 'gallery',\n transitionClassNames,\n );\n\n function renderSwitchPm() {\n return (\n \n {switchPm!.text}\n \n );\n }\n\n function renderContent() {\n return renderedInlineBotResults!.map((inlineBotResult, index) => {\n switch (inlineBotResult.type) {\n case 'gif':\n return (\n \n );\n\n case 'photo':\n return (\n \n );\n\n case 'sticker':\n return (\n \n );\n\n case 'video':\n case 'game':\n return (\n \n );\n case 'article':\n case 'audio':\n return (\n \n );\n\n default:\n return undefined;\n }\n });\n }\n\n return (\n \n {switchPm && renderSwitchPm()}\n {renderContent()}\n \n );\n};\n\nexport default memo(withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'sendBotCommand', 'openChat', 'sendInlineBotResult',\n ]),\n)(InlineBotTooltip));\n","import React, {\n FC, useMemo, memo, useRef,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiUser, ApiChat } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\n\nimport {\n selectUser,\n selectChatMessages,\n selectChat,\n selectCurrentTextSearch,\n} from '../../modules/selectors';\nimport {\n getMessageSummaryText,\n getChatTitle,\n getUserFullName,\n isChatChannel,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport { orderBy, pick } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport ListItem from '../ui/ListItem';\nimport LastMessageMeta from '../common/LastMessageMeta';\nimport Avatar from '../common/Avatar';\n\nimport './RightSearch.scss';\n\nexport type OwnProps = {\n chatId: number;\n threadId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n messagesById?: Record;\n query?: string;\n totalCount?: number;\n foundIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\ninterface Result {\n message: ApiMessage;\n senderUser?: ApiUser;\n senderChat?: ApiChat;\n onClick: NoneToVoidFunction;\n}\n\nconst RightSearch: FC = ({\n chatId,\n threadId,\n onClose,\n isActive,\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n searchTextMessagesLocal,\n focusMessage,\n}) => {\n const lang = useLang();\n\n const foundResults = useMemo(() => {\n if (!query || !foundIds || !foundIds.length || !messagesById) {\n return MEMO_EMPTY_ARRAY;\n }\n\n const results = foundIds.map((id) => {\n const message = messagesById[id];\n if (!message) {\n return undefined;\n }\n\n const senderUser = message.senderId ? selectUser(getGlobal(), message.senderId) : undefined;\n\n let senderChat;\n if (chat && isChatChannel(chat)) {\n senderChat = chat;\n } else if (message.forwardInfo) {\n const { isChannelPost, fromChatId } = message.forwardInfo;\n senderChat = isChannelPost && fromChatId ? selectChat(getGlobal(), fromChatId) : undefined;\n } else {\n senderChat = message.senderId ? selectChat(getGlobal(), message.senderId) : undefined;\n }\n\n return {\n message,\n senderUser,\n senderChat,\n onClick: () => focusMessage({ chatId, threadId, messageId: id }),\n };\n }).filter(Boolean) as Result[];\n\n return orderBy(results, ({ message }) => message.date, 'desc');\n }, [chatId, threadId, focusMessage, foundIds, chat, messagesById, query]);\n\n const renderSearchResult = ({\n message, senderUser, senderChat, onClick,\n }: Result) => {\n const title = senderChat ? getChatTitle(lang, senderChat) : getUserFullName(senderUser);\n const text = getMessageSummaryText(lang, message);\n\n return (\n \n \n
\n
\n

{title && renderText(title)}

\n \n
\n
\n {renderText(text, ['emoji', 'highlight'], { highlight: query })}\n
\n
\n \n );\n };\n\n useHistoryBack(isActive, onClose);\n\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const handleKeyDown = useKeyboardListNavigation(containerRef, true, (index) => {\n const foundResult = foundResults && foundResults[index === -1 ? 0 : index];\n if (foundResult) {\n foundResult.onClick();\n }\n }, '.ListItem-button', true);\n\n return (\n \n

\n {!query ? (\n lang('lng_dlg_search_for_messages')\n ) : (totalCount === 0 || !foundResults.length) ? (\n lang('lng_search_no_results')\n ) : totalCount === 1 ? (\n '1 message found'\n ) : (\n `${(foundResults.length && (totalCount || foundResults.length))} messages found`\n )}\n

\n {foundResults.map(renderSearchResult)}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const messagesById = chat && selectChatMessages(global, chat.id);\n if (!chat || !messagesById) {\n return {};\n }\n\n const { query, results } = selectCurrentTextSearch(global) || {};\n const { totalCount, foundIds } = results || {};\n\n return {\n chat,\n messagesById,\n query,\n totalCount,\n foundIds,\n };\n },\n (global, actions): DispatchProps => pick(actions, ['searchTextMessagesLocal', 'focusMessage']),\n)(RightSearch));\n","import React, {\n FC, useEffect, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiStickerSet } from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport { ObserveFn } from '../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_SEARCH } from '../../config';\nimport { pick } from '../../util/iteratees';\nimport { selectShouldLoopStickers, selectStickerSet } from '../../modules/selectors';\nimport useFlag from '../../hooks/useFlag';\nimport useOnChange from '../../hooks/useOnChange';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport StickerButton from '../common/StickerButton';\nimport StickerSetModal from '../common/StickerSetModal.async';\nimport Spinner from '../ui/Spinner';\n\ntype OwnProps = {\n stickerSetId: string;\n observeIntersection: ObserveFn;\n isSomeModalOpen: boolean;\n onModalToggle: (isOpen: boolean) => void;\n};\n\ntype StateProps = {\n set?: ApiStickerSet;\n shouldPlay?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst STICKERS_TO_DISPLAY = 5;\n\nconst StickerSetResult: FC = ({\n stickerSetId, observeIntersection, set, shouldPlay,\n loadStickers, toggleStickerSet, isSomeModalOpen, onModalToggle,\n}) => {\n const lang = useLang();\n const isAdded = set && Boolean(set.installedDate);\n const areStickersLoaded = Boolean(set && set.stickers);\n\n const [isModalOpen, openModal, closeModal] = useFlag();\n\n useOnChange(() => {\n onModalToggle(isModalOpen);\n }, [isModalOpen, onModalToggle]);\n\n const displayedStickers = useMemo(() => {\n if (!set) {\n return [];\n }\n\n const coverStickerIds = (set.covers || []).map(({ id }) => id);\n const otherStickers = set.stickers ? set.stickers.filter(({ id }) => !coverStickerIds.includes(id)) : [];\n\n return [...set.covers || [], ...otherStickers].slice(0, STICKERS_TO_DISPLAY);\n }, [set]);\n\n useEffect(() => {\n // Featured stickers are initialized with one sticker in collection (cover of SickerSet)\n if (!areStickersLoaded && displayedStickers.length < STICKERS_TO_DISPLAY) {\n loadStickers({ stickerSetId });\n }\n }, [areStickersLoaded, displayedStickers.length, loadStickers, stickerSetId]);\n\n const handleAddClick = useCallback(() => {\n toggleStickerSet({ stickerSetId });\n }, [toggleStickerSet, stickerSetId]);\n\n if (!set) {\n return undefined;\n }\n\n const canRenderStickers = displayedStickers.length > 0;\n\n return (\n
\n
\n
\n

{set.title}

\n

{lang('Stickers', set.count, 'i')}

\n
\n \n {lang(isAdded ? 'Stickers.Installed' : 'Stickers.Install')}\n \n
\n
\n {!canRenderStickers && }\n {canRenderStickers && displayedStickers.map((sticker) => (\n \n ))}\n
\n {canRenderStickers && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { stickerSetId }): StateProps => {\n return {\n set: selectStickerSet(global, stickerSetId),\n shouldPlay: selectShouldLoopStickers(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadStickers', 'toggleStickerSet']),\n)(StickerSetResult));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport { throttle } from '../../util/schedulers';\nimport { selectCurrentStickerSearch } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Loading from '../ui/Loading';\nimport StickerSetResult from './StickerSetResult';\n\nimport './StickerSearch.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n query?: string;\n featuredIds?: string[];\n resultIds?: string[];\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst runThrottled = throttle((cb) => cb(), 60000, true);\n\nconst StickerSearch: FC = ({\n onClose,\n isActive,\n query,\n featuredIds,\n resultIds,\n loadFeaturedStickers,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const lang = useLang();\n\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, throttleMs: INTERSECTION_THROTTLE });\n\n // Due to the parent Transition, this component never gets unmounted,\n // that's why we use throttled API call on every update.\n useEffect(() => {\n runThrottled(() => {\n loadFeaturedStickers();\n });\n });\n\n useHistoryBack(isActive, onClose);\n\n function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!query && featuredIds) {\n return featuredIds.map((id) => (\n \n ));\n }\n\n if (resultIds) {\n if (!resultIds.length) {\n return

Nothing found.

;\n }\n\n return resultIds.map((id) => (\n \n ));\n }\n\n return ;\n }\n\n return (\n
\n {renderContent()}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentSearch = selectCurrentStickerSearch(global);\n const { query, resultIds } = currentSearch || {};\n const { featured } = global.stickers;\n\n return {\n query,\n featuredIds: featured.setIds,\n resultIds,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFeaturedStickers']),\n)(StickerSearch));\n","import React, {\n FC, memo, useRef, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiVideo } from '../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport {\n selectCurrentGifSearch,\n selectChat,\n selectIsChatWithBot,\n selectCurrentMessageList,\n} from '../../modules/selectors';\nimport { getAllowedAttachmentOptions } from '../../modules/helpers';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport GifButton from '../common/GifButton';\nimport Loading from '../ui/Loading';\n\nimport './GifSearch.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n query?: string;\n results?: ApiVideo[];\n chat?: ApiChat;\n isChatWithBot?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst PRELOAD_BACKWARDS = 96; // GIF Search bot results are multiplied by 24\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifSearch: FC = ({\n onClose,\n isActive,\n query,\n results,\n chat,\n isChatWithBot,\n searchMoreGifs,\n sendMessage,\n setGifSearchQuery,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({ rootRef: containerRef, debounceMs: INTERSECTION_DEBOUNCE });\n\n const { canSendGifs } = getAllowedAttachmentOptions(chat, isChatWithBot);\n\n const handleGifClick = useCallback((gif: ApiVideo) => {\n if (canSendGifs) {\n sendMessage({ gif });\n }\n\n if (IS_TOUCH_ENV) {\n setGifSearchQuery({ query: undefined });\n }\n }, [canSendGifs, sendMessage, setGifSearchQuery]);\n\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n function renderContent() {\n if (query === undefined) {\n return undefined;\n }\n\n if (!results) {\n return (\n \n );\n }\n\n if (!results.length) {\n return (\n

{lang('NoGIFsFound')}

\n );\n }\n\n return results.map((gif) => (\n \n ));\n }\n\n const hasResults = Boolean(query !== undefined && results && results.length);\n\n return (\n
\n \n {renderContent()}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentSearch = selectCurrentGifSearch(global);\n const { query, results } = currentSearch || {};\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const isChatWithBot = chat ? selectIsChatWithBot(global, chat) : undefined;\n\n return {\n query,\n results,\n chat,\n isChatWithBot,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['searchMoreGifs', 'sendMessage', 'setGifSearchQuery']),\n)(GifSearch));\n","import React, {\n FC, useCallback, useState, memo, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiChat,\n ApiMessage,\n ApiPollAnswer,\n ApiPollResult,\n} from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport { pick } from '../../util/iteratees';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport ShowMoreButton from '../ui/ShowMoreButton';\nimport Loading from '../ui/Loading';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\n\nimport './PollAnswerResults.scss';\n\ntype OwnProps = {\n chat: ApiChat;\n message: ApiMessage;\n answer: ApiPollAnswer;\n answerVote: ApiPollResult;\n totalVoters: number;\n};\n\ntype StateProps = {\n voters?: number[];\n offset: string;\n};\n\ntype DispatchProps = Pick;\n\nconst INITIAL_LIMIT = 4;\nconst VIEW_MORE_LIMIT = 50;\n\nconst PollAnswerResults: FC = ({\n chat,\n message,\n answer,\n answerVote,\n totalVoters,\n voters,\n offset,\n loadPollOptionResults,\n openChat,\n closePollResults,\n}) => {\n const prevVotersCount = usePrevious(answerVote.votersCount);\n const [isLoading, setIsLoading] = useState(true);\n const areVotersLoaded = Boolean(voters);\n const { option, text } = answer;\n const lang = useLang();\n\n useEffect(() => {\n // For update when new votes arrive or when the user takes back his vote\n if (!areVotersLoaded || prevVotersCount !== answerVote.votersCount) {\n loadPollOptionResults({\n chat, messageId: message.id, option, offset, limit: INITIAL_LIMIT, shouldResetVoters: true,\n });\n }\n // eslint-disable-next-line\n }, [answerVote.votersCount, areVotersLoaded]);\n\n const handleViewMoreClick = useCallback(() => {\n setIsLoading(true);\n loadPollOptionResults({\n chat, messageId: message.id, option, offset, limit: VIEW_MORE_LIMIT,\n });\n }, [chat, loadPollOptionResults, message.id, offset, option]);\n\n useEffect(() => {\n setIsLoading(false);\n }, [voters]);\n\n const handleMemberClick = useCallback((id: number) => {\n openChat({ id });\n closePollResults();\n }, [closePollResults, openChat]);\n\n function renderViewMoreButton() {\n const leftVotersCount = answerVote.votersCount - voters!.length;\n\n return answerVote.votersCount > INITIAL_LIMIT && leftVotersCount > 0 && (\n \n );\n }\n\n return (\n
\n
\n {voters\n ? voters.map((id) => (\n handleMemberClick(id)}\n >\n \n \n ))\n : }\n {voters && renderViewMoreButton()}\n
\n
\n {text}\n \n {getPercentage(answerVote.votersCount, totalVoters)}%\n \n
\n
\n );\n};\n\nfunction getPercentage(value: number, total: number) {\n return total > 0 ? ((value / total) * 100).toFixed() : 0;\n}\n\nexport default memo(withGlobal(\n (global, { answer }: OwnProps): StateProps => {\n const { voters, offsets } = global.pollResults;\n\n return {\n voters: voters && voters[answer.option],\n offset: (offsets && offsets[answer.option]) || '',\n };\n },\n (global, actions): DispatchProps => pick(actions, ['loadPollOptionResults', 'openChat', 'closePollResults']),\n)(PollAnswerResults));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiChat } from '../../api/types';\nimport { selectChat, selectChatMessage } from '../../modules/selectors';\nimport { buildCollectionByKey } from '../../util/iteratees';\nimport { getMessagePoll } from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport PollAnswerResults from './PollAnswerResults';\nimport Loading from '../ui/Loading';\n\nimport './PollResults.scss';\n\ntype OwnProps = {\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n message?: ApiMessage;\n lastSyncTime?: number;\n};\n\nconst PollResults: FC = ({\n onClose,\n isActive,\n chat,\n message,\n lastSyncTime,\n}) => {\n const lang = useLang();\n useHistoryBack(isActive, onClose);\n\n if (!message || !chat) {\n return ;\n }\n\n const { summary, results } = getMessagePoll(message)!;\n if (!results.results) {\n return undefined;\n }\n\n const resultsByOption = buildCollectionByKey(results.results, 'option');\n\n return (\n
\n

{summary.question}

\n
\n {lastSyncTime && summary.answers.map((answer) => (\n \n ))}\n {!lastSyncTime && }\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n pollResults: { chatId, messageId },\n lastSyncTime,\n } = global;\n\n if (!chatId || !messageId) {\n return {};\n }\n\n const chat = selectChat(global, chatId);\n const message = selectChatMessage(global, chatId, messageId);\n\n return {\n chat,\n message,\n lastSyncTime,\n };\n },\n)(PollResults));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport {\n selectChat, selectNotifyExceptions, selectNotifySettings, selectUser,\n} from '../../../modules/selectors';\nimport { selectIsChatMuted } from '../../../modules/helpers';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\nimport './Management.scss';\n\ntype OwnProps = {\n userId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat: ApiChat;\n progress?: ManagementProgress;\n isMuted?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide first name';\n\nconst ManageUser: FC = ({\n userId,\n user,\n chat,\n progress,\n isMuted,\n updateContact,\n deleteUser,\n deleteHistory,\n closeManagement,\n openChat,\n onClose,\n isActive,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [error, setError] = useState();\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const currentFirstName = user ? (user.firstName || '') : '';\n const currentLastName = user ? (user.lastName || '') : '';\n\n const [firstName, setFirstName] = useState(currentFirstName);\n const [lastName, setLastName] = useState(currentLastName);\n const [isNotificationsEnabled, setIsNotificationsEnabled] = useState(!isMuted);\n\n useEffect(() => {\n setIsNotificationsEnabled(!isMuted);\n }, [isMuted]);\n\n useEffect(() => {\n setIsProfileFieldsTouched(false);\n closeDeleteDialog();\n }, [closeDeleteDialog, userId]);\n\n useEffect(() => {\n setFirstName(currentFirstName);\n setLastName(currentLastName);\n }, [currentFirstName, currentLastName, user]);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n closeDeleteDialog();\n }\n }, [closeDeleteDialog, progress]);\n\n const handleFirstNameChange = useCallback((e: ChangeEvent) => {\n setFirstName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleLastNameChange = useCallback((e: ChangeEvent) => {\n setLastName(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleNotificationChange = useCallback((e: ChangeEvent) => {\n setIsNotificationsEnabled(e.target.checked);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleProfileSave = useCallback(() => {\n const trimmedFirstName = firstName.trim();\n const trimmedLastName = lastName.trim();\n\n if (!trimmedFirstName.length) {\n setError(ERROR_FIRST_NAME_MISSING);\n }\n\n updateContact({\n userId,\n isMuted: !isNotificationsEnabled,\n firstName: trimmedFirstName,\n lastName: trimmedLastName,\n });\n }, [firstName, lastName, updateContact, userId, isNotificationsEnabled]);\n\n const handleDeleteContact = useCallback(() => {\n deleteHistory({\n chatId: chat.id,\n shouldDeleteForAll: false,\n });\n deleteUser({ userId });\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.id, closeDeleteDialog, closeManagement, deleteHistory, deleteUser, openChat, userId]);\n\n if (!user) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n
\n \n
\n
\n
\n \n {lang('DeleteContact')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId }): StateProps => {\n const user = selectUser(global, userId);\n const chat = selectChat(global, userId)!;\n const { progress } = global.management;\n const isMuted = selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global));\n\n return {\n user, chat, progress, isMuted,\n };\n },\n (global, actions): DispatchProps => pick(actions, [\n 'updateContact', 'deleteUser', 'closeManagement', 'openChat', 'deleteHistory',\n ]),\n)(ManageUser));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiMediaFormat } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { getChatAvatarHash, getHasAdminRight, isChatBasicGroup } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport { selectChat } from '../../../modules/selectors';\nimport { formatInteger } from '../../../util/textFormat';\nimport { pick } from '../../../util/iteratees';\nimport renderText from '../../common/helpers/renderText';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n progress?: ManagementProgress;\n isBasicGroup: boolean;\n hasLinkedChannel: boolean;\n canChangeInfo?: boolean;\n canBanUsers?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst GROUP_TITLE_EMPTY = 'Group title can\\'t be empty';\n\n// Some checkboxes control multiple rights, and some rights are not controlled from Permissions screen,\n// so we need to define the amount manually\nconst TOTAL_PERMISSIONS_COUNT = 8;\n\nconst ManageGroup: FC = ({\n chatId,\n chat,\n progress,\n isBasicGroup,\n hasLinkedChannel,\n canChangeInfo,\n canBanUsers,\n onScreenSelect,\n togglePreHistoryHidden,\n updateChat,\n deleteChat,\n leaveChannel,\n deleteChannel,\n closeManagement,\n openChat,\n onClose,\n isActive,\n}) => {\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const currentTitle = chat.title;\n const currentAbout = chat.fullInfo ? (chat.fullInfo.about || '') : '';\n\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [title, setTitle] = useState(currentTitle);\n const [about, setAbout] = useState(currentAbout);\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n const imageHash = getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const handleClickEditType = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatPrivacyType);\n }, [onScreenSelect]);\n\n const handleClickDiscussion = useCallback(() => {\n onScreenSelect(ManagementScreens.Discussion);\n }, [onScreenSelect]);\n\n const handleClickPermissions = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleSetPhoto = useCallback((file: File) => {\n setPhoto(file);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent) => {\n setAbout(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUpdateGroup = useCallback(() => {\n const trimmedTitle = title.trim();\n const trimmedAbout = about.trim();\n\n if (!trimmedTitle.length) {\n setError(GROUP_TITLE_EMPTY);\n return;\n }\n\n updateChat({\n chatId,\n title: trimmedTitle,\n about: trimmedAbout,\n photo,\n });\n }, [about, chatId, photo, title, updateChat]);\n\n const handleClickMembers = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupMembers);\n }, [onScreenSelect]);\n\n const handleTogglePreHistory = useCallback(() => {\n if (!chat.fullInfo) {\n return;\n }\n\n const { isPreHistoryHidden } = chat.fullInfo;\n\n togglePreHistoryHidden({ chatId: chat.id, isEnabled: !isPreHistoryHidden });\n }, [chat, togglePreHistoryHidden]);\n\n const enabledPermissionsCount = useMemo(() => {\n if (!chat.defaultBannedRights) {\n return 0;\n }\n\n let totalCount = [\n 'sendMessages',\n 'sendMedia',\n 'embedLinks',\n 'sendPolls',\n 'changeInfo',\n 'inviteUsers',\n 'pinMessages',\n ].filter(\n (key) => !chat.defaultBannedRights![key as keyof ApiChatBannedRights],\n ).length;\n\n const { sendStickers, sendGifs } = chat.defaultBannedRights;\n\n // These two rights are controlled with a single checkbox\n if (!sendStickers && !sendGifs) {\n totalCount += 1;\n }\n\n return totalCount;\n }, [chat]);\n\n const adminsCount = (chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0;\n\n const handleDeleteGroup = useCallback(() => {\n if (isBasicGroup) {\n deleteChat({ chatId: chat.id });\n } else if (!chat.isCreator) {\n leaveChannel({ chatId: chat.id });\n } else {\n deleteChannel({ chatId: chat.id });\n }\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [\n isBasicGroup, chat.isCreator, chat.id,\n closeDeleteDialog, closeManagement, leaveChannel, deleteChannel, deleteChat, openChat,\n ]);\n\n if (chat.isRestricted) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n {chat.isCreator && (\n \n {lang('GroupType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n \n )}\n {hasLinkedChannel && (\n \n {lang('LinkedChannel')}\n {lang('DiscussionUnlink')}\n \n )}\n \n {lang('ChannelPermissions')}\n \n {enabledPermissionsCount}/{TOTAL_PERMISSIONS_COUNT}\n \n \n \n {lang('ChannelAdministrators')}\n {formatInteger(adminsCount)}\n \n
\n
\n \n {lang('GroupMembers')}\n {formatInteger(chat.membersCount!)}\n \n\n {chat.fullInfo && (\n
\n \n
\n )}\n
\n
\n \n {lang('DeleteMega')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { progress } = global.management;\n const hasLinkedChannel = Boolean(chat.fullInfo && chat.fullInfo.linkedChatId);\n const isBasicGroup = isChatBasicGroup(chat);\n\n return {\n chat,\n progress,\n isBasicGroup,\n hasLinkedChannel,\n canChangeInfo: isBasicGroup ? chat.isCreator : getHasAdminRight(chat, 'changeInfo'),\n canBanUsers: isBasicGroup ? chat.isCreator : getHasAdminRight(chat, 'banUsers'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'togglePreHistoryHidden', 'updateChat', 'closeManagement',\n 'leaveChannel', 'deleteChannel', 'deleteChat', 'openChat',\n ]),\n)(ManageGroup));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiChatMember } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n currentUserId?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FLOATING_BUTTON_ANIMATION_TIMEOUT_MS = 250;\n\nfunction getLangKeyForBannedRightKey(key: string) {\n switch (key) {\n case 'sendMessages':\n return 'UserRestrictionsNoSend';\n case 'sendMedia':\n return 'UserRestrictionsNoSendMedia';\n case 'sendStickers':\n return 'UserRestrictionsNoSendStickers';\n case 'embedLinks':\n return 'UserRestrictionsNoEmbedLinks';\n case 'sendPolls':\n return 'UserRestrictionsNoSendPolls';\n case 'changeInfo':\n return 'UserRestrictionsNoChangeInfo';\n case 'inviteUsers':\n return 'UserRestrictionsInviteUsers';\n case 'pinMessages':\n return 'UserRestrictionsPinMessages';\n default:\n return undefined;\n }\n}\n\nconst ManageGroupPermissions: FC = ({\n onScreenSelect,\n onChatMemberSelect,\n chat,\n currentUserId,\n updateChatDefaultBannedRights,\n onClose,\n isActive,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const handleRemovedUsersClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupRemovedUsers);\n }, [onScreenSelect]);\n\n const handleAddExceptionClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupUserPermissionsCreate);\n }, [onScreenSelect]);\n\n const handleExceptionMemberClick = useCallback((member: ApiChatMember) => {\n onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId);\n onScreenSelect(ManagementScreens.GroupUserPermissions);\n }, [currentUserId, onChatMemberSelect, onScreenSelect]);\n\n useEffect(() => {\n setPermissions((chat && chat.defaultBannedRights) || {});\n setHavePermissionChanged(false);\n setTimeout(() => {\n setIsLoading(false);\n }, FLOATING_BUTTON_ANIMATION_TIMEOUT_MS);\n }, [chat]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as Exclude]),\n ...(name === 'sendStickers' && {\n sendGifs: getUpdatedPermissionValue(p[name]),\n }),\n }));\n setHavePermissionChanged(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!chat) {\n return;\n }\n\n setIsLoading(true);\n updateChatDefaultBannedRights({ chatId: chat.id, bannedRights: permissions });\n }, [chat, permissions, updateChatDefaultBannedRights]);\n\n const removedUsersCount = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) {\n return 0;\n }\n\n return chat.fullInfo.kickedMembers.length;\n }, [chat]);\n\n const exceptionMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.members) {\n return [];\n }\n\n return chat.fullInfo.members.filter(({ bannedRights }) => !!bannedRights);\n }, [chat]);\n\n const getMemberExceptions = useCallback((member: ApiChatMember) => {\n const { bannedRights } = member;\n if (!bannedRights || !chat) {\n return undefined;\n }\n\n const { defaultBannedRights } = chat;\n\n return Object.keys(bannedRights).reduce((result, key) => {\n if (\n !bannedRights[key as keyof ApiChatBannedRights]\n || (defaultBannedRights && defaultBannedRights[key as keyof ApiChatBannedRights])\n || key === 'sendInline' || key === 'viewMessages' || key === 'sendGames'\n ) {\n return result;\n }\n\n const langKey = getLangKeyForBannedRightKey(key);\n\n if (!langKey) {\n return result;\n }\n\n const translatedString = lang(langKey);\n\n return `${result}${!result.length ? translatedString : `, ${translatedString}`}`;\n }, '');\n }, [chat, lang]);\n\n return (\n
\n
\n
\n

{lang('ChannelPermissionsHeader')}

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n \n {lang('ChannelBlockedUsers')}\n {removedUsersCount}\n \n
\n\n
\n

{lang('PrivacyExceptions')}

\n\n \n {lang('ChannelAddException')}\n \n\n {exceptionMembers.map((member) => (\n handleExceptionMemberClick(member)}\n >\n \n \n ))}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n return { chat, currentUserId: global.currentUserId };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatDefaultBannedRights']),\n)(ManageGroupPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { getUserFullName } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n usersById: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupRemovedUsers: FC = ({\n chat,\n usersById,\n updateChatMemberBannedRights,\n onClose,\n isActive,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const removedMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.kickedMembers) {\n return [];\n }\n\n return chat.fullInfo.kickedMembers;\n }, [chat]);\n\n const getRemovedBy = useCallback((member: ApiChatMember) => {\n if (!member.kickedByUserId) {\n return undefined;\n }\n\n const kickedByUser = usersById[member.kickedByUserId];\n if (!kickedByUser) {\n return undefined;\n }\n\n return lang('UserRemovedBy', getUserFullName(kickedByUser));\n }, [lang, usersById]);\n\n const getContextActions = useCallback((member: ApiChatMember) => {\n if (!chat) {\n return undefined;\n }\n\n return [{\n title: lang('Unblock'),\n icon: 'delete',\n destructive: true,\n handler: () => updateChatMemberBannedRights({\n chatId: chat.id,\n userId: member.userId,\n bannedRights: {},\n }),\n }];\n }, [lang, chat, updateChatMemberBannedRights]);\n\n return (\n
\n
\n
\n

{lang('NoBlockedGroup2')}

\n\n {removedMembers.map((member) => (\n \n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n\n return { chat, usersById };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']),\n)(ManageGroupRemovedUsers));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiMediaFormat } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { getChatAvatarHash, getHasAdminRight } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\n\nimport AvatarEditable from '../../ui/AvatarEditable';\nimport InputText from '../../ui/InputText';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport './Management.scss';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n progress?: ManagementProgress;\n isSignaturesShown: boolean;\n canChangeInfo?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CHANNEL_TITLE_EMPTY = 'Channel title can\\'t be empty';\n\nconst ManageChannel: FC = ({\n chatId,\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo,\n onScreenSelect,\n updateChat,\n toggleSignatures,\n closeManagement,\n leaveChannel,\n deleteChannel,\n openChat,\n onClose,\n isActive,\n}) => {\n const currentTitle = chat ? (chat.title || '') : '';\n const currentAbout = chat && chat.fullInfo ? (chat.fullInfo.about || '') : '';\n const hasLinkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId;\n\n const [isDeleteDialogOpen, openDeleteDialog, closeDeleteDialog] = useFlag();\n const [isProfileFieldsTouched, setIsProfileFieldsTouched] = useState(false);\n const [title, setTitle] = useState(currentTitle);\n const [about, setAbout] = useState(currentAbout);\n const [photo, setPhoto] = useState();\n const [error, setError] = useState();\n const imageHash = chat && getChatAvatarHash(chat);\n const currentAvatarBlobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl);\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n if (progress === ManagementProgress.Complete) {\n setIsProfileFieldsTouched(false);\n setError(undefined);\n }\n }, [progress]);\n\n const adminsCount = (chat && chat.fullInfo && chat.fullInfo.adminMembers && chat.fullInfo.adminMembers.length) || 0;\n\n const handleClickEditType = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatPrivacyType);\n }, [onScreenSelect]);\n\n const handleClickDiscussion = useCallback(() => {\n onScreenSelect(ManagementScreens.Discussion);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleSetPhoto = useCallback((file: File) => {\n setPhoto(file);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent) => {\n setTitle(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleAboutChange = useCallback((e: ChangeEvent) => {\n setAbout(e.target.value);\n setIsProfileFieldsTouched(true);\n }, []);\n\n const handleUpdateChannel = useCallback(() => {\n const trimmedTitle = title.trim();\n const trimmedAbout = about.trim();\n\n if (!trimmedTitle.length) {\n setError(CHANNEL_TITLE_EMPTY);\n return;\n }\n\n updateChat({\n chatId,\n title: trimmedTitle,\n about: trimmedAbout,\n photo,\n });\n }, [about, chatId, photo, title, updateChat]);\n\n const handleToggleSignatures = useCallback(() => {\n toggleSignatures({ chatId, isEnabled: !isSignaturesShown });\n }, [chatId, isSignaturesShown, toggleSignatures]);\n\n const handleClickSubscribers = useCallback(() => {\n onScreenSelect(ManagementScreens.ChannelSubscribers);\n }, [onScreenSelect]);\n\n\n const handleDeleteChannel = useCallback(() => {\n if (chat.isCreator) {\n deleteChannel({ chatId: chat.id });\n } else {\n leaveChannel({ chatId: chat.id });\n }\n\n closeDeleteDialog();\n closeManagement();\n openChat({ id: undefined });\n }, [chat.isCreator, chat.id, closeDeleteDialog, closeManagement, leaveChannel, deleteChannel, openChat]);\n\n if (chat.isRestricted) {\n return undefined;\n }\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n \n \n \n {chat.isCreator && (\n \n {lang('ChannelType')}\n {chat.username ? lang('TypePublic') : lang('TypePrivate')}\n \n )}\n \n {lang('Discussion')}\n {hasLinkedChat ? lang('DiscussionUnlink') : lang('Add')}\n \n \n {lang('ChannelAdministrators')}\n {adminsCount}\n \n
\n \n
\n
\n
\n \n {lang('ChannelSubscribers')}\n {lang('Subscribers', chat.membersCount!, 'i')}\n \n
\n
\n \n {chat.isCreator ? lang('ChannelDelete') : lang('LeaveChannel')}\n \n
\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { progress } = global.management;\n const isSignaturesShown = Boolean(chat && chat.isSignaturesShown);\n\n return {\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'toggleSignatures', 'updateChat', 'closeManagement', 'leaveChannel', 'deleteChannel', 'openChat',\n ]),\n)(ManageChannel));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { selectChat, selectManagement } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport { isChatChannel } from '../../../modules/helpers';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport SafeLink from '../../common/SafeLink';\nimport ListItem from '../../ui/ListItem';\nimport RadioGroup from '../../ui/RadioGroup';\nimport Loading from '../../ui/Loading';\nimport Spinner from '../../ui/Spinner';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport UsernameInput from '../../common/UsernameInput';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype PrivacyType = 'private' | 'public';\n\ntype OwnProps = {\n chatId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n isChannel: boolean;\n progress?: ManagementProgress;\n isUsernameAvailable?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageChatPrivacyType: FC = ({\n chat,\n onClose,\n isActive,\n isChannel,\n progress,\n isUsernameAvailable,\n checkPublicLink,\n updatePublicLink,\n updatePrivateLink,\n}) => {\n const isPublic = Boolean(chat.username);\n const privateLink = chat.fullInfo && chat.fullInfo.inviteLink;\n\n const [privacyType, setPrivacyType] = useState(isPublic ? 'public' : 'private');\n const [username, setUsername] = useState();\n const [isRevokeConfirmDialogOpen, openRevokeConfirmDialog, closeRevokeConfirmDialog] = useFlag();\n\n const canUpdate = (\n (privacyType === 'public' && username && isUsernameAvailable)\n || (privacyType === 'private' && isPublic)\n );\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n if (privacyType && !privateLink) {\n updatePrivateLink();\n }\n }, [privacyType, privateLink, updatePrivateLink]);\n\n const handleOptionChange = useCallback((value: string) => {\n setPrivacyType(value as PrivacyType);\n }, []);\n\n const handleSave = useCallback(() => {\n updatePublicLink({ username: privacyType === 'public' ? username : '' });\n }, [privacyType, updatePublicLink, username]);\n\n const handleRevokePrivateLink = useCallback(() => {\n closeRevokeConfirmDialog();\n updatePrivateLink();\n }, [closeRevokeConfirmDialog, updatePrivateLink]);\n\n const lang = useLang();\n const langPrefix1 = isChannel ? 'Channel' : 'Mega';\n const langPrefix2 = isChannel ? 'Channel' : 'Group';\n\n const options = [\n { value: 'private', label: lang(`${langPrefix1}Private`), subLabel: lang(`${langPrefix1}PrivateInfo`) },\n { value: 'public', label: lang(`${langPrefix1}Public`), subLabel: lang(`${langPrefix1}PublicInfo`) },\n ];\n\n const isLoading = progress === ManagementProgress.InProgress;\n\n return (\n
\n
\n
\n

{lang(`${langPrefix2}Type`)}

\n \n
\n {privacyType === 'private' ? (\n
\n {privateLink ? (\n <>\n \n

\n {lang(`${langPrefix1}PrivateLinkHelp`)}\n

\n\n \n {lang('RevokeLink')}\n \n \n \n ) : (\n \n )}\n
\n ) : (\n
\n \n

\n {lang(`${langPrefix2}.Username.CreatePublicLinkHelp`)}\n

\n
\n )}\n
\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { isUsernameAvailable } = selectManagement(global, chatId)!;\n\n return {\n chat,\n isChannel: isChatChannel(chat),\n progress: global.management.progress,\n isUsernameAvailable,\n };\n },\n (setGlobal, actions) => pick(actions, [\n 'checkPublicLink', 'updatePublicLink', 'updatePrivateLink',\n ]),\n)(ManageChatPrivacyType));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { STICKER_SIZE_DISCUSSION_GROUPS } from '../../../config';\nimport { selectChat } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport getAnimationData from '../../common/helpers/animatedAssets';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\nimport GroupChatInfo from '../../common/GroupChatInfo';\nimport AnimatedSticker from '../../common/AnimatedSticker';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport useFlag from '../../../hooks/useFlag';\nimport renderText from '../../common/helpers/renderText';\nimport Avatar from '../../common/Avatar';\nimport { isChatChannel } from '../../../modules/helpers';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n chatsByIds: Record;\n linkedChat?: ApiChat;\n forDiscussionIds?: number[];\n isChannel?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageDiscussion: FC = ({\n chat,\n onClose,\n isActive,\n chatId,\n chatsByIds,\n linkedChat,\n forDiscussionIds,\n isChannel,\n onScreenSelect,\n loadGroupsForDiscussion,\n linkDiscussionGroup,\n unlinkDiscussionGroup,\n}) => {\n const [linkedGroupId, setLinkedGroupId] = useState();\n const [animationData, setAnimationData] = useState>();\n const [isAnimationLoaded, setIsAnimationLoaded] = useState(false);\n const handleAnimationLoad = useCallback(() => setIsAnimationLoaded(true), []);\n const [isConfirmUnlinkGroupDialogOpen, openConfirmUnlinkGroupDialog, closeConfirmUnlinkGroupDialog] = useFlag();\n const [isConfirmLinkGroupDialogOpen, openConfirmLinkGroupDialog, closeConfirmLinkGroupDialog] = useFlag();\n const lang = useLang();\n const linkedChatId = linkedChat && linkedChat.id;\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n loadGroupsForDiscussion();\n }, [loadGroupsForDiscussion]);\n\n useEffect(() => {\n if (!animationData) {\n getAnimationData('DiscussionGroups').then(setAnimationData);\n }\n }, [animationData]);\n\n const handleUnlinkGroupSessions = useCallback(() => {\n closeConfirmUnlinkGroupDialog();\n unlinkDiscussionGroup({ channelId: isChannel ? chatId : linkedChatId });\n if (!isChannel) {\n onScreenSelect(ManagementScreens.Initial);\n }\n }, [closeConfirmUnlinkGroupDialog, unlinkDiscussionGroup, isChannel, chatId, linkedChatId, onScreenSelect]);\n\n const handleLinkGroupSessions = useCallback(() => {\n closeConfirmLinkGroupDialog();\n linkDiscussionGroup({ channelId: chatId, chatId: linkedGroupId });\n }, [closeConfirmLinkGroupDialog, linkDiscussionGroup, chatId, linkedGroupId]);\n\n const onDiscussionClick = (groupId: number) => {\n setLinkedGroupId(groupId);\n openConfirmLinkGroupDialog();\n };\n\n function renderUnlinkGroupHeader() {\n return (\n
\n \n
\n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n
\n
\n );\n }\n function renderLinkGroupHeader() {\n const linkedGroup = chatsByIds[linkedGroupId];\n\n if (!linkedGroup) {\n return undefined;\n }\n\n return (\n
\n \n
\n {lang('Channel.DiscussionGroup.LinkGroup')}\n
\n
\n );\n }\n\n function renderLinkGroupConfirmText() {\n const linkedGroup = chatsByIds[linkedGroupId];\n\n if (!linkedGroup) {\n return undefined;\n }\n\n if (linkedGroup.hasPrivateLink) {\n return renderText(\n `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?`,\n ['br', 'simple_markdown'],\n );\n // return renderText(\n // lang('DiscussionLinkGroupPublicAlert', linkedChat.title, chat!.title),\n // ['br', 'simple_markdown'],\n // );\n }\n\n return renderText(\n // eslint-disable-next-line max-len\n `Do you want to make **${linkedGroup.title}** the discussion board for **${chat!.title}**?\\n\\nAnyone from the channel will be able to see messages in this group.`,\n ['br', 'simple_markdown'],\n );\n // return renderText(\n // lang('DiscussionLinkGroupPrivateAlert', linkedChat.title, chat!.title),\n // ['br', 'simple_markdown'],\n // );\n }\n\n function renderLinkedGroup() {\n return (\n
\n \n \n \n \n {lang(isChannel ? 'DiscussionUnlinkGroup' : 'DiscussionUnlinkChannel')}\n \n \n
\n );\n }\n\n function renderDiscussionGroups() {\n return (\n
\n

{lang('DiscussionChannelHelp')}

\n\n
\n \n {lang('DiscussionCreateGroup')}\n \n {forDiscussionIds ? (\n forDiscussionIds.map((id, i) => (\n { onDiscussionClick(id); }}\n >\n \n \n ))\n ) : (\n \n )}\n
\n

{lang('DiscussionChannelHelp2')}

\n \n
\n );\n }\n\n return (\n
\n
\n
\n
\n {animationData && (\n \n )}\n
\n {linkedChat && renderLinkedGroup()}\n {!linkedChat && renderDiscussionGroups()}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { forDiscussionIds, byId: chatsByIds } = global.chats;\n const linkedChat = chat && chat.fullInfo && chat.fullInfo.linkedChatId\n ? selectChat(global, chat.fullInfo.linkedChatId)\n : undefined;\n\n return {\n chat,\n chatsByIds,\n forDiscussionIds,\n linkedChat,\n isChannel: chat && isChatChannel(chat),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadGroupsForDiscussion', 'linkDiscussionGroup', 'unlinkDiscussionGroup',\n ]),\n)(ManageDiscussion));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatBannedRights } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\n\ntype OwnProps = {\n chatId: number;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isFormFullyDisabled?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupUserPermissions: FC = ({\n chat,\n selectedChatMemberId,\n onScreenSelect,\n updateChatMemberBannedRights,\n isFormFullyDisabled,\n onClose,\n isActive,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [havePermissionChanged, setHavePermissionChanged] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isBanConfirmationDialogOpen, openBanConfirmationDialog, closeBanConfirmationDialog] = useFlag();\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const selectedChatMember = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.members) {\n return undefined;\n }\n\n return chat.fullInfo.members.find(({ userId }) => userId === selectedChatMemberId);\n }, [chat, selectedChatMemberId]);\n\n useEffect(() => {\n if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.GroupPermissions);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember && selectedChatMember.bannedRights) || (chat && chat.defaultBannedRights) || {});\n setHavePermissionChanged(false);\n setIsLoading(false);\n }, [chat, selectedChatMember]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as Exclude]),\n ...(name === 'sendStickers' && {\n sendGifs: getUpdatedPermissionValue(p[name]),\n }),\n }));\n setHavePermissionChanged(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!chat || !selectedChatMemberId) {\n return;\n }\n\n setIsLoading(true);\n updateChatMemberBannedRights({\n chatId: chat.id,\n userId: selectedChatMemberId,\n bannedRights: permissions,\n });\n }, [chat, selectedChatMemberId, permissions, updateChatMemberBannedRights]);\n\n const handleBanFromGroup = useCallback(() => {\n if (!chat || !selectedChatMemberId) {\n return;\n }\n\n updateChatMemberBannedRights({\n chatId: chat.id,\n userId: selectedChatMemberId,\n bannedRights: {\n viewMessages: true,\n },\n });\n }, [chat, selectedChatMemberId, updateChatMemberBannedRights]);\n\n const getControlIsDisabled = useCallback((key: Exclude) => {\n if (isFormFullyDisabled) {\n return true;\n }\n\n if (!chat || !chat.defaultBannedRights) {\n return false;\n }\n\n return chat.defaultBannedRights[key];\n }, [chat, isFormFullyDisabled]);\n\n if (!selectedChatMember) {\n return undefined;\n }\n\n return (\n
\n
\n
\n \n \n \n\n

{lang('UserRestrictionsCanDo')}

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n {!isFormFullyDisabled && (\n
\n \n {lang('UserRestrictionsBlock')}\n \n
\n )}\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId, isPromotedByCurrentUser }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser);\n\n return { chat, isFormFullyDisabled };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatMemberBannedRights']),\n)(ManageGroupUserPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\n\nimport { getUserFullName, isChatChannel } from '../../../modules/helpers';\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n currentUserId?: number;\n isChannel: boolean;\n usersById: Record;\n};\n\nconst ManageChatAdministrators: FC = ({\n chat,\n isChannel,\n currentUserId,\n usersById,\n onScreenSelect,\n onChatMemberSelect,\n onClose,\n isActive,\n}) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n function handleRecentActionsClick() {\n onScreenSelect(ManagementScreens.GroupRecentActions);\n }\n\n const adminMembers = useMemo(() => {\n if (!chat.fullInfo || !chat.fullInfo.adminMembers) {\n return [];\n }\n\n return chat.fullInfo.adminMembers.sort((a, b) => {\n if (a.isOwner) {\n return -1;\n } else if (b.isOwner) {\n return 1;\n }\n\n return 0;\n });\n }, [chat]);\n\n const handleAdminMemberClick = useCallback((member: ApiChatMember) => {\n onChatMemberSelect(member.userId, member.promotedByUserId === currentUserId);\n onScreenSelect(ManagementScreens.ChatAdminRights);\n }, [currentUserId, onChatMemberSelect, onScreenSelect]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n const promotedByUser = member.promotedByUserId ? usersById[member.promotedByUserId] : undefined;\n\n if (promotedByUser) {\n return lang('EditAdminPromotedBy', getUserFullName(promotedByUser));\n }\n\n return lang('ChannelAdmin');\n }, [lang, usersById]);\n\n return (\n
\n
\n
\n \n {lang('EventLog')}\n {lang(isChannel ? 'EventLogInfoDetailChannel' : 'EventLogInfoDetail')}\n \n
\n\n
\n

\n {isChannel\n ? 'You can add administrators to help you manage your channel.'\n : 'You can add administrators to help you manage your group.'}\n

\n\n {adminMembers.map((member) => (\n handleAdminMemberClick(member)}\n >\n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { byId: usersById } = global.users;\n\n return {\n chat,\n currentUserId: global.currentUserId,\n isChannel: isChatChannel(chat),\n usersById,\n };\n },\n // (setGlobal, actions): DispatchProps => pick(actions, ['togglePreHistoryHidden', 'updateChat']),\n)(ManageChatAdministrators));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember } from '../../../api/types';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\n\ntype OwnProps = {\n chatId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n};\n\nconst ManageGroupRecentActions: FC = ({ chat, onClose, isActive }) => {\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const adminMembers = useMemo(() => {\n if (!chat || !chat.fullInfo || !chat.fullInfo.adminMembers) {\n return [];\n }\n\n return chat.fullInfo.adminMembers.sort((a, b) => {\n if (a.isOwner) {\n return -1;\n } else if (b.isOwner) {\n return 1;\n }\n\n return 0;\n });\n }, [chat]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n return lang('ChannelAdmin');\n }, [lang]);\n\n return (\n
\n
\n
\n

Actions

\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n

{lang('Channel.Management.Title')}

\n\n
\n \n
\n\n {adminMembers.map((member) => (\n \n \n \n \n ))}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n return { chat };\n },\n)(ManageGroupRecentActions));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatAdminRights, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectChat } from '../../../modules/selectors';\nimport { getUserFullName, isChatBasicGroup, isChatChannel } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\nimport ConfirmDialog from '../../ui/ConfirmDialog';\nimport InputText from '../../ui/InputText';\n\ntype OwnProps = {\n chatId: number;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat: ApiChat;\n usersById: Record;\n currentUserId?: number;\n isChannel: boolean;\n isFormFullyDisabled: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CUSTOM_TITLE_MAX_LENGTH = 16;\n\nconst ManageGroupAdminRights: FC = ({\n selectedChatMemberId,\n onScreenSelect,\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n updateChatAdmin,\n onClose,\n isActive,\n}) => {\n const [permissions, setPermissions] = useState({});\n const [isTouched, setIsTouched] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isDismissConfirmationDialogOpen, openDismissConfirmationDialog, closeDismissConfirmationDialog] = useFlag();\n const [customTitle, setCustomTitle] = useState('');\n const lang = useLang();\n\n useHistoryBack(isActive, onClose);\n\n const selectedChatMember = useMemo(() => {\n if (!chat.fullInfo || !chat.fullInfo.adminMembers) {\n return undefined;\n }\n\n return chat.fullInfo.adminMembers.find(({ userId }) => userId === selectedChatMemberId);\n }, [chat, selectedChatMemberId]);\n\n useEffect(() => {\n if (chat && chat.fullInfo && selectedChatMemberId && !selectedChatMember) {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }\n }, [chat, onScreenSelect, selectedChatMember, selectedChatMemberId]);\n\n useEffect(() => {\n setPermissions((selectedChatMember && selectedChatMember.adminRights) || {});\n setCustomTitle(((selectedChatMember && selectedChatMember.customTitle) || '').substr(0, CUSTOM_TITLE_MAX_LENGTH));\n setIsTouched(false);\n setIsLoading(false);\n }, [selectedChatMember]);\n\n const handlePermissionChange = useCallback((e: React.ChangeEvent) => {\n const { name } = e.target;\n\n function getUpdatedPermissionValue(value: true | undefined) {\n return value ? undefined : true;\n }\n\n setPermissions((p) => ({\n ...p,\n [name]: getUpdatedPermissionValue(p[name as keyof ApiChatAdminRights]),\n }));\n setIsTouched(true);\n }, []);\n\n const handleSavePermissions = useCallback(() => {\n if (!selectedChatMemberId) {\n return;\n }\n\n setIsLoading(true);\n updateChatAdmin({\n chatId: chat.id,\n userId: selectedChatMemberId,\n adminRights: permissions,\n customTitle,\n });\n }, [chat, selectedChatMemberId, permissions, customTitle, updateChatAdmin]);\n\n const handleDismissAdmin = useCallback(() => {\n if (!selectedChatMemberId) {\n return;\n }\n\n updateChatAdmin({\n chatId: chat.id,\n userId: selectedChatMemberId,\n adminRights: {},\n });\n closeDismissConfirmationDialog();\n }, [chat.id, closeDismissConfirmationDialog, selectedChatMemberId, updateChatAdmin]);\n\n const getControlIsDisabled = useCallback((key: keyof ApiChatAdminRights) => {\n if (isChatBasicGroup(chat)) {\n return false;\n }\n\n if (isFormFullyDisabled || !chat.adminRights) {\n return true;\n }\n\n return !chat.adminRights![key];\n }, [chat, isFormFullyDisabled]);\n\n const memberStatus = useMemo(() => {\n if (!selectedChatMember) {\n return undefined;\n }\n\n if (selectedChatMember.isOwner) {\n return lang('ChannelCreator');\n }\n\n const promotedByUser = selectedChatMember.promotedByUserId\n ? usersById[selectedChatMember.promotedByUserId]\n : undefined;\n\n if (promotedByUser) {\n return lang('EditAdminPromotedBy', getUserFullName(promotedByUser));\n }\n\n return lang('ChannelAdmin');\n }, [selectedChatMember, usersById, lang]);\n\n const handleCustomTitleChange = useCallback((e) => {\n const { value } = e.target;\n setCustomTitle(value);\n setIsTouched(true);\n }, []);\n\n if (!selectedChatMember) {\n return undefined;\n }\n\n return (\n
\n
\n
\n \n \n \n\n

{lang('EditAdminWhatCanDo')}

\n\n
\n \n
\n {isChannel && (\n
\n \n
\n )}\n {isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n
\n \n
\n {!isChannel && (\n
\n \n
\n )}\n\n {isFormFullyDisabled && (\n

\n {lang('Channel.EditAdmin.CannotEdit')}\n

\n )}\n\n {!isChannel && (\n \n )}\n\n {currentUserId !== selectedChatMemberId && !isFormFullyDisabled && (\n \n {lang('EditAdminRemoveAdmin')}\n \n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n \n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId, isPromotedByCurrentUser }): StateProps => {\n const chat = selectChat(global, chatId)!;\n const { byId: usersById } = global.users;\n const { currentUserId } = global;\n const isChannel = isChatChannel(chat);\n const isFormFullyDisabled = !(chat.isCreator || isPromotedByCurrentUser);\n\n return {\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['updateChatAdmin']),\n)(ManageGroupAdminRights));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { selectChat } from '../../../modules/selectors';\nimport { sortUserIds, isChatChannel } from '../../../modules/helpers';\nimport { pick } from '../../../util/iteratees';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport NothingFound from '../../common/NothingFound';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: number;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst ManageGroupMembers: FC = ({\n members,\n usersById,\n isChannel,\n openUserInfo,\n onClose,\n isActive,\n serverTimeOffset,\n}) => {\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(members.map(({ userId }) => userId), usersById, undefined, serverTimeOffset);\n }, [members, serverTimeOffset, usersById]);\n\n const handleMemberClick = useCallback((id: number) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n useHistoryBack(isActive, onClose);\n\n return (\n
\n
\n
\n {memberIds ? (\n memberIds.map((id, i) => (\n handleMemberClick(id)}\n >\n \n \n ))\n ) : (\n \n )}\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n serverTimeOffset: global.serverTimeOffset,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n ]),\n)(ManageGroupMembers));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { sortUserIds, isChatChannel } from '../../../modules/helpers';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport PrivateChatInfo from '../../common/PrivateChatInfo';\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\n\ntype OwnProps = {\n chatId: number;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n usersById: Record;\n members?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\nconst ManageGroupUserPermissionsCreate: FC = ({\n usersById,\n members,\n isChannel,\n onScreenSelect,\n onChatMemberSelect,\n onClose,\n isActive,\n serverTimeOffset,\n}) => {\n useHistoryBack(isActive, onClose);\n\n const memberIds = useMemo(() => {\n if (!members || !usersById) {\n return undefined;\n }\n\n return sortUserIds(\n members.filter((member) => !member.isOwner).map(({ userId }) => userId),\n usersById, undefined, serverTimeOffset,\n );\n }, [members, serverTimeOffset, usersById]);\n\n const handleExceptionMemberClick = useCallback((memberId: number) => {\n onChatMemberSelect(memberId);\n onScreenSelect(ManagementScreens.GroupUserPermissions);\n }, [onChatMemberSelect, onScreenSelect]);\n\n return (\n
\n
\n
\n {memberIds ? (\n memberIds.map((id, i) => (\n handleExceptionMemberClick(id)}\n >\n \n \n ))\n ) : (\n \n )}\n
\n
\n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { byId: usersById } = global.users;\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n usersById,\n isChannel,\n serverTimeOffset: global.serverTimeOffset,\n };\n },\n)(ManageGroupUserPermissionsCreate));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementType } from '../../../types';\n\nimport { selectCurrentManagementType } from '../../../modules/selectors';\n\nimport ManageUser from './ManageUser';\nimport ManageGroup from './ManageGroup';\nimport ManageGroupPermissions from './ManageGroupPermissions';\nimport ManageGroupRemovedUsers from './ManageGroupRemovedUsers';\nimport ManageChannel from './ManageChannel';\nimport ManageChatPrivacyType from './ManageChatPrivacyType';\nimport ManageDiscussion from './ManageDiscussion';\nimport ManageGroupUserPermissions from './ManageGroupUserPermissions';\nimport ManageChatAdministrators from './ManageChatAdministrators';\nimport ManageGroupRecentActions from './ManageGroupRecentActions';\nimport ManageGroupAdminRights from './ManageGroupAdminRights';\nimport ManageGroupMembers from './ManageGroupMembers';\nimport ManageGroupUserPermissionsCreate from './ManageGroupUserPermissionsCreate';\n\nexport type OwnProps = {\n chatId: number;\n currentScreen: ManagementScreens;\n selectedChatMemberId?: number;\n isPromotedByCurrentUser?: boolean;\n onScreenSelect: (screen: ManagementScreens) => void;\n onChatMemberSelect: (memberId: number, isPromotedByCurrentUser?: boolean) => void;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n managementType?: ManagementType;\n};\n\nconst Management: FC = ({\n chatId,\n currentScreen,\n selectedChatMemberId,\n isPromotedByCurrentUser,\n onScreenSelect,\n onChatMemberSelect,\n onClose,\n isActive,\n managementType,\n}) => {\n switch (currentScreen) {\n case ManagementScreens.Initial: {\n switch (managementType) {\n case 'user':\n return (\n \n );\n case 'group':\n return (\n \n );\n case 'channel':\n return (\n \n );\n }\n\n break;\n }\n\n case ManagementScreens.ChatPrivacyType:\n return (\n \n );\n\n case ManagementScreens.Discussion:\n return (\n \n );\n\n case ManagementScreens.GroupPermissions:\n return (\n \n );\n\n case ManagementScreens.GroupRemovedUsers:\n return (\n \n );\n\n case ManagementScreens.GroupUserPermissionsCreate:\n return (\n \n );\n\n case ManagementScreens.GroupUserPermissions:\n return (\n \n );\n\n case ManagementScreens.ChatAdministrators:\n return (\n \n );\n\n case ManagementScreens.GroupRecentActions:\n return (\n \n );\n\n case ManagementScreens.ChatAdminRights:\n return (\n \n );\n\n case ManagementScreens.ChannelSubscribers:\n case ManagementScreens.GroupMembers:\n return (\n \n );\n }\n\n return undefined; // Never reached\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const managementType = selectCurrentManagementType(global);\n\n return {\n managementType,\n };\n },\n)(Management));\n","const CURRENCIES: Record = {\n USD: '$',\n EUR: '€',\n GBP: '£',\n JPY: '¥',\n RUB: '₽',\n UAH: '₴',\n INR: '₹',\n AED: 'د.إ',\n};\n\nexport function getCurrencySign(currency: string | undefined): string {\n if (!currency) {\n return '';\n }\n return CURRENCIES[currency] || '';\n}\n","const VISA = /^4[0-9]{12}(?:[0-9]{1,3})?$/;\nconst MASTERCARD1 = /^5[1-5][0-9]{11,14}$/;\nconst MASTERCARD2 = /^2[2-7][0-9]{11,14}$/;\n\nexport enum CardType {\n Default,\n Visa,\n Mastercard,\n}\n\nconst cards: Record = {\n [CardType.Default]: '',\n [CardType.Visa]: 'visa',\n [CardType.Mastercard]: 'mastercard',\n};\n\nexport function detectCardType(cardNumber: string): number {\n cardNumber = cardNumber.replace(/\\s/g, '');\n if (VISA.test(cardNumber)) {\n return CardType.Visa;\n }\n if (MASTERCARD1.test(cardNumber) || MASTERCARD2.test(cardNumber)) {\n return CardType.Mastercard;\n }\n return CardType.Default;\n}\n\nexport function detectCardTypeText(cardNumber: string): string {\n const cardType = detectCardType(cardNumber);\n return cards[cardType as number] || '';\n}\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { countryList } from '../../util/phoneNumber';\n\nexport type FormState = {\n streetLine1: string;\n streetLine2: string;\n city: string;\n state: string;\n countryIso2: string;\n postCode: string;\n fullName: string;\n email: string;\n phone: string;\n shipping: string;\n cardNumber: string;\n cardholder: string;\n expiry: string;\n cvv: string;\n billingCountry: string;\n billingZip: string;\n saveInfo: boolean;\n saveCredentials: boolean;\n formErrors: Record;\n};\n\nexport type FormActions = (\n 'changeAddress1' | 'changeAddress2' | 'changeCity' | 'changeState' | 'changeCountry' |\n 'changePostCode' | 'changeFullName' | 'changeEmail' | 'changePhone' | 'changeShipping' | 'updateUserInfo' |\n 'changeCardNumber' | 'changeCardholder' | 'changeExpiryDate' | 'changeCvvCode' | 'changeBillingCountry' |\n 'changeBillingZip' | 'changeSaveInfo' | 'changeSaveCredentials' | 'setFormErrors'\n);\nexport type FormEditDispatch = Dispatch;\n\nconst INITIAL_STATE: FormState = {\n streetLine1: '',\n streetLine2: '',\n city: '',\n state: '',\n countryIso2: '',\n postCode: '',\n fullName: '',\n email: '',\n phone: '',\n shipping: '',\n cardNumber: '',\n cardholder: '',\n expiry: '',\n cvv: '',\n billingCountry: '',\n billingZip: '',\n saveInfo: true,\n saveCredentials: false,\n formErrors: {},\n};\n\nconst reducer: StateReducer = (state, action) => {\n switch (action.type) {\n case 'changeAddress1':\n return {\n ...state,\n streetLine1: action.payload,\n formErrors: {\n ...state.formErrors,\n streetLine1: undefined,\n },\n };\n case 'changeAddress2':\n return {\n ...state,\n streetLine2: action.payload,\n formErrors: {\n ...state.formErrors,\n streetLine2: undefined,\n },\n };\n case 'changeCity':\n return {\n ...state,\n city: action.payload,\n formErrors: {\n ...state.formErrors,\n city: undefined,\n },\n };\n case 'changeState':\n return {\n ...state,\n state: action.payload,\n formErrors: {\n ...state.formErrors,\n state: undefined,\n },\n };\n case 'changeCountry':\n return {\n ...state,\n countryIso2: action.payload,\n billingCountry: getBillingCountry(action.payload),\n formErrors: {\n ...state.formErrors,\n countryIso2: undefined,\n },\n };\n case 'changePostCode':\n return {\n ...state,\n postCode: action.payload,\n formErrors: {\n ...state.formErrors,\n postCode: undefined,\n },\n };\n case 'changeFullName':\n return {\n ...state,\n fullName: action.payload,\n formErrors: {\n ...state.formErrors,\n fullName: undefined,\n },\n };\n case 'changeEmail':\n return {\n ...state,\n email: action.payload,\n formErrors: {\n ...state.formErrors,\n email: undefined,\n },\n };\n case 'changePhone':\n return {\n ...state,\n phone: action.payload,\n formErrors: {\n ...state.formErrors,\n phone: undefined,\n },\n };\n case 'changeShipping':\n return { ...state, shipping: action.payload };\n case 'changeCardNumber':\n return {\n ...state,\n cardNumber: action.payload,\n formErrors: {\n ...state.formErrors,\n cardNumber: undefined,\n },\n };\n case 'changeCardholder':\n return {\n ...state,\n cardholder: action.payload,\n formErrors: {\n ...state.formErrors,\n cardholder: undefined,\n },\n };\n case 'changeExpiryDate':\n return {\n ...state,\n expiry: action.payload,\n formErrors: {\n ...state.formErrors,\n expiry: undefined,\n },\n };\n case 'changeCvvCode':\n return {\n ...state,\n cvv: action.payload,\n formErrors: {\n ...state.formErrors,\n cvv: undefined,\n },\n };\n case 'changeBillingCountry':\n return {\n ...state,\n billingCountry: action.payload,\n formErrors: {\n ...state.formErrors,\n billingCountry: undefined,\n },\n };\n case 'changeBillingZip':\n return {\n ...state,\n billingZip: action.payload,\n formErrors: {\n ...state.formErrors,\n billingZip: undefined,\n },\n };\n case 'changeSaveInfo':\n return { ...state, saveInfo: action.payload };\n case 'changeSaveCredentials':\n return { ...state, saveCredentials: action.payload };\n case 'updateUserInfo':\n if (action.payload.countryIso2) {\n return {\n ...state,\n ...action.payload,\n billingCountry: getBillingCountry(action.payload.countryIso2),\n };\n }\n return { ...state, ...action.payload };\n case 'setFormErrors':\n return {\n ...state,\n formErrors: {\n ...state.formErrors,\n ...action.payload,\n },\n };\n default:\n return state;\n }\n};\n\nfunction getBillingCountry(countryCode: string) {\n const country = countryList.find(({ id }) => id === countryCode);\n return country ? country.name : '';\n}\n\nexport default () => {\n return useReducer(reducer, INITIAL_STATE);\n};\n","import { RefObject } from 'react';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\nimport { fastRaf } from '../util/schedulers';\nimport { useEffect } from '../lib/teact/teact';\n\nconst DEFAULT_DURATION = 400;\n\nexport default function useFocusAfterAnimation(\n ref: RefObject, animationDuration = DEFAULT_DURATION,\n) {\n useEffect(() => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n setTimeout(() => {\n fastRaf(() => {\n if (ref.current) {\n ref.current.focus();\n }\n });\n }, animationDuration);\n }, [ref, animationDuration]);\n}\n","import { ChangeEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n id?: string;\n value?: string;\n label?: string;\n error?: string;\n ref?: RefObject;\n hasArrow?: boolean;\n placeholder?: string;\n onChange?: (e: ChangeEvent) => void;\n children: any;\n};\n\nconst Select: FC = (props) => {\n const {\n id,\n value,\n label,\n hasArrow,\n error,\n ref,\n placeholder,\n onChange,\n children,\n } = props;\n const labelText = error || label;\n const fullClassName = buildClassName(\n 'input-group',\n value && 'touched',\n error && 'error',\n labelText && 'with-label',\n hasArrow && 'with-arrow',\n 'input-group',\n );\n\n return (\n
\n \n {children}\n \n {labelText && id && (\n \n )}\n
\n );\n};\n\nexport default memo(Select);\n","import React, {\n FC, useRef, useCallback, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation';\nimport useLang from '../../hooks/useLang';\nimport { countryList } from '../../util/phoneNumber';\n\nimport InputText from '../ui/InputText';\nimport Select from '../ui/Select';\nimport Checkbox from '../ui/Checkbox';\n\nimport './ShippingInfo.scss';\n\nexport type OwnProps = {\n state: FormState;\n needEmail: boolean;\n needPhone: boolean;\n needName: boolean;\n needAddress: boolean;\n dispatch: FormEditDispatch;\n};\n\nconst ShippingInfo: FC = ({\n state,\n needEmail,\n needPhone,\n needName,\n needAddress,\n dispatch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const phoneRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const selectCountryRef = useRef(null);\n\n useEffect(() => {\n if (selectCountryRef.current\n && selectCountryRef.current.value !== state.countryIso2) {\n selectCountryRef.current.value = state.countryIso2;\n }\n }, [state.countryIso2]);\n\n const lang = useLang();\n\n useFocusAfterAnimation(inputRef);\n\n const handleAddress1Change = useCallback((e) => {\n dispatch({ type: 'changeAddress1', payload: e.target.value });\n }, [dispatch]);\n\n const handleAddress2Change = useCallback((e) => {\n dispatch({ type: 'changeAddress2', payload: e.target.value });\n }, [dispatch]);\n\n const handleCityChange = useCallback((e) => {\n dispatch({ type: 'changeCity', payload: e.target.value });\n }, [dispatch]);\n\n const handleStateChange = useCallback((e) => {\n dispatch({ type: 'changeState', payload: e.target.value });\n }, [dispatch]);\n\n const handleCountryChange = useCallback((e) => {\n dispatch({ type: 'changeCountry', payload: e.target.value });\n }, [dispatch]);\n\n const handlePostCodeChange = useCallback((e) => {\n dispatch({ type: 'changePostCode', payload: e.target.value });\n }, [dispatch]);\n\n const handleFullNameChange = useCallback((e) => {\n dispatch({ type: 'changeFullName', payload: e.target.value });\n }, [dispatch]);\n\n const handleEmailChange = useCallback((e) => {\n dispatch({ type: 'changeEmail', payload: e.target.value });\n }, [dispatch]);\n\n const handlePhoneChange = useCallback((e) => {\n let { value } = e.target;\n value = `+${value.replace(/\\D/g, '')}`;\n if (phoneRef.current) {\n phoneRef.current.value = value;\n }\n dispatch({ type: 'changePhone', payload: value });\n }, [dispatch]);\n\n const handleSaveInfoChange = useCallback((e) => {\n dispatch({ type: 'changeSaveInfo', payload: e.target.value });\n }, [dispatch]);\n\n const { formErrors } = state;\n return (\n
\n
\n {needAddress ? (\n
\n
{lang('PaymentShippingAddress')}
\n \n \n \n \n \n {countryList.map(({ name, id }) => (\n \n {name}\n \n ))}\n \n\n \n
\n ) : undefined}\n { needName || needEmail || needPhone ? (\n
{lang('PaymentShippingReceiver')}
\n ) : undefined }\n { needName && (\n \n ) }\n { needEmail && (\n \n ) }\n { needPhone && (\n \n ) }\n \n \n
\n );\n};\n\nexport default memo(ShippingInfo);\n","import React, {\n FC, useCallback, memo, useMemo, useEffect,\n} from '../../lib/teact/teact';\n\nimport { ShippingOption } from '../../types/index';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\n\nimport RadioGroup from '../ui/RadioGroup';\n\nimport './Shipping.scss';\n\nexport type OwnProps = {\n state: FormState;\n shippingOptions: ShippingOption[];\n currency: string;\n dispatch: FormEditDispatch;\n};\n\nconst Shipping: FC = ({\n state,\n shippingOptions,\n currency,\n dispatch,\n}) => {\n useEffect(() => {\n if (!shippingOptions || state.shipping) {\n return;\n }\n dispatch({ type: 'changeShipping', payload: shippingOptions[0].id });\n }, [shippingOptions, state.shipping, dispatch]);\n\n const handleShippingSelect = useCallback((value) => {\n dispatch({ type: 'changeShipping', payload: value });\n }, [dispatch]);\n\n const options = useMemo(() => (shippingOptions.map(({ id: value, title: label, amount }) => ({\n label,\n subLabel: `${currency} ${String(amount / 100)}`,\n value,\n }))), [shippingOptions, currency]);\n\n return (\n
\n
\n

Select shipping method

\n \n \n
\n );\n};\n\nexport default memo(Shipping);\n","import React, {\n FC, memo,\n} from '../../lib/teact/teact';\n\nimport { Price } from '../../types';\n\nimport './Checkout.scss';\n\nexport type OwnProps = {\n invoiceContent?: {\n title?: string;\n description?: string;\n text?: string;\n photoUrl?: string;\n };\n checkoutInfo?: {\n paymentMethod?: string;\n paymentProvider?: string;\n shippingAddress?: string;\n name?: string;\n phone?: string;\n shippingMethod?: string;\n };\n prices?: Price[];\n totalPrice?: number;\n shippingPrices?: Price[];\n currency?: string;\n};\n\nconst Checkout: FC = ({\n invoiceContent,\n prices,\n shippingPrices,\n checkoutInfo,\n currency,\n totalPrice,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const { photoUrl, title, text } = (invoiceContent || {});\n const {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n } = (checkoutInfo || {});\n return (\n
\n
\n { photoUrl && (\n \"\"\n )}\n
\n
{ title }
\n

{ text }

\n
\n
\n
\n { prices && prices.map((item) => (\n renderPaymentItem(item.label, item.amount, currency, false)\n )) }\n { shippingPrices && shippingPrices.map((item) => (\n renderPaymentItem(item.label, item.amount, currency, false)\n )) }\n { totalPrice !== undefined && (\n renderPaymentItem('Total', totalPrice, currency, true)\n ) }\n
\n
\n {paymentMethod && renderCheckoutItem('icon-card', paymentMethod, 'Payment method')}\n {paymentProvider && renderCheckoutItem('stripe-provider', paymentProvider, 'Payment provider')}\n {shippingAddress && renderCheckoutItem('icon-location', shippingAddress, 'Shipping address')}\n {name && renderCheckoutItem('icon-user', name, 'Name')}\n {phone && renderCheckoutItem('icon-phone', phone, 'Phone number')}\n {shippingMethod && renderCheckoutItem('icon-truck', shippingMethod, 'Shipping method')}\n
\n
\n );\n};\n\nfunction renderPaymentItem(title: string, value: number, currency?: string, main = false) {\n return (\n
\n
\n { title }\n
\n
\n { `${currency || ''} ${(value / 100).toFixed(2)}` }\n
\n
\n );\n}\n\nfunction renderCheckoutItem(icon: string, title: string, data: string) {\n return (\n
\n \n
\n
\n { title }\n
\n

\n { data }\n

\n
\n
\n );\n}\n\nexport default memo(Checkout);\n","import React, {\n FC, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { formatCardExpiry } from '../middle/helpers/inputFormatters';\n\nimport InputText from '../ui/InputText';\n\nconst MAX_FIELD_LENGTH = 5;\n\nexport type OwnProps = {\n value: string;\n error?: string;\n onChange: (value: string) => void;\n};\n\nconst ExpiryInput : FC = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const expiryInputRef = useRef(null);\n\n const handleKeyDown = useCallback((e) => {\n if (e.key === 'Backspace' && value.charAt(value.length - 1) === '/') {\n const newValue = value.slice(0, value.length - 1);\n if (expiryInputRef.current) {\n expiryInputRef.current.value = newValue;\n }\n }\n }, [value]);\n\n const handleChange = useCallback((e) => {\n onChange(formatCardExpiry(e.target.value));\n }, [onChange]);\n\n return (\n \n );\n};\n\nexport default memo(ExpiryInput);\n","export function formatCardExpiry(input: string) {\n input = input.replace(/[^\\d]/g, '').slice(0, 4);\n const parts = input.match(/.{1,2}/g);\n if (parts && parts[0] && Number(parts[0]) > 12) {\n parts[0] = '12';\n }\n if (parts && parts[0] && parts[0].length === 2 && !parts[1]) {\n parts[1] = '';\n }\n return parts ? parts.join('/') : '';\n}\n\nexport function formatCardNumber(input: string) {\n input = input.replace(/[^\\d]/g, '');\n const parts = input.match(/.{1,4}/g);\n return parts ? parts.join(' ') : '';\n}\n","export default __webpack_public_path__ + \"mastercard.4216118edafe23cc2dec7b8807ba4622.svg\";","export default __webpack_public_path__ + \"visa.e5a7c336e1deb4b92a636e2e053878c4.svg\";","import React, {\n FC, memo, useCallback, useState, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport useFocusAfterAnimation from '../../hooks/useFocusAfterAnimation';\nimport { formatCardNumber } from '../middle/helpers/inputFormatters';\nimport { detectCardType, CardType } from '../common/helpers/detectCardType';\n\nimport InputText from '../ui/InputText';\n\nimport './CardInput.scss';\n\n// @ts-ignore\nimport mastercardIconPath from '../../assets/mastercard.svg';\n// @ts-ignore\nimport visaIconPath from '../../assets/visa.svg';\n\nconst CARD_NUMBER_MAX_LENGTH = 23;\n\nexport type OwnProps = {\n value: string;\n error?: string;\n onChange: (value: string) => void;\n};\n\nconst CardInput : FC = ({ value, error, onChange }) => {\n // eslint-disable-next-line no-null/no-null\n const cardNumberRef = useRef(null);\n\n useFocusAfterAnimation(cardNumberRef);\n\n const [cardType, setCardType] = useState(CardType.Default);\n useEffect(() => {\n const newCardType = detectCardType(value);\n setCardType(newCardType);\n // eslint-disable-next-line\n }, []);\n\n const handleChange = useCallback((e) => {\n const newValue = formatCardNumber(e.target.value);\n const newCardType = detectCardType(e.target.value);\n setCardType(newCardType);\n onChange(newValue);\n if (cardNumberRef.current) {\n cardNumberRef.current.value = newValue;\n }\n }, [onChange, cardNumberRef]);\n\n const cardIcon = getCardIcon(cardType);\n\n return (\n
\n {cardIcon}\n \n
\n );\n};\n\nexport default memo(CardInput);\n\nfunction getCardIcon(cardType: CardType) {\n switch (cardType) {\n case CardType.Mastercard:\n return \"\";\n case CardType.Visa:\n return \"\";\n default:\n return undefined;\n }\n}\n","import React, {\n FC, useCallback, memo, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport { FormState, FormEditDispatch } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\nimport { countryList } from '../../util/phoneNumber';\n\nimport InputText from '../ui/InputText';\nimport Checkbox from '../ui/Checkbox';\nimport Select from '../ui/Select';\nimport ExpiryInput from './ExpiryInput';\nimport CardInput from './CardInput';\n\nimport './PaymentInfo.scss';\n\nexport type OwnProps = {\n state: FormState;\n canSaveCredentials: boolean;\n needCardholderName?: boolean;\n needCountry?: boolean;\n needZip?: boolean;\n dispatch: FormEditDispatch;\n};\n\nconst PaymentInfo: FC = ({\n state,\n canSaveCredentials,\n needCardholderName,\n needCountry,\n needZip,\n dispatch,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const selectCountryRef = useRef(null);\n\n useEffect(() => {\n if (selectCountryRef.current\n && selectCountryRef.current.value !== state.billingCountry) {\n selectCountryRef.current.value = state.billingCountry;\n }\n }, [state.billingCountry]);\n\n const handleCardNumberChange = useCallback((value) => {\n dispatch({ type: 'changeCardNumber', payload: value });\n }, [dispatch]);\n\n const handleCardholderChange = useCallback((e) => {\n dispatch({ type: 'changeCardholder', payload: e.target.value.toUpperCase() });\n }, [dispatch]);\n\n const handleExpiryChange = useCallback((value) => {\n dispatch({ type: 'changeExpiryDate', payload: value });\n }, [dispatch]);\n\n const handleCvvChange = useCallback((e) => {\n dispatch({ type: 'changeCvvCode', payload: e.target.value });\n }, [dispatch]);\n\n const handleCountryChange = useCallback((e) => {\n dispatch({ type: 'changeBillingCountry', payload: e.target.value });\n }, [dispatch]);\n\n const handleBillingPostCodeChange = useCallback((e) => {\n dispatch({ type: 'changeBillingZip', payload: e.target.value });\n }, [dispatch]);\n\n const handleChangeSaveCredentials = useCallback((e) => {\n dispatch({ type: 'changeSaveCredentials', payload: e.target.value });\n }, [dispatch]);\n\n const lang = useLang();\n\n const { formErrors = {} } = state;\n\n return (\n
\n
\n
{lang('PaymentCardTitle')}
\n \n { needCardholderName && (\n \n )}\n
\n \n \n
\n { needCountry || needZip ? (\n
{lang('PaymentBillingAddress')}
\n ) : undefined }\n { needCountry && (\n \n {\n countryList.map(({ name }) => (\n \n {name}\n \n ))\n }\n \n ) }\n { needZip && (\n \n )}\n { canSaveCredentials && (\n \n ) }\n \n
\n );\n};\n\nexport default memo(PaymentInfo);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { PaymentStep, ShippingOption, Price } from '../../types';\nimport { ApiError, ApiInviteInfo } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\nimport { detectCardTypeText } from '../common/helpers/detectCardType';\nimport { getShippingErrors } from '../../modules/helpers/payments';\nimport usePaymentReducer, { FormState } from '../../hooks/reducers/usePaymentReducer';\nimport useLang from '../../hooks/useLang';\n\nimport ShippingInfo from './ShippingInfo';\nimport Shipping from './Shipping';\nimport Checkout from './Checkout';\nimport PaymentInfo from './PaymentInfo';\nimport Button from '../ui/Button';\nimport Modal from '../ui/Modal';\nimport Transition from '../ui/Transition';\nimport Spinner from '../ui/Spinner';\n\nimport './PaymentModal.scss';\n\nconst DEFAULT_PROVIDER = 'stripe';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n nameRequested?: boolean;\n shippingAddressRequested?: boolean;\n phoneRequested?: boolean;\n emailRequested?: boolean;\n flexible?: boolean;\n phoneToProvider?: boolean;\n emailToProvider?: boolean;\n currency?: string;\n prices?: Price[];\n isProviderError: boolean;\n needCardholderName?: boolean;\n needCountry?: boolean;\n needZip?: boolean;\n globalDialogs?: (ApiError | ApiInviteInfo)[];\n};\n\ntype GlobalStateProps = Pick;\n\ntype DispatchProps = Pick;\n\nconst Invoice: FC = ({\n isOpen,\n onClose,\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n nameRequested,\n shippingAddressRequested,\n phoneRequested,\n emailRequested,\n phoneToProvider,\n emailToProvider,\n currency,\n passwordMissing,\n isProviderError,\n invoiceContent,\n nativeProvider,\n prices,\n needCardholderName,\n needCountry,\n needZip,\n error,\n globalDialogs,\n validateRequestedInfo,\n sendPaymentForm,\n setPaymentStep,\n sendCredentialsInfo,\n clearPaymentError,\n}) => {\n const [paymentState, paymentDispatch] = usePaymentReducer();\n const currencySign = getCurrencySign(currency);\n const [isLoading, setIsLoading] = useState(false);\n const lang = useLang();\n\n useEffect(() => {\n if (step || error || globalDialogs) {\n setIsLoading(false);\n }\n }, [step, error, globalDialogs]);\n\n useEffect(() => {\n if (error && error.field) {\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n [error.field]: error.fieldError,\n },\n });\n return;\n }\n if (globalDialogs && globalDialogs.length) {\n const errors = getShippingErrors(globalDialogs);\n paymentDispatch({\n type: 'setFormErrors',\n payload: {\n ...errors,\n },\n });\n }\n }, [error, globalDialogs, paymentDispatch]);\n\n useEffect(() => {\n if (savedInfo) {\n const {\n name: fullName, phone, email, shippingAddress,\n } = savedInfo;\n paymentDispatch({\n type: 'updateUserInfo',\n payload: {\n fullName,\n phone: phone && phone.charAt(0) !== '+'\n ? `+${phone}`\n : phone,\n email,\n ...(shippingAddress || {}),\n },\n });\n }\n }, [savedInfo, paymentDispatch]);\n\n const handleErrorModalClose = useCallback(() => {\n clearPaymentError();\n }, [clearPaymentError]);\n\n const totalPrice = useMemo(() => {\n if (step !== PaymentStep.Checkout) {\n return 0;\n }\n\n return getTotalPrice(prices, shippingOptions, paymentState.shipping);\n }, [step, paymentState.shipping, prices, shippingOptions]);\n\n const checkoutInfo = useMemo(() => {\n if (step !== PaymentStep.Checkout) {\n return undefined;\n }\n return getCheckoutInfo(paymentState, shippingOptions, nativeProvider || '');\n }, [step, paymentState, shippingOptions, nativeProvider]);\n\n function renderError() {\n if (!error) {\n return undefined;\n }\n return (\n \n

{error.description || 'Error'}

\n

{error.description || 'Error'}

\n \n {lang('OK')}\n \n
\n );\n }\n\n function renderModalContent(cuurentStep: PaymentStep) {\n switch (cuurentStep) {\n case PaymentStep.ShippingInfo:\n return (\n \n );\n case PaymentStep.Shipping:\n return (\n \n );\n case PaymentStep.PaymentInfo:\n return (\n \n );\n case PaymentStep.Checkout:\n return (\n \n );\n default:\n return undefined;\n }\n }\n\n const validateRequest = useCallback(() => {\n const { saveInfo } = paymentState;\n const requestInfo = getRequestInfo(paymentState);\n validateRequestedInfo({ requestInfo, saveInfo });\n }, [validateRequestedInfo, paymentState]);\n\n const sendCredentials = useCallback(() => {\n const credentials = getCredentials(paymentState);\n sendCredentialsInfo({\n credentials,\n });\n }, [sendCredentialsInfo, paymentState]);\n\n const sendForm = useCallback(() => {\n sendPaymentForm({\n shippingOptionId: paymentState.shipping,\n saveCredentials: paymentState.saveCredentials,\n });\n }, [sendPaymentForm, paymentState]);\n\n const setStep = useCallback((nextStep) => {\n setPaymentStep({ step: nextStep });\n }, [setPaymentStep]);\n\n const handleButtonClick = useCallback(() => {\n setIsLoading(true);\n switch (step) {\n case PaymentStep.ShippingInfo:\n return validateRequest();\n case PaymentStep.Shipping:\n return setStep(PaymentStep.PaymentInfo);\n case PaymentStep.PaymentInfo:\n return sendCredentials();\n case PaymentStep.Checkout:\n return sendForm();\n default:\n return () => {};\n }\n }, [step, validateRequest, setStep, sendCredentials, sendForm]);\n\n const modalHeader = useMemo(() => {\n switch (step) {\n case PaymentStep.ShippingInfo:\n return lang('PaymentShippingInfo');\n case PaymentStep.Shipping:\n return lang('PaymentShippingMethod');\n case PaymentStep.PaymentInfo:\n return lang('PaymentCardInfo');\n case PaymentStep.Checkout:\n return lang('PaymentCheckout');\n default:\n return '';\n }\n }, [step, lang]);\n\n const buttonText = useMemo(() => {\n switch (step) {\n case PaymentStep.Checkout:\n return lang('Checkout.PayPrice', `${currencySign}${(totalPrice / 100).toFixed(2)}`);\n default:\n return lang('Next');\n }\n }, [step, lang, currencySign, totalPrice]);\n\n if (isProviderError) {\n return (\n \n

\n Sorry, Telegram WebZ doesn't support payments with this provider yet.
\n Please use one of our mobile apps to do this.\n

\n \n {lang('OK')}\n \n \n );\n }\n\n return (\n \n
\n \n \n \n

{modalHeader}

\n
\n {step !== undefined ? (\n \n {() => (\n
\n {renderModalContent(step)}\n
\n )}\n
\n ) : (\n
\n \n
\n )}\n
\n \n {buttonText}\n \n
\n {error && !error.field && renderError()}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps & GlobalStateProps => {\n const {\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n invoice,\n invoiceContent,\n nativeProvider,\n nativeParams,\n passwordMissing,\n error,\n } = global.payment;\n\n const isProviderError = Boolean(invoice && (!nativeProvider || nativeProvider !== DEFAULT_PROVIDER));\n const { needCardholderName, needCountry, needZip } = (nativeParams || {});\n const {\n nameRequested,\n phoneRequested,\n emailRequested,\n shippingAddressRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices,\n } = (invoice || {});\n\n return {\n step,\n shippingOptions,\n savedInfo,\n canSaveCredentials,\n nativeProvider,\n passwordMissing,\n nameRequested,\n shippingAddressRequested,\n phoneRequested,\n emailRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices,\n isProviderError,\n invoiceContent,\n needCardholderName,\n needCountry,\n needZip,\n error,\n globalDialogs: global.dialogs,\n };\n },\n (setGlobal, actions): DispatchProps => {\n return pick(actions, [\n 'validateRequestedInfo',\n 'sendPaymentForm',\n 'setPaymentStep',\n 'sendCredentialsInfo',\n 'clearPaymentError',\n ]);\n },\n)(Invoice));\n\nfunction findShippingOption(shippingOptions: ShippingOption[], optionId: string) {\n return shippingOptions.find(({ id }) => id === optionId);\n}\n\nfunction getShippingPrices(shippingOptions: ShippingOption[], shippingOption: string) {\n const option = findShippingOption(shippingOptions, shippingOption);\n return option ? option.prices : undefined;\n}\n\nfunction getTotalPrice(prices: Price[] = [], shippingOptions: ShippingOption[] | undefined, shippingOption: string) {\n const shippingPrices = shippingOptions\n ? getShippingPrices(shippingOptions, shippingOption)\n : [];\n let total = 0;\n const totalPrices = prices.concat(shippingPrices || []);\n total = totalPrices.reduce((acc, cur) => {\n return acc + cur.amount;\n }, total);\n return total;\n}\n\nfunction getCheckoutInfo(state: FormState, shippingOptions: ShippingOption[] | undefined, paymentProvider: string) {\n const cardTypeText = detectCardTypeText(state.cardNumber);\n const paymentMethod = `${cardTypeText} *${state.cardNumber.slice(-4)}`;\n const shippingAddress = state.streetLine1\n ? `${state.streetLine1}, ${state.city}, ${state.countryIso2}`\n : undefined;\n const { phone, fullName: name } = state;\n const shippingOption = shippingOptions ? findShippingOption(shippingOptions, state.shipping) : undefined;\n const shippingMethod = shippingOption ? shippingOption.title : undefined;\n return {\n paymentMethod,\n paymentProvider,\n shippingAddress,\n name,\n phone,\n shippingMethod,\n };\n}\n\nfunction getRequestInfo(paymentState: FormState) {\n const {\n streetLine1,\n streetLine2,\n city,\n state,\n countryIso2,\n postCode,\n fullName: name,\n phone,\n email,\n } = paymentState;\n\n const shippingAddress = {\n streetLine1,\n streetLine2,\n city,\n state,\n countryIso2,\n postCode,\n };\n\n return {\n name,\n phone,\n email,\n shippingAddress,\n };\n}\n\nfunction getCredentials(paymentState: FormState) {\n const {\n cardNumber, cardholder, expiry, cvv, billingCountry, billingZip,\n } = paymentState;\n const [expiryMonth, expiryYear] = expiry.split('/');\n const data = {\n cardNumber,\n cardholder,\n expiryMonth,\n expiryYear,\n cvv,\n country: billingCountry,\n zip: billingZip,\n };\n\n return {\n data,\n };\n}\n","import React, {\n FC, memo, useMemo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { Price } from '../../types';\nimport { ApiShippingAddress } from '../../api/types/payments';\n\nimport useLang from '../../hooks/useLang';\nimport { getCurrencySign } from '../middle/helpers/getCurrencySign';\n\nimport Checkout from './Checkout';\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './PaymentModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n};\n\ntype StateProps = {\n prices?: Price[];\n shippingPrices: any;\n totalAmount?: number;\n currency?: string;\n info?: {\n shippingAddress?: ApiShippingAddress;\n phone?: string;\n name?: string;\n };\n photoUrl?: string;\n text?: string;\n title?: string;\n credentialsTitle?: string;\n shippingMethod?: string;\n};\n\nconst ReceiptModal: FC = ({\n isOpen,\n onClose,\n prices,\n shippingPrices,\n totalAmount,\n currency,\n info,\n photoUrl,\n text,\n title,\n credentialsTitle,\n shippingMethod,\n}) => {\n const lang = useLang();\n const currencySign = getCurrencySign(currency);\n const checkoutInfo = useMemo(() => {\n return getCheckoutInfo(credentialsTitle, info, shippingMethod);\n }, [info, shippingMethod, credentialsTitle]);\n return (\n \n
\n
\n \n \n \n

{lang('PaymentReceipt')}

\n
\n
\n \n
\n
\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { receipt } = global.payment;\n const {\n currency,\n prices: mapedPrices,\n info,\n totalAmount,\n credentialsTitle,\n shippingPrices,\n shippingMethod,\n photoUrl,\n text,\n title,\n } = (receipt || {});\n\n return {\n currency,\n prices: mapedPrices,\n info,\n totalAmount,\n credentialsTitle,\n shippingPrices,\n shippingMethod,\n photoUrl,\n text,\n title,\n };\n },\n)(ReceiptModal));\n\nfunction getCheckoutInfo(paymentMethod?: string,\n info?:\n { phone?: string;\n name?: string;\n shippingAddress?: ApiShippingAddress;\n },\n shippingMethod?: string) {\n if (!info) {\n return { paymentMethod };\n }\n const { shippingAddress } = info;\n const fullAddress = shippingAddress && shippingAddress.streetLine1\n ? `${shippingAddress.streetLine1}, ${shippingAddress.city}, ${shippingAddress.countryIso2}`\n : undefined;\n const { phone, name } = info;\n return {\n paymentMethod,\n paymentProvider: 'Stripe',\n shippingAddress: fullAddress,\n name,\n phone,\n shippingMethod,\n };\n}\n","import { ApiMediaFormat } from '../../../api/types';\n\nimport * as mediaLoader from '../../../util/mediaLoader';\n\n// @ts-ignore\nimport MonkeyIdle from '../../../assets/TwoFactorSetupMonkeyIdle.tgs';\n// @ts-ignore\nimport MonkeyTracking from '../../../assets/TwoFactorSetupMonkeyTracking.tgs';\n// @ts-ignore\nimport MonkeyClose from '../../../assets/TwoFactorSetupMonkeyClose.tgs';\n// @ts-ignore\nimport MonkeyPeek from '../../../assets/TwoFactorSetupMonkeyPeek.tgs';\n// @ts-ignore\nimport FoldersAll from '../../../assets/FoldersAll.tgs';\n// @ts-ignore\nimport FoldersNew from '../../../assets/FoldersNew.tgs';\n// @ts-ignore\nimport DiscussionGroups from '../../../assets/DiscussionGroupsDucks.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n};\n\nexport default function getAnimationData(name: keyof typeof ANIMATED_STICKERS_PATHS) {\n const path = ANIMATED_STICKERS_PATHS[name].replace(window.location.origin, '');\n\n return mediaLoader.fetch(`file${path}`, ApiMediaFormat.Lottie);\n}\n","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs\";","export default __webpack_public_path__ + \"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs\";","export default __webpack_public_path__ + \"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs\";","export default __webpack_public_path__ + \"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs\";","import React, {\n FC, useEffect, useState, memo,\n} from '../../lib/teact/teact';\n\nimport { DEBUG } from '../../config';\nimport { blobToFile, blobToDataUri } from '../../util/files';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Modal from './Modal';\nimport Loading from './Loading';\n\nimport './CropModal.scss';\n\n// Change to 'base64' to get base64-encoded string\nconst cropperResultOptions: Croppie.ResultOptions & { type: 'blob' } = {\n type: 'blob',\n quality: 0.8,\n format: 'jpeg',\n circle: false,\n};\n\ntype ICroppie = typeof import('croppie');\nlet Croppie: ICroppie;\nlet croppiePromise: Promise<{ default: ICroppie }>;\n\nasync function ensureCroppie() {\n if (!croppiePromise) {\n croppiePromise = import('../../lib/croppie') as unknown as Promise<{ default: ICroppie }>;\n Croppie = (await croppiePromise).default;\n }\n\n return croppiePromise;\n}\n\nlet cropper: Croppie;\n\nasync function initCropper(imgFile: File) {\n try {\n const cropContainer = document.getElementById('avatar-crop');\n if (!cropContainer) {\n return;\n }\n\n const { offsetWidth, offsetHeight } = cropContainer;\n\n cropper = new Croppie(cropContainer, {\n enableZoom: true,\n boundary: {\n width: offsetWidth,\n height: offsetHeight,\n },\n viewport: {\n width: offsetWidth - 16,\n height: offsetHeight - 16,\n type: 'circle',\n },\n });\n\n const dataUri = await blobToDataUri(imgFile);\n await cropper.bind({ url: dataUri });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n}\n\ntype OwnProps = {\n file?: File;\n onChange: (file: File) => void;\n onClose: () => void;\n};\n\nconst CropModal: FC = ({ file, onChange, onClose }: OwnProps) => {\n const [isCroppieReady, setIsCroppieReady] = useState(false);\n\n useEffect(() => {\n if (!file) {\n return;\n }\n\n if (!isCroppieReady) {\n ensureCroppie().then(() => setIsCroppieReady(true));\n\n return;\n }\n\n initCropper(file);\n }, [file, isCroppieReady]);\n\n const lang = useLang();\n\n async function handleCropClick() {\n if (!cropper) {\n return;\n }\n\n const result: Blob | string = await cropper.result(cropperResultOptions);\n const croppedImg = typeof result === 'string' ? result : blobToFile(result, 'avatar.jpg');\n\n onChange(croppedImg);\n }\n\n return (\n \n {isCroppieReady ? (\n
\n ) : (\n \n )}\n \n \n \n \n );\n};\n\nexport default memo(CropModal);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport CropModal from './CropModal';\n\nimport './AvatarEditable.scss';\n\ninterface OwnProps {\n title?: string;\n disabled?: boolean;\n currentAvatarBlobUrl?: string;\n onChange: (file: File) => void;\n}\n\nconst AvatarEditable: FC = ({\n title = 'Change your profile picture',\n disabled,\n currentAvatarBlobUrl,\n onChange,\n}) => {\n const [selectedFile, setSelectedFile] = useState();\n const [croppedBlobUrl, setCroppedBlobUrl] = useState(currentAvatarBlobUrl);\n\n useEffect(() => {\n setCroppedBlobUrl(currentAvatarBlobUrl);\n }, [currentAvatarBlobUrl]);\n\n function handleSelectFile(event: ChangeEvent) {\n const target = event.target as HTMLInputElement;\n\n if (!target || !target.files || !target.files[0]) {\n return;\n }\n\n setSelectedFile(target.files[0]);\n target.value = '';\n }\n\n function handleAvatarCrop(croppedImg: File) {\n setSelectedFile(undefined);\n onChange(croppedImg);\n\n if (croppedBlobUrl) {\n URL.revokeObjectURL(croppedBlobUrl);\n }\n setCroppedBlobUrl(URL.createObjectURL(croppedImg));\n }\n\n function handleModalClose() {\n setSelectedFile(undefined);\n }\n\n const labelClassName = buildClassName(\n croppedBlobUrl && 'filled',\n disabled && 'disabled',\n );\n\n return (\n
\n \n \n \n {croppedBlobUrl && \"Avatar\"}\n \n \n
\n );\n};\n\nexport default memo(AvatarEditable);\n","import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n isPasswordVisible: boolean;\n isBig?: boolean;\n};\n\nconst PEEK_MONKEY_SHOW_DELAY = 2000;\nconst SEGMENT_COVER_EYES: [number, number] = [0, 50];\nconst SEGMENT_UNCOVER_EYE: [number, number] = [0, 20];\nconst SEGMENT_COVER_EYE: [number, number] = [20, 0];\nconst STICKER_SIZE = IS_SINGLE_COLUMN_LAYOUT ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst PasswordMonkey: FC = ({ isPasswordVisible, isBig }) => {\n const [closeMonkeyData, setCloseMonkeyData] = useState>();\n const [peekMonkeyData, setPeekMonkeyData] = useState>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const [isPeekShown, setIsPeekShown] = useState(false);\n\n useEffect(() => {\n if (!closeMonkeyData) {\n getAnimationData('MonkeyClose').then(setCloseMonkeyData);\n } else {\n setTimeout(() => setIsPeekShown(true), PEEK_MONKEY_SHOW_DELAY);\n }\n }, [closeMonkeyData]);\n\n useEffect(() => {\n if (!peekMonkeyData) {\n getAnimationData('MonkeyPeek').then(setPeekMonkeyData);\n }\n }, [peekMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n return (\n
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {closeMonkeyData && (\n \n )}\n {peekMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(PasswordMonkey);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { MIN_PASSWORD_LENGTH } from '../../config';\nimport { IS_TOUCH_ENV, IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\ntype OwnProps = {\n submitLabel?: string;\n error?: string;\n hint?: string;\n placeholder?: string;\n isLoading?: boolean;\n isPasswordVisible?: boolean;\n clearError: NoneToVoidFunction;\n onChangePasswordVisibility: (state: boolean) => void;\n onInputChange?: (password: string) => void;\n onSubmit: (password: string) => void;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst PasswordForm: FC = ({\n isLoading = false,\n isPasswordVisible,\n error,\n hint,\n placeholder = 'Password',\n submitLabel = 'Next',\n clearError,\n onChangePasswordVisibility,\n onInputChange,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const lang = useLang();\n\n const [password, setPassword] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n useEffect(() => {\n if (error) {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n inputRef.current!.select();\n });\n }\n }, [error]);\n\n function onPasswordChange(e: ChangeEvent) {\n if (error) {\n clearError();\n }\n\n const { target } = e;\n setPassword(target.value);\n setCanSubmit(target.value.length >= MIN_PASSWORD_LENGTH);\n if (onInputChange) {\n onInputChange(target.value);\n }\n }\n\n function togglePasswordVisibility() {\n onChangePasswordVisibility(!isPasswordVisible);\n }\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (isLoading) {\n return;\n }\n\n if (canSubmit) {\n onSubmit(password);\n }\n }\n\n return (\n
\n \n \n \n \n \n
\n
\n {canSubmit && (\n \n )}\n \n );\n};\n\nexport default memo(PasswordForm);\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/4.f46a6915735f9deb48a8.css b/dist/4.5fb9a295648f3bed8bba.css similarity index 98% rename from dist/4.f46a6915735f9deb48a8.css rename to dist/4.5fb9a295648f3bed8bba.css index 2a9cd5873..6e9bc8784 100644 --- a/dist/4.f46a6915735f9deb48a8.css +++ b/dist/4.5fb9a295648f3bed8bba.css @@ -40,6 +40,10 @@ .Message{display:flex;align-items:flex-end;margin-bottom:0.375rem;position:relative;--background-color: var(--color-background);--hover-color: var(--color-reply-hover);--active-color: var(--color-reply-active);--max-width: 29rem;--accent-color: var(--color-primary);--accent-shade-color: var(--color-primary-shade);--secondary-color: var(--color-text-secondary);--meta-safe-area-base: 2.25rem;--meta-safe-author-width: 0px;--meta-safe-area-extra-width: 0px;--meta-safe-area-size: calc(var(--meta-safe-area-base) + var(--meta-safe-author-width) + var(--meta-safe-area-extra-width));--deleting-translate-x: -50%;--select-message-scale: 0.9;--select-background-color: white}.Message>.Avatar,.Message>.message-content-wrapper{opacity:1;transform:scale(1) translateX(0);transition:transform var(--select-transition)}body.animation-level-0 .Message>.Avatar,body.animation-level-0 .Message>.message-content-wrapper{transition:none !important}.Message>.Avatar{position:absolute;bottom:0;left:0}@media (max-width: 600px){.Message>.Avatar{width:2.5rem;height:2.5rem}}.Message.last-in-group{margin-bottom:0.625rem}.Message.last-in-list{margin-bottom:0.375rem}.Message.is-in-selection-mode .Album{border:1px var(--select-background-color) solid;background-color:var(--select-background-color)}body.is-android .Message.is-in-selection-mode .can-select-text{z-index:var(--z-message-select-control)}body.is-android .Message.is-in-selection-mode .media-inner{pointer-events:none}.Message.has-inline-buttons .message-content{border-bottom-right-radius:var(--border-radius-messages-small)}.Message:not(.own){padding-left:2.5rem}.no-avatars .Message:not(.own),.Message:not(.own).is-thread-top{padding-left:0}@media (max-width: 600px){.Message:not(.own){padding-left:2.875rem}.no-avatars .Message:not(.own),.Message:not(.own).is-thread-top{padding-left:0.25rem}}.Message.own{flex-direction:row-reverse;--background-color: var(--color-background-own);--hover-color: var(--color-reply-own-hover);--active-color: var(--color-reply-own-active);--max-width: 30rem;--accent-color: var(--color-accent-own);--accent-shade-color: var(--color-green);--secondary-color: var(--color-accent-own);--color-code: var(--color-code-own);--color-code-bg: var(--color-code-own-bg);--color-links: var(--color-own-links);--color-links-hover: var(--color-own-links);--meta-safe-area-base: 3.5rem;--deleting-translate-x: 50%;--color-text-green: var(--color-accent-own)}body.is-ios .Message.own,body.is-macos .Message.own{--color-background-own: var(--color-background-own-apple);--color-reply-own-hover: var(--color-reply-own-hover-apple);--color-reply-own-active: var(--color-reply-own-active-apple)}@media (max-width: 600px){.Message.own{padding-right:0.25rem}}.Message.is-deleting>.Avatar,.Message.is-deleting>.message-content-wrapper{transition:opacity .2s ease, transform .2s ease-in;opacity:0;transform:scale(0.3) translateX(var(--deleting-translate-x));transform-origin:bottom}.Message.has-views{--meta-safe-area-extra-width: 4rem}.Message.was-edited{--meta-safe-area-extra-width: 2.5rem}.Message.was-edited.has-views{--meta-safe-area-extra-width: 7.5rem}html[lang=ru] .Message.was-edited{--meta-safe-area-extra-width: 3.5rem}html[lang=ru] .Message.was-edited.has-views{--meta-safe-area-extra-width: 8.5rem}.select-mode-active .Message{cursor:pointer}@media (min-width: 600px){.select-mode-active .Message{-webkit-user-select:none;user-select:none}}.select-mode-active .Message:not(.own)>.Avatar,.select-mode-active .Message:not(.own)>.message-content-wrapper{transform:translateX(2.5rem)}.select-mode-active .Message:not(.is-album)::after{content:"";position:absolute;top:-0.25rem;bottom:-0.25rem;left:-4rem;right:-4rem;z-index:var(--z-message-select-area)}.select-mode-active .Message.is-album .message-select-control,.select-mode-active .Message.is-in-document-group .message-select-control{pointer-events:unset}.select-mode-active .Message .message-select-control{opacity:1}.Message.is-selected .message-select-control{background:var(--color-green)}.Message.is-selected .message-select-control.group-select{background:transparent}.Message.is-selected .message-select-control.group-select.is-selected{background:var(--color-green)}.Message .File.file-is-selected .message-select-control{background:var(--color-green)}.Message.is-in-document-group .File.file-is-selected .file-icon,.Message.has-menu-open.is-in-document-group .File .file-icon{--background-color: var(--color-background-selected)}.Message.own.is-in-document-group .File.file-is-selected .file-icon,.Message.own.has-menu-open.is-in-document-group .File .file-icon{--background-color: var(--color-background-own-selected)}.Message .Audio .message-select-control{left:1.0625rem;top:1.375rem}html.theme-dark .Message.own .Audio .ProgressSpinner{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjODA3QkQ1IiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+);background-position:center;background-size:1rem}html.theme-dark .Message.own .Audio .ProgressSpinner circle{stroke:var(--background-color)}.Message .File{position:relative}.Message .File .message-select-control{position:absolute;top:2rem;left:2rem;z-index:2}.Message.own .Message .album-item-select-wrapper{background:var(--color-background-own)}.Message .album-item-select-wrapper .message-select-control{position:absolute;top:0.438rem;right:0.438rem;left:unset}.Message .album-item-select-wrapper .media-inner{border:0 var(--select-background-color) solid;transition:border-width var(--select-transition)}.Message .album-item-select-wrapper img,.Message .album-item-select-wrapper video{transition:transform var(--select-transition)}.Message .album-item-select-wrapper.is-selected .message-select-control{background:var(--color-green)}.Message .album-item-select-wrapper.is-selected img,.Message .album-item-select-wrapper.is-selected video{transform:scale(var(--select-message-scale))}.Message.is-selected .message-select-control,.Message.is-forwarding .message-select-control{background:var(--color-green)}.Message.is-selected .Menu .bubble,.Message.is-forwarding .Menu .bubble{transition:none !important}.Message.is-in-document-group:not(.first-in-document-group)::before{top:0 !important}.Message.is-in-document-group:not(.first-in-document-group) .message-content{box-shadow:none;border-top-left-radius:0 !important;border-top-right-radius:0 !important}.Message.is-in-document-group:not(.first-in-document-group) .forwarded-message::before{top:-1.5rem}.Message.is-in-document-group:not(.last-in-document-group){margin-bottom:0}.Message.is-in-document-group:not(.last-in-document-group)::before{bottom:0 !important}.Message.is-in-document-group:not(.last-in-document-group) .message-content{border-bottom-left-radius:0 !important;border-bottom-right-radius:0 !important}.Message.is-in-document-group.is-in-selection-mode .Audio:not(.audio-is-selected) .message-select-control:not(.group-select),.Message.is-in-document-group.is-in-selection-mode .File:not(.file-is-selected) .message-select-control:not(.group-select){background:white}.Message.is-in-document-group.is-in-selection-mode .Audio:not(.audio-is-selected) .message-select-control:not(.group-select)::after,.Message.is-in-document-group.is-in-selection-mode .File:not(.file-is-selected) .message-select-control:not(.group-select)::after{content:'';width:1.25rem;height:1.25rem;border-radius:0.688rem;background:white;border:0.125rem rgba(0,0,0,0.2) solid;position:absolute}.Message.is-in-document-group.is-in-selection-mode.own .message-content .Audio:not(.audio-is-selected) .message-select-control:not(.group-select),.Message.is-in-document-group.is-in-selection-mode.own .message-content .File:not(.file-is-selected) .message-select-control:not(.group-select){background:var(--background-color);border-color:var(--background-color)}.Message.is-in-document-group.is-in-selection-mode.own .message-content .Audio:not(.audio-is-selected) .message-select-control:not(.group-select)::after,.Message.is-in-document-group.is-in-selection-mode.own .message-content .File:not(.file-is-selected) .message-select-control:not(.group-select)::after{background:var(--background-color);border-color:var(--color-message-meta-own)}.Message.is-in-document-group.focused .message-content,.Message.is-in-document-group.has-menu-open .message-content,.Message.is-in-document-group.is-forwarding .message-content,.Message.is-in-document-group.is-selected .message-content{background:var(--color-background-selected)}.Message.is-in-document-group.focused.own .message-content,.Message.is-in-document-group.has-menu-open.own .message-content,.Message.is-in-document-group.is-forwarding.own .message-content,.Message.is-in-document-group.is-selected.own .message-content{--background-color: var(--color-background-own-selected);background:var(--color-background-own-selected)}.Message.is-in-document-group .message-content-wrapper{width:17.1875rem}.Message.is-in-document-group .message-content{transition:background-color var(--select-transition)}.Message.is-in-document-group.own .message-content-wrapper{display:flex;justify-content:flex-end}.Message.is-in-document-group.own .message-content-wrapper .message-content{width:100%}.Message .album-item-select-wrapper{position:absolute}.Message .album-item-select-wrapper .message-select-control{position:absolute;z-index:2}.Message .message-select-control{position:absolute;left:0;bottom:0.25rem;width:1.5rem;height:1.5rem;border:2px solid white;border-radius:50%;z-index:var(--z-message-select-control);display:flex;align-items:center;justify-content:center;color:white;font-size:1rem;opacity:0;pointer-events:none;transition:opacity var(--select-transition)}.Message .message-select-control .icon-select{position:absolute;left:-3px;top:-3px;font-size:1.625rem}.theme-dark .Message .message-select-control{border-color:#ffffff80}.Message .Avatar{margin-right:0.3rem}.Message.is-in-document-group .message-content.document{padding:.25rem .5rem !important}.Message.is-in-document-group.last-in-document-group .message-content.document{padding-bottom:.5rem !important}.Message.is-in-document-group.first-in-document-group .message-content.document{padding-top:.5rem !important}.message-content,.Album,.media-inner,.message-content.media .media-inner img,.message-content.media .media-inner video,.message-content.custom-shape .media-inner img{border-top-left-radius:var(--border-top-left-radius);border-top-right-radius:var(--border-top-right-radius);border-bottom-left-radius:var(--border-bottom-left-radius);border-bottom-right-radius:var(--border-bottom-right-radius)}.media-inner video.full-media{background:transparent !important}.media-inner{overflow:hidden}.media-inner.small-image img{border-radius:0 !important}.Message{--border-top-left-radius: var(--border-radius-messages);--border-top-right-radius: var(--border-radius-messages);--border-bottom-left-radius: var(--border-radius-messages);--border-bottom-right-radius: var(--border-radius-messages)}.Message:not(.own).first-in-group:not(.last-in-group){--border-bottom-left-radius: var(--border-radius-messages-small)}.Message:not(.own):not(.first-in-group):not(.last-in-group){--border-top-left-radius: var(--border-radius-messages-small);--border-bottom-left-radius: var(--border-radius-messages-small)}.Message:not(.own).last-in-group:not(.first-in-group){--border-top-left-radius: var(--border-radius-messages-small)}.Message:not(.own).last-in-group{--border-bottom-left-radius: var(--border-radius-messages-small)}.Message:not(.own).last-in-group .message-content.has-appendix{--border-bottom-left-radius: 0}.Message.own.first-in-group:not(.last-in-group){--border-bottom-right-radius: var(--border-radius-messages-small)}.Message.own:not(.first-in-group):not(.last-in-group){--border-top-right-radius: var(--border-radius-messages-small);--border-bottom-right-radius: var(--border-radius-messages-small)}.Message.own.last-in-group:not(.first-in-group){--border-top-right-radius: var(--border-radius-messages-small)}.Message.own.last-in-group{--border-bottom-right-radius: var(--border-radius-messages-small)}.Message.own.last-in-group .message-content.has-appendix{--border-bottom-right-radius: 0}.Message .message-content.has-replies:not(.custom-shape) .media-inner,.Message .message-content.has-replies:not(.custom-shape) .Album,.Message .message-content.text .media-inner,.Message .message-content.text .Album{--border-bottom-left-radius: 0;--border-bottom-right-radius: 0}.Message .message-content.is-reply .EmbeddedMessage+.Album,.Message .message-content.is-reply .EmbeddedMessage+.Audio,.Message .message-content.is-reply .EmbeddedMessage+.File{margin-top:.375rem}.Message .message-content:not(.custom-shape).is-reply .media-inner,.Message .message-content:not(.custom-shape).is-reply .Album,.Message .message-content:not(.custom-shape).force-sender-name .Album,.Message .message-content:not(.is-forwarded) .message-title ~ .media-inner{--border-top-left-radius: 0;--border-top-right-radius: 0}.Message .message-content.is-forwarded .content-inner .message-title{margin-bottom:0.25rem}.Message .message-action-button{position:absolute;bottom:0;color:white;background-color:rgba(0,0,0,0.2);opacity:0;transition:opacity .2s ease}@media (pointer: coarse){.Message .message-action-button{opacity:1 !important}}.Message .message-action-button:hover,.Message .message-action-button:active,.Message .message-action-button:focus{background-color:rgba(0,0,0,0.28) !important}.Message:hover .message-action-button,.Message[data-is-document-group-hover] .message-action-button{opacity:1}.Message.own .message-action-button{left:-3rem}.Message:not(.own) .message-action-button{right:-3rem}.Message .bottom-marker{height:1px;width:1px;visibility:hidden}.Message .custom-shape .message-action-button{bottom:.25rem}.message-content{position:relative;max-width:var(--max-width)}@media (max-width: 600px){.message-content{max-width:calc(100vw - 5.5rem)}.Message.own .message-content,.MessageList.no-avatars .message-content{max-width:calc(100vw - 3rem)}@supports (max-width: min(29rem, 100vw - 5.5rem)){.message-content{max-width:min(29rem, 100vw - 5.5rem)}.MessageList.no-avatars .message-content{max-width:min(29rem, 100vw - 3rem)}.Message.own .message-content{max-width:min(30rem, 100vw - 3rem)}}.message-content.has-action-button{max-width:calc(100vw - 7rem)}.Message.own .message-content.has-action-button,.MessageList.no-avatars .message-content.has-action-button{max-width:calc(100vw - 4.5rem)}@supports (max-width: min(29rem, 100vw - 5.5rem)){.message-content.has-action-button{max-width:min(29rem, 100vw - 7rem)}.MessageList.no-avatars .message-content.has-action-button{max-width:min(29rem, 100vw - 4.5rem)}.Message.own .message-content.has-action-button{max-width:min(30rem, 100vw - 4.5rem)}}}.message-content .text-content{margin:0;word-break:break-word;line-height:1.3125;text-align:initial;display:flow-root;unicode-bidi:plaintext}.message-content .text-entity-link{unicode-bidi:plaintext}.message-content:not(.custom-shape) .text-content:not(.with-meta)>.MessageMeta,.message-content.document>.MessageMeta{position:relative;top:.375rem;bottom:auto !important;float:right;line-height:1;margin-top:.125rem;margin-left:.4375rem;margin-right:-.5rem}.message-content:not(.custom-shape) .text-content:not(.with-meta):dir(rtl)>.MessageMeta,.message-content.document:dir(rtl)>.MessageMeta{float:left;margin-left:-.25rem;margin-right:.4375rem}.message-content.document:not(.text)::after{content:"";display:block;clear:both}.message-content.document:not(.text)>.MessageMeta{top:auto;bottom:-.5rem !important;margin-top:-.25rem}.message-content.document:not(.text)>.MessageMeta:not([dir=rtl]){margin-top:-1.25rem}.theme-dark .Message.own .message-content .text-entity-link{text-decoration:underline}.theme-dark .Message.own .message-content .text-entity-link:hover{text-decoration:none}.message-content:not(.custom-shape){font-size:var(--message-text-size, 1rem)}body.is-ios .message-content:not(.custom-shape){font-size:var(--message-text-size, 1.0625rem)}.message-content:not(.custom-shape)>.content-inner{min-width:0}.message-content .matching-text-highlight{background:#CAE3F7;border-radius:0.25rem;padding:0 0.125rem}.message-content .message-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:calc(var(--message-text-size, 1rem) - .125rem);font-weight:500;line-height:1.25rem;color:var(--accent-color);unicode-bidi:plaintext;display:flex}.message-content .message-title>.interactive{overflow:hidden;text-overflow:ellipsis}.message-content .message-title.interactive,.message-content .message-title>.interactive{cursor:pointer}.message-content .message-title.interactive:hover,.message-content .message-title>.interactive:hover{opacity:0.85}.message-content .message-title>.color-1{color:var(--color-user-1)}.message-content .message-title>.color-2{color:var(--color-user-2)}.message-content .message-title>.color-4{color:var(--color-user-4)}.message-content .message-title>.color-5{color:var(--color-user-5)}.message-content .message-title>.color-6{color:var(--color-user-6)}.message-content .message-title>.color-7{color:var(--color-user-7)}.message-content .message-title>.color-8{color:var(--color-user-8)}.theme-dark .Message.own .message-content .message-title>.color-1{color:var(--accent-color)}.message-content .message-title+.File{margin-top:.25rem}.message-content .message-title .via{padding-right:.25rem;font-weight:400}.message-content .message-title span+.via{padding-left:.25rem}.message-content .message-title .admin-title{flex:1;margin-left:1rem;text-align:right;font-weight:400;font-size:0.75rem;margin-top:-0.1rem;color:rgba(var(--color-text-meta-rgb), 0.75)}.Message.own .message-content .message-title .admin-title{color:var(--accent-color)}.message-content.has-shadow{box-shadow:0 1px 2px var(--color-default-shadow)}.message-content.has-solid-background,.message-content.has-background,.is-album .message-content{background:var(--background-color)}.message-content.has-solid-background{padding:.3125rem .5rem .375rem}.message-content.has-solid-background .forwarded-message .text-content.with-meta.with-outgoing-icon:last-child{--meta-icon-width: .5rem}.message-content.has-solid-background .forwarded-message .text-content.with-meta .MessageMeta{bottom:-.25rem}.message-content.has-solid-background .text-content.with-meta:last-child::after,.message-content.has-solid-background .forwarded-message>.text-content:not(.with-meta):last-child::after{content:'';display:inline-block;width:calc(var(--meta-safe-area-size) + var(--meta-icon-width, 0px));height:1rem;float:right}.message-content:not(.has-appendix) .svg-appendix{display:none}.message-content .svg-appendix{overflow:hidden;position:absolute;bottom:-.0875rem;width:.5625rem;height:1.125rem;font-size:1rem !important}.message-content .svg-appendix .corner{fill:var(--background-color)}.Message.own .message-content .svg-appendix{right:-.551rem}.Message:not(.own) .message-content .svg-appendix{left:-.562rem}.message-content[data-has-custom-appendix] .svg-appendix .corner{fill:var(--appendix-bg)}.Message .message-content.has-appendix-thumb .svg-appendix{--background-color: #ccc;opacity:1;transition:opacity 500ms ease}.message-content.document{padding:.5rem !important}.theme-dark .message-content.document .File{--color-primary: var(--color-selection-highlight)}.message-content.document .File+.text-content{margin-top:.3125rem}.message-content.voice .message-title,.message-content.voice .Embedded,.message-content.audio .message-title,.message-content.audio .Embedded{margin-top:-.1875rem;margin-bottom:.1875rem}.message-content.voice{padding:.5rem !important}.message-content.voice .Voice+.text-content{margin-top:.5rem}.message-content.audio{min-width:17.1875rem;padding:.5rem .5rem .8125rem !important}.message-content.audio .Audio+.text-content{margin-top:.25rem}.message-content.audio:not(.has-replies) .Audio+.text-content{margin-bottom:-0.4375rem}.message-content:not(.custom-shape) .emoji{display:inline-block;width:1.25rem;background-size:1.25rem;color:transparent;margin-inline-end:1px;vertical-align:text-bottom}.message-content:not(.custom-shape) .emoji::selection{background-color:var(--color-selection-highlight-emoji);color:transparent}.message-content:not(.custom-shape) .text-content .emoji{width:calc(1.25 * var(--message-text-size, 1rem));height:calc(1.25 * var(--message-text-size, 1rem));background-size:calc(1.25 * var(--message-text-size, 1rem))}.message-content .no-media-corners{--border-top-left-radius: 0;--border-top-right-radius: 0}.message-content.custom-shape.is-via-bot{font-size:inherit !important}.message-content.custom-shape.is-via-bot .message-title{display:inline-flex;position:relative;top:.125rem;max-width:calc(100% - 3rem);margin-left:calc(100% - 3rem);padding:0 .5rem;background-color:var(--background-color);border-radius:var(--border-radius-messages)}.Message.own .message-content.custom-shape.is-via-bot .message-title{margin-left:-3rem}.message-content.custom-shape.is-via-bot .media-inner{margin-top:0.375rem}.message-content.media .media-inner,.WebPage .media-inner{display:flex;justify-content:center;align-items:center}.message-content.media .media-inner.interactive,.WebPage .media-inner.interactive{cursor:pointer}.message-content.media .media-inner.interactive.dark video,.WebPage .media-inner.interactive.dark video{background-color:#232323}.message-content.media.round.is-reply,.WebPage.round.is-reply{width:auto !important}.message-content.media.force-sender-name .media-inner,.message-content.media.force-sender-name .Album,.message-content.media.text .media-inner,.message-content.media.is-via-bot .media-inner,.message-content.media.is-reply .media-inner,.message-content.media.is-reply .Album,.WebPage.force-sender-name .media-inner,.WebPage.force-sender-name .Album,.WebPage.text .media-inner,.WebPage.is-via-bot .media-inner,.WebPage.is-reply .media-inner,.WebPage.is-reply .Album{margin-left:-0.5rem;margin-right:-0.5rem}.message-content.media.text .media-inner,.WebPage.text .media-inner{margin-top:-0.3125rem}.message-content.media.is-reply .media-inner,.message-content.media.force-sender-name .Album,.message-content.media.is-reply .Album,.message-content.media .message-title ~ .media-inner,.WebPage.is-reply .media-inner,.WebPage.force-sender-name .Album,.WebPage.is-reply .Album,.WebPage .message-title ~ .media-inner{margin-top:0.375rem;margin-bottom:-0.375rem}.message-content.media.text .media-inner,.message-content.media.text .Album,.WebPage.text .media-inner,.WebPage.text .Album{margin-bottom:0.375rem}.message-content.media .media-loading,.WebPage .media-loading{display:flex;align-items:center;justify-content:center}.message-content.media .media-loading:not(.open),.WebPage .media-loading:not(.open){opacity:0.5;transform:scale(0);transition:opacity .3s ease, transform .3s ease}.message-content.media .icon-large-play,.message-content.media .icon-download,.WebPage .icon-large-play,.WebPage .icon-download{position:absolute;display:flex;align-items:center;justify-content:center;color:#fff;opacity:0.7;transition:opacity 150ms}.message-content.media .icon-large-play:hover,.message-content.media .icon-download:hover,.WebPage .icon-large-play:hover,.WebPage .icon-download:hover{opacity:1}.message-content.media .icon-large-play:before,.message-content.media .icon-download:before,.WebPage .icon-large-play:before,.WebPage .icon-download:before{display:flex;align-items:center;justify-content:center;width:3.375rem;height:3.375rem;border-radius:50%;background:rgba(0,0,0,0.25)}.message-content.media .icon-download,.WebPage .icon-download{font-size:1.5rem}.message-content.media .icon-large-play,.WebPage .icon-large-play{font-size:2.5rem}.message-content.media .message-media-duration,.message-content.media .message-upload-progress,.WebPage .message-media-duration,.WebPage .message-upload-progress{background:rgba(0,0,0,0.25);color:#fff;font-size:0.75rem;position:absolute;left:.1875rem;top:.1875rem;z-index:1;padding:0 .375rem;border-radius:.75rem;line-height:1.125rem}.message-content.media .message-media-duration .icon-muted-chat,.WebPage .message-media-duration .icon-muted-chat{vertical-align:-.1875rem;margin-left:.375rem;font-size:1.0625rem}.message-content.custom-shape{line-height:1.2;font-size:10rem;display:flex;flex-wrap:wrap;align-items:flex-end}.message-content.custom-shape.has-comments{min-height:5.25rem;margin-top:0 !important}.message-content.custom-shape.has-comments.has-replies{min-height:6.5rem}.message-content.custom-shape.is-reply{max-width:100%}.message-content.custom-shape .reply-message{display:flex;align-items:flex-start;flex-direction:row-reverse;direction:ltr}.message-content.custom-shape .reply-message>p{margin-bottom:0}.message-content.custom-shape .reply-message .EmbeddedMessage{margin-left:0.5rem;border-radius:var(--border-radius-messages)}@media (max-width: 600px){.message-content.custom-shape .reply-message .EmbeddedMessage{max-width:calc(90vw - 13rem)}}@media (max-width: 340px){.message-content.custom-shape .reply-message .EmbeddedMessage{margin-left:-1rem;z-index:1;max-width:calc(90vw - 12rem)}}.message-content.custom-shape .text-content{margin-bottom:1rem}.message-content.custom-shape .media-inner{line-height:1;font-size:1rem;flex-shrink:0}.message-content.custom-shape .media-inner .full-media{top:0;left:0;bottom:0;right:0}.message-content.custom-shape .emoji{display:inline-block;color:transparent}.message-content.custom-shape .emoji::selection{background-color:var(--color-selection-highlight-emoji);color:transparent}.message-content.custom-shape.emoji-only .text-content{margin-bottom:0}.message-content.custom-shape.emoji-only-1{min-width:8rem;font-size:4.5rem}.message-content.custom-shape.emoji-only-1 .content-inner{height:7rem}.message-content.custom-shape.emoji-only-1 .text-content{line-height:1.5;text-align:center}.Message.was-edited .message-content.custom-shape.emoji-only-1{min-width:10rem}.message-content.custom-shape.emoji-only-1 .emoji{width:5rem;height:5rem}.message-content.custom-shape.emoji-only-2{font-size:4rem;margin-top:.5rem;min-width:10rem}.message-content.custom-shape.emoji-only-2.has-comments{margin-top:1.25rem}.Message.was-edited .message-content.custom-shape.emoji-only-2{min-width:12rem}.message-content.custom-shape.emoji-only-2 .emoji{width:4rem;height:4rem}.message-content.custom-shape.emoji-only-3{font-size:3rem;margin-top:1.75rem;min-width:12rem}.message-content.custom-shape.emoji-only-3.has-comments{margin-top:2.5rem}.Message.was-edited .message-content.custom-shape.emoji-only-3{min-width:14rem}.message-content.custom-shape.emoji-only-3 .emoji{width:3rem;height:3rem}.Message:not(.own) .message-content.custom-shape{--hover-color: var(--color-reply-hover);--active-color: var(--color-reply-active)}.Message.own .message-content.custom-shape{--hover-color: var(--color-reply-own-hover);--active-color: var(--color-reply-own-active)}.Message.own .message-content.custom-shape .reply-message{flex-direction:row}.Message.own .message-content.custom-shape .reply-message .EmbeddedMessage{margin-right:0.5rem}@media (max-width: 340px){.Message.own .message-content.custom-shape .reply-message .EmbeddedMessage{margin-left:0;z-index:1;max-width:calc(90vw - 11.5rem)}}.forwarded-message{--border-top-left-radius: var(--border-radius-messages-small);--border-top-right-radius: var(--border-radius-messages-small);--border-bottom-left-radius: var(--border-radius-messages-small);--border-bottom-right-radius: var(--border-radius-messages-small)}.message-content.poll .forwarded-message{margin-bottom:0.5rem}.message-content:not(.custom-shape) .forwarded-message{position:relative;margin-top:0.25rem;padding-left:0.625rem}.message-content:not(.custom-shape) .forwarded-message::before{content:'';display:block;position:absolute;top:0;bottom:0;left:0.05rem;width:2px;background:var(--accent-color);border-radius:2px}.message-content:not(.custom-shape) .forwarded-message:dir(rtl){padding-inline-start:0.625rem}.message-content:not(.custom-shape) .forwarded-message:dir(rtl)::before{left:auto;right:0.05rem}.forwarded-message>.media-inner{margin:0 !important;margin-bottom:0.25rem !important}.long-word-break-all{word-break:break-all}.text-entity-link{color:var(--color-links) !important;text-decoration:none;word-break:break-word;cursor:pointer;unicode-bidi:initial}.text-entity-link:hover,.text-entity-link:active,.text-entity-link:visited{color:var(--color-links-hover) !important;text-decoration:underline}.text-entity-code,.text-entity-pre{color:var(--color-code);background:var(--color-code-bg);white-space:pre-wrap;margin:0;padding:1px 2px;border-radius:4px;font-size:calc(var(--message-text-size, 1rem) - 0.0625rem)} +.ContactGreeting{width:100%;height:100%;display:flex;align-items:center;justify-content:center;text-align:center}.ContactGreeting .wrapper{display:inline-flex;flex-direction:column;align-items:center;background:var(--pattern-color);width:14.5rem;padding:.75rem 1rem;border-radius:1.5rem;color:#fff}.ContactGreeting .title{font-weight:500;margin-bottom:0}.ContactGreeting .description{font-size:.9375rem;margin-bottom:0}.ContactGreeting .sticker{margin:2rem 0 1rem;height:10rem;width:10rem;cursor:pointer}.ContactGreeting .sticker .thumbnail{height:10rem;width:10rem} + +.NoMessages{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.NoMessages .icon{font-size:5rem;margin:0 auto 1rem}.NoMessages .wrapper{display:inline-flex;flex-direction:column;background:var(--pattern-color);max-width:20rem;padding:.75rem 1rem;border-radius:1.5rem;color:#fff}.NoMessages .wrapper[dir=rtl]{text-align:right}.NoMessages .title{font-weight:500;font-size:1rem;margin-bottom:.25rem;text-align:center;unicode-bidi:plaintext}.NoMessages .description{font-size:.9375rem;margin:0;padding:0;list-style:none;unicode-bidi:plaintext}.NoMessages .list-checkmarks{font-size:.9375rem;margin:.25rem 0 0;padding:0;list-style:none;unicode-bidi:plaintext;line-height:1.8}.NoMessages .list-checkmarks li::before{content:'✓';margin-inline-end:.5rem} + .MessageList{flex:1;width:100%;overflow-anchor:none;overflow:scroll;overflow-x:hidden;overflow-y:overlay;margin-bottom:.5rem}.mask-image-enabled .MessageList{-webkit-mask-image:linear-gradient(to top, transparent 0, #000 0.5rem);mask-image:linear-gradient(to top, transparent 0, #000 0.5rem)}@media (pointer: coarse){.MessageList{-webkit-user-select:none;user-select:none;touch-callout:none}.MessageList.select-mode-active{-webkit-user-select:auto;user-select:auto;touch-callout:default}}.MessageList.no-avatars .Message>.Avatar{display:none}.MessageList .messages-container{width:100%;max-width:var(--messages-container-width);min-height:100%;margin:0 auto;display:flex;justify-content:flex-end;flex-direction:column;padding:1rem 1rem 0 1.125rem}.force-messages-scroll .MessageList .messages-container{margin-top:100vh !important}@media (max-width: 600px){.MessageList .messages-container{width:100vw;padding:2.75rem 0.5rem 0;margin:0}}.MessageList.no-composer{margin-bottom:0}.MessageList.no-composer .last-in-list{margin-bottom:1rem}.MessageList.select-mode-active,.MessageList.type-pinned{margin-bottom:0}.MessageList.select-mode-active .last-in-list,.MessageList.type-pinned .last-in-list{margin-bottom:5.625rem}@media (max-width: 600px){.MessageList.select-mode-active .last-in-list,.MessageList.type-pinned .last-in-list{margin-bottom:4.25rem}}.MessageList.select-mode-active .last-in-list.ActionMessage,.MessageList.type-pinned .last-in-list.ActionMessage{padding-bottom:0.125rem}.MessageList .Message,.MessageList .ActionMessage{position:relative;opacity:1;transform:scale(1);transition:opacity .2s ease, transform .2s ease}.MessageList .Message:not(.open),.MessageList .ActionMessage:not(.open){transform:scale(0.8);opacity:0}.MessageList .Message.open.shown,.MessageList .ActionMessage.open.shown{transform:none}.MessageList .Message::before,.MessageList .ActionMessage::before{content:"";position:absolute;top:-0.1875rem;bottom:-0.1875rem;left:-50vw;right:-50vw;background:black;z-index:-1;opacity:0;transition:opacity var(--select-transition)}body.animation-level-0 .MessageList .Message::before,body.animation-level-0 .MessageList .ActionMessage::before{transition:none !important}.MessageList .Message:not(.last-in-group)::before,.MessageList .ActionMessage:not(.last-in-group)::before{bottom:-0.1875rem}.MessageList .Message:not(.first-in-group)::before,.MessageList .ActionMessage:not(.first-in-group)::before{top:-0.1875rem}.MessageList .Message.focused::before,.MessageList .ActionMessage.focused::before{transition:none !important}.MessageList .Message.focused::before,.MessageList .Message.is-forwarding::before,.MessageList .Message.is-selected::before,.MessageList .Message.has-menu-open::before,.MessageList .ActionMessage.focused::before,.MessageList .ActionMessage.is-forwarding::before,.MessageList .ActionMessage.is-selected::before,.MessageList .ActionMessage.has-menu-open::before{opacity:0.1}.MessageList>.empty{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.MessageList .sticky-date,.MessageList .local-action-message,.MessageList .ActionMessage,.MessageList .empty{text-align:center}.MessageList .sticky-date>span,.MessageList .local-action-message>span,.MessageList .ActionMessage>span,.MessageList .empty>span{display:inline-block;background:var(--pattern-color);color:white;font-size:calc(var(--message-text-size, 1rem) - .0625rem);font-weight:500;line-height:1.75;padding:0 .5rem;border-radius:2rem;word-break:break-word}body.is-ios .MessageList .sticky-date>span,body.is-macos .MessageList .sticky-date>span,body.is-ios .MessageList .local-action-message>span,body.is-macos .MessageList .local-action-message>span,body.is-ios .MessageList .ActionMessage>span,body.is-macos .MessageList .ActionMessage>span,body.is-ios .MessageList .empty>span,body.is-macos .MessageList .empty>span{font-size:calc(var(--message-text-size, 1rem) - .125rem)}.MessageList .sticky-date>span .emoji-small,.MessageList .local-action-message>span .emoji-small,.MessageList .ActionMessage>span .emoji-small,.MessageList .empty>span .emoji-small{vertical-align:text-bottom;width:calc(1.25 * var(--message-text-size, 1rem));height:calc(1.25 * var(--message-text-size, 1rem));background-size:calc(1.25 * var(--message-text-size, 1rem))}.MessageList .sticky-date.rich>span,.MessageList .local-action-message.rich>span,.MessageList .ActionMessage.rich>span,.MessageList .empty.rich>span{max-width:80%;text-align:left}.MessageList .sticky-date.rich a,.MessageList .sticky-date.rich a:visited,.MessageList .local-action-message.rich a,.MessageList .local-action-message.rich a:visited,.MessageList .ActionMessage.rich a,.MessageList .ActionMessage.rich a:visited,.MessageList .empty.rich a,.MessageList .empty.rich a:visited{color:var(--color-links-darker) !important}.MessageList .sticky-date.rich a:hover,.MessageList .sticky-date.rich a:active,.MessageList .local-action-message.rich a:hover,.MessageList .local-action-message.rich a:active,.MessageList .ActionMessage.rich a:hover,.MessageList .ActionMessage.rich a:active,.MessageList .empty.rich a:hover,.MessageList .empty.rich a:active{color:var(--color-links-darker-hover) !important}.MessageList .sticky-date{margin-top:1rem;margin-bottom:1rem;z-index:var(--z-sticky-date);pointer-events:none;opacity:1;transition:opacity .3s ease}body:not(.is-scrolling-messages) .MessageList .sticky-date.stuck{opacity:0}body:not(.is-scrolling-messages) .MessageList .sticky-date.stuck span{pointer-events:none}body.animation-level-0 .MessageList .sticky-date{transition:none}.MessageList .sticky-date.interactive{cursor:pointer}.MessageList .sticky-date span{pointer-events:auto}.MessageList.scrolled:not(.is-animating) .sticky-date{position:sticky;top:0.625rem}.MessageList.is-animating{overflow:hidden}.MessageList.is-animating .message-select-control{display:none !important}.has-header-tools .MessageList .sticky-date{top:3.75rem}.MessageList .local-action-message,.MessageList .ActionMessage{margin-top:0.5rem;margin-bottom:0.5rem}.MessageList .ActionMessage .action-link{cursor:pointer}.MessageList .ActionMessage .action-link:hover{text-decoration:underline}.MessageList .sticky-date+.ActionMessage{margin-top:-0.5rem}@media (min-width: 1276px){.MessageList{width:100%;transform:translate3d(0, 0, 0);transition:transform var(--layer-transition)}.MessageList .messages-container{width:calc(100% - var(--right-column-width))}body.animation-level-0 .MessageList{transition:none}#Main.right-column-open .MessageList{transform:translate3d(calc(var(--right-column-width) / -2), 0, 0)}body:not(.animating-right-column) #Main.right-column-open .MessageList.select-mode-active,#Main.right-column-open .MessageList:not(.select-mode-active),body.animating-right-column .MessageList:not(.select-mode-active){width:calc(100% - var(--right-column-width))}body:not(.animating-right-column) #Main.right-column-open .MessageList.select-mode-active .messages-container,#Main.right-column-open .MessageList:not(.select-mode-active) .messages-container,body.animating-right-column .MessageList:not(.select-mode-active) .messages-container{width:100%}}@media (max-width: 600px){.MessageList{transition:transform var(--layer-transition)}body.enable-symbol-menu-transforms .MessageList{transform:translate3d(0, 0, 0)}body.is-symbol-menu-open .MessageList{transform:translate3d(0, calc(-1 * (var(--symbol-menu-height) + var(--symbol-menu-footer-height))), 0)}}.MessageList.select-mode-active,.MessageList.has-focus-highlight,body.has-context-menu .MessageList,.animating>div>.MessageList{padding-right:0}.MessageList.select-mode-active::-webkit-scrollbar,.MessageList.has-focus-highlight::-webkit-scrollbar,body.has-context-menu .MessageList::-webkit-scrollbar,.animating>div>.MessageList::-webkit-scrollbar{width:0}@supports (scrollbar-width: none){.MessageList.select-mode-active,.MessageList.has-focus-highlight,body.has-context-menu .MessageList,.animating>div>.MessageList{padding-right:.6875rem;scrollbar-width:none}}.is-safari .MessageList.select-mode-active,.is-safari .MessageList.has-focus-highlight,.is-safari.has-context-menu .messages-layout .MessageList{padding-right:.375rem} .ScrollDownButton{--base-bottom-pos: 6rem;position:absolute;bottom:var(--base-bottom-pos);right:1rem;opacity:0;transform:translateY(4.5rem);transition:transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),opacity 0.2s ease;z-index:10;pointer-events:none}body.animation-level-0 .ScrollDownButton{transform:none !important;transition:opacity .15s}@media (max-width: 600px){.ScrollDownButton{right:0.5rem;bottom:4.5rem}}.ScrollDownButton-inner{display:flex;flex-direction:column;align-items:center}.ScrollDownButton-inner>.Button{box-shadow:0 1px 2px var(--color-default-shadow)}.ScrollDownButton-inner>.Button i{font-size:1.75rem}@media (min-width: 1276px){.ScrollDownButton-inner{transform:translateX(0);transition:transform var(--layer-transition)}body.animation-level-0 .ScrollDownButton-inner{transition:none !important}#Main.right-column-open .ScrollDownButton-inner{transform:translateX(calc(-1 * var(--right-column-width)))}}@media (max-width: 600px){.ScrollDownButton-inner>.Button{width:2.875rem;height:2.875rem}}.ScrollDownButton.revealed{transform:translateY(0);opacity:1;pointer-events:all}.ScrollDownButton.revealed.no-composer{transform:translateY(4rem)}.ScrollDownButton .unread-count{min-width:1.5rem;height:1.5rem;padding:0 .45rem;border-radius:0.75rem;font-size:0.875rem;line-height:1.5rem;font-weight:500;text-align:center;position:absolute;top:-0.3rem;right:-0.3rem;background:var(--color-green);color:white;pointer-events:none}@media (max-width: 600px){.ScrollDownButton .unread-count{top:-0.7rem;right:auto}}@media (max-width: 600px){body.is-symbol-menu-open .ScrollDownButton{bottom:calc(var(--base-bottom-pos) + var(--symbol-menu-height) + var(--symbol-menu-footer-height))}} @@ -67,4 +71,4 @@ #Main{display:flex;height:100%;text-align:left;overflow:hidden}@media (min-width: 1276px){#Main{position:relative}}@media (max-width: 600px){#Main{height:calc(var(--vh, 1vh) * 100)}}#LeftColumn{flex:1;min-width:18rem;max-width:26.5rem;height:100%}@media (max-width: 600px){#LeftColumn{height:calc(var(--vh, 1vh) * 100)}}@media (min-width: 1680px){#LeftColumn{border-left:1px solid var(--color-borders)}}@media (max-width: 1275px){#LeftColumn{flex:2}}@media (max-width: 925px){#LeftColumn{position:fixed;left:0;top:0;height:calc(var(--vh, 1vh) * 100);width:26.5rem;transform:translate3d(-5rem, 0, 0);transition:transform var(--layer-transition)}body.animation-level-0 #LeftColumn{transition:none}#LeftColumn::after{content:'';display:block;position:absolute;left:0;top:0;right:0;bottom:0;background:black;opacity:var(--layer-blackout-opacity);transition:opacity var(--layer-transition);z-index:1}body.animation-level-0 #LeftColumn::after{transition:none}body.is-android #LeftColumn::after{display:none}body.is-android .middle-column-shown #LeftColumn::after{display:block}#Main:not(.middle-column-open) #LeftColumn{transform:translate3d(0, 0, 0)}#Main:not(.middle-column-open) #LeftColumn::after{opacity:0;pointer-events:none}#Main.history-animation-disabled #LeftColumn{transition:none}#Main.history-animation-disabled #LeftColumn:after{transition:none}}@media (max-width: 600px){#LeftColumn{max-width:none;width:100vw;transform:translate3d(-20vw, 0, 0)}}@media (min-width: 1680px){#RightColumn{border-right:1px solid var(--color-borders)}}@media (max-width: 600px){#RightColumn{height:calc(var(--vh, 1vh) * 100 + 1px)}}#Main.history-animation-disabled #RightColumn{transition:none}#Main.history-animation-disabled #RightColumn .overlay-backdrop{transition:none}#Main.history-animation-disabled .overlay-backdrop{transition:none}#MiddleColumn{flex:3;border-left:1px solid var(--color-borders);max-width:75vw}@media (max-width: 1275px){#MiddleColumn{max-width:calc(100vw - 26.5rem)}}@media (max-width: 66.25rem){#MiddleColumn{max-width:60vw}}@media (min-width: 1680px){#MiddleColumn{border-right:1px solid var(--color-borders);max-width:calc(1680px - 26.5rem)}}@media (max-width: 925px){#MiddleColumn{max-width:none;position:fixed;left:0;top:0;bottom:0;right:0;transform:translate3d(0, 0, 0);transition:transform var(--layer-transition)}body.animation-level-0 #MiddleColumn{transition:none}#Main:not(.middle-column-open) #MiddleColumn{transform:translate3d(26.5rem, 0, 0)}}@media (max-width: 600px){#MiddleColumn{border-left:none}#Main:not(.middle-column-open) #MiddleColumn{transform:translate3d(100vw, 0, 0)}#Main.right-column-open #MiddleColumn{transform:translate3d(-20vw, 0, 0)}}#Main.history-animation-disabled #MiddleColumn{transition:none}#Main.history-animation-disabled #MiddleColumn:after{transition:none}body.is-android.animation-level-1{--layer-transition: 250ms ease-in-out}body.is-android.animation-level-1 #LeftColumn,body.is-android.animation-level-1 #MiddleColumn,body.is-android.animation-level-1 #RightColumn{transition:transform var(--layer-transition),opacity var(--layer-transition)}body.is-android.animation-level-1 #Main:not(.middle-column-shown) #MiddleColumn{display:none}body.is-android.animation-level-1 #Main:not(.middle-column-open) #MiddleColumn{transform:translate3d(10vw, 0, 0);opacity:0}body.is-android.animation-level-1 #Main.middle-column-open #LeftColumn{transform:translate3d(0, 0, 0);opacity:0}body.is-android.animation-level-1 #Main:not(.right-column-shown) #RightColumn{display:none}body.is-android.animation-level-1 #Main:not(.right-column-open) #RightColumn{transform:translate3d(10vw, 0, 0);opacity:0}body.is-android.animation-level-1 #Main.right-column-open #MiddleColumn{transform:translate3d(0, 0, 0);opacity:0} -/*# sourceMappingURL=4.f46a6915735f9deb48a8.css.map*/ \ No newline at end of file +/*# sourceMappingURL=4.5fb9a295648f3bed8bba.css.map*/ \ No newline at end of file diff --git a/dist/4.5fb9a295648f3bed8bba.css.map b/dist/4.5fb9a295648f3bed8bba.css.map new file mode 100644 index 000000000..8ca9f184e --- /dev/null +++ b/dist/4.5fb9a295648f3bed8bba.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/ui/Switcher.scss","webpack:///./src/components/left/main/LeftMainHeader.scss","webpack:///./src/components/left/ConnectionState.scss","webpack:///./src/components/left/NewChatButton.scss","webpack:///./src/components/left/main/LeftMain.scss","webpack:///./src/components/left/LeftColumn.scss","webpack:///./src/components/middle/AudioPlayer.scss","webpack:///./src/components/middle/MiddleHeader.scss","webpack:///./src/components/common/EmbeddedMessage.scss","webpack:///./src/components/middle/message/MessageMeta.scss","webpack:///./src/components/middle/message/Sticker.scss","webpack:///./src/components/middle/message/Contact.scss","webpack:///./src/components/middle/message/PollOption.scss","webpack:///./src/components/middle/message/Poll.scss","webpack:///./src/components/middle/message/WebPage.scss","webpack:///./src/components/middle/message/Invoice.scss","webpack:///./src/components/middle/message/Album.scss","webpack:///./src/components/middle/message/RoundVideo.scss","webpack:///./src/components/middle/message/InlineButtons.scss","webpack:///./src/components/middle/message/CommentButton.scss","webpack:///./src/components/middle/message/Message.scss","webpack:///./src/components/middle/ContactGreeting.scss","webpack:///./src/components/middle/NoMessages.scss","webpack:///./src/components/middle/MessageList.scss","webpack:///./src/components/middle/ScrollDownButton.scss","webpack:///./src/components/middle/composer/ComposerEmbeddedMessage.scss","webpack:///./src/components/middle/composer/WebPagePreview.scss","webpack:///./src/components/middle/composer/Composer.scss","webpack:///./src/components/middle/MiddleColumn.scss","webpack:///./src/components/right/RightHeader.scss","webpack:///./src/components/right/ProfilePhoto.scss","webpack:///./src/components/right/ProfileInfo.scss","webpack:///./src/components/right/Profile.scss","webpack:///./src/components/right/AddChatMembers.scss","webpack:///./src/components/right/RightColumn.scss","webpack:///./src/components/main/Main.scss"],"names":[],"mappings":"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","file":"4.5fb9a295648f3bed8bba.css","sourcesContent":[".Switcher{display:inline-flex;align-items:center;position:relative;margin:0}.Switcher.disabled{pointer-events:none;opacity:0.5}.Switcher.inactive{pointer-events:none}body.animation-level-0 .Switcher .widget,body.animation-level-0 .Switcher .widget::after,.Switcher.no-animation .widget,.Switcher.no-animation .widget::after{transition:none !important}body.animation-level-0 .Switcher .widget:active:after,.Switcher.no-animation .widget:active:after{width:1.125rem}.Switcher input{height:0;width:0;visibility:hidden;position:absolute;z-index:var(--z-below);opacity:0}.Switcher .widget{cursor:pointer;text-indent:-999px;width:2.125rem;height:0.875rem;background:var(--color-gray);display:inline-block;border-radius:.5rem;position:relative;transition:background .2s ease-in}.Switcher .widget:after{content:'';position:absolute;top:-.125rem;left:0;width:1.125rem;height:1.125rem;background:var(--color-background);border-radius:.75rem;transition:0.2s ease-out;border:0.125rem solid var(--color-gray)}.Switcher input:checked+.widget{background:var(--color-primary)}.Switcher input:checked+.widget:after{left:calc(100% - 1.125rem);transform:translateX(calc(-100% + 1.125rem));border-color:var(--color-primary)}.Switcher .widget:active:after{width:1.25rem}\n","#LeftMainHeader{position:relative}#LeftMainHeader .animated-menu-icon{position:absolute}#LeftMainHeader .animated-menu-icon,#LeftMainHeader .animated-menu-icon::before,#LeftMainHeader .animated-menu-icon::after{width:1.125rem;height:0.125rem;border-radius:0.125rem;background-color:var(--color-text-secondary);transition:transform .25s;transform:rotate(0)}#LeftMainHeader .animated-menu-icon::before,#LeftMainHeader .animated-menu-icon::after{position:absolute;left:0;content:''}#LeftMainHeader .animated-menu-icon::before{top:-0.3125rem}#LeftMainHeader .animated-menu-icon::after{top:0.3125rem}#LeftMainHeader .animated-menu-icon.state-back{transform:rotate(180deg)}#LeftMainHeader .animated-menu-icon.state-back::before{transform:rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem)}#LeftMainHeader .animated-menu-icon.state-back::after{transform:rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem)}#LeftMainHeader .animated-menu-icon.no-animation{transition:none}#LeftMainHeader .animated-menu-icon.no-animation::before,#LeftMainHeader .animated-menu-icon.no-animation::after{transition:none}#LeftMainHeader .archived-badge{min-width:1.5rem;height:1.5rem;margin-left:auto;background:var(--color-gray);border-radius:0.75rem;padding:0 .45rem;color:white;font-size:0.875rem;line-height:1.5rem;font-weight:500;text-align:center;flex-shrink:0}#LeftMainHeader [dir=rtl] .archived-badge{margin-left:0;margin-right:auto}#LeftMainHeader .Menu .bubble{min-width:17rem;max-height:calc(100 * var(--vh) - 3.75rem);overflow-y:auto;overflow-y:overlay}.Transition>div:not(.active) #LeftMainHeader .Menu .bubble,body.animating-right-column #LeftMainHeader .Menu .bubble{transition:none !important}\n","#ConnectionState{flex:0 0 auto;display:flex;align-items:center;margin:0 0.5rem 0.5rem;padding:0.75rem;background:var(--color-yellow);border-radius:var(--border-radius-default)}#ConnectionState>.Spinner{--spinner-size: 1.75rem}#ConnectionState>.state-text{color:var(--color-text-lighter);font-weight:500;line-height:2rem;margin-inline-start:1.875rem;white-space:nowrap}@media (max-width: 950px){#ConnectionState>.state-text{margin-inline-start:1.25rem}}\n",".NewChatButton{position:absolute;right:1rem;bottom:1rem;transform:translateY(5rem);transition:transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1)}body.animation-level-0 .NewChatButton{transform:none !important;opacity:0;transition:opacity .15s}body.animation-level-0 .NewChatButton.revealed{opacity:1}.NewChatButton.revealed{transform:translateY(0)}@media (max-width: 600px){.NewChatButton.revealed{transform:translate3d(0, 0, 10px);transform-style:preserve-3d}}.NewChatButton.menu-is-open::before{content:'';display:block;position:absolute;top:-13rem;left:-11rem;right:-1rem;bottom:-1rem;z-index:-1}.is-touch-env .NewChatButton .Menu>.backdrop{position:absolute;left:-100vw;right:-100vw;top:-100vh;bottom:-100vh}.NewChatButton>.Button .icon-new-chat-filled,.NewChatButton>.Button .icon-close{position:absolute}.NewChatButton>.Button:not(.active) .icon-new-chat-filled{animation:grow-icon .4s ease-out}.NewChatButton>.Button:not(.active) .icon-close{animation:hide-icon .4s forwards ease-out}.NewChatButton>.Button.active .icon-close{animation:grow-icon .4s ease-out}.NewChatButton>.Button.active .icon-new-chat-filled{animation:hide-icon .4s forwards ease-out}\n","#LeftColumn-main{height:100%;position:relative;display:flex;flex-direction:column;overflow:hidden;z-index:1}#LeftColumn-main .connection-state-wrapper{position:absolute;top:3.75rem;width:100%}#LeftColumn-main>.Transition{flex:1;overflow:hidden;transition:transform 300ms ease}#LeftColumn-main>.Transition.pull-down{transform:translateY(3.75rem)}#LeftColumn-main .ChatFolders{height:100%;display:flex;flex-direction:column;overflow:hidden}#LeftColumn-main .ChatFolders .tabs-placeholder{height:2.625rem;transition:height 150ms ease}#LeftColumn-main .ChatFolders .tabs-placeholder:not(.open){height:0}#LeftColumn-main .ChatFolders .TabList{justify-content:flex-start;padding-left:.5625rem;padding-bottom:1px;border-bottom:0;z-index:1}#LeftColumn-main .ChatFolders .Tab{flex:0 0 auto;padding-left:0.625rem;padding-right:0.625rem}#LeftColumn-main .ChatFolders .Tab>span{padding-left:0.5rem;padding-right:0.5rem}#LeftColumn-main .ChatFolders>.Transition{flex:1;overflow:hidden}#LeftColumn-main .chat-list,#LeftColumn-main .RecentContacts,#LeftColumn-main .LeftSearch,#LeftColumn-main .search-content{height:100%;overflow-y:auto}#LeftColumn-main .btn-update{position:absolute;bottom:1rem;left:1rem;right:1rem;margin:0 auto}\n","#LeftColumn{overflow:hidden}#NewChat{height:100%}.left-header{height:var(--header-height);padding:0.375rem 1.25rem .5rem 0.8125rem;display:flex;align-items:center;flex-shrink:0;background-color:var(--color-background)}.left-header h3{margin-bottom:0;font-size:1.25rem;font-weight:500;margin-left:1.375rem}.left-header .SearchInput{margin-left:0.875rem;max-width:calc(100% - 3.625rem)}@media (max-width: 600px){.left-header .SearchInput{max-width:calc(100% - 3.375rem)}}@media (max-width: 600px){.left-header{padding:0.5rem}}\n",".AudioPlayer{display:flex;margin-left:auto;margin-top:-.25rem;margin-bottom:-.25rem}body.animation-level-0 .AudioPlayer{transition:none !important}.AudioPlayer>.Button{flex-shrink:0;margin:.125rem}.AudioPlayer>.toggle-play{--color-text-secondary: var(--color-primary);--color-text-secondary-rgb: var(--color-primary-shade-rgb);--color-primary-shade: var(--color-green);--color-white: var(--color-background-own)}.MiddleHeader .AudioPlayer+.HeaderActions{margin-left:1.5rem}.AudioPlayer .toggle-play.smaller{width:3rem;height:3rem}.AudioPlayer .toggle-play.smaller i{font-size:1.625rem;margin-top:-.025rem}.AudioPlayer .toggle-play i{position:absolute;font-size:1.9375rem;margin-top:-.05rem}.AudioPlayer .toggle-play i.icon-play{margin-left:.1rem}.AudioPlayer .toggle-play .icon-play,.AudioPlayer .toggle-play .icon-pause{opacity:1;transform:scale(1);transition:opacity 0.4s,transform 0.6s cubic-bezier(0.34, 1.56, 0.64, 1)}.AudioPlayer .toggle-play.play .icon-pause,.AudioPlayer .toggle-play.pause .icon-play,.AudioPlayer .toggle-play.loading .icon-play,.AudioPlayer .toggle-play.loading .icon-pause{opacity:0;transform:scale(0.5)}.AudioPlayer-content{display:flex;justify-content:center;flex-direction:column;flex-shrink:1;padding:.25rem .5rem;position:relative;overflow:hidden;cursor:pointer;max-width:15rem;border-radius:var(--border-radius-messages-small)}.AudioPlayer-content:hover{background-color:var(--color-interactive-element-hover)}@media (min-width: 1440px) and (max-width: 1500px){.AudioPlayer-content{max-width:14rem}}.AudioPlayer .AudioPlayer-content .title{display:block;font-weight:500;font-size:0.875rem !important;line-height:1rem;height:1rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}body.is-ios .AudioPlayer .AudioPlayer-content .title{font-size:.9375rem !important;line-height:.8125rem}.AudioPlayer-content .subtitle{font-size:0.85rem !important;color:var(--color-text-secondary);line-height:1.125rem;height:1.125rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:.125rem 0 0}body.is-ios .AudioPlayer-content .subtitle{font-size:.9375rem !important}\n",".MiddleHeader{display:flex;align-items:center;width:100%;box-shadow:0 2px 2px var(--color-light-shadow);background:var(--color-background);padding:.5rem .8125rem .5rem 1.5rem;position:relative;z-index:var(--z-middle-header)}@media (max-width: 600px){.MiddleHeader{padding:0.5rem;position:relative;transform:translate3d(0, 0, 10px);transform-style:preserve-3d}}.MiddleHeader .Transition{width:100%;min-width:0}.MiddleHeader .Transition>div{display:flex;align-items:center;width:100%}.MiddleHeader .back-button{margin-left:-0.5rem;margin-right:0.5rem;position:relative}@media (max-width: 600px){.MiddleHeader .back-button{margin-left:0}}.MiddleHeader .back-button .unread-count{min-width:1.25rem;height:1.25rem;padding:0 0.375rem;border-radius:0.625rem;font-size:0.75rem;line-height:1.25rem;font-weight:500;text-align:center;position:absolute;top:-0.25rem;right:-0.5rem;background:var(--color-gray);color:white;pointer-events:none}.MiddleHeader .back-button .unread-count.active{background:var(--color-primary)}.MiddleHeader .chat-info-wrapper{flex-grow:1;overflow:hidden}.MiddleHeader .header-tools{display:flex;align-items:center;justify-content:flex-end;margin-left:auto;flex-shrink:0}body.animation-level-0 .MiddleHeader .header-tools,body.animation-level-0 .MiddleHeader .header-tools .HeaderPinnedMessage-wrapper,body.animation-level-0 .MiddleHeader .header-tools .AudioPlayer,body.animation-level-0 .MiddleHeader .header-tools .HeaderActions{transition:none !important}@media (min-width: 1276px) and (max-width: 1439px){.MiddleHeader .header-tools .HeaderActions{transform:translate3d(0, 0, 0);transition:transform var(--layer-transition)}#Main.right-column-open .MiddleHeader .header-tools .HeaderActions{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0)}}@media (min-width: 1440px){.MiddleHeader .header-tools{transform:translate3d(0, 0, 0);transition:transform var(--layer-transition)}#Main.right-column-open .MiddleHeader .header-tools{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0)}}.Transition>div:not(.active) .MiddleHeader .header-tools,body.animating-right-column .MiddleHeader .header-tools{pointer-events:none}@media (min-width: 1276px) and (max-width: 1439px){.MiddleHeader:not(.tools-stacked) .header-tools .HeaderPinnedMessage-wrapper,.MiddleHeader:not(.tools-stacked) .header-tools .AudioPlayer{opacity:1}#Main.right-column-open .MiddleHeader:not(.tools-stacked) .header-tools .HeaderPinnedMessage-wrapper,#Main.right-column-open .MiddleHeader:not(.tools-stacked) .header-tools .AudioPlayer{opacity:0}}.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage-wrapper,.MiddleHeader.tools-stacked .header-tools .AudioPlayer{position:absolute;top:100%;left:0;right:0;height:2.875rem;overflow:hidden;box-shadow:0 2px 2px var(--color-light-shadow);display:flex;flex-direction:row-reverse;padding:0.375rem 0.5rem;padding-left:0.75rem;background:var(--color-background)}.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage-wrapper::before,.MiddleHeader.tools-stacked .header-tools .AudioPlayer::before{content:\"\";display:block;position:absolute;top:-.1875rem;left:0;right:0;height:.125rem;box-shadow:0 0.125rem 0.125rem var(--color-light-shadow)}.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage-wrapper .HeaderPinnedMessage,.MiddleHeader.tools-stacked .header-tools .AudioPlayer .HeaderPinnedMessage{max-width:unset;margin-top:-0.1875rem}.MiddleHeader.tools-stacked .header-tools .AudioPlayer{height:3.25rem;flex-direction:row;padding:0.375rem 0.5rem}.MiddleHeader.tools-stacked .header-tools .AudioPlayer-content{padding:0 0.5rem;flex-grow:1}.MiddleHeader.tools-stacked .header-tools .AudioPlayer>.Button{margin:0}.MiddleHeader.tools-stacked .header-tools .AudioPlayer>.player-close{margin-left:auto}.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage{flex-grow:1;padding-top:0;padding-bottom:0}.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage::before{top:0.125rem;bottom:0.125rem}.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage .message-text{max-width:none}@media (min-width: 1150px){#Main.right-column-open .MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage-wrapper,#Main.right-column-open .MiddleHeader.tools-stacked .header-tools .AudioPlayer{padding-right:calc(0.5rem + var(--right-column-width))}}.MiddleHeader.tools-stacked.animated .header-tools .HeaderPinnedMessage-wrapper,.MiddleHeader.tools-stacked.animated .header-tools .AudioPlayer{animation:fade-in var(--layer-transition) forwards}body.animation-level-0 .MiddleHeader.tools-stacked.animated .header-tools .HeaderPinnedMessage-wrapper,body.animation-level-0 .MiddleHeader.tools-stacked.animated .header-tools .AudioPlayer{animation:none}.MiddleHeader h3{font-weight:500;font-size:1.125rem;line-height:1.375rem;white-space:pre;margin:0;overflow:hidden;text-overflow:ellipsis;unicode-bidi:plaintext}body.is-ios .MiddleHeader h3,body.is-macos .MiddleHeader h3{font-size:1.0625rem;font-weight:600}@media (max-width: 600px){.MiddleHeader h3{display:block;overflow:hidden;text-overflow:ellipsis}}@media (min-width: 1275px){#Main.right-column-open .MiddleHeader h3{max-width:calc(100% - var(--right-column-width))}}.MiddleHeader .ChatInfo{cursor:pointer;display:flex;align-items:center}.MiddleHeader .ChatInfo .info{display:flex;flex-direction:column;justify-content:center;flex-grow:1;overflow:hidden}.MiddleHeader .ChatInfo .title{display:flex;align-items:center}.MiddleHeader .ChatInfo .title .VerifiedIcon{width:1.25rem;height:1.25rem;margin-left:0.25rem;margin-top:0.05rem}.MiddleHeader .ChatInfo .user-status,.MiddleHeader .ChatInfo .status{unicode-bidi:plaintext}.MiddleHeader .Avatar{margin-right:.625rem;width:2.5rem;height:2.5rem;font-size:1.0625rem}.MiddleHeader .status,.MiddleHeader .typing-status{font-size:0.875rem;line-height:1.125rem;margin:0;color:var(--color-text-secondary);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;display:inline-block}.MiddleHeader .status .ellipsis,.MiddleHeader .typing-status .ellipsis{display:inline-flex}.MiddleHeader .status.online,.MiddleHeader .typing-status.online{color:var(--color-primary)}.MiddleHeader .status .font-emoji,.MiddleHeader .typing-status .font-emoji{line-height:1rem}.MiddleHeader .Button.smaller{width:2.5rem;height:2.5rem}.MiddleHeader .HeaderPinnedMessage-wrapper{display:flex;align-items:center;margin-left:auto;cursor:default;flex-direction:row-reverse}body.animation-level-1 .MiddleHeader .HeaderPinnedMessage-wrapper .ripple-container{display:none}.MiddleHeader .HeaderPinnedMessage-wrapper .HeaderPinnedMessage{min-width:16rem}.MiddleHeader .HeaderPinnedMessage-wrapper>.Button{flex-shrink:0}.MiddleHeader .HeaderPinnedMessage{display:flex;flex-shrink:1;margin-top:-0.25rem;margin-bottom:-0.25rem;padding:0.25rem;padding-left:0.375rem;border-radius:var(--border-radius-messages-small);position:relative;overflow:hidden;cursor:pointer}.MiddleHeader .HeaderPinnedMessage:hover{background-color:var(--color-interactive-element-hover)}.MiddleHeader .HeaderPinnedMessage .pinned-message-border{position:relative;height:2.25rem;margin:0.125rem 0;width:0.125rem;min-width:0.125rem;overflow:hidden}.MiddleHeader .HeaderPinnedMessage .pinned-message-border .pinned-message-border-wrapper-1{height:2.25rem;width:0.125rem;border-radius:0.0625rem;background:var(--color-primary)}.MiddleHeader .HeaderPinnedMessage .pinned-message-border .pinned-message-border-wrapper{background-color:var(--color-primary-opacity);position:relative;will-change:transform;transition:transform .25s ease-in-out}.MiddleHeader .HeaderPinnedMessage .pinned-message-border .pinned-message-border-mark{position:absolute;left:0;top:0;width:0.125rem;background:var(--color-primary);border-radius:0.0625rem;will-change:transform;transition:transform .25s ease-in-out}.MiddleHeader .HeaderPinnedMessage .message-text{overflow:hidden;margin-inline-start:0.375rem;margin-top:0.125rem;max-width:15rem}@media (min-width: 1440px) and (max-width: 1500px){.MiddleHeader .HeaderPinnedMessage .message-text{max-width:14rem}}.MiddleHeader .HeaderPinnedMessage .message-text .title{font-weight:500;font-size:0.875rem;line-height:1rem;height:1rem;color:var(--color-primary);margin-bottom:0.125rem;white-space:pre;text-align:initial}body.is-ios .MiddleHeader .HeaderPinnedMessage .message-text .title{font-size:.9375rem}.MiddleHeader .HeaderPinnedMessage .message-text p{font-size:0.875rem;line-height:1.125rem;height:1.125rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0}body.is-ios .MiddleHeader .HeaderPinnedMessage .message-text p{font-size:.9375rem}.MiddleHeader .HeaderPinnedMessage .emoji-small{width:1rem;height:1rem}.MiddleHeader .HeaderPinnedMessage>img{width:2.25rem;height:2.25rem;object-fit:cover;border-radius:0.25rem;margin-inline-start:0.375rem;margin-top:0.125rem;flex-shrink:0}.MiddleHeader .HeaderPinnedMessage>img+.message-text{max-width:12rem}.MiddleHeader .HeaderActions{flex-shrink:0;margin-left:auto;display:flex;align-items:center;justify-content:flex-end}.MiddleHeader .HeaderActions .toggle-right-pane-button.active{color:var(--color-primary);opacity:1}.MiddleHeader .HeaderPinnedMessage-wrapper .Button,.MiddleHeader .HeaderActions .Button{margin-left:0.25rem}.MiddleHeader .HeaderPinnedMessage-wrapper .Button.tiny,.MiddleHeader .HeaderActions .Button.tiny{margin-right:.625rem}@media (max-width: 600px){.MiddleHeader .HeaderPinnedMessage-wrapper,.MiddleHeader .AudioPlayer{position:absolute;top:100%;left:0;right:0;height:2.875rem;overflow:hidden;box-shadow:0 2px 2px var(--color-light-shadow);display:flex;flex-direction:row-reverse;padding:0.375rem 0.5rem;padding-left:0.75rem;background:var(--color-background)}.MiddleHeader .HeaderPinnedMessage-wrapper::before,.MiddleHeader .AudioPlayer::before{content:\"\";display:block;position:absolute;top:-.1875rem;left:0;right:0;height:.125rem;box-shadow:0 0.125rem 0.125rem var(--color-light-shadow)}.MiddleHeader .HeaderPinnedMessage-wrapper .HeaderPinnedMessage,.MiddleHeader .AudioPlayer .HeaderPinnedMessage{max-width:unset;margin-top:-0.1875rem}.MiddleHeader .AudioPlayer{height:3.25rem;flex-direction:row;padding:0.375rem 0.5rem}.MiddleHeader .AudioPlayer-content{padding:0 0.5rem;flex-grow:1}.MiddleHeader .AudioPlayer>.Button{margin:0}.MiddleHeader .AudioPlayer>.player-close{margin-left:auto}.MiddleHeader .HeaderPinnedMessage{flex-grow:1;padding-top:0;padding-bottom:0}.MiddleHeader .HeaderPinnedMessage::before{top:0.125rem;bottom:0.125rem}.MiddleHeader .HeaderPinnedMessage .message-text{max-width:none}.MiddleHeader .HeaderPinnedMessage-wrapper,.MiddleHeader .AudioPlayer{transform:translate3d(0, 0, 0)}}@media (min-width: 925px) and (max-width: 1149.9px){.MiddleHeader .HeaderPinnedMessage-wrapper,.MiddleHeader .AudioPlayer{position:absolute}}@keyframes fade-in{from{opacity:0}to{opacity:1}}\n",".EmbeddedMessage{display:flex;align-items:center;font-size:calc(var(--message-text-size, 1rem) - .125rem);line-height:1.125rem;margin:0 -0.25rem .0625rem;padding:.1875rem 0.25rem .1875rem .4375rem;border-radius:var(--border-radius-messages-small);position:relative;overflow:hidden;cursor:pointer;direction:ltr}body.animation-level-1 .EmbeddedMessage .ripple-container{display:none}.custom-shape .EmbeddedMessage{max-width:15rem;padding:0.5rem;margin:0;background-color:var(--background-color);box-shadow:0 1px 2px var(--color-default-shadow)}.custom-shape .EmbeddedMessage::before{left:.625rem;top:.625rem;bottom:.625rem}.custom-shape .EmbeddedMessage img:not(.emoji){margin-inline-start:.5rem}.custom-shape .EmbeddedMessage:dir(rtl){padding:0.5rem}.EmbeddedMessage::before{content:'';display:block;position:absolute;top:.3125rem;bottom:.3125rem;left:.3125rem;width:2px;background:var(--accent-color);border-radius:2px}.EmbeddedMessage:hover{background-color:var(--hover-color)}.EmbeddedMessage:active{background-color:var(--active-color)}.EmbeddedMessage .message-title{font-size:calc(var(--message-text-size, 1rem) - .125rem)}.EmbeddedMessage .message-text{overflow:hidden;margin-inline-start:0.5rem;display:flex;flex-direction:column-reverse}.EmbeddedMessage .message-text .message-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:0.125rem;flex:1;display:block}.EmbeddedMessage .message-text p{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:1.125rem;margin-bottom:0;flex:1}.EmbeddedMessage .message-text p::after{content:none;display:none}.EmbeddedMessage .message-text .emoji{width:calc(1.125 * var(--message-text-size, 1rem)) !important;height:calc(1.125 * var(--message-text-size, 1rem)) !important;vertical-align:text-bottom !important}.EmbeddedMessage .embedded-action-message{color:var(--accent-color);opacity:0.75}.EmbeddedMessage img:not(.emoji){width:2rem;height:2rem;object-fit:cover;border-radius:.25rem;margin-left:.25rem;flex-shrink:0}.EmbeddedMessage img:not(.emoji).round{border-radius:1rem}.EmbeddedMessage.inside-input{padding-inline-start:0.5625rem;margin:0 0 -.125rem -0.1875rem;display:grid;grid-template-columns:auto 1fr;grid-template-rows:1fr;width:100%;--accent-color: var(--color-primary);--hover-color: var(--color-interactive-element-hover)}.EmbeddedMessage.inside-input::before{bottom:.3125rem}.EmbeddedMessage.inside-input img:not(.emoji){margin-left:.125rem}.EmbeddedMessage.inside-input .message-text{margin-inline-start:.375rem}.EmbeddedMessage.inside-input .message-title{font-weight:500;color:var(--accent-color)}\n",".MessageMeta{position:absolute;height:1.25rem;bottom:0;right:0;display:flex;align-items:center;background:rgba(153,153,153,0.6);border-radius:.625rem;padding:0 .25rem;color:white;cursor:pointer;max-width:100%}.MessageMeta .message-time,.MessageMeta .message-signature,.MessageMeta .message-views{font-size:.75rem;white-space:nowrap}.MessageMeta .message-time{margin-right:.1875rem}.MessageMeta .message-views{margin-left:.1875rem}.MessageMeta .message-signature{overflow:hidden;text-overflow:ellipsis;margin-right:0.375rem}.MessageMeta .icon-channelviews{margin-left:0.125rem;margin-right:0.375rem;font-size:1.125rem;position:relative;top:-0.0625rem}.has-solid-background .MessageMeta{color:rgba(var(--color-text-meta-rgb), 0.75);background:none}.media:not(.text) .MessageMeta,.Message .custom-shape .MessageMeta{background:rgba(0,0,0,0.2);--color-accent-own: white;--color-accent: white;color:white !important;opacity:1;bottom:.25rem;right:.25rem;left:auto;height:1.125rem;padding:0 .3125rem 0 .375rem}.media:not(.text) .MessageMeta .MessageOutgoingStatus i,.Message .custom-shape .MessageMeta .MessageOutgoingStatus i{background:transparent}.media:not(.text):dir(rtl) .MessageMeta,.Message .custom-shape:dir(rtl) .MessageMeta{right:auto !important;left:.25rem;padding:0 .375rem 0 .3125rem}.is-forwarded.media:not(.text):dir(rtl) .MessageMeta,.Message .is-forwarded.custom-shape:dir(rtl) .MessageMeta{left:.8125rem}.is-forwarded.media:not(.text) .MessageMeta{bottom:0.935rem;right:0.8125rem}.emoji-only .MessageMeta{right:0}.Message.own .has-solid-background .MessageMeta{color:var(--color-message-meta-own)}.MessageMeta .MessageOutgoingStatus{margin-left:-.1875rem;font-size:1.1875rem;border-radius:.625rem}.Message.own .MessageMeta .MessageOutgoingStatus{color:var(--color-accent-own)}.message-content.has-replies:not(.custom-shape) .MessageMeta{bottom:3.375rem}.message-content.has-replies.text:not(.custom-shape) .MessageMeta{bottom:3.4375rem}.Message:not(.own) .custom-shape .reply-message+.MessageMeta{right:auto;left:13.2rem;bottom:0.25rem}.Message:not(.own) .emoji-only-1 .reply-message+.MessageMeta{left:2.5rem}.Message:not(.own) .emoji-only-2 .reply-message+.MessageMeta{left:5.5rem}.Message:not(.own) .emoji-only-3 .reply-message+.MessageMeta{left:6.5rem}\n",".Sticker:not(.inactive){cursor:pointer}.Sticker.inactive{pointer-events:none}\n",".Contact{display:flex;align-items:center;padding:0.25rem}.Contact.interactive{cursor:pointer}.Contact .Avatar{margin-right:0.8rem}.Contact .contact-info{padding:0.5rem;padding-left:0;white-space:nowrap;overflow:hidden}.Contact .contact-info .contact-name{font-size:1rem;line-height:1rem;margin-bottom:0.25rem;font-weight:500}.Contact .contact-info .contact-phone{line-height:1rem;color:var(--secondary-color)}\n",".PollOption{display:flex;flex-flow:row nowrap;margin-bottom:0.75rem}.PollOption:last-child{margin-bottom:0}.PollOption .poll-option-text{word-break:break-word}.PollOption .poll-option-share{position:relative;margin-top:.125rem;width:1.75rem;margin-inline-end:.5rem;flex-shrink:0;font-weight:500;font-size:.875rem;text-align:right}.PollOption .poll-option-share.limit-width{display:inline-flex;justify-content:center;font-size:.75rem}.PollOption .poll-option-chosen{position:absolute;right:0;bottom:-5px;width:1rem;height:1rem;background:var(--accent-color);color:var(--background-color);border-radius:.5rem;font-size:.75rem;text-align:center}.PollOption .poll-option-chosen.wrong{background:var(--color-error)}.is-forwarded .PollOption .poll-option-chosen>i{margin-left:1px}.PollOption .poll-option-chosen.animate{opacity:0;animation-name:PollOptionIconAnimate;animation-delay:.09s;animation-duration:.3s;animation-fill-mode:forwards}.PollOption .poll-option-right{flex-grow:1}.PollOption .poll-option-answer{position:relative}.PollOption .poll-option-line{position:relative;width:0;height:0.25rem;min-width:0.5rem;border-radius:0.125rem;margin-top:0.5rem;background:var(--accent-color);transform-origin:0 0;transition:transform .3s;transition-delay:.09s}.PollOption .poll-line{width:30px;height:35px;position:absolute;left:-27px;bottom:-5px;transition:stroke-dashoffset .3s, stroke-dasharray .3s;stroke-dashoffset:0;stroke-dasharray:0, 200%}.PollOption .poll-line path{stroke-width:4px;stroke-linecap:round;stroke:var(--accent-color);fill:none}.PollOption .wrong .poll-option-line{background:var(--color-error)}.PollOption .wrong .poll-line path{stroke:var(--color-error)}@keyframes PollOptionIconAnimate{0%{opacity:0}100%{opacity:1}}\n",".Poll{min-width:15rem;text-align:initial}@media (max-width: 600px){.Poll{min-width:50vw}}.Poll .poll-question{font-weight:500;line-height:1.25rem;margin:0.125rem 0;word-break:break-word}.Poll .poll-type,.Poll .poll-voters-count{color:var(--secondary-color);font-size:0.875rem}.Poll .poll-type{margin-bottom:0.5rem;display:flex;align-items:center;min-height:1.375rem}.Poll .poll-voters-count{margin:.4375rem 0 .3125rem;text-align:center}.Poll .poll-answers{padding-top:0.25rem;padding-bottom:1rem}.Poll .Checkbox,.Poll .Radio{padding-left:2.25rem}.Poll .Checkbox:last-child,.Poll .Radio:last-child{margin-bottom:.75rem}.Poll .Checkbox.disabled,.Poll .Radio.disabled{opacity:1 !important;cursor:not-allowed}.Poll .Checkbox .Checkbox-main::before,.Poll .Checkbox .Radio-main::before,.Poll .Radio .Checkbox-main::before,.Poll .Radio .Radio-main::before{left:0.125rem;background-color:var(--background-color)}.theme-dark .Poll .Checkbox .Checkbox-main::before,.theme-dark .Poll .Checkbox .Radio-main::before,.theme-dark .Poll .Radio .Checkbox-main::before,.theme-dark .Poll .Radio .Radio-main::before{--color-borders: var(--color-borders-input)}.Message.own .Poll .Checkbox .Checkbox-main::before,.Message.own .Poll .Checkbox .Radio-main::before,.Message.own .Poll .Radio .Checkbox-main::before,.Message.own .Poll .Radio .Radio-main::before{--color-borders: var(--accent-color)}.Poll .Checkbox .Checkbox-main::after,.Poll .Checkbox .Radio-main::after,.Poll .Radio .Checkbox-main::after,.Poll .Radio .Radio-main::after{left:0.4375rem;background-color:var(--accent-color)}.Poll .Checkbox input:checked ~ .Radio-main::before,.Poll .Checkbox input:checked ~ .Checkbox-main::before,.Poll .Radio input:checked ~ .Radio-main::before,.Poll .Radio input:checked ~ .Checkbox-main::before{border-color:var(--accent-color)}.Poll .Checkbox .Spinner,.Poll .Radio .Spinner{left:0.125rem}.Poll .Checkbox .Checkbox-main::after{left:0.125rem;background-color:var(--color-primary)}.Message.own .Poll .Checkbox .Checkbox-main::after{background-color:var(--accent-color)}.Poll .Spinner>div{background-image:var(--spinner-gray-data)}.theme-dark .Poll .Spinner>div{background-image:var(--spinner-white-data)}.Message.own .Poll .Spinner>div{background-image:var(--spinner-green-data)}.theme-dark .Message.own .Poll .Spinner>div{background-image:var(--spinner-white-data)}.Poll .poll-recent-voters{display:inline-flex;align-items:center;vertical-align:text-bottom;margin-left:.875rem;margin-right:.5rem;margin-top:-2px}.Poll .poll-recent-voters .Avatar{border:1px solid var(--color-white);margin-right:0;box-sizing:content-box}.Poll .poll-recent-voters .Avatar:not(:first-child){margin-left:-3px}.Poll .poll-countdown{margin-left:auto;font-size:.75rem;transition:color .2s}.Poll .poll-countdown.hurry-up{color:var(--color-error)}.Poll .poll-countdown.hurry-up .poll-countdown-progress{stroke:var(--color-error)}.Poll .poll-countdown svg{vertical-align:-3px}.Poll .poll-countdown-progress{stroke:var(--color-primary);fill:transparent;stroke-width:2;stroke-linecap:round;transition:stroke-dashoffset 2s, stroke .2s}.Poll .poll-quiz-help{margin:-.625rem 0 -.625rem auto}.Message:not(.own) .Poll .poll-quiz-help{color:var(--color-primary)}.Poll .poll-results,.Poll .poll-answers{padding-top:0.25rem;padding-bottom:0.5rem}.Poll .Button{text-transform:none;font-size:1rem}.Message.own .Poll .Button{color:var(--accent-color);--color-primary-shade-rgb: var(--color-accent-own)}.Poll>.Button{margin-top:-.125rem;margin-bottom:-.0625rem}\n",".WebPage{margin-top:0.25rem;margin-bottom:0.125rem;padding-left:.625rem;font-size:calc(var(--message-text-size, 1rem) - .125rem);line-height:1.125rem;max-width:29rem;position:relative}.WebPage::before{content:'';display:block;position:absolute;top:0;bottom:0;left:0;width:.125rem;background:var(--accent-color);border-radius:.125rem}.WebPage-text{display:flex;flex-direction:column;align-items:flex-start}.WebPage .media-inner{margin:0 !important;margin-bottom:0.375rem !important}.WebPage .media-inner,.WebPage .media-inner img,.WebPage .media-inner.small-image img{border-radius:var(--border-radius-messages-small) !important}.WebPage .media-inner.square-image{width:5rem;height:5rem;min-height:0;margin-bottom:0 !important}.WebPage .media-inner.square-image img{width:100%;height:100%}.WebPage.with-video .media-inner{margin-top:0.5rem !important;margin-bottom:1rem !important}.WebPage.with-square-photo{display:flex;margin-bottom:1rem}.WebPage.with-square-photo .WebPage-text{order:1;padding-right:1rem}.WebPage.with-square-photo .media-inner{order:2;flex-shrink:0}.WebPage.with-square-photo:dir(rtl) .WebPage-text{padding-inline-end:1rem}.WebPage:not(.with-square-photo) .site-name:last-child::after,.WebPage:not(.with-square-photo) .site-title:last-child::after,.WebPage:not(.with-square-photo) .site-description:last-child::after{content:'';display:inline-block;width:var(--meta-safe-area-size);height:0.75rem;float:right}.WebPage .site-name,.WebPage .site-description,.WebPage .site-title{word-break:break-word;max-width:100%}.WebPage .site-name{color:var(--accent-color);font-weight:500;margin-bottom:0.125rem}.WebPage .site-title{font-weight:500;margin-bottom:0.125rem}.WebPage .site-description{line-height:1.25;margin-bottom:0}body.is-ios .WebPage .site-description{line-height:1.125rem}.WebPage:dir(rtl){padding-inline-start:.625rem}.WebPage:dir(rtl)::before{left:auto;right:0}\n",".Invoice .title{color:var(--accent-color);font-weight:500}.Invoice .description{position:relative}.Invoice .description.has-image .invoice-image{max-width:100%;height:20rem}@media (max-width: 600px){.Invoice .description.has-image .invoice-image{height:10rem}}.Invoice .description.has-image .description-text{position:absolute;top:0;padding:.25rem .5rem;margin:.25rem;background-color:rgba(90,110,70,0.6);border-radius:var(--border-radius-messages-small);color:var(--color-text);font-weight:500}\n",".Album{position:relative;overflow:hidden}.message-content.media.text .Album{margin:-0.3125rem -0.5rem 0.3125rem}.forwarded-message .Album{margin-bottom:.125rem}.message-content.media.text .forwarded-message .Album{margin:0 0 0.3125rem;--border-bottom-left-radius: inherit;--border-bottom-right-radius: inherit}.Album>.album-item-select-wrapper .media-inner,.message-content.media.text .Album>.album-item-select-wrapper .media-inner{margin:0 !important}.Album>.album-item-select-wrapper .media-inner,.Album>.album-item-select-wrapper .media-inner img,.Album>.album-item-select-wrapper .media-inner video{border-radius:0 !important;object-fit:cover}\n",".RoundVideo{position:relative;width:200px;height:200px;cursor:pointer}.RoundVideo .thumbnail-wrapper{width:200px;height:200px;border-radius:50%;overflow:hidden}.RoundVideo .video-wrapper{position:absolute;left:0;top:0;border-radius:50%;overflow:hidden}.RoundVideo .progress{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.RoundVideo .progress-circle{stroke:white;fill:transparent;stroke-width:4;stroke-opacity:.35;stroke-linecap:round}.RoundVideo video::-internal-media-controls-cast-button,.RoundVideo video::-webkit-media-controls,.RoundVideo video::-webkit-media-controls-start-playback-button{display:none}\n",".InlineButtons{display:flex;flex-direction:column}.InlineButtons .row{display:flex;flex-direction:row}.InlineButtons .Button{flex:1;width:auto;margin:0.125rem;background:var(--pattern-color);border-radius:var(--border-radius-messages-small);font-weight:500;text-transform:none}.InlineButtons .Button::before{content:'';background-color:var(--color-white);opacity:0;position:absolute;top:0;left:0;right:0;bottom:0;border-radius:var(--border-radius-messages-small);z-index:var(--z-below);transition:opacity 200ms}.InlineButtons .Button:hover{background:var(--pattern-color) !important}.InlineButtons .Button:hover::before{opacity:.4}.InlineButtons .Button:first-of-type{margin-left:0}.InlineButtons .Button:last-of-type{margin-right:0}.InlineButtons .Button i{font-size:0.75rem;position:absolute;right:0.125rem;top:0.125rem;display:block;transform:rotate(-45deg)}.InlineButtons .row:first-of-type .Button{margin-top:0.25rem !important}.InlineButtons .row:last-of-type .Button{margin-bottom:0}.InlineButtons .row:last-of-type .Button:first-of-type{border-bottom-left-radius:var(--border-radius-messages)}.InlineButtons .row:last-of-type .Button:last-of-type{border-bottom-right-radius:var(--border-radius-messages)}\n",".CommentButton{--background-color: var(--color-background);--hover-color: var(--color-chat-hover);display:flex;width:100%;align-items:center;padding:.5625rem .25rem .5625rem .625rem;padding-inline-start:.625rem;padding-inline-end:.25rem;background:var(--background-color);border-bottom-right-radius:var(--border-bottom-right-radius);border-bottom-left-radius:var(--border-bottom-left-radius);font-size:.9375rem;font-weight:500;line-height:2rem;color:var(--accent-color);white-space:nowrap;cursor:pointer;transition:background-color .15s, color .15s}body.animation-level-0 .CommentButton{transition:none !important}.Message .has-appendix .CommentButton::before{content:'';display:block;position:absolute;bottom:-.1875rem;left:-.5625rem;width:.5625rem;height:1.25rem;background-position:bottom left;background-image:url('data:image/svg+xml,%3Csvg width=\"9\" height=\"20\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"%3E%3Cdefs%3E%3Cfilter x=\"-50%25\" y=\"-14.7%25\" width=\"200%25\" height=\"141.2%25\" filterUnits=\"objectBoundingBox\" id=\"a\"%3E%3CfeOffset dy=\"1\" in=\"SourceAlpha\" result=\"shadowOffsetOuter1\"/%3E%3CfeGaussianBlur stdDeviation=\"1\" in=\"shadowOffsetOuter1\" result=\"shadowBlurOuter1\"/%3E%3CfeColorMatrix values=\"0 0 0 0 0.0621962482 0 0 0 0 0.138574144 0 0 0 0 0.185037364 0 0 0 0.15 0\" in=\"shadowBlurOuter1\"/%3E%3C/filter%3E%3Cpath d=\"M3 17h6V0c-.193 2.84-.876 5.767-2.05 8.782-.904 2.325-2.446 4.485-4.625 6.48A1 1 0 003 17z\" id=\"b\"/%3E%3C/defs%3E%3Cg fill=\"none\" fill-rule=\"evenodd\"%3E%3Cuse fill=\"%23000\" filter=\"url(%23a)\" xlink:href=\"%23b\"/%3E%3Cuse fill=\"%23FFF\" xlink:href=\"%23b\"/%3E%3C/g%3E%3C/svg%3E');opacity:0;transition:opacity .15s, filter .15s}.theme-dark #root .Message .has-appendix .CommentButton::before{filter:invert(0.83)}body.animation-level-0 .Message .has-appendix .CommentButton::before{transition:none !important}.custom-shape .CommentButton{position:absolute;right:-3rem;width:2.25rem;bottom:3rem;height:3.375rem;border-radius:1.375rem;padding:0.375rem .3125rem .25rem;align-items:flex-start;color:white;background-color:rgba(0,0,0,0.2);opacity:0;transition:opacity .2s ease}@media (pointer: coarse){.custom-shape .CommentButton{opacity:1 !important}}.custom-shape .CommentButton:hover{background-color:rgba(0,0,0,0.28)}.Message:hover .custom-shape .CommentButton{opacity:1}.custom-shape .CommentButton::after{content:attr(data-cnt);position:absolute;bottom:-.0625rem;left:0;width:100%;text-align:center;font-size:12px;display:block}.custom-shape .CommentButton[data-cnt=\"0\"]{height:2.25rem}.custom-shape .CommentButton[data-cnt=\"0\"]::after{display:none}.custom-shape .CommentButton .icon-comments-sticker{display:block;font-size:1.5rem;margin:0 auto}.custom-shape .CommentButton .recent-repliers,.custom-shape .CommentButton .icon-comments,.custom-shape .CommentButton .label,.custom-shape .CommentButton .icon-next{display:none}.CommentButton:hover{background:var(--hover-color)}.Message .has-appendix .CommentButton:hover::before{opacity:1}.CommentButton:hover .Avatar{border-color:var(--hover-color) !important}.is-forwarded .CommentButton,.audio .CommentButton,.voice .CommentButton,.poll .CommentButton,.text .CommentButton{border-top:1px solid var(--color-borders)}.message-content.has-solid-background .CommentButton{margin:.375rem -.5rem -.375rem}.message-content.voice .CommentButton{margin-bottom:-.5rem}.message-content.audio .CommentButton{margin-bottom:-.8125rem}.message-content.audio .CommentButton,.message-content.voice .CommentButton,.message-content.poll .CommentButton,.message-content.has-solid-background.text .CommentButton,.message-content.has-solid-background.is-forwarded .CommentButton{width:calc(100% + 1rem)}.CommentButton .icon-comments-sticker{display:none}.CommentButton .icon-comments{font-size:1.5625rem;line-height:2rem;margin-inline-end:.875rem}.CommentButton .icon-next{margin-inline-start:auto;font-size:1.5rem}.CommentButton .recent-repliers{display:inline-flex;align-items:center;margin-inline-end:.5rem;margin-inline-start:-.125rem}.CommentButton .recent-repliers .Avatar{transition:border .15s;border:2px solid var(--color-background);margin-inline-end:0;z-index:3;overflow:hidden}.CommentButton .recent-repliers .Avatar .emoji{width:1rem;background-size:1rem}.CommentButton .recent-repliers .Avatar+.Avatar{z-index:2}.CommentButton .recent-repliers .Avatar+.Avatar+.Avatar{z-index:1}.CommentButton .recent-repliers .Avatar:not(:first-child){margin-inline-start:-.75rem}.CommentButton.has-unread .label{position:relative}.CommentButton.has-unread .label::after{content:'';display:inline-block;width:.5rem;height:.5rem;border-radius:50%;background:var(--accent-color);margin-inline-start:.75rem}.CommentButton.disabled{cursor:default;pointer-events:none}\n",".Message{display:flex;align-items:flex-end;margin-bottom:0.375rem;position:relative;--background-color: var(--color-background);--hover-color: var(--color-reply-hover);--active-color: var(--color-reply-active);--max-width: 29rem;--accent-color: var(--color-primary);--accent-shade-color: var(--color-primary-shade);--secondary-color: var(--color-text-secondary);--meta-safe-area-base: 2.25rem;--meta-safe-author-width: 0px;--meta-safe-area-extra-width: 0px;--meta-safe-area-size: calc(var(--meta-safe-area-base) + var(--meta-safe-author-width) + var(--meta-safe-area-extra-width));--deleting-translate-x: -50%;--select-message-scale: 0.9;--select-background-color: white}.Message>.Avatar,.Message>.message-content-wrapper{opacity:1;transform:scale(1) translateX(0);transition:transform var(--select-transition)}body.animation-level-0 .Message>.Avatar,body.animation-level-0 .Message>.message-content-wrapper{transition:none !important}.Message>.Avatar{position:absolute;bottom:0;left:0}@media (max-width: 600px){.Message>.Avatar{width:2.5rem;height:2.5rem}}.Message.last-in-group{margin-bottom:0.625rem}.Message.last-in-list{margin-bottom:0.375rem}.Message.is-in-selection-mode .Album{border:1px var(--select-background-color) solid;background-color:var(--select-background-color)}body.is-android .Message.is-in-selection-mode .can-select-text{z-index:var(--z-message-select-control)}body.is-android .Message.is-in-selection-mode .media-inner{pointer-events:none}.Message.has-inline-buttons .message-content{border-bottom-right-radius:var(--border-radius-messages-small)}.Message:not(.own){padding-left:2.5rem}.no-avatars .Message:not(.own),.Message:not(.own).is-thread-top{padding-left:0}@media (max-width: 600px){.Message:not(.own){padding-left:2.875rem}.no-avatars .Message:not(.own),.Message:not(.own).is-thread-top{padding-left:0.25rem}}.Message.own{flex-direction:row-reverse;--background-color: var(--color-background-own);--hover-color: var(--color-reply-own-hover);--active-color: var(--color-reply-own-active);--max-width: 30rem;--accent-color: var(--color-accent-own);--accent-shade-color: var(--color-green);--secondary-color: var(--color-accent-own);--color-code: var(--color-code-own);--color-code-bg: var(--color-code-own-bg);--color-links: var(--color-own-links);--color-links-hover: var(--color-own-links);--meta-safe-area-base: 3.5rem;--deleting-translate-x: 50%;--color-text-green: var(--color-accent-own)}body.is-ios .Message.own,body.is-macos .Message.own{--color-background-own: var(--color-background-own-apple);--color-reply-own-hover: var(--color-reply-own-hover-apple);--color-reply-own-active: var(--color-reply-own-active-apple)}@media (max-width: 600px){.Message.own{padding-right:0.25rem}}.Message.is-deleting>.Avatar,.Message.is-deleting>.message-content-wrapper{transition:opacity .2s ease, transform .2s ease-in;opacity:0;transform:scale(0.3) translateX(var(--deleting-translate-x));transform-origin:bottom}.Message.has-views{--meta-safe-area-extra-width: 4rem}.Message.was-edited{--meta-safe-area-extra-width: 2.5rem}.Message.was-edited.has-views{--meta-safe-area-extra-width: 7.5rem}html[lang=ru] .Message.was-edited{--meta-safe-area-extra-width: 3.5rem}html[lang=ru] .Message.was-edited.has-views{--meta-safe-area-extra-width: 8.5rem}.select-mode-active .Message{cursor:pointer}@media (min-width: 600px){.select-mode-active .Message{-webkit-user-select:none;user-select:none}}.select-mode-active .Message:not(.own)>.Avatar,.select-mode-active .Message:not(.own)>.message-content-wrapper{transform:translateX(2.5rem)}.select-mode-active .Message:not(.is-album)::after{content:\"\";position:absolute;top:-0.25rem;bottom:-0.25rem;left:-4rem;right:-4rem;z-index:var(--z-message-select-area)}.select-mode-active .Message.is-album .message-select-control,.select-mode-active .Message.is-in-document-group .message-select-control{pointer-events:unset}.select-mode-active .Message .message-select-control{opacity:1}.Message.is-selected .message-select-control{background:var(--color-green)}.Message.is-selected .message-select-control.group-select{background:transparent}.Message.is-selected .message-select-control.group-select.is-selected{background:var(--color-green)}.Message .File.file-is-selected .message-select-control{background:var(--color-green)}.Message.is-in-document-group .File.file-is-selected .file-icon,.Message.has-menu-open.is-in-document-group .File .file-icon{--background-color: var(--color-background-selected)}.Message.own.is-in-document-group .File.file-is-selected .file-icon,.Message.own.has-menu-open.is-in-document-group .File .file-icon{--background-color: var(--color-background-own-selected)}.Message .Audio .message-select-control{left:1.0625rem;top:1.375rem}html.theme-dark .Message.own .Audio .ProgressSpinner{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjODA3QkQ1IiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+);background-position:center;background-size:1rem}html.theme-dark .Message.own .Audio .ProgressSpinner circle{stroke:var(--background-color)}.Message .File{position:relative}.Message .File .message-select-control{position:absolute;top:2rem;left:2rem;z-index:2}.Message.own .Message .album-item-select-wrapper{background:var(--color-background-own)}.Message .album-item-select-wrapper .message-select-control{position:absolute;top:0.438rem;right:0.438rem;left:unset}.Message .album-item-select-wrapper .media-inner{border:0 var(--select-background-color) solid;transition:border-width var(--select-transition)}.Message .album-item-select-wrapper img,.Message .album-item-select-wrapper video{transition:transform var(--select-transition)}.Message .album-item-select-wrapper.is-selected .message-select-control{background:var(--color-green)}.Message .album-item-select-wrapper.is-selected img,.Message .album-item-select-wrapper.is-selected video{transform:scale(var(--select-message-scale))}.Message.is-selected .message-select-control,.Message.is-forwarding .message-select-control{background:var(--color-green)}.Message.is-selected .Menu .bubble,.Message.is-forwarding .Menu .bubble{transition:none !important}.Message.is-in-document-group:not(.first-in-document-group)::before{top:0 !important}.Message.is-in-document-group:not(.first-in-document-group) .message-content{box-shadow:none;border-top-left-radius:0 !important;border-top-right-radius:0 !important}.Message.is-in-document-group:not(.first-in-document-group) .forwarded-message::before{top:-1.5rem}.Message.is-in-document-group:not(.last-in-document-group){margin-bottom:0}.Message.is-in-document-group:not(.last-in-document-group)::before{bottom:0 !important}.Message.is-in-document-group:not(.last-in-document-group) .message-content{border-bottom-left-radius:0 !important;border-bottom-right-radius:0 !important}.Message.is-in-document-group.is-in-selection-mode .Audio:not(.audio-is-selected) .message-select-control:not(.group-select),.Message.is-in-document-group.is-in-selection-mode .File:not(.file-is-selected) .message-select-control:not(.group-select){background:white}.Message.is-in-document-group.is-in-selection-mode .Audio:not(.audio-is-selected) .message-select-control:not(.group-select)::after,.Message.is-in-document-group.is-in-selection-mode .File:not(.file-is-selected) .message-select-control:not(.group-select)::after{content:'';width:1.25rem;height:1.25rem;border-radius:0.688rem;background:white;border:0.125rem rgba(0,0,0,0.2) solid;position:absolute}.Message.is-in-document-group.is-in-selection-mode.own .message-content .Audio:not(.audio-is-selected) .message-select-control:not(.group-select),.Message.is-in-document-group.is-in-selection-mode.own .message-content .File:not(.file-is-selected) .message-select-control:not(.group-select){background:var(--background-color);border-color:var(--background-color)}.Message.is-in-document-group.is-in-selection-mode.own .message-content .Audio:not(.audio-is-selected) .message-select-control:not(.group-select)::after,.Message.is-in-document-group.is-in-selection-mode.own .message-content .File:not(.file-is-selected) .message-select-control:not(.group-select)::after{background:var(--background-color);border-color:var(--color-message-meta-own)}.Message.is-in-document-group.focused .message-content,.Message.is-in-document-group.has-menu-open .message-content,.Message.is-in-document-group.is-forwarding .message-content,.Message.is-in-document-group.is-selected .message-content{background:var(--color-background-selected)}.Message.is-in-document-group.focused.own .message-content,.Message.is-in-document-group.has-menu-open.own .message-content,.Message.is-in-document-group.is-forwarding.own .message-content,.Message.is-in-document-group.is-selected.own .message-content{--background-color: var(--color-background-own-selected);background:var(--color-background-own-selected)}.Message.is-in-document-group .message-content-wrapper{width:17.1875rem}.Message.is-in-document-group .message-content{transition:background-color var(--select-transition)}.Message.is-in-document-group.own .message-content-wrapper{display:flex;justify-content:flex-end}.Message.is-in-document-group.own .message-content-wrapper .message-content{width:100%}.Message .album-item-select-wrapper{position:absolute}.Message .album-item-select-wrapper .message-select-control{position:absolute;z-index:2}.Message .message-select-control{position:absolute;left:0;bottom:0.25rem;width:1.5rem;height:1.5rem;border:2px solid white;border-radius:50%;z-index:var(--z-message-select-control);display:flex;align-items:center;justify-content:center;color:white;font-size:1rem;opacity:0;pointer-events:none;transition:opacity var(--select-transition)}.Message .message-select-control .icon-select{position:absolute;left:-3px;top:-3px;font-size:1.625rem}.theme-dark .Message .message-select-control{border-color:#ffffff80}.Message .Avatar{margin-right:0.3rem}.Message.is-in-document-group .message-content.document{padding:.25rem .5rem !important}.Message.is-in-document-group.last-in-document-group .message-content.document{padding-bottom:.5rem !important}.Message.is-in-document-group.first-in-document-group .message-content.document{padding-top:.5rem !important}.message-content,.Album,.media-inner,.message-content.media .media-inner img,.message-content.media .media-inner video,.message-content.custom-shape .media-inner img{border-top-left-radius:var(--border-top-left-radius);border-top-right-radius:var(--border-top-right-radius);border-bottom-left-radius:var(--border-bottom-left-radius);border-bottom-right-radius:var(--border-bottom-right-radius)}.media-inner video.full-media{background:transparent !important}.media-inner{overflow:hidden}.media-inner.small-image img{border-radius:0 !important}.Message{--border-top-left-radius: var(--border-radius-messages);--border-top-right-radius: var(--border-radius-messages);--border-bottom-left-radius: var(--border-radius-messages);--border-bottom-right-radius: var(--border-radius-messages)}.Message:not(.own).first-in-group:not(.last-in-group){--border-bottom-left-radius: var(--border-radius-messages-small)}.Message:not(.own):not(.first-in-group):not(.last-in-group){--border-top-left-radius: var(--border-radius-messages-small);--border-bottom-left-radius: var(--border-radius-messages-small)}.Message:not(.own).last-in-group:not(.first-in-group){--border-top-left-radius: var(--border-radius-messages-small)}.Message:not(.own).last-in-group{--border-bottom-left-radius: var(--border-radius-messages-small)}.Message:not(.own).last-in-group .message-content.has-appendix{--border-bottom-left-radius: 0}.Message.own.first-in-group:not(.last-in-group){--border-bottom-right-radius: var(--border-radius-messages-small)}.Message.own:not(.first-in-group):not(.last-in-group){--border-top-right-radius: var(--border-radius-messages-small);--border-bottom-right-radius: var(--border-radius-messages-small)}.Message.own.last-in-group:not(.first-in-group){--border-top-right-radius: var(--border-radius-messages-small)}.Message.own.last-in-group{--border-bottom-right-radius: var(--border-radius-messages-small)}.Message.own.last-in-group .message-content.has-appendix{--border-bottom-right-radius: 0}.Message .message-content.has-replies:not(.custom-shape) .media-inner,.Message .message-content.has-replies:not(.custom-shape) .Album,.Message .message-content.text .media-inner,.Message .message-content.text .Album{--border-bottom-left-radius: 0;--border-bottom-right-radius: 0}.Message .message-content.is-reply .EmbeddedMessage+.Album,.Message .message-content.is-reply .EmbeddedMessage+.Audio,.Message .message-content.is-reply .EmbeddedMessage+.File{margin-top:.375rem}.Message .message-content:not(.custom-shape).is-reply .media-inner,.Message .message-content:not(.custom-shape).is-reply .Album,.Message .message-content:not(.custom-shape).force-sender-name .Album,.Message .message-content:not(.is-forwarded) .message-title ~ .media-inner{--border-top-left-radius: 0;--border-top-right-radius: 0}.Message .message-content.is-forwarded .content-inner .message-title{margin-bottom:0.25rem}.Message .message-action-button{position:absolute;bottom:0;color:white;background-color:rgba(0,0,0,0.2);opacity:0;transition:opacity .2s ease}@media (pointer: coarse){.Message .message-action-button{opacity:1 !important}}.Message .message-action-button:hover,.Message .message-action-button:active,.Message .message-action-button:focus{background-color:rgba(0,0,0,0.28) !important}.Message:hover .message-action-button,.Message[data-is-document-group-hover] .message-action-button{opacity:1}.Message.own .message-action-button{left:-3rem}.Message:not(.own) .message-action-button{right:-3rem}.Message .bottom-marker{height:1px;width:1px;visibility:hidden}.Message .custom-shape .message-action-button{bottom:.25rem}.message-content{position:relative;max-width:var(--max-width)}@media (max-width: 600px){.message-content{max-width:calc(100vw - 5.5rem)}.Message.own .message-content,.MessageList.no-avatars .message-content{max-width:calc(100vw - 3rem)}@supports (max-width: min(29rem, 100vw - 5.5rem)){.message-content{max-width:min(29rem, 100vw - 5.5rem)}.MessageList.no-avatars .message-content{max-width:min(29rem, 100vw - 3rem)}.Message.own .message-content{max-width:min(30rem, 100vw - 3rem)}}.message-content.has-action-button{max-width:calc(100vw - 7rem)}.Message.own .message-content.has-action-button,.MessageList.no-avatars .message-content.has-action-button{max-width:calc(100vw - 4.5rem)}@supports (max-width: min(29rem, 100vw - 5.5rem)){.message-content.has-action-button{max-width:min(29rem, 100vw - 7rem)}.MessageList.no-avatars .message-content.has-action-button{max-width:min(29rem, 100vw - 4.5rem)}.Message.own .message-content.has-action-button{max-width:min(30rem, 100vw - 4.5rem)}}}.message-content .text-content{margin:0;word-break:break-word;line-height:1.3125;text-align:initial;display:flow-root;unicode-bidi:plaintext}.message-content .text-entity-link{unicode-bidi:plaintext}.message-content:not(.custom-shape) .text-content:not(.with-meta)>.MessageMeta,.message-content.document>.MessageMeta{position:relative;top:.375rem;bottom:auto !important;float:right;line-height:1;margin-top:.125rem;margin-left:.4375rem;margin-right:-.5rem}.message-content:not(.custom-shape) .text-content:not(.with-meta):dir(rtl)>.MessageMeta,.message-content.document:dir(rtl)>.MessageMeta{float:left;margin-left:-.25rem;margin-right:.4375rem}.message-content.document:not(.text)::after{content:\"\";display:block;clear:both}.message-content.document:not(.text)>.MessageMeta{top:auto;bottom:-.5rem !important;margin-top:-.25rem}.message-content.document:not(.text)>.MessageMeta:not([dir=rtl]){margin-top:-1.25rem}.theme-dark .Message.own .message-content .text-entity-link{text-decoration:underline}.theme-dark .Message.own .message-content .text-entity-link:hover{text-decoration:none}.message-content:not(.custom-shape){font-size:var(--message-text-size, 1rem)}body.is-ios .message-content:not(.custom-shape){font-size:var(--message-text-size, 1.0625rem)}.message-content:not(.custom-shape)>.content-inner{min-width:0}.message-content .matching-text-highlight{background:#CAE3F7;border-radius:0.25rem;padding:0 0.125rem}.message-content .message-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:calc(var(--message-text-size, 1rem) - .125rem);font-weight:500;line-height:1.25rem;color:var(--accent-color);unicode-bidi:plaintext;display:flex}.message-content .message-title>.interactive{overflow:hidden;text-overflow:ellipsis}.message-content .message-title.interactive,.message-content .message-title>.interactive{cursor:pointer}.message-content .message-title.interactive:hover,.message-content .message-title>.interactive:hover{opacity:0.85}.message-content .message-title>.color-1{color:var(--color-user-1)}.message-content .message-title>.color-2{color:var(--color-user-2)}.message-content .message-title>.color-4{color:var(--color-user-4)}.message-content .message-title>.color-5{color:var(--color-user-5)}.message-content .message-title>.color-6{color:var(--color-user-6)}.message-content .message-title>.color-7{color:var(--color-user-7)}.message-content .message-title>.color-8{color:var(--color-user-8)}.theme-dark .Message.own .message-content .message-title>.color-1{color:var(--accent-color)}.message-content .message-title+.File{margin-top:.25rem}.message-content .message-title .via{padding-right:.25rem;font-weight:400}.message-content .message-title span+.via{padding-left:.25rem}.message-content .message-title .admin-title{flex:1;margin-left:1rem;text-align:right;font-weight:400;font-size:0.75rem;margin-top:-0.1rem;color:rgba(var(--color-text-meta-rgb), 0.75)}.Message.own .message-content .message-title .admin-title{color:var(--accent-color)}.message-content.has-shadow{box-shadow:0 1px 2px var(--color-default-shadow)}.message-content.has-solid-background,.message-content.has-background,.is-album .message-content{background:var(--background-color)}.message-content.has-solid-background{padding:.3125rem .5rem .375rem}.message-content.has-solid-background .forwarded-message .text-content.with-meta.with-outgoing-icon:last-child{--meta-icon-width: .5rem}.message-content.has-solid-background .forwarded-message .text-content.with-meta .MessageMeta{bottom:-.25rem}.message-content.has-solid-background .text-content.with-meta:last-child::after,.message-content.has-solid-background .forwarded-message>.text-content:not(.with-meta):last-child::after{content:'';display:inline-block;width:calc(var(--meta-safe-area-size) + var(--meta-icon-width, 0px));height:1rem;float:right}.message-content:not(.has-appendix) .svg-appendix{display:none}.message-content .svg-appendix{overflow:hidden;position:absolute;bottom:-.0875rem;width:.5625rem;height:1.125rem;font-size:1rem !important}.message-content .svg-appendix .corner{fill:var(--background-color)}.Message.own .message-content .svg-appendix{right:-.551rem}.Message:not(.own) .message-content .svg-appendix{left:-.562rem}.message-content[data-has-custom-appendix] .svg-appendix .corner{fill:var(--appendix-bg)}.Message .message-content.has-appendix-thumb .svg-appendix{--background-color: #ccc;opacity:1;transition:opacity 500ms ease}.message-content.document{padding:.5rem !important}.theme-dark .message-content.document .File{--color-primary: var(--color-selection-highlight)}.message-content.document .File+.text-content{margin-top:.3125rem}.message-content.voice .message-title,.message-content.voice .Embedded,.message-content.audio .message-title,.message-content.audio .Embedded{margin-top:-.1875rem;margin-bottom:.1875rem}.message-content.voice{padding:.5rem !important}.message-content.voice .Voice+.text-content{margin-top:.5rem}.message-content.audio{min-width:17.1875rem;padding:.5rem .5rem .8125rem !important}.message-content.audio .Audio+.text-content{margin-top:.25rem}.message-content.audio:not(.has-replies) .Audio+.text-content{margin-bottom:-0.4375rem}.message-content:not(.custom-shape) .emoji{display:inline-block;width:1.25rem;background-size:1.25rem;color:transparent;margin-inline-end:1px;vertical-align:text-bottom}.message-content:not(.custom-shape) .emoji::selection{background-color:var(--color-selection-highlight-emoji);color:transparent}.message-content:not(.custom-shape) .text-content .emoji{width:calc(1.25 * var(--message-text-size, 1rem));height:calc(1.25 * var(--message-text-size, 1rem));background-size:calc(1.25 * var(--message-text-size, 1rem))}.message-content .no-media-corners{--border-top-left-radius: 0;--border-top-right-radius: 0}.message-content.custom-shape.is-via-bot{font-size:inherit !important}.message-content.custom-shape.is-via-bot .message-title{display:inline-flex;position:relative;top:.125rem;max-width:calc(100% - 3rem);margin-left:calc(100% - 3rem);padding:0 .5rem;background-color:var(--background-color);border-radius:var(--border-radius-messages)}.Message.own .message-content.custom-shape.is-via-bot .message-title{margin-left:-3rem}.message-content.custom-shape.is-via-bot .media-inner{margin-top:0.375rem}.message-content.media .media-inner,.WebPage .media-inner{display:flex;justify-content:center;align-items:center}.message-content.media .media-inner.interactive,.WebPage .media-inner.interactive{cursor:pointer}.message-content.media .media-inner.interactive.dark video,.WebPage .media-inner.interactive.dark video{background-color:#232323}.message-content.media.round.is-reply,.WebPage.round.is-reply{width:auto !important}.message-content.media.force-sender-name .media-inner,.message-content.media.force-sender-name .Album,.message-content.media.text .media-inner,.message-content.media.is-via-bot .media-inner,.message-content.media.is-reply .media-inner,.message-content.media.is-reply .Album,.WebPage.force-sender-name .media-inner,.WebPage.force-sender-name .Album,.WebPage.text .media-inner,.WebPage.is-via-bot .media-inner,.WebPage.is-reply .media-inner,.WebPage.is-reply .Album{margin-left:-0.5rem;margin-right:-0.5rem}.message-content.media.text .media-inner,.WebPage.text .media-inner{margin-top:-0.3125rem}.message-content.media.is-reply .media-inner,.message-content.media.force-sender-name .Album,.message-content.media.is-reply .Album,.message-content.media .message-title ~ .media-inner,.WebPage.is-reply .media-inner,.WebPage.force-sender-name .Album,.WebPage.is-reply .Album,.WebPage .message-title ~ .media-inner{margin-top:0.375rem;margin-bottom:-0.375rem}.message-content.media.text .media-inner,.message-content.media.text .Album,.WebPage.text .media-inner,.WebPage.text .Album{margin-bottom:0.375rem}.message-content.media .media-loading,.WebPage .media-loading{display:flex;align-items:center;justify-content:center}.message-content.media .media-loading:not(.open),.WebPage .media-loading:not(.open){opacity:0.5;transform:scale(0);transition:opacity .3s ease, transform .3s ease}.message-content.media .icon-large-play,.message-content.media .icon-download,.WebPage .icon-large-play,.WebPage .icon-download{position:absolute;display:flex;align-items:center;justify-content:center;color:#fff;opacity:0.7;transition:opacity 150ms}.message-content.media .icon-large-play:hover,.message-content.media .icon-download:hover,.WebPage .icon-large-play:hover,.WebPage .icon-download:hover{opacity:1}.message-content.media .icon-large-play:before,.message-content.media .icon-download:before,.WebPage .icon-large-play:before,.WebPage .icon-download:before{display:flex;align-items:center;justify-content:center;width:3.375rem;height:3.375rem;border-radius:50%;background:rgba(0,0,0,0.25)}.message-content.media .icon-download,.WebPage .icon-download{font-size:1.5rem}.message-content.media .icon-large-play,.WebPage .icon-large-play{font-size:2.5rem}.message-content.media .message-media-duration,.message-content.media .message-upload-progress,.WebPage .message-media-duration,.WebPage .message-upload-progress{background:rgba(0,0,0,0.25);color:#fff;font-size:0.75rem;position:absolute;left:.1875rem;top:.1875rem;z-index:1;padding:0 .375rem;border-radius:.75rem;line-height:1.125rem}.message-content.media .message-media-duration .icon-muted-chat,.WebPage .message-media-duration .icon-muted-chat{vertical-align:-.1875rem;margin-left:.375rem;font-size:1.0625rem}.message-content.custom-shape{line-height:1.2;font-size:10rem;display:flex;flex-wrap:wrap;align-items:flex-end}.message-content.custom-shape.has-comments{min-height:5.25rem;margin-top:0 !important}.message-content.custom-shape.has-comments.has-replies{min-height:6.5rem}.message-content.custom-shape.is-reply{max-width:100%}.message-content.custom-shape .reply-message{display:flex;align-items:flex-start;flex-direction:row-reverse;direction:ltr}.message-content.custom-shape .reply-message>p{margin-bottom:0}.message-content.custom-shape .reply-message .EmbeddedMessage{margin-left:0.5rem;border-radius:var(--border-radius-messages)}@media (max-width: 600px){.message-content.custom-shape .reply-message .EmbeddedMessage{max-width:calc(90vw - 13rem)}}@media (max-width: 340px){.message-content.custom-shape .reply-message .EmbeddedMessage{margin-left:-1rem;z-index:1;max-width:calc(90vw - 12rem)}}.message-content.custom-shape .text-content{margin-bottom:1rem}.message-content.custom-shape .media-inner{line-height:1;font-size:1rem;flex-shrink:0}.message-content.custom-shape .media-inner .full-media{top:0;left:0;bottom:0;right:0}.message-content.custom-shape .emoji{display:inline-block;color:transparent}.message-content.custom-shape .emoji::selection{background-color:var(--color-selection-highlight-emoji);color:transparent}.message-content.custom-shape.emoji-only .text-content{margin-bottom:0}.message-content.custom-shape.emoji-only-1{min-width:8rem;font-size:4.5rem}.message-content.custom-shape.emoji-only-1 .content-inner{height:7rem}.message-content.custom-shape.emoji-only-1 .text-content{line-height:1.5;text-align:center}.Message.was-edited .message-content.custom-shape.emoji-only-1{min-width:10rem}.message-content.custom-shape.emoji-only-1 .emoji{width:5rem;height:5rem}.message-content.custom-shape.emoji-only-2{font-size:4rem;margin-top:.5rem;min-width:10rem}.message-content.custom-shape.emoji-only-2.has-comments{margin-top:1.25rem}.Message.was-edited .message-content.custom-shape.emoji-only-2{min-width:12rem}.message-content.custom-shape.emoji-only-2 .emoji{width:4rem;height:4rem}.message-content.custom-shape.emoji-only-3{font-size:3rem;margin-top:1.75rem;min-width:12rem}.message-content.custom-shape.emoji-only-3.has-comments{margin-top:2.5rem}.Message.was-edited .message-content.custom-shape.emoji-only-3{min-width:14rem}.message-content.custom-shape.emoji-only-3 .emoji{width:3rem;height:3rem}.Message:not(.own) .message-content.custom-shape{--hover-color: var(--color-reply-hover);--active-color: var(--color-reply-active)}.Message.own .message-content.custom-shape{--hover-color: var(--color-reply-own-hover);--active-color: var(--color-reply-own-active)}.Message.own .message-content.custom-shape .reply-message{flex-direction:row}.Message.own .message-content.custom-shape .reply-message .EmbeddedMessage{margin-right:0.5rem}@media (max-width: 340px){.Message.own .message-content.custom-shape .reply-message .EmbeddedMessage{margin-left:0;z-index:1;max-width:calc(90vw - 11.5rem)}}.forwarded-message{--border-top-left-radius: var(--border-radius-messages-small);--border-top-right-radius: var(--border-radius-messages-small);--border-bottom-left-radius: var(--border-radius-messages-small);--border-bottom-right-radius: var(--border-radius-messages-small)}.message-content.poll .forwarded-message{margin-bottom:0.5rem}.message-content:not(.custom-shape) .forwarded-message{position:relative;margin-top:0.25rem;padding-left:0.625rem}.message-content:not(.custom-shape) .forwarded-message::before{content:'';display:block;position:absolute;top:0;bottom:0;left:0.05rem;width:2px;background:var(--accent-color);border-radius:2px}.message-content:not(.custom-shape) .forwarded-message:dir(rtl){padding-inline-start:0.625rem}.message-content:not(.custom-shape) .forwarded-message:dir(rtl)::before{left:auto;right:0.05rem}.forwarded-message>.media-inner{margin:0 !important;margin-bottom:0.25rem !important}.long-word-break-all{word-break:break-all}.text-entity-link{color:var(--color-links) !important;text-decoration:none;word-break:break-word;cursor:pointer;unicode-bidi:initial}.text-entity-link:hover,.text-entity-link:active,.text-entity-link:visited{color:var(--color-links-hover) !important;text-decoration:underline}.text-entity-code,.text-entity-pre{color:var(--color-code);background:var(--color-code-bg);white-space:pre-wrap;margin:0;padding:1px 2px;border-radius:4px;font-size:calc(var(--message-text-size, 1rem) - 0.0625rem)}\n",".ContactGreeting{width:100%;height:100%;display:flex;align-items:center;justify-content:center;text-align:center}.ContactGreeting .wrapper{display:inline-flex;flex-direction:column;align-items:center;background:var(--pattern-color);width:14.5rem;padding:.75rem 1rem;border-radius:1.5rem;color:#fff}.ContactGreeting .title{font-weight:500;margin-bottom:0}.ContactGreeting .description{font-size:.9375rem;margin-bottom:0}.ContactGreeting .sticker{margin:2rem 0 1rem;height:10rem;width:10rem;cursor:pointer}.ContactGreeting .sticker .thumbnail{height:10rem;width:10rem}\n",".NoMessages{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.NoMessages .icon{font-size:5rem;margin:0 auto 1rem}.NoMessages .wrapper{display:inline-flex;flex-direction:column;background:var(--pattern-color);max-width:20rem;padding:.75rem 1rem;border-radius:1.5rem;color:#fff}.NoMessages .wrapper[dir=rtl]{text-align:right}.NoMessages .title{font-weight:500;font-size:1rem;margin-bottom:.25rem;text-align:center;unicode-bidi:plaintext}.NoMessages .description{font-size:.9375rem;margin:0;padding:0;list-style:none;unicode-bidi:plaintext}.NoMessages .list-checkmarks{font-size:.9375rem;margin:.25rem 0 0;padding:0;list-style:none;unicode-bidi:plaintext;line-height:1.8}.NoMessages .list-checkmarks li::before{content:'✓';margin-inline-end:.5rem}\n",".MessageList{flex:1;width:100%;overflow-anchor:none;overflow:scroll;overflow-x:hidden;overflow-y:overlay;margin-bottom:.5rem}.mask-image-enabled .MessageList{-webkit-mask-image:linear-gradient(to top, transparent 0, #000 0.5rem);mask-image:linear-gradient(to top, transparent 0, #000 0.5rem)}@media (pointer: coarse){.MessageList{-webkit-user-select:none;user-select:none;touch-callout:none}.MessageList.select-mode-active{-webkit-user-select:auto;user-select:auto;touch-callout:default}}.MessageList.no-avatars .Message>.Avatar{display:none}.MessageList .messages-container{width:100%;max-width:var(--messages-container-width);min-height:100%;margin:0 auto;display:flex;justify-content:flex-end;flex-direction:column;padding:1rem 1rem 0 1.125rem}.force-messages-scroll .MessageList .messages-container{margin-top:100vh !important}@media (max-width: 600px){.MessageList .messages-container{width:100vw;padding:2.75rem 0.5rem 0;margin:0}}.MessageList.no-composer{margin-bottom:0}.MessageList.no-composer .last-in-list{margin-bottom:1rem}.MessageList.select-mode-active,.MessageList.type-pinned{margin-bottom:0}.MessageList.select-mode-active .last-in-list,.MessageList.type-pinned .last-in-list{margin-bottom:5.625rem}@media (max-width: 600px){.MessageList.select-mode-active .last-in-list,.MessageList.type-pinned .last-in-list{margin-bottom:4.25rem}}.MessageList.select-mode-active .last-in-list.ActionMessage,.MessageList.type-pinned .last-in-list.ActionMessage{padding-bottom:0.125rem}.MessageList .Message,.MessageList .ActionMessage{position:relative;opacity:1;transform:scale(1);transition:opacity .2s ease, transform .2s ease}.MessageList .Message:not(.open),.MessageList .ActionMessage:not(.open){transform:scale(0.8);opacity:0}.MessageList .Message.open.shown,.MessageList .ActionMessage.open.shown{transform:none}.MessageList .Message::before,.MessageList .ActionMessage::before{content:\"\";position:absolute;top:-0.1875rem;bottom:-0.1875rem;left:-50vw;right:-50vw;background:black;z-index:-1;opacity:0;transition:opacity var(--select-transition)}body.animation-level-0 .MessageList .Message::before,body.animation-level-0 .MessageList .ActionMessage::before{transition:none !important}.MessageList .Message:not(.last-in-group)::before,.MessageList .ActionMessage:not(.last-in-group)::before{bottom:-0.1875rem}.MessageList .Message:not(.first-in-group)::before,.MessageList .ActionMessage:not(.first-in-group)::before{top:-0.1875rem}.MessageList .Message.focused::before,.MessageList .ActionMessage.focused::before{transition:none !important}.MessageList .Message.focused::before,.MessageList .Message.is-forwarding::before,.MessageList .Message.is-selected::before,.MessageList .Message.has-menu-open::before,.MessageList .ActionMessage.focused::before,.MessageList .ActionMessage.is-forwarding::before,.MessageList .ActionMessage.is-selected::before,.MessageList .ActionMessage.has-menu-open::before{opacity:0.1}.MessageList>.empty{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.MessageList .sticky-date,.MessageList .local-action-message,.MessageList .ActionMessage,.MessageList .empty{text-align:center}.MessageList .sticky-date>span,.MessageList .local-action-message>span,.MessageList .ActionMessage>span,.MessageList .empty>span{display:inline-block;background:var(--pattern-color);color:white;font-size:calc(var(--message-text-size, 1rem) - .0625rem);font-weight:500;line-height:1.75;padding:0 .5rem;border-radius:2rem;word-break:break-word}body.is-ios .MessageList .sticky-date>span,body.is-macos .MessageList .sticky-date>span,body.is-ios .MessageList .local-action-message>span,body.is-macos .MessageList .local-action-message>span,body.is-ios .MessageList .ActionMessage>span,body.is-macos .MessageList .ActionMessage>span,body.is-ios .MessageList .empty>span,body.is-macos .MessageList .empty>span{font-size:calc(var(--message-text-size, 1rem) - .125rem)}.MessageList .sticky-date>span .emoji-small,.MessageList .local-action-message>span .emoji-small,.MessageList .ActionMessage>span .emoji-small,.MessageList .empty>span .emoji-small{vertical-align:text-bottom;width:calc(1.25 * var(--message-text-size, 1rem));height:calc(1.25 * var(--message-text-size, 1rem));background-size:calc(1.25 * var(--message-text-size, 1rem))}.MessageList .sticky-date.rich>span,.MessageList .local-action-message.rich>span,.MessageList .ActionMessage.rich>span,.MessageList .empty.rich>span{max-width:80%;text-align:left}.MessageList .sticky-date.rich a,.MessageList .sticky-date.rich a:visited,.MessageList .local-action-message.rich a,.MessageList .local-action-message.rich a:visited,.MessageList .ActionMessage.rich a,.MessageList .ActionMessage.rich a:visited,.MessageList .empty.rich a,.MessageList .empty.rich a:visited{color:var(--color-links-darker) !important}.MessageList .sticky-date.rich a:hover,.MessageList .sticky-date.rich a:active,.MessageList .local-action-message.rich a:hover,.MessageList .local-action-message.rich a:active,.MessageList .ActionMessage.rich a:hover,.MessageList .ActionMessage.rich a:active,.MessageList .empty.rich a:hover,.MessageList .empty.rich a:active{color:var(--color-links-darker-hover) !important}.MessageList .sticky-date{margin-top:1rem;margin-bottom:1rem;z-index:var(--z-sticky-date);pointer-events:none;opacity:1;transition:opacity .3s ease}body:not(.is-scrolling-messages) .MessageList .sticky-date.stuck{opacity:0}body:not(.is-scrolling-messages) .MessageList .sticky-date.stuck span{pointer-events:none}body.animation-level-0 .MessageList .sticky-date{transition:none}.MessageList .sticky-date.interactive{cursor:pointer}.MessageList .sticky-date span{pointer-events:auto}.MessageList.scrolled:not(.is-animating) .sticky-date{position:sticky;top:0.625rem}.MessageList.is-animating{overflow:hidden}.MessageList.is-animating .message-select-control{display:none !important}.has-header-tools .MessageList .sticky-date{top:3.75rem}.MessageList .local-action-message,.MessageList .ActionMessage{margin-top:0.5rem;margin-bottom:0.5rem}.MessageList .ActionMessage .action-link{cursor:pointer}.MessageList .ActionMessage .action-link:hover{text-decoration:underline}.MessageList .sticky-date+.ActionMessage{margin-top:-0.5rem}@media (min-width: 1276px){.MessageList{width:100%;transform:translate3d(0, 0, 0);transition:transform var(--layer-transition)}.MessageList .messages-container{width:calc(100% - var(--right-column-width))}body.animation-level-0 .MessageList{transition:none}#Main.right-column-open .MessageList{transform:translate3d(calc(var(--right-column-width) / -2), 0, 0)}body:not(.animating-right-column) #Main.right-column-open .MessageList.select-mode-active,#Main.right-column-open .MessageList:not(.select-mode-active),body.animating-right-column .MessageList:not(.select-mode-active){width:calc(100% - var(--right-column-width))}body:not(.animating-right-column) #Main.right-column-open .MessageList.select-mode-active .messages-container,#Main.right-column-open .MessageList:not(.select-mode-active) .messages-container,body.animating-right-column .MessageList:not(.select-mode-active) .messages-container{width:100%}}@media (max-width: 600px){.MessageList{transition:transform var(--layer-transition)}body.enable-symbol-menu-transforms .MessageList{transform:translate3d(0, 0, 0)}body.is-symbol-menu-open .MessageList{transform:translate3d(0, calc(-1 * (var(--symbol-menu-height) + var(--symbol-menu-footer-height))), 0)}}.MessageList.select-mode-active,.MessageList.has-focus-highlight,body.has-context-menu .MessageList,.animating>div>.MessageList{padding-right:0}.MessageList.select-mode-active::-webkit-scrollbar,.MessageList.has-focus-highlight::-webkit-scrollbar,body.has-context-menu .MessageList::-webkit-scrollbar,.animating>div>.MessageList::-webkit-scrollbar{width:0}@supports (scrollbar-width: none){.MessageList.select-mode-active,.MessageList.has-focus-highlight,body.has-context-menu .MessageList,.animating>div>.MessageList{padding-right:.6875rem;scrollbar-width:none}}.is-safari .MessageList.select-mode-active,.is-safari .MessageList.has-focus-highlight,.is-safari.has-context-menu .messages-layout .MessageList{padding-right:.375rem}\n",".ScrollDownButton{--base-bottom-pos: 6rem;position:absolute;bottom:var(--base-bottom-pos);right:1rem;opacity:0;transform:translateY(4.5rem);transition:transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),opacity 0.2s ease;z-index:10;pointer-events:none}body.animation-level-0 .ScrollDownButton{transform:none !important;transition:opacity .15s}@media (max-width: 600px){.ScrollDownButton{right:0.5rem;bottom:4.5rem}}.ScrollDownButton-inner{display:flex;flex-direction:column;align-items:center}.ScrollDownButton-inner>.Button{box-shadow:0 1px 2px var(--color-default-shadow)}.ScrollDownButton-inner>.Button i{font-size:1.75rem}@media (min-width: 1276px){.ScrollDownButton-inner{transform:translateX(0);transition:transform var(--layer-transition)}body.animation-level-0 .ScrollDownButton-inner{transition:none !important}#Main.right-column-open .ScrollDownButton-inner{transform:translateX(calc(-1 * var(--right-column-width)))}}@media (max-width: 600px){.ScrollDownButton-inner>.Button{width:2.875rem;height:2.875rem}}.ScrollDownButton.revealed{transform:translateY(0);opacity:1;pointer-events:all}.ScrollDownButton.revealed.no-composer{transform:translateY(4rem)}.ScrollDownButton .unread-count{min-width:1.5rem;height:1.5rem;padding:0 .45rem;border-radius:0.75rem;font-size:0.875rem;line-height:1.5rem;font-weight:500;text-align:center;position:absolute;top:-0.3rem;right:-0.3rem;background:var(--color-green);color:white;pointer-events:none}@media (max-width: 600px){.ScrollDownButton .unread-count{top:-0.7rem;right:auto}}@media (max-width: 600px){body.is-symbol-menu-open .ScrollDownButton{bottom:calc(var(--base-bottom-pos) + var(--symbol-menu-height) + var(--symbol-menu-footer-height))}}\n",".ComposerEmbeddedMessage{height:2.625rem;transition:height 150ms ease-out, opacity 150ms ease-out}.select-mode-active+.middle-column-footer .ComposerEmbeddedMessage{display:none}.ComposerEmbeddedMessage:not(.open){height:0 !important}body.animation-level-0 .ComposerEmbeddedMessage{transition:none !important}.ComposerEmbeddedMessage>div{display:flex;align-items:center;padding-right:0.625rem;padding-top:0.45rem}.ComposerEmbeddedMessage>div>.Button{flex-shrink:0;background:none !important;width:2.125rem;height:2.125rem;margin:0 0.625rem;padding:0;align-self:center}\n",".WebPagePreview{height:2.625rem;transition:height 150ms ease-out, opacity 150ms ease-out;--accent-color: var(--color-primary)}body.animation-level-0 .WebPagePreview{transition:none !important}.select-mode-active+.middle-column-footer .WebPagePreview{display:none}.WebPagePreview:not(.open){height:0 !important}.WebPagePreview>div{display:flex;align-items:center;padding-right:0.625rem;padding-top:0.45rem}.ComposerEmbeddedMessage+.WebPagePreview{margin-top:0.75rem}.WebPagePreview>div>.Button{flex-shrink:0;background:none !important;width:2.125rem;height:2.125rem;margin:0 0.625rem;padding:0;align-self:center}.WebPagePreview .WebPage{flex-grow:1;margin:0.1875rem 0 0.1875rem 0.125rem;max-width:calc(100% - 3.375rem)}.WebPagePreview .WebPage::before{top:.1rem;bottom:.05rem}.WebPagePreview .WebPage.with-video .media-inner{display:none}.WebPagePreview .WebPage .site-title,.WebPagePreview .WebPage .site-description{flex:1;max-width:100%;max-height:1rem}.WebPagePreview .WebPage .site-title{margin-top:.125rem;margin-bottom:0.1875rem}.WebPagePreview .WebPage .site-description{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}\n",".Composer{align-items:flex-end}.select-mode-active+.middle-column-footer .Composer{position:absolute;padding-right:2rem;bottom:0}@media (max-width: 600px){.select-mode-active+.middle-column-footer .Composer{padding-right:1rem}}.select-mode-active+.middle-column-footer .Composer::before{right:2.125rem}@media (max-width: 600px){.select-mode-active+.middle-column-footer .Composer::before{right:1rem}}.select-mode-active+.middle-column-footer .Composer .svg-appendix{opacity:0}.Composer .form-control{--border-width: 0}.Composer>.Button{flex-shrink:0;margin-left:.5rem}@media (max-width: 600px){.Composer>.Button{width:2.875rem;height:2.875rem}}.Composer>.Button .icon-send,.Composer>.Button .icon-microphone-alt,.Composer>.Button .icon-check{position:absolute}.Composer>.Button:not(:active):not(:focus):not(:hover) .icon-send,.Composer>.Button:not(:active):not(:focus):not(:hover) .icon-check{color:var(--color-primary)}.Composer>.Button.cancel{position:relative;z-index:1}.Composer>.Button.cancel:hover,.Composer>.Button.cancel.active{background:var(--color-chat-hover)}.Composer>.Button.recording{position:relative;z-index:0;transition:box-shadow .1s}.Composer>.Button.send .icon-send{animation:grow-icon .4s ease-out}.Composer>.Button.send .icon-microphone-alt,.Composer>.Button.send .icon-check{animation:hide-icon .4s forwards ease-out}.Composer>.Button.record .icon-microphone-alt{animation:grow-icon .4s ease-out}.Composer>.Button.record .icon-send,.Composer>.Button.record .icon-check{animation:hide-icon .4s forwards ease-out}.Composer>.Button.edit .icon-send,.Composer>.Button.edit .icon-microphone-alt{animation:hide-icon .4s forwards ease-out}.Composer>.Button.edit .icon-check{animation:grow-icon .4s ease-out}.Composer>.Button.not-ready>i{animation-duration:0ms !important}body.animation-level-0 .Composer>.Button .icon-send,body.animation-level-0 .Composer>.Button .icon-microphone-alt,body.animation-level-0 .Composer>.Button .icon-check,body.animation-level-1 .Composer>.Button .icon-send,body.animation-level-1 .Composer>.Button .icon-microphone-alt,body.animation-level-1 .Composer>.Button .icon-check{animation-duration:0ms !important}.Composer .mobile-symbol-menu-button{width:2.875rem;height:2.875rem;position:relative}.Composer .mobile-symbol-menu-button .icon-smile,.Composer .mobile-symbol-menu-button .icon-keyboard,.Composer .mobile-symbol-menu-button .Spinner{position:absolute}.Composer .mobile-symbol-menu-button .Spinner{--spinner-size: 1.5rem}.Composer .mobile-symbol-menu-button .icon-smile{animation:grow-icon .4s ease-out}.Composer .mobile-symbol-menu-button .icon-keyboard,.Composer .mobile-symbol-menu-button .Spinner{animation:hide-icon .4s forwards ease-out}.Composer .mobile-symbol-menu-button.not-ready>i{animation-duration:0ms !important}.Composer .mobile-symbol-menu-button.is-loading .Spinner{animation:grow-icon .4s ease-out}.Composer .mobile-symbol-menu-button.is-loading .icon-keyboard,.Composer .mobile-symbol-menu-button.is-loading .icon-smile{animation:hide-icon .4s forwards ease-out}.Composer .mobile-symbol-menu-button.menu-opened .icon-keyboard{animation:grow-icon .4s ease-out}.Composer .mobile-symbol-menu-button.menu-opened .icon-smile,.Composer .mobile-symbol-menu-button.menu-opened .Spinner{animation:hide-icon .4s forwards ease-out}#message-compose{flex-grow:1;max-width:calc(100% - 4rem);background:var(--color-background);border-radius:var(--border-radius-messages);border-bottom-right-radius:0;box-shadow:0 1px 2px var(--color-default-shadow);position:relative;z-index:1}#message-compose .svg-appendix{position:absolute;bottom:-.1875rem;right:-.551rem;width:.5625rem;height:1.25rem;transition:opacity 200ms;font-size:1rem !important}#message-compose .svg-appendix .corner{fill:var(--color-background)}@media (max-width: 600px){#message-compose{max-width:calc(100% - 3rem)}}.message-input-wrapper{display:flex}.message-input-wrapper>.Spinner{align-self:center;--spinner-size: 1.5rem}.message-input-wrapper>.Button{flex-shrink:0;background:none !important;width:3.375rem;height:3.375rem;margin:0;padding:0.625rem;align-self:flex-end}@media (max-width: 600px){.message-input-wrapper>.Button{width:2.875rem;height:2.875rem;margin:0 0.25rem}}.message-input-wrapper>.Button+.Button{margin-left:-.25rem}.message-input-wrapper>.Button.scheduled-button i::after{content:'';position:absolute;top:.75rem;right:.75rem;border:0.1875rem solid var(--color-background);box-sizing:content-box;width:.5rem;height:.5rem;border-radius:50%;background:var(--color-green-darker);box-shadow:-0.375rem -0.25rem 0 -0.1875rem var(--color-background)}@media (max-width: 600px){.message-input-wrapper>.Button.scheduled-button i::after{top:.5rem;right:.5rem}}.message-input-wrapper>.input-group{flex-grow:1;margin-bottom:0}.message-input-wrapper .recording-state{display:inline-block;position:relative;line-height:3.5rem;height:3.5rem;padding:0 3.125rem 0 1rem}.message-input-wrapper .recording-state::after{content:'';width:10px;height:10px;background:var(--color-error);border-radius:5px;position:absolute;top:50%;margin-top:-5px;right:1.375rem}@media (max-width: 600px){.message-input-wrapper .recording-state{height:2.875rem;line-height:2.875rem}}#message-input-text,#caption-input-text{position:relative}#message-input-text .form-control,#caption-input-text .form-control{padding:calc((3.25rem - var(--composer-text-size, 1rem) * 1.375) / 2 - var(--border-width, 0) * 2) calc(.9rem - var(--border-width));overflow:hidden;line-height:1.375;font-family:Roboto, -apple-system, \"Apple Color Emoji\", \"Helvetica Neue\", sans-serif;unicode-bidi:plaintext;text-align:initial;font-size:var(--composer-text-size, 1rem)}body.is-ios #message-input-text .form-control,body.is-macos #message-input-text .form-control,body.is-ios #caption-input-text .form-control,body.is-macos #caption-input-text .form-control{font-family:system-ui, -apple-system, BlinkMacSystemFont, \"Roboto\", \"Apple Color Emoji\", \"Helvetica Neue\", sans-serif}#message-input-text .form-control.overflown,#caption-input-text .form-control.overflown{overflow-y:auto;overflow-x:hidden}#message-input-text .form-control.touched+.placeholder-text,#message-input-text .form-control:focus+.placeholder-text,#caption-input-text .form-control.touched+.placeholder-text,#caption-input-text .form-control:focus+.placeholder-text{display:none}#message-input-text .form-control.focus-disabled,#caption-input-text .form-control.focus-disabled{pointer-events:none}#message-input-text .forced-placeholder,#message-input-text .placeholder-text,#caption-input-text .forced-placeholder,#caption-input-text .placeholder-text{position:absolute;color:var(--color-placeholders);pointer-events:none;unicode-bidi:plaintext;text-align:initial;line-height:1.3125;font-size:var(--composer-text-size, 1rem);top:calc((3.25rem - var(--composer-text-size, 1rem) * 1.375) / 2);bottom:auto}#message-input-text .forced-placeholder,#caption-input-text .forced-placeholder{z-index:var(--z-below);left:0;white-space:nowrap;overflow:hidden;max-width:100%;text-overflow:ellipsis}#message-input-text[dir=rtl] .placeholder-text,#caption-input-text[dir=rtl] .placeholder-text{right:0}#message-input-text .text-entity-link,#caption-input-text .text-entity-link{color:var(--color-links) !important;cursor:default;text-decoration:none}#message-input-text .text-entity-link:hover,#message-input-text .text-entity-link:active,#message-input-text .text-entity-link:visited,#caption-input-text .text-entity-link:hover,#caption-input-text .text-entity-link:active,#caption-input-text .text-entity-link:visited{color:var(--color-links-hover) !important}#message-input-text .clone,#caption-input-text .clone{position:absolute;top:0;left:0;opacity:0;pointer-events:none;z-index:-10;unicode-bidi:plaintext;text-align:initial}#message-input-text{flex-grow:1}#message-input-text .form-control{margin-bottom:0;background:transparent !important;border:none !important;border-radius:0 !important;box-shadow:none !important;caret-color:var(--color-text);min-height:3.5rem;max-height:26rem;line-height:1.3125;padding:calc((3.5rem - var(--composer-text-size, 1rem) * 1.3125) / 2) 0;transition:height 100ms ease}@media (max-width: 600px){#message-input-text .form-control{height:2.875rem;min-height:2.875rem;max-height:16rem;padding:calc((2.875rem - var(--composer-text-size, 1rem) * 1.3125) / 2) 0;overflow:auto}}body.animation-level-0 #message-input-text .form-control{transition:none !important}#message-input-text .forced-placeholder,#message-input-text .placeholder-text{top:calc((3.5rem - var(--composer-text-size, 1rem) * 1.3125) / 2)}@media (max-width: 600px){#message-input-text .forced-placeholder,#message-input-text .placeholder-text{top:calc((2.875rem - var(--composer-text-size, 1rem) * 1.3125) / 2)}}#message-input-text:not(:only-child) .form-control{padding-left:0;padding-right:0}.ComposerEmbeddedMessage+.message-input-wrapper #message-input-text .form-control.overflown,.WebPagePreview+.message-input-wrapper #message-input-text .form-control.overflown{margin-top:0.75rem}#message-input-text .emoji{width:1.25rem;height:1.25rem;margin:0 1px -5px;vertical-align:0;pointer-events:none}#caption-input-text .form-control{height:3.25rem;min-height:3.25rem;max-height:15rem}#caption-input-text .placeholder-text{bottom:.8125rem;left:.90625rem}.composer-tooltip{position:absolute;bottom:calc(100% + .5rem);left:0;width:100%;background:var(--color-background);border-radius:var(--border-radius-messages);padding:0.5rem 0;max-height:15rem;overflow-x:hidden;overflow-y:auto;overflow-y:overlay;box-shadow:0 1px 2px var(--color-default-shadow);opacity:0;transform:translateY(1.5rem);transform-origin:bottom;transition:opacity var(--layer-transition),transform var(--layer-transition)}.composer-tooltip:not(.shown){display:none}.composer-tooltip.open{opacity:1;transform:translateY(0)}.composer-tooltip .Loading{margin:1rem 0}\n","#middle-column-bg{position:absolute;top:0;left:0;bottom:0;right:0;overflow:hidden;z-index:-1}#middle-column-bg::before,#middle-column-bg::after{content:\"\";display:block;position:absolute;top:0;left:0;bottom:0;right:0;background-color:var(--theme-background-color)}#middle-column-bg::after{background-position:center;background-repeat:no-repeat;background-size:cover}.theme-light #middle-column-bg::after{background-image:url(chat-bg.f607e788298d8a7de37a3b39b76c1efa.jpg)}@media (max-width: 600px){.theme-light #middle-column-bg::after{background-image:url(chat-bg-mobile.3ebe59c803c10092f2233e6e00ab2492.jpg)}}body:not(.animation-level-0) #root #middle-column-bg::after{transition:transform var(--layer-transition),opacity 0.2s !important}body.animation-level-0 #middle-column-bg::after{transition:none}.custom-bg-color:not(.custom-bg-image)>#middle-column-bg::after{opacity:0}.custom-bg-image>#middle-column-bg::after{background-image:var(--custom-background) !important;filter:none;transform:scale(1.1)}.custom-bg-image.blurred>#middle-column-bg::after{filter:blur(12px)}@media screen and (min-width: 1276px){body.animation-level-2 #middle-column-bg::after{margin:-16rem -5rem -20rem 0;overflow:hidden;transform:scale(1);transform-origin:left center;transition:transform var(--layer-transition)}body.animation-level-2 #Main.right-column-open #middle-column-bg::after{transform:scale(0.67) !important}}#MiddleColumn{display:flex;justify-content:center;height:100%;position:relative;z-index:1}@media (max-width: 600px){#MiddleColumn{overflow:hidden}}#MiddleColumn .messages-layout{--slide-transition: 450ms cubic-bezier(0.25, 1, 0.5, 1);display:flex;flex-direction:column;align-items:center;width:100%;height:100%;position:relative;overflow:hidden}#MiddleColumn .messages-layout>.Transition{width:100%;height:100%;overflow:hidden}#MiddleColumn .messages-layout>.Transition>div{display:flex;flex-direction:column;align-items:center}#MiddleColumn .messaging-disabled-inner{width:100%;padding:1rem;border-radius:var(--border-radius-messages);background:var(--color-background);color:var(--color-text-secondary);text-align:center;box-shadow:0 1px 2px var(--color-default-shadow)}#MiddleColumn .Composer #message-compose{transform:scaleX(1) translateX(0);transition:transform var(--select-transition),border-bottom-right-radius var(--select-transition)}#MiddleColumn .Composer #message-compose::before{transform:scaleX(-1) translateX(0);transition:transform var(--select-transition)}body.animation-level-0 #MiddleColumn .Composer #message-compose,body.animation-level-0 #MiddleColumn .Composer #message-compose::before{transition:none !important}#MiddleColumn .Composer .message-input-wrapper,#MiddleColumn .Composer::before{opacity:1;transition:opacity var(--select-transition)}body.animation-level-0 #MiddleColumn .Composer .message-input-wrapper,body.animation-level-0 #MiddleColumn .Composer::before{transition:none !important}#MiddleColumn .Composer>.Button{opacity:1;transform:scale(1);transition:opacity var(--select-transition),transform var(--select-transition)}body.animation-level-0 #MiddleColumn .Composer>.Button{transition:none !important}#MiddleColumn .Composer.hover-disabled,#MiddleColumn .Composer:not(.shown){pointer-events:none}#MiddleColumn .Composer:not(.shown) .ComposerEmbeddedMessage{height:0}#MiddleColumn .Composer:not(.shown) #message-compose{transform:scaleX(var(--composer-hidden-scale, 1)) translateX(var(--composer-translate-x, 0));border-bottom-right-radius:var(--border-radius-messages)}#MiddleColumn .Composer:not(.shown) #message-compose::before{transform:scaleX(-1) translateX(200%)}#MiddleColumn .Composer:not(.shown) #editable-message-text{height:3.5rem !important}@media (max-width: 600px){#MiddleColumn .Composer:not(.shown) #editable-message-text{height:2.5rem !important}}#MiddleColumn .Composer:not(.shown) .message-input-wrapper,#MiddleColumn .Composer:not(.shown)::before{opacity:0}#MiddleColumn .Composer:not(.shown)>.Button{opacity:0 !important;transform:scale(0.5)}#MiddleColumn .messaging-disabled{transform:scaleX(1);transition:transform var(--select-transition)}#MiddleColumn .messaging-disabled .messaging-disabled-inner span{opacity:1;transition:opacity var(--select-transition)}body.animation-level-0 #MiddleColumn .messaging-disabled .messaging-disabled-inner span{transition:none !important}body.animation-level-0 #MiddleColumn .messaging-disabled{transition:none !important}#MiddleColumn .messaging-disabled:not(.shown){transform:scaleX(var(--composer-hidden-scale, 1));pointer-events:none}#MiddleColumn .messaging-disabled:not(.shown) .messaging-disabled-inner span{opacity:0}#MiddleColumn .middle-column-footer{width:100%;max-width:var(--messages-container-width);padding:0 1rem;position:relative;display:flex;align-items:flex-end;z-index:var(--z-middle-footer);transform:translate3d(0, 0, 0);transition:transform var(--layer-transition)}body.animation-level-0 #MiddleColumn .middle-column-footer{transition:none !important}@media (min-width: 1276px){#MiddleColumn .middle-column-footer{width:calc(100% - var(--right-column-width))}#Main.right-column-open #MiddleColumn .middle-column-footer{transform:translate3d(calc(var(--right-column-width) / -2), 0, 0)}}@media (max-width: 600px){#MiddleColumn .middle-column-footer{padding:0 0.5rem}body.is-symbol-menu-open #MiddleColumn .middle-column-footer{transform:translate3d(0, calc(-1 * (var(--symbol-menu-height) + var(--symbol-menu-footer-height))), 0)}}#MiddleColumn .middle-column-footer::before{content:\"\";position:absolute;top:-.5625rem;left:0;right:0;height:1px;background:linear-gradient(90deg, rgba(255,255,255,0) 0%, rgba(255,255,255,0.4) 2%, rgba(255,255,255,0.4) 98%, rgba(255,255,255,0) 100%);opacity:0;transition:opacity 350ms ease}@media (max-width: 600px){#MiddleColumn .middle-column-footer::before{left:-2%;right:-2%}}#MiddleColumn .middle-column-footer.with-notch::before{opacity:1}html.theme-dark #MiddleColumn .middle-column-footer::before{background:linear-gradient(90deg, rgba(127,127,127,0) 0%, rgba(127,127,127,0.4) 2%, rgba(127,127,127,0.4) 98%, rgba(127,127,127,0) 100%)}.Composer,.MessageSelectToolbar,.messaging-disabled{margin-bottom:1.25rem}@media (max-width: 600px){.Composer,.MessageSelectToolbar,.messaging-disabled{margin-bottom:0.5rem}}.Composer,.MessageSelectToolbar,.unpin-all-button,.messaging-disabled{width:100%;display:flex;justify-content:center;position:relative}.mask-image-disabled .MessageSelectToolbar-inner,.mask-image-disabled .unpin-all-button,.mask-image-disabled .messaging-disabled{box-shadow:0 0.25rem 0.5rem 0.125rem var(--color-default-shadow)}.unpin-button-container{width:100%;display:flex;justify-content:center;position:absolute;padding-bottom:1.25rem}.unpin-button-container .unpin-all-button{text-transform:capitalize;color:var(--color-black);height:3.5rem;overflow:visible;transform:scaleX(1);transition:transform var(--select-transition),background-color 0.15s,color 0.15s}.unpin-button-container .unpin-all-button:hover .icon-unpin{color:var(--color-white)}.select-mode-active+.middle-column-footer .unpin-button-container .unpin-all-button{box-shadow:none;transform:scaleX(var(--unpin-hidden-scale))}@media (max-width: 600px){.unpin-button-container .unpin-all-button{height:2.5rem}}.unpin-button-container .unpin-all-button .icon-unpin{margin-inline-start:-0.4375rem;margin-inline-end:.75rem;color:var(--color-text-secondary);font-size:1.5rem;transition:color .15s}@media (max-width: 600px){.unpin-button-container{padding-bottom:0.75rem}}.mask-image-disabled .unpin-button-container::before{background:unset}\n",".RightHeader{display:flex;align-items:center;height:var(--header-height);padding:0.5rem .8125rem;pointer-events:auto}@media (max-width: 600px){.RightHeader{padding:0.5rem}}.RightHeader .close-button{flex-shrink:0}.RightHeader>.Transition{flex:1;height:100%}.RightHeader>.Transition>div{display:flex;align-items:center}.RightHeader h3{margin-bottom:0;font-size:1.25rem;font-weight:500;margin-left:1.375rem}.RightHeader .tools{display:flex;margin-left:auto}.RightHeader .SearchInput{margin-left:1rem}@media (min-width: 600px){.RightHeader .SearchInput{margin-right:1rem}}.RightHeader .DropdownMenu{margin-left:auto}\n",".ProfilePhoto{width:100%;height:100%;cursor:pointer;position:relative}.ProfilePhoto img{width:100%;object-fit:cover}.ProfilePhoto .prev-avatar-media{position:absolute;left:0;top:0;z-index:-1}.ProfilePhoto .spinner-wrapper{width:100%;height:100%}.ProfilePhoto .spinner-wrapper,.ProfilePhoto.deleted-account,.ProfilePhoto.no-photo,.ProfilePhoto.saved-messages{display:flex;align-items:center;justify-content:center;color:var(--color-white);background:linear-gradient(var(--color-white) -125%, var(--color-user));cursor:default}.ProfilePhoto.no-photo{font-size:14rem}.ProfilePhoto.deleted-account,.ProfilePhoto.saved-messages{font-size:20rem}\n",".ProfileInfo{aspect-ratio:1 / 1;position:relative}@supports not (aspect-ratio: 1/1){.ProfileInfo::before{float:left;padding-top:100%;content:\"\"}.ProfileInfo::after{display:block;content:\"\";clear:both}}.ProfileInfo .photo-wrapper{width:100%;position:absolute;left:0;top:0;bottom:0}.ProfileInfo .photo-wrapper>.Transition{width:100%;height:100%}.ProfileInfo .photo-dashes{position:absolute;width:100%;height:.125rem;padding:0 .375rem;z-index:1;display:flex;top:.5rem;left:0}.ProfileInfo .photo-dash{flex:1 1 auto;background-color:var(--color-white);opacity:.5;border-radius:.125rem;margin:0 .125rem}.ProfileInfo .photo-dash.current{opacity:1}.ProfileInfo .navigation{position:absolute;top:0;bottom:0;width:25%;border:none;padding:0;margin:0;-webkit-appearance:none;appearance:none;background:transparent no-repeat;background-size:1.25rem;opacity:.25;transition:opacity .15s;outline:none;cursor:pointer;z-index:1}.ProfileInfo .navigation:hover,.is-touch-env .ProfileInfo .navigation{opacity:1}.ProfileInfo .navigation.prev{left:0;background-image:url(media_navigation_previous.11f3cfece8fead5a78e6349db2545210.svg);background-position:1.25rem 50%}.ProfileInfo .navigation.next{right:0;background-image:url(media_navigation_next.3d6e264d21e73ad725738beb8e9dbbb8.svg);background-position:calc(100% - 1.25rem) 50%}.ProfileInfo .info{position:absolute;bottom:0;left:0;width:100%;min-height:100px;padding:0 1.5rem .5rem;background:linear-gradient(0deg, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0) 100%);color:var(--color-white);display:flex;flex-direction:column;justify-content:flex-end;pointer-events:none}.ProfileInfo .info:dir(rtl) .status{text-align:initial;unicode-bidi:plaintext}.ProfileInfo .info[dir=rtl] .status{text-align:initial;unicode-bidi:plaintext}.ProfileInfo .title{display:flex;align-items:center}.ProfileInfo .title h3{font-weight:500;font-size:1.25rem;line-height:1.375rem;white-space:pre-wrap;word-break:break-word;margin-bottom:.25rem}.ProfileInfo .title .VerifiedIcon{margin-left:0.25rem;margin-top:-0.125rem}.ProfileInfo .title .emoji{width:1.5rem;height:1.5rem;background-size:1.5rem}.ProfileInfo .status{font-size:0.875rem;opacity:.5}.ProfileInfo[dir=rtl] .navigation.prev{left:auto;right:0;transform:scaleX(-1)}.ProfileInfo[dir=rtl] .navigation.next{left:0;right:auto;transform:scaleX(-1)}\n",".Profile{height:100%;display:flex;flex-direction:column;overflow-y:scroll;overflow-x:hidden}@supports (overflow-y: overlay){.Profile{overflow-y:overlay !important}}.Profile>.profile-info>.ChatInfo{grid-area:chat_info}.Profile>.profile-info>.ChatInfo .status.online{color:var(--color-primary)}.Profile>.profile-info>.ChatExtra{padding:.875rem .5rem .5rem;box-shadow:inset 0 -0.0625rem 0 0 var(--color-background-secondary-accent);border-bottom:0.625rem solid var(--color-background-secondary)}.Profile>.profile-info>.ChatExtra .narrow{margin-bottom:0}.Profile>.profile-info>.ChatExtra .inactive.no-selection{user-select:auto;-webkit-user-select:auto !important}.Profile>.profile-info>.ChatExtra .Switcher{margin-left:auto}.Profile>.profile-info>.ChatExtra [dir=rtl] .Switcher{margin-left:0;margin-right:auto}.Profile .FloatingActionButton{z-index:1}.shared-media{display:flex;flex-direction:column-reverse}.shared-media .TabList{background:var(--color-background);top:-1px;z-index:1}.shared-media .TabList .Tab{padding:1rem .25rem}.shared-media .TabList .Tab i{bottom:-1rem}.shared-media .Transition{flex:1}.shared-media .content.empty-list{height:100%;padding-top:5rem;display:flex;align-items:flex-start;justify-content:center}.shared-media .content.empty-list .Spinner{--spinner-size: 2.75rem}.shared-media .content.media-list{display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.0625rem}.shared-media .content.documents-list{padding:1.25rem}.shared-media .content.documents-list .File+.File{margin-top:1.25rem}.shared-media .content.links-list{padding:1.25rem}.shared-media .content.links-list .ProgressSpinner,.shared-media .content.links-list .message-upload-progress{display:none}.shared-media .content.audio-list{padding:1.25rem}.shared-media .content.audio-list .Audio .media-loading{top:0;left:0;display:flex;align-items:center;justify-content:center}.shared-media .content.audio-list .Audio+.Audio{margin-top:1.6875rem}.shared-media .content.members-list{padding:0.5rem 1rem}@media (max-width: 600px){.shared-media .content.members-list{padding:.5rem 0}.shared-media .content.members-list .ListItem.chat-item-clickable{margin:0}}\n",".AddChatMembers{height:100%;overflow:hidden;position:relative}.AddChatMembers-inner{height:100%;overflow:hidden}\n","#RightColumn{position:absolute;top:0;right:0;width:var(--right-column-width);height:100%;transform:translate3d(var(--right-column-width), 0, 0);background:var(--color-background);border-left:1px solid var(--color-borders);z-index:var(--z-right-column);transition:transform var(--layer-transition)}body.animation-level-0 #RightColumn{transition:none}#RightColumn:not(:hover) .chat-item-clickable:not(.picker-list-item):nth-child(n+18){display:none !important}@media (max-width: 1275px){#RightColumn{box-shadow:0 0.25rem 0.5rem 0.125rem var(--color-default-shadow);border-left:none}}@media (max-width: 600px){#RightColumn{width:100vw;transform:translate3d(110vw, 0, 0)}}#RightColumn>.Transition{height:calc(100% - var(--header-height));overflow:hidden}#RightColumn .Management .section>.ChatInfo{padding:0 1.5rem;margin:1rem 0;text-align:center}#RightColumn .Management .section>.ChatInfo .Avatar{margin:0 auto .5rem}#RightColumn .Management .section>.ChatInfo .Avatar.no-photo{cursor:default !important}#RightColumn .Management .section>.ChatInfo .title{display:flex;justify-content:center;align-items:center}#RightColumn .Management .section>.ChatInfo .title h3{font-weight:500;font-size:1.25rem;line-height:2rem;white-space:pre-wrap;word-break:break-word}#RightColumn .Management .section>.ChatInfo .title .VerifiedIcon{margin-left:0.25rem;margin-bottom:.5rem}#RightColumn .Management .section>.ChatInfo .title .emoji{width:1.5rem;height:1.5rem;background-size:1.5rem}#RightColumn .Management .section>.ChatInfo .status{font-size:0.875rem;color:#868e96}#RightColumn-wrapper{position:absolute;top:0;left:0;right:0;bottom:0;z-index:var(--z-right-column);overflow:hidden;visibility:hidden;pointer-events:none}@media (max-width: 1275px){#RightColumn-wrapper{position:fixed}}#RightColumn-wrapper.is-hidden{display:none}#RightColumn-wrapper .overlay-backdrop{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;background:black;opacity:0}@media (max-width: 600px){#RightColumn-wrapper .overlay-backdrop{transition:opacity var(--layer-transition)}body.animation-level-0 #RightColumn-wrapper .overlay-backdrop{transition:none}}#Main.right-column-open #RightColumn-wrapper,body.animating-right-column #RightColumn-wrapper{visibility:visible}@media (max-width: 600px){#Main.right-column-open #RightColumn-wrapper .overlay-backdrop{opacity:var(--layer-blackout-opacity)}}#Main.right-column-open #RightColumn-wrapper #RightColumn{pointer-events:auto;transform:translate3d(0, 0, 0)}\n","#Main{display:flex;height:100%;text-align:left;overflow:hidden}@media (min-width: 1276px){#Main{position:relative}}@media (max-width: 600px){#Main{height:calc(var(--vh, 1vh) * 100)}}#LeftColumn{flex:1;min-width:18rem;max-width:26.5rem;height:100%}@media (max-width: 600px){#LeftColumn{height:calc(var(--vh, 1vh) * 100)}}@media (min-width: 1680px){#LeftColumn{border-left:1px solid var(--color-borders)}}@media (max-width: 1275px){#LeftColumn{flex:2}}@media (max-width: 925px){#LeftColumn{position:fixed;left:0;top:0;height:calc(var(--vh, 1vh) * 100);width:26.5rem;transform:translate3d(-5rem, 0, 0);transition:transform var(--layer-transition)}body.animation-level-0 #LeftColumn{transition:none}#LeftColumn::after{content:'';display:block;position:absolute;left:0;top:0;right:0;bottom:0;background:black;opacity:var(--layer-blackout-opacity);transition:opacity var(--layer-transition);z-index:1}body.animation-level-0 #LeftColumn::after{transition:none}body.is-android #LeftColumn::after{display:none}body.is-android .middle-column-shown #LeftColumn::after{display:block}#Main:not(.middle-column-open) #LeftColumn{transform:translate3d(0, 0, 0)}#Main:not(.middle-column-open) #LeftColumn::after{opacity:0;pointer-events:none}#Main.history-animation-disabled #LeftColumn{transition:none}#Main.history-animation-disabled #LeftColumn:after{transition:none}}@media (max-width: 600px){#LeftColumn{max-width:none;width:100vw;transform:translate3d(-20vw, 0, 0)}}@media (min-width: 1680px){#RightColumn{border-right:1px solid var(--color-borders)}}@media (max-width: 600px){#RightColumn{height:calc(var(--vh, 1vh) * 100 + 1px)}}#Main.history-animation-disabled #RightColumn{transition:none}#Main.history-animation-disabled #RightColumn .overlay-backdrop{transition:none}#Main.history-animation-disabled .overlay-backdrop{transition:none}#MiddleColumn{flex:3;border-left:1px solid var(--color-borders);max-width:75vw}@media (max-width: 1275px){#MiddleColumn{max-width:calc(100vw - 26.5rem)}}@media (max-width: 66.25rem){#MiddleColumn{max-width:60vw}}@media (min-width: 1680px){#MiddleColumn{border-right:1px solid var(--color-borders);max-width:calc(1680px - 26.5rem)}}@media (max-width: 925px){#MiddleColumn{max-width:none;position:fixed;left:0;top:0;bottom:0;right:0;transform:translate3d(0, 0, 0);transition:transform var(--layer-transition)}body.animation-level-0 #MiddleColumn{transition:none}#Main:not(.middle-column-open) #MiddleColumn{transform:translate3d(26.5rem, 0, 0)}}@media (max-width: 600px){#MiddleColumn{border-left:none}#Main:not(.middle-column-open) #MiddleColumn{transform:translate3d(100vw, 0, 0)}#Main.right-column-open #MiddleColumn{transform:translate3d(-20vw, 0, 0)}}#Main.history-animation-disabled #MiddleColumn{transition:none}#Main.history-animation-disabled #MiddleColumn:after{transition:none}body.is-android.animation-level-1{--layer-transition: 250ms ease-in-out}body.is-android.animation-level-1 #LeftColumn,body.is-android.animation-level-1 #MiddleColumn,body.is-android.animation-level-1 #RightColumn{transition:transform var(--layer-transition),opacity var(--layer-transition)}body.is-android.animation-level-1 #Main:not(.middle-column-shown) #MiddleColumn{display:none}body.is-android.animation-level-1 #Main:not(.middle-column-open) #MiddleColumn{transform:translate3d(10vw, 0, 0);opacity:0}body.is-android.animation-level-1 #Main.middle-column-open #LeftColumn{transform:translate3d(0, 0, 0);opacity:0}body.is-android.animation-level-1 #Main:not(.right-column-shown) #RightColumn{display:none}body.is-android.animation-level-1 #Main:not(.right-column-open) #RightColumn{transform:translate3d(10vw, 0, 0);opacity:0}body.is-android.animation-level-1 #Main.right-column-open #MiddleColumn{transform:translate3d(0, 0, 0);opacity:0}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/4.5fb9a295648f3bed8bba.js b/dist/4.5fb9a295648f3bed8bba.js new file mode 100644 index 000000000..8d0094e8a --- /dev/null +++ b/dist/4.5fb9a295648f3bed8bba.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{105:function(e,t,a){"use strict";a.r(t),a.d(t,"Main",(function(){return rc}));var s=a(1),n=a(2),c=a(0),r=(a(85),a(11)),o=a(7),i=a(51),l=a(4);function d(e){const{chatId:t,threadId:a}=Object(o.z)(e)||{};return t&&a?(e=Object(r.Z)(e,t,a,!1),e=Object(r.u)(e,t,a,void 0)):e}Object(s.b)("openLocalTextSearch",e=>{const{chatId:t,threadId:a}=Object(o.z)(e)||{};if(t&&a)return Object(r.Z)(e,t,a,!0)}),Object(s.b)("closeLocalTextSearch",d),Object(s.b)("setLocalTextSearchQuery",(e,t,a)=>{const{chatId:s,threadId:n}=Object(o.z)(e)||{};if(!s||!n)return;const{query:c}=a,d=Object(l.a)(s,n),{query:b}=e.localTextSearch.byChatThreadKey[d]||{};return c!==b&&(e=Object(r.u)(e,s,n,i.a)),e=Object(r.Z)(e,s,n,!0,c)}),Object(s.b)("setLocalMediaSearchType",(e,t,a)=>{const{chatId:s}=Object(o.z)(e)||{};if(!s)return;const{mediaType:n}=a;return Object(r.Y)(e,s,n)}),Object(s.b)("openChat",(e,t,a)=>{const{id:n,threadId:c=-1,type:i="thread",shouldReplaceHistory:l=!1}=a,b=Object(o.z)(e);return b&&b.chatId===n&&b.threadId===c&&b.type===i||(e=Object(r.y)(e,n,c,"replyStack",[]),e=d(e=Object(r.o)(e)),e={...e,messages:{...e.messages,contentToBeScheduled:void 0},...n!==e.forwardMessages.toChatId&&{forwardMessages:{}}},Object(s.g)(e)),Object(r.O)(e,n,c,i,l)}),Object(s.b)("openPreviousChat",e=>Object(r.O)(e,void 0)),Object(s.b)("openChatWithInfo",(e,t,a)=>{Object(s.g)({...e,isChatInfoShown:!0}),t.openChat(a)}),Object(s.b)("resetChatCreation",e=>({...e,chatCreation:void 0})),Object(s.b)("setNewChatMembersDialogState",(e,t,a)=>({...e,newChatMembersProgress:a})),Object(s.b)("openNextChat",(e,t,a)=>{const{targetIndexDelta:s,orderedIds:n}=a,{chatId:c}=Object(o.z)(e)||{};if(!c)return void t.openChat({id:n[0]});const r=n.indexOf(c);if(-1===r)return;const i=n[r+s];t.openChat({id:i,shouldReplaceHistory:!0})});var b=a(8),u=a(13),m=a(6),h=a(3);const O=n.C+n.c;let j;Object(s.b)("setScrollOffset",(e,t,a)=>{const{chatId:s,threadId:n,scrollOffset:c}=a;return Object(r.y)(e,s,n,"scrollOffset",c)}),Object(s.b)("setReplyingToId",(e,t,a)=>{const{messageId:s}=a,n=Object(o.z)(e);if(!n)return;const{chatId:c,threadId:i}=n;return Object(r.y)(e,c,i,"replyingToId",s)}),Object(s.b)("setEditingId",(e,t,a)=>{const{messageId:s}=a,n=Object(o.z)(e);if(!n)return;const{chatId:c,threadId:i,type:l}=n,d="scheduled"===l?"editingScheduledId":"editingId";return Object(r.y)(e,c,i,d,s)}),Object(s.b)("editLastMessage",e=>{const{chatId:t,threadId:a}=Object(o.z)(e)||{};if(!t||!a)return;const s=Object(o.n)(e,t),n=Object(o.Kb)(e,t,a);if(!s||!n)return;const c=Object(h.g)(n,t=>Boolean(s[t]&&Object(o.b)(e,s[t],a).canEdit));return c?Object(r.y)(e,t,a,"editingId",c):void 0}),Object(s.b)("replyToNextMessage",(e,t,a)=>{const{targetIndexDelta:s}=a,{chatId:n,threadId:c}=Object(o.z)(e)||{};if(!n||!c)return;const r=Object(o.n)(e,n),i=Object(o.Kb)(e,n,c);if(!r||!i)return;const l=Object(o.ob)(e,n,c);let d;if(Object(o.Y)(e,n,c)&&l){const e=Object.keys(r),t=e.indexOf(l.toString())+s;d=t<=e.length+1&&t>=0?Number(e[t]):void 0}else if(c===b.MAIN_THREAD_ID){const t=Object(o.g)(e,n);d=t&&t.lastMessage?t.lastMessage.id:void 0}else{const t=Object(o.Fb)(e,n,c);d=t?t.lastMessageId:void 0}t.setReplyingToId({messageId:d}),t.focusMessage({chatId:n,threadId:c,messageId:d})}),Object(s.b)("openMediaViewer",(e,t,a)=>{const{chatId:s,threadId:n,messageId:c,avatarOwnerId:r,profilePhotoIndex:o,origin:i}=a;return{...e,mediaViewer:{chatId:s,threadId:n,messageId:c,avatarOwnerId:r,profilePhotoIndex:o,origin:i},forwardMessages:{}}}),Object(s.b)("closeMediaViewer",e=>({...e,mediaViewer:{}})),Object(s.b)("openAudioPlayer",(e,t,a)=>{const{chatId:s,threadId:n,messageId:c}=a;return{...e,audioPlayer:{chatId:s,threadId:n,messageId:c}}}),Object(s.b)("closeAudioPlayer",e=>({...e,audioPlayer:{}})),Object(s.b)("openPollResults",(e,t,a)=>{const{chatId:n,messageId:c}=a;Object(o.W)(e)?n===e.pollResults.chatId&&c===e.pollResults.messageId||Object(s.g)({...e,pollResults:{chatId:n,messageId:c,voters:{}}}):window.setTimeout(()=>{const e=Object(s.e)();Object(s.g)({...e,pollResults:{chatId:n,messageId:c,voters:{}}})},450)}),Object(s.b)("closePollResults",e=>{Object(s.g)({...e,pollResults:{}})}),Object(s.b)("focusLastMessage",(e,t)=>{const a=Object(o.z)(e);if(!a)return;const{chatId:s,threadId:n}=a;let c;if(n===b.MAIN_THREAD_ID){const t=Object(o.g)(e,s);c=t&&t.lastMessage?t.lastMessage.id:void 0}else{const t=Object(o.Fb)(e,s,n);c=t?t.lastMessageId:void 0}c&&t.focusMessage({chatId:s,threadId:n,messageId:c,noHighlight:!0})}),Object(s.b)("focusNextReply",(e,t)=>{const a=Object(o.z)(e);if(!a)return;const{chatId:n,threadId:c}=a,i=Object(o.nb)(e,n,c);if(i&&0!==i.length){const a=i.pop();e=Object(r.y)(e,n,c,"replyStack",[...i]),Object(s.g)(e),t.focusMessage({chatId:n,threadId:c,messageId:a})}else t.focusLastMessage()}),Object(s.b)("focusMessage",(e,t,a)=>{const{chatId:n,threadId:c=b.MAIN_THREAD_ID,messageListType:i="thread",noHighlight:l,groupedId:d,groupedChatId:m,replyMessageId:h}=a;let{messageId:g}=a;if(void 0!==d){const t=Object(o.J)(e,m,d);t&&t.length&&([g]=t)}const p=Object(o.z)(e),f=!p||n!==p.chatId||c!==p.threadId||i!==p.type;if(j&&(clearTimeout(j),j=void 0),j=window.setTimeout(()=>{let e=Object(s.e)();e=Object(r.Q)(e),e=Object(r.P)(e),Object(s.g)(e)},l?O:1500),e=Object(r.Q)(e,n,g,l),e=Object(r.P)(e,void 0),h){const t=Object(o.nb)(e,n,c)||[];e=Object(r.y)(e,n,c,"replyStack",[...t,h])}f&&(e=Object(r.P)(e,u.b.Static));const I=Object(o.Kb)(e,n,c);if(I&&I.includes(g))return Object(s.g)(e),void t.openChat({id:n,threadId:c});if(f&&(e=Object(r.y)(e,n,c,"viewportIds",void 0)),e=Object(r.y)(e,n,c,"outlyingIds",void 0),I&&!f){const t=g>I[0]?u.b.Down:u.b.Up;e=Object(r.P)(e,t)}Object(s.g)(e),t.openChat({id:n,threadId:c}),t.loadViewportMessages()}),Object(s.b)("openForwardMenu",(e,t,a)=>{const{fromChatId:s,messageIds:n,groupedId:c}=a;let r;return c&&(r=Object(o.bb)(e,s,c)),{...e,forwardMessages:{fromChatId:s,messageIds:r||n,isModalShown:!0}}}),Object(s.b)("exitForwardMode",e=>{Object(s.g)({...e,forwardMessages:{}})}),Object(s.b)("setForwardChatId",(e,t,a)=>{const{id:n}=a;Object(s.g)({...e,forwardMessages:{...e.forwardMessages,toChatId:n,isModalShown:!1}}),t.openChat({id:n}),t.closeMediaViewer(),t.exitMessageSelectMode()}),Object(s.b)("openForwardMenuForSelectedMessages",(e,t)=>{if(!e.selectedMessages)return;const{chatId:a,messageIds:s}=e.selectedMessages;t.openForwardMenu({fromChatId:a,messageIds:s})}),Object(s.b)("enterMessageSelectMode",(e,t,a)=>{const{messageId:s}=a||{},n=Object(o.s)(e);return n?Object(r.n)(e,n.id,s):e}),Object(s.b)("toggleMessageSelection",(e,t,a)=>{const{messageId:n,groupedId:c,childMessageIds:i,withShift:l}=a,d=Object(o.z)(e);if(!d)return;const{chatId:b,threadId:u,type:h}=d;e=Object(r.H)(e,b,u,h,n,c,i,l),Object(s.g)(e),e.shouldShowContextMenuHint&&(t.disableContextMenuHint(),t.showNotification({message:`To **edit** or **reply**, close this menu. Then ${m.n?"long tap":"right click"} on a message.`}))}),Object(s.b)("disableContextMenuHint",e=>{if(e.shouldShowContextMenuHint)return{...e,shouldShowContextMenuHint:!1}}),Object(s.b)("exitMessageSelectMode",r.o),Object(s.b)("openPollModal",e=>({...e,isPollModalOpen:!0})),Object(s.b)("closePollModal",e=>({...e,isPollModalOpen:!1}));Object(s.b)("setGlobalSearchQuery",(e,t,a)=>{const{query:s}=a,{chatId:n}=e.globalSearch;return Object(r.S)(e,{globalResults:{},localResults:{},resultsByType:void 0,...s?{fetchingStatus:{chats:!n,messages:!0}}:{fetchingStatus:void 0},query:s})}),Object(s.b)("addRecentlyFoundChatId",(e,t,a)=>{const{id:s}=a,{recentlyFoundChatIds:n}=e.globalSearch;if(!n)return Object(r.S)(e,{recentlyFoundChatIds:[s]});const c=n.filter(e=>e!==s);return c.unshift(s),c.length>10&&c.pop(),Object(r.S)(e,{recentlyFoundChatIds:c})}),Object(s.b)("clearRecentlyFoundChats",e=>Object(r.S)(e,{recentlyFoundChatIds:void 0})),Object(s.b)("setGlobalSearchContent",(e,t,a)=>{const{content:s}=a;return Object(r.T)(e,s)}),Object(s.b)("setGlobalSearchChatId",(e,t,a)=>{const{id:s}=a;return Object(r.S)(e,{chatId:s,query:void 0,resultsByType:void 0})}),Object(s.b)("setStickerSearchQuery",(e,t,a)=>{const{query:s}=a;return{...e,stickers:{...e.stickers,search:{query:s,resultIds:void 0}}}}),Object(s.b)("setGifSearchQuery",(e,t,a)=>{const{query:s}=a;return{...e,gifs:{...e.gifs,search:{query:s,offsetId:void 0,results:void 0}}}}),Object(s.b)("openUserInfo",(e,t,a)=>{const{id:s}=a;t.openChat({id:s})});Object(s.b)("openChat",e=>Object(r.gb)(e,void 0)),Object(s.b)("setUserSearchQuery",(e,t,a)=>{const{query:s}=a;return Object(r.pb)(e,{globalUserIds:void 0,localUserIds:void 0,fetchingStatus:Boolean(s),query:s})});a(86);var g=a(177);Object(s.b)("toggleChatInfo",e=>({...e,isChatInfoShown:!e.isChatInfoShown})),Object(s.b)("toggleManagement",e=>{const{chatId:t}=Object(o.z)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!(e.management.byChatId[t]||{}).isActive}}}}}),Object(s.b)("closeManagement",e=>{const{chatId:t}=Object(o.z)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!1}}}}}),Object(s.b)("openChat",e=>{if(m.l||m.m)return{...e,isLeftColumnShown:0===e.messages.messageLists.length}}),Object(s.b)("toggleLeftColumn",e=>({...e,isLeftColumnShown:!e.isLeftColumnShown})),Object(s.b)("addRecentEmoji",(e,t,a)=>{const{emoji:s}=a,{recentEmojis:n}=e;if(!n)return{...e,recentEmojis:[s]};const c=n.filter(e=>e!==s);return c.unshift(s),c.length>18&&c.pop(),{...e,recentEmojis:c}}),Object(s.b)("addRecentSticker",(e,t,a)=>{const{sticker:s}=a,{recent:n}=e.stickers;if(!n)return{...e,stickers:{...e.stickers,recent:{hash:0,stickers:[s]}}};const c=n.stickers.filter(e=>e.id!==s.id);return c.unshift(s),{...e,stickers:{...e.stickers,recent:{...n,stickers:c}}}}),Object(s.b)("showNotification",(e,t,a)=>{const s=a,n=[...e.notifications],c=n.findIndex(e=>e.message===s.message);return-1!==c&&n.splice(c,1),n.push(s),{...e,notifications:n}}),Object(s.b)("dismissNotification",e=>{const t=[...e.notifications];return t.pop(),{...e,notifications:t}}),Object(s.b)("showDialog",(e,t,a)=>{const{data:s}=a;if("message"in s&&s.hasErrorKey&&!Object(g.a)(s))return e;const n=[...e.dialogs];if("message"in s){const e=n.findIndex(e=>e.message===s.message);-1!==e&&n.splice(e,1)}return n.push(s),{...e,dialogs:n}}),Object(s.b)("dismissDialog",e=>{const t=[...e.dialogs];return t.pop(),{...e,dialogs:t}}),Object(s.b)("toggleSafeLinkModal",(e,t,a)=>{const{url:s}=a;return{...e,safeLinkModalUrl:s}}),Object(s.b)("openHistoryCalendar",(e,t,a)=>{const{selectedAt:s}=a;return{...e,historyCalendarSelectedAt:s}}),Object(s.b)("closeHistoryCalendar",e=>({...e,historyCalendarSelectedAt:void 0})),Object(s.b)("openPaymentModal",(e,t,a)=>{const{messageId:s}=a;return{...e,payment:{...e.payment,messageId:s,isPaymentModalOpen:!0}}}),Object(s.b)("closePaymentModal",e=>{const t=Object(r.i)(e);return Object(r.j)(t)});a(87);var p=a(5),f=a(10);const I=Object(f.h)(e=>e(),1e3,!0),v=Object(f.h)(e=>e(),3e3,!0),y=Object(f.a)(e=>e(),500,!1,!0);async function C(e,t,a){const c=await Object(p.a)("fetchChats",{limit:n.l,offsetDate:a,archived:"archived"===e,withPinned:void 0===Object(s.e)().chats.orderedPinnedIds[e],serverTimeOffset:Object(s.e)().serverTimeOffset});if(!c)return;const{chatIds:o}=c;o.length>0&&o[0]===t&&o.shift();let i=Object(s.e)();i=Object(r.g)(i,Object(h.c)(c.users,"id")),i=Object(r.N)(i,Object(h.c)(c.chats,"id")),i=Object(r.J)(i,e,o),i=Object(r.K)(i,e,c),Object.keys(c.draftsById).map(Number).forEach(e=>{i=Object(r.y)(i,e,b.MAIN_THREAD_ID,"draft",c.draftsById[e])}),Object.keys(c.replyingToById).map(Number).forEach(e=>{i=Object(r.y)(i,e,b.MAIN_THREAD_ID,"replyingToId",c.replyingToById[e])}),0!==o.length||i.chats.isFullyLoaded[e]||(i={...i,chats:{...i.chats,isFullyLoaded:{...i.chats.isFullyLoaded,[e]:!0}}}),Object(s.g)(i)}async function E(e){const t=await Object(p.a)("fetchFullChat",e);if(!t)return;const{users:a,fullInfo:n}=t;let c=Object(s.e)();a&&(c=Object(r.g)(c,Object(h.c)(a,"id"))),c=Object(r.I)(c,e.id,{fullInfo:n}),Object(s.g)(c)}async function w(e,t,a){const n=Object(s.e)(),c=Object(o.i)(n,t);if(c&&!c.isMin)return void(a?e.focusMessage({chatId:c.id,messageId:a}):e.openChat({id:c.id}));const i=Object(o.s)(n);e.openChat({id:-1});const l=await Object(p.a)("getChatByUsername",t);if(!l)return i&&e.openChat({id:i.id}),void e.showNotification({message:"User does not exist"});Object(s.g)(Object(r.I)(Object(s.e)(),l.id,l)),a?e.focusMessage({chatId:l.id,messageId:a}):e.openChat({id:l.id})}Object(s.b)("preloadTopChatMessages",(e,t)=>{(async()=>{const a=[];for(let c=0;ce!==i&&!a.includes(e));if(!m)return;a.push(m.id),t.loadViewportMessages({chatId:m.id,threadId:b.MAIN_THREAD_ID})}})()}),Object(s.b)("openChat",(e,t,a)=>{const{id:s,threadId:n}=a,{currentUserId:c}=e,r=Object(o.g)(e,s);if(r&&r.hasUnreadMark&&t.toggleChatUnread({id:s}),r)Object(l.pb)(r)&&!r.isMin&&t.requestChatUpdate({chatId:s});else if(s===c)Object(p.a)("fetchChat",{type:"self"});else{const t=Object(o.Jb)(e,s);t&&Object(p.a)("fetchChat",{type:"user",user:t})}if(n!==b.MAIN_THREAD_ID){Object(o.Hb)(e,s,n)||t.requestThreadInfoUpdate({chatId:s,threadId:n})}}),Object(s.b)("openSupportChat",(e,t)=>{const a=Object(o.Cb)(e);t.openChat({id:a?a.id:-1}),a||(async()=>{const e=await Object(p.a)("fetchChat",{type:"support"});e&&t.openChat({id:e.chatId})})()}),Object(s.b)("openTipsChat",(e,t,a)=>{const{langCode:s}=a,c="pt-br"===s?"BR":n.S.includes(s)?s.toUpperCase():"";t.openChatByUsername({username:`${n.Pb}${c}`})}),Object(s.b)("loadMoreChats",(e,t,a)=>{const{listType:s="active"}=a,n=e.chats.listIds[s];if(e.chats.isFullyLoaded[s])return;const c=n?n.map(t=>e.chats.byId[t]).filter(t=>Boolean(t&&t.lastMessage)&&!Object(o.N)(e,t.id)).sort((e,t)=>e.lastMessage.date-t.lastMessage.date)[0]:void 0;I(c?()=>C(s,c.id,c.lastMessage.date):()=>C(s))}),Object(s.b)("loadFullChat",(e,t,a)=>{const{chatId:s,force:n}=a,c=Object(o.g)(e,s);c&&(n?E(c):y(()=>E(c)))}),Object(s.b)("loadTopChats",()=>{v(()=>C("active"))}),Object(s.b)("requestChatUpdate",(e,t,a)=>{const{serverTimeOffset:s}=e,{chatId:n}=a,c=Object(o.g)(e,n);c&&Object(p.a)("requestChatUpdate",{chat:c,serverTimeOffset:s})}),Object(s.b)("updateChatMutedState",(e,t,a)=>{const{serverTimeOffset:n}=e,{chatId:c,isMuted:i}=a,l=Object(o.g)(e,c);l&&(Object(s.g)(Object(r.I)(e,c,{isMuted:i})),Object(p.a)("updateChatMutedState",{chat:l,isMuted:i,serverTimeOffset:n}))}),Object(s.b)("createChannel",(e,t,a)=>{const{title:n,about:c,photo:i,memberIds:l}=a;!async function(e,t,a,n){Object(s.g)({...Object(s.e)(),chatCreation:{progress:u.a.InProgress}});const c=await Object(p.a)("createChannel",{title:e,about:a,users:t});if(!c)return;const{id:o,accessHash:i}=c;let l=Object(s.e)();l=Object(r.I)(l,o,c),l={...l,chatCreation:{...l.chatCreation,progress:c?u.a.Complete:u.a.Error}},Object(s.g)(l),Object(s.d)().openChat({id:o}),o&&i&&n&&await Object(p.a)("editChatPhoto",{chatId:o,accessHash:i,photo:n})}(n,l.map(t=>Object(o.Jb)(e,t)).filter(Boolean),c,i)}),Object(s.b)("joinChannel",(e,t,a)=>{const{chatId:s}=a,n=Object(o.g)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&Object(p.a)("joinChannel",{channelId:c,accessHash:r})}),Object(s.b)("deleteChatUser",(e,t,a)=>{(async()=>{const{chatId:s,userId:n}=a,c=Object(o.g)(e,s),r=Object(o.Jb)(e,n);if(!c||!r)return;await Object(p.a)("deleteChatUser",{chat:c,user:r});const i=Object(o.z)(e);i&&i.chatId===s&&e.currentUserId===n&&t.openChat({id:void 0})})()}),Object(s.b)("deleteChat",(e,t,a)=>{(async()=>{const{chatId:s}=a,n=Object(o.g)(e,s);if(!n)return;await Object(p.a)("deleteChat",{chatId:n.id});const c=Object(o.z)(e);c&&c.chatId===s&&t.openChat({id:void 0})})()}),Object(s.b)("leaveChannel",(e,t,a)=>{(async()=>{const{chatId:s}=a,n=Object(o.g)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&await Object(p.a)("leaveChannel",{channelId:c,accessHash:r});const i=Object(o.z)(e);i&&i.chatId===s&&t.openChat({id:void 0})})()}),Object(s.b)("deleteChannel",(e,t,a)=>{(async()=>{const{chatId:s}=a,n=Object(o.g)(e,s);if(!n)return;const{id:c,accessHash:r}=n;c&&r&&await Object(p.a)("deleteChannel",{channelId:c,accessHash:r});const i=Object(o.z)(e);i&&i.chatId===s&&t.openChat({id:void 0})})()}),Object(s.b)("createGroupChat",(e,t,a)=>{const{title:n,memberIds:c,photo:i}=a;!async function(e,t,a){Object(s.g)({...Object(s.e)(),chatCreation:{progress:u.a.InProgress}});const n=await Object(p.a)("createGroupChat",{title:e,users:t});if(!n)return;const{id:c}=n;let o=Object(s.e)();o=Object(r.I)(o,c,n),o={...o,chatCreation:{...o.chatCreation,progress:n?u.a.Complete:u.a.Error}},Object(s.g)(o),Object(s.d)().openChat({id:c}),c&&a&&await Object(p.a)("editChatPhoto",{chatId:c,photo:a})}(n,c.map(t=>Object(o.Jb)(e,t)).filter(Boolean),i)}),Object(s.b)("toggleChatPinned",(e,t,a)=>{const{id:s,folderId:c}=a,r=Object(o.g)(e,s);if(r)if(c){const t=Object(o.j)(e,c);if(t){const a=!Object(o.N)(e,s,c),{pinnedChatIds:n,includedChatIds:r}=t,i=a?[s,...n||[]]:(n||[]).filter(e=>e!==s),l=[s,...r];Object(p.a)("editChatFolder",{id:c,folderUpdate:{...t,pinnedChatIds:i,includedChatIds:l}})}}else{const t=Object(o.k)(e,s),a=Object(o.N)(e,s,"archived"===t?n.i:void 0);Object(p.a)("toggleChatPinned",{chat:r,shouldBePinned:!a})}}),Object(s.b)("toggleChatArchived",(e,t,a)=>{const{id:s}=a,c=Object(o.g)(e,s);c&&Object(p.a)("toggleChatArchived",{chat:c,folderId:Object(l.kb)(c)?0:n.i})}),Object(s.b)("loadChatFolders",()=>{!async function(){const e=await Object(p.a)("fetchChatFolders");if(e){const t=Object(s.e)();Object(s.g)({...t,chatFolders:{...t.chatFolders,...e}})}}()}),Object(s.b)("loadRecommendedChatFolders",()=>{!async function(){const e=await Object(p.a)("fetchRecommendedChatFolders");if(e){const t=Object(s.e)();Object(s.g)({...t,chatFolders:{...t.chatFolders,recommended:e}})}}()}),Object(s.b)("editChatFolder",(e,t,a)=>{const{id:s,folderUpdate:n}=a,c=Object(o.j)(e,s);c&&Object(p.a)("editChatFolder",{id:s,folderUpdate:{id:s,emoticon:c.emoticon,pinnedChatIds:c.pinnedChatIds,...n}})}),Object(s.b)("addChatFolder",(e,t,a)=>{const{folder:c}=a,{orderedIds:r}=e.chatFolders;!async function(e,t){const{id:a,description:n,...c}=e;if(await Object(p.a)("editChatFolder",{id:t+1,folderUpdate:{id:t+1,...c}}),!n)return;const r=Object(s.e)(),{recommended:o}=r.chatFolders;o&&Object(s.g)({...r,chatFolders:{...r.chatFolders,recommended:o.filter(({id:e})=>e!==a)}})}(c,r&&r.length?Math.max.apply(Math.max,r):n.i)}),Object(s.b)("deleteChatFolder",(e,t,a)=>{const{id:s}=a;Object(o.j)(e,s)&&async function(e){await Object(p.a)("deleteChatFolder",e)}(s)}),Object(s.b)("toggleChatUnread",(e,t,a)=>{const{id:s}=a,{serverTimeOffset:n}=e,c=Object(o.g)(e,s);c&&(c.unreadCount?Object(p.a)("markMessageListRead",{serverTimeOffset:n,chat:c,threadId:b.MAIN_THREAD_ID}):Object(p.a)("toggleDialogUnread",{chat:c,hasUnreadMark:!c.hasUnreadMark}))}),Object(s.b)("openTelegramLink",(e,t,a)=>{const{url:s}=a;let c=n.tb.exec(s);if(c){const e=c[1];(async()=>{const a=await Object(p.a)("openChatByInvite",e);a&&t.openChat({id:a.chatId})})()}else{c=n.ub.exec(s);const e=c[1],a=c[2]?Number(c[2]):void 0,r=c[3]?Number(c[3]):void 0;"c"===e&&a&&r?t.focusMessage({chatId:-a,messageId:r}):w(t,e,a)}}),Object(s.b)("acceptInviteConfirmation",(e,t,a)=>{const{hash:s}=a;(async()=>{const e=await Object(p.a)("importChatInvite",{hash:s});e&&t.openChat({id:e.id})})()}),Object(s.b)("openChatByUsername",(e,t,a)=>{const{username:s}=a;w(t,s)}),Object(s.b)("togglePreHistoryHidden",(e,t,a)=>{const{chatId:s,isEnabled:n}=a;let c=Object(o.g)(e,s);c&&(async()=>{if(Object(l.lb)(c)){if(c=await Object(p.a)("migrateChat",c),!c)return;t.openChat({id:c.id})}Object(p.a)("togglePreHistoryHidden",{chat:c,isEnabled:n})})()}),Object(s.b)("updateChatDefaultBannedRights",(e,t,a)=>{const{chatId:s,bannedRights:n}=a,c=Object(o.g)(e,s);c&&Object(p.a)("updateChatDefaultBannedRights",{chat:c,bannedRights:n})}),Object(s.b)("updateChatMemberBannedRights",(e,t,a)=>{const{chatId:n,userId:c,bannedRights:i}=a;let d=Object(o.g)(e,n);const b=Object(o.Jb)(e,c);d&&b&&(async()=>{if(Object(l.lb)(d)){if(d=await Object(p.a)("migrateChat",d),!d)return;t.openChat({id:d.id})}await Object(p.a)("updateChatMemberBannedRights",{chat:d,user:b,bannedRights:i});const e=Object(s.e)(),a=Object(o.g)(e,n);if(!a||!a.fullInfo)return;const{members:u,kickedMembers:m}=a.fullInfo,h=!!i.viewMessages,O=!Object.keys(i).length;Object(s.g)(Object(r.I)(e,n,{fullInfo:{...a.fullInfo,...u&&h&&{members:u.filter(e=>e.userId!==c)},...u&&!h&&{members:u.map(e=>e.userId===c?{...e,bannedRights:i}:e)},...O&&m&&{kickedMembers:m.filter(e=>e.userId!==c)}}}))})()}),Object(s.b)("updateChatAdmin",(e,t,a)=>{const{chatId:n,userId:c,adminRights:i,customTitle:d}=a;let b=Object(o.g)(e,n);const u=Object(o.Jb)(e,c);b&&u&&(async()=>{if(Object(l.lb)(b)){if(b=await Object(p.a)("migrateChat",b),!b)return;t.openChat({id:b.id})}await Object(p.a)("updateChatAdmin",{chat:b,user:u,adminRights:i,customTitle:d});const e=Object(s.e)(),a=Object(o.g)(e,n);if(!a||!a.fullInfo)return;const{adminMembers:m}=a.fullInfo,h=!Object.keys(i).length;Object(s.g)(Object(r.I)(e,n,{fullInfo:{...a.fullInfo,...m&&h&&{adminMembers:m.filter(e=>e.userId!==c)},...m&&!h&&{adminMembers:m.map(e=>e.userId===c?{...e,adminRights:i,customTitle:d}:e)}}}))})()}),Object(s.b)("updateChat",(e,t,a)=>{const{chatId:n,title:c,about:i,photo:l}=a,d=Object(o.g)(e,n);d&&(async()=>{Object(s.g)(Object(r.cb)(Object(s.e)(),u.f.InProgress)),await Promise.all([d.title!==c?Object(p.a)("updateChatTitle",d,c):void 0,d.fullInfo&&d.fullInfo.about!==i?Object(p.a)("updateChatAbout",d,i):void 0,l?Object(p.a)("editChatPhoto",{chatId:n,accessHash:d.accessHash,photo:l}):void 0]),Object(s.g)(Object(r.cb)(Object(s.e)(),u.f.Complete))})()}),Object(s.b)("toggleSignatures",(e,t,a)=>{const{chatId:s,isEnabled:n}=a,c=Object(o.g)(e,s);c&&Object(p.a)("toggleSignatures",{chat:c,isEnabled:n})}),Object(s.b)("loadGroupsForDiscussion",()=>{(async()=>{const e=await Object(p.a)("fetchGroupsForDiscussion");if(!e)return;const t=e.reduce((e,t)=>(t&&(e[t.id]=t),e),{}),a=Object(r.c)(Object(s.e)(),t);Object(s.g)({...a,chats:{...a.chats,forDiscussionIds:Object.keys(t).map(Number)}})})()}),Object(s.b)("linkDiscussionGroup",(e,t,a)=>{const{channelId:s,chatId:n}=a,c=Object(o.g)(e,s);let r=Object(o.g)(e,n);c&&r&&(async()=>{if(Object(l.lb)(r)){if(r=await Object(p.a)("migrateChat",r),!r)return;t.openChat({id:r.id})}let{fullInfo:e}=r;if(!e){const t=await Object(p.a)("fetchFullChat",r);if(!t)return;e=t.fullInfo}e.isPreHistoryHidden&&await Object(p.a)("togglePreHistoryHidden",{chat:r,isEnabled:!1}),Object(p.a)("setDiscussionGroup",{channel:c,chat:r})})()}),Object(s.b)("unlinkDiscussionGroup",(e,t,a)=>{const{channelId:s}=a,n=Object(o.g)(e,s);if(!n)return;let c;n.fullInfo&&n.fullInfo.linkedChatId&&(c=Object(o.g)(e,n.fullInfo.linkedChatId)),(async()=>{await Object(p.a)("setDiscussionGroup",{channel:n}),c&&E(c)})()}),Object(s.b)("setActiveChatFolder",(e,t,a)=>({...e,chatFolders:{...e.chatFolders,activeChatFolder:a}})),Object(s.b)("loadMoreMembers",e=>{(async()=>{const{chatId:t}=Object(o.z)(e)||{},a=t?Object(o.g)(e,t):void 0;if(!a||Object(l.lb)(a))return;const n=a.fullInfo&&a.fullInfo.members&&a.fullInfo.members.length||void 0,c=await Object(p.a)("fetchMembers",a.id,a.accessHash,"recent",n);if(!c)return;const{members:i,users:d}=c;i&&i.length&&(e=Object(s.e)(),e=Object(r.g)(e,Object(h.c)(d,"id")),e=Object(r.I)(e,a.id,{fullInfo:{...a.fullInfo,members:[...(a.fullInfo||{}).members||[],...i||[]]}}),Object(s.g)(e))})()}),Object(s.b)("addChatMembers",(e,t,a)=>{const{chatId:s,memberIds:n}=a,c=Object(o.g)(e,s),r=n.map(t=>Object(o.Jb)(e,t)).filter(Boolean);c&&r.length&&(t.setNewChatMembersDialogState(u.i.Loading),(async()=>{await Object(p.a)("addChatMembers",c,r),t.setNewChatMembersDialogState(u.i.Closed),E(c)})())}),Object(s.b)("deleteChatMember",(e,t,a)=>{const{chatId:s,userId:n}=a,c=Object(o.g)(e,s),r=Object(o.Jb)(e,n);c&&r&&(async()=>{await Object(p.a)("deleteChatMember",c,r),E(c)})()});const M=new Map,S=Object(f.h)(e=>e(),1e3,!0);async function k(e,t,a,c,i=!1,l=!1){const d=e.id;let b;switch(c){case u.e.Backwards:b=void 0;break;case u.e.Around:b=-(Math.round(n.gb/2)+1);break;case u.e.Forwards:b=-(n.gb+1)}const m=await Object(p.a)("fetchMessages",{chat:Object(o.Gb)(Object(s.e)(),d,t),offsetId:a,addOffset:b,limit:n.gb,threadId:t});if(!m)return;const{messages:O,users:j,chats:g,threadInfos:f}=m,I=Object(h.c)(O,"id"),v=Object.keys(I).map(Number);let y=Object(s.e)();y=Object(r.b)(y,d,I),y=i?Object(r.eb)(y,d,t,v):Object(r.W)(y,d,t,v),y=Object(r.g)(y,Object(h.c)(j,"id")),y=Object(r.c)(y,Object(h.c)(g,"id")),y=Object(r.mb)(y,d,f);let C=Object(o.Z)(y,d,t);const E=Object(o.hb)(y,d,t);if(i&&C&&E&&Object(h.b)(C,E)&&(y=Object(r.W)(y,d,t,E),C=Object(o.Z)(y,d,t),y=Object(r.y)(y,d,t,"outlyingIds",void 0),i=!1),!l){const e=i?E:C,{newViewportIds:s}=N(e,a,c);y=Object(r.A)(y,d,t,s)}Object(s.g)(y)}function N(e,t,a){const{length:s}=e,c=t?function(e,t){return te[e.length-1]?e.length-1:e.findIndex((a,s)=>a===t||at)}(e,t):-1,r=a===u.e.Backwards?c:c+1||s,o=r-n.gb,i=r+n.gb-1,l=e.slice(Math.max(0,o),i+1);let d,b;switch(a){case u.e.Backwards:d=r>0,b=o>=0;break;case u.e.Forwards:d=r0,b=l.length===n.gb}return{newViewportIds:l,areSomeLocal:d,areAllLocal:b}}async function T(e){let t;const a=e.attachment?(e,n)=>{M.has(n)||(t=n,M.set(n,a));const c=Object(s.e)();Object(s.g)({...c,fileUploads:{byMessageLocalId:{...c.fileUploads.byMessageLocalId,[n]:{progress:e}}}})}:void 0;(e.replyingTo||m.e)&&await Object(f.g)();const n=Object(s.e)();e.serverTimeOffset=n.serverTimeOffset;const c=Object(o.z)(n);if(!c)return;const{threadId:r}=c;e.replyingTo||r===b.MAIN_THREAD_ID||(e.replyingTo=Object(o.Hb)(n,e.chat.id,r)),await Object(p.a)("sendMessage",e,a),a&&t&&M.delete(t)}Object(s.b)("loadViewportMessages",(e,t,a)=>{const{direction:s=u.e.Around,isBudgetPreload:c=!1}=a||{};let{chatId:i,threadId:l}=a||{};if(!i){const t=Object(o.z)(e);if(!t)return;i=t.chatId,l=t.threadId}const d=Object(o.g)(e,i);if(!d||d.isRestricted)return;const b=Object(o.Kb)(e,i,l),m=Object(o.Z)(e,i,l),h=Object(o.hb)(e,i,l);if(b&&b.length&&s!==u.e.Around){const a=s===u.e.Backwards?b[0]:b[b.length-1],n=Boolean(h),o=n?h:m,{newViewportIds:O,areSomeLocal:j,areAllLocal:g}=N(o,a,s);if(j&&(e=Object(r.A)(e,i,l,O)),async function(e,t,a,s,n,c,r,o){t||await k(n,c,o,r,a,s);s||(await Promise.resolve(),e.loadViewportMessages({chatId:n.id,threadId:c,direction:r,isBudgetPreload:!0}))}(t,g,n,c,d,l,s,a),c)return}else{const t=Object(o.I)(e,i)||Object(o.mb)(e,i,l),a=Boolean(t&&m&&!m.includes(t)),s=(a?h:m)||[],{newViewportIds:b,areSomeLocal:O,areAllLocal:j}=N(s,t,u.e.Around);O&&b.length>=n.gb&&(e=Object(r.A)(e,i,l,b)),j||k(d,l,t,u.e.Around,a,c)}return e}),Object(s.b)("loadMessage",(e,t,a)=>{const{chatId:n,messageId:c,replyOriginForId:i}=a,l=Object(o.g)(e,n);l&&async function(e,t,a){const n=await Object(p.a)("fetchMessage",{chat:e,messageId:t});if(!n)return;if(n===b.MESSAGE_DELETED){if(a){let t=Object(s.e)();const n=Object(o.l)(t,e.id,a);t=Object(r.M)(t,e.id,a,{...n,replyToMessageId:void 0}),Object(s.g)(t)}return}let c=Object(s.e)();c=Object(r.M)(c,e.id,t,n.message),c=Object(r.g)(c,Object(h.c)(n.users,"id")),Object(s.g)(c)}(l,c,i)}),Object(s.b)("sendMessage",(e,t,a)=>{const s=Object(o.z)(e);if(!s)return;const{chatId:c,threadId:r,type:i}=s;if("scheduled"===i&&!a.scheduledAt)return{...e,messages:{...e.messages,contentToBeScheduled:a}};const l=Object(o.g)(e,c);t.setReplyingToId({messageId:void 0}),t.clearWebPagePreview({chatId:c,threadId:r,value:!1});const d={...a,chat:l,replyingTo:Object(o.ob)(e,c,r),noWebPage:Object(o.db)(e,c,r)},b=!a.attachments||a.attachments.length<=1,u=!b&&a.attachments&&a.attachments.length>1;if(b){const{attachments:e,...t}=d;T({...t,attachment:e?e[0]:void 0})}else if(u){const{text:e,entities:t,attachments:a,...s}=d,c=Object(h.n)(a,n.W);for(let a=0;a0?o:void 0}),r.forEach(e=>{T({...s,attachment:e,groupedId:o})})}}else{const{text:e,entities:t,attachments:a,replyingTo:s,...n}=d;e&&T({...n,text:e,entities:t,replyingTo:s}),a.forEach(e=>{T({...n,attachment:e})})}}),Object(s.b)("editMessage",(e,t,a)=>{const{serverTimeOffset:s}=e,{text:n,entities:c}=a,r=Object(o.z)(e);if(!r)return;const{chatId:i,threadId:l,type:d}=r,b=Object(o.g)(e,i),u=Object(o.E)(e,i,l,d);b&&u&&(Object(p.a)("editMessage",{chat:b,message:u,text:n,entities:c,noWebPage:Object(o.db)(e,i,l),serverTimeOffset:s}),t.setEditingId({messageId:void 0}))}),Object(s.b)("cancelSendingMessage",(e,t,a)=>{const{chatId:s,messageId:n}=a,c=Object(o.l)(e,s,n),r=c&&M.get(c.previousLocalId||c.id);r&&Object(p.b)(r),t.apiUpdate({"@type":"deleteMessages",ids:[n],chatId:s})}),Object(s.b)("saveDraft",(e,t,a)=>{const{chatId:s,threadId:n,draft:c}=a;if(!c)return;const{text:i,entities:l}=c,d=Object(o.g)(e,s);return n===b.MAIN_THREAD_ID&&Object(p.a)("saveDraft",{chat:d,text:i,entities:l,replyToMsgId:Object(o.ob)(e,s,n)}),e=Object(r.y)(e,s,n,"draft",c),e=Object(r.I)(e,s,{draftDate:Math.round(Date.now()/1e3)})}),Object(s.b)("clearDraft",(e,t,a)=>{const{chatId:s,threadId:n,localOnly:c}=a;if(!Object(o.C)(e,s,n))return;const i=Object(o.g)(e,s);return c||n!==b.MAIN_THREAD_ID||Object(p.a)("clearDraft",i),e=Object(r.y)(e,s,n,"draft",void 0),e=Object(r.I)(e,s,{draftDate:void 0})}),Object(s.b)("toggleMessageWebPage",(e,t,a)=>{const{chatId:s,threadId:n,noWebPage:c}=a;return Object(r.y)(e,s,n,"noWebPage",c)}),Object(s.b)("pinMessage",(e,t,a)=>{const s=Object(o.s)(e);if(!s)return;const{messageId:n,isUnpin:c,isOneSide:r,isSilent:i}=a;Object(p.a)("pinMessage",{chat:s,messageId:n,isUnpin:c,isOneSide:r,isSilent:i})}),Object(s.b)("unpinAllMessages",(e,t,a)=>{const n=Object(o.g)(e,a.chatId);n&&async function(e){await Object(p.a)("unpinAllMessages",{chat:e});let t=Object(s.e)();t=Object(r.y)(t,e.id,b.MAIN_THREAD_ID,"pinnedIds",[]),Object(s.g)(t)}(n)}),Object(s.b)("deleteMessages",(e,t,a)=>{const{messageIds:s,shouldDeleteForAll:n}=a,c=Object(o.z)(e);if(!c)return;const{chatId:r,threadId:i}=c,l=Object(o.g)(e,r);Object(p.a)("deleteMessages",{chat:l,messageIds:s,shouldDeleteForAll:n});const d=Object(o.D)(e,r,i);s.includes(d)&&t.setEditingId({messageId:void 0})}),Object(s.b)("deleteScheduledMessages",(e,t,a)=>{const{messageIds:s}=a,n=Object(o.z)(e);if(!n)return;const{chatId:c}=n,r=Object(o.g)(e,c);Object(p.a)("deleteScheduledMessages",{chat:r,messageIds:s});const i=Object(o.F)(e,c);s.includes(i)&&t.setEditingId({messageId:void 0})}),Object(s.b)("deleteHistory",(e,t,a)=>{(async()=>{const{chatId:s,shouldDeleteForAll:n}=a,c=Object(o.g)(e,s);if(!c)return;const r=c.lastMessage&&c.lastMessage.id;await Object(p.a)("deleteHistory",{chat:c,shouldDeleteForAll:n,maxId:r});const i=Object(o.z)(e);i&&i.chatId===s&&t.openChat({id:void 0})})()}),Object(s.b)("reportMessages",(e,t,a)=>{(async()=>{const{messageIds:s,reason:n,description:c}=a,r=Object(o.z)(e);if(!r)return;const{chatId:i}=r,l=Object(o.g)(e,i),d=await Object(p.a)("reportMessages",{peer:l,messageIds:s,reason:n,description:c});t.showNotification({message:d?"Thank you! Your report will be reviewed by our team.":"Error occured while submiting report. Please, try again later."})})()}),Object(s.b)("markMessageListRead",(e,t,a)=>{const{serverTimeOffset:s}=e,n=Object(o.z)(e);if(!n)return;const{chatId:c,threadId:r}=n,i=Object(o.Gb)(e,c,r);if(!i)return;const{maxId:l}=a;S(()=>{Object(p.a)("markMessageListRead",{serverTimeOffset:s,chat:i,threadId:r,maxId:l})})}),Object(s.b)("markMessagesRead",(e,t,a)=>{const s=Object(o.s)(e);if(!s)return;const{messageIds:n}=a;Object(p.a)("markMessagesRead",{chat:s,messageIds:n})}),Object(s.b)("loadWebPagePreview",(e,t,a)=>{const{text:n}=a;!async function(e){const t=await Object(p.a)("fetchWebPagePreview",{message:e});Object(s.g)({...Object(s.e)(),webPagePreview:t})}(n)}),Object(s.b)("clearWebPagePreview",e=>{if(e.webPagePreview)return{...e,webPagePreview:void 0}}),Object(s.b)("sendPollVote",(e,t,a)=>{const{chatId:s,messageId:n,options:c}=a,r=Object(o.g)(e,s);r&&Object(p.a)("sendPollVote",{chat:r,messageId:n,options:c})}),Object(s.b)("loadPollOptionResults",(e,t,a)=>{const{chat:n,messageId:c,option:o,offset:i,limit:l,shouldResetVoters:d}=a;!async function(e,t,a,n,c,o){const i=await Object(p.a)("loadPollOptionResults",{chat:e,messageId:t,option:a,offset:n,limit:c});if(!i)return;let l=Object(s.e)();l=Object(r.g)(l,Object(h.c)(i.users,"id"));const{voters:d}=l.pollResults;Object(s.g)({...l,pollResults:{...l.pollResults,voters:{...d,[a]:[...!o&&d&&d[a]?d[a]:[],...i&&i.users.map(e=>e.id)].filter((e,t,a)=>a.indexOf(e)===t)},offsets:{...l.pollResults.offsets?l.pollResults.offsets:{},[a]:i.nextOffset||""}}})}(n,c,o,i,l,d)}),Object(s.b)("forwardMessages",e=>{const{fromChatId:t,messageIds:a,toChatId:n}=e.forwardMessages,c=t?Object(o.g)(e,t):void 0,r=n?Object(o.g)(e,n):void 0,i=t&&a?a.sort((e,t)=>e-t).map(a=>Object(o.l)(e,t,a)).filter(Boolean):void 0;c&&r&&i&&i.length&&function(e,t,a){Object(p.a)("forwardMessages",{fromChat:e,toChat:t,messages:a,serverTimeOffset:Object(s.e)().serverTimeOffset}),Object(s.g)({...Object(s.e)(),forwardMessages:{}})}(c,r,i)}),Object(s.b)("loadScheduledHistory",e=>{const t=Object(o.s)(e);if(!t)return;const{hash:a}=e.scheduledMessages.byChatId[t.id]||{};!async function(e,t){const a=await Object(p.a)("fetchScheduledHistory",{chat:e,hash:t});if(!a)return;const{hash:n,messages:c}=a,o=Object(h.c)(c,"id"),i=Object.keys(o).map(Number).sort((e,t)=>t-e);let l=Object(s.e)();l=Object(r.v)(l,e.id,o,n),l=Object(r.y)(l,e.id,b.MAIN_THREAD_ID,"scheduledIds",i),Object(s.g)(l)}(t,a)}),Object(s.b)("sendScheduledMessages",(e,t,a)=>{const{chatId:s,id:n}=a,c=Object(o.g)(e,s);c&&Object(p.a)("sendScheduledMessages",{chat:c,ids:[n]})}),Object(s.b)("rescheduleMessage",(e,t,a)=>{const{chatId:s,messageId:n,scheduledAt:c}=a,r=Object(o.g)(e,s),i=r&&Object(o.rb)(e,r.id,n);r&&i&&Object(p.a)("rescheduleMessage",{chat:r,message:i,scheduledAt:c})}),Object(s.b)("requestThreadInfoUpdate",(e,t,a)=>{const{chatId:s,threadId:n}=a,c=Object(o.Gb)(e,s,n);c&&Object(p.a)("requestThreadInfoUpdate",{chat:c,threadId:n})}),Object(s.b)("loadPinnedMessages",(e,t,a)=>{const{chatId:n}=a,c=Object(o.g)(e,n);c&&async function(e){const t=await Object(p.a)("fetchPinnedMessages",{chat:e});if(!t)return;const{messages:a,chats:n,users:c}=t,o=Object(h.c)(a,"id"),i=Object.keys(o).map(Number).sort((e,t)=>t-e);let l=Object(s.e)();l=Object(r.b)(l,e.id,o),l=Object(r.y)(l,e.id,b.MAIN_THREAD_ID,"pinnedIds",i),l=Object(r.g)(l,Object(h.c)(c,"id")),l=Object(r.c)(l,Object(h.c)(n,"id")),Object(s.g)(l)}(c)});var A=a(53);const P=Object(f.h)(e=>e(),500,!1);async function R(e,t){const a=await Object(p.a)("searchGifs",{query:e,offset:t});a&&Object(s.g)(Object(r.R)(Object(s.e)(),!t,a.gifs,a.nextOffset))}Object(s.b)("loadStickerSets",e=>{const{hash:t}=e.stickers.added||{};!async function(e=0){const t=await Object(p.a)("fetchStickerSets",{hash:e});if(!t)return;Object(s.g)(Object(r.jb)(Object(s.e)(),"added",t.hash,t.sets))}(t)}),Object(s.b)("loadAddedStickers",(e,t)=>{const{setIds:a}=e.stickers.added;a&&a.length&&(async()=>{for(let e=0;e0&&await Object(f.f)(500)})()}),Object(s.b)("loadRecentStickers",e=>{const{hash:t}=e.stickers.recent||{};!async function(e=0){const t=await Object(p.a)("fetchRecentStickers",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,recent:t}})}(t)}),Object(s.b)("loadFavoriteStickers",e=>{const{hash:t}=e.stickers.favorite||{};!async function(e=0){const t=await Object(p.a)("fetchFavoriteStickers",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,favorite:t}})}(t)}),Object(s.b)("loadGreetingStickers",e=>{const{hash:t}=e.stickers.greeting||{};(async()=>{const e=await Object(p.a)("fetchStickersForEmoji",{emoji:"👋⭐️",hash:t});if(!e)return;const a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,greeting:{hash:e.hash,stickers:e.stickers.filter(e=>"👋"===e.emoji)}}})})()}),Object(s.b)("loadFeaturedStickers",e=>{const{hash:t}=e.stickers.featured||{};!async function(e=0){const t=await Object(p.a)("fetchFeaturedStickers",{hash:e});if(!t)return;Object(s.g)(Object(r.jb)(Object(s.e)(),"featured",t.hash,t.sets))}(t)}),Object(s.b)("loadStickers",(e,t,a)=>{const{stickerSetId:n}=a;let{stickerSetAccessHash:c}=a;if(!c){const t=Object(o.zb)(e,n);if(!t)return;c=t.accessHash}!async function(e,t){const a=await Object(p.a)("fetchStickers",{stickerSetId:e,accessHash:t});if(!a)return;const{set:n,stickers:c,packs:o}=a;let i=Object(s.e)();i=Object(r.ib)(i,n.id,{...n,stickers:c,packs:o});const l=i.stickers.forEmoji.emoji;l&&o[l]&&(i=Object(r.p)(i));Object(s.g)(i)}(n,c)}),Object(s.b)("loadAnimatedEmojis",()=>{!async function(){const e=await Object(p.a)("fetchAnimatedEmojis");if(!e)return;const{set:t,stickers:a}=e;Object(s.g)(Object(r.r)(Object(s.e)(),{...t,stickers:a}))}()}),Object(s.b)("loadSavedGifs",e=>{const{hash:t}=e.gifs.saved;!async function(e=0){const t=await Object(p.a)("fetchSavedGifs",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,gifs:{...a.gifs,saved:t}})}(t)}),Object(s.b)("faveSticker",(e,t,a)=>{const{sticker:s}=a;s&&Object(p.a)("faveSticker",{sticker:s})}),Object(s.b)("unfaveSticker",(e,t,a)=>{const{sticker:n}=a;n&&function(e){const t=Object(s.e)();Object(s.g)({...t,stickers:{...t.stickers,favorite:{...t.stickers.favorite,stickers:t.stickers.favorite.stickers.filter(({id:t})=>t!==e.id)}}}),Object(p.a)("faveSticker",{sticker:e,unfave:!0})}(n)}),Object(s.b)("toggleStickerSet",(e,t,a)=>{const{stickerSetId:s}=a,n=Object(o.zb)(e,s);if(!n)return;const{accessHash:c,installedDate:r}=n;Object(p.a)(r?"uninstallStickerSet":"installStickerSet",{stickerSetId:s,accessHash:c})}),Object(s.b)("loadEmojiKeywords",(e,t,a)=>{const{language:n}=a;let c=e.emojiKeywords[n];c&&c.isLoading||(Object(s.g)({...e,emojiKeywords:{...e.emojiKeywords,[n]:{...c,isLoading:!0}}}),(async()=>{const t=await Object(p.a)("fetchEmojiKeywords",{language:n,fromVersion:c?c.version:0});e=Object(s.e)(),c=e.emojiKeywords[n],t?Object(s.g)({...e,emojiKeywords:{...e.emojiKeywords,[n]:{isLoading:!1,version:t.version,keywords:{...c&&c.keywords,...t.keywords}}}}):Object(s.g)({...e,emojiKeywords:{...e.emojiKeywords,[n]:{...c,isLoading:!1}}})})())}),Object(s.b)("setStickerSearchQuery",(e,t,a)=>{const{query:n}=a;n&&P(()=>{!async function(e,t=0){const a=await Object(p.a)("searchStickers",{query:e,hash:t});if(!a)return;const n=Object(s.e)(),{setsById:c,added:o}=n.stickers,i=a.sets.map(({id:e})=>e);o.setIds&&o.setIds.forEach(t=>{if(!i.includes(t)){const{title:a}=c[t]||{};a&&Object(A.a)(a,e)&&i.unshift(t)}});Object(s.g)(Object(r.jb)(n,"search",a.hash,a.sets,i))}(n)})}),Object(s.b)("setGifSearchQuery",(e,t,a)=>{const{query:s}=a;"string"==typeof s&&P(()=>{R(s)})}),Object(s.b)("searchMoreGifs",e=>{const{query:t,offset:a}=e.gifs.search;"string"==typeof t&&P(()=>{R(t,a)})}),Object(s.b)("loadStickersForEmoji",(e,t,a)=>{const{emoji:n}=a,{hash:c}=e.stickers.forEmoji;P(()=>{!async function(e,t=0){let a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,forEmoji:{...a.stickers.forEmoji,emoji:e}}});const n=await Object(p.a)("fetchStickersForEmoji",{emoji:e,hash:t});if(a=Object(s.e)(),!n||a.stickers.forEmoji.emoji!==e)return;a=Object(r.kb)(a,e,n.stickers,n.hash),Object(s.g)(a)}(n,c)})}),Object(s.b)("clearStickersForEmoji",e=>({...e,stickers:{...e.stickers,forEmoji:{}}}));var x=a(30);const L=Object(f.h)(e=>e(),500,!1);async function B(e="",t,a,c,i,l){let d;if(c){const s=await Object(p.a)("searchMessagesLocal",{chatOrUser:c,query:e,type:t,limit:n.G,offsetId:a,minDate:l,maxDate:i});if(s){const{messages:e,users:t,totalCount:a,nextOffsetId:n}=s;d={messages:e,users:t,chats:[],totalCount:a,nextRate:n}}}else d=await Object(p.a)("searchMessagesGlobal",{query:e,offsetRate:a,limit:n.G,type:t,maxDate:i,minDate:l});let b=Object(s.e)();const u=Object(o.u)(b);if(!d||""!==e&&e!==u)return void Object(s.g)(Object(r.U)(b,{messages:!1}));const{messages:m,users:O,chats:j,totalCount:g,nextRate:f}=d;j.length&&(b=Object(r.c)(b,Object(h.c)(j,"id"))),O.length&&(b=Object(r.g)(b,Object(h.c)(O,"id"))),m.length&&(b=Object(r.d)(b,m)),b=Object(r.V)(b,m,g,t,f),Object(s.g)(b)}async function D(){const e=await Object(p.a)("fetchChats",{limit:n.l,archived:!0,withPinned:!0,serverTimeOffset:Object(s.e)().serverTimeOffset});if(!e)return;let t=Object(s.e)();t=Object(r.rb)(t,Object(h.c)(e.users,"id")),t=Object(r.N)(t,Object(h.c)(e.chats,"id")),t=Object(r.s)(t,"archived",e.chatIds),t=Object(r.K)(t,"archived",e),Object(s.g)(t)}async function F(){let e=Object(s.e)();const{recentlyFoundChatIds:t}=e.globalSearch,{userIds:a}=e.contactList||{};if(!(a&&a.length||t&&t.length))return;const n=[...t||[],...a||[]].map(t=>Object(o.Jb)(e,t)).filter(Boolean),c=await Object(p.a)("fetchUsers",{users:n});c&&(e=Object(s.e)(),e=Object(r.rb)(e,Object(h.c)(c,"id")),Object(s.g)(e))}function U(e){return Object(p.a)("fetchMessages",{chat:e,threadId:b.MAIN_THREAD_ID,offsetId:e.lastReadInboxMessageId,addOffset:-(Math.round(n.gb/2)+1),limit:n.gb})}Object(s.b)("setGlobalSearchQuery",(e,t,a)=>{const{chatId:n}=e.globalSearch,{query:c}=a;c&&!n&&L(()=>{!async function(e){const t=await Object(p.a)("searchChats",{query:e});let a=Object(s.e)();const n=Object(o.u)(a);if(!t||!n||e!==n)return void Object(s.g)(Object(r.U)(a,{chats:!1}));const{localChats:c,localUsers:i,globalChats:l,globalUsers:d}=t;(c.length||l.length)&&(a=Object(r.c)(a,Object(h.c)([...c,...l],"id")));(i.length||d.length)&&(a=Object(r.g)(a,Object(h.c)([...i,...d],"id")));a=Object(r.U)(a,{chats:!1}),a=Object(r.S)(a,{localResults:{chatIds:c.map(({id:e})=>e),userIds:i.map(({id:e})=>e)},globalResults:{...a.globalSearch.globalResults,chatIds:d.map(({id:e})=>e),userIds:l.map(({id:e})=>e)}}),Object(s.g)(a)}(c)})}),Object(s.b)("setGlobalSearchDate",(e,t,a)=>{const{date:n}=a,c=n?Object(x.m)(n):n,i=Object(r.S)(e,{date:n,query:"",resultsByType:{...e.globalSearch.resultsByType,text:{totalCount:void 0,foundIds:[],nextOffsetId:0}}});Object(s.g)(i);const{chatId:l}=e.globalSearch;B("","text",void 0,l?Object(o.g)(e,l):void 0,c,n)}),Object(s.b)("searchMessagesGlobal",(e,t,a)=>{const{query:s,resultsByType:n,chatId:c,date:r}=e.globalSearch,i=r?Object(x.m)(r):r,{type:l}=a,{nextOffsetId:d}=n&&n[l]||{};B(s,l,d,c?Object(o.g)(e,c):void 0,i,r)}),Object(s.b)("searchTextMessagesLocal",e=>{const{chatId:t,threadId:a}=Object(o.z)(e)||{},c=t?Object(o.g)(e,t):void 0,i=Object(o.B)(e);if(!c||!i||!a)return;const{query:l,results:d}=i,u=d?d.nextOffsetId:void 0;let m;if(a!==b.MAIN_THREAD_ID){const s=Object(o.Fb)(e,t,a);m=s?s.topMessageId:void 0}!async function(e,t,a,c,i){const l=await Object(p.a)("searchMessagesLocal",{chatOrUser:e,type:"text",query:c,topMessageId:a,limit:n.ib,offsetId:i});if(!l)return;const{messages:d,users:b,totalCount:u,nextOffsetId:m}=l,O=Object(h.c)(d,"id"),j=Object.keys(O).map(Number);let g=Object(s.e)();const f=Object(o.B)(g);if(!f||c&&c!==f.query)return;g=Object(r.b)(g,e.id,O),g=Object(r.g)(g,Object(h.c)(b,"id")),g=Object(r.ab)(g,e.id,t,j,u,m),Object(s.g)(g)}(c,a,m,l,u)}),Object(s.b)("searchMediaMessagesLocal",e=>{const t=Object(o.x)(e),a=t?e.users.byId[t]||e.chats.byId[t]:void 0,c=Object(o.w)(e);if(!a||!c)return;const{currentType:i,resultsByType:l}=c,d=i&&l&&l[i],b=d?d.nextOffsetId:void 0;i&&async function(e,t,a){const c=await Object(p.a)("searchMessagesLocal",{chatOrUser:e,type:t,limit:n.Ab,offsetId:a});if(!c)return;const{messages:i,users:l,totalCount:d,nextOffsetId:b}=c,u=Object(h.c)(i,"id"),m=Object.keys(u).map(Number);let O=Object(s.e)();if(!Object(o.w)(O))return;O=Object(r.b)(O,e.id,u),O=Object(r.g)(O,Object(h.c)(l,"id")),O=Object(r.X)(O,e.id,t,m,d,b),Object(s.g)(O)}(a,i,b)}),Object(s.b)("searchMessagesByDate",(e,t,a)=>{const{timestamp:n}=a,{chatId:c}=Object(o.z)(e)||{};if(!c)return;const r=Object(o.g)(e,c);r&&async function(e,t){const a=await Object(p.a)("findFirstMessageIdAfterDate",{chat:e,timestamp:t});if(!a)return;Object(s.d)().focusMessage({chatId:e.id,messageId:a})}(r,n)}),Object(s.b)("checkPublicLink",(e,t,a)=>{const{chatId:n}=Object(o.z)(e)||{};if(!n)return;if(e.management.progress===u.f.InProgress)return;const{username:c}=a;(async()=>{e=Object(r.cb)(e,u.f.InProgress),e=Object(r.bb)(e,n,{isUsernameAvailable:void 0}),Object(s.g)(e);const t=await Object(p.a)("checkChatUsername",{username:c});e=Object(s.e)(),e=Object(r.cb)(e,t?u.f.Complete:u.f.Error),e=Object(r.bb)(e,n,{isUsernameAvailable:t}),Object(s.g)(e)})()}),Object(s.b)("updatePublicLink",(e,t,a)=>{const{chatId:n}=Object(o.z)(e)||{};let c=n&&Object(o.g)(e,n);if(!n||!c)return;const{username:i}=a;(async()=>{if(e=Object(r.cb)(e,u.f.InProgress),Object(s.g)(e),Object(l.lb)(c)){if(c=await Object(p.a)("migrateChat",c),!c)return;t.openChat({id:c.id})}const a=await Object(p.a)("setChatUsername",{chat:c,username:i});e=Object(s.e)(),e=Object(r.cb)(e,a?u.f.Complete:u.f.Error),e=Object(r.bb)(e,n,{isUsernameAvailable:void 0}),Object(s.g)(e)})()}),Object(s.b)("updatePrivateLink",e=>{const{chatId:t}=Object(o.z)(e)||{},a=t&&Object(o.g)(e,t);t&&a&&Object(p.a)("updatePrivateLink",{chat:a})}),Object(s.b)("sync",(e,t)=>{!async function(e){n.r&&console.log(">>> START SYNC");await Object(p.a)("fetchCurrentUser");const t=await async function(){const e=await Object(p.a)("fetchChats",{limit:n.l,withPinned:!0,serverTimeOffset:Object(s.e)().serverTimeOffset});if(!e)return;let t=Object(s.e)();const{recentlyFoundChatIds:a}=t.globalSearch,{userIds:c}=t.contactList||{},{currentUserId:i}=t,d=[...a||[],...c||[],...i?[i]:[]],u=d.map(e=>Object(o.Jb)(t,e)).filter(Boolean),m=d.map(e=>Object(o.g)(t,e)).filter(Boolean),{chatId:O}=Object(o.z)(t)||{};if(O){const e=Object(o.g)(t,O);if(e&&!d.includes(O)&&m.push(e),Object(l.ob)(O)){const e=Object(o.Jb)(t,O);e&&!d.includes(O)&&u.push(e)}}u.push(...e.users),m.push(...e.chats),t=Object(r.t)(t,Object(h.c)(m,"id")),t=Object(r.s)(t,"active",e.chatIds),t={...t,chats:{...t.chats}},t=Object(r.K)(t,"active",e),Object.keys(e.draftsById).map(Number).forEach(a=>{t=Object(r.y)(t,a,b.MAIN_THREAD_ID,"draft",e.draftsById[a])}),Object.keys(e.replyingToById).map(Number).forEach(a=>{t=Object(r.y)(t,a,b.MAIN_THREAD_ID,"replyingToId",e.replyingToById[a])}),Object(s.g)(t),O&&!t.chats.byId[O]&&Object(s.d)().openChat({id:void 0});return u}();await async function(e){let t=!1,a=e||[],n=Object(s.e)();const{chatId:c,threadId:i}=Object(o.z)(n)||{},l=Object.keys(n.messages.byChatId).map(Number).reduce((e,t)=>{const a=Object(o.C)(n,t,b.MAIN_THREAD_ID);return a?{...e,[t]:a}:e},{});if(c){const e=await U(n.chats.byId[c]);n=Object(s.e)();const{chatId:l}=Object(o.z)(n)||{},d=i&&Object(o.Fb)(n,c,i);if(e&&l===c){const s=n.messages.byChatId[c],o=Object(h.c)(e.messages,"id"),l=Object.keys(o).map(Number);if(n={...n,messages:{...n.messages,byChatId:{[c]:{byId:o,threadsById:{[b.MAIN_THREAD_ID]:{...s&&s.threadsById[b.MAIN_THREAD_ID],listedIds:l,viewportIds:l,outlyingIds:void 0}}}}}},i&&d&&d.originChannelId){const{originChannelId:e}=d,t=n.messages.byChatId[e],a=await U(n.chats.byId[e]);if(a){const e=Object(h.c)(a.messages,"id"),r=Object.keys(e).map(Number);n={...n,messages:{...n.messages,byChatId:{...n.messages.byChatId,[d.originChannelId]:{byId:e,threadsById:{[b.MAIN_THREAD_ID]:{...t&&t.threadsById[b.MAIN_THREAD_ID],listedIds:r,viewportIds:r,outlyingIds:void 0}}},[c]:{...n.messages.byChatId[c],threadsById:{...n.messages.byChatId[c].threadsById,[i]:{...s&&s.threadsById[i],outlyingIds:void 0}}}}}}}}n=Object(r.N)(n,Object(h.c)(e.chats,"id")),n=Object(r.mb)(n,c,e.threadInfos),t=!0,a=Array.prototype.concat(a,e.users)}}t||(n={...n,messages:{...n.messages,byChatId:{}}});Object.keys(l).map(Number).forEach(e=>{n=Object(r.y)(n,e,b.MAIN_THREAD_ID,"draft",l[e])}),e?n=Object(r.z)(n,Object(h.c)(a,"id")):a&&(n=Object(r.rb)(n,Object(h.c)(a,"id")));Object(s.g)(n);const{chatId:d,messageId:u}=n.audioPlayer;d&&u&&!Object(o.l)(n,d,u)&&Object(s.d)().closeAudioPlayer()}(t),Object(s.g)({...Object(s.e)(),lastSyncTime:Date.now()}),n.r&&console.log(">>> FINISH SYNC");e()}(t.afterSync)}),Object(s.b)("afterSync",(e,t)=>{!async function(e){n.r&&console.log(">>> START AFTER-SYNC");e.loadFavoriteStickers(),await Promise.all([F(),D()]),await Object(p.a)("fetchCurrentUser"),n.r&&console.log(">>> FINISH AFTER-SYNC")}(t)});const H=Object(f.a)(e=>e(),500,!1,!0),q=Object(f.h)(e=>e(),500,!1);function G(e,t,a){return{...e,inlineBots:{...e.inlineBots,byUsername:{...e.inlineBots.byUsername,[t]:a}}}}function _(e,t){return{...e,inlineBots:{...e.inlineBots,isLoading:t}}}Object(s.b)("loadFullUser",(e,t,a)=>{const{userId:s}=a,n=Object(o.Jb)(e,s);if(!n)return;const{id:c,accessHash:r}=n;H(()=>Object(p.a)("fetchFullUser",{id:c,accessHash:r}))}),Object(s.b)("loadUser",(e,t,a)=>{const{userId:n}=a,c=Object(o.Jb)(e,n);c&&(async()=>{const t=await Object(p.a)("fetchUsers",{users:[c]});t&&(e=Object(s.e)(),e=Object(r.rb)(e,Object(h.c)(t,"id")),Object(s.g)(e))})()}),Object(s.b)("loadTopUsers",e=>{const{serverTimeOffset:t,topPeers:{hash:a,lastRequestedAt:n}}=e;(!n||Date.now()/1e3+t-n>60)&&async function(e){const t=await Object(p.a)("fetchTopUsers",{hash:e});if(!t)return;const{hash:a,ids:n,users:c}=t;let o=Object(s.e)();o=Object(r.g)(o,Object(h.c)(c,"id")),o={...o,topPeers:{...o.topPeers,hash:a,userIds:n,lastRequestedAt:Date.now()/1e3+o.serverTimeOffset}},Object(s.g)(o)}(a)}),Object(s.b)("loadContactList",e=>{const{hash:t}=e.contactList||{};!async function(e){const t=await Object(p.a)("fetchContactList",{hash:e});if(!t)return;let a=Object(r.g)(Object(s.e)(),Object(h.c)(t.users,"id"));a=Object(r.c)(a,Object(h.c)(t.chats,"id"));const n=e=>e.lastName||e.firstName||"",c=new Intl.Collator("en-US"),o=t.users.sort((e,t)=>c.compare(n(e),n(t))).filter(e=>!e.isSelf);Object(s.g)({...a,contactList:{hash:t.hash,userIds:o.map(e=>e.id)}})}(t)}),Object(s.b)("loadCurrentUser",()=>{Object(p.a)("fetchCurrentUser")}),Object(s.b)("updateContact",(e,t,a)=>{const{userId:n,isMuted:c,firstName:i,lastName:l}=a;!async function(e,t,a,n){const c=Object(s.e)(),i=Object(o.Jb)(c,e);if(!i)return;Object(s.d)().updateChatMutedState({chatId:e,isMuted:t}),Object(s.g)(Object(r.cb)(Object(s.e)(),u.f.InProgress));await Object(p.a)("updateContact",{phone:i.phoneNumber,firstName:a,lastName:n})&&Object(s.g)(Object(r.ob)(Object(s.e)(),i.id,{firstName:a,lastName:n}));Object(s.g)(Object(r.cb)(Object(s.e)(),u.f.Complete))}(n,c,i,l)}),Object(s.b)("deleteUser",(e,t,a)=>{const{userId:n}=a;!async function(e){const t=Object(s.e)(),a=Object(o.Jb)(t,e);if(!a)return;const{id:n,accessHash:c}=a;await Object(p.a)("deleteUser",{id:n,accessHash:c})}(n)}),Object(s.b)("loadProfilePhotos",(e,t,a)=>{const{profileId:n}=a,c=Object(l.ob)(n),i=c?Object(o.Jb)(e,n):void 0,d=c?void 0:Object(o.g)(e,n);(async()=>{const e=await Object(p.a)("fetchProfilePhotos",i,d);if(!e||!e.photos)return;let t=Object(s.e)();c?t=Object(r.ob)(t,n,{photos:e.photos}):(t=Object(r.g)(t,Object(h.c)(e.users,"id")),t=Object(r.I)(t,n,{photos:e.photos})),Object(s.g)(t)})()}),Object(s.b)("setUserSearchQuery",(e,t,a)=>{const{query:n}=a;n&&q(()=>{!async function(e){const t=await Object(p.a)("searchChats",{query:e});let a=Object(s.e)();const n=a.userSearch.query;if(!t||!n||e!==n)return void Object(s.g)(Object(r.qb)(a,!1));const{localUsers:c,globalUsers:o}=t;let i,l;c.length&&(a=Object(r.g)(a,Object(h.c)(c,"id")),i=c.map(({id:e})=>e));o.length&&(a=Object(r.g)(a,Object(h.c)(o,"id")),l=o.map(({id:e})=>e));a=Object(r.qb)(a,!1),a=Object(r.pb)(a,{localUserIds:i,globalUserIds:l}),Object(s.g)(a)}(n)})});const z=Object(f.a)(e=>e(),500,!1);async function $(e,t,a){await Object(p.a)("sendMessage",{chat:e,text:a})}Object(s.b)("clickInlineButton",(e,t,a)=>{const{button:c}=a;switch(c.type){case"command":t.sendBotCommand({command:c.value});break;case"url":c.value.match(n.tb)||c.value.match(n.ub)?t.openTelegramLink({url:c.value}):t.toggleSafeLinkModal({url:c.value});break;case"callback":{const t=Object(o.s)(e);if(!t)return;!async function(e,t,a){const n=await Object(p.a)("answerCallbackButton",{chatId:e.id,accessHash:e.accessHash,messageId:t,data:a});if(!n||!n.message)return;const{message:c,alert:r}=n;r?Object(s.d)().showDialog({data:{message:c}}):Object(s.d)().showNotification({message:c})}(t,c.messageId,c.value);break}case"requestPoll":t.openPollModal();break;case"buy":{const a=Object(o.s)(e),{messageId:s,value:n}=c;if(!a)return;n?t.getReceipt({receiptMessageId:n,chatId:a.id,messageId:s}):(t.getPaymentForm({messageId:s}),t.setInvoiceMessageInfo(Object(o.l)(e,a.id,s)),t.openPaymentModal({messageId:s}));break}}}),Object(s.b)("sendBotCommand",(e,t,a)=>{const{command:s,chatId:n}=a,{currentUserId:c}=e,r=n?Object(o.g)(e,n):Object(o.s)(e);c&&r&&$(r,c,s)}),Object(s.b)("restartBot",(e,t,a)=>{const{chatId:n}=a,{currentUserId:c}=e,i=Object(o.s)(e),l=c&&Object(o.h)(e,n);c&&i&&l&&(async()=>{await Object(p.a)("unblockContact",l.id,l.accessHash)&&(Object(s.g)(Object(r.q)(Object(s.e)(),l.id)),$(i,c,"/start"))})()}),Object(s.b)("loadTopInlineBots",e=>{const{serverTimeOffset:t}=e,{hash:a,lastRequestedAt:n}=e.topInlineBots;n&&Date.now()+t-n<6e4||(async()=>{const e=await Object(p.a)("fetchTopInlineBots",{hash:a});if(!e)return;const{hash:t,ids:n,users:c}=e;let o=Object(s.e)();o=Object(r.g)(o,Object(h.c)(c,"id")),o={...o,topInlineBots:{...o.topInlineBots,hash:t,userIds:n,lastRequestedAt:Date.now()}},Object(s.g)(o)})()}),Object(s.b)("queryInlineBot",(e,t,a)=>{const{chatId:n,username:c,query:i,offset:l}=a;(async()=>{let t=e.inlineBots.byUsername[c];if(!1!==t){if(void 0===t){const{user:a,chat:n}=await Object(p.a)("fetchInlineBot",{username:c})||{};if(e=Object(s.e)(),!a||!n)return void Object(s.g)(G(e,c,!1));e=Object(r.g)(e,{[a.id]:a}),e=Object(r.c)(e,{[n.id]:n}),t={id:a.id,query:"",offset:"",switchPm:void 0,canLoadMore:!0,results:[]},e=G(e,c,t),Object(s.g)(e)}(i!==t.query||t.canLoadMore)&&z(()=>{!async function({username:e,inlineBotData:t,chatId:a,query:n,offset:c}){let r=Object(s.e)();const i=Object(o.Jb)(r,t.id),l=Object(o.g)(r,a);if(!i||!l)return;const d=t.query!==n;r=_(r,!0),r=G(r,e,{...t,query:n,...d&&{offset:void 0,results:[]}}),Object(s.g)(r);const b=await Object(p.a)("fetchInlineBotResults",{bot:i,chat:l,query:n,offset:d?void 0:c}),u=r.inlineBots.byUsername[e];if(r=_(Object(s.e)(),!1),!b||!u||n!==u.query)return void Object(s.g)(r);const m=new Set((u.results||[]).map(e=>e.id)),h=b.results.filter(e=>!m.has(e.id));r=G(r,e,{...u,help:b.help,...h.length&&{isGallery:b.isGallery},...b.switchPm&&{switchPm:b.switchPm},canLoadMore:b.results.length>0&&Boolean(b.nextOffset),results:""===u.offset||u.offset===b.nextOffset?b.results:(u.results||[]).concat(h),offset:h.length?b.nextOffset:""}),Object(s.g)(r)}({username:c,inlineBotData:t,chatId:n,query:i,offset:l})})}})()}),Object(s.b)("sendInlineBotResult",(e,t,a)=>{const{id:s,queryId:n}=a,c=Object(o.z)(e);if(!c||!s)return;const{chatId:r,threadId:i}=c,l=Object(o.g)(e,r);t.setReplyingToId({messageId:void 0}),t.clearWebPagePreview({chatId:r,threadId:i,value:!1}),Object(p.a)("sendInlineBotResult",{chat:l,resultId:s,queryId:n,replyingTo:Object(o.ob)(e,r,i)})}),Object(s.b)("resetInlineBot",(e,t,a)=>{const{username:n}=a;let c=e.inlineBots.byUsername[n];c&&(c={id:c.id,query:"",offset:"",switchPm:void 0,canLoadMore:!0,results:[]},Object(s.g)(G(e,n,c)))});a(88);Object(s.b)("loadPasswordInfo",()=>{(async()=>{const e=await Object(p.a)("getPasswordInfo");if(!e)return;let t=Object(s.e)();t=Object(r.w)(t,{hasPassword:e.hasPassword}),t=Object(r.nb)(t,{hint:e.hint}),Object(s.g)(t)})()}),Object(s.b)("checkPassword",(e,t,a)=>{const{currentPassword:n,onSuccess:c}=a;Object(s.g)(Object(r.nb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(p.a)("checkPassword",n);Object(s.g)(Object(r.nb)(Object(s.e)(),{isLoading:!1})),e&&c()})()}),Object(s.b)("clearPassword",(e,t,a)=>{const{currentPassword:n,onSuccess:c}=a;Object(s.g)(Object(r.nb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(p.a)("clearPassword",n);Object(s.g)(Object(r.nb)(Object(s.e)(),{isLoading:!1})),e&&c()})()}),Object(s.b)("updatePassword",(e,t,a)=>{const{currentPassword:n,password:c,hint:o,email:i,onSuccess:l}=a;Object(s.g)(Object(r.nb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(p.a)("updatePassword",n,c,o,i);Object(s.g)(Object(r.nb)(Object(s.e)(),{isLoading:!1})),e&&l()})()}),Object(s.b)("updateRecoveryEmail",(e,t,a)=>{const{currentPassword:n,email:c,onSuccess:o}=a;Object(s.g)(Object(r.nb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(p.a)("updateRecoveryEmail",n,c);Object(s.g)(Object(r.nb)(Object(s.e)(),{isLoading:!1,waitingEmailCodeLength:void 0})),e&&o()})()}),Object(s.b)("provideTwoFaEmailCode",(e,t,a)=>{const{code:s}=a;Object(p.a)("provideRecoveryEmailCode",s)}),Object(s.b)("clearTwoFaError",e=>Object(r.nb)(e,{error:void 0}));var V=a(61);Object(s.b)("validateRequestedInfo",(e,t,a)=>{const{requestInfo:n,saveInfo:c}=a,i=Object(o.ib)(e);i&&async function(e,t,a){const n=await Object(p.a)("validateRequestedInfo",{messageId:e,requestInfo:t,shouldSave:a});if(!n)return;const{id:c,shippingOptions:o}=n;if(!c)return;let i=Object(r.F)(Object(s.e)(),c);o?(i=Object(r.hb)(i,o),i=Object(r.D)(i,u.j.Shipping)):i=Object(r.D)(i,u.j.PaymentInfo);Object(s.g)(i)}(i,n,c)}),Object(s.b)("getPaymentForm",(e,t,a)=>{const{messageId:n}=a;n&&async function(e){const t=await Object(p.a)("getPaymentForm",{messageId:e});if(!t)return;let a=Object(r.C)(Object(s.e)(),t),n=u.j.PaymentInfo;a.payment.invoice&&(a.payment.invoice.shippingAddressRequested||a.payment.invoice.nameRequested||a.payment.invoice.phoneRequested||a.payment.invoice.emailRequested)&&(n=u.j.ShippingInfo);a=Object(r.D)(a,n),Object(s.g)(a)}(n)}),Object(s.b)("getReceipt",(e,t,a)=>{const{receiptMessageId:n,chatId:c,messageId:i}=a;i&&n&&c&&async function(e,t,a){const n=await Object(p.a)("getReceipt",t);if(!n)return;let c=Object(s.e)();const i=Object(o.l)(c,a,e);c=Object(r.E)(c,n,i),Object(s.g)(c)}(i,n,c)}),Object(s.b)("clearPaymentError",e=>{Object(s.g)({...e,payment:{...e.payment,error:void 0}})}),Object(s.b)("clearReceipt",e=>{Object(s.g)({...e,payment:{...e.payment,receipt:void 0}})}),Object(s.b)("sendCredentialsInfo",(e,t,a)=>{const n=Object(o.lb)(e);if(!n)return;const{credentials:c}=a,{data:i}=c;!async function(e,t){const a=function(e){const t=Object.keys(e).map(t=>`${t}=${e[t]}`).join("&");return t.length>0?"?"+t:""}({"card[number]":e.cardNumber,"card[exp_month]":e.expiryMonth,"card[exp_year]":e.expiryYear,"card[cvc]":e.cvv,"card[address_zip]":e.zip,"card[address_country]":e.country}),n=await fetch("https://api.stripe.com/v1/tokens"+a,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:"Bearer "+t}}),c=await n.json();if(c.error){const e=Object(V.b)(c.error),t=Object(s.e)();return void Object(s.g)({...t,payment:{...t.payment,error:{...e}}})}let o=Object(r.G)(Object(s.e)(),{type:c.type,id:c.id});o=Object(r.D)(o,u.j.Checkout),Object(s.g)(o)}(i,n)}),Object(s.b)("sendPaymentForm",(e,t,a)=>{const{shippingOptionId:n,saveCredentials:c}=a,i=Object(o.ib)(e),l=Object(o.jb)(e),d=Object(o.lb)(e),b=Object(o.Bb)(e);i&&d&&async function(e,t,a,n){if(await Object(p.a)("sendPaymentForm",{messageId:e,credentials:t,requestedInfoId:a,shippingOptionId:n})){const e=Object(r.i)(Object(s.e)());Object(s.g)(Object(r.j)(e))}}(i,{save:c,data:b},l,n)}),Object(s.b)("setPaymentStep",(e,t,a={})=>Object(r.D)(e,a.step||u.j.ShippingInfo)),Object(s.b)("setInvoiceMessageInfo",(e,t,a)=>Object(r.B)(e,a));a(89);var W=a(34),K=a(79);const Q=Object(f.h)(e=>e(),1e3,!0);Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateChat":{a.noTopChatsRequest||Object(o.M)(e,a.id)||t.loadTopChats();const n=Object(r.I)(e,a.id,a.chat,a.newProfilePhoto);Object(s.g)(n);const c=Object(o.r)(n);Q(()=>Object(K.a)(c));break}case"updateChatJoin":{const n=Object(o.k)(e,a.id);if(!n)break;e=Object(r.J)(e,n,[a.id]),e=Object(r.I)(e,a.id,{isNotJoined:!1}),Object(s.g)(e);const c=Object(o.g)(e,a.id);c&&t.requestChatUpdate({chatId:c.id});break}case"updateChatLeave":{const t=Object(o.k)(e,a.id);if(!t)break;const{[t]:n}=e.chats.listIds;n&&(e=Object(r.s)(e,t,n.filter(e=>e!==a.id))),e=Object(r.I)(e,a.id,{isNotJoined:!0}),Object(s.g)(e);break}case"updateChatInbox":Object(s.g)(Object(r.I)(e,a.id,a.chat));break;case"updateChatTypingStatus":{const{id:t,typingStatus:n}=a;Object(s.g)(Object(r.I)(e,t,{typingStatus:n})),setTimeout(()=>{const e=Object(s.e)(),a=Object(o.g)(e,t);a&&n&&a.typingStatus&&a.typingStatus.timestamp===n.timestamp&&Object(s.g)(Object(r.I)(e,t,{typingStatus:void 0}))},6e3);break}case"newMessage":{const{message:n}=a,{chatId:c,threadId:i,type:l}=Object(o.z)(e)||{};if(n.senderId===e.currentUserId&&!n.isFromScheduled)return;const d=Object(o.g)(e,a.chatId);if(!d)return;const u="thread"===l&&i===b.MAIN_THREAD_ID&&a.chatId===c;u?setTimeout(()=>{t.requestChatUpdate({chatId:a.chatId})},1e3):Object(s.g)(Object(r.I)(e,a.chatId,{unreadCount:d.unreadCount?d.unreadCount+1:1,...a.message.hasUnreadMention&&{unreadMentionsCount:d.unreadMentionsCount?d.unreadMentionsCount+1:1}}));const m=Object(o.r)(Object(s.e)());Object(K.a)(m),Object(W.b)({chat:d,message:n,isActiveChat:u});break}case"updateCommonBoxMessages":case"updateChannelMessages":{const{ids:t,messageUpdate:n}=a;if(!1!==n.hasUnreadMention)return;t.forEach(t=>{const s="channelId"in a?a.channelId:Object(o.q)(e,t),n=Object(o.g)(e,s);n&&n.unreadMentionsCount&&(e=Object(r.I)(e,s,{unreadMentionsCount:n.unreadMentionsCount-1}))}),Object(s.g)(e);break}case"updateChatFullInfo":{const{fullInfo:t}=a,n=e.chats.byId[a.id];if(!n)return;Object(s.g)(Object(r.I)(e,a.id,{fullInfo:{...n.fullInfo,...t}}));break}case"updatePinnedChatIds":{const{ids:t,folderId:c}=a,r=c===n.i?"archived":"active";e={...e,chats:{...e.chats,orderedPinnedIds:{...e.chats.orderedPinnedIds,[r]:t.length?t:void 0}}},Object(s.g)(e);break}case"updateChatPinned":{const{id:t,isPinned:c}=a,r=Object(o.k)(e,t);if(r){const{[r]:a}=e.chats.orderedPinnedIds;let s=a||[];if(c){if(!s.includes(t)){if("active"===r&&s.length>=n.V){const t=e.chats.listIds.active;s=s.filter(e=>t&&t.includes(e))}s=[t,...s]}}else s=s.filter(e=>e!==t);e={...e,chats:{...e.chats,orderedPinnedIds:{...e.chats.orderedPinnedIds,[r]:s.length?s:void 0}}}}Object(s.g)(e);break}case"updateChatListType":{const{id:t,folderId:n}=a;Object(s.g)(Object(r.L)(e,t,n));break}case"updateChatFolder":{const{id:t,folder:n}=a,{byId:c,orderedIds:r}=e.chatFolders,o=n?{...c,[t]:n}:Object(h.l)(c,Object.keys(c).map(Number).filter(e=>e!==t)),i=n?r&&r.includes(t)?r:[...r||[],t]:r?r.filter(e=>e!==t):void 0;Object(s.g)({...e,chatFolders:{...e.chatFolders,byId:o,orderedIds:i}});break}case"updateChatFoldersOrder":{const{orderedIds:t}=a;Object(s.g)({...e,chatFolders:{...e.chatFolders,orderedIds:t}});break}case"updateRecommendedChatFolders":{const{folders:t}=a;Object(s.g)({...e,chatFolders:{...e.chatFolders,recommended:t}});break}case"updateChatMembers":{const t=e.chats.byId[a.id],{replacedMembers:n,addedMember:c,deletedMemberId:o}=a;if(!t)return;let i=!1,l=t.fullInfo&&t.fullInfo.members?[...t.fullInfo.members]:[];if(n)l=n,i=!0;else if(c)l.length&&l.some(e=>e.userId===c.userId)||(l.push(c),i=!0);else if(l.length&&o){const e=l.findIndex(e=>e.userId===o);e>-1&&(l.slice(e,1),i=!0)}if(i){const n=l.filter(({isOwner:e,isAdmin:t})=>e||t);Object(s.g)(Object(r.I)(e,a.id,{membersCount:l.length,fullInfo:{...t.fullInfo,members:l,adminMembers:n}}))}break}case"deleteProfilePhotos":{const{chatId:t,ids:n}=a,c=e.chats.byId[t];c&&c.photos&&Object(s.g)(Object(r.I)(e,t,{photos:c.photos.filter(e=>!n.includes(e.id))}));break}case"draftMessage":{const{chatId:t,formattedText:n,date:c,replyingToId:o}=a;e.chats.byId[t]&&(e=Object(r.y)(e,t,b.MAIN_THREAD_ID,"draft",n),e=Object(r.y)(e,t,b.MAIN_THREAD_ID,"replyingToId",o),e=Object(r.I)(e,t,{draftDate:c}),Object(s.g)(e));break}case"showInvite":{const{data:e}=a;t.showDialog({data:e});break}}});function J(e,t,a,s,n=!1){const c=n?Object(o.rb)(e,t,a):Object(o.l)(e,t,a);if(c&&s.content){const{photo:e,video:t,sticker:a,document:n}=Object(l.v)(c);e&&s.content.photo?(s.content.photo.blobUrl=e.blobUrl,s.content.photo.thumbnail=e.thumbnail):t&&s.content.video?s.content.video.blobUrl=t.blobUrl:a&&s.content.sticker?s.content.sticker.isPreloadedGlobally=a.isPreloadedGlobally:n&&s.content.document&&(s.content.document.previewBlobUrl=n.previewBlobUrl)}return n?Object(r.fb)(e,t,a,s):Object(r.M)(e,t,a,s)}function Y(e,t){const{id:a,chatId:s}=t,{threadInfo:n,firstMessageId:c}=Object(o.Eb)(e,s,t)||{},i=Object(o.g)(e,s),d=i&&i.unreadCount&&!Object(o.Z)(e,s,b.MAIN_THREAD_ID);if(n&&(!c&&Object(l.xb)(t)||(e=Object(r.W)(e,s,n.threadId,[a]),Object(o.Y)(e,s,n.threadId)&&(e=Object(r.h)(e,s,n.threadId,a),c||(e=Object(r.y)(e,s,n.threadId,"firstMessageId",t.id)))),e=Object(r.y)(e,s,n.threadId,"threadInfo",{...n,lastMessageId:t.id,messagesCount:n.messagesCount+1})),d)return e;if(e=Object(r.W)(e,s,b.MAIN_THREAD_ID,[a]),Object(o.Y)(e,s,b.MAIN_THREAD_ID)){const t=Object(o.H)(e,s,b.MAIN_THREAD_ID),n=Object(r.h)(e,s,b.MAIN_THREAD_ID,a),c=Object(o.Kb)(n,s,b.MAIN_THREAD_ID);t&&!c.includes(t)||(e=n)}return e}function X(e,t,a,s=!1){const{chats:n}=e,c=n.byId[t]&&n.byId[t].lastMessage;if(c&&!s){if(!(c.id===a.id||c.id===a.previousLocalId||a.id>c.id))return e}return Object(r.I)(e,t,{lastMessage:a})}function Z(e,t){const a=Object(o.n)(e,t),s=Object(o.Z)(e,t,b.MAIN_THREAD_ID);if(!a||!s)return;let n=s.length;for(;n--;){const e=a[s[n]];if(!e.isDeleting)return e}}function ee(e,t,a,n){if(e){t.forEach(t=>{const a=Z(n=Object(r.M)(n,e,t,{isDeleting:!0}),e);a&&(n=X(n,e,a,!0))}),Object(s.g)(n),a.requestChatUpdate({chatId:e});const c=[];return t.forEach(t=>{const a=Object(o.l)(n,e,t);if(!a)return;const{threadInfo:s}=Object(o.Eb)(n,e,a)||{};s&&c.push(s.threadId)}),void setTimeout(()=>{Object(s.g)(Object(r.k)(Object(s.e)(),e,t)),Object(h.o)(c).forEach(t=>{a.requestThreadInfoUpdate({chatId:e,threadId:t})})},350)}const c=[];t.forEach(e=>{const t=Object(o.q)(n,e);if(t){c.push(t);const a=Z(n=Object(r.M)(n,t,e,{isDeleting:!0}),t);a&&(n=X(n,t,a,!0)),setTimeout(()=>{Object(s.g)(Object(r.k)(Object(s.e)(),t,[e]))},350)}}),Object(s.g)(n),Object(h.o)(c).forEach(e=>{a.requestChatUpdate({chatId:e})})}Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"newMessage":{const{chatId:n,id:c,message:i}=a;e=Y(e=J(e,n,c,i),i),i.threadInfo&&(e=Object(r.lb)(e,i.threadInfo.chatId,i.threadInfo.threadId,i.threadInfo)),Object(s.g)(e);const d=Object(o.l)(e,n,c);if(Object(o.a)(e,n,i)){if(i.isOutgoing&&(!i.content||!i.content.action)){const a=Object(o.z)(e);a&&t.focusMessage({chatId:n,threadId:a.threadId,messageId:i.id,noHighlight:!0})}const{threadInfo:a}=Object(o.Eb)(e,n,i)||{};a&&t.requestThreadInfoUpdate({chatId:n,threadId:a.threadId}),Object(l.xb)(i)||setTimeout(()=>{Object(s.g)(X(Object(s.e)(),n,d))},350)}else Object(s.g)(X(Object(s.e)(),n,d));Object(o.M)(e,n)||t.loadTopChats();break}case"newScheduledMessage":{const{chatId:t,id:n,message:c}=a;e=J(e,t,n,c,!0);const i=Object(o.qb)(e,t)||[];e=Object(r.y)(e,t,b.MAIN_THREAD_ID,"scheduledIds",Object(h.o)([...i,n])),Object(s.g)(e);break}case"updateMessage":{const{chatId:t,id:n,message:c}=a;if(!Object(o.l)(e,t,n))return;e=J(e,t,n,c);const i=Object(o.l)(e,t,n);c.threadInfo&&(e=Object(r.lb)(e,c.threadInfo.chatId,c.threadInfo.threadId,c.threadInfo)),e=X(e,t,i),Object(s.g)(e);break}case"updateScheduledMessage":{const{chatId:t,id:n,message:c}=a;if(!Object(o.rb)(e,t,n))return;e=J(e,t,n,c,!0);const i=Object.keys(Object(o.sb)(e,t)||{}).map(Number).sort((e,t)=>t-e);e=Object(r.y)(e,t,b.MAIN_THREAD_ID,"scheduledIds",i),Object(s.g)(e);break}case"updateMessageSendSucceeded":{const{chatId:n,localId:c,message:i}=a;e=Y(e,i);const l=Object(o.l)(e,n,c);e=Object(r.k)(e,n,[c]),i.isScheduled&&(e=Object(r.l)(e,n,[c])),e=Object(r.M)(e,n,i.id,{...l,...i,previousLocalId:c});const d=Object(o.l)(e,n,i.id);e=X(e,n,d);const b=Object(o.Eb)(e,n,i);b&&b.threadInfo&&(t.markMessageListRead({maxId:i.id}),e=Object(r.y)(e,n,b.threadInfo.threadId,"threadInfo",{...b.threadInfo,lastMessageId:i.id,lastReadInboxMessageId:i.id})),Object(s.g)(e);break}case"updateScheduledMessageSendSucceeded":{const{chatId:t,localId:n,message:c}=a,i=Object(o.qb)(e,t)||[];e=Object(r.y)(e,t,b.MAIN_THREAD_ID,"scheduledIds",[...i,c.id]);const l=Object(o.rb)(e,t,n);e=Object(r.l)(e,t,[n]),e=Object(r.fb)(e,t,c.id,{...l,...c,previousLocalId:n}),Object(s.g)(e);break}case"updatePinnedIds":{const{chatId:t,isPinned:n,messageIds:c}=a,i=Object(o.kb)(e,t)||[],l=n?[...i,...c].sort((e,t)=>t-e):i.filter(e=>!c.includes(e));Object(s.g)(Object(r.y)(e,t,b.MAIN_THREAD_ID,"pinnedIds",l));break}case"updateThreadInfo":{const{chatId:t,threadId:n,threadInfo:c,firstMessageId:i}=a,l={...Object(o.Fb)(e,t,n),...c};if(!l.threadId)return;e=Object(r.lb)(e,t,n,l),i&&(e=Object(r.y)(e,t,n,"firstMessageId",i)),Object(s.g)(e);break}case"resetMessages":{const{id:n}=a,c=Object(o.n)(e,n);c&&!Object(l.ob)(n)&&(e=Object(r.k)(e,n,Object.keys(c).map(Number)),Object(s.g)(e),t.loadFullChat({chatId:n,force:!0}));break}case"deleteMessages":{const{ids:s,chatId:n}=a;ee(n,s,t,e);break}case"deleteScheduledMessages":{const{ids:t,chatId:n}=a;!function(e,t,a,n){if(!e)return;t.forEach(t=>{n=Object(r.fb)(n,e,t,{isDeleting:!0})}),Object(s.g)(n),setTimeout(()=>{n=Object(r.l)(Object(s.e)(),e,t);const a=Object(o.sb)(n,e);n=Object(r.y)(n,e,b.MAIN_THREAD_ID,"scheduledIds",Object.keys(a||{}).map(Number)),Object(s.g)(n)},350)}(n,t,0,e);break}case"deleteHistory":{const{chatId:s}=a,n=e.messages.byChatId[s];if(n){ee(s,Object.keys(n.byId).map(Number),t,e)}else t.requestChatUpdate({chatId:s});break}case"updateCommonBoxMessages":{const{ids:t,messageUpdate:n}=a;t.forEach(t=>{const a=Object(o.q)(e,t);a&&(e=Object(r.M)(e,a,t,n))}),Object(s.g)(e);break}case"updateChannelMessages":{const{channelId:t,ids:n,messageUpdate:c}=a;n.forEach(a=>{e=Object(r.M)(e,t,a,c)}),Object(s.g)(e);break}case"updateMessagePoll":{const{pollId:t,pollUpdate:n}=a,c=Object(o.m)(e,t);if(c&&c.content.poll){const t={...c.content.poll,...n},{results:a}=t.results||{};if(a&&!a.some(e=>e.isChosen)){const{results:e}=c.content.poll.results,s=e&&e.filter(e=>e.isChosen);s&&s.forEach(e=>{const s=a.findIndex(t=>t.option===e.option);s>=0&&(t.results.results[s].isChosen=!0)})}Object(s.g)(Object(r.M)(e,c.chatId,c.id,{content:{...c.content,poll:t}}))}break}case"updateMessagePollVote":{const{pollId:t,userId:n,options:c}=a,i=Object(o.m)(e,t);if(!i||!i.content.poll||!i.content.poll.results)break;const{poll:l}=i.content,{recentVoterIds:d,totalVoters:b,results:u}=l.results,m=d?[...d]:[],h=b?b+1:1,O=u?[...u]:[];m.push(n),c.forEach(t=>{const a=O.find(e=>e.option===t),s=O.findIndex(e=>e.option===t),c=a?{...a}:{option:t,votersCount:0};c.votersCount+=1,n===e.currentUserId&&(c.isChosen=!0),s?O[s]=c:O.push(c)}),Object(s.g)(Object(r.M)(e,i.chatId,i.id,{content:{...i.content,poll:{...l,results:{...l.results,recentVoterIds:m,totalVoters:h,results:O}}}}));break}}});const te=Object(f.h)((function(){let e=Object(s.e)();ae.forEach(([t,a])=>{e=Object(r.ob)(e,t,{status:a})}),Object(s.g)(e),ae=[]}),3e3,!0);let ae=[];Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"deleteUser":return Object(r.m)(e,a.id);case"updateUser":return Object(r.ob)(e,a.id,a.user);case"updateUserStatus":return s=a.userId,n=a.status,ae.push([s,n]),void te();case"updateUserFullInfo":{const{id:t,fullInfo:s}=a,n=e.users.byId[t];if(!n)return;return Object(r.ob)(e,t,{fullInfo:{...n.fullInfo,...s}})}}var s,n}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateStickerSet":return Object(r.ib)(e,a.id,a.stickerSet)}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updatePeerBlocked":return a.isBlocked?Object(r.a)(Object(s.e)(),a.id):Object(r.q)(Object(s.e)(),a.id);case"updateResetContactList":Object(s.g)({...Object(s.e)(),contactList:{hash:0,userIds:[]}});break;case"updateFavoriteStickers":t.loadFavoriteStickers();break;case"updatePrivacy":e.settings.privacy[a.key]=a.rules}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateNotifySettings":return Object(r.db)(e,a.peerType,a.isSilent,a.shouldShowPreviews);case"updateNotifyExceptions":{const{chatId:t,isMuted:n,isSilent:c,shouldShowPreviews:o}=a;e.chats.byId[t]&&(e=Object(r.I)(e,t,{isMuted:n})),Object(s.g)(Object(r.e)(e,t,{isMuted:n,isSilent:c,shouldShowPreviews:o}));break}}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateTwoFaStateWaitCode":return{...e,twoFaSettings:{...e.twoFaSettings,isLoading:!1,waitingEmailCodeLength:a.length}};case"updateTwoFaError":return{...e,twoFaSettings:{...e.twoFaSettings,error:a.message}}}});var se=a(37),ne=a(9),ce=a(178),re=a(40),oe=a(127);function ie(e){Object(c.n)(()=>Object(f.c)(e),[e])}var le=a(52),de=a(49),be=a(145),ue=a(113);var me=a(25),he=a(16),Oe=a(45),je=a(39),ge=a(63),pe=a(43),fe=a(21),Ie=a(159),ve=a(146);a(206);var ye=Object(c.h)(({id:e,name:t,value:a,label:s,checked:n=!1,disabled:r,inactive:o,noAnimation:i,onChange:l,onCheck:d})=>{const b=Object(c.m)(e=>{l&&l(e),d&&d(e.currentTarget.checked)},[l,d]),u=Object(ne.a)("Switcher",r&&"disabled",o&&"inactive",i&&"no-animation");return c.a.createElement("label",{className:u,title:s},c.a.createElement("input",{type:"checkbox",id:e,name:t,value:a,checked:n,disabled:r,onChange:b}),c.a.createElement("span",{className:"widget"}))});a(207);const Ce=[0,1,2];var Ee=Object(c.h)(Object(s.h)(e=>{const{query:t,fetchingStatus:a,chatId:s,date:n}=e.globalSearch,{currentUserId:c}=e,{byId:r}=e.chats,{animationLevel:i}=e.settings.byKey;return{searchQuery:t,isLoading:!!a&&Boolean(a.chats||a.messages),currentUserId:c,chatsById:r,globalSearchChatId:s,searchDate:n,theme:Object(o.Db)(e),animationLevel:i}},(e,t)=>Object(h.l)(t,["openChat","openTipsChat","setGlobalSearchDate","setGlobalSearchChatId","setSettingOption"]))(({content:e,contactsFilter:t,onSearchQuery:a,onSelectSettings:s,onSelectContacts:r,onSelectArchived:o,setGlobalSearchChatId:i,onReset:d,searchQuery:b,isLoading:h,shouldSkipTransition:O,currentUserId:j,globalSearchChatId:g,searchDate:p,theme:f,animationLevel:I,chatsById:v,openChat:y,openTipsChat:C,setGlobalSearchDate:E,setSettingOption:w})=>{const M=Object(he.a)(),S=e===u.d.ChatList,k={date:void 0},N={id:void 0},T=Object(c.p)(()=>p?Object(x.a)(new Date(1e3*p)):void 0,[p]),A=Object(c.p)(()=>S&&v?Object.values(v).reduce((e,t)=>Object(l.kb)(t)&&t.unreadCount?e+1:e,0):0,[S,v]),P="web.telegram.org"===window.location.hostname,R=Object(c.p)(()=>({onTrigger:e,isOpen:t})=>c.a.createElement(fe.a,{round:!0,ripple:S&&!m.l,size:"smaller",color:"translucent",className:t?"active":"",onClick:S?e:()=>d(),ariaLabel:S?M("AccDescrOpenMenu2"):"Return to chat list"},c.a.createElement("div",{className:Object(ne.a)("animated-menu-icon",!S&&"state-back",O&&"no-animation")})),[S,M,d,O]),L=Object(c.m)(()=>{b||a("")},[b,a]),B=Object(c.m)(()=>{y({id:j,shouldReplaceHistory:!0})},[j,y]),D=Object(c.m)(e=>{e.stopPropagation();const t="light"===f?"dark":"light";w({theme:t}),w({shouldUseSystemTheme:!1}),Object(Oe.a)(t,I===n.e)},[I,w,f]),F=Object(c.m)(e=>{e.stopPropagation();const t=0===I?2:0;Ce.forEach((e,a)=>{document.body.classList.toggle("animation-level-"+a,t===a)}),w({animationLevel:t})},[I,w]),U=Boolean(g)||e===u.d.GlobalSearch||e===u.d.Contacts,H=e===u.d.Contacts?M("SearchFriends"):M("Search");return c.a.createElement("div",{className:"LeftMainHeader"},c.a.createElement("div",{id:"LeftMainHeader",className:"left-header"},c.a.createElement(ge.a,{trigger:R,footer:`${n.g} alpha ${n.h}`},c.a.createElement(pe.a,{icon:"saved-messages",onClick:B},M("SavedMessages")),c.a.createElement(pe.a,{icon:"archive",onClick:o},c.a.createElement("span",{className:"menu-item-name"},M("ArchivedChats")),A>0&&c.a.createElement("div",{className:"archived-badge"},A)),c.a.createElement(pe.a,{icon:"user",onClick:r},M("Contacts")),c.a.createElement(pe.a,{icon:"settings",onClick:s},M("Settings")),c.a.createElement(pe.a,{icon:"darkmode",onClick:D},c.a.createElement("span",{className:"menu-item-name"},M("lng_menu_night_mode")),c.a.createElement(ye,{id:"darkmode",label:M("dark"===f?"lng_settings_disable_night_theme":"lng_settings_enable_night_theme"),checked:"dark"===f,noAnimation:!0})),c.a.createElement(pe.a,{icon:"animations",onClick:F},c.a.createElement("span",{className:"menu-item-name capitalize"},M("Appearance.Animations").toLowerCase()),c.a.createElement(ye,{id:"animations",label:"Toggle Animations",checked:I>0})),c.a.createElement(pe.a,{icon:"help",onClick:()=>{C({langCode:M.code})}},M("TelegramFeatures")),c.a.createElement(pe.a,{icon:"bug",href:n.F},"Report Bug"),P&&c.a.createElement(c.a.Fragment,null,c.a.createElement(pe.a,{icon:"char-K",href:"https://web.telegram.org/k/",onClick:()=>{localStorage.setItem("kz_version",JSON.stringify("K")),Object(je.b)()}},"Switch to K Version"),c.a.createElement(pe.a,{icon:"char-W",href:"https://web.telegram.org/?legacy=1",onClick:je.b},"Switch to Old Version"))),c.a.createElement(Ie.a,{inputId:"telegram-search-input",parentContainerClassName:"LeftSearch",className:g||p?"with-picker-item":"",value:t||b,focused:U,isLoading:h,placeholder:H,autoComplete:"off",canClose:Boolean(g||p),onChange:a,onReset:d,onFocus:L},T&&c.a.createElement(ve.a,{icon:"calendar",title:T,canClose:!0,isMinimized:Boolean(g),className:"search-date",onClick:E,clickArg:k}),g&&c.a.createElement(ve.a,{chatOrUserId:g,onClick:i,canClose:!0,clickArg:N}))))})),we=a(26);a(208);var Me=Object(c.h)(()=>{const e=Object(he.a)();return c.a.createElement("div",{id:"ConnectionState",dir:e.isRtl?"rtl":void 0},c.a.createElement(we.a,{color:"black"}),c.a.createElement("div",{className:"state-text"},e("WaitingForNetwork")))}),Se=a(137),ke=(e,t,a)=>{const s=((e,t=!1)=>Object(c.p)(()=>Object(f.h)(e=>e(),e,!t),[e,t]))(t,!0),[n,r]=Object(c.r)(),[o,i,l]=Object(me.a)();return Object(se.c)(i,l),Object(le.a)(()=>{o||s(()=>{r(e())})},a.concat([o])),n},Ne=a(176),Te=a(198);var Ae=Object(c.h)(Object(s.h)(e=>{const{chats:{byId:t},users:{byId:a},chatFolders:{byId:s,orderedIds:n,activeChatFolder:c},currentUserId:r,lastSyncTime:i}=e;return{chatsById:t,usersById:a,chatFoldersById:s,orderedFolderIds:n,lastSyncTime:i,notifySettings:Object(o.fb)(e),notifyExceptions:Object(o.eb)(e),activeChatFolder:c,currentUserId:r}},(e,t)=>Object(h.l)(t,["loadChatFolders","setActiveChatFolder","openChat"]))(({chatsById:e,usersById:t,chatFoldersById:a,notifySettings:s,notifyExceptions:n,orderedFolderIds:r,activeChatFolder:o,currentUserId:i,lastSyncTime:d,foldersDispatch:b,onScreenSelect:u,loadChatFolders:O,setActiveChatFolder:j,openChat:g})=>{const p=Object(c.q)(null),f=Object(he.a)();Object(c.n)(()=>{d&&O()},[d,O]);const I=Object(c.p)(()=>r?r.map(e=>a[e]||{}).filter(Boolean):void 0,[a,r]),v=ke(()=>{if(!I||!I.length)return;const a=Object.keys(e).map(Number),c=I.map(c=>{const{unreadDialogsCount:r,hasActiveDialogs:o}=Object(l.o)(e,t,c,a,s,n)||{};return{id:c.id,badgeCount:r,isBadgeActive:o}});return Object(h.c)(c,"id")},3e3,[I,e,t,s,n]),y=Object(c.p)(()=>{if(I&&I.length)return[{title:"en"===f.code?"All":f("FilterAllChats")},...I.map(e=>({title:e.title,...v&&v[e.id]}))]},[I,v,f]),C=Object(c.m)(e=>{j(e)},[j]);Object(c.n)(()=>{y&&y.length&&o>=y.length&&j(0)},[o,y,j]),Object(c.n)(()=>{if(p.current&&m.n&&y&&y.length)return Object(Se.b)(p.current,{onSwipe:(e,t)=>{t===Se.a.Left?j(Math.min(o+1,y.length-1)):t===Se.a.Right&&j(Math.max(0,o-1))}})},[o,y,j]);const E=Object(c.q)();E.current=0!==o,Object(c.n)(()=>E.current?Object(de.a)(()=>{E.current&&j(0)}):void 0,[o,j]),Object(je.a)(0!==o,()=>j(0)),Object(c.n)(()=>{const e=e=>{if(e.ctrlKey&&e.shiftKey&&e.code.startsWith("Digit")&&y){const[,t]=e.code.match(/Digit(\d)/)||[];if(!t)return;if("0"===t)return void g({id:i,shouldReplaceHistory:!0});const a=Number(t)-1;if(a>y.length-1)return;j(a),e.preventDefault()}};return document.addEventListener("keydown",e,!0),()=>{document.removeEventListener("keydown",e,!0)}});const{shouldRender:w,transitionClassNames:M}=Object(re.a)(!r,void 0,!0);function S(e){const t=Object.values(a).find(({title:e})=>e===y[o].title);return t&&0!==o?c.a.createElement(Te.a,{folderType:"folder",folderId:t.id,isActive:e,onScreenSelect:u,foldersDispatch:b}):c.a.createElement(Te.a,{folderType:"all",isActive:e,foldersDispatch:b,onScreenSelect:u})}return c.a.createElement("div",{className:"ChatFolders"},y&&y.length?c.a.createElement(Ne.a,{tabs:y,activeTab:o,onSwitchTab:C}):w?c.a.createElement("div",{className:Object(ne.a)("tabs-placeholder",M)}):void 0,c.a.createElement(ue.a,{ref:p,name:f.isRtl?"slide-reversed":"slide",activeKey:o,renderCount:y?y.length:void 0},S))})),Pe=a(15),Re=a(24),xe=a(20);var Le=Object(c.h)(e=>{const t=Object(Re.a)(Pe.a.Extra,"LeftSearch");return t?c.a.createElement(t,e):c.a.createElement(xe.a,null)});var Be=Object(c.h)(e=>{const t=Object(Re.a)(Pe.a.Extra,"ContactList");return t?c.a.createElement(t,e):c.a.createElement(xe.a,null)}),De=a(55);a(221);let Fe;var Ue=Object(c.h)(({isShown:e,onNewPrivateChat:t,onNewChannel:a,onNewGroup:s})=>{const[n,r]=Object(c.r)(!1);Object(c.n)(()=>{e||r(!1)},[e]);const o=Object(he.a)(),i=Object(ne.a)("NewChatButton",e&&"revealed",n&&"menu-is-open"),l=Object(c.m)(()=>{Fe&&(clearTimeout(Fe),Fe=void 0)},[]),d=Object(c.m)(()=>{Fe&&(clearTimeout(Fe),Fe=void 0),Fe=window.setTimeout(()=>{r(!1)},750)},[]);return c.a.createElement("div",{className:i,onMouseEnter:l,onMouseLeave:d},c.a.createElement(fe.a,{round:!0,color:"primary",className:n?"active":"",onClick:()=>{r(!n)},ariaLabel:o(n?"Close":"NewMessageTitle"),tabIndex:-1},c.a.createElement("i",{className:"icon-new-chat-filled"}),c.a.createElement("i",{className:"icon-close"})),c.a.createElement(De.a,{isOpen:n,positionX:"right",positionY:"bottom",autoClose:!0,onClose:()=>{r(!1)}},c.a.createElement(pe.a,{icon:"channel",onClick:a},o("NewChannel")),c.a.createElement(pe.a,{icon:"group",onClick:s},o("NewGroup")),c.a.createElement(pe.a,{icon:"user",onClick:t},o("NewMessageTitle"))))}),He=a(163);a(222);const qe=Object.keys(u.d).length/2;let Ge;var _e=Object(s.h)(e=>Object(h.l)(e,["connectionState"]))(({content:e,searchQuery:t,searchDate:a,contactsFilter:s,shouldSkipTransition:n,foldersDispatch:r,onSearchQuery:o,onContentChange:i,onScreenSelect:l,onReset:d,connectionState:b})=>{const[h,O]=Object(c.r)(m.n),j=!function(){const[e,t]=Object(c.r)(window.navigator.onLine);return Object(c.n)(()=>{function e(){t(window.navigator.onLine)}return window.addEventListener("online",e),window.addEventListener("offline",e),()=>{window.removeEventListener("offline",e),window.removeEventListener("online",e)}},[]),e}()||"connectionStateConnecting"===b,g=Object(c.q)(!1),p=Object(c.m)(()=>{i(u.d.Settings)},[i]),f=Object(c.m)(()=>{i(u.d.Contacts)},[i]),I=Object(c.m)(()=>{i(u.d.NewChannelStep1)},[i]),v=Object(c.m)(()=>{i(u.d.NewGroupStep1)},[i]),y=Object(c.m)(()=>{i(u.d.Archived)},[i]),C=Object(c.m)(()=>{e===u.d.ChatList&&(g.current=!0,O(!0))},[e]),E=Object(c.m)(()=>{g.current=!1,Ge&&(clearTimeout(Ge),Ge=void 0),Ge=window.setTimeout(()=>{g.current||O(!1)},250)},[]);Object(c.n)(()=>{let t;return e!==u.d.ChatList?t=window.setTimeout(()=>{O(!1)},250):(g.current||m.n)&&O(!0),()=>{t&&(clearTimeout(t),t=void 0)}},[e]);const[w,M,S]=function(){const[e,t]=Object(me.a)(!1);Object(c.n)(()=>{const e=window.setTimeout(t,2592e5);return()=>{clearTimeout(e)}},[t]);const{shouldRender:a,transitionClassNames:s}=Object(re.a)(e);return[a,s,()=>{window.location.reload()}]}(),k=Object(he.a)();return c.a.createElement("div",{id:"LeftColumn-main",onMouseEnter:m.n?void 0:C,onMouseLeave:m.n?void 0:E},c.a.createElement(Ee,{content:e,contactsFilter:s,onSearchQuery:o,onSelectSettings:p,onSelectContacts:f,onSelectArchived:y,onReset:d,shouldSkipTransition:n}),c.a.createElement(He.a,{isOpen:j,isCustom:!0,className:"connection-state-wrapper opacity-transition slow"},()=>c.a.createElement(Me,null)),c.a.createElement(ue.a,{name:n?"none":"zoom-fade",renderCount:qe,activeKey:e,shouldCleanup:!0,cleanupExceptionKey:u.d.ChatList,className:j?"pull-down":void 0},n=>{switch(e){case u.d.ChatList:return c.a.createElement(Ae,{onScreenSelect:l,foldersDispatch:r});case u.d.GlobalSearch:return c.a.createElement(Le,{searchQuery:t,searchDate:a,isActive:n,onReset:d});case u.d.Contacts:return c.a.createElement(Be,{filter:s,isActive:n,onReset:d});default:return}}),w&&c.a.createElement(fe.a,{fluid:!0,pill:!0,className:Object(ne.a)("btn-update",M),onClick:S},k("lng_update_telegram")),c.a.createElement(Ue,{isShown:h,onNewPrivateChat:f,onNewChannel:I,onNewGroup:v}))});var ze=Object(c.h)(e=>{const t=Object(Re.a)(Pe.a.Extra,"Settings");return t?c.a.createElement(t,e):c.a.createElement(xe.a,null)});var $e=Object(c.h)(e=>{const t=Object(Re.a)(Pe.a.Extra,"NewChat");return t?c.a.createElement(t,e):c.a.createElement(xe.a,null)});var Ve,We=Object(c.h)(e=>{const t=Object(Re.a)(Pe.a.Extra,"ArchivedChats");return t?c.a.createElement(t,e):c.a.createElement(xe.a,null)});a(223);!function(e){e[e.Main=0]="Main",e[e.Settings=1]="Settings",e[e.Archived=2]="Archived",e[e.NewGroup=3]="NewGroup",e[e.NewChannel=4]="NewChannel"}(Ve||(Ve={}));const Ke=Object.keys(Ve).length/2;var Qe=Object(c.h)(Object(s.h)(e=>{const{globalSearch:{query:t,date:a},chatFolders:{activeChatFolder:s},shouldSkipHistoryAnimations:n}=e;return{searchQuery:t,searchDate:a,activeChatFolder:s,shouldSkipHistoryAnimations:n}},(e,t)=>Object(h.l)(t,["setGlobalSearchQuery","setGlobalSearchChatId","resetChatCreation","setGlobalSearchDate","loadPasswordInfo","clearTwoFaError"]))(({searchQuery:e,searchDate:t,activeChatFolder:a,shouldSkipHistoryAnimations:s,setGlobalSearchQuery:n,setGlobalSearchChatId:r,resetChatCreation:o,setGlobalSearchDate:i,loadPasswordInfo:l,clearTwoFaError:d})=>{const[b,h]=Object(c.r)(u.d.ChatList),[O,j]=Object(c.r)(u.n.Main),[g,p]=Object(c.r)(""),[f,I]=Object(be.c)(),[v,y]=Object(c.r)(0);let C=Ve.Main;switch(b){case u.d.Archived:C=Ve.Archived;break;case u.d.Settings:C=Ve.Settings;break;case u.d.NewChannelStep1:case u.d.NewChannelStep2:C=Ve.NewChannel;break;case u.d.NewGroupStep1:case u.d.NewGroupStep2:C=Ve.NewGroup}const E=Object(c.m)(e=>{if(b!==u.d.NewGroupStep2||e)if(b!==u.d.NewChannelStep2||e){if(b===u.d.NewGroupStep1){const e=document.getElementById("new-group-picker-search");e&&e.blur()}if(b===u.d.Settings)switch(O){case u.n.EditProfile:case u.n.Folders:case u.n.General:case u.n.Notifications:case u.n.Privacy:case u.n.Language:return void j(u.n.Main);case u.n.GeneralChatBackground:return void j(u.n.General);case u.n.GeneralChatBackgroundColor:return void j(u.n.GeneralChatBackground);case u.n.PrivacyPhoneNumber:case u.n.PrivacyLastSeen:case u.n.PrivacyProfilePhoto:case u.n.PrivacyForwarding:case u.n.PrivacyGroupChats:case u.n.PrivacyActiveSessions:case u.n.PrivacyBlockedUsers:case u.n.TwoFaDisabled:case u.n.TwoFaEnabled:case u.n.TwoFaCongratulations:return void j(u.n.Privacy);case u.n.PrivacyPhoneNumberAllowedContacts:case u.n.PrivacyPhoneNumberDeniedContacts:return void j(u.n.PrivacyPhoneNumber);case u.n.PrivacyLastSeenAllowedContacts:case u.n.PrivacyLastSeenDeniedContacts:return void j(u.n.PrivacyLastSeen);case u.n.PrivacyProfilePhotoAllowedContacts:case u.n.PrivacyProfilePhotoDeniedContacts:return void j(u.n.PrivacyProfilePhoto);case u.n.PrivacyForwardingAllowedContacts:case u.n.PrivacyForwardingDeniedContacts:return void j(u.n.PrivacyForwarding);case u.n.PrivacyGroupChatsAllowedContacts:case u.n.PrivacyGroupChatsDeniedContacts:return void j(u.n.PrivacyGroupChats);case u.n.TwoFaNewPassword:return void j(u.n.TwoFaDisabled);case u.n.TwoFaNewPasswordConfirm:return void j(u.n.TwoFaNewPassword);case u.n.TwoFaNewPasswordHint:return void j(u.n.TwoFaNewPasswordConfirm);case u.n.TwoFaNewPasswordEmail:return void j(u.n.TwoFaNewPasswordHint);case u.n.TwoFaNewPasswordEmailCode:return void j(u.n.TwoFaNewPasswordEmail);case u.n.TwoFaChangePasswordCurrent:case u.n.TwoFaTurnOff:case u.n.TwoFaRecoveryEmailCurrentPassword:return void j(u.n.TwoFaEnabled);case u.n.TwoFaChangePasswordNew:return void j(u.n.TwoFaChangePasswordCurrent);case u.n.TwoFaChangePasswordConfirm:return void j(u.n.TwoFaChangePasswordNew);case u.n.TwoFaChangePasswordHint:return void j(u.n.TwoFaChangePasswordConfirm);case u.n.TwoFaRecoveryEmail:return void j(u.n.TwoFaRecoveryEmailCurrentPassword);case u.n.TwoFaRecoveryEmailCode:return void j(u.n.TwoFaRecoveryEmail);case u.n.FoldersCreateFolder:case u.n.FoldersEditFolder:return void j(u.n.Folders);case u.n.FoldersIncludedChatsFromChatList:case u.n.FoldersExcludedChatsFromChatList:return void j(u.n.FoldersEditFolderFromChatList);case u.n.FoldersEditFolderFromChatList:return h(u.d.ChatList),void j(u.n.Main)}b!==u.d.ChatList||0!==a?(h(u.d.ChatList),p(""),n({query:""}),i({date:void 0}),r({id:void 0}),o(),setTimeout(()=>{y(Date.now())},250)):h(u.d.GlobalSearch)}else h(u.d.NewChannelStep1);else h(u.d.NewGroupStep1)},[b,a,O,n,i,r,o]),w=Object(c.m)(t=>{b!==u.d.Contacts?(h(u.d.GlobalSearch),t!==e&&n({query:t})):p(t)},[b,e,n]);Object(c.n)(()=>b!==u.d.ChatList||0===a?Object(de.a)(()=>E()):void 0,[a,b,E]),Object(c.n)(()=>{d(),O===u.n.Privacy&&l()},[d,l,O]);const M=e=>{h(u.d.Settings),j(e)};return c.a.createElement(ue.a,{id:"LeftColumn",name:s?"none":m.p,renderCount:Ke,activeKey:C,shouldCleanup:!0,cleanupExceptionKey:Ve.Main},a=>{switch(C){case Ve.Archived:return c.a.createElement(We,{isActive:a,onReset:E,onContentChange:h});case Ve.Settings:return c.a.createElement(ze,{isActive:a,currentScreen:O,foldersState:f,foldersDispatch:I,onScreenSelect:M,onReset:E,shouldSkipTransition:s});case Ve.NewChannel:return c.a.createElement($e,{key:v,isActive:a,isChannel:!0,content:b,onContentChange:h,onReset:E});case Ve.NewGroup:return c.a.createElement($e,{key:v,isActive:a,content:b,onContentChange:h,onReset:E});default:return c.a.createElement(_e,{content:b,searchQuery:e,searchDate:t,contactsFilter:g,foldersDispatch:I,onContentChange:h,onSearchQuery:w,onScreenSelect:M,onReset:E,shouldSkipTransition:s})}})})),Je=a(143),Ye=a(12),Xe=a(17),Ze=a(54);var et=()=>{const[e,t]=Object(c.r)(Ze.a.get());return Object(c.n)(()=>{const e=Object(f.h)(()=>{t(Ze.a.get())},250,!1);return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}},[]),e},tt=a(183);function at(e,t){const a=e<=n.ob?16:32,s=function(e){if(e>n.lb){const t=Math.min(Math.max(.25*e,288),424),a=Math.min(.25*e,424);return Math.min(e-t-a,728)}if(e>n.kb){const t=Math.min(Math.max(.4*e,288),424);return Math.min(e-t,728)}if(e>728)return 728;return e}(e),c=e<=n.ob?54:64,r=t?s-a-c:s-a,o=e>n.ob?Math.min(s-a,512):s-a,i=o/r,l=r/o;return{composerHiddenScale:i,toolbarHiddenScale:l,composerTranslateX:t?c/2*l:0,toolbarTranslateX:t?c/2*-1*i:0,unpinHiddenScale:o/258,toolbarForUnpinHiddenScale:258/o}}const st=e=>e.chatId.toString()+("thread"!==e.type?"_"+e.type:-1!==e.threadId?"_"+e.threadId:"");var nt=a(134),ct=a(149),rt=a(139),ot=a(50),it=a(111),lt=a(130);var dt=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"HeaderMenuContainer",!t);return a?c.a.createElement(a,e):void 0});var bt=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const n=Object(o.g)(e,t),c=Boolean(n&&Object(l.mb)(n));if(n&&n.isRestricted)return{noMenu:!0};const r=Object(o.h)(e,t),i=Object(o.P)(e,t),d="thread"===s&&a===b.MAIN_THREAD_ID,u="thread"===s&&a!==b.MAIN_THREAD_ID,h=Object(o.W)(e),O=Boolean(r&&Object(o.X)(e,r.id)),j=!O&&Boolean(Object(o.L)(e,t)),g=Boolean(d&&n&&(c||Object(l.qb)(n))&&n.isNotJoined),p=d||u,f=d&&!i&&!g,I=!Object(o.S)(e),v=d&&!g;return{noMenu:!(m.l&&g||m.l&&p||f||I||v),isChannel:c,isRightColumnShown:h,canStartBot:j,canRestartBot:O,canSubscribe:g,canSearch:p,canMute:f,canSelect:I,canLeave:v}},(e,t)=>Object(h.l)(t,["joinChannel","sendBotCommand","openLocalTextSearch","restartBot"]))(({chatId:e,threadId:t,noMenu:a,isChannel:s,canStartBot:n,canRestartBot:r,canSubscribe:o,canSearch:i,canMute:l,canSelect:d,canLeave:b,isRightColumnShown:u,joinChannel:h,sendBotCommand:O,openLocalTextSearch:j,restartBot:g})=>{const p=Object(c.q)(null),[f,I]=Object(c.r)(!1),[v,y]=Object(c.r)(void 0),C=Object(c.m)(()=>{I(!0);const e=p.current.getBoundingClientRect();y({x:e.right,y:e.bottom})},[]),E=Object(c.m)(()=>{I(!1)},[]),w=Object(c.m)(()=>{y(void 0)},[]),M=Object(c.m)(()=>{h({chatId:e})},[h,e]),S=Object(c.m)(()=>{O({command:"/start"})},[O]),k=Object(c.m)(()=>{g({chatId:e})},[e,g]),N=Object(c.m)(()=>{if(j(),m.l){document.querySelector("#MobileSearch input").focus()}else setTimeout(()=>{const e=document.querySelector(".RightHeader .SearchInput input");e&&e.focus()},400)},[j]),T=Object(he.a)();return c.a.createElement("div",{className:"HeaderActions"},!m.l&&o&&c.a.createElement(fe.a,{size:"tiny",ripple:!0,fluid:!0,onClick:M},T(s?"Subscribe":"Join Group")),!m.l&&n&&c.a.createElement(fe.a,{size:"tiny",ripple:!0,fluid:!0,onClick:S},T("BotStart")),!m.l&&r&&c.a.createElement(fe.a,{size:"tiny",ripple:!0,fluid:!0,onClick:k},T("BotRestart")),!m.l&&i&&c.a.createElement(fe.a,{round:!0,ripple:u,color:"translucent",size:"smaller",onClick:N,ariaLabel:"Search in this chat"},c.a.createElement("i",{className:"icon-search"})),(m.l||!o)&&c.a.createElement(fe.a,{ref:p,className:f?"active":"",round:!0,ripple:!m.l,size:"smaller",color:"translucent",disabled:a,ariaLabel:"More actions",onClick:C},c.a.createElement("i",{className:"icon-more"})),v&&c.a.createElement(dt,{chatId:e,threadId:t,isOpen:f,anchor:v,isChannel:s,canStartBot:n,canRestartBot:r,canSubscribe:o,canSearch:i,canMute:l,canSelect:d,canLeave:b,onSubscribeChannel:M,onSearchClick:N,onClose:E,onCloseAnimationEnd:w}))})),ut=a(118),mt=a(22),ht=a(110),Ot=a(46);function jt(e){const t=e&&Object(l.F)(e),{sticker:a}=e&&e.content||{},s=t&&a&&!Object(m.t)()&&t.includes("image/webp"),[r,o]=Object(c.r)(Ot.a),i=e&&e.id;return Object(c.o)(()=>{s&&Object(Ot.c)("b64-"+i,t).then(o).catch(e=>{n.r&&console.error(e)})},[i,s,t]),s?r:t}var gt=a(120),pt=a(44);function ft(e,t,a,s,n){return`M${e},${t+n}a${n},${n},0,0,1,\n ${a},0v${s-2*n}a${n},${n},0,0,1,${-a},0Z`}var It=Object(c.h)(({count:e,index:t})=>{const a=Object(c.q)(null),s=Object(c.p)(()=>function(e,t){const a=e-t-1,s=function(e){let t=8;1===e?t=36:2===e?t=17:3===e?t=11:(4===e||e>3)&&(t=7.5);return t}(e),n=function(e,t){let a=36;1===e?a=36:2===e?a=17:3===e?a=1===t?12:11:(4===e||e>3)&&(a=7.5);return a}(e,a),c=function(e,t){return e<=3?36:t*e+2*(e-1)}(e,s),r="clipPath"+e,o=function(e,t,a){let s="";if(3===a)s=ft(0,0,2,t,1)+ft(0,12,2,t+1,1)+ft(0,25,2,t,1);else for(let e=0;e\n \n `}(r,s,e),i=function(e,t,a){if(1===a)return 0;if(2===a)return 0===e?0:t+2;return 3===a?0===e?0:1===e?12:25:(t+2)*e}(a,s,e),l=function(e,t,a,s){if(t<=4)return 0;if(e<=1)return 0;if(e>=t-2)return s-36;return(a+4)/2+(e-2)*(a+2)}(a,e,s,c);return{markHeight:n,clipPath:o,markTranslateY:i,trackTranslateY:l,trackHeight:c,clipPathId:r}}(e,t),[e,t]);if(Object(c.n)(()=>{if(!a.current)return;const{trackHeight:e,trackTranslateY:t,markHeight:n,markTranslateY:c,clipPathId:r,clipPath:o}=s,i=a.current.firstElementChild;if(a&&a.current){const s=a.current,{style:l}=s;l.height=e+"px",l.transform=`translateY(-${t}px)`,l.clipPath=`url("#${r}")`;const d=s.querySelector("svg"),b=s.querySelector("div"),u=s.querySelector("defs");d||i&&(i.innerHTML=` ${o} `),u&&(u.innerHTML=o),b&&(b.style.height=n+"px",b.style.transform=`translateY(${c}px)`)}},[s]),1===e)return c.a.createElement("div",{className:"pinned-message-border"},c.a.createElement("div",{className:"pinned-message-border-wrapper-1",ref:a}));const{trackHeight:n,trackTranslateY:r,markHeight:o,markTranslateY:i,clipPathId:l}=s;return c.a.createElement("div",{className:Object(ne.a)("pinned-message-border",e>4&&"pinned-message-border-mask")},c.a.createElement("div",{className:"pinned-message-border-wrapper",ref:a,style:`clip-path: url("#${l}"); width: 2px;\n height: ${n}px; transform: translateY(-${r}px);`},c.a.createElement("span",null),c.a.createElement("div",{className:"pinned-message-border-mark",style:`height: ${o}px; transform: translateY(${i}px);`})))});var vt=Object(c.h)(({message:e,count:t,index:a,customTitle:s,className:n,onUnpinMessage:r,onClick:o,onAllPinnedClick:i})=>{const d=Object(he.a)(),b=jt(e),u=Object(ht.a)(Object(l.E)(e,"pictogram")),m=Object(l.O)(d,e,Boolean(b)),[h,O,j]=Object(me.a)(),g=Object(c.m)(()=>{j(),r&&r(e.id)},[j,r,e.id]);return c.a.createElement("div",{className:Object(ne.a)("HeaderPinnedMessage-wrapper",n)},t>1&&c.a.createElement(fe.a,{round:!0,size:"smaller",color:"translucent",className:"pin-list-button",ariaLabel:d("EventLogFilterPinnedMessages"),onClick:i},c.a.createElement("i",{className:"icon-pin-list"})),r&&c.a.createElement(fe.a,{round:!0,size:"smaller",color:"translucent",ariaLabel:d("UnpinMessageAlertTitle"),className:"unpin-button",onClick:O},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(gt.a,{isOpen:h,onClose:j,text:"Would you like to unpin this message?",confirmLabel:"Unpin",confirmHandler:g}),c.a.createElement("div",{className:"HeaderPinnedMessage",onClick:o,dir:d.isRtl?"rtl":void 0},c.a.createElement(It,{count:t,index:a}),b&&function(e,t){const{width:a,height:s}=Object(ut.m)();return c.a.createElement("img",{src:t||e,width:a,height:s,alt:""})}(b,u),c.a.createElement("div",{className:"message-text"},c.a.createElement("div",{className:"title",dir:"auto"},s||`${d("PinnedMessage")} ${a>0?"#"+(t-a):""}`),c.a.createElement("p",{dir:"auto"},Object(mt.a)(m))),c.a.createElement(pt.a,null)))}),yt=a(57),Ct=a(184);a(226);var Et=Object(s.h)((e,{message:t})=>({sender:Object(o.vb)(e,t)}),(e,t)=>Object(h.l)(t,["focusMessage","closeAudioPlayer"]))(({message:e,className:t,noUi:a,sender:s,focusMessage:n,closeAudioPlayer:r})=>{const o=Object(he.a)(),i=s?Object(l.X)(o,s):void 0,d=yt.c(Object(l.E)(e,"inline")),{playPause:b,isPlaying:u}=Object(Ct.a)(Object(l.C)(e),Object(l.q)(e),d,void 0,void 0,!0),h=Object(c.m)(()=>{n({chatId:e.chatId,messageId:e.id})},[n,e.chatId,e.id]),O=Object(c.m)(()=>{u&&b(),r()},[r,u,b]);if(a)return;const j=Object(l.t)(e);return c.a.createElement("div",{className:Object(ne.a)("AudioPlayer",t),dir:o.isRtl?"rtl":void 0},c.a.createElement(fe.a,{round:!0,ripple:!m.l,color:"translucent",size:"smaller",className:Object(ne.a)("toggle-play",u?"pause":"play"),onClick:b,ariaLabel:u?"Pause audio":"Play audio"},c.a.createElement("i",{className:"icon-play"}),c.a.createElement("i",{className:"icon-pause"})),c.a.createElement("div",{className:"AudioPlayer-content",onClick:h},j?function(e){const{title:t,performer:a,fileName:s}=e;return c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"title",dir:"auto"},Object(mt.a)(t||s)),a&&c.a.createElement("div",{className:"subtitle",dir:"auto"},Object(mt.a)(a)))}(j):function(e,t){return c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"title",dir:"auto"},t&&Object(mt.a)(t)),c.a.createElement("div",{className:"subtitle",dir:"auto"},e))}(o("AttachAudio"),i),c.a.createElement(pt.a,null)),c.a.createElement(fe.a,{round:!0,className:"player-close",color:"translucent",size:"smaller",onClick:O,ariaLabel:"Close player"},c.a.createElement("i",{className:"icon-close"})))});a(227);var wt=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const{isLeftColumnShown:n,lastSyncTime:c,shouldSkipHistoryAnimations:r}=e,{byId:i}=e.chats,l=Object(o.g)(e,t),{typingStatus:d}=l||{},{chatId:u,messageId:m}=e.audioPlayer,h=u&&m?Object(o.l)(e,u,m):void 0;let O;if("pinned"===s){const a=Object(o.kb)(e,t);O=a&&a.length}else if("scheduled"===s){const a=Object(o.qb)(e,t);O=a&&a.length}else if("thread"===s&&a!==b.MAIN_THREAD_ID){const s=Object(o.Fb)(e,t,a);s&&(O=s.messagesCount)}const j={typingStatus:d,isLeftColumnShown:n,isRightColumnShown:Object(o.W)(e),isSelectModeActive:Object(o.S)(e),audioMessage:h,chat:l,chatsById:i,messagesCount:O,isChatWithSelf:Object(o.P)(e,t),isChatWithBot:l&&Object(o.O)(e,l),lastSyncTime:c,notifySettings:Object(o.fb)(e),notifyExceptions:Object(o.eb)(e),shouldSkipHistoryAnimations:r,currentTransitionKey:Math.max(0,e.messages.messageLists.length-1)},g=Object(o.n)(e,t);if("thread"!==s||!g)return j;if(Object.assign(j,{messagesById:g}),a!==b.MAIN_THREAD_ID){const s=Object(o.Hb)(e,t,a),n=s?Object(o.l)(e,t,s):void 0,c=n?Object(o.K)(e,n):void 0;return{...j,pinnedMessageIds:s,canUnpin:!1,topMessageSender:c}}const p=Object(o.kb)(e,t);if(p&&p.length){const t=g[p[0]],{canUnpin:s}=t&&Object(o.b)(e,t,a)||{};return{...j,pinnedMessageIds:p,canUnpin:s}}return j},(e,t)=>Object(h.l)(t,["openChatWithInfo","pinMessage","focusMessage","openChat","openPreviousChat","loadPinnedMessages","toggleLeftColumn","exitMessageSelectMode"]))(({chatId:e,threadId:t,messageListType:a,isReady:s,pinnedMessageIds:r,messagesById:o,canUnpin:i,topMessageSender:d,typingStatus:u,isSelectModeActive:h,isLeftColumnShown:O,isRightColumnShown:j,audioMessage:g,chat:p,chatsById:f,messagesCount:I,isChatWithSelf:v,isChatWithBot:y,lastSyncTime:C,notifySettings:E,notifyExceptions:w,shouldSkipHistoryAnimations:M,currentTransitionKey:S,openChatWithInfo:k,pinMessage:N,focusMessage:T,openChat:A,openPreviousChat:P,loadPinnedMessages:R,toggleLeftColumn:x,exitMessageSelectMode:L})=>{const B=Object(he.a)(),[D,F]=Object(c.r)(0),U=Array.isArray(r)?r[D]:r,H=o&&U?o[U]:void 0,q=Array.isArray(r)?r.length:r?1:0,G=p&&Object(l.k)(B,p).length,_=d?Object(l.X)(B,d):void 0;Object(c.n)(()=>{t===b.MAIN_THREAD_ID&&C&&s&&R({chatId:e})},[e,R,C,t,s]),Object(c.n)(()=>{F(0)},[r]),Object(ct.a)(e,U,H);const{width:z}=et(),$=z<=n.kb,V=m.m&&O,W=Object(c.q)(null),K=Object(c.q)(!0),Q=Object(c.m)(()=>{k({id:e})},[k,e]),J=Object(c.m)(t=>{N({chatId:e,messageId:t,isUnpin:!0})},[N,e]),Y=Object(c.m)(()=>{if(H){T({chatId:H.chatId,threadId:t,messageId:H.id});const e=Object(nt.a)(q,D+1);F(e)}},[H,T,t,q,D]),X=Object(c.m)(()=>{A({id:e,threadId:b.MAIN_THREAD_ID,type:"pinned"})},[A,e]),Z=Object(c.m)(e=>{if(m.l){const e=document.getElementById(n.z);e&&e.blur()}t!==b.MAIN_THREAD_ID||"thread"!==a||0!==S?("scheduled"===a&&h&&L(),P()):m.l||V?(e.stopPropagation(),A({id:void 0})):x()},[t,a,S,h,P,V,A,x,L]),ee=Object(c.p)(()=>{if(!$||!f)return;let e=!1;const t=Object.values(f).reduce((t,a)=>{if(Object(l.kb)(a))return t;const s=a.unreadCount||0;return!s||Object(l.Hb)(a,E,w)&&!a.unreadMentionsCount||(e=!0),t+s},0);return t?{isActive:e,totalCount:t}:void 0},[$,f,E,w]),te=z>=n.kb&&zn.ob&&z30),ae=te||z>n.lb&&z0)&&je(V,ee),c.a.createElement("div",{className:"chat-info-wrapper",onClick:Q},Object(l.ob)(e)?c.a.createElement(it.a,{userId:e,typingStatus:u,withFullInfo:y,withMediaViewer:!0,withUpdatingStatus:!0,noRtl:!0}):c.a.createElement(lt.a,{chatId:e,typingStatus:u,noRtl:!0,withMediaViewer:!0,withFullInfo:!0,withUpdatingStatus:!0}))):"thread"===a?c.a.createElement(c.a.Fragment,null,je(),c.a.createElement("h3",null,B("CommentsCount",I))):"pinned"===a?c.a.createElement(c.a.Fragment,null,je(),c.a.createElement("h3",null,B("PinnedMessagesCount",I))):"scheduled"===a?c.a.createElement(c.a.Fragment,null,je(),c.a.createElement("h3",null,v?B("Reminders"):B("messages",I,"i"))):void 0}function je(e=!1,t){return c.a.createElement("div",{className:"back-button"},c.a.createElement(fe.a,{round:!0,size:"smaller",color:"translucent",onClick:Z,ariaLabel:e?"Close":"Back"},c.a.createElement("div",{className:Object(ne.a)("animated-close-icon",!e&&"state-back")})),t&&c.a.createElement("div",{className:"unread-count "+(t.isActive?"active":"")},Object(ot.b)(t.totalCount)))}return Object(c.n)(()=>{const e=W.current;if(e)return ae&&me?void(j||te?(K.current&&(e.classList.add("tools-stacked","animated"),K.current=!1),setTimeout(()=>{e.classList.remove("animated")},350)):(e.classList.remove("tools-stacked"),K.current=!0)):(e.classList.remove("tools-stacked","animated"),void(K.current=!0))},[ae,me,te,j]),c.a.createElement("div",{className:"MiddleHeader",ref:W},c.a.createElement(ue.a,{name:M?"none":"slide-fade",activeKey:S},Oe),c.a.createElement("div",{className:"header-tools"},ie&&de&&!se&&c.a.createElement(vt,{key:e,message:de,count:q,index:D,customTitle:be,className:le,onUnpinMessage:i?J:void 0,onClick:Y,onAllPinnedClick:X}),se&&oe&&c.a.createElement(Et,{key:Object(l.C)(oe),message:oe,className:ce}),c.a.createElement(bt,{chatId:e,threadId:t,messageListType:a})))})),Mt=a(165),St=a(58);function kt(e){return"albumId"in e}function Nt(e,t){let a,s=[],n={originalDate:e[0].date,datetime:Number(Object(x.j)(1e3*e[0].date)),senderGroups:[s]};const c=[n];return e.forEach((r,o)=>{r.isInAlbum?a?(a.messages.push(r),r.content.text&&(a.mainMessage=r)):a={albumId:r.groupedId,messages:[r],mainMessage:r}:s.push(r);const i=e[o+1];if(!a||i&&i.groupedId&&i.groupedId===a.albumId||(s.push(a),a=void 0),i){const e=Number(Object(x.j)(1e3*i.date));n.datetime!==e?(n={originalDate:i.date,datetime:e,senderGroups:[]},c.push(n),s=[],n.senderGroups.push(s)):(i.id===t||r.senderId!==i.senderId||r.isOutgoing!==i.isOutgoing||Object(l.gb)(r)||Object(l.gb)(i)||r.forwardInfo&&i.forwardInfo&&(r.forwardInfo.senderUserId!==i.forwardInfo.senderUserId||r.forwardInfo.fromChatId!==i.forwardInfo.fromChatId||r.forwardInfo.hiddenUserName!==i.forwardInfo.hiddenUserName)||r.inlineButtons||i.inlineButtons||i.date-r.date>600)&&(s=[],n.senderGroups.push(s))}}),c}function Tt(e){!m.l&&document.activeElement&&document.activeElement.id===n.z&&e.target===e.currentTarget&&e.preventDefault()}function At(){const[e,t]=Object(me.a)(!1),a=(s=1e3,n=!1,Object(c.p)(()=>Object(f.a)(e=>e(),s,n,r),[s,n,r]));var s,n,r;return{isScrolled:e,updateStickyDates:Object(c.m)((e,s)=>{t(),document.body.classList.contains("is-scrolling-messages")||Object(f.b)(()=>{document.body.classList.add("is-scrolling-messages")}),a(()=>{Object(f.b)(()=>{const t=document.querySelector(".stuck");t&&t.classList.remove("stuck");const a=function(e,t){const a=e.querySelectorAll(".sticky-date"),s=e.scrollTop;return Array.from(a).find(e=>{const{offsetTop:a,offsetHeight:n}=e,c=a-s;return-n<=c&&c<=(t?60:10)})}(e,s);a&&a.classList.add("stuck"),document.body.classList.remove("is-scrolling-messages")})})},[t,a])}}var Pt=a(160),Rt=a(131),xt=a(109);const Lt=m.b?1e3:350,Bt=m.l?300:500;var Dt=a(150),Ft=a(151);function Ut(e){return"number"==typeof e}function Ht(e,t){return e?t?238:175:t?238:100}function qt(e,t){const a=Object(l.yb)(e),s=Object(l.tb)(e),n=Object(l.H)(e)||Object(l.S)(e),c=Object(l.Q)(e),r=Boolean(Object(l.S)(e)),{width:o,height:i}=n?Object(ut.g)(n,a,s,r,t):Object(ut.i)(c,a,s,t),d=Ht(Boolean(Object(l.P)(e)));let b=1;oe+t,t)}function Kt(e,t,a){return ea?a:e}function Qt(e){const t={width:0,height:0};return e.forEach(({dimensions:e,sides:a})=>{a&zt&&(t.width=e.width+e.x),a&$t&&(t.height=e.height+e.y)}),t}function Jt(e,t,a,s){const n=s.messages.map(e=>{const t=qt(e);return t.width/t.height});const c=function(e){return e.map(e=>e>1.2?"w":e<.8?"n":"q").join("")}(n),r=function(e){return e.reduce((e,t)=>t+e,1)/e.length}(n),o=n.length,i=n.some(e=>e>2),l=Object(ut.j)(e,t,!1,a)-(t?2.5:0)*ut.d;let d;const b={ratios:n,proportions:c,averageRatio:r,maxWidth:l,minWidth:100,maxHeight:l,spacing:2};return d=o>=5||i?function({ratios:e,averageRatio:t,maxWidth:a,minWidth:s,spacing:n,maxHeight:c=4*a/3}){const r=function(e,t){return e.map(e=>t>1.1?Kt(e,1,2.75):Kt(e,.6667,1))}(e,t),o=e.length,i=new Array(o),l=[],d=e=>{const t=[];let s=0;e.forEach(e=>{t.push(((e,t)=>{const s=Wt(r.slice(e,e+t),0);return(a-(t-1)*n)/s})(s,e)),s+=e}),l.push({lineCounts:e,heights:t})};for(let e=1;e!==o;++e){const t=o-e;e<=3&&t<=3&&d([e,t])}for(let e=1;e!==o-1;++e)for(let a=1;a!==o-e;++a){const s=o-e-a;e<=3&&a<=(t<.85?4:3)&&s<=3&&d([e,a,s])}for(let e=1;e!==o-1;++e)for(let t=1;t!==o-e;++t)for(let a=1;a!==o-e-t;++a){const s=o-e-t-a;e<=3&&t<=3&&a<=3&&s<=4&&d([e,t,a,s])}let b,u=0;for(let e=0;e{for(let e=1;e!==r;++e)if(a[e-1]>a[e])return 1.5;return 1})(),m=Math.abs(o-c)*i*d;(!b||m1.4&&t[1]-t[0]<.2?function(e){const{ratios:t,maxWidth:a,spacing:s,maxHeight:n}=e,c=Math.round(Math.min(a/t[0],Math.min(a/t[1],(n-s)/2)));return[{dimensions:{x:0,y:0,width:a,height:c},sides:Vt|_t|zt},{dimensions:{x:0,y:c+s,width:a,height:c},sides:Vt|$t|zt}]}(e):"ww"===a||"qq"===a?function(e){const{ratios:t,maxWidth:a,spacing:s,maxHeight:n}=e,c=(a-s)/2,r=Math.round(Math.min(c/t[0],Math.min(c/t[1],n)));return[{dimensions:{x:0,y:0,width:c,height:r},sides:_t|Vt|$t},{dimensions:{x:c+s,y:0,width:c,height:r},sides:_t|zt|$t}]}(e):function(e){const{ratios:t,minWidth:a,maxWidth:s,spacing:n,maxHeight:c}=e,r=Math.round(1.5*a),o=Math.min(Math.round(Math.max(.4*(s-n),(s-n)/t[0]/(1/t[0]+1/t[1]))),s-n-r),i=s-o-n,l=Math.min(c,Math.round(Math.min(i/t[0],o/t[1])));return[{dimensions:{x:0,y:0,width:i,height:l},sides:_t|Vt|$t},{dimensions:{x:i+n,y:0,width:o,height:l},sides:_t|zt|$t}]}(e)}(b):3===o?function(e){const{proportions:t}=e;return"n"===t[0]?function(e){const{maxHeight:t,spacing:a,ratios:s,maxWidth:n,minWidth:c}=e,r=t,o=Math.round(Math.min((t-a)/2,s[1]*(n-a)/(s[2]+s[1]))),i=r-o-a,l=Math.max(c,Math.round(Math.min((n-a)/2,Math.min(o*s[2],i*s[1])))),d=Math.min(Math.round(r*s[0]),n-a-l);return[{dimensions:{x:0,y:0,width:d,height:r},sides:_t|Vt|$t},{dimensions:{x:d+a,y:0,width:l,height:i},sides:_t|zt},{dimensions:{x:d+a,y:i+a,width:l,height:o},sides:$t|zt}]}(e):function(e){const{maxWidth:t,ratios:a,maxHeight:s,spacing:n}=e,c=t,r=Math.round(Math.min(c/a[0],.66*(s-n))),o=(t-n)/2,i=Math.min(s-r-n,Math.round(Math.min(o/a[1],o/a[2])));return[{dimensions:{x:0,y:0,width:c,height:r},sides:Vt|_t|zt},{dimensions:{x:0,y:r+n,width:o,height:i},sides:$t|Vt},{dimensions:{x:o+n,y:r+n,width:c-o-n,height:i},sides:$t|zt}]}(e)}(b):function(e){const{proportions:t}=e;return"w"===t[0]?function({maxWidth:e,ratios:t,spacing:a,maxHeight:s,minWidth:n}){const c=e,r=Math.round(Math.min(c/t[0],.66*(s-a))),o=Math.round((e-2*a)/(t[1]+t[2]+t[3])),i=Math.max(n,Math.round(Math.min(.4*(e-2*a),o*t[1]))),l=Math.round(Math.max(Math.max(n,.33*(e-2*a)),o*t[3])),d=c-i-l-2*a,b=Math.min(s-r-a,o);return[{dimensions:{x:0,y:0,width:c,height:r},sides:Vt|_t|zt},{dimensions:{x:0,y:r+a,width:i,height:b},sides:$t|Vt},{dimensions:{x:i+a,y:r+a,width:d,height:b},sides:$t},{dimensions:{x:i+a+d+a,y:r+a,width:l,height:b},sides:zt|$t}]}(e):function({maxHeight:e,ratios:t,maxWidth:a,spacing:s,minWidth:n}){const c=e,r=Math.round(Math.min(c*t[0],.6*(a-s))),o=Math.round((e-2*s)/(1/t[1]+1/t[2]+1/t[3])),i=Math.round(o/t[1]),l=Math.round(o/t[2]),d=c-i-l-2*s,b=Math.max(n,Math.min(a-r-s,o));return[{dimensions:{x:0,y:0,width:r,height:c},sides:_t|Vt|$t},{dimensions:{x:r+s,y:0,width:b,height:i},sides:_t|zt},{dimensions:{x:r+s,y:i+s,width:b,height:l},sides:zt},{dimensions:{x:r+s,y:i+l+2*s,width:b,height:d},sides:$t|zt}]}(e)}(b),{layout:d,containerStyle:Qt(d)}}let Yt;function Xt(e){return Yt||(Yt=document.createElement("span"),Yt.style.font=m.e?'400 12px system-ui, -apple-system, BlinkMacSystemFont, "Roboto", "Apple Color Emoji", "Helvetica Neue", sans-serif':'400 12px "Roboto", -apple-system, "Apple Color Emoji", BlinkMacSystemFont, "Helvetica Neue", sans-serif',Yt.style.whiteSpace="nowrap",Yt.style.position="absolute",Yt.style.left="-999px",Yt.style.opacity=".01",document.body.appendChild(Yt)),Yt.innerHTML=e,Yt.offsetWidth}function Zt(e,t,a,s,n){Object(c.o)(()=>{if(a&&e.current){const t=e.current.closest(".MessageList");Object(Rt.a)(t,e.current,n?"end":"centerOrTop",20,void 0!==s?1e3:void 0,s)}},[e,t,a,s,n])}var ea=a(114),ta=a(68);var aa=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"ContextMenuContainer",!t);return a?c.a.createElement(a,e):void 0});var sa=Object(c.h)(Object(s.h)((e,{message:t})=>{const{byId:a}=e.users,s=t.senderId,{targetUserIds:n,targetChatId:c}=t.content.action||{},r=t.replyToMessageId,i=r?Object(o.l)(e,t.chatId,r):void 0,d=Object(o.U)(e,t),{direction:b,noHighlight:u}=d&&e.focusedMessage||{},m=Object(o.g)(e,t.chatId);return{usersById:a,sender:m&&(Object(l.mb)(m)||s===t.chatId)?m:s?Object(o.Jb)(e,s):void 0,targetChatId:c,targetUserIds:n,targetMessage:i,isFocused:d,...d&&{focusDirection:b,noFocusHighlight:u}}})(({message:e,observeIntersection:t,isEmbedded:a,appearanceOrder:s=0,isLastInList:n,usersById:r,sender:o,targetUserIds:i,targetMessage:l,targetChatId:d,isFocused:b,focusDirection:u,noFocusHighlight:m})=>{const h=Object(c.q)(null);Object(xt.c)(h,t),Object(ct.a)(e.chatId,e.replyToMessageId,l),Zt(h,e.chatId,b,u,m);const O=Object(he.a)(),j=s<=0,[g,p]=Object(me.a)(j);Object(c.n)(()=>{j||setTimeout(p,10*s)},[s,p,j]);const{transitionClassNames:f}=Object(re.a)(g,void 0,j,!1),I=Object(c.p)(()=>i?i.map(e=>r&&r[e]).filter(Boolean):void 0,[i,r]),v=Object(ta.a)(O,e,o,I,l,d,a?{isEmbedded:!0,asPlain:!0}:void 0),{isContextMenuOpen:y,contextMenuPosition:C,handleBeforeContextMenu:E,handleContextMenu:w,handleContextMenuClose:M,handleContextMenuHide:S}=Object(Dt.a)(h),k=void 0!==C;if(a)return c.a.createElement("span",{className:"embedded-action-message"},Object(mt.a)(v));const N=Object(ne.a)("ActionMessage message-list-item",b&&!m&&"focused",k&&"has-menu-open",n&&"last-in-list",f);return c.a.createElement("div",{ref:h,id:"message"+e.id,className:N,"data-message-id":e.id,onMouseDown:e=>{Tt(e),E(e)},onContextMenu:w},c.a.createElement("span",null,v),C&&c.a.createElement(aa,{isOpen:y,anchor:C,message:e,messageListType:"thread",onClose:M,onCloseAnimationEnd:S}))}));a(228);var na=({className:e,message:t,sender:a,title:s,customText:n,observeIntersection:r,onClick:o})=>{const i=Object(c.q)(null),d=Object(xt.b)(i,r),b=Object(ht.a)(t&&Object(l.E)(t,"pictogram"),!d),u=t&&"sticker-reply-thumb"+t.id,m=jt(t),h=Boolean(t&&Object(l.J)(t)),O=Object(he.a)(),j=a&&Object(l.X)(O,a);return c.a.createElement("div",{ref:i,className:Object(ne.a)("EmbeddedMessage",e),onClick:t?o:void 0},m&&function(e,t,a,s){const{width:n,height:r}=Object(ut.m)();return c.a.createElement("img",{id:e,src:a||t,width:n,height:r,alt:"",className:s?"round":""})}(u,m,b,h),c.a.createElement("div",{className:"message-text"},c.a.createElement("p",{dir:"auto"},t?Object(l.gb)(t)?c.a.createElement(sa,{message:t,isEmbedded:!0}):Object(mt.a)(Object(l.O)(O,t,Boolean(m))):n||" "),c.a.createElement("div",{className:"message-title",dir:"auto"},Object(mt.a)(j||s||" "))))},ca=a(166),ra=a(175),oa=a(181);a(232);var ia=Object(c.h)(({message:e,outgoingStatus:t,signature:a,onClick:s})=>{const n=Object(he.a)();return c.a.createElement("span",{className:"MessageMeta",dir:n.isRtl?"rtl":"ltr",onClick:s},Boolean(e.views)&&c.a.createElement(c.a.Fragment,null,c.a.createElement("span",{className:"message-views"},Object(ot.b)(e.views)),c.a.createElement("i",{className:"icon-channelviews"})),a&&c.a.createElement("span",{className:"message-signature"},Object(mt.a)(a)),c.a.createElement("span",{className:"message-time"},e.isEdited&&n("EditedMessage")+" ",Object(x.h)(1e3*e.date)),t&&c.a.createElement(oa.a,{status:t}))}),la=a(117),da=a(119),ba=a(167);a(233);var ua=({message:e,observeIntersection:t,observeIntersectionForPlaying:a,shouldLoop:s,lastSyncTime:r})=>{const o=Object(c.q)(null),[i,d,b]=Object(me.a)(),u=e.content.sticker,{isAnimated:m,stickerSetId:h}=u,O=h===n.db,j=Object(xt.b)(o,t),g=Object(xt.b)(o,a),p=u.isPreloadedGlobally?"sticker"+u.id:Object(l.E)(e,"inline"),f=jt(e),I=Object(ht.a)(p,!j,Object(l.D)(e,"inline",!0),r),v=Boolean(I),[y,C]=Object(me.a)(v),E=m?y:v,{shouldRenderFullMedia:w,transitionClassNames:M}=Object(la.a)(E,"slow"),{width:S,height:k}=Object(ut.n)(u),N=Object(ne.a)("thumbnail",!f&&"empty"),T=Object(ne.a)("Sticker media-inner",O&&"inactive");return c.a.createElement("div",{ref:o,className:T,onClick:O?void 0:d},!E&&c.a.createElement("img",{id:"sticker-thumb-"+e.id,src:f,width:S,height:k,alt:"",className:N}),!m&&w&&c.a.createElement("img",{id:"sticker-"+e.id,src:I,width:S,height:k,alt:"",className:Object(ne.a)("full-media",M)}),m&&v&&c.a.createElement(da.a,{key:p,className:Object(ne.a)("full-media",M),id:p,animationData:I,size:S,play:g,noLoop:!s,onLoad:C}),c.a.createElement(ba.a,{isOpen:i,fromSticker:u,onClose:b}))},ma=a(129),ha=a(123),Oa=a(168);function ja(e,t){return Object(Oa.a)(Object(l.F)(e),Boolean(t),m.l&&!m.c)}var ga=a(29);const pa=Promise.resolve("rgba(255,255,255,1)");function fa(e,t,a,s){return s?pa:async function(e,t){const a=new Image;a.src=e,a.width||await new Promise(e=>{a.onload=e});const s=document.createElement("canvas"),n=s.getContext("2d");s.width=a.width,s.height=a.height,n.drawImage(a,0,0,a.width,a.height);const c=t?a.width-1:0,r=a.height-1;return`rgba(${Array.from(n.getImageData(c,r,1,1).data).join(",")})`}(e,t)}var Ia=a(124);var va=({id:e,message:t,observeIntersection:a,noAvatars:s,shouldAutoLoad:n,isInSelectMode:r,isSelected:o,uploadProgress:i,size:d="inline",dimensions:b,nonInteractive:u,shouldAffectAppendix:m,onClick:h,onCancelUpload:O})=>{const j=Object(c.q)(null),g=(Object(l.H)(t)||Object(l.S)(t)).blobUrl,p=Object(xt.b)(j,a),[f,I]=Object(c.r)(n),v=f&&p,{mediaData:y,downloadProgress:C}=Object(ha.a)(Object(l.E)(t,d),!v),E=g||y,w=ja(t,E),{isUploading:M,isTransferring:S,transferProgress:k}=Object(l.r)(t,i||C,v&&!E),N=!1===Object(ga.a)(f),{shouldRender:T,transitionClassNames:A}=Object(re.a)(S,void 0,N,"slow"),{shouldRenderThumb:P,shouldRenderFullMedia:R,transitionClassNames:x}=Object(la.a)(E,"slow"),L=Object(c.m)(()=>{M?O&&O(t):E?h&&h(t.id):I(e=>!e)},[E,M,t,O,h]),B=Object(l.yb)(t);Object(c.o)(()=>{if(!m)return;const e=j.current.closest(".message-content");E?fa(E,B,0,o).then(t=>{e.style.setProperty("--appendix-bg",t),e.setAttribute("data-has-custom-appendix","")}):e.classList.add("has-appendix-thumb")},[E,B,m,r,o]);const{width:D,height:F,isSmall:U}=b||qt(t,s),H=Object(ne.a)("media-inner",!M&&!u&&"interactive",U&&"small-image",D===F&&"square-image"),q=b?`width: ${D}px; height: ${F}px; left: ${b.x}px; top: ${b.y}px;`:"";return c.a.createElement("div",{id:e,ref:j,className:H,style:q,onClick:M?void 0:L},P&&c.a.createElement("canvas",{ref:w,className:"thumbnail",style:`width: ${D}px; height: ${F}px`}),R&&c.a.createElement("img",{src:E,className:"full-media "+x,width:D,height:F,alt:""}),T&&c.a.createElement("div",{className:"media-loading "+A},c.a.createElement(Ia.a,{progress:k,onClick:M?L:void 0})),!E&&!f&&c.a.createElement("i",{className:"icon-download"}),S&&c.a.createElement("span",{className:"message-upload-progress"},Math.round(100*k),"%"))},ya=a(141),Ca=a(140);function Ea(e,t){const a=Object(c.q)();a.current=t;const s=Object(c.m)(()=>{e.current&&e.current.pause()},[e]),n=Object(c.m)(()=>{e.current&&a.current&&Object(Ca.a)(e.current)},[e]);Object(se.c)(s,n)}var wa=a(152),Ma=(e,t=!1)=>{const a=Object(c.q)(!1),s=Object(c.q)(!1),n=Object(c.m)(()=>{s.current=!0,t&&e.current&&(a.current||(a.current=!e.current.paused),e.current.pause())},[t,e]),r=Object(c.m)(()=>{t&&e.current&&a.current&&document.body.contains(e.current)&&Object(Ca.a)(e.current),a.current=!1,s.current=!1},[t,e]),o=Object(c.m)(()=>{Object(f.b)(r)},[r]);document.hasFocus()||n(),Object(oe.a)(n,o)};function Sa(){return(Sa=Object.assign||function(e){for(var t=1;t{const m=Object(c.q)(null),h=Object(c.q)(null),O=Object(l.Q)(t)||Object(l.T)(t),j=O.blobUrl,g=Object(xt.b)(m,a),[p,f]=Object(c.r)(n),I=Boolean(p&&g&&i),[v,y]=Object(c.r)(r),C=Object(ht.a)(Object(l.E)(t,"pictogram"),!(g&&i),Object(l.D)(t,"pictogram"),i),{mediaData:E,downloadProgress:w}=Object(ha.a)(Object(l.E)(t,"inline"),!I,Object(l.D)(t,"inline"),i),M=j||E,S=Boolean(g&&M),k=ja(t,C),{isBuffered:N,bufferingHandlers:T}=Object(ya.a)(!n),{isUploading:A,isTransferring:P,transferProgress:R}=Object(l.r)(t,o||w,I&&!N),L=!1===Object(ga.a)(p),{shouldRender:B,transitionClassNames:D}=Object(re.a)(P,void 0,L),{transitionClassNames:F}=Object(la.a)(M,"slow"),[U,H]=Object(c.r)(0),q=Object(c.m)(e=>{H(Math.max(0,e.currentTarget.currentTime-1))},[]),G=h.current&&h.current.duration||O.duration||0,_=Object(l.yb)(t),z=Object(l.tb)(t),{width:$,height:V}=d||Object(ut.i)(O,_,z,s);Ea(h,Boolean(S&&r)),Ma(h,v),Object(wa.a)(h,[S]);const W=Object(c.m)(()=>{A?u&&u(t):M?M&&!v?(y(!0),h.current.play()):b&&b(t.id):f(e=>!e)},[A,M,v,b,u,t]),K=Object(ne.a)("media-inner dark",!A&&"interactive"),Q=Object(ne.a)("full-media",F),J=d?`width: ${$}px; height: ${V}px; left: ${d.x}px; top: ${d.y}px;`:"";return c.a.createElement("div",{ref:m,id:e,className:K,style:J,onClick:A?void 0:W},!C&&c.a.createElement("canvas",{ref:k,className:"thumbnail",style:`width: ${$}px; height: ${V}px;`}),C&&c.a.createElement("img",{src:C,className:"thumbnail",style:`width: ${$}px; height: ${V}px;`,alt:""}),S&&c.a.createElement("video",Sa({ref:h,className:Q,width:$,height:V,autoPlay:v,muted:!0,loop:!0,playsInline:!0},T,{onTimeUpdate:q}),c.a.createElement("source",{src:M})),p&&!v&&!B&&c.a.createElement("i",{className:"icon-large-play"}),B&&c.a.createElement("div",{className:"media-loading "+D},c.a.createElement(Ia.a,{progress:R,onClick:A?W:void 0})),!p&&c.a.createElement("i",{className:"icon-download"}),P?c.a.createElement("span",{className:"message-upload-progress"},"..."):c.a.createElement("div",{className:"message-media-duration"},O.isGif?"GIF":Object(x.e)(Math.max(G-U,0))))},Na=a(23);a(234);var Ta=Object(s.h)((e,{contact:t})=>({user:Object(o.Jb)(e,t.userId)}),(e,t)=>Object(h.l)(t,["openUserInfo"]))(({contact:e,user:t,openUserInfo:a})=>{const{firstName:s,lastName:n,phoneNumber:r,userId:o}=e,i=Object(c.m)(()=>{a({id:o})},[a,o]);return c.a.createElement("div",{className:Object(ne.a)("Contact",Boolean(o)&&"interactive"),onClick:o?i:void 0},c.a.createElement(ea.a,{size:"large",user:t,text:s||n}),c.a.createElement("div",{className:"contact-info"},c.a.createElement("div",{className:"contact-name"},s," ",n),c.a.createElement("div",{className:"contact-phone"},Object(Na.c)(r))))}),Aa=a(48);var Pa=Object(c.h)(({id:e,options:t,selected:a=[],disabled:s,round:n,loadingOptions:r,onChange:o})=>{const[i,l]=Object(c.r)([]),d=Object(c.m)(e=>{const{value:t,checked:a}=e.currentTarget;let s;s=a?[...i,t]:i.filter(e=>e!==t),l(s),o(s)},[o,i]);return c.a.createElement("div",{id:e,className:"radio-group"},t.map(e=>c.a.createElement(Aa.a,{label:e.label,subLabel:e.subLabel,value:e.value,checked:-1!==a.indexOf(e.value),disabled:s,round:n,isLoading:r?-1!==r.indexOf(e.value):void 0,onChange:d})))}),Ra=a(126),xa=a(189);a(237);function La(e,t){return t>0?(e/t*100).toFixed():0}var Ba=({answer:e,voteResults:t,totalVoters:a,maxVotersCount:s,correctResults:n,shouldAnimate:r})=>{const o=t&&t.find(t=>t.option===e.option),i=0===n.length||-1!==n.indexOf(e.option),l=n.length>0&&i||o&&o.isChosen,d=o?La(o.votersCount,a||0):0,[b,u]=Object(c.r)(r?0:d),m=Object(c.q)(null),h=o?La(o.votersCount,s||0):0,O=b{r&&u(d)},[r,d]),Object(c.n)(()=>{const e=m.current;if(e&&r){const t=e.firstElementChild,a=O?"":"stroke-dasharray: 100% 200%; stroke-dashoffset: -44";t?t.setAttribute("style",a):e.innerHTML=`\n \n \n `}},[O,r]),!t||!o)return;const j=`width: ${h}%; transform:scaleX(${O?0:1})`;return c.a.createElement("div",{className:"PollOption",dir:"ltr"},c.a.createElement("div",{className:"poll-option-share "+("100"===d?"limit-width":"")},d,"%",l&&c.a.createElement("span",{className:Object(ne.a)("poll-option-chosen",!i&&"wrong",r&&"animate")},c.a.createElement("i",{className:i?"icon-check":"icon-close"}))),c.a.createElement("div",{className:"poll-option-right"},c.a.createElement("div",{className:"poll-option-text",dir:"auto"},Object(mt.a)(e.text)),c.a.createElement("div",{className:Object(ne.a)("poll-option-answer",l&&!i&&"wrong")},c.a.createElement("div",{className:"poll-option-corner",ref:m}),c.a.createElement("div",{className:"poll-option-line",style:j}))))};a(238);var Da=Object(c.h)(Object(s.h)((e,{poll:t})=>{const{recentVoterIds:a}=t.results,{serverTimeOffset:s,users:{byId:n}}=e;return a&&0!==a.length?{recentVoterIds:a,usersById:n,serverTimeOffset:s}:{}},(e,t)=>Object(h.l)(t,["loadMessage","openPollResults"]))(({message:e,poll:t,recentVoterIds:a,usersById:s,loadMessage:n,onSendVote:r,openPollResults:o,serverTimeOffset:i})=>{const{id:l,chatId:d}=e,{summary:b,results:u}=t,[m,h]=Object(c.r)(!1),[O,j]=Object(c.r)([]),[g,p]=Object(c.r)(!1),[f,I]=Object(c.r)(!1),[v,y]=Object(c.r)(!b.closed&&b.closeDate&&b.closeDate>0?Math.min(b.closeDate-Math.floor(Date.now()/1e3)+i,b.closePeriod):0),C=Object(c.q)(null),{results:E,totalVoters:w}=u,M=E&&E.some(e=>e.isChosen),S=!b.closed&&!M,k=!S&&b.isPublic&&Number(u.totalVoters)>0,N=S&&b.multipleChoice,T=E?Math.max(...E.map(e=>e.votersCount)):w,A=E?E.reduce((e,t)=>(t.isCorrect&&e.push(t.option),e),[]):[],P=b.answers.map(e=>({label:e.text,value:e.option,hidden:Boolean(b.quiz&&b.closePeriod&&v<=0)}));Object(c.n)(()=>{m&&t.results.results&&t.results.results.some(e=>e.isChosen)&&h(!1)},[m,t.results.results]),Object(c.n)(()=>{v>0&&setTimeout(()=>y(v-1),1e3);const e=C.current;if(e){const t=12*Math.PI,a=e.lastElementChild,s=e.firstElementChild;if(v<=5&&e.classList.add("hurry-up"),a&&s){const e=(b.closePeriod-v)/b.closePeriod*t;s.textContent=Object(x.e)(v),a.firstElementChild.setAttribute("stroke-dashoffset","-"+e)}else e.innerHTML=`\n ${Object(x.e)(v)}\n \n \n `}},[v,b.closePeriod]),Object(c.n)(()=>{b.quiz&&(v<=0||M&&!b.closed)&&n({chatId:d,messageId:l})},[d,v,M,n,l,b.closed,b.quiz]),Object(c.n)(()=>{let e;return b.quiz&&!b.closed&&b.closePeriod&&b.closePeriod>0&&(e=window.setTimeout(()=>{n({chatId:d,messageId:l})},1e3*b.closePeriod)),()=>{e&&window.clearTimeout(e)}},[S,d,n,l,b.closePeriod,b.closed,b.quiz]);const R=Object(c.p)(()=>a?a.reduce((e,t)=>{const a=s[t];return a&&e.push(a),e},[]):[],[s,a]),L=Object(c.m)(e=>{j([e]),h(!0),I(!0),r([e])},[r]),B=Object(c.m)(e=>{j(e)},[]),D=Object(c.m)(()=>{h(!0),I(!0),r(O)},[r,O]),F=Object(c.m)(()=>{o({chatId:d,messageId:l})},[d,l,o]),U=Object(c.m)(()=>{p(!0)},[]),H=Object(c.m)(()=>{p(!1),I(!1)},[]);Object(c.n)(()=>{if(f&&M&&b.quiz&&u.results&&t.results.solution){u.results.find(e=>e.isChosen&&e.isCorrect)||p(!0)}},[M,f,u.results,b.quiz,t.results.solution]);const q=Object(he.a)();return c.a.createElement("div",{className:"Poll",dir:q.isRtl?"auto":"ltr"},g&&t.results.solution&&c.a.createElement(xa.a,{message:Object(Ft.b)(t.results.solution,t.results.solutionEntities),duration:5e3,onDismiss:H,containerId:"#middle-column-portals"}),c.a.createElement("div",{className:"poll-question"},Object(mt.a)(b.question)),c.a.createElement("div",{className:"poll-type"},q(function(e){if(void 0===e.isPublic)return" ";if(e.quiz)return e.isPublic?"QuizPoll":"AnonymousQuizPoll";if(e.closed)return"FinalResults";return e.isPublic?"PublicPoll":"AnonymousPoll"}(b)),R.length>0&&c.a.createElement("div",{className:"poll-recent-voters"},R.map(e=>c.a.createElement(ea.a,{size:"micro",user:e}))),v>0&&S&&c.a.createElement("div",{ref:C,className:"poll-countdown"}),b.quiz&&t.results.solution&&!S&&c.a.createElement(fe.a,{round:!0,size:"tiny",color:"translucent",className:"poll-quiz-help",disabled:g,onClick:U,ariaLabel:"Show Solution"},c.a.createElement("i",{className:"icon-lamp"}))),S&&c.a.createElement("div",{className:"poll-answers"},N?c.a.createElement(Pa,{options:P,onChange:B,disabled:e.isScheduled||m,loadingOptions:m?O:void 0,round:!0}):c.a.createElement(Ra.a,{name:"poll-"+l,options:P,onChange:L,disabled:e.isScheduled||m,loadingOption:m?O[0]:void 0})),!S&&c.a.createElement("div",{className:"poll-results"},b.answers.map((function(e){return c.a.createElement(Ba,{key:e.option,shouldAnimate:f,answer:e,voteResults:E,totalVoters:w,maxVotersCount:T,correctResults:A})}))),!k&&!N&&c.a.createElement("div",{className:"poll-voters-count"},function(e,t,a){if(!a)return e(t?"Chat.Quiz.TotalVotesEmpty":"Chat.Poll.TotalVotesResultEmpty");return e(t?"Answer":"Vote",a,"i")}(q,b.quiz,u.totalVoters)),N&&c.a.createElement(fe.a,{isText:!0,disabled:0===O.length,size:"tiny",onClick:D},q("PollSubmitVotes")),k&&c.a.createElement(fe.a,{isText:!0,size:"tiny",onClick:F},q("PollViewResults")))})),Fa=a(41),Ua=a(59);a(239);var Ha=Object(c.h)(({message:e,observeIntersection:t,noAvatars:a,shouldAutoLoad:s,shouldAutoPlay:n,inPreview:r,lastSyncTime:o,onMediaClick:i,onCancelMediaTransfer:d})=>{const b=Object(l.R)(e);let u=!1;if(b&&b.photo&&!b.video){const{width:t,height:a}=qt(e);u=t===a}const m=Object(c.m)(()=>{i()},[i]);if(!b)return;const{siteName:h,url:O,displayUrl:j,title:g,description:p,photo:f,video:I}=b,v=(f||I)&&i&&!u,y=Object(Fa.a)(p,170),C=Object(ne.a)("WebPage",u&&"with-square-photo",!f&&!I&&!r&&"without-media",I&&"with-video");return c.a.createElement("div",{className:C,"data-initial":(h||j)[0],dir:"auto"},f&&!I&&c.a.createElement(va,{message:e,observeIntersection:t,noAvatars:a,shouldAutoLoad:s,size:u?"pictogram":"inline",nonInteractive:!v,onClick:v?m:void 0,onCancelUpload:d}),c.a.createElement("div",{className:"WebPage-text"},c.a.createElement(Ua.a,{className:"site-name",url:O,text:h||j}),!r&&g&&c.a.createElement("p",{className:"site-title"},Object(mt.a)(g)),y&&c.a.createElement("p",{className:"site-description"},Object(mt.a)(y,["emoji","br"]))),!r&&I&&c.a.createElement(ka,{message:e,observeIntersection:t,noAvatars:a,shouldAutoLoad:s,shouldAutoPlay:n,lastSyncTime:o,onClick:v?m:void 0,onCancelUpload:d}))});a(240);var qa=Object(c.h)(({message:e})=>{const t=Object(l.B)(e),{title:a,text:s,description:n,photoUrl:r}=t;return c.a.createElement("div",{className:"Invoice"},a&&c.a.createElement("p",{className:"title"},Object(mt.a)(a)),s&&c.a.createElement("p",null,Object(mt.a)(s,["emoji","br"])),c.a.createElement("div",{className:"description "+(r?"has-image":"")},r&&c.a.createElement("img",{className:"invoice-image",src:r,alt:""}),n&&c.a.createElement("p",{className:"description-text"},Object(mt.a)(n,["emoji","br"]))))});function Ga(e){return Object(c.h)(Object(s.h)((e,t)=>{const{message:a}=t;return{isInSelectMode:Object(o.S)(e),isSelected:Object(o.V)(e,a.id)}},(e,t)=>Object(h.l)(t,["toggleMessageSelection"]))(t=>{const{isInSelectMode:a,isSelected:s,message:n,toggleMessageSelection:r,dimensions:o}=t,i=Object(c.m)(e=>{e.stopPropagation(),r({messageId:n.id,withShift:e&&e.shiftKey})},[r,n]),l=Object(c.p)(()=>({...t,isInSelectMode:a,isSelected:s,dimensions:{...t.dimensions,x:0,y:0},onClick:a?void 0:t.onClick}),[t,a,s]);return c.a.createElement("div",{className:Object(ne.a)("album-item-select-wrapper",s&&"is-selected"),style:o?`left: ${o.x}px; top: ${o.y}px;`:"",onClick:a?i:void 0},a&&c.a.createElement("div",{className:"message-select-control"},s&&c.a.createElement("i",{className:"icon-select"})),c.a.createElement(e,l))}))}a(241);const _a=Ga(va),za=Ga(ka);var $a=Object(s.h)(e=>({uploadsById:e.fileUploads.byMessageLocalId}),(e,t)=>Object(h.l)(t,["cancelSendingMessage"]))(({album:e,observeIntersection:t,shouldAutoLoad:a,shouldAutoPlay:s,hasCustomAppendix:n,lastSyncTime:r,isOwn:o,albumLayout:i,onMediaClick:d,uploadsById:b,cancelSendingMessage:u})=>{const m=e.messages.length,h=Object(c.m)(e=>{u({chatId:e.chatId,messageId:e.id})},[u]);const{width:O,height:j}=i.containerStyle;return c.a.createElement("div",{className:"Album",style:`width: ${O}px; height: ${j}px;`},e.messages.map((function(e,u){const{photo:O,video:j}=Object(l.v)(e),g=b[e.previousLocalId||e.id],p=g?g.progress:void 0,{dimensions:f,sides:I}=i.layout[u];if(O){const s=n&&(o?u===m-1:Boolean(I&Vt&&I&$t));return c.a.createElement(_a,{id:"album-media-"+e.id,message:e,observeIntersection:t,shouldAutoLoad:a,shouldAffectAppendix:s,uploadProgress:p,dimensions:f,onClick:d,onCancelUpload:h})}if(j)return c.a.createElement(za,{id:"album-media-"+e.id,message:e,observeIntersection:t,shouldAutoLoad:a,shouldAutoPlay:s,uploadProgress:p,lastSyncTime:r,dimensions:f,onClick:d,onCancelUpload:h})})))});a(242);function Va(){return(Va=Object.assign||function(e){for(var t=1;t{const r=Object(c.q)(null),o=Object(c.q)(null),i=Object(c.q)(null),d=e.content.video,b=Object(xt.b)(r,t),[u,m]=Object(c.r)(a&&s),h=Boolean(u&&b&&n),{mediaData:O,downloadProgress:j}=Object(ha.a)(Object(l.E)(e,"inline"),!h,Object(l.D)(e,"inline"),n),g=ja(e,O),{isBuffered:p,bufferingHandlers:I}=Object(ya.a)(),v=u&&!p,y=!1===Object(ga.a)(u),{shouldRender:C,transitionClassNames:E}=Object(re.a)(v||!p,void 0,y),{shouldRenderThumb:w,transitionClassNames:M}=Object(la.a)(O,"slow"),[S,k]=Object(c.r)(!1),[N,T]=Object(c.r)(0);Object(c.n)(()=>{if(!S)return;const e=188*Math.PI,t=e-N*e,a=i.current,s=o.current,n=s.firstElementChild;n?n.firstElementChild.setAttribute("stroke-dashoffset",t.toString()):s.innerHTML=`\n \n `,T(a.currentTime/a.duration)},[S,N]);const A=Boolean(O&&b),P=()=>{k(!1),T(0),Object(Ca.a)(i.current),Object(f.b)(()=>{o.current.innerHTML=""})},R=(L=P,()=>{Wa&&Wa(),Wa=L});var L;Object(c.n)(()=>{i.current&&(A?Object(Ca.a)(i.current):i.current.pause())},[A]),Ea(i,A),Ma(i,Boolean(O)),Object(wa.a)(i,[O]);const B=Object(c.m)(()=>{if(!O)return void m(e=>!e);const e=i.current;S?e.paused?Object(Ca.a)(e):e.pause():(R(),e.pause(),e.currentTime=0,Object(Ca.a)(e),k(!0))},[R,S,O]),D=Object(c.m)(e=>{const t=e.currentTarget;T(t.currentTime/t.duration)},[]),F=Object(ne.a)("full-media",M);return c.a.createElement("div",{ref:r,className:"RoundVideo media-inner",onClick:B},(w||O)&&c.a.createElement("div",{className:"thumbnail-wrapper"},c.a.createElement("canvas",{ref:g,className:"thumbnail",style:`width: ${ut.e}px; height: ${ut.e}px`})),O&&c.a.createElement("div",{className:"video-wrapper"},c.a.createElement("video",Va({ref:i,className:F,width:ut.e,height:ut.e,autoPlay:!0,muted:!S,loop:!S,playsInline:!0,onEnded:S?P:void 0},I,{onTimeUpdate:S?D:void 0}),c.a.createElement("source",{src:O}))),c.a.createElement("div",{className:"progress",ref:o}),C&&c.a.createElement("div",{className:"media-loading "+E},c.a.createElement(Ia.a,{progress:j})),!O&&!u&&c.a.createElement("i",{className:"icon-large-play"}),c.a.createElement("div",{className:"message-media-duration"},S?Object(x.e)(i.current.currentTime):Object(x.e)(d.duration),(!S||i.current.paused)&&c.a.createElement("i",{className:"icon-muted-chat"})))};a(243);var Qa=({message:e,onClick:t})=>c.a.createElement("div",{className:"InlineButtons"},e.inlineButtons.map(e=>c.a.createElement("div",{className:"row"},e.map(e=>c.a.createElement(fe.a,{size:"tiny",ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>t({button:e})},Object(mt.a)(e.text),"url"===e.type&&!e.value.match(n.ub)&&c.a.createElement("i",{className:"icon-arrow-right"}))))));a(244);var Ja=Object(c.h)(Object(s.h)((e,{message:t})=>{const{threadId:a,chatId:s}=t.threadInfo,n=Object(o.Fb)(e,s,a)||t.threadInfo,c=Object(o.Gb)(e,s,a),{byId:r}=e.users,{byId:i}=e.chats;return{threadInfo:n,usersById:r,chatsById:i,shouldRequestThreadUpdate:!!c&&!n.topMessageId}},(e,t)=>Object(h.l)(t,["openChat","requestThreadInfoUpdate"]))(({disabled:e,threadInfo:t,usersById:a,chatsById:s,shouldRequestThreadUpdate:n,openChat:r,requestThreadInfoUpdate:o})=>{const i=Object(he.a)(),{threadId:d,chatId:b,messagesCount:u,lastMessageId:m,lastReadInboxMessageId:h,recentReplierIds:O}=t,j=Object(c.m)(()=>{r({id:b,threadId:d})},[r,b,d]);if(Object(c.n)(()=>{n&&o({chatId:b,threadId:d})},[b,o,n,d]),void 0===u)return;const g=O&&O.map(e=>Object(l.ob)(e)?a[e]:s[e]).filter(Boolean);const p=Boolean(h&&m&&h0&&c.a.createElement("div",{className:"recent-repliers",dir:i.isRtl?"rtl":"ltr"},g.map(e=>c.a.createElement(ea.a,{key:e.id,size:"small",user:Object(l.ob)(e.id)?e:void 0,chat:Object(l.ob)(e.id)?void 0:e}))),c.a.createElement("div",{className:"label",dir:"auto"},u?i("Comments",u,"i"):i("LeaveAComment")),c.a.createElement("i",{className:"icon-next"}))}));a(245);function Ya(e){const t=Za(e.currentTarget);t&&t.setAttribute("data-is-document-group-hover","")}function Xa(e){const t=Za(e.currentTarget);t&&t.removeAttribute("data-is-document-group-hover")}function Za(e){let t=e;do{t=t.nextElementSibling}while(t&&!t.classList.contains("last-in-document-group"));return t}var es=Object(c.h)(Object(s.h)((e,t)=>{const{focusedMessage:a,forwardMessages:s,lastSyncTime:n}=e,{message:c,album:r,withSenderName:i,withAvatar:d,threadId:b,messageListType:u}=t,{id:m,chatId:h,viaBotId:O,replyToMessageId:j,isOutgoing:g}=c,p=Object(o.g)(e,h),f=Object(o.P)(e,h),I=p&&Object(l.mb)(p),v=p&&p.username,y=!f&&Object(l.hb)(c),C=i||d||y?Object(o.vb)(e,c):void 0,E=Object(o.K)(e,c),w=O?Object(o.Jb)(e,O):void 0,M=b?Object(o.Hb)(e,h,b):void 0,S=c.id===M,k=j===M,N=j&&!k?Object(o.l)(e,h,j):void 0,T=N&&Object(o.vb)(e,N),A=Object(o.Ib)(e,c),P="thread"===u&&(r?r.messages.some(t=>Object(o.U)(e,t)):Object(o.U)(e,c)),{direction:R,noHighlight:x}=P&&a||{},L=s.messageIds&&s.messageIds.includes(m),{query:B}=Object(o.B)(e)||{},D=Object(l.M)(c);let F;return F=r&&r.messages?r.messages.every(({id:t})=>Object(o.V)(e,t)):Object(o.V)(e,m),{theme:Object(o.Db)(e),chatUsername:v,forceSenderName:y,sender:C,originSender:E,botSender:w,shouldHideReply:k,isThreadTop:S,replyMessage:N,replyMessageSender:T,isFocused:P,isForwarding:L,isChatWithSelf:f,isChannel:I,lastSyncTime:n,highlight:B,isSingleEmoji:Boolean(D),animatedEmoji:D?Object(o.c)(e,D):void 0,isInSelectMode:Object(o.S)(e),isSelected:F,isGroupSelected:!!c.groupedId&&!c.isInAlbum&&Object(o.Q)(e,h,c.groupedId),threadId:b,isPinnedList:"pinned"===u,shouldAutoLoadMedia:p?Object(o.wb)(e,c,p,C):void 0,shouldAutoPlayMedia:Object(o.xb)(e,c),shouldLoopStickers:Object(o.yb)(e),...g&&{outgoingStatus:Object(o.gb)(e,c,"scheduled"===u)},..."number"==typeof A&&{uploadProgress:A},...P&&{focusDirection:R,noFocusHighlight:x}}},(e,t)=>Object(h.l)(t,["focusMessage","openMediaViewer","openAudioPlayer","cancelSendingMessage","openUserInfo","openChat","markMessagesRead","sendPollVote","toggleMessageSelection","setReplyingToId","openForwardMenu","clickInlineButton","disableContextMenuHint","showNotification"]))(({message:e,chatUsername:t,observeIntersectionForBottom:a,observeIntersectionForMedia:s,observeIntersectionForAnimatedStickers:n,album:r,noAvatars:o,withAvatar:i,withSenderName:d,noComments:h,appearanceOrder:O,isFirstInGroup:j,isLastInGroup:g,isFirstInDocumentGroup:p,isLastInDocumentGroup:f,isLastInList:I,theme:v,forceSenderName:y,sender:C,originSender:E,botSender:w,isThreadTop:M,shouldHideReply:S,replyMessage:k,replyMessageSender:N,outgoingStatus:T,uploadProgress:A,isFocused:P,focusDirection:R,noFocusHighlight:x,isForwarding:L,isChatWithSelf:B,isChannel:D,lastSyncTime:F,highlight:U,animatedEmoji:H,isInSelectMode:q,isSelected:G,isGroupSelected:_,threadId:z,messageListType:$,isPinnedList:V,shouldAutoLoadMedia:W,shouldAutoPlayMedia:K,shouldLoopStickers:Q,focusMessage:J,openMediaViewer:Y,openAudioPlayer:X,openUserInfo:Z,openChat:ee,cancelSendingMessage:te,markMessagesRead:ae,sendPollVote:se,toggleMessageSelection:ce,setReplyingToId:oe,openForwardMenu:ie,clickInlineButton:le,disableContextMenuHint:de,showNotification:be})=>{const ue=Object(c.q)(null),Oe=Object(c.q)(null),je=Object(c.q)(null),ge=Object(he.a)();Object(xt.c)(Oe,a);const{isContextMenuOpen:pe,contextMenuPosition:Ie,handleBeforeContextMenu:ve,handleContextMenu:ye,handleContextMenuClose:Ce,handleContextMenuHide:Ee}=Object(Dt.a)(ue,m.n&&q,!0,m.b);Object(c.n)(()=>{pe&&de()},[pe,de]);const we=O<=0,[Me,Se]=Object(me.a)(we);Object(c.n)(()=>{we||setTimeout(Se,10*O)},[O,Se,we]);const{transitionClassNames:ke}=Object(re.a)(Me,void 0,we,!1),{chatId:Ne,id:Te,threadInfo:Ae}=e,Pe=Object(l.xb)(e),Re=Object(l.yb)(e),xe="scheduled"===$||e.isScheduled,Le=Object(l.zb)(e)&&!S,Be=Boolean(Ae)&&"thread"===$,{forwardInfo:De,viaBotId:Fe}=e,Ue=De&&!B&&!De.isLinkedChannelPost,He=!!e.groupedId&&!e.isInAlbum,qe=Boolean(r)&&r.messages.length>1,{text:Ge,photo:_e,video:ze,audio:$e,voice:Ve,document:We,sticker:Ke,contact:Qe,poll:Je,webPage:Ye,invoice:Xe}=Object(l.v)(e),et=Object(l.x)(e),tt=Object(Ft.a)(e,U,Ut(et)),at=void 0!==Ie,st=D&&e.adminTitle||De&&!Ue&&De.adminTitle||void 0,nt=Object(c.p)(()=>st?Xt(st):void 0,[st]),rt=!(at||q||L)&&(!He||f),ot=rt&&D&&!xe,it=Boolean(rt&&(De&&(De.isChannelPost||B&&!Re)&&De.fromMessageId||V)),lt=!De||!B&&C?C:E,dt=De?E:C,bt=Object(ne.a)("Message message-list-item",j&&"first-in-group",g&&"last-in-group",p&&"first-in-document-group",f&&"last-in-document-group",I&&"last-in-list",Re&&"own",Boolean(e.views)&&"has-views",e.isEdited&&"was-edited",Le&&"has-reply",at&&"has-menu-open",P&&!x&&"focused",L&&"is-forwarding",e.isDeleting&&"is-deleting",He&&"is-in-document-group",qe&&"is-album",e.hasUnreadMention&&"has-unread-mention",G&&"is-selected",q&&"is-in-selection-mode",M&&"is-thread-top",Boolean(e.inlineButtons)&&"has-inline-buttons",ke),ht=function(e,{hasReply:t,customShape:a,isLastInGroup:s,asForwarded:n,hasThread:c,forceSenderName:r,hasComments:o,hasActionButton:i}={}){const{text:d,photo:b,video:u,audio:m,voice:h,document:O,poll:j,webPage:g,contact:p}=Object(l.v)(e),f=["message-content"],I=b||u,v=I&&!d,y=Boolean(e.viaBotId);return Ut(a)?f.push("emoji-only emoji-only-"+a):d&&f.push("text"),i&&f.push("has-action-button"),a&&(f.push("custom-shape"),u&&u.isRound&&f.push("round"),o&&f.push("has-comments")),b||u?f.push("media"):m?f.push("audio"):h?f.push("voice"):O?f.push("document"):p?f.push("contact"):j?f.push("poll"):g&&(f.push("web-page"),(g.photo||g.video)&&f.push("media")),n&&!a&&f.push("is-forwarded"),t&&f.push("is-reply"),c&&f.push("has-replies"),y&&f.push("is-via-bot"),r&&f.push("force-sender-name"),a||(f.push("has-shadow"),I&&o&&f.push("has-background"),(t||n||!v||y||r)&&f.push("has-solid-background"),!s||!b&&v||f.push("has-appendix")),f.join(" ")}(e,{hasReply:Le,customShape:et,isLastInGroup:g,asForwarded:Ue,hasThread:Be,forceSenderName:y,hasComments:e.threadInfo&&e.threadInfo.messagesCount>0,hasActionButton:ot||it}),Ot=e.threadInfo&&(!He||f)&&"thread"===$&&!h,jt=ht.includes("has-appendix");Object(ct.a)(Ne,Le?e.replyToMessageId:void 0,k,e.id),Zt(ue,Ne,P,R,x),Object(c.o)(()=>{je.current&&(je.current.innerHTML=Re?'':'')},[Re,jt]);const gt=Object(c.m)(t=>{t.stopPropagation(),ce({messageId:Te,groupedId:e.groupedId})},[Te,e.groupedId,ce]),pt=Object(c.m)(e=>{if(Pe)return;const t=qe&&r&&r.messages?{messageId:Te,childMessageIds:r.messages.map(({id:e})=>e),withShift:e&&e.shiftKey}:{messageId:Te,withShift:e&&e.shiftKey};ce(t)},[Pe,qe,r,Te,ce]),ft=Object(c.m)(()=>{oe({messageId:Te})},[oe,Te]),It=Object(c.m)(e=>{e.stopPropagation()},[]),vt=Object(c.m)(()=>{lt&&(Object(l.ob)(lt.id)?Z({id:lt.id}):ee({id:lt.id}))},[lt,Z,ee]),yt=Object(c.m)(()=>{dt?Object(l.ob)(dt.id)?Z({id:dt.id}):ee({id:dt.id}):be({message:ge("HidAccount")})},[dt,be,ge,Z,ee]),Ct=Object(c.m)(()=>{w&&Z({id:w.id})},[w,Z]),Et=Object(c.m)(()=>{J({chatId:Ne,threadId:z,messageId:e.replyToMessageId,replyMessageId:Te})},[J,Ne,z,e.replyToMessageId,Te]),wt=Object(c.m)(()=>{Y({chatId:Ne,threadId:z,messageId:Te,origin:xe?u.h.ScheduledInline:u.h.Inline})},[Ne,z,Te,Y,xe]),Mt=Object(c.m)(()=>{X({chatId:Ne,messageId:Te})},[Ne,Te,X]),St=Object(c.m)(e=>{Y({chatId:Ne,threadId:z,messageId:e,origin:xe?u.h.ScheduledAlbum:u.h.Album})},[Ne,z,Y,xe]),kt=Object(c.m)(e=>{const t=e.target;(t.classList.contains("text-content")||t.classList.contains("Message"))&&(m.b&&Ze.a.getIsKeyboardVisible()?setTimeout(()=>{ye(e)},350):ye(e))},[ye]),Nt=Object(c.m)(e=>{m.b?pt(e):ye(e)},[ye,pt]),At=Object(c.m)(()=>{ae({messageIds:[Te]})},[Te,ae]),Pt=Object(c.m)(()=>{te({chatId:Ne,messageId:Te})},[te,Ne,Te]),Rt=Object(c.m)(e=>{se({chatId:Ne,messageId:Te,options:e})},[Ne,Te,se]),Lt=Object(c.m)(()=>{ie({fromChatId:Ne,groupedId:e.groupedId})},[ie,Ne,e.groupedId]),Bt=Object(c.m)(()=>{if(r&&r.messages){const e=r.messages.map(({id:e})=>e);ie({fromChatId:Ne,messageIds:e})}else ie({fromChatId:Ne,messageIds:[Te]})},[r,ie,Ne,Te]),Gt=Object(c.m)(()=>{J({chatId:Ne,threadId:b.MAIN_THREAD_ID,messageId:Te})},[J,Ne,Te]),_t=Object(c.m)(()=>{J(He?{chatId:De.fromChatId,groupedId:e.groupedId,groupedChatId:Ne}:{chatId:De.fromChatId,messageId:De.fromMessageId})},[J,De,e,Ne,He]);let zt,$t="",Vt=!1;const Wt=Object(c.p)(()=>qe?Jt(Re,Boolean(Ue),Boolean(o),r):void 0,[qe,Re,Ue,o,r]),Kt=Ue?28:0;if(qe||!_e&&!ze)Wt&&(zt=Math.max(Ht(Boolean(Ge),Ot),Wt.containerStyle.width),zt-Wt.containerStyle.width>18&&(Vt=!0));else{let t;_e?t=qt(e,o).width:ze&&(t=ze.isRound?ut.e:qt(e,o).width),t&&(zt=Math.max(Ht(Boolean(Ge),Ot),t),zt-t>18&&(Vt=!0))}return zt&&($t=`width: ${zt+Kt}px`),c.a.createElement("div",{ref:ue,id:"message"+Te,className:bt,style:nt?`--meta-safe-author-width: ${nt}px`:void 0,"data-message-id":Te,onClick:q?pt:m.b?kt:void 0,onDoubleClick:q?void 0:ft,onMouseDown:q?void 0:e=>{Tt(e),Pe||ve(e)},onContextMenu:q||Pe?void 0:Nt,onMouseEnter:He&&!f?Ya:void 0,onMouseLeave:He&&!f?Xa:void 0},c.a.createElement("div",{ref:Oe,className:"bottom-marker","data-message-id":Te,"data-last-message-id":r?r.messages[r.messages.length-1].id:void 0,"data-has-unread-mention":e.hasUnreadMention}),!Pe&&!He&&c.a.createElement("div",{className:"message-select-control"},G&&c.a.createElement("i",{className:"icon-select"})),!Pe&&f&&c.a.createElement("div",{className:Object(ne.a)("message-select-control group-select",_&&"is-selected"),onClick:gt},_&&c.a.createElement("i",{className:"icon-select"})),i&&function(){const e=lt&&Object(l.ob)(lt.id),t=lt&&e?lt:void 0,a=lt&&!e?lt:void 0,s=!lt&&De?De.hiddenUserName:void 0;return c.a.createElement(ea.a,{size:"small",user:t,chat:a,text:s,lastSyncTime:F,onClick:t||a?vt:void 0})}(),c.a.createElement("div",{className:Object(ne.a)("message-content-wrapper",ht.includes("text")&&"can-select-text"),onClick:q&&He?pt:void 0},c.a.createElement("div",{className:ht,style:$t,dir:"auto"},Ue&&!et&&(!He||p)&&c.a.createElement("div",{className:"message-title"},ge("ForwardedMessage")),function(){const t=Object(ne.a)("content-inner",Ue&&!et&&"forwarded-message",Le&&"reply-message",Vt&&"no-media-corners"),a=g&&!tt&&!Ue&&!Be,i=!Ye&&!H&&tt,b=Object(ne.a)("text-content",i&&"with-meta",T&&"with-outgoing-icon");return c.a.createElement("div",{className:t,onDoubleClick:It,dir:"auto"},function(){if(et&&!Fe||!(d&&!_e&&!ze||Ue||Fe||y)||He&&!p)return;let t,a;!dt||et&&Fe?De&&De.hiddenUserName&&(t=De.hiddenUserName):(t=Object(l.X)(ge,dt),Ue||(a="color-"+Object(l.Z)(dt)));return c.a.createElement("div",{className:"message-title",dir:"ltr"},t?c.a.createElement("span",{className:Object(ne.a)("interactive",a),onClick:yt,dir:"auto"},Object(mt.a)(t)):w?void 0:" ",w&&c.a.createElement(c.a.Fragment,null,c.a.createElement("span",{className:"via"},ge("ViaBot")),c.a.createElement("span",{className:"interactive",onClick:Ct},Object(mt.a)("@"+w.username))),De&&De.isLinkedChannelPost?c.a.createElement("span",{className:"admin-title",dir:"auto"},ge("DiscussChannel")):e.adminTitle&&!D?c.a.createElement("span",{className:"admin-title",dir:"auto"},e.adminTitle):void 0)}(),Le&&c.a.createElement(na,{message:k,sender:N,observeIntersection:s,onClick:Et}),Ke&&c.a.createElement(ua,{message:e,observeIntersection:s,observeIntersectionForPlaying:n,shouldLoop:Q,lastSyncTime:F}),H&&c.a.createElement(ma.a,{size:"small",sticker:H,observeIntersection:s,lastSyncTime:F,forceLoadPreview:Pe}),qe&&c.a.createElement($a,{album:r,albumLayout:Wt,observeIntersection:s,shouldAutoLoad:W,shouldAutoPlay:K,isOwn:Re,hasCustomAppendix:a,lastSyncTime:F,onMediaClick:St}),!qe&&_e&&c.a.createElement(va,{message:e,observeIntersection:s,noAvatars:o,shouldAutoLoad:W,uploadProgress:A,shouldAffectAppendix:a,onClick:wt,onCancelUpload:Pt}),!qe&&ze&&ze.isRound&&c.a.createElement(Ka,{message:e,observeIntersection:s,shouldAutoLoad:W,shouldAutoPlay:K,lastSyncTime:F}),!qe&&ze&&!ze.isRound&&c.a.createElement(ka,{message:e,observeIntersection:s,noAvatars:o,shouldAutoLoad:W,shouldAutoPlay:K,uploadProgress:A,lastSyncTime:F,onClick:wt,onCancelUpload:Pt}),($e||Ve)&&c.a.createElement(ra.a,{theme:v,message:e,uploadProgress:A,lastSyncTime:F,isSelectable:He,isSelected:G,onPlay:Mt,onReadMedia:!Ve||Re&&!B?void 0:At,onCancelUpload:Pt}),We&&c.a.createElement(ca.a,{message:e,observeIntersection:s,uploadProgress:A,isSelectable:He,isSelected:G,onMediaClick:wt,onCancelUpload:Pt}),Qe&&c.a.createElement(Ta,{contact:Qe}),Je&&c.a.createElement(Da,{message:e,poll:Je,onSendVote:Rt}),!H&&tt&&c.a.createElement("p",{className:b,dir:"auto"},tt,i&&c.a.createElement(ia,{message:e,outgoingStatus:T,signature:st,onClick:pt})),Ye&&c.a.createElement(Ha,{message:e,observeIntersection:s,noAvatars:o,shouldAutoLoad:W,shouldAutoPlay:K,lastSyncTime:F,onMediaClick:wt,onCancelMediaTransfer:Pt}),Xe&&c.a.createElement(qa,{message:e}))}(),(!He||f)&&!(!Ye&&!H&&tt)&&c.a.createElement(ia,{message:e,outgoingStatus:T,signature:st,onClick:pt}),ot?c.a.createElement(fe.a,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:ge("lng_context_forward_msg"),onClick:f?Lt:Bt},c.a.createElement("i",{className:"icon-share-filled"})):it?c.a.createElement(fe.a,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:"Focus message",onClick:V?Gt:_t},c.a.createElement("i",{className:"icon-arrow-right"})):void 0,Ot&&c.a.createElement(Ja,{message:e,disabled:h}),jt&&c.a.createElement("div",{className:"svg-appendix",ref:je})),e.inlineButtons&&c.a.createElement(Qa,{message:e,onClick:le})),Ie&&c.a.createElement(aa,{isOpen:pe,anchor:Ie,message:e,album:r,chatUsername:t,messageListType:$,onClose:Ce,onCloseAnimationEnd:Ee}))}));var ts=Object(c.h)(({messageIds:e,messageGroups:t,isViewportNewest:a,isUnread:r,withUsers:o,noAvatars:i,containerRef:d,anchorIdRef:b,memoFirstUnreadIdRef:m,threadId:O,type:j,threadTopMessageId:g,hasLinkedChat:p,isSchedule:I,noAppearanceAnimation:v,onFabToggle:y,onNotchToggle:C,openHistoryCalendar:E})=>{const{observeIntersectionForMedia:w,observeIntersectionForReading:M,observeIntersectionForAnimatedStickers:S}=function(e,t,a){const{markMessageListRead:n,markMessagesRead:c}=Object(s.d)(),{observe:r}=Object(xt.a)({rootRef:t,throttleMs:Lt,margin:Bt}),{observe:o,freeze:i,unfreeze:l}=Object(xt.a)({rootRef:t},t=>{if("thread"!==e)return;let s=0;const r=[];t.forEach(e=>{const{isIntersecting:t,target:a}=e;if(!t)return;const{dataset:n}=a,c=Number(n.lastMessageId||n.messageId);c>s&&(s=c),n.hasUnreadMention&&r.push(c)}),a.current&&s>=a.current&&n({maxId:s}),r.length&&c({messageIds:r})});Object(oe.a)(i,l);const{observe:d}=Object(xt.a)({rootRef:t,throttleMs:Lt});return{observeIntersectionForMedia:r,observeIntersectionForReading:o,observeIntersectionForAnimatedStickers:d}}(j,d,m),{backwardsTriggerRef:k,forwardsTriggerRef:N,fabTriggerRef:T}=function(e,t,a,r,o,i,l){const{loadViewportMessages:d}=Object(s.d)(),[b,m]=Object(c.p)(()=>"thread"===e?[Object(f.a)(()=>d({direction:u.e.Backwards}),1e3,!0,!1),Object(f.a)(()=>d({direction:u.e.Forwards}),1e3,!0,!1)]:[],[d,a]),h=Object(c.q)(null),O=Object(c.q)(null),j=Object(c.q)(null),g=Object(c.m)(()=>{if(!a||!a.length)return i(!1),void l(!1);if(!r)return i(!0),void l(!0);const{offsetHeight:e,scrollHeight:s,scrollTop:n}=t.current,c=s-n-e,d=c<=0;i(o?!d:!(c<=50)),l(!d)},[a,r,t,i,o,l]),{observe:p}=Object(xt.a)({rootRef:t,margin:n.fb},e=>{if(!m||!b)return;const a=e.find(({isIntersecting:e})=>e);if(!a)return;const{target:s}=a;"backwards-trigger"===s.className?(Object(Pt.a)(t.current),b()):"forwards-trigger"===s.className&&(Object(Pt.a)(t.current),m())});Object(xt.c)(h,p),Object(xt.c)(O,p);const{observe:I,freeze:v,unfreeze:y}=Object(xt.a)({rootRef:t,margin:50},g);Object(xt.c)(j,I);const{observe:C,freeze:E,unfreeze:w}=Object(xt.a)({rootRef:t},g);return Object(xt.c)(j,C),Object(le.a)(()=>{v(),E(),setTimeout(()=>{w(),y()},100)},[a]),{backwardsTriggerRef:h,forwardsTriggerRef:O,fabTriggerRef:j}}(j,d,e,a,r,y,C),A=Object(he.a)(),P=c.a.createElement("div",{className:Object(ne.a)("unread-divider","local-action-message"),key:"unread-messages"},c.a.createElement("span",null,A("UnreadMessages"))),R=v?0:t.reduce((e,t)=>e+Object(h.h)(t.senderGroups).length,0);let L=0;const B=t.map((e,t,a)=>{const s=e.senderGroups.map((e,s,n)=>{if(1===e.length&&!kt(e[0])&&Object(l.gb)(e[0])){const r=e[0],o=s===n.length-1&&t===a.length-1;return Object(h.e)([r.id===m.current&&P,c.a.createElement(sa,{key:r.id,message:r,observeIntersection:M,appearanceOrder:R-++L,isLastInList:o})])}let r;return Object(h.h)(e.map((d,u)=>{const f=kt(d)?d.mainMessage:d,I=kt(d)?d:void 0,v=Object(l.yb)(f),y=kt(d),C=e[u+1];f.previousLocalId&&b.current==="message"+f.previousLocalId&&(b.current="message"+f.id);const E=!y&&f.groupedId?f.groupedId:void 0,k=C&&!kt(C)?C.groupedId:void 0,N={isFirstInGroup:0===u,isLastInGroup:u===e.length-1,isFirstInDocumentGroup:Boolean(E&&E!==r),isLastInDocumentGroup:Boolean(E&&E!==k),isLastInList:u===e.length-1&&s===n.length-1&&t===a.length-1};r=E;const T=Object(l.G)(f),x="scheduled"!==j?T:`${f.date}_${T}`;return Object(h.e)([f.id===m.current?P:void 0,c.a.createElement(es,{key:x,message:f,observeIntersectionForBottom:M,observeIntersectionForMedia:w,observeIntersectionForAnimatedStickers:S,album:I,noAvatars:i,withAvatar:N.isLastInGroup&&o&&!v&&!(f.id===g),withSenderName:N.isFirstInGroup&&o&&!v,threadId:O,messageListType:j,noComments:!1===p,appearanceOrder:R-++L,isFirstInGroup:N.isFirstInGroup,isLastInGroup:N.isLastInGroup,isFirstInDocumentGroup:N.isFirstInDocumentGroup,isLastInDocumentGroup:N.isLastInDocumentGroup,isLastInList:N.isLastInList}),f.id===g&&c.a.createElement("div",{className:"local-action-message",key:"discussion-started"},c.a.createElement("span",null,A("DiscussionStarted")))])}))});return c.a.createElement("div",{className:"message-date-group",key:e.datetime,onMouseDown:Tt,teactFastList:!0},c.a.createElement("div",{className:Object(ne.a)("sticky-date",!I&&"interactive"),key:"date-header",onMouseDown:Tt,onClick:I?void 0:()=>E({selectedAt:e.datetime})},c.a.createElement("span",{dir:"auto"},I&&e.originalDate===n.xb&&A("MessageScheduledUntilOnline"),I&&e.originalDate!==n.xb&&A("MessageScheduledOn",Object(x.c)(A,e.datetime,void 0,!0)),!I&&Object(x.c)(A,e.datetime))),Object(h.h)(s))});return c.a.createElement("div",{className:"messages-container",teactFastList:!0},c.a.createElement("div",{ref:k,key:"backwards-trigger",className:"backwards-trigger"}),Object(h.h)(B),c.a.createElement("div",{ref:N,key:"forwards-trigger",className:"forwards-trigger"}),c.a.createElement("div",{ref:T,key:"fab-trigger",className:"fab-trigger"}))}),as=a(125);a(247);var ss=Object(c.h)(Object(s.h)((e,{userId:t})=>{const{stickers:a}=e.stickers.greeting,s=a&&a.length?a[t%a.length]:void 0,n=Object(o.g)(e,t);return n?{sticker:s,lastUnreadMessageId:n.lastMessage&&n.lastMessage.id!==n.lastReadInboxMessageId?n.lastMessage.id:void 0,connectionState:e.connectionState}:{}},(e,t)=>Object(h.l)(t,["loadGreetingStickers","sendMessage","markMessageListRead"]))(({sticker:e,connectionState:t,lastUnreadMessageId:a,loadGreetingStickers:s,sendMessage:n,markMessageListRead:r})=>{const o=Object(he.a)(),i=Object(c.q)(null),{observe:l}=Object(xt.a)({rootRef:i,debounceMs:200});Object(c.n)(()=>{e||"connectionStateReady"!==t||s()},[t,s,e]),Object(c.n)(()=>{"connectionStateReady"===t&&a&&r({maxId:a})},[t,r,a]);const d=Object(c.m)(e=>{e={...e,isPreloadedGlobally:!0},n({sticker:e})},[n]);return c.a.createElement("div",{className:"ContactGreeting",ref:i},c.a.createElement("div",{className:"wrapper"},c.a.createElement("p",{className:"title",dir:"auto"},o("Conversation.EmptyPlaceholder")),c.a.createElement("p",{className:"description",dir:"auto"},o("Conversation.GreetingText")),c.a.createElement("div",{className:"sticker"},e&&c.a.createElement(as.a,{sticker:e,onClick:d,clickArg:e,observeIntersection:l,size:160,className:"large"}))))}));a(248);var ns=Object(c.h)(({isChatWithSelf:e,type:t,isGroupChatJustCreated:a})=>{const s=Object(he.a)();return"scheduled"===t?function(e){return c.a.createElement("div",{className:"empty"},c.a.createElement("span",null,e("ScheduledMessages.EmptyPlaceholder")))}(s):e?function(e){return c.a.createElement("div",{className:"NoMessages"},c.a.createElement("div",{className:"wrapper"},c.a.createElement("i",{className:"icon icon-cloud-download"}),c.a.createElement("h3",{className:"title"},e("Conversation.CloudStorageInfo.Title")),c.a.createElement("ul",{className:"description"},c.a.createElement("li",null,e("Conversation.ClousStorageInfo.Description1")),c.a.createElement("li",null,e("Conversation.ClousStorageInfo.Description2")),c.a.createElement("li",null,e("Conversation.ClousStorageInfo.Description3")),c.a.createElement("li",null,e("Conversation.ClousStorageInfo.Description4")))))}(s):a?function(e){return c.a.createElement("div",{className:"NoMessages"},c.a.createElement("div",{className:"wrapper",dir:e.isRtl?"rtl":void 0},c.a.createElement("h3",{className:"title"},e("EmptyGroupInfo.Title")),c.a.createElement("p",{className:"description"},e("EmptyGroupInfo.Subtitle")),c.a.createElement("ul",{className:"list-checkmarks"},c.a.createElement("li",null,e("EmptyGroupInfo.Line1")),c.a.createElement("li",null,e("EmptyGroupInfo.Line2")),c.a.createElement("li",null,e("EmptyGroupInfo.Line3")),c.a.createElement("li",null,e("EmptyGroupInfo.Line4")))))}(s):c.a.createElement("div",{className:"empty"},c.a.createElement("span",null,s("NoMessages")))});a(249);const cs=Object(f.a)(e=>e(),200,!1);function rs(e,t){return t&&1===t.length&&1===t[0].senderGroups.length&&1===t[0].senderGroups[0].length&&"content"in t[0].senderGroups[0][0]&&t[0].senderGroups[0][0].content.action&&t[0].senderGroups[0][0].content.action.type===e}var os=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,type:s})=>{const n=Object(o.g)(e,t);if(!n)return{};const c=Object(o.y)(e,t,a,s),r="scheduled"===s?Object(o.sb)(e,t):Object(o.n)(e,t),i=Object(o.Hb)(e,t,a);if(a!==b.MAIN_THREAD_ID&&!(r&&i&&r[i]))return{};const{isRestricted:d,restrictionReason:u,lastMessage:m}=n,h=Object(o.I)(e,t),O=h?!e.focusedMessage.noHighlight:void 0,j=a===b.MAIN_THREAD_ID&&!c&&!n.unreadCount&&!h&&m&&!m.groupedId,g=Object(o.h)(e,t);let p;if(Object(o.L)(e,t)){const a=Object(o.h)(e,t);p=a.fullInfo?a.fullInfo.botDescription||"NoMessages":"Updating bot info..."}return{isChatLoaded:!0,isRestricted:d,restrictionReason:u,isChannelChat:Object(l.mb)(n),isGroupChat:Object(l.nb)(n),isCreator:n.isCreator,isChatWithSelf:Object(o.P)(e,t),isBot:Boolean(g),messageIds:c,messagesById:r,firstUnreadId:Object(o.H)(e,t,a),isViewportNewest:"thread"!==s||Object(o.Y)(e,t,a),threadFirstMessageId:Object(o.G)(e,t,a),focusingId:h,hasFocusHighlight:O,isSelectModeActive:Object(o.S)(e),botDescription:p,threadTopMessageId:i,hasLinkedChat:n.fullInfo&&"linkedChatId"in n.fullInfo?Boolean(n.fullInfo.linkedChatId):void 0,...j&&{lastMessage:m}}},(e,t)=>Object(h.l)(t,["loadViewportMessages","setScrollOffset","openHistoryCalendar"]))(({chatId:e,threadId:t,type:a,hasTools:r,onFabToggle:i,onNotchToggle:d,isChatLoaded:b,isChannelChat:m,isGroupChat:O,canPost:j,isReady:g,isChatWithSelf:p,isCreator:I,isBot:v,messageIds:y,messagesById:C,firstUnreadId:E,isViewportNewest:w,threadFirstMessageId:M,isRestricted:S,restrictionReason:k,focusingId:N,hasFocusHighlight:T,isSelectModeActive:A,loadViewportMessages:P,setScrollOffset:R,lastMessage:x,botDescription:L,threadTopMessageId:B,hasLinkedChat:D,openHistoryCalendar:F})=>{const U=Object(c.q)(null),H=Object(c.q)("thread"===a&&Object(o.tb)(Object(s.e)(),e,t)||0),q=Object(c.q)(),G=Object(c.q)(),_=Object(c.q)(),z=Object(c.q)(),$=Object(c.q)(),V=Object(c.q)(),W=Object(c.q)(!1),K=Object(c.q)(Boolean(x)),[Q,J]=Object(c.r)(),Y=Boolean(y);Object(le.a)(()=>{Y&&Object(f.e)(()=>{K.current=!1})},[Y]),Object(le.a)(()=>{$.current=E,z.current||(z.current=E)},[E]),Object(le.a)(()=>{V.current=N},[N]);const X=Object(c.p)(()=>{if(!y||!C)return;const e=!B||y[0]&&M!==y[0]?y:[B,...y];if(!e.length)return;const t=e.map(e=>C[e]).filter(Boolean);return Nt(Object(h.k)(t,["date","id"]),z.current)},[y,C,M,B]),Z=Object(c.p)(()=>{if("thread"===a)return Object(f.a)(()=>P({direction:u.e.Around}),1e3,!0,!1)},[P,y]),{isScrolled:ee,updateStickyDates:te}=At(),ae=Object(c.m)(()=>{if(W.current)return void(W.current=!1);const s=U.current;V.current||te(s,r),cs(()=>{Object(f.b)(()=>{s.parentElement&&(H.current=s.scrollHeight-s.scrollTop,"thread"===a&&R({chatId:e,threadId:t,scrollOffset:H.current}))})})},[te,r,a,R,e,t]);Object(c.n)(()=>{if(!("ResizeObserver"in window))return;const e=new ResizeObserver(([e])=>{e.target.offsetParent&&J(e.contentRect.height)});return e.observe(U.current),()=>{e.disconnect()}},[]);const{height:ce}=et();Object(c.n)(()=>{g&&(U.current.dataset.normalHeight=String(U.current.offsetHeight))},[ce,g]),Object(c.n)(()=>{if(!Z||!b||S||N)return;const e=U.current;(!y||y.length{if(!y||!_.current||!g)return;const e=_.current.filter(e=>y.includes(Number(e.dataset.messageId))),t=e[1]||e[0];t&&(q.current=t.id,G.current=t.getBoundingClientRect().top)},[y,w,Q,r,g]),Object(Mt.a)(([e,t,a])=>{const s=U.current;if(_.current=Array.from(s.querySelectorAll(".message-list-item")),!s.offsetParent)return;const c=w&&y&&y.length{s.parentElement&&s.parentElement.classList.remove("force-messages-scroll")},1e3));const{scrollTop:o,scrollHeight:i,offsetHeight:l}=s,d=H.current,b=_.current[_.current.length-1],u=b?b.offsetHeight:0,m=w&&t&&d-(a||l)-u<=100;let h;const O=y&&e&&y[0]!==e[0],j=y&&e&&y[y.length-1]!==e[e.length-1],g=y&&V.current===y[y.length-1];if(m&&j&&!O&&!g&&(b&&Object(f.b)(()=>{Object(Rt.a)(s,b,"end",20,void 0,void 0,void 0,!0)}),h=i-l,H.current=Math.max(i-h,l),!c))return;const p=void 0!==a&&a!==Q,I=q.current&&s.querySelector("#"+q.current),v=!I&&z.current&&s.querySelector(".unread-divider");if(m&&p){if(Object(Rt.b)())return;h=i-l}else if(I){h=o+(I.getBoundingClientRect().top-(G.current||0))}else h=v?Math.min(v.offsetTop-(r?60:10),i-d):i-d;Object(Pt.a)(s,h),V.current||(W.current=!0,Object(f.b)(()=>{W.current=!1})),H.current=Math.max(i-h,l)},[y,w,Q,r]),Object(St.a)(([e])=>{void 0!==e&&Object(se.d)(200+n.c)},[A]);const re=Object(he.a)(),oe=Boolean(e&&Object(l.ob)(e)),ie=Boolean(!oe&&!m||p),de=Boolean(!ie||m),be=Object(l.ob)(e)&&!p&&!v&&(!X&&!x&&y&&(!_.current||0===_.current.length)||rs("contactSignUp",X)||x&&x.content.action&&"contactSignUp"===x.content.action.type),ue=O&&I&&rs("chatCreate",X),me=Object(ne.a)("MessageList custom-scroll",de&&"no-avatars",!j&&"no-composer","pinned"===a&&"type-pinned",T&&"has-focus-highlight",A&&"select-mode-active",ee&&"scrolled",!g&&"is-animating");return c.a.createElement("div",{ref:U,className:me,onScroll:ae,onMouseDown:Tt},S?c.a.createElement("div",{className:"empty"},c.a.createElement("span",null,k?k.text:"This is a private "+(m?"channel":"chat"))):L?c.a.createElement("div",{className:"empty rich"},c.a.createElement("span",null,Object(mt.a)(re(L),["br","emoji","links"]))):be?c.a.createElement(ss,{userId:e}):!y||X&&!ue?y&&X||x?c.a.createElement(ts,{messageIds:y||[x.id],messageGroups:X||Nt([x]),isViewportNewest:Boolean(w),isUnread:Boolean(E),withUsers:ie,noAvatars:de,containerRef:U,anchorIdRef:q,memoFirstUnreadIdRef:z,threadId:t,type:a,threadTopMessageId:B,hasLinkedChat:D,isSchedule:!!X&&"scheduled"===a,noAppearanceAnimation:!X||!K.current,onFabToggle:i,onNotchToggle:d,openHistoryCalendar:F}):c.a.createElement(xe.a,{color:"white"}):c.a.createElement(ns,{chatId:e,type:a,isChatWithSelf:p,isGroupChatJustCreated:ue}))}));a(250);var is=Object(c.h)(Object(s.h)(e=>{const t=Object(o.z)(e);if(!t)return{};const{chatId:a,threadId:s,type:n}=t,c=Object(o.g)(e,a);return{messageListType:n,unreadCount:c&&s===b.MAIN_THREAD_ID&&"thread"===n?c.unreadCount:void 0}},(e,t)=>Object(h.l)(t,["focusNextReply"]))(({isShown:e,canPost:t,messageListType:a,unreadCount:s,focusNextReply:n})=>{const r=Object(he.a)(),o=Object(c.q)(null),i=Object(c.m)(()=>{if(e)if("thread"===a)n();else{const e=o.current.parentElement.querySelector(".MessageList"),t=e.querySelectorAll(".message-list-item"),a=t[t.length-1];if(!a)return;Object(Rt.a)(e,a,"end",20)}},[e,a,n]),l=Object(ne.a)("ScrollDownButton",e&&"revealed",!t&&"no-composer");return c.a.createElement("div",{ref:o,className:l},c.a.createElement("div",{className:"ScrollDownButton-inner"},c.a.createElement(fe.a,{color:"secondary",round:!0,onClick:i,ariaLabel:r("AccDescrPageDown")},c.a.createElement("i",{className:"icon-arrow-down"})),Boolean(s)&&c.a.createElement("div",{className:"unread-count"},Object(ot.b)(s))))})),ls=a(135),ds=a(142);async function bs(e,t,a,s){const n=URL.createObjectURL(t),{type:c,size:r}=t;let o,i;if(c.startsWith("image/"))if(a){const a=await Object(Xe.g)(n),{width:r,height:i}=a;if(r>1280||i>1280||"image/jpeg"!==c){const c=await function(e){return new Promise(t=>{const a=document.createElement("canvas"),s=a.getContext("2d");let{width:n,height:c}=e;(n>1280||c>1280)&&(n>=c?(c*=1280/n,n=1280):(n*=1280/c,c=1280)),a.width=n,a.height=c,s.drawImage(e,0,0,e.width,e.height,0,0,n,c),a.toBlob(t,"image/jpeg",100)})}(a);return c?(URL.revokeObjectURL(n),bs(e,c,!0,s)):bs(e,t,!1,s)}o={width:r,height:i}}else i=n;else if(c.startsWith("video/")){if(r<10485760){const{videoWidth:e,videoHeight:t,duration:a}=await Object(Xe.h)(n);o={width:e,height:t,duration:a}}i=await Object(Xe.c)(n)}return{blobUrl:n,filename:e,mimeType:c,size:r,quick:o,previewBlobUrl:i,...s}}var us=a(190);let ms;function hs(e){ms.focus(),e.focus()}m.e&&(ms=document.createElement("input"),ms.classList.add("for-ios-autocapitalization-fix"),document.body.appendChild(ms));var Os=a.p+"c0155344d336103c2b6a0b28cc510750.js";const js={encoderPath:Os,reuseWorker:!0},gs={type:"audio/ogg"};let ps,fs,Is;async function vs(){return ps||(ps=a.e(10).then(a.t.bind(null,334,7)),fs=(await ps).default,Is=new fs(js)),ps}async function ys(e){await async function(){await vs(),await Is.start()}();const t=Date.now();let a;const s=[],n=[];Is.ondataavailable=e=>{s.push(e)};const c=function(e,t){const a=e.sourceNode,s=a.context.createAnalyser();s.fftSize=64,a.connect(s);const n=s.frequencyBinCount,c=new Uint8Array(n);let r=!1;return function e(){if(r)return;s.getByteFrequencyData(c);const a=c.reduce((e,t)=>e+t,0),o=a/n/255;t(o<.1?0:o),requestAnimationFrame(e)}(),()=>{r=!0}}(Is,t=>{n.push(255*t),e(t)});return{stop:()=>new Promise((e,r)=>{Is.onstop=()=>{e({blob:new Blob(s,gs),duration:Math.round(((a||Date.now())-t)/1e3),waveform:n})},Is.onerror=r;const o=Math.max(0,t+1e3-Date.now());setTimeout(()=>{Is.stop(),c()},o)}),pause:()=>{const e=Math.max(0,t+1e3-Date.now());setTimeout(()=>{Is.pause(),a=Date.now(),c()},e)}}}const Cs=["image/png","image/jpeg","image/gif"];function Es(e){const{text:t,entities:a}=e||{};if(!t)return"";const s=Object(Ft.b)(t,a,void 0,void 0,!0);return Array.isArray(s)?s.join(""):s}let ws,Ms;var Ss=a(65);var ks=a(191),Ns=a(199);const Ts=document.createElement("div"),As=/^@([a-z0-9_]{1,32})[\u00A0\u0020]+(.*)/i,Ps=/^@([a-z0-9_]{1,32})[\u00A0\u0020]+\n{2,}/i;function Rs(e,t,a,n){const[r,o,i]=Object(me.a)(),l=function(e){return Ts.innerHTML=e.replace(/
/g,"\n"),Ts.innerText}(a),{queryInlineBot:d,resetInlineBot:b}=Object(s.d)(),{username:u,query:m,canShowHelp:h}=function(e){const t=e.match(As);if(!t)return{username:"",query:"",canShowHelp:!1};return{username:t[1],query:t[2],canShowHelp:""===t[2]&&!e.match(Ps)}}(l),O=u.toLowerCase(),j=Object(ga.a)(m),g=Object(ga.a)(u),p=n&&n[O],{id:f,switchPm:I,offset:v,results:y,isGallery:C,help:E}=p||{};Object(c.n)(()=>{j!==m&&i()},[j,m,i]),Object(c.n)(()=>{e&&O&&t&&d({chatId:t,username:O,query:m})},[m,e,d,t,O]);const w=Object(c.m)(()=>{d({chatId:t,username:O,query:m,offset:v})},[v,t,m,d,O]);return Object(c.n)(()=>{e&&f&&(I||y&&y.length)?o():i()},[f,e,o,y,I,i]),g!==u&&b({username:g}),{isOpen:r,closeTooltip:i,loadMore:w,username:u,id:f,isGallery:C,switchPm:I,results:y,help:h&&E?`@${u} ${E}`:void 0}}var xs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"DeleteMessageModal",!t);return a?c.a.createElement(a,e):void 0});function Ls(){return(Ls=Object.assign||function(e){for(var t=1;t{const a=Object(c.q)(!1),s=Object(c.m)(()=>{if(a.current=!0,Ds)return Ds=!1,void e();Bs&&(clearTimeout(Bs),Bs=void 0),Bs=window.setTimeout(()=>{a.current&&e()},200)},[e]),n=Object(c.m)(()=>{a.current=!1},[]);return c.a.createElement(fe.a,Ls({},t,{onMouseEnter:m.n?void 0:s,onMouseLeave:m.n?void 0:n,onClick:m.n?e:void 0}))});var Us=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"AttachMenu",!t);return a?c.a.createElement(a,e):void 0});var Hs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"SymbolMenu",!t);return a?c.a.createElement(a,e):void 0});var qs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"InlineBotTooltip",!t);return a?c.a.createElement(a,e):void 0});var Gs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"MentionTooltip",!t);return a?c.a.createElement(a,e):void 0});var _s=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"CustomSendMenu",!t);return a?c.a.createElement(a,e):void 0});var zs=e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"StickerTooltip",!t);return a?c.a.createElement(a,e):void 0},$s=a(192);var Vs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"BotKeyboardMenu",!t);return a?c.a.createElement(a,e):void 0}),Ws=a(193),Ks=a(122);a(252);var Qs=Object(c.h)(Object(s.h)(e=>{const{chatId:t,threadId:a,type:s}=Object(o.z)(e)||{};if(!t||!a||!s)return{};const{currentUserId:n,forwardMessages:{fromChatId:c,toChatId:r,messageIds:i}}=e,d=Object(o.ob)(e,t,a),b="scheduled"===s?Object(o.F)(e,t):Object(o.D)(e,t,a),u=e.settings.byKey.animationLevel>=1,m=r===t;let h,O;if(d?h=Object(o.l)(e,t,d):b?h=Object(o.E)(e,t,a,s):m&&1===i.length&&(h=Object(o.l)(e,c,i[0])),d&&h){const{forwardInfo:a}=h,s=t===n;a&&(a.isChannelPost||s)&&(O=Object(o.K)(e,h)),O||(O=Object(o.vb)(e,h))}else m&&(O=Object(l.ob)(c)?Object(o.Jb)(e,c):Object(o.g)(e,c));return{replyingToId:d,editingId:b,message:h,sender:O,shouldAnimate:u,forwardedMessagesCount:m?i.length:void 0}},(e,t)=>Object(h.l)(t,["setReplyingToId","setEditingId","focusMessage","exitForwardMode"]))(({replyingToId:e,editingId:t,message:a,sender:s,shouldAnimate:n,forwardedMessagesCount:r,setReplyingToId:o,setEditingId:i,focusMessage:l,exitForwardMode:d})=>{const b=Boolean((e||t)&&a||s&&r),u=Object(Ks.a)([r],r?300:void 0),{shouldRender:m,transitionClassNames:h}=Object(re.a)(u&&b,void 0,!n,void 0,!n),O=Object(c.m)(()=>{e?o({messageId:void 0}):t?i({messageId:void 0}):r&&d()},[e,t,r,o,i,d]);Object(c.n)(()=>b?Object(de.a)(O):void 0,[b,O]);const j=Object(c.m)(()=>{l({chatId:a.chatId,messageId:a.id})},[l,a]),g=Object(ne.a)("ComposerEmbeddedMessage",h),p=r&&r>1?r+" forwarded messages":void 0;if(m)return c.a.createElement("div",{className:g},c.a.createElement("div",null,c.a.createElement(fe.a,{round:!0,color:"translucent",ariaLabel:"Cancel replying",onClick:O},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(na,{className:"inside-input",message:a,sender:s,customText:p,title:t?"Edit Message":void 0,onClick:j})))}));var Js=Object(c.h)(e=>{const{attachments:t}=e,a=Object(Re.a)(Pe.a.Extra,"AttachmentModal",!t.length);return a?c.a.createElement(a,e):void 0});var Ys=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"PollModal",!t);return a?c.a.createElement(a,e):void 0});var Xs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"DropArea",!t);return a?c.a.createElement(a,e):void 0});a(253);const Zs=new RegExp(n.rb,"i");var en=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a})=>{const s=Object(o.db)(e,t,a);return{webPagePreview:e.webPagePreview,noWebPage:s}},(e,t)=>Object(h.l)(t,["loadWebPagePreview","clearWebPagePreview","toggleMessageWebPage"]))(({chatId:e,threadId:t,messageText:a,disabled:s,webPagePreview:n,noWebPage:r,loadWebPagePreview:o,clearWebPagePreview:i,toggleMessageWebPage:l})=>{const d=Object(c.p)(()=>{const{text:e,entities:t}=Object(ds.a)(a),s=t&&t.find(({type:e})=>e===b.ApiMessageEntityTypes.TextUrl);if(s)return s.url;const n=e.match(Zs);return n?n[0]:void 0},[a]);Object(c.n)(()=>{d?o({text:d}):(i(),l({chatId:e,threadId:t}))},[e,l,i,d,o,t]),Object(le.a)(()=>{i(),l({chatId:e,threadId:t})},[e]);const u=Boolean(n&&a.length&&!r&&!s),{shouldRender:m,transitionClassNames:h}=Object(re.a)(u),O=Object(rt.a)(n);if(!m||!O)return;const{photo:j,...g}=O,p={content:{webPage:g}};return c.a.createElement("div",{className:Object(ne.a)("WebPagePreview",h)},c.a.createElement("div",null,c.a.createElement(fe.a,{round:!0,color:"translucent",ariaLabel:"Clear Webpage Preview",onClick:()=>{l({chatId:e,threadId:t,noWebPage:!0})}},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(Ha,{message:p,inPreview:!0})))})),tn=a(128);var an=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"CalendarModal",!t);return a?c.a.createElement(a,e):void 0});var sn=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"PaymentModal",!t);return a?c.a.createElement(a,e):void 0});var nn,cn=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"ReceiptModal",!t);return a?c.a.createElement(a,e):void 0});a(254);!function(e){e.Send="send",e.Record="record",e.Edit="edit"}(nn||(nn={}));var rn=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const c=Object(o.g)(e,t),r=c&&Object(o.p)(e,c),i=c?Object(o.O)(e,c):void 0,d=Object(o.P)(e,t),u=i&&Object(o.cb)(e,t),m=Object(o.qb)(e,t),{language:h}=e.settings.byKey,O=e.emojiKeywords[n.j],j=h!==n.j?e.emojiKeywords[h]:void 0;return{editingMessage:Object(o.E)(e,t,a,s),connectionState:e.connectionState,draft:Object(o.C)(e,t,a),chat:c,isChatWithBot:i,isChatWithSelf:d,canScheduleUntilOnline:!d&&!i&&c&&r&&Object(l.ob)(t)&&r.status&&Boolean(r.status.wasOnline),isRightColumnShown:Object(o.W)(e),isSelectModeActive:Object(o.S)(e),withScheduledButton:a===b.MAIN_THREAD_ID&&"thread"===s&&Boolean(m&&m.length),shouldSchedule:"scheduled"===s,botKeyboardMessageId:u?u.id:void 0,isForwarding:t===e.forwardMessages.toChatId,isPollModalOpen:e.isPollModalOpen,stickersForEmoji:e.stickers.forEmoji.stickers,groupChatMembers:c&&c.fullInfo&&c.fullInfo.members,topInlineBotIds:e.topInlineBots&&e.topInlineBots.userIds,currentUserId:e.currentUserId,usersById:e.users.byId,lastSyncTime:e.lastSyncTime,contentToBeScheduled:e.messages.contentToBeScheduled,isPaymentModalOpen:e.payment.isPaymentModalOpen,isReceiptModalOpen:Boolean(e.payment.receipt),shouldSuggestStickers:e.settings.byKey.shouldSuggestStickers,recentEmojis:e.recentEmojis,baseEmojiKeywords:O?O.keywords:void 0,emojiKeywords:j?j.keywords:void 0,serverTimeOffset:e.serverTimeOffset,inlineBots:e.inlineBots.byUsername,isInlineBotLoading:e.inlineBots.isLoading}},(e,t)=>Object(h.l)(t,["sendMessage","editMessage","saveDraft","clearDraft","showDialog","setStickerSearchQuery","setGifSearchQuery","forwardMessages","openPollModal","closePollModal","closePaymentModal","clearReceipt","loadScheduledHistory","openChat","addRecentEmoji","sendInlineBotResult"]))(({dropAreaState:e,shouldSchedule:t,canScheduleUntilOnline:a,isReady:r,onDropHide:o,editingMessage:i,chatId:d,threadId:u,messageListType:h,draft:O,chat:j,connectionState:g,isChatWithBot:p,isChatWithSelf:I,isRightColumnShown:v,isSelectModeActive:y,isForwarding:C,isPollModalOpen:E,isPaymentModalOpen:w,isReceiptModalOpen:M,botKeyboardMessageId:S,withScheduledButton:k,stickersForEmoji:N,groupChatMembers:T,topInlineBotIds:A,currentUserId:P,usersById:R,lastSyncTime:L,contentToBeScheduled:B,shouldSuggestStickers:D,baseEmojiKeywords:F,emojiKeywords:U,serverTimeOffset:H,recentEmojis:q,inlineBots:G,isInlineBotLoading:_,sendMessage:z,editMessage:$,saveDraft:V,clearDraft:W,showDialog:K,setStickerSearchQuery:Q,setGifSearchQuery:J,forwardMessages:Y,openPollModal:X,closePollModal:Z,loadScheduledHistory:ee,closePaymentModal:te,openChat:ae,clearReceipt:se,addRecentEmoji:ce,sendInlineBotResult:re})=>{const le=Object(he.a)(),be=Object(c.q)(null),[ue,Oe]=Object(c.r)(""),je=Object(c.q)(),ge=Object(ga.a)(e),[pe,Ie,ve]=Object(me.a)(),[ye,Ce]=Object(c.r)(),{width:Ee}=Ze.a.get(),Me=Object(c.q)(ue);Object(c.n)(()=>{Me.current=ue},[ue]),Object(c.n)(()=>{je.current=void 0},[d]),Object(c.n)(()=>{d&&L&&u===b.MAIN_THREAD_ID&&r&&ee()},[r,d,ee,L,u]),Object(c.o)(()=>{be.current&&(be.current.innerHTML='')},[]),Object(c.n)(()=>{B&&(Ce(B),Ie())},[B,Ie]);const[Se,ke]=Object(c.r)([]),[Ne,Te,Ae]=Object(me.a)(),[Pe,Re,xe]=Object(me.a)(),[Le,Be,De]=Object(me.a)(),[Fe,Ue,He]=Object(me.a)(),[qe,Ge]=Object(me.a)(),[_e,ze,$e]=Object(me.a)(),{startRecordingVoice:Ve,stopRecordingVoice:We,pauseRecordingVoice:Ke,activeVoiceRecording:Qe,currentRecordTime:Ye,recordButtonRef:Xe,startRecordTimeRef:et}=(()=>{const e=Object(c.q)(null),[t,a]=Object(c.r)(),s=Object(c.q)(),[n,r]=Object(c.r)();Object(c.n)(()=>{m.e&&m.o&&vs()},[]);const o=Object(c.m)(async()=>{try{const{stop:t,pause:n}=await ys(t=>{e.current&&(s.current&&Date.now()%4==0&&(e.current.style.boxShadow=`0 0 0 ${50*(t||0)}px rgba(0,0,0,.15)`),r(Date.now()))});s.current=Date.now(),r(Date.now()),a({stop:t,pause:n})}catch(e){console.error(e)}},[]),i=Object(c.m)(()=>{if(t){e.current&&(e.current.style.boxShadow="none");try{return t.pause()}catch(e){return void console.error(e)}}},[t]),l=Object(c.m)(()=>{if(t){a(void 0),s.current=void 0,r(void 0),e.current&&(e.current.style.boxShadow="none");try{return t.stop()}catch(e){return void console.error(e)}}},[t]);return Object(c.n)(()=>t?Object(de.a)(l):void 0,[t,l]),{startRecordingVoice:o,pauseRecordingVoice:i,stopRecordingVoice:l,activeVoiceRecording:t,currentRecordTime:n,recordButtonRef:e,startRecordTimeRef:s}})(),tt=i?nn.Edit:!m.o||Qe||ue&&!Se.length||C?nn.Send:nn.Record,at=!t,{isMentionTooltipOpen:st,mentionFilter:nt,closeMentionTooltip:ct,insertMention:rt,mentionFilteredUsers:ot}=Object(Ns.a)(!Se.length,ue,Oe,void 0,T,A,P,R),{isOpen:it,id:lt,isGallery:dt,switchPm:bt,results:ut,closeTooltip:ht,help:Ot,loadMore:jt}=Rs(Boolean(!Se.length&&L),d,ue,G),{isContextMenuOpen:gt,handleContextMenu:pt,handleContextMenuClose:ft,handleContextMenuHide:It}=Object(Dt.a)(Xe,!(tt===nn.Send&&at)),vt=Object(c.p)(()=>Object(l.b)(j,p),[j,p]),yt=j&&Object(l.jb)(j),Ct=Object(l.j)(j),{isStickerTooltipOpen:Et,closeStickerTooltip:wt}=function(e,t,a,n=!1){const{loadStickersForEmoji:r,clearStickersForEmoji:o}=Object(s.d)(),i=m.d&&1===Object(Ss.a)(t)||!m.d&&Boolean(t.match(/^]*?>$/g)),l=Boolean(a)&&i;return Object(c.n)(()=>{n||(e&&i?r({emoji:t}):!l&&i||o())},[t,i,o,r,e,n]),{isStickerTooltipOpen:l,closeStickerTooltip:o}}(Boolean(D&&vt.canSendStickers&&!Se.length),ue,N,!r),{isEmojiTooltipOpen:Mt,closeEmojiTooltip:St,filteredEmojis:kt,insertEmoji:Nt}=Object(ks.a)(Boolean(D&&vt.canSendStickers&&!Se.length),ue,q,void 0,Oe,F,U,!r),Tt=Object(c.m)((e,t=n.z)=>{const a=window.getSelection(),s=document.getElementById(t),c=Object(mt.a)(e,["escape_html","emoji_html","br_html"]).join("").replace(/\u200b+/g,"​");if(a.rangeCount){const e=a.getRangeAt(0);if(Object(us.a)(e,t))return function(e){const t=window.getSelection();if(t&&t.getRangeAt&&t.rangeCount){const a=t.getRangeAt(0);a.deleteContents();const s=a.createContextualFragment(e),n=s.lastChild;a.insertNode(s),n?(a.setStartAfter(n),a.setEndAfter(n)):a.collapse(!1),t.removeAllRanges(),t.addRange(a)}}(c),void s.dispatchEvent(new Event("input",{bubbles:!0}))}Oe(`${Me.current}${c}`),requestAnimationFrame(()=>{Object(ls.a)(s)})},[]),At=Object(c.m)(()=>{const e=window.getSelection();if(e.rangeCount){const t=e.getRangeAt(0);if(Object(us.a)(t,n.z))return void document.execCommand("delete",!1)}Oe(function(e){const t=document.createElement("div");t.contentEditable="true",t.style.position="absolute",t.style.left="-10000px",t.style.top="-10000px",t.innerHTML=e,document.body.appendChild(t);let a=t.lastChild;if(a.lastChild)for(;a.lastChild;)a=a.lastChild;const s=a.textContent.length,n=document.createRange(),c=window.getSelection();n.setStart(a,s),n.setEnd(a,s),c.removeAllRanges(),c.addRange(n),document.execCommand("delete",!1);const r=t.innerHTML;return document.body.removeChild(t),r}(Me.current))},[]),Pt=Object(c.m)((e=!1)=>{e||Oe(""),ke([]),wt(),ve(),Ce(void 0),ct(),St(),m.l?setTimeout(()=>De(),350):De()},[wt,ve,ct,St,De]),Rt=Object(ga.a)(d);Object(c.n)(()=>{Rt&&d!==Rt&&(We(),Pt())},[d,Rt,Pt,We]);const xt=((e,t,a,s,r,o)=>{Object(c.n)(()=>{a?(t(Es(a.content.text)),requestAnimationFrame(()=>{const e=document.getElementById(n.z);Object(ls.a)(e,!0)})):t("")},[a,t]);return Object(c.m)(()=>{const{text:t,entities:n}=Object(ds.a)(e.current);a&&(t||Object(l.fb)(a)?(o({messageId:a.id,text:t,entities:n}),s()):r())},[o,a,e,r,s])})(Me,Oe,i,Pt,Ue,$);((e,t,a,s,r,o,i,l,d)=>{const b=Object(c.m)((e,t)=>{r.current.length&&!i?l({chatId:e,threadId:t,draft:Object(ds.a)(r.current)}):d({chatId:e,threadId:t})},[d,i,r,l]),u=Object(c.p)(()=>Object(f.a)(e=>e(),n.y,!1),[t]),h=Object(ga.a)(t),O=Object(ga.a)(a);Object(c.n)(()=>(ws=t,Ms=a,()=>{ws=void 0,Ms=void 0,b(t,a)}),[t,a,b]),Object(c.n)(()=>{t===h&&a===O||e&&(o(Es(e)),m.n||requestAnimationFrame(()=>{const e=document.getElementById(n.z);Object(ls.a)(e,!0)}))},[t,a,e,o,b,h,O]);const j=Object(ga.a)(s);Object(c.n)(()=>{t&&a&&h===t&&O===a&&j!==s&&(s.length?u(()=>{ws===t&&Ms===a&&b(t,a)}):b(t,a))},[t,s,h,j,O,u,a,b]);const g=Object(c.m)(()=>{t&&a&&b(t,a)},[t,a,b]);Object(oe.a)(g),ie(g)})(O,d,u,ue,Me,Oe,i,V,W),((e,t,a)=>{Object(c.n)(()=>{async function s(s){if(!s.clipboardData)return;const c=document.activeElement;if(c&&![n.z,n.A].includes(c.id))return;const{items:r}=s.clipboardData,o=Array.from(r).find(e=>Cs.includes(e.type)),i=o&&o.getAsFile(),l=s.clipboardData.getData("text").substring(0,4096);if(i||l){if(s.preventDefault(),i&&!a){const e=await bs(i.name,i,!0);t(t=>[...t,e])}l&&e(l,c?c.id:void 0)}}return document.addEventListener("paste",s,!1),()=>{document.removeEventListener("paste",s,!1)}},[e,a,t])})(Tt,ke,i);const Lt=Object(c.m)(async(e,t)=>{ke(await Promise.all(e.map(e=>bs(e.name,e,t))))},[]),Bt=Object(c.m)(async(e,t)=>{ke([...Se,...await Promise.all(e.map(e=>bs(e.name,e,t)))])},[Se]),Ft=Object(c.m)(()=>{ke([])},[]),Ut=Object(c.m)(async(e=!1,t)=>{if("connectionStateReady"!==g)return;let a=Se;if(Qe){const e=await We();if(e){const{blob:t,duration:s,waveform:n}=e;a=[await bs("wonderful-voice-message.ogg",t,!1,{voice:{duration:s,waveform:n}})]}}const{text:s,entities:c}=Object(ds.a)(Me.current);if(!a.length&&!s&&!C)return;if(a.length&&s&&s.length>1024){const e=s.length-1024;return void K({data:{message:"CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS",textParams:{"{EXTRA_CHARS_COUNT}":e,"{PLURAL_S}":e>1?"s":""},hasErrorKey:!0}})}const r=document.getElementById(n.z);if(a.length||s){if(Ct&&!yt){const e=Math.floor(Date.now()/1e3)+H,t=je.current&&Math.floor(e-je.current),a=Ct.nextSendDate&&Ct.nextSendDate>e;if(t&&t{Pt()})},[g,Se,Qe,C,H,W,d,Pt,We,K,Ct,yt,z,Y,le]),Ht=Object(c.m)((e,a=!1)=>{e={...e,isPreloadedGlobally:!0},t?(Ce({sticker:e}),Ie()):(z({sticker:e}),requestAnimationFrame(()=>{Pt(a)}))},[t,Ie,z,Pt]),qt=Object(c.m)(e=>{t?(Ce({gif:e}),Ie()):(z({gif:e}),requestAnimationFrame(()=>{Pt(!0)}))},[t,Ie,z,Pt]),Gt=Object(c.m)(e=>{if("connectionStateReady"!==g)return;re({id:e.id,queryId:e.queryId});const t=document.getElementById(n.z);m.e&&t===document.activeElement&&hs(t),W({chatId:d,localOnly:!0}),requestAnimationFrame(()=>{Pt()})},[d,W,g,Pt,re]),_t=Object(c.m)(e=>{t?(Ce({poll:e}),Z(),Ie()):(z({poll:e}),Z())},[Z,Ie,z,t]),zt=Object(c.m)(()=>{t?(Ce({isSilent:!0}),Ie()):Ut(!0)},[Ut,Ie,t]),$t=Object(c.m)((e,t=!1)=>{const{isSilent:a,...s}=ye||{},n=Math.round(Math.max(e.getTime(),Date.now()+6e4)/1e3)+(t?0:H);ye&&0!==Object.keys(s).length?(z({...ye,scheduledAt:n}),requestAnimationFrame(()=>{Pt()})):Ut(!!a,n),ve()},[ve,Ut,Pt,ye,z,H]),Vt=Object(c.m)(()=>{$t(new Date(1e3*n.xb),!0)},[$t]),Wt=Object(c.m)(()=>{ve(),Ce(void 0)},[ve]),Kt=Object(c.m)(e=>{"stickers"===e?(Q({query:""}),J({query:void 0})):(J({query:""}),Q({query:void 0}))},[Q,J]),Qt=Object(c.m)(()=>{const e=document.getElementById(n.z);m.l&&e===document.activeElement?(e.blur(),setTimeout(()=>{Be()},100)):Be()},[Be]),Jt=Object(c.m)(()=>{ae({id:d,threadId:u,type:"scheduled"})},[ae,d,u]);Object(c.n)(()=>{v&&m.l&&De()},[v,De]),Object(c.n)(()=>{r&&(y?ze():setTimeout(()=>{$e()},200))},[y,$e,ze,r]);const Yt=Object(c.m)(()=>{switch(tt){case nn.Send:t?(Qe&&Ke(),Ie()):(Ut(),requestAnimationFrame(()=>{Pt()}));break;case nn.Record:Ve();break;case nn.Edit:xt()}},[tt,Pt,t,Ve,xt,Qe,Ie,Ke,Ut]),Xt=tt===nn.Record&&!vt.canAttachMedia,Zt=Object(ga.a)(i,!0),ea=i||Zt,ta=new Date;ta.setSeconds(0),ta.setMilliseconds(0);const aa=new Date;aa.setFullYear(aa.getFullYear()+1);let sa="SendMessage";switch(tt){case nn.Edit:sa="Save edited message";break;case nn.Record:sa=Xt?"Conversation.DefaultRestrictedMedia":"AccDescrVoiceMessage"}const na=Object(ne.a)("Composer",!y&&"shown",_e&&"hover-disabled"),ca=Object(ne.a)("mobile-symbol-menu-button",!r&&"not-ready",qe?Le&&"menu-opened":Le&&"is-loading"),ra=tt===nn.Edit?xt:t?Ie:Ut;return c.a.createElement("div",{className:na},vt.canAttachMedia&&r&&c.a.createElement(tn.a,{containerId:"#middle-column-portals"},c.a.createElement(Xs,{isOpen:e!==Je.a.None,withQuick:[e,ge].includes(Je.a.QuickFile),onHide:o,onFileSelect:Lt})),c.a.createElement(Js,{attachments:Se,caption:Se.length?ue:"",groupChatMembers:T,currentUserId:P,usersById:R,recentEmojis:q,isReady:r,onCaptionUpdate:Oe,baseEmojiKeywords:F,emojiKeywords:U,addRecentEmoji:ce,onSend:t?Ie:Ut,onFileAppend:Bt,onClear:Ft}),c.a.createElement(Ys,{isOpen:Boolean(E),onClear:Z,onSend:_t}),c.a.createElement(sn,{isOpen:Boolean(w),onClose:te}),c.a.createElement(cn,{isOpen:Boolean(M),onClose:se}),ea&&c.a.createElement(xs,{isOpen:Fe,isSchedule:"scheduled"===h,onClose:He,message:ea}),c.a.createElement(Gs,{isOpen:st,filter:nt,onClose:ct,onInsertUserName:rt,filteredUsers:ot,usersById:R}),c.a.createElement(qs,{isOpen:it,botId:lt,allowedAttachmentOptions:vt,isGallery:dt,inlineBotResults:ut,switchPm:bt,onSelectResult:Gt,loadMore:jt,onClose:ht}),c.a.createElement("div",{id:"message-compose"},c.a.createElement("div",{className:"svg-appendix",ref:be}),c.a.createElement(Qs,null),c.a.createElement(en,{chatId:d,threadId:u,messageText:Se.length?"":ue,disabled:!vt.canAttachEmbedLinks}),c.a.createElement("div",{className:"message-input-wrapper"},m.l?c.a.createElement(fe.a,{className:ca,round:!0,color:"translucent",onClick:Le?De:Qt,ariaLabel:"Choose emoji, sticker or GIF"},c.a.createElement("i",{className:"icon-smile"}),c.a.createElement("i",{className:"icon-keyboard"}),Le&&!qe&&c.a.createElement(we.a,{color:"gray"})):c.a.createElement(Fs,{className:""+(Le?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:Be,ariaLabel:"Choose emoji, sticker or GIF"},c.a.createElement("i",{className:"icon-smile"})),c.a.createElement(Ws.a,{id:"message-input-text",html:Se.length?"":ue,placeholder:Qe&&Ee<=600?"":le("Message"),forcedPlaceholder:Ot,shouldSetFocus:Le,shouldSuppressFocus:m.l&&Le,shouldSuppressTextFormatter:Mt||st||it,onUpdate:Oe,onSend:ra,onSuppressedFocus:De}),_&&Boolean(lt)&&c.a.createElement(we.a,{color:"gray"}),k&&c.a.createElement(fe.a,{round:!0,faded:!0,className:"scheduled-button",color:"translucent",onClick:Jt,ariaLabel:"Open scheduled messages"},c.a.createElement("i",{className:"icon-schedule"})),S&&!Qe&&!i&&c.a.createElement(Fs,{className:""+(Ne?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:Te,ariaLabel:"Open bot command keyboard"},c.a.createElement("i",{className:"icon-bot-command"})),!Qe&&!i&&c.a.createElement(Fs,{className:""+(Pe?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:Re,ariaLabel:"Add an attachment"},c.a.createElement("i",{className:"icon-attach"})),Qe&&Ye&&c.a.createElement("span",{className:"recording-state"},Object(x.i)(Ye-et.current)),c.a.createElement(zs,{isOpen:Et,onStickerSelect:Ht}),c.a.createElement($s.a,{isOpen:Mt,emojis:kt,onClose:St,onEmojiSelect:Nt,addRecentEmoji:ce}),c.a.createElement(Us,{isOpen:Pe,allowedAttachmentOptions:vt,onFileSelect:Lt,onPollCreate:X,onClose:xe}),S&&c.a.createElement(Vs,{messageId:S,isOpen:Ne,onClose:Ae}),c.a.createElement(Hs,{isOpen:Le,allowedAttachmentOptions:vt,onLoad:Ge,onClose:De,onEmojiSelect:Tt,onStickerSelect:Ht,onGifSelect:qt,onRemoveSymbol:At,onSearchOpen:Kt,addRecentEmoji:ce}))),Qe&&c.a.createElement(fe.a,{round:!0,color:"danger",className:"cancel",onClick:We,ariaLabel:"Cancel voice recording"},c.a.createElement("i",{className:"icon-delete"})),c.a.createElement(fe.a,{ref:Xe,round:!0,color:"secondary",className:Object(ne.a)(tt,!r&&"not-ready",Qe&&"recording"),disabled:Xt,ariaLabel:le(sa),onClick:Yt,onContextMenu:tt===nn.Send&&at?pt:void 0},c.a.createElement("i",{className:"icon-send"}),c.a.createElement("i",{className:"icon-microphone-alt"}),c.a.createElement("i",{className:"icon-check"})),at&&c.a.createElement(_s,{isOpen:gt,onSilentSend:I?void 0:zt,onScheduleSend:t?void 0:Ie,onClose:ft,onCloseAnimationEnd:It}),c.a.createElement(an,{isOpen:pe,withTimePicker:!0,selectedAt:ta.getTime(),maxAt:Object(x.k)(aa),isFutureMode:!0,secondButtonLabel:a?"Send When Online":void 0,onClose:Wt,onSubmit:$t,onSecondButtonClick:a?Vt:void 0}))}));var on=Object(c.h)(e=>{const{isActive:t}=e,a=Object(Re.a)(Pe.a.Extra,"MobileSearch",!t,!0);return a?c.a.createElement(a,e):void 0});var ln=Object(c.h)(e=>{const{isActive:t}=e,a=Object(Re.a)(Pe.a.Extra,"MessageSelectToolbar",!t);return a?c.a.createElement(a,e):void 0});var dn=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"UnpinAllMessagesModal",!t);return a?c.a.createElement(a,e):void 0});a(255);const bn=m.l?450+n.c:void 0;function un(e){return"file"===e.kind&&e.type&&n.n.has(e.type)}var mn=Object(c.h)(Object(s.h)(e=>{const t=Object(o.Db)(e),{isBlurred:a,background:s,backgroundColor:n,patternColor:c}=e.settings.themes[t]||{},{messageLists:r}=e.messages,i=Object(o.z)(e),{isLeftColumnShown:d,chats:{listIds:u}}=e,h={theme:t,customBackground:s,backgroundColor:n,patternColor:c,isLeftColumnShown:d,isRightColumnShown:Object(o.W)(e),isBackgroundBlurred:a,isMobileSearchActive:Boolean(m.l&&Object(o.B)(e)),isSelectModeActive:Object(o.S)(e),animationLevel:e.settings.byKey.animationLevel,currentTransitionKey:Math.max(0,e.messages.messageLists.length-1)};if(!i||!u.active)return h;const{chatId:O,threadId:j,type:g}=i,p=Object(o.g)(e,O),f=Object(o.kb)(e,O),{chatId:I,messageId:v}=e.audioPlayer,y=p&&Object(l.d)(p,j),C=Object(o.L)(e,O),E="pinned"===g,w="scheduled"===g;return{...h,chatId:O,threadId:j,messageListType:g,isPrivate:Object(l.ob)(O),canPost:!E&&(!p||y)&&!C,isPinnedMessageList:E,isScheduledMessageList:w,currentUserBannedRights:p&&p.currentUserBannedRights,defaultBannedRights:p&&p.defaultBannedRights,hasPinnedOrAudioMessage:j!==b.MAIN_THREAD_ID||Boolean(f&&f.length)||Boolean(I&&v),pinnedMessagesCount:f?f.length:0,shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations,messageLists:r}},(e,t)=>Object(h.l)(t,["openChat","unpinAllMessages","loadUser","closeLocalTextSearch","exitMessageSelectMode"]))(({chatId:e,threadId:t,messageListType:a,isPrivate:s,isPinnedMessageList:r,messageLists:o,canPost:i,currentUserBannedRights:d,defaultBannedRights:b,hasPinnedOrAudioMessage:u,pinnedMessagesCount:h,customBackground:O,theme:j,backgroundColor:g,patternColor:p,isLeftColumnShown:f,isRightColumnShown:I,isBackgroundBlurred:v,isMobileSearchActive:y,isSelectModeActive:C,animationLevel:E,shouldSkipHistoryAnimations:w,currentTransitionKey:M,openChat:S,unpinAllMessages:k,loadUser:N,closeLocalTextSearch:T,exitMessageSelectMode:A})=>{const{width:P}=et(),R=Object(he.a)(),[x,L]=Object(c.r)(Je.a.None),[B,D]=Object(c.r)(),[F,U]=Object(c.r)(),[H,q]=Object(c.r)(!1),[G,_]=Object(c.r)(!m.l||E===n.f),z=u&&(Pn.lb&&P=n.kb&&Pe?Object(de.a)(()=>{S({id:void 0})}):void 0,[e,S]),Object(c.n)(()=>{L(Je.a.None),D(void 0),U(void 0)},[e]),Object(c.n)(()=>{E===n.f&&_(!0)},[E]);Object(c.n)(()=>{s&&N({userId:e})},[e,s,N]);const Y=Object(c.m)(e=>{if(m.n)return;const{items:t}=e.dataTransfer||{},a=t&&Array.from(t).filter(e=>"text/uri-list"!==e.type).every(un);L(a?Je.a.QuickFile:Je.a.Document)},[]),X=Object(c.m)(()=>{L(Je.a.None)},[]),Z=Object(c.m)(()=>{q(!0)},[]),ee=Object(c.m)(()=>{q(!1)},[]),te=Object(c.m)(()=>{k({chatId:e}),ee(),S({id:e})},[k,S,ee,e]),ae=Object(c.m)(()=>{S({id:e})},[S,e]),se=((e,t)=>{const[a,s]=Object(c.r)(t);return Object(c.n)(()=>{t&&(t.startsWith("#")?s(t):Ye.c(n.o,e,Ye.a.Blob).then(e=>{const t=URL.createObjectURL(e);Object(Xe.g)(t).then(()=>{s(`url(${t})`)})}))},[t,e]),t?a:void 0})(j,O),ce=Object(ne.a)(Q&&"has-header-tools",O&&"custom-bg-image",g&&"custom-bg-color",O&&v&&"blurred",m.q?"mask-image-disabled":"mask-image-enabled"),re=Object(ne.a)("messaging-disabled",!C&&"shown"),oe=Object(l.L)(R,d,b),{composerHiddenScale:ie,toolbarHiddenScale:le,composerTranslateX:be,toolbarTranslateX:me,unpinHiddenScale:Oe,toolbarForUnpinHiddenScale:ge}=Object(c.p)(()=>at(P,K),[K,P]),pe=Object(ne.a)("middle-column-footer",!K&&"no-composer",K&&F&&!C&&"with-notch");return Object(je.a)($&&V,()=>{S({id:void 0},!0)},void 0,void 0,void 0,o?o.map(st):[]),Object(je.a)(y,T),Object(je.a)(C,A),c.a.createElement("div",{id:"MiddleColumn",className:ce,onTransitionEnd:t=>{"transform"===t.propertyName&&t.target===t.currentTarget&&_(Boolean(e))},style:`\n --composer-hidden-scale: ${ie};\n --toolbar-hidden-scale: ${le};\n --unpin-hidden-scale: ${Oe};\n --toolbar-unpin-hidden-scale: ${ge};\n --composer-translate-x: ${be}px;\n --toolbar-translate-x: ${me}px;\n --pattern-color: ${p};\n --theme-background-color:\n ${g||("dark"===j?n.p:n.R)};\n `,onClick:m.m&&f?ae:void 0},c.a.createElement("div",{id:"middle-column-bg",style:se?"--custom-background: "+se:void 0}),c.a.createElement("div",{id:"middle-column-portals"}),$&&V&&c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"messages-layout",onDragEnter:K?Y:void 0},c.a.createElement(wt,{chatId:$,threadId:V,messageListType:W,isReady:G}),c.a.createElement(ue.a,{name:w?"none":E===n.e?"slide":"fade",activeKey:M,shouldCleanup:!0},()=>c.a.createElement(c.a.Fragment,null,c.a.createElement(os,{key:`${$}-${V}-${W}`,chatId:$,threadId:V,type:W,canPost:K,hasTools:Q,onFabToggle:D,onNotchToggle:U,isReady:G}),c.a.createElement("div",{className:pe},K&&c.a.createElement(rn,{chatId:$,threadId:V,messageListType:W,dropAreaState:x,onDropHide:X,isReady:G}),r&&c.a.createElement("div",{className:"unpin-button-container",dir:R.isRtl?"rtl":void 0},c.a.createElement(fe.a,{size:"tiny",fluid:!0,color:"secondary",className:"unpin-all-button",onClick:Z},c.a.createElement("i",{className:"icon-unpin"}),c.a.createElement("span",null,R("Chat.Pinned.UnpinAll",h,"i")))),!r&&!K&&oe&&c.a.createElement("div",{className:re},c.a.createElement("div",{className:"messaging-disabled-inner"},c.a.createElement("span",null,oe))),c.a.createElement(ln,{messageListType:W,isActive:C,canPost:K})))),c.a.createElement(is,{isShown:J,canPost:K})),m.l&&c.a.createElement(on,{isActive:Boolean(y)})),e&&c.a.createElement(dn,{isOpen:H,chatId:e,pinnedMessagesCount:h,onClose:ee,onUnpin:te}))}));a(256);const hn=Object(f.a)(e=>e(),200,!1);var On;!function(e){e[e.Profile=0]="Profile",e[e.MemberList=1]="MemberList",e[e.SharedMedia=2]="SharedMedia",e[e.Search=3]="Search",e[e.Management=4]="Management",e[e.ManageInitial=5]="ManageInitial",e[e.ManageChannelSubscribers=6]="ManageChannelSubscribers",e[e.ManageChatAdministrators=7]="ManageChatAdministrators",e[e.ManageChatPrivacyType=8]="ManageChatPrivacyType",e[e.ManageDiscussion=9]="ManageDiscussion",e[e.ManageGroupPermissions=10]="ManageGroupPermissions",e[e.ManageGroupRemovedUsers=11]="ManageGroupRemovedUsers",e[e.ManageGroupUserPermissionsCreate=12]="ManageGroupUserPermissionsCreate",e[e.ManageGroupUserPermissions=13]="ManageGroupUserPermissions",e[e.ManageGroupRecentActions=14]="ManageGroupRecentActions",e[e.ManageGroupAdminRights=15]="ManageGroupAdminRights",e[e.ManageGroupMembers=16]="ManageGroupMembers",e[e.StickerSearch=17]="StickerSearch",e[e.GifSearch=18]="GifSearch",e[e.PollResults=19]="PollResults",e[e.AddingMembers=20]="AddingMembers"}(On||(On={}));var jn=Object(c.h)(Object(s.h)((e,{chatId:t,isProfile:a,isManagement:s})=>{const{query:n}=Object(o.B)(e)||{},{query:c}=Object(o.A)(e)||{},{query:r}=Object(o.t)(e)||{},i=t?Object(o.g)(e,t):void 0,d=i&&Object(l.mb)(i);return{canManage:Boolean(!s&&a&&i&&!Object(o.P)(e,i.id)&&(Object(l.ob)(i.id)||(Object(l.jb)(i)||i.isCreator)&&!i.isNotJoined)),isChannel:d,messageSearchQuery:n,stickerSearchQuery:c,gifSearchQuery:r}},(e,t)=>Object(h.l)(t,["setLocalTextSearchQuery","setStickerSearchQuery","setGifSearchQuery","searchTextMessagesLocal","toggleManagement","openHistoryCalendar"]))(({isColumnOpen:e,isProfile:t,isSearch:a,isManagement:s,isStickerSearch:n,isGifSearch:r,isPollResults:o,isAddingChatMembers:i,profileState:l,managementScreen:d,canManage:b,isChannel:h,onClose:O,messageSearchQuery:j,stickerSearchQuery:g,gifSearchQuery:p,setLocalTextSearchQuery:f,setStickerSearchQuery:I,setGifSearchQuery:v,searchTextMessagesLocal:y,toggleManagement:C,openHistoryCalendar:E,shouldSkipAnimation:w})=>{var M;const S=Object(c.q)(null),k=Object(c.m)(e=>{f({query:e}),e.length&&hn(y)},[y,f]),N=Object(c.m)(e=>{I({query:e})},[I]),T=Object(c.m)(e=>{v({query:e})},[v]),[A,P]=Object(c.r)(!e);Object(c.n)(()=>{setTimeout(()=>{P(!e)},300)},[e]);const R=Object(he.a)(),L=t?l===u.l.Profile?On.Profile:l===u.l.SharedMedia?On.SharedMedia:l===u.l.MemberList?On.MemberList:-1:a?On.Search:o?On.PollResults:n?On.StickerSearch:r?On.GifSearch:i?On.AddingMembers:s?d===u.g.Initial?On.ManageInitial:d===u.g.ChatPrivacyType?On.ManageChatPrivacyType:d===u.g.Discussion?On.ManageDiscussion:d===u.g.ChannelSubscribers?On.ManageChannelSubscribers:d===u.g.GroupPermissions?On.ManageGroupPermissions:d===u.g.ChatAdministrators?On.ManageChatAdministrators:d===u.g.GroupRemovedUsers?On.ManageGroupRemovedUsers:d===u.g.GroupUserPermissionsCreate?On.ManageGroupUserPermissionsCreate:d===u.g.GroupUserPermissions?On.ManageGroupUserPermissions:d===u.g.GroupRecentActions?On.ManageGroupRecentActions:d===u.g.ChatAdminRights?On.ManageGroupAdminRights:d===u.g.GroupMembers?On.ManageGroupMembers:void 0:void 0,B=null!==(M=Object(rt.a)(L,!0))&&void 0!==M?M:-1;function D(){if(-1!==B)switch(B){case On.PollResults:return c.a.createElement("h3",null,R("PollResults"));case On.Search:return c.a.createElement(c.a.Fragment,null,c.a.createElement(Ie.a,{parentContainerClassName:"RightSearch",value:j,onChange:k}),c.a.createElement(fe.a,{round:!0,size:"smaller",color:"translucent",onClick:()=>E({selectedAt:Object(x.k)(Date.now())}),ariaLabel:"Search messages by date"},c.a.createElement("i",{className:"icon-calendar"})));case On.AddingMembers:return c.a.createElement("h3",null,R("GroupAddMembers"));case On.ManageInitial:return c.a.createElement("h3",null,R("Edit"));case On.ManageChatPrivacyType:return c.a.createElement("h3",null,R(h?"ChannelTypeHeader":"GroupTypeHeader"));case On.ManageDiscussion:return c.a.createElement("h3",null,R("Discussion"));case On.ManageChatAdministrators:return c.a.createElement("h3",null,R("ChannelAdministrators"));case On.ManageGroupRecentActions:return c.a.createElement("h3",null,R("Group.Info.AdminLog"));case On.ManageGroupAdminRights:return c.a.createElement("h3",null,R("EditAdminRights"));case On.ManageGroupPermissions:return c.a.createElement("h3",null,R("ChannelPermissions"));case On.ManageGroupRemovedUsers:return c.a.createElement("h3",null,R("ChannelBlockedUsers"));case On.ManageGroupUserPermissionsCreate:return c.a.createElement("h3",null,R("ChannelAddException"));case On.ManageGroupUserPermissions:return c.a.createElement("h3",null,R("UserRestrictions"));case On.StickerSearch:return c.a.createElement(Ie.a,{value:g,placeholder:R("SearchStickersHint"),onChange:N});case On.GifSearch:return c.a.createElement(Ie.a,{value:p,placeholder:R("SearchGifsTitle"),onChange:T});case On.SharedMedia:return c.a.createElement("h3",null,R("SharedMedia"));case On.ManageChannelSubscribers:return c.a.createElement("h3",null,R("ChannelSubscribers"));case On.MemberList:case On.ManageGroupMembers:return c.a.createElement("h3",null,R("GroupMembers"));default:return c.a.createElement(c.a.Fragment,null,c.a.createElement("h3",null,"Profile"),c.a.createElement("section",{className:"tools"},b&&c.a.createElement(fe.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:R("Edit"),onClick:C},c.a.createElement("i",{className:"icon-edit"}))))}}const F=m.l||L===On.SharedMedia||L===On.MemberList||L===On.AddingMembers||s,U=Object(ne.a)("animated-close-icon",(A||w)&&"no-transition");return Object(c.n)(()=>{S.current.classList.toggle("state-back",F)},[F]),c.a.createElement("div",{className:"RightHeader"},c.a.createElement(fe.a,{className:"close-button",round:!0,color:"translucent",size:"smaller",onClick:O,ariaLabel:R(F?"Common.Back":"Common.Close")},c.a.createElement("div",{ref:S,className:U})),c.a.createElement(ue.a,{name:A||w?"none":"slide-fade",activeKey:B},D))})),gn=a(133);function pn(e,t,a,s,r,o,i,d,b,u,m,h=0){const O="members"!==s&&r?r:s,j=Object(c.p)(()=>{if(o&&i)return Object(l.Jb)(o.map(({userId:e})=>e),i,void 0,h)},[o,h,i]),[g,p,f]=function(e,t,a,s){const[c,r]=Object(gn.a)(a?t:void 0,s,void 0,n.cb),o=!c||!s||c[0]===s[0];return[c,r,!o]}(0,t,m,j),[I,v,y]=fn("media",O,a,m,d,b),[C,E,w]=fn("documents",O,a,m,d,b),[M,S,k]=fn("links",O,a,m,d,b),[N,T,A]=fn("audio",O,a,m,d,b);let P,R,x=!1;switch(O){case"members":P=g,R=p,x=f;break;case"media":P=I,R=v,x=y;break;case"documents":P=C,R=E,x=w;break;case"links":P=M,R=S,x=k;break;case"audio":P=N,R=T,x=A}return[O,P,R,x]}function fn(e,t,a,s,r,o){const i=Object(c.q)();Object(le.a)(()=>{t===e&&r&&o&&(i.current=Object(l.w)(r,o,e).reverse())},[r,o,t,e]);const[d,b]=Object(gn.a)(s?a:void 0,i.current,void 0,"media"===e?n.Ab:n.ib);return[d,b,!(!d||!i.current||d[0]===i.current[0])]}const In=Object(f.h)(e=>e(),250,!1);let vn=!1;var yn=a(115),Cn=a(108);var En=a(138),wn=a(200);a(257);var Mn=Object(c.h)(({chat:e,user:t,photo:a,isFirstPhoto:s,isSavedMessages:n,lastSyncTime:r,onClick:o})=>{const i=Object(he.a)(),d=t&&Object(l.sb)(t);function u(s="big",c){if(a&&!c)return`photo${a.id}?size=c`;let r;return n||d||(t?r=Object(l.e)(t,s):e&&(r=Object(l.e)(e,s))),r}const m=u(),h=Object(ht.a)(m,!1,b.ApiMediaFormat.BlobUrl,r),O=Object(ht.a)(!h&&s?u("normal",!0):void 0,!1,b.ApiMediaFormat.BlobUrl,r),j=Object(wn.a)(!h&&a&&a.thumbnail&&a.thumbnail.dataUri),g=h||O||j,p=Object(ga.a)(g);let f="";if(n)f=c.a.createElement("i",{className:"icon-avatar-saved-messages"});else if(d)f=c.a.createElement("i",{className:"icon-avatar-deleted-account"});else if(g)f=c.a.createElement("img",{src:g,className:"avatar-media",alt:"",decoding:"async"});else if(!g&&t){const e=Object(l.bb)(t);f=e?Object(ot.c)(e,2):void 0}else if(!g&&e){const t=Object(l.k)(i,e);f=t&&Object(ot.c)(t,Object(l.ob)(e.id)?2:1)}else f=c.a.createElement("div",{className:"spinner-wrapper"},c.a.createElement(we.a,{color:"white"}));const I=Object(ne.a)("ProfilePhoto","color-bg-"+Object(l.Z)(t||e),n&&"saved-messages",d&&"deleted-account",!n&&!g&&"no-photo");return c.a.createElement("div",{className:I,onClick:g?o:void 0},p&&g&&p!==g&&c.a.createElement("img",{src:p,className:"prev-avatar-media",alt:"",decoding:"async"}),"string"==typeof f?Object(mt.a)(f,["hq_emoji"]):f)});a(258);var Sn=Object(c.h)(Object(s.h)((e,{userId:t,forceShowSelf:a})=>{const{lastSyncTime:s,serverTimeOffset:n}=e,c=Object(o.Jb)(e,t),r=Object(o.g)(e,t),i=!a&&c&&c.isSelf,{animationLevel:l}=e.settings.byKey;return{lastSyncTime:s,user:c,chat:r,isSavedMessages:i,animationLevel:l,serverTimeOffset:n}},(e,t)=>Object(h.l)(t,["loadFullUser","openMediaViewer"]))(({user:e,chat:t,isSavedMessages:a,lastSyncTime:s,animationLevel:n,loadFullUser:r,openMediaViewer:o,serverTimeOffset:i})=>{const{id:d}=e||{},{id:h}=t||{},O=e?Object(l.bb)(e):t?t.title:"",j=(e?e.photos:t?t.photos:void 0)||[],g=n>=1?"slide":"none",[p,f]=Object(c.r)(0),I=a||j.length<=1||0===p,v=a||j.length<=1||p===j.length-1;Object(c.n)(()=>{p>j.length&&f(Math.max(0,j.length-1))},[p,j.length]);const y=Object(he.a)();Object(c.n)(()=>{s&&d&&r({userId:d})},[d,r,s]),function(e,t,a){Object(c.n)(()=>{t.slice(a,a+4).forEach(e=>{yt.c(`photo${e.id}?size=c`)||yt.b(`photo${e.id}?size=c`,b.ApiMediaFormat.BlobUrl)})},[a,t])}(0,j,p);const C=Object(c.m)(()=>{o({avatarOwnerId:d||h,profilePhotoIndex:p,origin:u.h.ProfileAvatar})},[o,d,h,p]),E=Object(c.m)(()=>{I||f(p-1)},[p,I]),w=Object(c.m)(()=>{v||f(p+1)},[p,v]);if(Object(c.n)(()=>{const e=document.querySelector(".photo-wrapper");if(e)return Object(Se.b)(e,{onSwipe:m.n?(e,t)=>{t===Se.a.Right?E():t===Se.a.Left&&w()}:void 0})},[w,E]),!e&&!t)return;function M(){const s=!a&&j&&j.length>0?j[p]:void 0;return c.a.createElement(Mn,{key:p,user:e,chat:t,photo:s,isSavedMessages:a,isFirstPhoto:I,onClick:C})}const S=e&&e.isVerified||t&&t.isVerified;return c.a.createElement("div",{className:"ProfileInfo",dir:y.isRtl?"rtl":void 0},c.a.createElement("div",{className:"photo-wrapper"},function(){if(!(a||!j||j.length<=1))return c.a.createElement("div",{className:"photo-dashes"},j.map((e,t)=>c.a.createElement("span",{className:"photo-dash "+(t===p?"current":"")})))}(),c.a.createElement(ue.a,{activeKey:p,name:g,className:"profile-slide-container"},M),!I&&c.a.createElement("button",{type:"button",className:"navigation prev","aria-label":y("AccDescrPrevious"),onClick:E}),!v&&c.a.createElement("button",{type:"button",className:"navigation next","aria-label":y("Next"),onClick:w})),c.a.createElement("div",{className:"info",dir:y.isRtl?"rtl":"auto"},a?c.a.createElement("div",{className:"title"},c.a.createElement("h3",{dir:"auto"},y("SavedMessages"))):c.a.createElement("div",{className:"title"},c.a.createElement("h3",{dir:"auto"},O&&Object(mt.a)(O)),S&&c.a.createElement(En.a,null)),!a&&(e?c.a.createElement("div",{className:"status "+(Object(l.Cb)(e)?"online":"")},c.a.createElement("span",{className:"user-status",dir:"auto"},Object(l.cb)(y,e,i))):c.a.createElement("span",{className:"status",dir:"auto"},Object(l.mb)(t)?y("Subscribers",t.membersCount,"i"):y("Members",t.membersCount,"i")))))})),kn=a(171);var Nn=Object(c.h)(Object(s.h)((e,{chatOrUserId:t})=>{const{lastSyncTime:a}=e,s=t?Object(o.g)(e,t):void 0,n=Object(l.ob)(t)?Object(o.Jb)(e,t):void 0,c=s&&Object(l.Hb)(s,Object(o.fb)(e),Object(o.eb)(e));return{lastSyncTime:a,chat:s,user:n,canInviteUsers:s&&!n&&(!Object(l.mb)(s)&&!Object(l.Db)(s,"inviteUsers")||Object(l.p)(s,"inviteUsers")),isMuted:c}},(e,t)=>Object(h.l)(t,["loadFullUser","updateChatMutedState","showNotification"]))(({lastSyncTime:e,user:t,chat:a,forceShowSelf:s,canInviteUsers:n,isMuted:r,loadFullUser:o,showNotification:i,updateChatMutedState:d})=>{const{id:b,fullInfo:u,username:m,phoneNumber:h,isSelf:O}=t||{},{id:j}=a||{},g=Object(he.a)();Object(c.n)(()=>{e&&b&&o({userId:b})},[o,b,e]);const p=Object(c.m)(()=>{d({chatId:j,isMuted:!r})},[j,r,d]);if(!a||a.isRestricted||O&&!s)return;function f(e,t){Object(kn.c)(e),i({message:t+" was copied"})}const I=h&&Object(Na.c)(h),v=Object(l.g)(a),y=u&&u.bio||Object(l.f)(a);return c.a.createElement("div",{className:"ChatExtra"},I&&!!I.length&&c.a.createElement(Cn.a,{icon:"phone",multiline:!0,narrow:!0,ripple:!0,onClick:()=>f(I,g("Phone"))},c.a.createElement("span",{className:"title",dir:"auto"},I),c.a.createElement("span",{className:"subtitle"},g("Phone"))),m&&c.a.createElement(Cn.a,{icon:"mention",multiline:!0,narrow:!0,ripple:!0,onClick:()=>f("@"+m,g("Username"))},c.a.createElement("span",{className:"title",dir:"auto"},Object(mt.a)(m)),c.a.createElement("span",{className:"subtitle"},g("Username"))),y&&!!y.length&&c.a.createElement(Cn.a,{icon:"info",multiline:!0,narrow:!0,isStatic:!0},c.a.createElement("span",{className:"title",dir:"auto"},Object(mt.a)(y,["br","links","emoji"])),c.a.createElement("span",{className:"subtitle"},g(b?"UserBio":"Info"))),(n||!m)&&v&&c.a.createElement(Cn.a,{icon:"mention",multiline:!0,narrow:!0,ripple:!0,onClick:()=>f(v,g("SetUrlPlaceholder"))},c.a.createElement("div",{className:"title"},v),c.a.createElement("span",{className:"subtitle"},g("SetUrlPlaceholder"))),c.a.createElement(Cn.a,{icon:"unmute",ripple:!0,onClick:p},c.a.createElement("span",null,g("Notifications")),c.a.createElement(ye,{id:"group-notifications",label:b?"Toggle User Notifications":"Toggle Chat Notifications",checked:!r,inactive:!0})))})),Tn=a(172),An=a(194),Pn=a(121),Rn=a(116),xn=a(112);var Ln=Object(c.h)(Object(s.h)((e,{userId:t})=>{const a=Object(o.s)(e),s=t&&Object(o.Jb)(e,t);return{chat:a,contactName:s?Object(l.ab)(s):void 0}},(e,t)=>Object(h.l)(t,["deleteChatMember"]))(({isOpen:e,chat:t,userId:a,contactName:s,onClose:n,deleteChatMember:r})=>{const o=Object(he.a)(),i=Object(c.m)(()=>{r({chatId:t.id,userId:a}),n()},[t,r,n,a]);if(t&&a)return c.a.createElement(xn.a,{isOpen:e,onClose:n,onEnter:i,className:"delete",title:o("GroupRemoved.Remove")},c.a.createElement("p",null,Object(mt.a)(o("PeerInfo.Confirm.RemovePeer",s))),c.a.createElement(fe.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:i},o("lng_box_remove")),c.a.createElement(fe.a,{className:"confirm-dialog-button",isText:!0,onClick:n},o("Cancel")))}));a(263);const Bn=[{type:"media",title:"SharedMediaTab2"},{type:"documents",title:"SharedFilesTab2"},{type:"links",title:"SharedLinksTab2"},{type:"audio",title:"SharedMusicTab2"}];function Dn(e){return[`.shared-media-transition > div:only-child > .${e}-list > .scroll-item`,`.shared-media-transition > div.active > .${e}-list > .scroll-item`].join(", ")}var Fn=Object(c.h)(Object(s.h)((e,{chatId:t,userId:a})=>{const s=Object(o.g)(e,t),n=Object(o.n)(e,a||t),{currentType:c,resultsByType:r}=Object(o.w)(e)||{},{foundIds:i}=r&&c&&r[c]||{},{byId:d}=e.users,b=s&&Object(l.nb)(s),u=s&&Object(l.mb)(s),m=b||u&&Object(l.jb)(s),h=s&&s.fullInfo&&s.fullInfo.members,O=m&&s&&s.fullInfo&&!s.fullInfo.canViewMembers,j=m&&s&&(Object(l.p)(s,"inviteUsers")||s.isCreator),g=m&&s&&(Object(l.p)(s,"banUsers")||s.isCreator);let p;return a?p=a:Object(l.ob)(t)&&(p=t),{theme:Object(o.Db)(e),isChannel:u,resolvedUserId:p,chatMessages:n,foundIds:i,mediaSearchType:c,hasMembersTab:m,areMembersHidden:O,canAddMembers:j,canDeleteMembers:g,currentUserId:e.currentUserId,isRightColumnShown:Object(o.W)(e),isRestricted:s&&s.isRestricted,lastSyncTime:e.lastSyncTime,serverTimeOffset:e.serverTimeOffset,...m&&h&&{members:h,usersById:d}}},(e,t)=>Object(h.l)(t,["setLocalMediaSearchType","loadMoreMembers","searchMediaMessagesLocal","openMediaViewer","openAudioPlayer","openUserInfo","focusMessage","loadProfilePhotos","setNewChatMembersDialogState"]))(({chatId:e,profileState:t,onProfileStateChange:a,theme:s,isChannel:r,resolvedUserId:o,currentUserId:i,chatMessages:l,foundIds:d,mediaSearchType:h,hasMembersTab:O,areMembersHidden:j,canAddMembers:g,canDeleteMembers:p,members:f,usersById:I,isRightColumnShown:v,isRestricted:y,lastSyncTime:C,setLocalMediaSearchType:E,loadMoreMembers:w,searchMediaMessagesLocal:M,openMediaViewer:S,openAudioPlayer:k,openUserInfo:N,focusMessage:T,loadProfilePhotos:A,setNewChatMembersDialogState:P,serverTimeOffset:R})=>{const x=Object(c.q)(null),L=Object(c.q)(null),B=Object(he.a)(),[D,F]=Object(c.r)(0),[U,H]=Object(c.r)(),q=Object(c.p)(()=>[...O?[{type:"members",title:r?"ChannelSubscribers":"GroupMembers"}]:[],...Bn],[O,r]),G=q[D].type,[_,z,$,V]=pn(0,w,M,G,h,f,I,l,d,0,C,R),W=q.findIndex(({type:e})=>e===_),{handleScroll:K}=function(e,t,a,s){Object(St.a)(([a])=>{if(a&&a!==t){const a=e.current,n=a.querySelector(".TabList");a.scrollTop{vn=!1},350))}},[t,s]),Object(St.a)(([t])=>{if(a!==u.l.Profile||a===t)return;const n=e.current;if(!n)return;const c=n.querySelector(".TabList");!c||c.offsetTop>n.scrollTop||(vn=!0,Object(Rt.a)(n,n.firstElementChild,"start",void 0,2*n.offsetHeight),setTimeout(()=>{vn=!1},350),s(a))},[a]);const n=Object(c.m)(()=>{const a=e.current;if(!a)return;const n=a.querySelector(".TabList");if(!n)return;let c=u.l.Profile;a.scrollTop>=n.offsetTop&&(c="members"===t?u.l.MemberList:u.l.SharedMedia),s(c)},[e,s,t]);return Object(c.n)(()=>{vn||n()},[n,t]),{handleScroll:Object(c.m)(()=>{vn||In(n)},[n])}}(x,G,t,a),{applyTransitionFix:Q,releaseTransitionFix:J}=function(e,t=".Transition.shared-media-transition"){return Object(c.n)(()=>{function a(){const a=e.current,s=a.querySelector(t),n=a.querySelector(".TabList");s&&n&&(s.style.minHeight=a.offsetHeight-n.offsetHeight+"px")}return a(),window.addEventListener("resize",a,!1),()=>{window.removeEventListener("resize",a,!1)}},[e,t]),{applyTransitionFix:Object(c.m)(()=>{const t=e.current;if("hidden"!==t.style.overflowY){const e=t.offsetWidth-t.clientWidth;t.style.overflowY="hidden",t.style.marginRight=e+"px"}},[e]),releaseTransitionFix:Object(c.m)(()=>{const t=e.current;t.style.overflowY="scroll",t.style.marginRight="0"},[e])}}(x),[Y,X]=(()=>{const[e,t]=Object(c.r)(!1);return[e,Object(c.m)(()=>{t(e=>!e)},[])]})(),Z=Object(c.m)(()=>{J(),X()},[J,X]),ee=Object(c.m)(()=>{P(u.i.InProgress)},[P]);Object(c.n)(()=>{E({mediaType:G})},[E,G]);const te=o||e;Object(c.n)(()=>{C&&A({profileId:te})},[A,te,C]);const ae=Object(c.m)(e=>{S({chatId:te,threadId:b.MAIN_THREAD_ID,messageId:e,origin:u.h.SharedMedia})},[te,S]),se=Object(c.m)(e=>{k({chatId:te,messageId:e})},[te,k]),ne=Object(c.m)(e=>{N({id:e})},[N]),ce=Object(c.m)(e=>{T({chatId:te,messageId:e})},[te,T]),re=Object(c.m)(()=>{H(void 0)},[]);let oe;Object(c.n)(()=>{if(L.current&&m.n)return Object(Se.b)(L.current,{onSwipe:(e,t)=>{t===Se.a.Left?F(Math.min(D+1,q.length-1)):t===Se.a.Right&&F(Math.max(0,D-1))}})},[D,q.length]);const ie="members"===_||!O&&"media"===_;ie?oe=v?0:1e3:z||(oe=n.Bb);const le=Object(Ks.a)([e,_],oe);function de(e){return e!==i&&p?[{title:B("lng_context_remove_from_group"),icon:"stop",handler:()=>{H(e)}}]:void 0}function be(){if(!z||!le||!l){const e=ie&&z&&!le;return c.a.createElement("div",{className:"content empty-list"},!e&&c.a.createElement(we.a,null))}if(!z.length){let e;switch(_){case"members":e=j?"You have no access to group members list.":"No members found";break;case"documents":e=B("lng_media_file_empty_search");break;case"links":e=B("lng_media_link_empty_search");break;case"audio":e=B("lng_media_song_empty_search");break;default:e=B("SharedMedia.EmptyTitle")}return c.a.createElement("div",{className:"content empty-list"},c.a.createElement(Pn.a,{text:e}))}return c.a.createElement("div",{className:`content ${_}-list`,dir:B.isRtl&&"media"===_?"rtl":void 0,teactFastList:!0},"media"===_?z.map(e=>l[e]&&c.a.createElement(Tn.a,{key:e,message:l[e],onClick:ae})):"documents"===_?z.map(e=>l[e]&&c.a.createElement(ca.a,{key:e,message:l[e],withDate:!0,smaller:!0,className:"scroll-item",onDateClick:ce})):"links"===_?z.map(e=>l[e]&&c.a.createElement(An.a,{key:e,message:l[e],onMessageClick:ce})):"audio"===_?z.map(e=>l[e]&&c.a.createElement(ra.a,{key:e,theme:s,message:l[e],target:"sharedMedia",date:l[e].date,lastSyncTime:C,className:"scroll-item",onPlay:se,onDateClick:ce})):"members"===_?z.map((e,t)=>c.a.createElement(Cn.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>ne(e),contextActions:de(e)},c.a.createElement(it.a,{userId:e,forceShowSelf:!0}))):void 0)}return c.a.createElement(yn.a,{ref:x,className:"Profile custom-scroll",itemSelector:Dn(_),items:le?z:void 0,cacheBuster:Y,sensitiveArea:n.qb,preloadBackwards:le?"members"===_?n.cb:n.Ab:0,noScrollRestoreOnTop:!0,noFastList:!0,onLoadMore:$,onScroll:K},!V&&function(e,t){return c.a.createElement("div",{className:"profile-info"},c.a.createElement(Sn,{userId:t||e,forceShowSelf:t!==e}),c.a.createElement(Nn,{chatOrUserId:t||e,forceShowSelf:t!==e}))}(e,o),!y&&c.a.createElement("div",{className:"shared-media"},c.a.createElement(ue.a,{ref:L,name:B.isRtl?"slide-reversed":"slide",activeKey:W,renderCount:q.length,shouldRestoreHeight:!0,className:"shared-media-transition",onStart:Q,onStop:Z},be),c.a.createElement(Ne.a,{big:!0,activeTab:D,tabs:q,onSwitchTab:F})),g&&c.a.createElement(Rn.a,{isShown:"members"===_,onClick:ee,ariaLabel:B("lng_channel_add_users")},c.a.createElement("i",{className:"icon-add-user-filled"})),p&&c.a.createElement(Ln,{isOpen:Boolean(U),userId:U,onClose:re}))}));var Un=Object(c.h)(e=>{const t=Object(Re.a)(Pe.a.Extra,"RightSearch");return t?c.a.createElement(t,e):c.a.createElement(xe.a,null)});var Hn=Object(c.h)(e=>{const t=Object(Re.a)(Pe.a.Extra,"Management");return t?c.a.createElement(t,e):c.a.createElement(xe.a,null)});var qn=Object(c.h)(()=>{const e=Object(Re.a)(Pe.a.Extra,"StickerSearch");return e?c.a.createElement(e,null):c.a.createElement(xe.a,null)});var Gn=Object(c.h)(()=>{const e=Object(Re.a)(Pe.a.Extra,"GifSearch");return e?c.a.createElement(e,null):c.a.createElement(xe.a,null)});var _n=Object(c.h)(()=>{const e=Object(Re.a)(Pe.a.Extra,"PollResults");return e?c.a.createElement(e,null):c.a.createElement(xe.a,null)}),zn=a(173);a(264);var $n=Object(c.h)(Object(s.h)((e,{chatId:t})=>{const a=Object(o.g)(e,t),{userIds:s}=e.contactList||{},{byId:n}=e.users,{byId:c}=e.chats,{currentUserId:r,newChatMembersProgress:i,connectionState:d}=e,b=a&&Object(l.mb)(a),{query:m,fetchingStatus:h,globalUserIds:O,localUserIds:j}=e.userSearch;return{isChannel:b,members:a&&a.fullInfo?a.fullInfo.members:void 0,currentUserId:r,usersById:n,chatsById:c,localContactIds:s,searchQuery:m,isSearching:h,isLoading:i===u.i.Loading,globalUserIds:O,localUserIds:j,connectionState:d}},(e,t)=>Object(h.l)(t,["loadContactList","setUserSearchQuery"]))(({isChannel:e,connectionState:t,members:a,onNextStep:s,currentUserId:n,usersById:r,chatsById:o,localContactIds:i,isLoading:d,searchQuery:b,isSearching:u,localUserIds:m,globalUserIds:O,setUserSearchQuery:j,onClose:g,isActive:p,loadContactList:f})=>{const I=Object(he.a)(),[v,y]=Object(c.r)([]),C=Object(ga.a)(v)===v;Object(c.n)(()=>{p&&"connectionStateReady"===t&&f()},[t,p,f]),Object(je.a)(p,g);const E=Object(c.p)(()=>a?a.map(e=>e.userId):[],[a]),w=Object(c.m)(e=>{j({query:e})},[j]),M=Object(c.p)(()=>{const t=i?Object(l.Ib)(i.filter(e=>e!==n),o):[];if(!b)return t.filter(e=>!E.includes(e));const a=t.filter(e=>{const t=r[e];if(!t)return!1;const a=Object(l.bb)(t);return a&&Object(A.a)(a,b)});return Object(l.Ib)(Object(h.o)([...a,...m||[],...O||[]]).filter(t=>{const a=r[t];return!E.includes(t)&&(!a||!Object(l.Bb)(a)||!e&&a.canBeInvitedToGroup)}),o)},[i,o,b,m,O,n,r,E,e]),S=Object(c.m)(()=>{v.length&&(j({query:""}),s(v))},[v,j,s]);return c.a.createElement("div",{className:"AddChatMembers"},c.a.createElement("div",{className:"AddChatMembers-inner"},c.a.createElement(zn.a,{itemIds:M,selectedIds:v,filterValue:b,filterPlaceholder:I("lng_channel_add_users"),searchInputId:"new-members-picker-search",isLoading:u,onSelectedIdsChange:y,onFilterChange:w,noScrollRestore:C}),c.a.createElement(Rn.a,{isShown:Boolean(v.length),disabled:d,ariaLabel:I("lng_channel_add_users"),onClick:S},d?c.a.createElement(we.a,{color:"white"}):c.a.createElement("i",{className:"icon-arrow-right"}))))}));a(265);const Vn=Object.keys(u.m).length/2,Wn=Object.keys(u.g).length/2;function Kn(){const e=document.querySelector(".RightHeader .SearchInput input");e&&e.blur()}var Qn=Object(c.h)(Object(s.h)(e=>{const{chatId:t,threadId:a}=Object(o.z)(e)||{},s=Object(o.d)(e);return{contentKey:Object(o.pb)(e),chatId:t,threadId:a,currentProfileUserId:e.users.selectedId,isChatSelected:Boolean(t&&s),shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations}},(e,t)=>Object(h.l)(t,["openUserInfo","toggleChatInfo","toggleManagement","closeLocalTextSearch","setStickerSearchQuery","setGifSearchQuery","closePollResults","addChatMembers","setNewChatMembersDialogState"]))(({contentKey:e,chatId:t,threadId:a,currentProfileUserId:s,isChatSelected:r,toggleChatInfo:o,toggleManagement:i,openUserInfo:l,closeLocalTextSearch:d,setStickerSearchQuery:b,setGifSearchQuery:m,closePollResults:h,addChatMembers:O,setNewChatMembersDialogState:j,shouldSkipHistoryAnimations:g})=>{var p;const{width:f}=et(),[I,v]=Object(c.r)(u.l.Profile),[y,C]=Object(c.r)(u.g.Initial),[E,w]=Object(c.r)(),[M,S]=Object(c.r)(),k=I!==u.l.Profile,N=void 0!==e,T=e===u.m.ChatInfo||e===u.m.UserInfo,A=e===u.m.Search,P=e===u.m.Management,R=e===u.m.StickerSearch,x=e===u.m.GifSearch,L=e===u.m.PollResults,B=e===u.m.AddingMembers,D=f<=n.lb,[F,U]=Object(c.r)(!N),H=null!==(p=Object(rt.a)(e,!0,!r))&&void 0!==p?p:-1,q=Object(c.m)((t=!0)=>{switch(e){case u.m.AddingMembers:j(u.i.Closed);break;case u.m.ChatInfo:if(k&&t){v(u.l.Profile);break}o(void 0,!0);break;case u.m.UserInfo:if(k&&t){v(u.l.Profile);break}l({id:void 0},!0);break;case u.m.Management:switch(y){case u.g.Initial:i();break;case u.g.ChatPrivacyType:case u.g.Discussion:case u.g.GroupPermissions:case u.g.GroupType:case u.g.ChatAdministrators:case u.g.ChannelSubscribers:case u.g.GroupMembers:C(u.g.Initial);break;case u.g.GroupUserPermissionsCreate:case u.g.GroupRemovedUsers:case u.g.GroupUserPermissions:C(u.g.GroupPermissions),w(void 0),S(void 0);break;case u.g.ChatAdminRights:case u.g.GroupRecentActions:C(u.g.ChatAdministrators)}break;case u.m.Search:Kn(),d();break;case u.m.StickerSearch:Kn(),b({query:void 0});break;case u.m.GifSearch:Kn(),m({query:void 0});break;case u.m.PollResults:h()}},[e,k,o,l,h,j,y,i,d,b,m]),G=Object(c.m)((e,t)=>{w(e),S(t)},[]),_=Object(c.m)(e=>{O({chatId:t,memberIds:e})},[O,t]);function z(e){if(-1!==H)switch(H){case u.m.AddingMembers:return c.a.createElement($n,{chatId:t,onNextStep:_,isActive:N&&e,onClose:q});case u.m.ChatInfo:case u.m.UserInfo:return c.a.createElement(Fn,{key:s||t,chatId:t,userId:s,profileState:I,onProfileStateChange:v});case u.m.Search:return c.a.createElement(Un,{chatId:t,threadId:a,onClose:q,isActive:N&&e});case u.m.Management:return c.a.createElement(Hn,{chatId:t,currentScreen:y,isPromotedByCurrentUser:M,selectedChatMemberId:E,onScreenSelect:C,onChatMemberSelect:G,isActive:N&&e,onClose:q});case u.m.StickerSearch:return c.a.createElement(qn,{onClose:q,isActive:N&&e});case u.m.GifSearch:return c.a.createElement(Gn,{onClose:q,isActive:N&&e});case u.m.PollResults:return c.a.createElement(_n,{onClose:q,isActive:N&&e})}}return Object(c.n)(()=>N?Object(de.a)(q):void 0,[N,q]),Object(c.n)(()=>{setTimeout(()=>{U(!N)},300)},[N]),Object(c.n)(()=>{N&&D&&q()},[D]),Object(Mt.a)(([a,s])=>{(a===u.m.ChatInfo&&e===u.m.UserInfo||a===u.m.UserInfo&&e===u.m.ChatInfo||s!==t)&&(v(u.l.Profile),C(u.g.Initial))},[e,t]),Object(je.a)(r&&(e===u.m.ChatInfo||e===u.m.UserInfo||e===u.m.Management||e===u.m.AddingMembers),()=>q(!1),o),c.a.createElement("div",{id:"RightColumn-wrapper",className:r?void 0:"is-hidden"},D&&c.a.createElement("div",{className:"overlay-backdrop",onClick:q}),c.a.createElement("div",{id:"RightColumn"},c.a.createElement(jn,{chatId:t,isColumnOpen:N,isProfile:T,isSearch:A,isManagement:P,isStickerSearch:R,isGifSearch:x,isPollResults:L,isAddingChatMembers:B,profileState:I,managementScreen:y,onClose:q,shouldSkipAnimation:F||g}),c.a.createElement(ue.a,{name:F||g?"none":"zoom-fade",renderCount:Vn+Wn,activeKey:P?Vn+y:H,shouldCleanup:!0,cleanupExceptionKey:u.m.ChatInfo},z)))}));var Jn=Object(c.h)(({isOpen:e})=>{const t=Object(Re.a)(Pe.a.Extra,"MediaViewer",!e);return t?c.a.createElement(t,null):void 0});var Yn=Object(c.h)(({isOpen:e})=>{const t=Object(Re.a)(Pe.a.Extra,"Notifications",!e);return t?c.a.createElement(t,null):void 0});var Xn=Object(c.h)(({isOpen:e})=>{const t=Object(Re.a)(Pe.a.Extra,"Dialogs",!e);return t?c.a.createElement(t,null):void 0});var Zn=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"ForwardPicker",!t);return a?c.a.createElement(a,e):void 0});var ec=Object(c.h)(e=>{const{url:t}=e,a=Object(Re.a)(Pe.a.Extra,"SafeLinkModal",!t);return a?c.a.createElement(a,e):void 0});var tc=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Re.a)(Pe.a.Extra,"HistoryCalendar",!t);return a?c.a.createElement(a,e):void 0});a(266);let ac,sc=!1;function nc(e){document.querySelectorAll('link[rel="icon"]').forEach(t=>{e?t.href.includes("favicon-unread")||(t.href=t.href.replace("favicon","favicon-unread")):t.href=t.href.replace("favicon-unread","favicon")})}function cc(e){document.title!==e&&(document.title=e)}var rc=Object(c.h)(Object(s.h)(e=>{const{chatId:t,messageId:a}=e.audioPlayer,s=t&&a?Object(o.l)(e,t,a):void 0;return{animationLevel:e.settings.byKey.animationLevel,lastSyncTime:e.lastSyncTime,isLeftColumnShown:e.isLeftColumnShown,isRightColumnShown:Object(o.W)(e),isMediaViewerOpen:Object(o.T)(e),isForwardModalOpen:Object(o.R)(e),hasNotifications:Boolean(e.notifications.length),hasDialogs:Boolean(e.dialogs.length),audioMessage:s,safeLinkModalUrl:e.safeLinkModalUrl,isHistoryCalendarOpen:Boolean(e.historyCalendarSelectedAt),shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations,language:e.settings.byKey.language}},(e,t)=>Object(h.l)(t,["loadAnimatedEmojis","loadNotificationSettings","loadNotificationExceptions","updateIsOnline","loadTopInlineBots","loadEmojiKeywords"]))(({lastSyncTime:e,isLeftColumnShown:t,isRightColumnShown:a,isMediaViewerOpen:r,isForwardModalOpen:i,animationLevel:l,hasNotifications:d,hasDialogs:b,audioMessage:u,safeLinkModalUrl:m,isHistoryCalendarOpen:h,shouldSkipHistoryAnimations:O,language:j,loadAnimatedEmojis:g,loadNotificationSettings:p,loadNotificationExceptions:I,updateIsOnline:v,loadTopInlineBots:y,loadEmojiKeywords:C})=>{n.r&&!sc&&(sc=!0,console.log(">>> RENDER MAIN")),Object(c.n)(()=>{e&&(v(!0),g(),p(),I(),y(),C({language:n.j}),j!==n.j&&C({language:j}))},[e,g,I,p,v,y,C,j]);const{transitionClassNames:E}=Object(re.a)(!t,void 0,!0,void 0,O),{transitionClassNames:w}=Object(re.a)(a,void 0,!0,void 0,O),M=Object(ne.a)(E.replace(/([\w-]+)/g,"middle-column-$1"),w.replace(/([\w-]+)/g,"right-column-$1"),O&&"history-animation-disabled");Object(le.a)(([e])=>{if(void 0===e||0===l)return;const t=Object(se.d)();Object(ce.b)(document.getElementById("MiddleColumn"),t)},[t]),Object(le.a)(([e])=>{if(void 0===e||0===l)return;Object(f.b)(()=>{document.body.classList.add("animating-right-column")});const t=Object(se.d)();Object(ce.b)(document.getElementById("RightColumn"),()=>{t(),Object(f.b)(()=>{document.body.classList.remove("animating-right-column")})})},[a]);const S=Object(c.m)(()=>{v(!1);const e=Object(o.r)(Object(s.e)());let t=0;clearInterval(ac),ac=window.setInterval(()=>{if(document.title.includes(n.L))nc(!1);else{if(t%2==0){const t=Object(o.r)(Object(s.e)())-e;t>0&&(cc(`${t} notification${t>1?"s":""}`),nc(!0))}else cc(n.pb),nc(!1);t++}},1e3)},[v]),k=Object(c.m)(()=>{v(!0),clearInterval(ac),ac=void 0,document.title.includes(n.L)||cc(n.pb),nc(!1)},[v]);function N(e){e.preventDefault(),e.stopPropagation()}return Object(oe.a)(S,k),ie(S),c.a.createElement("div",{id:"Main",className:M,onDrop:N,onDragOver:N},c.a.createElement(Qe,null),c.a.createElement(mn,null),c.a.createElement(Qn,null),c.a.createElement(Jn,{isOpen:r}),c.a.createElement(Zn,{isOpen:i}),c.a.createElement(Yn,{isOpen:d}),c.a.createElement(Xn,{isOpen:b}),u&&c.a.createElement(Et,{key:u.id,message:u,noUi:!0}),c.a.createElement(ec,{url:m}),c.a.createElement(tc,{isOpen:h}))}));n.r&&console.log(">>> FINISH LOAD MAIN BUNDLE"),Object(s.e)().connectionState||Object(s.d)().initApi()},206:function(e,t,a){},207:function(e,t,a){},208:function(e,t,a){},221:function(e,t,a){},222:function(e,t,a){},223:function(e,t,a){},226:function(e,t,a){},227:function(e,t,a){},228:function(e,t,a){},232:function(e,t,a){},233:function(e,t,a){},234:function(e,t,a){},237:function(e,t,a){},238:function(e,t,a){},239:function(e,t,a){},240:function(e,t,a){},241:function(e,t,a){},242:function(e,t,a){},243:function(e,t,a){},244:function(e,t,a){},245:function(e,t,a){},247:function(e,t,a){},248:function(e,t,a){},249:function(e,t,a){},250:function(e,t,a){},252:function(e,t,a){},253:function(e,t,a){},254:function(e,t,a){},255:function(e,t,a){},256:function(e,t,a){},257:function(e,t,a){},258:function(e,t,a){},263:function(e,t,a){},264:function(e,t,a){},265:function(e,t,a){},266:function(e,t,a){}}]); +//# sourceMappingURL=4.5fb9a295648f3bed8bba.js.map \ No newline at end of file diff --git a/dist/4.5fb9a295648f3bed8bba.js.map b/dist/4.5fb9a295648f3bed8bba.js.map new file mode 100644 index 000000000..e76097884 --- /dev/null +++ b/dist/4.5fb9a295648f3bed8bba.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/modules/actions/ui/localSearch.ts","webpack:///./src/modules/actions/ui/chats.ts","webpack:///./src/modules/actions/ui/messages.ts","webpack:///./src/modules/actions/ui/globalSearch.ts","webpack:///./src/modules/actions/ui/stickerSearch.ts","webpack:///./src/modules/actions/ui/users.ts","webpack:///./src/modules/actions/ui/misc.ts","webpack:///./src/modules/actions/ui/payments.ts","webpack:///./src/modules/actions/api/chats.ts","webpack:///./src/modules/actions/api/messages.ts","webpack:///./src/modules/actions/api/symbols.ts","webpack:///./src/modules/actions/api/globalSearch.ts","webpack:///./src/modules/actions/api/sync.ts","webpack:///./src/modules/actions/api/localSearch.ts","webpack:///./src/modules/actions/api/management.ts","webpack:///./src/modules/actions/api/users.ts","webpack:///./src/modules/reducers/bots.ts","webpack:///./src/modules/actions/api/bots.ts","webpack:///./src/modules/actions/api/twoFaSettings.ts","webpack:///./src/modules/actions/api/payments.ts","webpack:///./src/util/requestQuery.ts","webpack:///./src/modules/actions/apiUpdaters/chats.ts","webpack:///./src/modules/actions/apiUpdaters/messages.ts","webpack:///./src/modules/actions/apiUpdaters/users.ts","webpack:///./src/modules/actions/apiUpdaters/symbols.ts","webpack:///./src/modules/actions/apiUpdaters/misc.ts","webpack:///./src/modules/actions/apiUpdaters/settings.ts","webpack:///./src/modules/actions/apiUpdaters/twoFaSettings.ts","webpack:///./src/hooks/useBeforeUnload.ts","webpack:///./src/components/ui/Switcher.tsx","webpack:///./src/components/left/main/LeftMainHeader.tsx","webpack:///./src/components/left/ConnectionState.tsx","webpack:///./src/hooks/useThrottledMemo.ts","webpack:///./src/hooks/useThrottle.ts","webpack:///./src/components/left/main/ChatFolders.tsx","webpack:///./src/components/left/search/LeftSearch.async.tsx","webpack:///./src/components/left/main/ContactList.async.tsx","webpack:///./src/components/left/NewChatButton.tsx","webpack:///./src/components/left/main/LeftMain.tsx","webpack:///./src/hooks/useBrowserOnline.ts","webpack:///./src/components/left/settings/Settings.async.tsx","webpack:///./src/components/left/newChat/NewChat.async.tsx","webpack:///./src/components/left/ArchivedChats.async.tsx","webpack:///./src/components/left/LeftColumn.tsx","webpack:///./src/hooks/useWindowSize.ts","webpack:///./src/components/middle/helpers/calculateMiddleFooterTransforms.ts","webpack:///./src/util/routing.ts","webpack:///./src/components/middle/HeaderMenuContainer.async.tsx","webpack:///./src/components/middle/HeaderActions.tsx","webpack:///./src/hooks/useWebpThumbnail.ts","webpack:///./src/components/middle/PinnedMessageNavigation.tsx","webpack:///./src/components/middle/HeaderPinnedMessage.tsx","webpack:///./src/components/middle/AudioPlayer.tsx","webpack:///./src/components/middle/MiddleHeader.tsx","webpack:///./src/components/middle/helpers/groupMessages.ts","webpack:///./src/components/middle/helpers/preventMessageInputBlur.ts","webpack:///./src/components/middle/hooks/useStickyDates.ts","webpack:///./src/hooks/useDebounce.ts","webpack:///./src/components/middle/hooks/useMessageObservers.ts","webpack:///./src/components/middle/message/helpers/buildContentClassName.ts","webpack:///./src/components/middle/message/helpers/mediaDimensions.ts","webpack:///./src/components/middle/message/helpers/calculateAlbumLayout.ts","webpack:///./src/components/middle/message/helpers/calculateAuthorWidth.ts","webpack:///./src/components/middle/message/hooks/useFocusMessage.ts","webpack:///./src/components/middle/message/ContextMenuContainer.async.tsx","webpack:///./src/components/middle/ActionMessage.tsx","webpack:///./src/components/common/EmbeddedMessage.tsx","webpack:///./src/components/middle/message/MessageMeta.tsx","webpack:///./src/components/middle/message/Sticker.tsx","webpack:///./src/components/middle/message/hooks/useBlurredMediaThumbRef.ts","webpack:///./src/components/middle/message/helpers/getCustomAppendixBg.ts","webpack:///./src/components/middle/message/Photo.tsx","webpack:///./src/hooks/useHeavyAnimationCheckForVideo.ts","webpack:///./src/components/middle/message/hooks/usePauseOnInactive.ts","webpack:///./src/components/middle/message/Video.tsx","webpack:///./src/components/middle/message/Contact.tsx","webpack:///./src/components/ui/CheckboxGroup.tsx","webpack:///./src/components/middle/message/PollOption.tsx","webpack:///./src/components/middle/message/Poll.tsx","webpack:///./src/components/middle/message/WebPage.tsx","webpack:///./src/components/middle/message/Invoice.tsx","webpack:///./src/components/middle/message/hocs/withSelectControl.tsx","webpack:///./src/components/middle/message/Album.tsx","webpack:///./src/components/middle/message/RoundVideo.tsx","webpack:///./src/components/middle/message/InlineButtons.tsx","webpack:///./src/components/middle/message/CommentButton.tsx","webpack:///./src/components/middle/message/Message.tsx","webpack:///./src/components/middle/MessageListContent.tsx","webpack:///./src/components/middle/hooks/useScrollHooks.ts","webpack:///./src/components/middle/ContactGreeting.tsx","webpack:///./src/components/middle/NoMessages.tsx","webpack:///./src/components/middle/MessageList.tsx","webpack:///./src/components/middle/ScrollDownButton.tsx","webpack:///./src/components/middle/composer/helpers/buildAttachment.ts","webpack:///./src/components/middle/composer/helpers/applyIosAutoCapitalizationFix.ts","webpack:///./node_modules/opus-recorder/dist/encoderWorker.min.js","webpack:///./src/util/voiceRecording.ts","webpack:///./src/components/middle/composer/hooks/useClipboardPaste.ts","webpack:///./src/components/middle/composer/helpers/getMessageTextAsHtml.ts","webpack:///./src/components/middle/composer/hooks/useDraft.ts","webpack:///./src/components/middle/composer/hooks/useInlineBotTooltip.ts","webpack:///./src/components/common/DeleteMessageModal.async.tsx","webpack:///./src/components/ui/ResponsiveHoverButton.tsx","webpack:///./src/components/middle/composer/AttachMenu.async.tsx","webpack:///./src/components/middle/composer/SymbolMenu.async.tsx","webpack:///./src/components/middle/composer/InlineBotTooltip.async.tsx","webpack:///./src/components/middle/composer/MentionTooltip.async.tsx","webpack:///./src/components/middle/composer/CustomSendMenu.async.tsx","webpack:///./src/components/middle/composer/StickerTooltip.async.tsx","webpack:///./src/components/middle/composer/BotKeyboardMenu.async.tsx","webpack:///./src/components/middle/composer/ComposerEmbeddedMessage.tsx","webpack:///./src/components/middle/composer/AttachmentModal.async.tsx","webpack:///./src/components/middle/composer/PollModal.async.tsx","webpack:///./src/components/middle/composer/DropArea.async.tsx","webpack:///./src/components/middle/composer/WebPagePreview.tsx","webpack:///./src/components/common/CalendarModal.async.tsx","webpack:///./src/components/payment/PaymentModal.async.tsx","webpack:///./src/components/payment/ReceiptModal.async.tsx","webpack:///./src/components/middle/composer/Composer.tsx","webpack:///./src/components/middle/composer/hooks/useVoiceRecording.ts","webpack:///./src/components/middle/composer/hooks/useStickerTooltip.ts","webpack:///./src/util/insertHtmlInSelection.ts","webpack:///./src/util/deleteLastCharacterOutsideSelection.ts","webpack:///./src/components/middle/composer/hooks/useEditing.ts","webpack:///./src/components/middle/MobileSearch.async.tsx","webpack:///./src/components/middle/MessageSelectToolbar.async.tsx","webpack:///./src/components/common/UnpinAllMessagesModal.async.tsx","webpack:///./src/components/middle/MiddleColumn.tsx","webpack:///./src/hooks/useCustomBackground.ts","webpack:///./src/components/right/RightHeader.tsx","webpack:///./src/components/right/hooks/useProfileViewportIds.ts","webpack:///./src/components/right/hooks/useProfileState.ts","webpack:///./src/components/right/ProfilePhoto.tsx","webpack:///./src/components/right/ProfileInfo.tsx","webpack:///./src/components/right/hooks/usePhotosPreload.ts","webpack:///./src/components/right/ChatExtra.tsx","webpack:///./src/components/right/DeleteMemberModal.tsx","webpack:///./src/components/right/Profile.tsx","webpack:///./src/components/right/hooks/useTransitionFixes.ts","webpack:///./src/hooks/useCacheBuster.ts","webpack:///./src/components/right/RightSearch.async.tsx","webpack:///./src/components/right/management/Management.async.tsx","webpack:///./src/components/right/StickerSearch.async.tsx","webpack:///./src/components/right/GifSearch.async.tsx","webpack:///./src/components/right/PollResults.async.tsx","webpack:///./src/components/right/AddChatMembers.tsx","webpack:///./src/components/right/RightColumn.tsx","webpack:///./src/components/mediaViewer/MediaViewer.async.tsx","webpack:///./src/components/main/Notifications.async.tsx","webpack:///./src/components/main/Dialogs.async.tsx","webpack:///./src/components/main/ForwardPicker.async.tsx","webpack:///./src/components/main/SafeLinkModal.async.tsx","webpack:///./src/components/main/HistoryCalendar.async.tsx","webpack:///./src/components/main/Main.tsx","webpack:///./src/bundles/main.ts"],"names":["closeLocalTextSearch","global","chatId","threadId","selectCurrentMessageList","updateLocalTextSearch","replaceLocalTextSearchResults","undefined","addReducer","actions","payload","query","chatThreadKey","buildChatThreadKey","currentQuery","localTextSearch","byChatThreadKey","MEMO_EMPTY_ARRAY","mediaType","updateLocalMediaSearchType","id","type","shouldReplaceHistory","currentMessageList","replaceThreadParam","exitMessageSelectMode","messages","contentToBeScheduled","forwardMessages","toChatId","setGlobal","updateCurrentMessageList","isChatInfoShown","openChat","chatCreation","newChatMembersProgress","targetIndexDelta","orderedIds","position","indexOf","nextId","FOCUS_NO_HIGHLIGHT_DURATION","FAST_SMOOTH_MAX_DURATION","ANIMATION_END_DELAY","blurTimeout","scrollOffset","messageId","paramName","chatMessages","selectChatMessages","viewportIds","selectViewportIds","lastOwnEditableMessageId","findLast","Boolean","selectAllowedMessageActions","canEdit","replyingToId","selectReplyingToId","selectIsViewportNewest","chatMessageKeys","Object","keys","newIndex","toString","length","Number","MAIN_THREAD_ID","chat","selectChat","lastMessage","threadInfo","selectThreadInfo","lastMessageId","setReplyingToId","focusMessage","avatarOwnerId","profilePhotoIndex","origin","mediaViewer","audioPlayer","selectIsRightColumnShown","pollResults","voters","window","setTimeout","newGlobal","getGlobal","noHighlight","replyStack","selectReplyStack","pop","focusLastMessage","messageListType","groupedId","groupedChatId","replyMessageId","ids","selectForwardedMessageIdsByGroupId","shouldSwitchChat","clearTimeout","updateFocusedMessage","updateFocusDirection","FocusDirection","Static","includes","direction","Down","Up","loadViewportMessages","fromChatId","messageIds","groupedMessageIds","selectMessageIdsByGroupId","isModalShown","closeMediaViewer","selectedMessages","openForwardMenu","selectCurrentChat","enterMessageSelectMode","childMessageIds","withShift","toggleMessageSelection","shouldShowContextMenuHint","disableContextMenuHint","showNotification","message","IS_TOUCH_ENV","isPollModalOpen","globalSearch","updateGlobalSearch","globalResults","localResults","resultsByType","fetchingStatus","chats","recentlyFoundChatIds","newRecentIds","filter","unshift","content","updateGlobalSearchContent","stickers","search","resultIds","gifs","offsetId","results","updateSelectedUserId","updateUserSearch","globalUserIds","localUserIds","management","byChatId","isActive","IS_SINGLE_COLUMN_LAYOUT","IS_TABLET_COLUMN_LAYOUT","isLeftColumnShown","messageLists","action","emoji","recentEmojis","newEmojis","e","sticker","recent","hash","newStickers","s","notification","newNotifications","notifications","existingNotificationIndex","findIndex","n","splice","push","data","hasErrorKey","getReadableErrorText","newDialogs","dialogs","existingErrorIndex","err","url","safeLinkModalUrl","selectedAt","historyCalendarSelectedAt","payment","isPaymentModalOpen","clearPayment","closeInvoice","runThrottledForLoadChats","throttle","cb","runThrottledForLoadTopChats","runDebouncedForLoadFullChat","debounce","async","loadChats","listType","offsetDate","result","callApi","limit","CHAT_LIST_LOAD_SLICE","archived","withPinned","orderedPinnedIds","serverTimeOffset","chatIds","shift","addUsers","buildCollectionByKey","users","updateChats","updateChatListIds","updateChatListSecondaryInfo","draftsById","map","forEach","replyingToById","isFullyLoaded","loadFullChat","fullInfo","updateChat","openChatByUsername","username","channelPostId","localChat","selectChatByUsername","isMin","previousChat","preloadedChatIds","i","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","pause","byId","listIds","active","currentChatId","pinnedChats","otherChats","prepareChatList","chatToPreload","find","currentUserId","hasUnreadMark","toggleChatUnread","isChatSummaryOnly","requestChatUpdate","user","selectUser","selectThreadTopMessageId","requestThreadInfoUpdate","selectSupportChat","langCode","usernamePostfix","LOCALIZED_TIPS","toUpperCase","TIPS_USERNAME","oldestChat","selectIsChatPinned","sort","chat1","chat2","date","force","isMuted","title","about","photo","memberIds","progress","ChatCreationProgress","InProgress","createdChannel","channelId","accessHash","Complete","Error","getDispatch","createChannel","userId","activeChat","activeChannel","createdChat","createGroupChat","folderId","folder","selectChatFolder","shouldBePinned","pinnedChatIds","includedChatIds","newPinnedIds","pinnedId","newIncludedChatIds","folderUpdate","selectChatListType","isPinned","ARCHIVED_FOLDER_ID","isChatArchived","chatFolders","loadChatFolders","recommendedChatFolders","recommended","loadRecommendedChatFolders","emoticon","maxId","recommendedId","description","newFolder","createChatFolder","Math","max","apply","deleteChatFolder","unreadCount","match","RE_TME_INVITE_LINK","exec","RE_TME_LINK","chatOrChannelPostId","isEnabled","isChatBasicGroup","bannedRights","chatAfterUpdate","members","kickedMembers","isBanned","viewMessages","isUnblocked","m","adminRights","customTitle","adminMembers","isDismissed","updateManagementProgress","ManagementProgress","Promise","all","groups","addedById","reduce","group","addChats","forDiscussionIds","channel","fullChat","isPreHistoryHidden","linkedChatId","activeChatFolder","offset","setNewChatMembersDialogState","NewChatMembersProgress","Loading","Closed","uploadProgressCallbacks","Map","runThrottledForMarkRead","isOutlying","isBudgetPreload","addOffset","LoadMoreDirection","Backwards","Around","round","MESSAGE_LIST_SLICE","Forwards","selectThreadOriginChat","threadInfos","addChatMessagesById","updateOutlyingIds","updateListedIds","updateThreadInfos","listedIds","selectListedIds","outlyingIds","selectOutlyingIds","areSortedArraysIntersecting","historyIds","newViewportIds","getViewportSlice","safeReplaceViewportIds","sourceIds","index","findClosestIndex","indexForDirection","from","to","slice","areSomeLocal","areAllLocal","sendMessage","params","localId","progressCallback","attachment","messageLocalId","has","set","fileUploads","byMessageLocalId","replyingTo","IS_IOS","rafPromise","delete","isRestricted","resolve","loadWithBudget","selectFocusedMessageId","selectRealLastReadId","replyOriginForId","MESSAGE_DELETED","replyMessage","selectChatMessage","updateChatMessage","replyToMessageId","loadMessage","scheduledAt","clearWebPagePreview","value","noWebPage","selectNoWebPage","isSingle","attachments","isGrouped","restParams","text","entities","commonParams","groupedAttachments","split","MAX_MEDIA_FILES_FOR_ALBUM","firstAttachment","restAttachments","Date","now","selectEditingMessage","setEditingId","get","previousLocalId","cancelApiProgress","apiUpdate","draft","replyToMsgId","draftDate","localOnly","selectDraft","isUnpin","isOneSide","isSilent","unpinAllMessages","shouldDeleteForAll","editingId","selectEditingId","selectEditingScheduledId","reason","peer","webPagePreview","loadWebPagePreview","options","option","shouldResetVoters","v","a","offsets","nextOffset","loadPollOptionResults","fromChat","toChat","b","scheduledMessages","historyHash","replaceScheduledMessages","loadScheduledHistory","selectScheduledMessage","loadPinnedMessages","searchThrottled","searchGifs","updateGifSearch","added","addedStickers","updateStickerSets","sets","loadStickerSets","setIds","addedSetIds","loadStickers","stickerSetId","recentStickers","loadRecentStickers","favorite","favoriteStickers","loadFavoriteStickers","greeting","featured","featuredStickers","loadFeaturedStickers","stickerSetAccessHash","stickerSet","selectStickerSet","packs","updateStickerSet","currentEmoji","forEmoji","rebuildStickersForEmoji","replaceAnimatedEmojis","loadAnimatedEmojis","saved","savedGifs","loadSavedGifs","unfave","unfaveSticker","installedDate","language","currentEmojiKeywords","emojiKeywords","isLoading","fromVersion","version","keywords","setsById","searchWords","searchStickers","updateStickersForEmoji","loadStickersForEmoji","searchMessagesGlobal","offsetRate","maxDate","minDate","localResult","chatOrUser","GLOBAL_SEARCH_SLICE","totalCount","nextOffsetId","nextRate","currentSearchQuery","selectCurrentGlobalSearchQuery","updateGlobalSearchFetchingStatus","addMessages","updateGlobalSearchResults","loadAndReplaceArchivedChats","updateUsers","replaceChatListIds","loadAndUpdateUsers","userIds","contactIds","contactList","updatedUsers","loadTopMessages","lastReadInboxMessageId","localChats","localUsers","globalChats","globalUsers","searchChats","timestampPlusDay","foundIds","currentSearch","selectCurrentTextSearch","topMessageId","MESSAGE_SEARCH_SLICE","newFoundIds","updateLocalTextSearchResults","searchTextMessages","peerId","selectCurrentMediaSearchPeerId","selectCurrentMediaSearch","currentType","currentResults","SHARED_MEDIA_SLICE","updateLocalMediaSearchResults","searchSharedMedia","timestamp","searchMessagesByDate","updateManagement","isUsernameAvailable","afterSyncCallback","DEBUG","console","log","savedUsers","savedPrivateChatIds","savedChats","selectedChat","isChatPrivate","selectedChatUser","replaceChats","loadAndReplaceChats","areMessagesLoaded","currentThreadId","draftsByChatId","acc","newCurrentChatId","currentMessageListInfo","threadsById","originChannelId","currentMessageListInfoOrigin","resultOrigin","byIdOrigin","listedIdsOrigin","Array","prototype","concat","replaceUsers","audioChatId","audioMessageId","closeAudioPlayer","loadAndReplaceMessages","lastSyncTime","sync","afterSync","runDebouncedForFetchFullUser","runThrottledForSearch","replaceInlineBotSettings","inlineBotSettings","inlineBots","byUsername","replaceInlineBotsIsLoading","topPeers","lastRequestedAt","usersHash","loadTopUsers","getCompareString","lastName","firstName","collator","Intl","Collator","sortedUsers","compare","isSelf","loadContactList","updateChatMutedState","phone","phoneNumber","updateUser","updateContact","deleteUser","profileId","isPrivate","photos","userSearch","updateUserSearchFetchingStatus","searchUsers","runDebouncedForSearch","sendBotCommand","command","button","openTelegramLink","toggleSafeLinkModal","alert","isError","showDialog","answerCallbackButton","openPollModal","getReceipt","receiptMessageId","getPaymentForm","setInvoiceMessageInfo","openPaymentModal","bot","selectChatBot","removeBlockedContact","topInlineBots","newHash","inlineBotData","inlineBot","switchPm","canLoadMore","shouldReplaceSettings","newInlineBotData","currentIds","Set","newResults","help","isGallery","searchInlineBot","queryId","resultId","replaceSettings","hasPassword","updateTwoFaSettings","hint","currentPassword","onSuccess","error","isSuccess","password","email","waitingEmailCodeLength","code","requestInfo","saveInfo","selectPaymentMessageId","shouldSave","shippingOptions","setRequestInfoId","updateShippingOptions","setPaymentStep","PaymentStep","Shipping","PaymentInfo","validateRequestedInfo","setPaymentForm","step","invoice","shippingAddressRequested","nameRequested","phoneRequested","emailRequested","ShippingInfo","setReceipt","receipt","publishableKey","selectProviderPublishableKey","credentials","k","join","buildQueryString","cardNumber","expiryMonth","expiryYear","cvv","zip","country","response","fetch","method","headers","Authorization","json","getStripeError","setStripeCardInfo","Checkout","sendStipeCredentials","shippingOptionId","saveCredentials","requestInfoId","selectPaymentRequestId","stripeCredentials","selectStripeCredentials","requestedInfoId","sendPaymentForm","save","runThrottledForUpdateAppBadge","update","noTopChatsRequest","selectIsChatListed","loadTopChats","newProfilePhoto","selectCountNotMutedUnread","updateAppBadge","isNotJoined","listId","typingStatus","senderId","isFromScheduled","isActiveChat","hasUnreadMention","unreadMentionsCount","showNewMessageNotification","messageUpdate","selectCommonBoxChatId","targetChat","newOrderedPinnedIds","MAX_ACTIVE_PINNED_CHATS","updateChatListType","chatFoldersById","newChatFoldersById","pick","newOrderedIds","orderedId","folders","replacedMembers","addedMember","deletedMemberId","shouldUpdate","some","deleteIndex","isOwner","isAdmin","membersCount","formattedText","updateWithLocalMedia","isScheduled","currentMessage","video","document","getMessageContent","blobUrl","thumbnail","isPreloadedGlobally","previewBlobUrl","updateScheduledMessage","updateListedAndViewportIds","firstMessageId","selectThreadByMessage","isUnreadChatNotLoaded","isMessageLocal","addViewportId","messagesCount","firstUnreadId","selectFirstUnreadId","updateChatLastMessage","currentLastMessage","findLastMessage","isDeleting","deleteMessages","newLastMessage","threadIdsToUpdate","deleteChatMessages","unique","chatsIdsToUpdate","commonBoxChatId","updateThreadInfo","newMessage","isMessageInCurrentMessageList","isOutgoing","scheduledIds","selectScheduledIds","selectScheduledMessages","deleteChatScheduledMessages","thread","markMessageListRead","currentPinnedIds","selectPinnedIds","newTheadInfo","messagesById","deleteScheduledMessages","pollId","pollUpdate","selectChatMessageByPollId","poll","updatedPoll","updatedResults","isChosen","chosenAnswers","chosenAnswer","chosenAnswerIndex","recentVoterIds","totalVoters","newRecentVoterIds","newTotalVoters","targetOption","targetOptionIndex","updatedOption","votersCount","flushStatusUpdatesThrottled","pendingStatusUpdates","statusUpdate","status","targetUser","isBlocked","addBlockedContact","settings","privacy","key","rules","updateNotifySettings","peerType","shouldShowPreviews","addNotifyException","twoFaSettings","useBeforeUnload","callback","useEffect","onBeforeUnload","memo","name","label","checked","disabled","inactive","noAnimation","onChange","onCheck","handleChange","useCallback","currentTarget","className","buildClassName","ANIMATION_LEVEL_OPTIONS","withGlobal","searchQuery","chatsById","animationLevel","byKey","globalSearchChatId","searchDate","theme","selectTheme","contactsFilter","onSearchQuery","onSelectSettings","onSelectContacts","onSelectArchived","setGlobalSearchChatId","onReset","shouldSkipTransition","openTipsChat","setGlobalSearchDate","setSettingOption","lang","useLang","hasMenu","LeftColumnContent","ChatList","clearedDateSearchParam","clearedChatSearchParam","selectedSearchDate","useMemo","formatDateToString","archivedUnreadChatsCount","values","total","withOtherVersions","location","hostname","MainButton","onTrigger","isOpen","Button","ripple","size","color","onClick","ariaLabel","handleSearchFocus","handleSelectSaved","handleDarkModeToggle","stopPropagation","newTheme","shouldUseSystemTheme","switchTheme","ANIMATION_LEVEL_MAX","handleAnimationLevelChange","newLevel","_","body","classList","toggle","isSearchFocused","GlobalSearch","Contacts","searchInputPlaceholder","DropdownMenu","trigger","footer","APP_NAME","APP_VERSION","MenuItem","icon","toLowerCase","href","FEEDBACK_URL","localStorage","setItem","JSON","stringify","disableHistoryBack","SearchInput","inputId","parentContainerClassName","focused","placeholder","autoComplete","canClose","onFocus","PickerSelectedItem","isMinimized","clickArg","chatOrUserId","dir","isRtl","Spinner","resolverFn","ms","dependencies","runThrottled","noFirst","useThrottle","setValue","useState","isFrozen","freeze","unfreeze","useFlag","useHeavyAnimationCheck","useOnChange","usersById","orderedFolderIds","notifySettings","selectNotifySettings","notifyExceptions","selectNotifyExceptions","foldersDispatch","onScreenSelect","setActiveChatFolder","transitionRef","useRef","displayedFolders","folderCountersById","useThrottledMemo","counters","unreadDialogsCount","hasActiveDialogs","getFolderUnreadDialogs","badgeCount","isBadgeActive","folderTabs","handleSwitchTab","current","captureEvents","onSwipe","SwipeDirection","Left","min","Right","isNotInAllTabRef","captureEscKeyListener","useHistoryBack","handleKeyDown","ctrlKey","shiftKey","startsWith","digit","preventDefault","addEventListener","removeEventListener","shouldRender","shouldRenderPlaceholder","transitionClassNames","useShowTransition","renderCurrentTab","activeFolder","folderType","TabList","tabs","activeTab","onSwitchTab","Transition","ref","activeKey","renderCount","props","LeftSearch","useModuleLoader","Bundles","Extra","ContactList","closeTimeout","isShown","onNewPrivateChat","onNewChannel","onNewGroup","isMenuOpen","setIsMenuOpen","fabClassName","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","tabIndex","Menu","positionX","positionY","autoClose","onClose","TRANSITION_RENDER_COUNT","onContentChange","connectionState","isNewChatButtonShown","setIsNewChatButtonShown","isConnecting","isOnline","setIsOnline","navigator","onLine","useBrowserOnline","isMouseInside","handleSelectSettings","Settings","handleSelectContacts","handleSelectNewChannel","NewChannelStep1","handleSelectNewGroup","NewGroupStep1","handleSelectArchived","Archived","autoCloseTimeout","shouldRenderUpdateButton","updateButtonClassNames","handleUpdateClick","isAppOutdated","markIsAppOutdated","timeout","reload","useAppOutdatedCheck","ShowTransition","isCustom","shouldCleanup","cleanupExceptionKey","fluid","pill","NewChat","ContentType","ArchivedChats","RENDER_COUNT","shouldSkipHistoryAnimations","setGlobalSearchQuery","resetChatCreation","loadPasswordInfo","clearTwoFaError","setContent","settingsScreen","setSettingsScreen","SettingsScreens","Main","setContactsFilter","foldersState","useFoldersReducer","lastResetTime","setLastResetTime","contentType","NewChannelStep2","NewChannel","NewGroupStep2","NewGroup","handleReset","forceReturnToChatList","pickerSearchInput","getElementById","blur","EditProfile","Folders","General","Notifications","Privacy","Language","GeneralChatBackground","GeneralChatBackgroundColor","PrivacyPhoneNumber","PrivacyLastSeen","PrivacyProfilePhoto","PrivacyForwarding","PrivacyGroupChats","PrivacyActiveSessions","PrivacyBlockedUsers","TwoFaDisabled","TwoFaEnabled","TwoFaCongratulations","PrivacyPhoneNumberAllowedContacts","PrivacyPhoneNumberDeniedContacts","PrivacyLastSeenAllowedContacts","PrivacyLastSeenDeniedContacts","PrivacyProfilePhotoAllowedContacts","PrivacyProfilePhotoDeniedContacts","PrivacyForwardingAllowedContacts","PrivacyForwardingDeniedContacts","PrivacyGroupChatsAllowedContacts","PrivacyGroupChatsDeniedContacts","TwoFaNewPassword","TwoFaNewPasswordConfirm","TwoFaNewPasswordHint","TwoFaNewPasswordEmail","TwoFaNewPasswordEmailCode","TwoFaChangePasswordCurrent","TwoFaTurnOff","TwoFaRecoveryEmailCurrentPassword","TwoFaChangePasswordNew","TwoFaChangePasswordConfirm","TwoFaChangePasswordHint","TwoFaRecoveryEmail","TwoFaRecoveryEmailCode","FoldersCreateFolder","FoldersEditFolder","FoldersIncludedChatsFromChatList","FoldersExcludedChatsFromChatList","FoldersEditFolderFromChatList","handleSearchQuery","handleSettingsScreenSelect","screen","LAYERS_ANIMATION_NAME","currentScreen","isChannel","setSize","windowSize","handleResize","calculateMiddleFooterTransforms","windowWidth","canPost","sidePadding","MOBILE_SCREEN_MAX_WIDTH","messageListWidth","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","leftColumnWidth","rightColumnWidth","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","getMessageListWidth","sendButtonWidth","composerWidth","toolbarWidth","composerHiddenScale","toolbarHiddenScale","composerTranslateX","toolbarTranslateX","unpinHiddenScale","toolbarForUnpinHiddenScale","createMessageHash","messageList","HeaderMenuContainer","isChatChannel","noMenu","isChatWithSelf","selectIsChatWithSelf","isMainThread","isDiscussionThread","isRightColumnShown","canRestartBot","selectIsUserBlocked","canStartBot","selectIsChatBotNotStarted","canSubscribe","isChatSuperGroup","canSearch","canMute","canSelect","selectIsInSelectMode","canLeave","joinChannel","openLocalTextSearch","restartBot","menuButtonRef","menuPosition","setMenuPosition","handleHeaderMenuOpen","rect","getBoundingClientRect","x","right","y","bottom","handleHeaderMenuClose","handleHeaderMenuHide","handleSubscribeClick","handleStartBot","handleRestartBot","handleSearchClick","querySelector","focus","searchInput","anchor","onSubscribeChannel","onSearchClick","onCloseAnimationEnd","useWebpThumbnail","getMessageMediaThumbDataUri","shouldDecodeThumbnail","isWebpSupported","thumbnailDecoded","setThumbnailDecoded","EMPTY_IMAGE_DATA_URI","useLayoutEffect","webpToPngBase64","then","catch","drawRect","width","height","radius","count","containerRef","markupParams","reverseIndex","barHeight","getBarHeight","markHeight","getMarkHeight","trackHeight","getTrackHeight","clipPathId","clipPath","d","getClipPath","markTranslateY","getMarkTranslateY","trackTranslateY","getTrackTranslateY","calculateMarkup","firstChild","firstElementChild","currentElement","style","transform","svg","div","defs","innerHTML","onUnpinMessage","onAllPinnedClick","mediaThumbnail","mediaBlobUrl","useMedia","getMessageMediaHash","getMessageSummaryText","isUnpinDialogOpen","openUnpinDialog","closeUnpinDialog","handleUnpinMessage","ConfirmDialog","confirmLabel","confirmHandler","thumbDataUri","getPictogramDimensions","src","alt","renderPictogram","renderText","RippleEffect","sender","selectSender","noUi","senderName","getSenderTitle","mediaData","mediaLoader","playPause","isPlaying","useAudioPlayer","getMessageKey","getMediaDuration","handleClick","handleClose","audio","getMessageAudio","performer","fileName","renderAudio","subtitle","renderVoice","audioMessage","pinnedIds","state","isSelectModeActive","isChatWithBot","selectIsChatWithBot","currentTransitionKey","assign","pinnedMessageId","topMessageSender","selectForwardedSender","pinnedMessageIds","canUnpin","firstPinnedMessage","isReady","openChatWithInfo","pinMessage","openPreviousChat","toggleLeftColumn","pinnedMessageIndex","setPinnedMessageIndex","isArray","pinnedMessage","pinnedMessagesCount","chatTitleLength","getChatTitle","topMessageTitle","useEnsureMessage","useWindowSize","isLeftColumnHideable","shouldShowCloseButton","componentRef","shouldAnimateTools","handleHeaderClick","handlePinnedMessageClick","cycleRestrict","handleAllPinnedClick","handleBackClick","messageInput","EDITABLE_INPUT_ID","currentChat","selectIsChatMuted","canToolsCollideWithChatInfo","SAFE_SCREEN_WIDTH_FOR_CHAT_INFO","shouldUseStackedToolsClass","SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","shouldRenderAudioPlayer","audioPlayerClassNames","renderingAudioMessage","useCurrentOrPrev","shouldRenderPinnedMessage","pinnedMessageClassNames","renderingPinnedMessage","renderingPinnedMessageTitle","canRevealTools","renderInfo","renderBackButton","PrivateChatInfo","withFullInfo","withMediaViewer","withUpdatingStatus","noRtl","GroupChatInfo","asClose","unreadCountInfo","formatIntegerCompact","componentEl","add","remove","isAlbum","messageOrAlbum","groupMessages","currentAlbum","currentSenderGroup","currentDateGroup","originalDate","datetime","getDayStart","senderGroups","dateGroups","isInAlbum","mainMessage","albumId","nextMessage","nextMessageDayStartsAt","isActionMessage","forwardInfo","senderUserId","hiddenUserName","inlineButtons","preventMessageInputBlur","activeElement","target","useStickyDates","isScrolled","markIsScrolled","runDebounced","shouldRunFirst","shouldRunLast","updateStickyDates","container","hasTools","contains","fastRaf","currentStuck","stuckDateEl","allElements","querySelectorAll","containerTop","scrollTop","el","offsetTop","offsetHeight","top","findStuckDate","INTERSECTION_THROTTLE_FOR_MEDIA","IS_ANDROID","INTERSECTION_MARGIN_FOR_MEDIA","isEmojiOnlyMessage","customShape","getMinMediaWidth","hasText","hasCommentButton","calculateMediaDimensions","noAvatars","isOwn","isOwnMessage","isForwarded","isForwardedMessage","getMessagePhoto","getMessageWebPagePhoto","getMessageVideo","isWebPagePhoto","calculateInlineImageDimensions","calculateVideoDimensions","minMediaWidth","getMessageText","stretchFactor","finalWidth","finalHeight","isSmall","AlbumRectPart","accumulate","list","initValue","accumulator","item","clamp","num","low","high","calculateContainerSize","layout","styles","dimensions","sides","calculateAlbumLayout","album","ratios","proportions","ratio","getProportions","averageRatio","getAverageRatio","albumCount","forceCalc","maxWidth","getAvailableWidth","REM","minWidth","maxHeight","spacing","originalRatios","cropRatios","attempts","pushAttempt","lineCounts","heights","currentCount","attemptCount","sum","multiHeight","first","second","third","fourth","optimalAttempt","optimalDiff","lineCount","totalHeight","bad1","bad2","line","diff","abs","optimalCounts","optimalHeights","rowCount","row","colCount","lineHeight","col","layoutWithComplexLayouter","layoutTwoTopBottom","layoutTwoLeftRightEqual","minimalWidth","secondWidth","firstWidth","layoutTwoLeftRight","layoutTwo","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutThree","w","h0","h","w0","w2","w1","h1","layoutFourTopAndOther","h2","layoutFourLeftAndOther","layoutFour","containerStyle","element","calculateAuthorWidth","createElement","font","whiteSpace","left","opacity","appendChild","offsetWidth","useFocusMessage","elementRef","isFocused","focusDirection","noFocusHighlight","messagesContainer","closest","fastSmoothScroll","ContextMenuContainer","targetUserIds","targetChatId","targetMessageId","targetMessage","selectIsMessageFocused","focusedMessage","observeIntersection","isEmbedded","appearanceOrder","isLastInList","useOnIntersect","noAppearanceAnimation","markShown","targetUsers","renderActionMessageText","asPlain","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","isContextMenuShown","data-message-id","onMouseDown","onContextMenu","EmbeddedMessage","customText","isIntersecting","useIsIntersecting","pictogramId","isRoundVideo","getMessageRoundVideo","senderTitle","outgoingStatus","signature","views","isEdited","formatTime","MessageOutgoingStatus","Sticker","observeIntersectionForPlaying","shouldLoop","isModalOpen","openModal","closeModal","isAnimated","isMemojiSticker","MEMOJI_STICKER_ID","shouldLoad","shouldPlay","mediaHash","getMessageMediaFormat","isMediaLoaded","isAnimationLoaded","markAnimationLoaded","isMediaReady","shouldRenderFullMedia","useTransitionForMedia","getStickerDimensions","thumbClassName","stickerClassName","AnimatedSticker","animationData","play","noLoop","onLoad","fromSticker","useBlurredMediaThumbRef","fullMediaData","useCanvasBlur","IS_CANVAS_FILTER_SUPPORTED","SELECTED_APPENDIX_BACKGROUND","getCustomAppendixBg","inSelectMode","isSelected","img","Image","onload","canvas","ctx","getContext","drawImage","getImageData","getAppendixColorFromImage","Photo","shouldAutoLoad","isInSelectMode","uploadProgress","nonInteractive","shouldAffectAppendix","onCancelUpload","localBlobUrl","isDownloadAllowed","setIsDownloadAllowed","shouldDownload","downloadProgress","useMediaWithDownloadProgress","thumbRef","isUploading","isTransferring","transferProgress","getMediaTransferState","wasDownloadDisabled","usePrevious","shouldRenderSpinner","spinnerClassNames","shouldRenderThumb","isAllowed","contentEl","appendixBg","setProperty","setAttribute","ProgressSpinner","useHeavyAnimationCheckForVideo","playerRef","shouldPlayRef","safePlay","isPlayAllowed","wasPlaying","freezePlaying","paused","unfreezePlaying","unfreezePlayingOnRaf","hasFocus","useBackgroundMode","Video","shouldAutoPlay","videoRef","getMessageWebPageVideo","setIsPlayAllowed","isInline","isBuffered","bufferingHandlers","useBuffering","playProgress","setPlayProgress","handleTimeUpdate","currentTime","duration","usePauseOnInactive","useVideoCleanup","videoClassName","autoPlay","muted","loop","playsInline","onTimeUpdate","isGif","formatMediaDuration","contact","openUserInfo","Avatar","formatPhoneNumberWithCode","selected","loadingOptions","setValues","event","newValues","Checkbox","subLabel","getPercentage","toFixed","PollOption","answer","voteResults","maxVotersCount","correctResults","shouldAnimate","r","correctAnswer","showIcon","answerPercent","finalPercent","setFinalPercent","lineRef","lineWidth","isAnimationDoesNotStart","lineEl","svgEl","lineStyle","onSendVote","openPollResults","summary","isSubmitting","setIsSubmitting","chosenOptions","setChosenOptions","isSolutionShown","setIsSolutionShown","wasSubmitted","setWasSubmitted","closePeriod","setClosePeriod","closed","closeDate","floor","countdownRef","hasVoted","canVote","canViewResult","isPublic","isMultiple","multipleChoice","answers","isCorrect","hidden","quiz","countdownEl","circumference","PI","lastElementChild","timerEl","strokeDashOffset","textContent","timer","recentVoters","handleRadioChange","handleCheckboxChange","handleVoteClick","handleViewResultsClick","handleSolutionShow","handleSolutionHide","solution","Notification","renderTextWithEntities","solutionEntities","onDismiss","containerId","question","getPollTypeString","RadioGroup","loadingOption","isQuiz","getReadableVotersCount","isText","inPreview","onMediaClick","onCancelMediaTransfer","webPage","getMessageWebPage","isSquarePhoto","handleMediaClick","siteName","displayUrl","isMediaInteractive","truncatedDescription","trimText","data-initial","SafeLink","getMessageInvoice","photoUrl","withSelectControl","WrappedComponent","ownProps","selectIsMessageSelected","handleMessageSelect","newProps","PhotoWithSelect","VideoWithSelect","uploadsById","hasCustomAppendix","albumLayout","cancelSendingMessage","mediaCount","handleCancelUpload","containerWidth","containerHeight","fileUpload","currentOnRelease","RoundVideo","playingProgressRef","shouldSpinnerRender","isActivated","setIsActivated","setProgress","playerEl","playingProgressEl","stopPlaying","capturePlaying","onRelease","ROUND_VIDEO_DIMENSIONS","onEnded","InlineButtons","shouldRequestThreadUpdate","recentReplierIds","recentRepliers","hasUnread","data-cnt","handleDocumentGroupMouseEnter","lastGroupElement","getLastElementInDocumentGroup","handleDocumentGroupMouseLeave","removeAttribute","nextElementSibling","withSenderName","withAvatar","viaBotId","chatUsername","forceSenderName","isAnonymousOwnMessage","originSender","botSender","threadTopMessageId","isThreadTop","shouldHideReply","replyMessageSender","selectUploadProgress","isForwarding","highlight","singleEmoji","getMessageSingleEmoji","every","isSingleEmoji","animatedEmoji","selectAnimatedEmoji","isGroupSelected","selectIsDocumentGroupSelected","isPinnedList","shouldAutoLoadMedia","selectShouldAutoLoadMedia","shouldAutoPlayMedia","selectShouldAutoPlayMedia","shouldLoopStickers","selectShouldLoopStickers","selectOutgoingStatus","observeIntersectionForBottom","observeIntersectionForMedia","observeIntersectionForAnimatedStickers","noComments","isFirstInGroup","isLastInGroup","isFirstInDocumentGroup","isLastInDocumentGroup","openMediaViewer","openAudioPlayer","markMessagesRead","sendPollVote","clickInlineButton","bottomMarkerRef","appendixRef","isLocal","hasReply","isReplyMessage","hasThread","asForwarded","isLinkedChannelPost","isInDocumentGroup","voice","getMessageCustomShape","textParts","renderMessageText","adminTitle","metaSafeAuthorWidth","canShowActionButton","canForward","canFocus","isChannelPost","fromMessageId","avatarPeer","senderPeer","containerClassName","contentClassName","hasComments","hasActionButton","classNames","isMedia","isMediaWithNoText","isViaBot","isRound","buildContentClassName","withCommentButton","withAppendix","handleGroupDocumentMessagesSelect","handleContainerDoubleClick","handleContentDoubleClick","handleAvatarClick","handleSenderClick","handleViaBotClick","handleReplyClick","MediaViewerOrigin","ScheduledInline","Inline","handleAudioPlay","handleAlbumMediaClick","albumMessageId","ScheduledAlbum","Album","getIsKeyboardVisible","handleReadMedia","handleVoteSend","handleGroupForward","handleForward","handleFocus","handleFocusForwarded","calculatedWidth","noMediaCorners","extraPadding","onDoubleClick","data-last-message-id","data-has-unread-mention","isAvatarPeerUser","avatarUser","avatarChat","hiddenName","renderAvatar","shouldInlineMeta","textContentClass","senderColor","getUserColorKey","renderSenderName","AnimatedEmoji","forceLoadPreview","Audio","isSelectable","onPlay","onReadMedia","Document","renderContent","messageGroups","isViewportNewest","isUnread","withUsers","anchorIdRef","memoFirstUnreadIdRef","hasLinkedChat","isSchedule","onFabToggle","onNotchToggle","openHistoryCalendar","observeIntersectionForReading","observe","useIntersectionObserver","rootRef","throttleMs","margin","freezeForReading","unfreezeForReading","entries","mentionIds","entry","dataset","useMessageObservers","backwardsTriggerRef","forwardsTriggerRef","fabTriggerRef","loadMoreBackwards","loadMoreForwards","toggleScrollTools","scrollHeight","scrollBottom","isAtBottom","MESSAGE_LIST_SENSITIVE_AREA","triggerEntry","resetScroll","observeIntersectionForFab","freezeForFab","unfreezeForFab","observeIntersectionForNotch","freezeForNotch","unfreezeForNotch","useScrollHooks","unreadDivider","messageCountToAnimate","messageGroup","flatten","appearanceIndex","dateGroup","dateGroupIndex","dateGroupsArray","senderGroup","senderGroupIndex","senderGroupsArray","compact","currentDocumentGroupId","messageIndex","isMessageAlbum","documentGroupId","nextDocumentGroupId","originalId","getMessageOriginalId","teactFastList","SCHEDULED_WHEN_ONLINE","formatHumanDate","lastUnreadMessageId","loadGreetingStickers","debounceMs","handleStickerSelect","selectedSticker","StickerButton","isGroupChatJustCreated","renderScheduled","renderSavedMessages","renderGroup","runDebouncedForScroll","checkSingleMessageActionByType","selectCurrentMessageIds","restrictionReason","focusingId","hasFocusHighlight","withLastMessageWhenPreloading","botDescription","chatBot","isChatLoaded","isChannelChat","isGroupChat","isChatGroup","isCreator","isBot","threadFirstMessageId","selectFirstMessageId","setScrollOffset","scrollOffsetRef","selectScrollOffset","anchorTopRef","listItemElementsRef","memoUnreadDividerBeforeIdRef","memoFocusingIdRef","isScrollTopJustUpdatedRef","shouldAnimateAppearanceRef","setContainerHeight","onTickEnd","listedMessages","orderBy","loadMoreAround","handleScroll","parentElement","observer","ResizeObserver","offsetParent","contentRect","disconnect","windowHeight","normalHeight","String","clientHeight","preservedItemElements","useLayoutEffectWithPrevDeps","prevMessageIds","prevIsViewportNewest","prevContainerHeight","shouldForceScroll","lastItemElement","lastItemHeight","newScrollTop","hasFirstMessageChanged","hasLastMessageChanged","isAlreadyFocusing","isResized","isAnimatingScroll","useEffectWithPrevDeps","prevIsSelectModeActive","dispatchHeavyAnimationEvent","shouldRenderGreeting","onScroll","focusNextReply","messageElements","lastMessageElement","buildAttachment","filename","blob","isQuick","URL","createObjectURL","mimeType","quick","preloadImage","newBlob","toBlob","squeezeImage","revokeObjectURL","videoWidth","videoHeight","preloadVideo","createPosterForVideo","resetInput","applyIosAutoCapitalizationFix","inputEl","POLYFILL_OPTIONS","encoderPath","reuseWorker","BLOB_PARAMS","opusRecorderPromise","OpusRecorder","mediaRecorder","init","default","start","analyzerCallback","startMediaRecorder","startedAt","pausedAt","chunks","waveform","ondataavailable","typedArray","releaseAnalyzer","recorder","source","sourceNode","analyser","context","createAnalyser","fftSize","connect","dataLength","frequencyBinCount","dataArray","Uint8Array","isDestroyed","tick","getByteFrequencyData","volume","requestAnimationFrame","subscribeToAnalyzer","stop","reject","onstop","Blob","onerror","delayStop","CLIPBOARD_ACCEPTED_TYPES","getMessageTextAsHtml","tempEl","INLINE_BOT_QUERY_REGEXP","HAS_NEW_LINE","useInlineBotTooltip","html","markIsOpen","unmarkIsOpen","replace","innerText","getPlainText","queryInlineBot","resetInlineBot","canShowHelp","parseStartWithUsernameString","usernameLowered","prevQuery","prevUsername","botId","loadMore","closeTooltip","DeleteMessageModal","openTimeout","isFirstTimeActivation","onActivate","buttonProps","AttachMenu","SymbolMenu","InlineBotTooltip","MentionTooltip","CustomSend","StickerTooltipAsync","StickerTooltip","BotKeyboardMenu","forwardMessageIds","forwardedMessagesCount","exitForwardMode","canAnimate","useAsyncRendering","clearEmbedded","handleMessageClick","AttachmentModal","PollModal","DropArea","RE_LINK","RegExp","RE_LINK_TEMPLATE","messageText","toggleMessageWebPage","link","parseMessageInput","linkEntity","ApiMessageEntityTypes","TextUrl","textMatch","renderingWebPage","webPageWithoutPhoto","messageStub","CalendarModal","PaymentModal","MainButtonState","ReceiptModal","chatUser","selectChatUser","messageWithActualBotKeyboard","selectNewestMessageWithBotKeyboardButtons","baseEmojiKeywords","BASE_EMOJI_KEYWORD_LANG","editingMessage","canScheduleUntilOnline","wasOnline","withScheduledButton","shouldSchedule","botKeyboardMessageId","stickersForEmoji","groupChatMembers","topInlineBotIds","isReceiptModalOpen","shouldSuggestStickers","isInlineBotLoading","dropAreaState","onDropHide","editMessage","saveDraft","clearDraft","setStickerSearchQuery","setGifSearchQuery","closePollModal","closePaymentModal","clearReceipt","addRecentEmoji","sendInlineBotResult","setHtml","lastMessageSendTimeSeconds","prevDropAreaState","isCalendarOpen","openCalendar","closeCalendar","scheduledMessageArgs","setScheduledMessageArgs","htmlRef","setAttachments","isBotKeyboardOpen","openBotKeyboard","closeBotKeyboard","isAttachMenuOpen","openAttachMenu","closeAttachMenu","isSymbolMenuOpen","openSymbolMenu","closeSymbolMenu","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isSymbolMenuLoaded","onSymbolMenuLoadingComplete","isHoverDisabled","disableHover","enableHover","startRecordingVoice","stopRecordingVoice","pauseRecordingVoice","activeVoiceRecording","currentRecordTime","recordButtonRef","mainButtonRef","startRecordTimeRef","setActiveVoiceRecording","setCurrentRecordTime","IS_VOICE_RECORDING_SUPPORTED","voiceRecording","tickVolume","boxShadow","useVoiceRecording","mainButtonState","Edit","Send","Record","canShowCustomSendMenu","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","insertMention","mentionFilteredUsers","useMentionTooltip","isInlineBotTooltipOpen","inlineBotId","isInlineBotTooltipGallery","inlineBotSwitchPm","inlineBotResults","closeInlineBotTooltip","inlineBotHelp","loadMoreForInlineBot","isCustomSendMenuOpen","allowedAttachmentOptions","getAllowedAttachmentOptions","isChatAdmin","slowMode","getChatSlowModeOptions","isStickerTooltipOpen","closeStickerTooltip","isDisabled","clearStickersForEmoji","IS_EMOJI_SUPPORTED","parseEmojiOnlyString","hasStickers","useStickerTooltip","canSendStickers","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","insertTextAndUpdateCursor","selection","getSelection","newHtml","rangeCount","selectionRange","getRangeAt","isSelectionInsideInput","range","deleteContents","fragment","createContextualFragment","lastInsertedNode","lastChild","insertNode","setStartAfter","setEndAfter","collapse","removeAllRanges","addRange","insertHtmlInSelection","dispatchEvent","Event","bubbles","focusEditableElement","removeSymbol","execCommand","tempInput","contentEditable","textLength","createRange","setStart","setEnd","removeChild","deleteLastCharacterOutsideSelection","resetComposer","shouldPreserveInput","prevChatId","handleEditComplete","editedMessage","hasMessageMedia","useEditing","updateDraft","draftChatId","draftThreadId","runDebouncedForSaveDraft","DRAFT_DEBOUNCE","prevThreadId","prevHtml","handleBlur","useDraft","handlePaste","clipboardData","input","EDITABLE_INPUT_MODAL_ID","items","media","file","getAsFile","pastedText","getData","substring","useClipboardPaste","handleFileSelect","files","handleAppendFiles","handleClearAttachment","handleSend","currentAttachments","record","extraLength","textParams","nowSeconds","secondsSinceLastMessage","nextSendDateNotReached","nextSendDate","seconds","secondsRemaining","isSlowMode","handleGifSelect","gif","handleInlineBotSelect","inlineResult","handlePollSend","handleSilentSend","handleMessageSchedule","isWhenOnline","restArgs","getTime","handleMessageScheduleUntilOnline","handleCloseCalendar","handleSearchOpen","handleSymbolMenuOpen","handleAllScheduledClick","mainButtonHandler","areVoiceMessagesNotAllowed","canAttachMedia","prevEditedMessage","renderedEditedMessage","scheduledDefaultDate","setSeconds","setMilliseconds","scheduledMaxDate","setFullYear","getFullYear","sendButtonAriaLabel","symbolMenuButtonClassName","onSend","Portal","DropAreaState","None","withQuick","QuickFile","onHide","onFileSelect","caption","onCaptionUpdate","onFileAppend","onClear","onInsertUserName","filteredUsers","onSelectResult","canAttachEmbedLinks","faded","MessageInput","forcedPlaceholder","shouldSetFocus","shouldSuppressFocus","shouldSuppressTextFormatter","onUpdate","onSuppressedFocus","formatVoiceRecordDuration","onStickerSelect","emojis","onEmojiSelect","onPollCreate","onGifSelect","onRemoveSymbol","onSearchOpen","onSilentSend","onScheduleSend","withTimePicker","maxAt","getDayStartAt","isFutureMode","secondButtonLabel","onSubmit","onSecondButtonClick","MobileSearch","MessageSelectToolbar","UnpinAllMessagesModal","CLOSE_ANIMATION_DURATION","canBeQuicklyUploaded","kind","CONTENT_TYPES_FOR_QUICK_UPLOAD","isBlurred","isBackgroundBlurred","background","customBackground","backgroundColor","patternColor","themes","isMobileSearchActive","getCanPostInChat","isBotNotStarted","isPinnedMessageList","isScheduledMessageList","currentUserBannedRights","defaultBannedRights","hasPinnedOrAudioMessage","loadUser","setDropAreaState","isFabShown","setIsFabShown","isNotchShown","setIsNotchShown","isUnpinModalOpen","setIsUnpinModalOpen","setIsReady","ANIMATION_LEVEL_MIN","renderingChatId","usePrevDuringAnimation","renderingThreadId","renderingMessageListType","renderingCanPost","renderingHasTools","renderingIsFabShown","handleDragEnter","dataTransfer","shouldDrawQuick","handleHideDropArea","handleOpenUnpinModal","closeUnpinModal","handleUnpinAllMessages","handleTabletFocus","customBackgroundValue","settingValue","cacheApi","CUSTOM_BG_CACHE_NAME","useCustomBackground","MASK_IMAGE_DISABLED","messagingDisabledClassName","messageSendingRestrictionReason","getMessageSendingRestrictionReason","footerClassName","onTransitionEnd","propertyName","DARK_THEME_BG_COLOR","LIGHT_THEME_BG_COLOR","onDragEnter","onUnpin","HeaderContent","isProfile","isManagement","messageSearchQuery","stickerSearchQuery","selectCurrentStickerSearch","gifSearchQuery","selectCurrentGifSearch","canManage","isColumnOpen","isSearch","isStickerSearch","isGifSearch","isPollResults","isAddingChatMembers","profileState","managementScreen","setLocalTextSearchQuery","searchTextMessagesLocal","toggleManagement","shouldSkipAnimation","backButtonRef","handleMessageSearchQueryChange","handleStickerSearchQueryChange","handleGifSearchQueryChange","setShouldSkipTransition","contentKey","ProfileState","Profile","SharedMedia","MemberList","Search","PollResults","StickerSearch","GifSearch","AddingMembers","ManagementScreens","Initial","ManageInitial","ChatPrivacyType","ManageChatPrivacyType","Discussion","ManageDiscussion","ChannelSubscribers","ManageChannelSubscribers","GroupPermissions","ManageGroupPermissions","ChatAdministrators","ManageChatAdministrators","GroupRemovedUsers","ManageGroupRemovedUsers","GroupUserPermissionsCreate","ManageGroupUserPermissionsCreate","GroupUserPermissions","ManageGroupUserPermissions","GroupRecentActions","ManageGroupRecentActions","ChatAdminRights","ManageGroupAdminRights","GroupMembers","ManageGroupMembers","renderingContentKey","renderHeaderContent","isBackButton","buttonClassName","useProfileViewportIds","loadMoreMembers","searchMessages","tabType","mediaSearchType","resultType","sortUserIds","memberViewportIds","getMoreMembers","noProfileInfoForMembers","currentResultType","handleLoadMore","getMore","useInfiniteScroll","MEMBERS_SLICE","isOnTop","useInfiniteScrollForMembers","mediaViewportIds","getMoreMedia","noProfileInfoForMedia","useInfiniteScrollForSharedMedia","documentViewportIds","getMoreDocuments","noProfileInfoForDocuments","linkViewportIds","getMoreLinks","noProfileInfoForLinks","audioViewportIds","getMoreAudio","noProfileInfoForAudio","noProfileInfo","forSharedMediaType","messageIdsRef","getMessageContentIds","reverse","runThrottledForScroll","isScrollingProgrammatically","isFirstPhoto","isSavedMessages","isDeleted","isDeletedUser","getMediaHash","forceAvatar","getChatAvatarHash","imageHash","ApiMediaFormat","BlobUrl","avatarThumbnailData","useBlurSync","dataUri","imageSrc","prevImageSrc","decoding","userFullName","getUserFullName","getFirstLetters","fullClassName","forceShowSelf","loadFullUser","fullName","slideAnimation","currentPhotoIndex","setCurrentPhotoIndex","isFirst","isLast","profile","currentIndex","usePhotosPreload","handleProfilePhotoClick","ProfileAvatar","selectPreviousMedia","selectNextMedia","renderPhoto","isVerifiedIconShown","isVerified","renderPhotoTabs","aria-label","VerifiedIcon","isUserOnline","getUserStatus","canInviteUsers","isUserRightBanned","getHasAdminRight","handleNotificationChange","copy","entity","copyTextToClipboard","formattedNumber","getChatLink","bio","getChatDescription","ListItem","multiline","narrow","isStatic","contactName","getUserFirstOrLastName","deleteChatMember","handleDeleteChatMember","Modal","onEnter","TABS","buildInfiniteScrollItemSelector","isGroup","hasMembersTab","areMembersHidden","canViewMembers","canAddMembers","canDeleteMembers","resolvedUserId","onProfileStateChange","setLocalMediaSearchType","searchMediaMessagesLocal","loadProfilePhotos","setActiveTab","deletingUserId","setDeletingUserId","prevTabType","tabsEl","prevProfileState","tabListEl","determineProfileState","useProfileState","applyTransitionFix","releaseTransitionFix","transitionElSelector","setMinHeight","transitionEl","minHeight","overflowY","scrollBarWidth","clientWidth","marginRight","useTransitionFixes","cacheBuster","resetCacheBuster","setCacheBuster","useCacheBuster","handleTransitionStop","handleNewMemberDialogOpen","handleSelectMedia","handlePlayAudio","handleMemberClick","handleMessageFocus","handleDeleteMembersModalClose","renderingDelay","isFirstTab","SLIDE_TRANSITION_DURATION","canRenderContents","getMemberContextAction","handler","renderSharedMedia","noSpinner","NothingFound","Media","withDate","smaller","onDateClick","WebLink","onMessageClick","teactOrderKey","contextActions","InfiniteScroll","itemSelector","sensitiveArea","PROFILE_SENSITIVE_AREA","preloadBackwards","noScrollRestoreOnTop","noFastList","onLoadMore","renderProfileInfo","shouldRestoreHeight","onStart","onStop","big","FloatingActionButton","RightSearch","Management","localContactIds","isSearching","onNextStep","setUserSearchQuery","selectedMemberIds","setSelectedMemberIds","noPickerScrollRestore","member","handleFilterChange","displayedIds","sortChatIds","foundContactIds","contactId","isUserBot","canBeInvitedToGroup","handleNextStep","Picker","itemIds","selectedIds","filterValue","filterPlaceholder","searchInputId","onSelectedIdsChange","onFilterChange","noScrollRestore","MAIN_SCREENS_COUNT","RightColumnContent","MANAGEMENT_SCREENS_COUNT","blurSearchInput","areActiveChatsLoaded","selectAreActiveChatsLoaded","selectRightColumnContentKey","currentProfileUserId","selectedId","isChatSelected","toggleChatInfo","closePollResults","addChatMembers","setProfileState","setManagementScreen","selectedChatMemberId","setSelectedChatMemberId","isPromotedByCurrentUser","setIsPromotedByCurrentUser","isScrolledDown","ChatInfo","UserInfo","isOverlaying","close","shouldScrollUp","GroupType","handleSelectChatMember","memberId","isPromoted","handleAppendingChatMembers","onChatMemberSelect","prevContentKey","MediaViewer","Dialogs","ForwardPicker","SafeLinkModal","HistoryCalendar","notificationInterval","DEBUG_isLogged","updateIcon","asUnread","updatePageTitle","nextTitle","isMediaViewerOpen","selectIsMediaViewerOpen","isForwardModalOpen","selectIsForwardModalOpen","hasNotifications","hasDialogs","isHistoryCalendarOpen","loadNotificationSettings","loadNotificationExceptions","updateIsOnline","loadTopInlineBots","loadEmojiKeywords","middleColumnTransitionClassNames","rightColumnTransitionClassNames","prevIsLeftColumnShown","dispatchHeavyAnimationEnd","waitForTransitionEnd","prevIsRightColumnShown","initialUnread","clearInterval","setInterval","INACTIVE_MARKER","newUnread","PAGE_TITLE","stopEvent","onDrop","onDragOver","initApi"],"mappings":"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","file":"4.5fb9a295648f3bed8bba.js","sourcesContent":["import { addReducer } from '../../../lib/teact/teactn';\n\nimport {\n updateLocalTextSearch,\n replaceLocalTextSearchResults,\n updateLocalMediaSearchType,\n} from '../../reducers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { selectCurrentMessageList } from '../../selectors';\nimport { buildChatThreadKey } from '../../helpers';\nimport { GlobalState } from '../../../global/types';\n\naddReducer('openLocalTextSearch', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n return updateLocalTextSearch(global, chatId, threadId, true);\n});\n\naddReducer('closeLocalTextSearch', closeLocalTextSearch);\n\naddReducer('setLocalTextSearchQuery', (global, actions, payload) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const { query } = payload!;\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const { query: currentQuery } = global.localTextSearch.byChatThreadKey[chatThreadKey] || {};\n\n if (query !== currentQuery) {\n global = replaceLocalTextSearchResults(global, chatId, threadId, MEMO_EMPTY_ARRAY);\n }\n\n global = updateLocalTextSearch(global, chatId, threadId, true, query);\n\n return global;\n});\n\naddReducer('setLocalMediaSearchType', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return undefined;\n }\n\n const { mediaType } = payload!;\n return updateLocalMediaSearchType(global, chatId, mediaType);\n});\n\nexport function closeLocalTextSearch(global: GlobalState): GlobalState {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return global;\n }\n\n global = updateLocalTextSearch(global, chatId, threadId, false);\n global = replaceLocalTextSearchResults(global, chatId, threadId, undefined);\n return global;\n}\n","import { addReducer, setGlobal } from '../../../lib/teact/teactn';\n\nimport {\n exitMessageSelectMode, replaceThreadParam, updateCurrentMessageList,\n} from '../../reducers';\nimport { selectCurrentMessageList } from '../../selectors';\nimport { closeLocalTextSearch } from './localSearch';\n\naddReducer('openChat', (global, actions, payload) => {\n const {\n id, threadId = -1, type = 'thread', shouldReplaceHistory = false,\n } = payload!;\n\n const currentMessageList = selectCurrentMessageList(global);\n\n if (!currentMessageList\n || (\n currentMessageList.chatId !== id\n || currentMessageList.threadId !== threadId\n || currentMessageList.type !== type\n )) {\n global = replaceThreadParam(global, id, threadId, 'replyStack', []);\n global = exitMessageSelectMode(global);\n global = closeLocalTextSearch(global);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n contentToBeScheduled: undefined,\n },\n ...(id !== global.forwardMessages.toChatId && {\n forwardMessages: {},\n }),\n };\n\n setGlobal(global);\n }\n\n return updateCurrentMessageList(global, id, threadId, type, shouldReplaceHistory);\n});\n\naddReducer('openPreviousChat', (global) => {\n return updateCurrentMessageList(global, undefined);\n});\n\naddReducer('openChatWithInfo', (global, actions, payload) => {\n setGlobal({\n ...global,\n isChatInfoShown: true,\n });\n\n actions.openChat(payload);\n});\n\naddReducer('resetChatCreation', (global) => {\n return {\n ...global,\n chatCreation: undefined,\n };\n});\n\naddReducer('setNewChatMembersDialogState', (global, actions, payload) => {\n return {\n ...global,\n newChatMembersProgress: payload,\n };\n});\n\naddReducer('openNextChat', (global, actions, payload) => {\n const { targetIndexDelta, orderedIds } = payload;\n\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n actions.openChat({ id: orderedIds[0] });\n return;\n }\n\n const position = orderedIds.indexOf(chatId);\n\n if (position === -1) {\n return;\n }\n const nextId = orderedIds[position + targetIndexDelta];\n\n actions.openChat({ id: nextId, shouldReplaceHistory: true });\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { MAIN_THREAD_ID } from '../../../api/types';\nimport { FocusDirection } from '../../../types';\n\nimport { ANIMATION_END_DELAY, FAST_SMOOTH_MAX_DURATION } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport {\n enterMessageSelectMode,\n toggleMessageSelection,\n exitMessageSelectMode,\n replaceThreadParam,\n updateFocusDirection,\n updateFocusedMessage,\n} from '../../reducers';\nimport {\n selectCurrentChat,\n selectViewportIds,\n selectIsRightColumnShown,\n selectCurrentMessageList,\n selectChat,\n selectThreadInfo,\n selectChatMessages,\n selectAllowedMessageActions,\n selectMessageIdsByGroupId,\n selectForwardedMessageIdsByGroupId,\n selectIsViewportNewest,\n selectReplyingToId,\n selectReplyStack,\n} from '../../selectors';\nimport { findLast } from '../../../util/iteratees';\n\nconst FOCUS_DURATION = 1500;\nconst FOCUS_NO_HIGHLIGHT_DURATION = FAST_SMOOTH_MAX_DURATION + ANIMATION_END_DELAY;\nconst POLL_RESULT_OPEN_DELAY_MS = 450;\n\nlet blurTimeout: number | undefined;\n\naddReducer('setScrollOffset', (global, actions, payload) => {\n const { chatId, threadId, scrollOffset } = payload!;\n\n return replaceThreadParam(global, chatId, threadId, 'scrollOffset', scrollOffset);\n});\n\naddReducer('setReplyingToId', (global, actions, payload) => {\n const { messageId } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n const { chatId, threadId } = currentMessageList;\n\n return replaceThreadParam(global, chatId, threadId, 'replyingToId', messageId);\n});\n\naddReducer('setEditingId', (global, actions, payload) => {\n const { messageId } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type } = currentMessageList;\n const paramName = type === 'scheduled' ? 'editingScheduledId' : 'editingId';\n\n return replaceThreadParam(global, chatId, threadId, paramName, messageId);\n});\n\naddReducer('editLastMessage', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!chatMessages || !viewportIds) {\n return undefined;\n }\n\n const lastOwnEditableMessageId = findLast(viewportIds, (id) => {\n return Boolean(chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId).canEdit);\n });\n\n if (!lastOwnEditableMessageId) {\n return undefined;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'editingId', lastOwnEditableMessageId);\n});\n\naddReducer('replyToNextMessage', (global, actions, payload) => {\n const { targetIndexDelta } = payload;\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!chatMessages || !viewportIds) {\n return;\n }\n\n const replyingToId = selectReplyingToId(global, chatId, threadId);\n const isLatest = selectIsViewportNewest(global, chatId, threadId);\n\n let messageId: number | undefined;\n\n if (!isLatest || !replyingToId) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n\n messageId = chat && chat.lastMessage ? chat.lastMessage.id : undefined;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n messageId = threadInfo ? threadInfo.lastMessageId : undefined;\n }\n } else {\n const chatMessageKeys = Object.keys(chatMessages);\n const indexOfCurrent = chatMessageKeys.indexOf(replyingToId.toString());\n const newIndex = indexOfCurrent + targetIndexDelta;\n messageId = newIndex <= chatMessageKeys.length + 1 && newIndex >= 0\n ? Number(chatMessageKeys[newIndex])\n : undefined;\n }\n actions.setReplyingToId({ messageId });\n actions.focusMessage({\n chatId, threadId, messageId,\n });\n});\n\naddReducer('openMediaViewer', (global, actions, payload) => {\n const {\n chatId, threadId, messageId, avatarOwnerId, profilePhotoIndex, origin,\n } = payload!;\n\n return {\n ...global,\n mediaViewer: {\n chatId,\n threadId,\n messageId,\n avatarOwnerId,\n profilePhotoIndex,\n origin,\n },\n forwardMessages: {},\n };\n});\n\naddReducer('closeMediaViewer', (global) => {\n return {\n ...global,\n mediaViewer: {},\n };\n});\n\naddReducer('openAudioPlayer', (global, actions, payload) => {\n const {\n chatId, threadId, messageId,\n } = payload!;\n\n return {\n ...global,\n audioPlayer: {\n chatId,\n threadId,\n messageId,\n },\n };\n});\n\naddReducer('closeAudioPlayer', (global) => {\n return {\n ...global,\n audioPlayer: {},\n };\n});\n\naddReducer('openPollResults', (global, actions, payload) => {\n const { chatId, messageId } = payload!;\n\n const shouldOpenInstantly = selectIsRightColumnShown(global);\n\n if (!shouldOpenInstantly) {\n window.setTimeout(() => {\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n pollResults: {\n chatId,\n messageId,\n voters: {},\n },\n });\n }, POLL_RESULT_OPEN_DELAY_MS);\n } else if (chatId !== global.pollResults.chatId || messageId !== global.pollResults.messageId) {\n setGlobal({\n ...global,\n pollResults: {\n chatId,\n messageId,\n voters: {},\n },\n });\n }\n});\n\naddReducer('closePollResults', (global) => {\n setGlobal({\n ...global,\n pollResults: {},\n });\n});\n\naddReducer('focusLastMessage', (global, actions) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId } = currentMessageList;\n\n let lastMessageId: number | undefined;\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n\n lastMessageId = chat && chat.lastMessage ? chat.lastMessage.id : undefined;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n lastMessageId = threadInfo ? threadInfo.lastMessageId : undefined;\n }\n\n if (!lastMessageId) {\n return;\n }\n\n actions.focusMessage({\n chatId, threadId, messageId: lastMessageId, noHighlight: true,\n });\n});\n\naddReducer('focusNextReply', (global, actions) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId } = currentMessageList;\n\n const replyStack = selectReplyStack(global, chatId, threadId);\n\n if (!replyStack || replyStack.length === 0) {\n actions.focusLastMessage();\n } else {\n const messageId = replyStack.pop();\n\n global = replaceThreadParam(global, chatId, threadId, 'replyStack', [...replyStack]);\n\n setGlobal(global);\n\n actions.focusMessage({\n chatId,\n threadId,\n messageId,\n });\n }\n\n return undefined;\n});\n\naddReducer('focusMessage', (global, actions, payload) => {\n const {\n chatId, threadId = MAIN_THREAD_ID, messageListType = 'thread', noHighlight, groupedId, groupedChatId,\n replyMessageId,\n } = payload!;\n\n let { messageId } = payload!;\n\n if (groupedId !== undefined) {\n const ids = selectForwardedMessageIdsByGroupId(global, groupedChatId, groupedId);\n if (ids && ids.length) {\n ([messageId] = ids);\n }\n }\n\n const currentMessageList = selectCurrentMessageList(global);\n const shouldSwitchChat = !currentMessageList || (\n chatId !== currentMessageList.chatId\n || threadId !== currentMessageList.threadId\n || messageListType !== currentMessageList.type\n );\n\n if (blurTimeout) {\n clearTimeout(blurTimeout);\n blurTimeout = undefined;\n }\n blurTimeout = window.setTimeout(() => {\n let newGlobal = getGlobal();\n newGlobal = updateFocusedMessage(newGlobal);\n newGlobal = updateFocusDirection(newGlobal);\n setGlobal(newGlobal);\n }, noHighlight ? FOCUS_NO_HIGHLIGHT_DURATION : FOCUS_DURATION);\n\n global = updateFocusedMessage(global, chatId, messageId, noHighlight);\n global = updateFocusDirection(global, undefined);\n\n if (replyMessageId) {\n const replyStack = selectReplyStack(global, chatId, threadId) || [];\n global = replaceThreadParam(global, chatId, threadId, 'replyStack', [...replyStack, replyMessageId]);\n }\n\n if (shouldSwitchChat) {\n global = updateFocusDirection(global, FocusDirection.Static);\n }\n\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (viewportIds && viewportIds.includes(messageId)) {\n setGlobal(global);\n actions.openChat({ id: chatId, threadId });\n return undefined;\n }\n\n if (shouldSwitchChat) {\n global = replaceThreadParam(global, chatId, threadId, 'viewportIds', undefined);\n }\n\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', undefined);\n\n if (viewportIds && !shouldSwitchChat) {\n const direction = messageId > viewportIds[0] ? FocusDirection.Down : FocusDirection.Up;\n global = updateFocusDirection(global, direction);\n }\n\n setGlobal(global);\n\n actions.openChat({ id: chatId, threadId });\n actions.loadViewportMessages();\n return undefined;\n});\n\naddReducer('openForwardMenu', (global, actions, payload) => {\n const { fromChatId, messageIds, groupedId } = payload!;\n let groupedMessageIds;\n if (groupedId) {\n groupedMessageIds = selectMessageIdsByGroupId(global, fromChatId, groupedId);\n }\n return {\n ...global,\n forwardMessages: {\n fromChatId,\n messageIds: groupedMessageIds || messageIds,\n isModalShown: true,\n },\n };\n});\n\naddReducer('exitForwardMode', (global) => {\n setGlobal({\n ...global,\n forwardMessages: {},\n });\n});\n\naddReducer('setForwardChatId', (global, actions, payload) => {\n const { id } = payload!;\n\n setGlobal({\n ...global,\n forwardMessages: {\n ...global.forwardMessages,\n toChatId: id,\n isModalShown: false,\n },\n });\n\n actions.openChat({ id });\n actions.closeMediaViewer();\n actions.exitMessageSelectMode();\n});\n\naddReducer('openForwardMenuForSelectedMessages', (global, actions) => {\n if (!global.selectedMessages) {\n return;\n }\n\n const { chatId: fromChatId, messageIds } = global.selectedMessages;\n\n actions.openForwardMenu({ fromChatId, messageIds });\n});\n\naddReducer('enterMessageSelectMode', (global, actions, payload) => {\n const { messageId } = payload || {};\n const openChat = selectCurrentChat(global);\n if (!openChat) {\n return global;\n }\n\n return enterMessageSelectMode(global, openChat.id, messageId);\n});\n\naddReducer('toggleMessageSelection', (global, actions, payload) => {\n const {\n messageId,\n groupedId,\n childMessageIds,\n withShift,\n } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n\n global = toggleMessageSelection(\n global, chatId, threadId, messageListType, messageId, groupedId, childMessageIds, withShift,\n );\n\n setGlobal(global);\n\n if (global.shouldShowContextMenuHint) {\n actions.disableContextMenuHint();\n actions.showNotification({\n // eslint-disable-next-line max-len\n message: `To **edit** or **reply**, close this menu. Then ${IS_TOUCH_ENV ? 'long tap' : 'right click'} on a message.`,\n });\n }\n});\n\naddReducer('disableContextMenuHint', (global) => {\n if (!global.shouldShowContextMenuHint) {\n return undefined;\n }\n\n return {\n ...global,\n shouldShowContextMenuHint: false,\n };\n});\n\naddReducer('exitMessageSelectMode', exitMessageSelectMode);\n\naddReducer('openPollModal', (global) => {\n return {\n ...global,\n isPollModalOpen: true,\n };\n});\n\naddReducer('closePollModal', (global) => {\n return {\n ...global,\n isPollModalOpen: false,\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { updateGlobalSearch, updateGlobalSearchContent } from '../../reducers';\n\nconst MAX_RECENTLY_FOUND_IDS = 10;\n\naddReducer('setGlobalSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n const { chatId } = global.globalSearch;\n\n return updateGlobalSearch(global, {\n globalResults: {},\n localResults: {},\n resultsByType: undefined,\n ...(query ? { fetchingStatus: { chats: !chatId, messages: true } } : { fetchingStatus: undefined }),\n query,\n });\n});\n\naddReducer('addRecentlyFoundChatId', (global, actions, payload) => {\n const { id } = payload!;\n const { recentlyFoundChatIds } = global.globalSearch;\n\n if (!recentlyFoundChatIds) {\n return updateGlobalSearch(global, { recentlyFoundChatIds: [id] });\n }\n\n const newRecentIds = recentlyFoundChatIds.filter((chatId) => chatId !== id);\n newRecentIds.unshift(id);\n if (newRecentIds.length > MAX_RECENTLY_FOUND_IDS) {\n newRecentIds.pop();\n }\n\n return updateGlobalSearch(global, { recentlyFoundChatIds: newRecentIds });\n});\n\naddReducer('clearRecentlyFoundChats', (global) => {\n return updateGlobalSearch(global, { recentlyFoundChatIds: undefined });\n});\n\naddReducer('setGlobalSearchContent', (global, actions, payload) => {\n const { content } = payload!;\n\n return updateGlobalSearchContent(global, content);\n});\n\naddReducer('setGlobalSearchChatId', (global, actions, payload) => {\n const { id } = payload!;\n\n return updateGlobalSearch(global, { chatId: id, query: undefined, resultsByType: undefined });\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\naddReducer('setStickerSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n search: {\n query,\n resultIds: undefined,\n },\n },\n };\n});\n\naddReducer('setGifSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return {\n ...global,\n gifs: {\n ...global.gifs,\n search: {\n query,\n offsetId: undefined,\n results: undefined,\n },\n },\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { updateSelectedUserId, updateUserSearch } from '../../reducers';\n\naddReducer('openUserInfo', (global, actions, payload) => {\n const { id } = payload!;\n\n actions.openChat({ id });\n});\n\nconst clearSelectedUserId = (global: GlobalState) => updateSelectedUserId(global, undefined);\n\naddReducer('openChat', clearSelectedUserId);\n\naddReducer('setUserSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return updateUserSearch(global, {\n globalUserIds: undefined,\n localUserIds: undefined,\n fetchingStatus: Boolean(query),\n query,\n });\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TABLET_COLUMN_LAYOUT } from '../../../util/environment';\nimport getReadableErrorText from '../../../util/getReadableErrorText';\nimport { selectCurrentMessageList } from '../../selectors';\nimport { ApiError } from '../../../api/types';\n\nconst MAX_STORED_EMOJIS = 18; // Represents two rows of recent emojis\n\naddReducer('toggleChatInfo', (global) => {\n return {\n ...global,\n isChatInfoShown: !global.isChatInfoShown,\n };\n});\n\naddReducer('toggleManagement', (global): GlobalState | undefined => {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n return undefined;\n }\n\n return {\n ...global,\n management: {\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...global.management.byChatId[chatId],\n isActive: !(global.management.byChatId[chatId] || {}).isActive,\n },\n },\n },\n };\n});\n\naddReducer('closeManagement', (global): GlobalState | undefined => {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n return undefined;\n }\n\n return {\n ...global,\n management: {\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...global.management.byChatId[chatId],\n isActive: false,\n },\n },\n },\n };\n});\n\naddReducer('openChat', (global) => {\n if (!IS_SINGLE_COLUMN_LAYOUT && !IS_TABLET_COLUMN_LAYOUT) {\n return undefined;\n }\n\n return {\n ...global,\n isLeftColumnShown: global.messages.messageLists.length === 0,\n };\n});\n\naddReducer('toggleLeftColumn', (global) => {\n return {\n ...global,\n isLeftColumnShown: !global.isLeftColumnShown,\n };\n});\n\naddReducer('addRecentEmoji', (global, action, payload) => {\n const { emoji } = payload!;\n const { recentEmojis } = global;\n if (!recentEmojis) {\n return {\n ...global,\n recentEmojis: [emoji],\n };\n }\n\n const newEmojis = recentEmojis.filter((e) => e !== emoji);\n newEmojis.unshift(emoji);\n if (newEmojis.length > MAX_STORED_EMOJIS) {\n newEmojis.pop();\n }\n\n return {\n ...global,\n recentEmojis: newEmojis,\n };\n});\n\naddReducer('addRecentSticker', (global, action, payload) => {\n const { sticker } = payload!;\n const { recent } = global.stickers;\n if (!recent) {\n return {\n ...global,\n stickers: {\n ...global.stickers,\n recent: {\n hash: 0,\n stickers: [sticker],\n },\n },\n };\n }\n\n const newStickers = recent.stickers.filter((s) => s.id !== sticker.id);\n newStickers.unshift(sticker);\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n recent: {\n ...recent,\n stickers: newStickers,\n },\n },\n };\n});\n\naddReducer('showNotification', (global, actions, payload) => {\n const notification = payload!;\n\n const newNotifications = [...global.notifications];\n const existingNotificationIndex = newNotifications.findIndex((n) => n.message === notification.message);\n if (existingNotificationIndex !== -1) {\n newNotifications.splice(existingNotificationIndex, 1);\n }\n\n newNotifications.push(notification);\n\n return {\n ...global,\n notifications: newNotifications,\n };\n});\n\naddReducer('dismissNotification', (global) => {\n const newNotifications = [...global.notifications];\n\n newNotifications.pop();\n\n return {\n ...global,\n notifications: newNotifications,\n };\n});\n\naddReducer('showDialog', (global, actions, payload) => {\n const { data } = payload!;\n\n // Filter out errors that we don't want to show to the user\n if ('message' in data && data.hasErrorKey && !getReadableErrorText(data)) {\n return global;\n }\n\n const newDialogs = [...global.dialogs];\n if ('message' in data) {\n const existingErrorIndex = newDialogs.findIndex((err) => (err as ApiError).message === data.message);\n if (existingErrorIndex !== -1) {\n newDialogs.splice(existingErrorIndex, 1);\n }\n }\n\n newDialogs.push(data);\n\n return {\n ...global,\n dialogs: newDialogs,\n };\n});\n\naddReducer('dismissDialog', (global) => {\n const newDialogs = [...global.dialogs];\n\n newDialogs.pop();\n\n return {\n ...global,\n dialogs: newDialogs,\n };\n});\n\naddReducer('toggleSafeLinkModal', (global, actions, payload) => {\n const { url: safeLinkModalUrl } = payload;\n\n return {\n ...global,\n safeLinkModalUrl,\n };\n});\n\naddReducer('openHistoryCalendar', (global, actions, payload) => {\n const { selectedAt } = payload;\n\n return {\n ...global,\n historyCalendarSelectedAt: selectedAt,\n };\n});\n\naddReducer('closeHistoryCalendar', (global) => {\n return {\n ...global,\n historyCalendarSelectedAt: undefined,\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\nimport {\n clearPayment, closeInvoice,\n} from '../../reducers';\n\naddReducer('openPaymentModal', (global, actions, payload) => {\n const { messageId } = payload;\n return {\n ...global,\n payment: {\n ...global.payment,\n messageId,\n isPaymentModalOpen: true,\n },\n };\n});\n\naddReducer('closePaymentModal', (global) => {\n const newGlobal = clearPayment(global);\n return closeInvoice(newGlobal);\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiUser, ApiChatFolder, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { NewChatMembersProgress, ChatCreationProgress, ManagementProgress } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport {\n ARCHIVED_FOLDER_ID,\n TOP_CHAT_MESSAGES_PRELOAD_LIMIT,\n CHAT_LIST_LOAD_SLICE,\n RE_TME_INVITE_LINK,\n RE_TME_LINK,\n TIPS_USERNAME,\n LOCALIZED_TIPS,\n} from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n addChats,\n addUsers,\n replaceThreadParam,\n updateChatListIds,\n updateChats,\n updateChat,\n updateChatListSecondaryInfo,\n updateManagementProgress,\n} from '../../reducers';\nimport {\n selectChat,\n selectCurrentChat,\n selectUser,\n selectChatListType,\n selectIsChatPinned,\n selectChatFolder,\n selectSupportChat,\n selectChatByUsername,\n selectThreadTopMessageId,\n selectCurrentMessageList,\n} from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { debounce, pause, throttle } from '../../../util/schedulers';\nimport {\n isChatSummaryOnly, isChatArchived, prepareChatList, isChatBasicGroup,\n} from '../../helpers';\n\nconst TOP_CHATS_PRELOAD_PAUSE = 100;\n// We expect this ID does not exist\nconst TMP_CHAT_ID = -1;\n\nconst runThrottledForLoadChats = throttle((cb) => cb(), 1000, true);\nconst runThrottledForLoadTopChats = throttle((cb) => cb(), 3000, true);\nconst runDebouncedForLoadFullChat = debounce((cb) => cb(), 500, false, true);\n\naddReducer('preloadTopChatMessages', (global, actions) => {\n (async () => {\n const preloadedChatIds: number[] = [];\n\n for (let i = 0; i < TOP_CHAT_MESSAGES_PRELOAD_LIMIT; i++) {\n await pause(TOP_CHATS_PRELOAD_PAUSE);\n\n const {\n byId,\n listIds: { active: listIds },\n orderedPinnedIds: { active: orderedPinnedIds },\n } = getGlobal().chats;\n if (!listIds) {\n return;\n }\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const { pinnedChats, otherChats } = prepareChatList(byId, listIds, orderedPinnedIds);\n const topChats = [...pinnedChats, ...otherChats];\n const chatToPreload = topChats.find(({ id }) => id !== currentChatId && !preloadedChatIds.includes(id));\n if (!chatToPreload) {\n return;\n }\n\n preloadedChatIds.push(chatToPreload.id);\n\n actions.loadViewportMessages({ chatId: chatToPreload.id, threadId: MAIN_THREAD_ID });\n }\n })();\n});\n\naddReducer('openChat', (global, actions, payload) => {\n const { id, threadId } = payload!;\n const { currentUserId } = global;\n const chat = selectChat(global, id);\n\n if (chat && chat.hasUnreadMark) {\n actions.toggleChatUnread({ id });\n }\n\n if (!chat) {\n if (id === currentUserId) {\n void callApi('fetchChat', { type: 'self' });\n } else {\n const user = selectUser(global, id);\n if (user) {\n void callApi('fetchChat', { type: 'user', user });\n }\n }\n } else if (isChatSummaryOnly(chat) && !chat.isMin) {\n actions.requestChatUpdate({ chatId: id });\n }\n\n if (threadId !== MAIN_THREAD_ID) {\n const topMessageId = selectThreadTopMessageId(global, id, threadId);\n if (!topMessageId) {\n actions.requestThreadInfoUpdate({ chatId: id, threadId });\n }\n }\n});\n\naddReducer('openSupportChat', (global, actions) => {\n const chat = selectSupportChat(global);\n\n actions.openChat({ id: chat ? chat.id : TMP_CHAT_ID });\n\n if (chat) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchChat', { type: 'support' });\n if (result) {\n actions.openChat({ id: result.chatId });\n }\n })();\n});\n\naddReducer('openTipsChat', (global, actions, payload) => {\n const { langCode } = payload;\n\n const usernamePostfix = langCode === 'pt-br'\n ? 'BR'\n : LOCALIZED_TIPS.includes(langCode) ? (langCode as string).toUpperCase() : '';\n\n actions.openChatByUsername({ username: `${TIPS_USERNAME}${usernamePostfix}` });\n});\n\naddReducer('loadMoreChats', (global, actions, payload) => {\n const { listType = 'active' } = payload!;\n const listIds = global.chats.listIds[listType as ('active' | 'archived')];\n const isFullyLoaded = global.chats.isFullyLoaded[listType as ('active' | 'archived')];\n\n if (isFullyLoaded) {\n return;\n }\n\n const oldestChat = listIds\n ? listIds\n .map((id) => global.chats.byId[id])\n .filter((chat) => Boolean(chat && chat.lastMessage) && !selectIsChatPinned(global, chat.id))\n .sort((chat1, chat2) => (chat1.lastMessage!.date - chat2.lastMessage!.date))[0]\n : undefined;\n\n if (oldestChat) {\n runThrottledForLoadChats(() => loadChats(listType, oldestChat.id, oldestChat.lastMessage!.date));\n } else {\n runThrottledForLoadChats(() => loadChats(listType));\n }\n});\n\naddReducer('loadFullChat', (global, actions, payload) => {\n const { chatId, force } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n if (force) {\n loadFullChat(chat);\n } else {\n runDebouncedForLoadFullChat(() => loadFullChat(chat));\n }\n});\n\naddReducer('loadTopChats', () => {\n runThrottledForLoadTopChats(() => loadChats('active'));\n});\n\naddReducer('requestChatUpdate', (global, actions, payload) => {\n const { serverTimeOffset } = global;\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('requestChatUpdate', {\n chat,\n serverTimeOffset,\n });\n});\n\naddReducer('updateChatMutedState', (global, actions, payload) => {\n const { serverTimeOffset } = global;\n const { chatId, isMuted } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n setGlobal(updateChat(global, chatId, { isMuted }));\n void callApi('updateChatMutedState', { chat, isMuted, serverTimeOffset });\n});\n\naddReducer('createChannel', (global, actions, payload) => {\n const {\n title, about, photo, memberIds,\n } = payload!;\n\n const members = (memberIds as number[])\n .map((id: number) => selectUser(global, id))\n .filter(Boolean as any);\n\n void createChannel(title, members, about, photo);\n});\n\naddReducer('joinChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n void callApi('joinChannel', { channelId, accessHash });\n }\n});\n\naddReducer('deleteChatUser', (global, actions, payload) => {\n (async () => {\n const { chatId, userId } : {chatId: number; userId: number} = payload!;\n const chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n if (!chat || !user) {\n return;\n }\n await callApi('deleteChatUser', { chat, user });\n\n const activeChat = selectCurrentMessageList(global);\n if (activeChat && activeChat.chatId === chatId && global.currentUserId === userId) {\n actions.openChat({ id: undefined });\n }\n })();\n});\n\naddReducer('deleteChat', (global, actions, payload) => {\n (async () => {\n const { chatId } : {chatId: number } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n await callApi('deleteChat', { chatId: chat.id });\n\n const activeChat = selectCurrentMessageList(global);\n if (activeChat && activeChat.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n })();\n});\n\naddReducer('leaveChannel', (global, actions, payload) => {\n (async () => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n await callApi('leaveChannel', { channelId, accessHash });\n }\n\n const activeChannel = selectCurrentMessageList(global);\n if (activeChannel && activeChannel.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n })();\n});\n\naddReducer('deleteChannel', (global, actions, payload) => {\n (async () => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n await callApi('deleteChannel', { channelId, accessHash });\n }\n\n const activeChannel = selectCurrentMessageList(global);\n if (activeChannel && activeChannel.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n })();\n});\n\naddReducer('createGroupChat', (global, actions, payload) => {\n const { title, memberIds, photo } = payload!;\n const members = (memberIds as number[])\n .map((id: number) => selectUser(global, id))\n .filter(Boolean as any);\n\n void createGroupChat(title, members, photo);\n});\n\naddReducer('toggleChatPinned', (global, actions, payload) => {\n const { id, folderId } = payload!;\n const chat = selectChat(global, id);\n if (!chat) {\n return;\n }\n\n if (folderId) {\n const folder = selectChatFolder(global, folderId);\n if (folder) {\n const shouldBePinned = !selectIsChatPinned(global, id, folderId);\n\n const { pinnedChatIds, includedChatIds } = folder;\n const newPinnedIds = shouldBePinned\n ? [id, ...(pinnedChatIds || [])]\n : (pinnedChatIds || []).filter((pinnedId) => pinnedId !== id);\n\n // With both Pin and Unpin we need to re-add a user to the included group\n const newIncludedChatIds = [id, ...includedChatIds];\n\n void callApi('editChatFolder', {\n id: folderId,\n folderUpdate: {\n ...folder,\n pinnedChatIds: newPinnedIds,\n includedChatIds: newIncludedChatIds,\n },\n });\n }\n } else {\n const listType = selectChatListType(global, id);\n const isPinned = selectIsChatPinned(global, id, listType === 'archived' ? ARCHIVED_FOLDER_ID : undefined);\n void callApi('toggleChatPinned', { chat, shouldBePinned: !isPinned });\n }\n});\n\naddReducer('toggleChatArchived', (global, actions, payload) => {\n const { id } = payload!;\n const chat = selectChat(global, id);\n if (chat) {\n void callApi('toggleChatArchived', {\n chat,\n folderId: isChatArchived(chat) ? 0 : ARCHIVED_FOLDER_ID,\n });\n }\n});\n\naddReducer('loadChatFolders', () => {\n void loadChatFolders();\n});\n\naddReducer('loadRecommendedChatFolders', () => {\n void loadRecommendedChatFolders();\n});\n\naddReducer('editChatFolder', (global, actions, payload) => {\n const { id, folderUpdate } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void callApi('editChatFolder', {\n id,\n folderUpdate: {\n id,\n emoticon: folder.emoticon,\n pinnedChatIds: folder.pinnedChatIds,\n ...folderUpdate,\n },\n });\n }\n});\n\naddReducer('addChatFolder', (global, actions, payload) => {\n const { folder } = payload!;\n const { orderedIds } = global.chatFolders;\n const maxId = orderedIds && orderedIds.length ? Math.max.apply(Math.max, orderedIds) : ARCHIVED_FOLDER_ID;\n\n void createChatFolder(folder, maxId);\n});\n\naddReducer('deleteChatFolder', (global, actions, payload) => {\n const { id } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void deleteChatFolder(id);\n }\n});\n\naddReducer('toggleChatUnread', (global, actions, payload) => {\n const { id } = payload!;\n const { serverTimeOffset } = global;\n const chat = selectChat(global, id);\n if (chat) {\n if (chat.unreadCount) {\n void callApi('markMessageListRead', { serverTimeOffset, chat, threadId: MAIN_THREAD_ID });\n } else {\n void callApi('toggleDialogUnread', {\n chat,\n hasUnreadMark: !chat.hasUnreadMark,\n });\n }\n }\n});\n\naddReducer('openTelegramLink', (global, actions, payload) => {\n const { url } = payload!;\n let match = RE_TME_INVITE_LINK.exec(url);\n\n if (match) {\n const hash = match[1];\n\n (async () => {\n const result = await callApi('openChatByInvite', hash);\n if (!result) {\n return;\n }\n\n actions.openChat({ id: result.chatId });\n })();\n } else {\n match = RE_TME_LINK.exec(url)!;\n\n const username = match[1];\n const chatOrChannelPostId = match[2] ? Number(match[2]) : undefined;\n const messageId = match[3] ? Number(match[3]) : undefined;\n\n // Open message in private chat\n if (username === 'c' && chatOrChannelPostId && messageId) {\n actions.focusMessage({ chatId: -chatOrChannelPostId, messageId });\n } else {\n void openChatByUsername(actions, username, chatOrChannelPostId);\n }\n }\n});\n\naddReducer('acceptInviteConfirmation', (global, actions, payload) => {\n const { hash } = payload!;\n (async () => {\n const result = await callApi('importChatInvite', { hash });\n if (!result) {\n return;\n }\n\n actions.openChat({ id: result.id });\n })();\n});\n\naddReducer('openChatByUsername', (global, actions, payload) => {\n const { username } = payload!;\n\n void openChatByUsername(actions, username);\n});\n\naddReducer('togglePreHistoryHidden', (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n let chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n void callApi('togglePreHistoryHidden', { chat, isEnabled });\n })();\n});\n\naddReducer('updateChatDefaultBannedRights', (global, actions, payload) => {\n const { chatId, bannedRights } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('updateChatDefaultBannedRights', { chat, bannedRights });\n});\n\naddReducer('updateChatMemberBannedRights', (global, actions, payload) => {\n const { chatId, userId, bannedRights } = payload!;\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatMemberBannedRights', { chat, user, bannedRights });\n\n const newGlobal = getGlobal();\n const chatAfterUpdate = selectChat(newGlobal, chatId);\n\n if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) {\n return;\n }\n\n const { members, kickedMembers } = chatAfterUpdate.fullInfo;\n\n const isBanned = !!bannedRights.viewMessages;\n const isUnblocked = !Object.keys(bannedRights).length;\n\n setGlobal(updateChat(newGlobal, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(members && isBanned && {\n members: members.filter((m) => m.userId !== userId),\n }),\n ...(members && !isBanned && {\n members: members.map((m) => (\n m.userId === userId\n ? { ...m, bannedRights }\n : m\n )),\n }),\n ...(isUnblocked && kickedMembers && {\n kickedMembers: kickedMembers.filter((m) => m.userId !== userId),\n }),\n },\n }));\n })();\n});\n\naddReducer('updateChatAdmin', (global, actions, payload) => {\n const {\n chatId, userId, adminRights, customTitle,\n } = payload!;\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatAdmin', {\n chat, user, adminRights, customTitle,\n });\n\n const newGlobal = getGlobal();\n const chatAfterUpdate = selectChat(newGlobal, chatId);\n\n if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) {\n return;\n }\n\n const { adminMembers } = chatAfterUpdate.fullInfo;\n\n const isDismissed = !Object.keys(adminRights).length;\n\n setGlobal(updateChat(newGlobal, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(adminMembers && isDismissed && {\n adminMembers: adminMembers.filter((m) => m.userId !== userId),\n }),\n ...(adminMembers && !isDismissed && {\n adminMembers: adminMembers.map((m) => (\n m.userId === userId\n ? { ...m, adminRights, customTitle }\n : m\n )),\n }),\n },\n }));\n })();\n});\n\naddReducer('updateChat', (global, actions, payload) => {\n const {\n chatId, title, about, photo,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n (async () => {\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress));\n\n await Promise.all([\n chat.title !== title\n ? callApi('updateChatTitle', chat, title)\n : undefined,\n chat.fullInfo && chat.fullInfo.about !== about\n ? callApi('updateChatAbout', chat, about)\n : undefined,\n photo\n ? callApi('editChatPhoto', { chatId, accessHash: chat.accessHash, photo })\n : undefined,\n ]);\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.Complete));\n })();\n});\n\naddReducer('toggleSignatures', (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('toggleSignatures', { chat, isEnabled });\n});\n\naddReducer('loadGroupsForDiscussion', () => {\n (async () => {\n const groups = await callApi('fetchGroupsForDiscussion');\n if (!groups) {\n return;\n }\n\n const addedById = groups.reduce((result, group) => {\n if (group) {\n result[group.id] = group;\n }\n\n return result;\n }, {} as Record);\n\n const global = addChats(getGlobal(), addedById);\n setGlobal({\n ...global,\n chats: {\n ...global.chats,\n forDiscussionIds: Object.keys(addedById).map(Number),\n },\n });\n })();\n});\n\naddReducer('linkDiscussionGroup', (global, actions, payload) => {\n const { channelId, chatId } = payload!;\n\n const channel = selectChat(global, channelId);\n let chat = selectChat(global, chatId);\n if (!channel || !chat) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n let { fullInfo } = chat;\n if (!fullInfo) {\n const fullChat = await callApi('fetchFullChat', chat);\n if (!fullChat) {\n return;\n }\n\n fullInfo = fullChat.fullInfo;\n }\n\n if (fullInfo.isPreHistoryHidden) {\n await callApi('togglePreHistoryHidden', { chat, isEnabled: false });\n }\n\n void callApi('setDiscussionGroup', { channel, chat });\n })();\n});\n\naddReducer('unlinkDiscussionGroup', (global, actions, payload) => {\n const { channelId } = payload!;\n\n const channel = selectChat(global, channelId);\n if (!channel) {\n return;\n }\n\n let chat: ApiChat | undefined;\n if (channel.fullInfo && channel.fullInfo.linkedChatId) {\n chat = selectChat(global, channel.fullInfo.linkedChatId);\n }\n\n (async () => {\n await callApi('setDiscussionGroup', { channel });\n if (chat) {\n loadFullChat(chat);\n }\n })();\n});\n\n\naddReducer('setActiveChatFolder', (global, actions, payload) => {\n return {\n ...global,\n chatFolders: {\n ...global.chatFolders,\n activeChatFolder: payload,\n },\n };\n});\n\naddReducer('loadMoreMembers', (global) => {\n (async () => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n if (!chat || isChatBasicGroup(chat)) {\n return;\n }\n\n const offset = (chat.fullInfo && chat.fullInfo.members && chat.fullInfo.members.length) || undefined;\n const result = await callApi('fetchMembers', chat.id, chat.accessHash!, 'recent', offset);\n if (!result) {\n return;\n }\n\n const { members, users } = result;\n if (!members || !members.length) {\n return;\n }\n\n global = getGlobal();\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateChat(global, chat.id, {\n fullInfo: {\n ...chat.fullInfo,\n members: [\n ...((chat.fullInfo || {}).members || []),\n ...(members || []),\n ],\n },\n });\n setGlobal(global);\n })();\n});\n\naddReducer('addChatMembers', (global, actions, payload) => {\n const { chatId, memberIds } = payload;\n const chat = selectChat(global, chatId);\n const users = (memberIds as number[]).map((userId) => selectUser(global, userId)).filter(Boolean as any);\n\n if (!chat || !users.length) {\n return;\n }\n\n actions.setNewChatMembersDialogState(NewChatMembersProgress.Loading);\n (async () => {\n await callApi('addChatMembers', chat, users);\n actions.setNewChatMembersDialogState(NewChatMembersProgress.Closed);\n loadFullChat(chat);\n })();\n});\n\naddReducer('deleteChatMember', (global, actions, payload) => {\n const { chatId, userId } = payload;\n const chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n await callApi('deleteChatMember', chat, user);\n loadFullChat(chat);\n })();\n});\n\nasync function loadChats(listType: 'active' | 'archived', offsetId?: number, offsetDate?: number) {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n offsetDate,\n archived: listType === 'archived',\n withPinned: getGlobal().chats.orderedPinnedIds[listType] === undefined,\n serverTimeOffset: getGlobal().serverTimeOffset,\n });\n\n if (!result) {\n return;\n }\n\n const { chatIds } = result;\n\n if (chatIds.length > 0 && chatIds[0] === offsetId) {\n chatIds.shift();\n }\n\n let global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = updateChatListIds(global, listType, chatIds);\n global = updateChatListSecondaryInfo(global, listType, result);\n\n Object.keys(result.draftsById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId],\n );\n });\n\n Object.keys(result.replyingToById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId],\n );\n });\n\n\n if (chatIds.length === 0 && !global.chats.isFullyLoaded[listType]) {\n global = {\n ...global,\n chats: {\n ...global.chats,\n isFullyLoaded: {\n ...global.chats.isFullyLoaded,\n [listType]: true,\n },\n },\n };\n }\n\n setGlobal(global);\n}\n\nasync function loadFullChat(chat: ApiChat) {\n const result = await callApi('fetchFullChat', chat);\n if (!result) {\n return;\n }\n\n const { users, fullInfo } = result;\n\n let global = getGlobal();\n if (users) {\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n }\n global = updateChat(global, chat.id, { fullInfo });\n\n setGlobal(global);\n}\n\nasync function createChannel(title: string, users: ApiUser[], about?: string, photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n const createdChannel = await callApi('createChannel', { title, about, users });\n if (!createdChannel) {\n return;\n }\n\n const { id: channelId, accessHash } = createdChannel;\n\n let global = getGlobal();\n global = updateChat(global, channelId, createdChannel);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChannel ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getDispatch().openChat({ id: channelId });\n\n if (channelId && accessHash && photo) {\n await callApi('editChatPhoto', { chatId: channelId, accessHash, photo });\n }\n}\n\nasync function createGroupChat(title: string, users: ApiUser[], photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n const createdChat = await callApi('createGroupChat', { title, users });\n if (!createdChat) {\n return;\n }\n\n const { id: chatId } = createdChat;\n\n let global = getGlobal();\n global = updateChat(global, chatId, createdChat);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChat ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getDispatch().openChat({ id: chatId });\n\n if (chatId && photo) {\n await callApi('editChatPhoto', { chatId, photo });\n }\n}\n\nasync function loadChatFolders() {\n const chatFolders = await callApi('fetchChatFolders');\n\n if (chatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n ...chatFolders,\n },\n });\n }\n}\n\nasync function loadRecommendedChatFolders() {\n const recommendedChatFolders = await callApi('fetchRecommendedChatFolders');\n\n if (recommendedChatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommendedChatFolders,\n },\n });\n }\n}\n\nasync function createChatFolder(folder: ApiChatFolder, maxId: number) {\n // Clear fields from recommended folders\n const { id: recommendedId, description, ...newFolder } = folder;\n\n await callApi('editChatFolder', {\n id: maxId + 1,\n folderUpdate: {\n id: maxId + 1,\n ...newFolder,\n },\n });\n\n if (!description) {\n return;\n }\n\n const global = getGlobal();\n const { recommended } = global.chatFolders;\n\n if (recommended) {\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommended.filter(({ id }) => id !== recommendedId),\n },\n });\n }\n}\n\nasync function deleteChatFolder(id: number) {\n await callApi('deleteChatFolder', id);\n}\n\nasync function openChatByUsername(\n actions: GlobalActions,\n username: string,\n channelPostId?: number,\n) {\n const global = getGlobal();\n const localChat = selectChatByUsername(global, username);\n if (localChat && !localChat.isMin) {\n if (channelPostId) {\n actions.focusMessage({ chatId: localChat.id, messageId: channelPostId });\n } else {\n actions.openChat({ id: localChat.id });\n }\n return;\n }\n\n const previousChat = selectCurrentChat(global);\n // Open temporary empty chat to make the click response feel faster\n actions.openChat({ id: TMP_CHAT_ID });\n\n const chat = await callApi('getChatByUsername', username);\n if (!chat) {\n if (previousChat) {\n actions.openChat({ id: previousChat.id });\n }\n\n actions.showNotification({ message: 'User does not exist' });\n\n return;\n }\n\n setGlobal(updateChat(getGlobal(), chat.id, chat));\n\n if (channelPostId) {\n actions.focusMessage({ chatId: chat.id, messageId: channelPostId });\n } else {\n actions.openChat({ id: chat.id });\n }\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiAttachment,\n ApiChat,\n ApiMessage,\n ApiMessageEntity,\n ApiNewPoll,\n ApiOnProgress,\n ApiSticker,\n ApiVideo,\n MAIN_THREAD_ID,\n MESSAGE_DELETED,\n} from '../../../api/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { MAX_MEDIA_FILES_FOR_ALBUM, MESSAGE_LIST_SLICE } from '../../../config';\nimport { callApi, cancelApiProgress } from '../../../api/gramjs';\nimport { areSortedArraysIntersecting, buildCollectionByKey, split } from '../../../util/iteratees';\nimport {\n addUsers,\n addChatMessagesById,\n replaceThreadParam,\n safeReplaceViewportIds,\n updateChatMessage,\n addChats,\n updateListedIds,\n updateOutlyingIds,\n replaceScheduledMessages,\n updateThreadInfos,\n updateChat,\n} from '../../reducers';\nimport {\n selectChat,\n selectChatMessage,\n selectCurrentMessageList,\n selectFocusedMessageId,\n selectCurrentChat,\n selectListedIds,\n selectOutlyingIds,\n selectViewportIds,\n selectRealLastReadId,\n selectReplyingToId,\n selectEditingId,\n selectDraft,\n selectThreadOriginChat,\n selectThreadTopMessageId,\n selectEditingScheduledId,\n selectEditingMessage,\n selectScheduledMessage,\n selectNoWebPage,\n} from '../../selectors';\nimport { rafPromise, throttle } from '../../../util/schedulers';\nimport { IS_IOS } from '../../../util/environment';\n\nconst uploadProgressCallbacks = new Map();\n\nconst runThrottledForMarkRead = throttle((cb) => cb(), 1000, true);\n\naddReducer('loadViewportMessages', (global, actions, payload) => {\n const {\n direction = LoadMoreDirection.Around,\n isBudgetPreload = false,\n } = payload || {};\n\n let { chatId, threadId } = payload || {};\n\n if (!chatId) {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n chatId = currentMessageList.chatId;\n threadId = currentMessageList.threadId;\n }\n\n const chat = selectChat(global, chatId);\n // TODO Revise if `chat.isRestricted` check is needed\n if (!chat || chat.isRestricted) {\n return undefined;\n }\n\n const viewportIds = selectViewportIds(global, chatId, threadId);\n const listedIds = selectListedIds(global, chatId, threadId);\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n\n if (!viewportIds || !viewportIds.length || direction === LoadMoreDirection.Around) {\n const offsetId = selectFocusedMessageId(global, chatId) || selectRealLastReadId(global, chatId, threadId);\n const isOutlying = Boolean(offsetId && listedIds && !listedIds.includes(offsetId));\n const historyIds = (isOutlying ? outlyingIds : listedIds) || [];\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(historyIds, offsetId, LoadMoreDirection.Around);\n\n if (areSomeLocal && newViewportIds.length >= MESSAGE_LIST_SLICE) {\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds);\n }\n\n if (!areAllLocal) {\n void loadViewportMessages(chat, threadId, offsetId, LoadMoreDirection.Around, isOutlying, isBudgetPreload);\n }\n } else {\n const offsetId = direction === LoadMoreDirection.Backwards ? viewportIds[0] : viewportIds[viewportIds.length - 1];\n const isOutlying = Boolean(outlyingIds);\n const historyIds = (isOutlying ? outlyingIds : listedIds)!;\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(historyIds, offsetId, direction);\n\n if (areSomeLocal) {\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds);\n }\n\n void loadWithBudget(actions, areAllLocal, isOutlying, isBudgetPreload, chat, threadId, direction, offsetId);\n\n if (isBudgetPreload) {\n return undefined;\n }\n }\n\n return global;\n});\n\nasync function loadWithBudget(\n actions: GlobalActions,\n areAllLocal: boolean, isOutlying: boolean, isBudgetPreload: boolean,\n chat: ApiChat, threadId: number, direction: LoadMoreDirection, offsetId?: number,\n) {\n if (!areAllLocal) {\n await loadViewportMessages(\n chat, threadId, offsetId, direction, isOutlying, isBudgetPreload,\n );\n }\n\n if (!isBudgetPreload) {\n // Let reducer return and update global\n await Promise.resolve();\n actions.loadViewportMessages({\n chatId: chat.id, threadId, direction, isBudgetPreload: true,\n });\n }\n}\n\naddReducer('loadMessage', (global, actions, payload) => {\n const { chatId, messageId, replyOriginForId } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void loadMessage(chat, messageId, replyOriginForId);\n});\n\naddReducer('sendMessage', (global, actions, payload) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type } = currentMessageList;\n\n if (type === 'scheduled' && !payload.scheduledAt) {\n return {\n ...global,\n messages: {\n ...global.messages,\n contentToBeScheduled: payload,\n },\n };\n }\n\n const chat = selectChat(global, chatId)!;\n\n actions.setReplyingToId({ messageId: undefined });\n actions.clearWebPagePreview({ chatId, threadId, value: false });\n\n const params = {\n ...payload,\n chat,\n replyingTo: selectReplyingToId(global, chatId, threadId),\n noWebPage: selectNoWebPage(global, chatId, threadId),\n };\n\n const isSingle = !payload.attachments || payload.attachments.length <= 1;\n const isGrouped = !isSingle && payload.attachments && payload.attachments.length > 1;\n\n if (isSingle) {\n const { attachments, ...restParams } = params;\n sendMessage({\n ...restParams,\n attachment: attachments ? attachments[0] : undefined,\n });\n } else if (isGrouped) {\n const {\n text, entities, attachments, ...commonParams\n } = params;\n const groupedAttachments = split(attachments, MAX_MEDIA_FILES_FOR_ALBUM);\n for (let i = 0; i < groupedAttachments.length; i++) {\n const [firstAttachment, ...restAttachments] = groupedAttachments[i];\n const groupedId = `${Date.now()}${i}`;\n\n sendMessage({\n ...commonParams,\n text: i === 0 ? text : undefined,\n entities: i === 0 ? entities : undefined,\n attachment: firstAttachment,\n groupedId: restAttachments.length > 0 ? groupedId : undefined,\n });\n\n restAttachments.forEach((attachment: ApiAttachment) => {\n sendMessage({\n ...commonParams,\n attachment,\n groupedId,\n });\n });\n }\n } else {\n const {\n text, entities, attachments, replyingTo, ...commonParams\n } = params;\n\n if (text) {\n sendMessage({\n ...commonParams,\n text,\n entities,\n replyingTo,\n });\n }\n\n attachments.forEach((attachment: ApiAttachment) => {\n sendMessage({\n ...commonParams,\n attachment,\n });\n });\n }\n\n return undefined;\n});\n\naddReducer('editMessage', (global, actions, payload) => {\n const { serverTimeOffset } = global;\n const { text, entities } = payload!;\n\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n const message = selectEditingMessage(global, chatId, threadId, messageListType);\n if (!chat || !message) {\n return;\n }\n\n void callApi('editMessage', {\n chat, message, text, entities, noWebPage: selectNoWebPage(global, chatId, threadId), serverTimeOffset,\n });\n\n actions.setEditingId({ messageId: undefined });\n});\n\naddReducer('cancelSendingMessage', (global, actions, payload) => {\n const { chatId, messageId } = payload!;\n const message = selectChatMessage(global, chatId, messageId);\n const progressCallback = message && uploadProgressCallbacks.get(message.previousLocalId || message.id);\n if (progressCallback) {\n cancelApiProgress(progressCallback);\n }\n\n actions.apiUpdate({\n '@type': 'deleteMessages',\n ids: [messageId],\n chatId,\n });\n});\n\naddReducer('saveDraft', (global, actions, payload) => {\n const { chatId, threadId, draft } = payload!;\n if (!draft) {\n return undefined;\n }\n\n const { text, entities } = draft;\n const chat = selectChat(global, chatId)!;\n\n if (threadId === MAIN_THREAD_ID) {\n void callApi('saveDraft', {\n chat,\n text,\n entities,\n replyToMsgId: selectReplyingToId(global, chatId, threadId),\n });\n }\n\n global = replaceThreadParam(global, chatId, threadId, 'draft', draft);\n global = updateChat(global, chatId, { draftDate: Math.round(Date.now() / 1000) });\n\n return global;\n});\n\naddReducer('clearDraft', (global, actions, payload) => {\n const { chatId, threadId, localOnly } = payload!;\n if (!selectDraft(global, chatId, threadId)) {\n return undefined;\n }\n\n const chat = selectChat(global, chatId)!;\n\n if (!localOnly && threadId === MAIN_THREAD_ID) {\n void callApi('clearDraft', chat);\n }\n\n global = replaceThreadParam(global, chatId, threadId, 'draft', undefined);\n global = updateChat(global, chatId, { draftDate: undefined });\n\n return global;\n});\n\naddReducer('toggleMessageWebPage', (global, actions, payload) => {\n const { chatId, threadId, noWebPage } = payload!;\n\n return replaceThreadParam(global, chatId, threadId, 'noWebPage', noWebPage);\n});\n\naddReducer('pinMessage', (global, actions, payload) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const {\n messageId, isUnpin, isOneSide, isSilent,\n } = payload!;\n\n void callApi('pinMessage', {\n chat, messageId, isUnpin, isOneSide, isSilent,\n });\n});\n\naddReducer('unpinAllMessages', (global, actions, payload) => {\n const chat = selectChat(global, payload.chatId);\n if (!chat) {\n return;\n }\n\n void unpinAllMessages(chat);\n});\n\nasync function unpinAllMessages(chat: ApiChat) {\n await callApi('unpinAllMessages', { chat });\n let global = getGlobal();\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'pinnedIds', []);\n setGlobal(global);\n}\n\naddReducer('deleteMessages', (global, actions, payload) => {\n const { messageIds, shouldDeleteForAll } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n const { chatId, threadId } = currentMessageList;\n const chat = selectChat(global, chatId)!;\n\n void callApi('deleteMessages', { chat, messageIds, shouldDeleteForAll });\n\n const editingId = selectEditingId(global, chatId, threadId);\n if (messageIds.includes(editingId)) {\n actions.setEditingId({ messageId: undefined });\n }\n});\n\naddReducer('deleteScheduledMessages', (global, actions, payload) => {\n const { messageIds } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId } = currentMessageList;\n const chat = selectChat(global, chatId)!;\n\n void callApi('deleteScheduledMessages', { chat, messageIds });\n\n const editingId = selectEditingScheduledId(global, chatId);\n if (messageIds.includes(editingId)) {\n actions.setEditingId({ messageId: undefined });\n }\n});\n\naddReducer('deleteHistory', (global, actions, payload) => {\n (async () => {\n const { chatId, shouldDeleteForAll } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const maxId = chat.lastMessage && chat.lastMessage.id;\n\n await callApi('deleteHistory', { chat, shouldDeleteForAll, maxId });\n\n const activeChat = selectCurrentMessageList(global);\n if (activeChat && activeChat.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n })();\n});\n\naddReducer('reportMessages', (global, actions, payload) => {\n (async () => {\n const {\n messageIds, reason, description,\n } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId } = currentMessageList;\n const chat = selectChat(global, chatId)!;\n\n const result = await callApi('reportMessages', {\n peer: chat, messageIds, reason, description,\n });\n\n actions.showNotification({\n message: result\n ? 'Thank you! Your report will be reviewed by our team.'\n : 'Error occured while submiting report. Please, try again later.',\n });\n })();\n});\n\naddReducer('markMessageListRead', (global, actions, payload) => {\n const { serverTimeOffset } = global;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId } = currentMessageList;\n const chat = selectThreadOriginChat(global, chatId, threadId);\n if (!chat) {\n return;\n }\n\n const { maxId } = payload!;\n\n runThrottledForMarkRead(() => {\n void callApi('markMessageListRead', {\n serverTimeOffset, chat, threadId, maxId,\n });\n });\n});\n\naddReducer('markMessagesRead', (global, actions, payload) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const { messageIds } = payload!;\n\n void callApi('markMessagesRead', { chat, messageIds });\n});\n\naddReducer('loadWebPagePreview', (global, actions, payload) => {\n const { text } = payload!;\n void loadWebPagePreview(text);\n});\n\naddReducer('clearWebPagePreview', (global) => {\n if (!global.webPagePreview) {\n return undefined;\n }\n\n return {\n ...global,\n webPagePreview: undefined,\n };\n});\n\naddReducer('sendPollVote', (global, actions, payload) => {\n const { chatId, messageId, options } = payload!;\n const chat = selectChat(global, chatId);\n\n if (chat) {\n void callApi('sendPollVote', { chat, messageId, options });\n }\n});\n\naddReducer('loadPollOptionResults', (global, actions, payload) => {\n const {\n chat, messageId, option, offset, limit, shouldResetVoters,\n } = payload!;\n\n void loadPollOptionResults(chat, messageId, option, offset, limit, shouldResetVoters);\n});\n\naddReducer('forwardMessages', (global) => {\n const { fromChatId, messageIds, toChatId } = global.forwardMessages;\n const fromChat = fromChatId ? selectChat(global, fromChatId) : undefined;\n const toChat = toChatId ? selectChat(global, toChatId) : undefined;\n const messages = fromChatId && messageIds\n ? messageIds\n .sort((a, b) => a - b)\n .map((id) => selectChatMessage(global, fromChatId, id)).filter(Boolean as any)\n : undefined;\n\n if (fromChat && toChat && messages && messages.length) {\n void forwardMessages(fromChat, toChat, messages);\n }\n});\n\naddReducer('loadScheduledHistory', (global) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const { hash } = global.scheduledMessages.byChatId[chat.id] || {};\n\n void loadScheduledHistory(chat, hash);\n});\n\naddReducer('sendScheduledMessages', (global, actions, payload) => {\n const {\n chatId, id,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('sendScheduledMessages', {\n chat,\n ids: [id],\n });\n});\n\naddReducer('rescheduleMessage', (global, actions, payload) => {\n const {\n chatId, messageId, scheduledAt,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n const message = chat && selectScheduledMessage(global, chat.id, messageId);\n if (!chat || !message) {\n return;\n }\n\n void callApi('rescheduleMessage', {\n chat,\n message,\n scheduledAt,\n });\n});\n\naddReducer('requestThreadInfoUpdate', (global, actions, payload) => {\n const { chatId, threadId } = payload;\n const chat = selectThreadOriginChat(global, chatId, threadId);\n if (!chat) {\n return;\n }\n\n void callApi('requestThreadInfoUpdate', { chat, threadId });\n});\n\nasync function loadWebPagePreview(message: string) {\n const webPagePreview = await callApi('fetchWebPagePreview', { message });\n\n setGlobal({\n ...getGlobal(),\n webPagePreview,\n });\n}\n\nasync function loadViewportMessages(\n chat: ApiChat,\n threadId: number,\n offsetId: number | undefined,\n direction: LoadMoreDirection,\n isOutlying = false,\n isBudgetPreload = false,\n) {\n const chatId = chat.id;\n\n let addOffset: number | undefined;\n switch (direction) {\n case LoadMoreDirection.Backwards:\n addOffset = undefined;\n break;\n case LoadMoreDirection.Around:\n addOffset = -(Math.round(MESSAGE_LIST_SLICE / 2) + 1);\n break;\n case LoadMoreDirection.Forwards:\n addOffset = -(MESSAGE_LIST_SLICE + 1);\n break;\n }\n\n const result = await callApi('fetchMessages', {\n chat: selectThreadOriginChat(getGlobal(), chatId, threadId)!,\n offsetId,\n addOffset,\n limit: MESSAGE_LIST_SLICE,\n threadId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, chats, threadInfos,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n global = addChatMessagesById(global, chatId, byId);\n global = isOutlying\n ? updateOutlyingIds(global, chatId, threadId, ids)\n : updateListedIds(global, chatId, threadId, ids);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n global = updateThreadInfos(global, chatId, threadInfos);\n\n let listedIds = selectListedIds(global, chatId, threadId);\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n\n if (isOutlying && listedIds && outlyingIds) {\n if (areSortedArraysIntersecting(listedIds, outlyingIds)) {\n global = updateListedIds(global, chatId, threadId, outlyingIds);\n listedIds = selectListedIds(global, chatId, threadId);\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', undefined);\n isOutlying = false;\n }\n }\n\n if (!isBudgetPreload) {\n const historyIds = isOutlying ? outlyingIds! : listedIds!;\n const { newViewportIds } = getViewportSlice(historyIds, offsetId, direction);\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds!);\n }\n\n setGlobal(global);\n}\n\nasync function loadMessage(chat: ApiChat, messageId: number, replyOriginForId: number) {\n const result = await callApi('fetchMessage', { chat, messageId });\n if (!result) {\n return;\n }\n\n if (result === MESSAGE_DELETED) {\n if (replyOriginForId) {\n let global = getGlobal();\n const replyMessage = selectChatMessage(global, chat.id, replyOriginForId);\n global = updateChatMessage(global, chat.id, replyOriginForId, {\n ...replyMessage,\n replyToMessageId: undefined,\n });\n setGlobal(global);\n }\n\n return;\n }\n\n let global = getGlobal();\n global = updateChatMessage(global, chat.id, messageId, result.message);\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n setGlobal(global);\n}\n\nfunction findClosestIndex(sourceIds: number[], offsetId: number) {\n if (offsetId < sourceIds[0]) {\n return 0;\n }\n\n if (offsetId > sourceIds[sourceIds.length - 1]) {\n return sourceIds.length - 1;\n }\n\n return sourceIds.findIndex((id, i) => (\n id === offsetId\n || (id < offsetId && sourceIds[i + 1] > offsetId)\n ));\n}\n\nfunction getViewportSlice(\n sourceIds: number[],\n offsetId: number | undefined,\n direction: LoadMoreDirection,\n) {\n const { length } = sourceIds;\n const index = offsetId ? findClosestIndex(sourceIds, offsetId) : -1;\n const isBackwards = direction === LoadMoreDirection.Backwards;\n const indexForDirection = isBackwards ? index : (index + 1) || length;\n const from = indexForDirection - MESSAGE_LIST_SLICE;\n const to = indexForDirection + MESSAGE_LIST_SLICE - 1;\n const newViewportIds = sourceIds.slice(Math.max(0, from), to + 1);\n\n let areSomeLocal;\n let areAllLocal;\n switch (direction) {\n case LoadMoreDirection.Backwards:\n areSomeLocal = indexForDirection > 0;\n areAllLocal = from >= 0;\n break;\n case LoadMoreDirection.Forwards:\n areSomeLocal = indexForDirection < length;\n areAllLocal = to <= length - 1;\n break;\n case LoadMoreDirection.Around:\n default:\n areSomeLocal = newViewportIds.length > 0;\n areAllLocal = newViewportIds.length === MESSAGE_LIST_SLICE;\n break;\n }\n\n return { newViewportIds, areSomeLocal, areAllLocal };\n}\n\nasync function sendMessage(params: {\n chat: ApiChat;\n text: string;\n entities: ApiMessageEntity[];\n replyingTo: number;\n attachment: ApiAttachment;\n sticker: ApiSticker;\n gif: ApiVideo;\n poll: ApiNewPoll;\n serverTimeOffset?: number;\n}) {\n let localId: number | undefined;\n const progressCallback = params.attachment ? (progress: number, messageLocalId: number) => {\n if (!uploadProgressCallbacks.has(messageLocalId)) {\n localId = messageLocalId;\n uploadProgressCallbacks.set(messageLocalId, progressCallback!);\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n fileUploads: {\n byMessageLocalId: {\n ...global.fileUploads.byMessageLocalId,\n [messageLocalId]: { progress },\n },\n },\n });\n } : undefined;\n\n // @optimization\n if (params.replyingTo || IS_IOS) {\n await rafPromise();\n }\n\n const global = getGlobal();\n params.serverTimeOffset = global.serverTimeOffset;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n const { threadId } = currentMessageList;\n\n if (!params.replyingTo && threadId !== MAIN_THREAD_ID) {\n params.replyingTo = selectThreadTopMessageId(global, params.chat.id, threadId)!;\n }\n\n await callApi('sendMessage', params, progressCallback);\n\n if (progressCallback && localId) {\n uploadProgressCallbacks.delete(localId);\n }\n}\n\nfunction forwardMessages(\n fromChat: ApiChat,\n toChat: ApiChat,\n messages: ApiMessage[],\n) {\n callApi('forwardMessages', {\n fromChat,\n toChat,\n messages,\n serverTimeOffset: getGlobal().serverTimeOffset,\n });\n\n setGlobal({\n ...getGlobal(),\n forwardMessages: {},\n });\n}\n\nasync function loadPollOptionResults(\n chat: ApiChat,\n messageId: number,\n option: string,\n offset?: string,\n limit?: number,\n shouldResetVoters?: boolean,\n) {\n const result = await callApi('loadPollOptionResults', {\n chat, messageId, option, offset, limit,\n });\n\n if (!result) {\n return;\n }\n\n const isUnique = (v: number, i: number, a: number[]) => a.indexOf(v) === i;\n let global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n const { voters } = global.pollResults;\n\n setGlobal({\n ...global,\n pollResults: {\n ...global.pollResults,\n voters: {\n ...voters,\n [option]: [\n ...(!shouldResetVoters && voters && voters[option] ? voters[option] : []),\n ...(result && result.users.map((user) => user.id)),\n ].filter(isUnique),\n },\n offsets: {\n ...(global.pollResults.offsets ? global.pollResults.offsets : {}),\n [option]: result.nextOffset || '',\n },\n },\n });\n}\n\naddReducer('loadPinnedMessages', (global, actions, payload) => {\n const { chatId } = payload;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void loadPinnedMessages(chat);\n});\n\nasync function loadPinnedMessages(chat: ApiChat) {\n const result = await callApi('fetchPinnedMessages', { chat });\n if (!result) {\n return;\n }\n\n const { messages, chats, users } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number).sort((a, b) => b - a);\n\n let global = getGlobal();\n global = addChatMessagesById(global, chat.id, byId);\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'pinnedIds', ids);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n setGlobal(global);\n}\n\nasync function loadScheduledHistory(chat: ApiChat, historyHash?: number) {\n const result = await callApi('fetchScheduledHistory', { chat, hash: historyHash });\n if (!result) {\n return;\n }\n\n const { hash, messages } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number).sort((a, b) => b - a);\n\n let global = getGlobal();\n global = replaceScheduledMessages(global, chat.id, byId, hash);\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'scheduledIds', ids);\n setGlobal(global);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/types';\nimport { LangCode } from '../../../types';\nimport { callApi } from '../../../api/gramjs';\nimport { pause, throttle } from '../../../util/schedulers';\nimport {\n updateStickerSets,\n updateStickerSet,\n replaceAnimatedEmojis,\n updateGifSearch,\n updateStickersForEmoji,\n rebuildStickersForEmoji,\n} from '../../reducers';\nimport searchWords from '../../../util/searchWords';\nimport { selectStickerSet } from '../../selectors';\n\nconst ADDED_SETS_THROTTLE = 500;\nconst ADDED_SETS_THROTTLE_CHUNK = 50;\n\nconst searchThrottled = throttle((cb) => cb(), 500, false);\n\naddReducer('loadStickerSets', (global) => {\n const { hash } = global.stickers.added || {};\n void loadStickerSets(hash);\n});\n\naddReducer('loadAddedStickers', (global, actions) => {\n const { setIds: addedSetIds } = global.stickers.added;\n if (!addedSetIds || !addedSetIds.length) {\n return;\n }\n\n (async () => {\n for (let i = 0; i < addedSetIds.length; i++) {\n actions.loadStickers({ stickerSetId: addedSetIds[i] });\n\n if (i % ADDED_SETS_THROTTLE_CHUNK === 0 && i > 0) {\n await pause(ADDED_SETS_THROTTLE);\n }\n }\n })();\n});\n\naddReducer('loadRecentStickers', (global) => {\n const { hash } = global.stickers.recent || {};\n void loadRecentStickers(hash);\n});\n\naddReducer('loadFavoriteStickers', (global) => {\n const { hash } = global.stickers.favorite || {};\n void loadFavoriteStickers(hash);\n});\n\naddReducer('loadGreetingStickers', (global) => {\n const { hash } = global.stickers.greeting || {};\n\n (async () => {\n const greeting = await callApi('fetchStickersForEmoji', { emoji: '👋⭐️', hash });\n\n if (!greeting) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n stickers: {\n ...newGlobal.stickers,\n greeting: {\n hash: greeting.hash,\n stickers: greeting.stickers.filter((sticker) => sticker.emoji === '👋'),\n },\n },\n });\n })();\n});\n\naddReducer('loadFeaturedStickers', (global) => {\n const { hash } = global.stickers.featured || {};\n void loadFeaturedStickers(hash);\n});\n\naddReducer('loadStickers', (global, actions, payload) => {\n const { stickerSetId } = payload!;\n let { stickerSetAccessHash } = payload!;\n\n if (!stickerSetAccessHash) {\n const stickerSet = selectStickerSet(global, stickerSetId);\n if (!stickerSet) {\n return;\n }\n\n stickerSetAccessHash = stickerSet.accessHash;\n }\n\n void loadStickers(stickerSetId, stickerSetAccessHash);\n});\n\naddReducer('loadAnimatedEmojis', () => {\n void loadAnimatedEmojis();\n});\n\naddReducer('loadSavedGifs', (global) => {\n const { hash } = global.gifs.saved;\n void loadSavedGifs(hash);\n});\n\naddReducer('faveSticker', (global, actions, payload) => {\n const { sticker } = payload!;\n\n if (sticker) {\n void callApi('faveSticker', { sticker });\n }\n});\n\naddReducer('unfaveSticker', (global, actions, payload) => {\n const { sticker } = payload!;\n\n if (sticker) {\n void unfaveSticker(sticker);\n }\n});\n\naddReducer('toggleStickerSet', (global, actions, payload) => {\n const { stickerSetId } = payload!;\n const stickerSet = selectStickerSet(global, stickerSetId);\n if (!stickerSet) {\n return;\n }\n\n const { accessHash, installedDate } = stickerSet;\n\n void callApi(!installedDate ? 'installStickerSet' : 'uninstallStickerSet', { stickerSetId, accessHash });\n});\n\naddReducer('loadEmojiKeywords', (global, actions, payload: { language: LangCode }) => {\n const { language } = payload;\n\n let currentEmojiKeywords = global.emojiKeywords[language];\n if (currentEmojiKeywords && currentEmojiKeywords.isLoading) {\n return;\n }\n\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n ...currentEmojiKeywords,\n isLoading: true,\n },\n },\n });\n\n (async () => {\n const emojiKeywords = await callApi('fetchEmojiKeywords', {\n language,\n fromVersion: currentEmojiKeywords ? currentEmojiKeywords.version : 0,\n });\n\n global = getGlobal();\n currentEmojiKeywords = global.emojiKeywords[language];\n\n if (!emojiKeywords) {\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n ...currentEmojiKeywords,\n isLoading: false,\n },\n },\n });\n\n return;\n }\n\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n isLoading: false,\n version: emojiKeywords.version,\n keywords: {\n ...(currentEmojiKeywords && currentEmojiKeywords.keywords),\n ...emojiKeywords.keywords,\n },\n },\n },\n });\n })();\n});\n\nasync function loadStickerSets(hash = 0) {\n const addedStickers = await callApi('fetchStickerSets', { hash });\n if (!addedStickers) {\n return;\n }\n\n setGlobal(updateStickerSets(\n getGlobal(),\n 'added',\n addedStickers.hash,\n addedStickers.sets,\n ));\n}\n\nasync function loadRecentStickers(hash = 0) {\n const recentStickers = await callApi('fetchRecentStickers', { hash });\n if (!recentStickers) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n recent: recentStickers,\n },\n });\n}\n\nasync function loadFavoriteStickers(hash = 0) {\n const favoriteStickers = await callApi('fetchFavoriteStickers', { hash });\n if (!favoriteStickers) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n favorite: favoriteStickers,\n },\n });\n}\n\nasync function loadFeaturedStickers(hash = 0) {\n const featuredStickers = await callApi('fetchFeaturedStickers', { hash });\n if (!featuredStickers) {\n return;\n }\n\n setGlobal(updateStickerSets(\n getGlobal(),\n 'featured',\n featuredStickers.hash,\n featuredStickers.sets,\n ));\n}\n\nasync function loadStickers(stickerSetId: string, accessHash: string) {\n const stickerSet = await callApi('fetchStickers', { stickerSetId, accessHash });\n if (!stickerSet) {\n return;\n }\n\n const { set, stickers, packs } = stickerSet;\n\n let global = getGlobal();\n\n global = updateStickerSet(global, set.id, { ...set, stickers, packs });\n\n const currentEmoji = global.stickers.forEmoji.emoji;\n if (currentEmoji && packs[currentEmoji]) {\n global = rebuildStickersForEmoji(global);\n }\n\n setGlobal(global);\n}\n\nasync function loadAnimatedEmojis() {\n const stickerSet = await callApi('fetchAnimatedEmojis');\n if (!stickerSet) {\n return;\n }\n\n const { set, stickers } = stickerSet;\n\n setGlobal(replaceAnimatedEmojis(getGlobal(), { ...set, stickers }));\n}\n\nfunction unfaveSticker(sticker: ApiSticker) {\n const global = getGlobal();\n\n // Remove sticker preemptively to get instant feedback when user removes sticker\n // from favorites while in Sticker Picker\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n favorite: {\n ...global.stickers.favorite,\n stickers: global.stickers.favorite.stickers.filter(({ id }) => id !== sticker.id),\n },\n },\n });\n\n void callApi('faveSticker', { sticker, unfave: true });\n}\n\naddReducer('setStickerSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (query) {\n void searchThrottled(() => {\n searchStickers(query);\n });\n }\n});\n\naddReducer('setGifSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (typeof query === 'string') {\n void searchThrottled(() => {\n searchGifs(query);\n });\n }\n});\n\naddReducer('searchMoreGifs', (global) => {\n const { query, offset } = global.gifs.search;\n\n if (typeof query === 'string') {\n void searchThrottled(() => {\n searchGifs(query, offset);\n });\n }\n});\n\naddReducer('loadStickersForEmoji', (global, actions, payload) => {\n const { emoji } = payload!;\n const { hash } = global.stickers.forEmoji;\n\n void searchThrottled(() => {\n loadStickersForEmoji(emoji, hash);\n });\n});\n\naddReducer('clearStickersForEmoji', (global) => {\n return {\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {},\n },\n };\n});\n\nasync function searchStickers(query: string, hash = 0) {\n const result = await callApi('searchStickers', { query, hash });\n\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n const { setsById, added } = global.stickers;\n\n const resultIds = result.sets.map(({ id }) => id);\n\n if (added.setIds) {\n added.setIds.forEach((id) => {\n if (!resultIds.includes(id)) {\n const { title } = setsById[id] || {};\n if (title && searchWords(title, query)) {\n resultIds.unshift(id);\n }\n }\n });\n }\n\n setGlobal(updateStickerSets(\n global,\n 'search',\n result.hash,\n result.sets,\n resultIds,\n ));\n}\n\nasync function searchGifs(query: string, offset?: string) {\n const result = await callApi('searchGifs', { query, offset });\n if (!result) {\n return;\n }\n\n setGlobal(updateGifSearch(getGlobal(), !offset, result.gifs, result.nextOffset));\n}\n\nasync function loadSavedGifs(hash = 0) {\n const savedGifs = await callApi('fetchSavedGifs', { hash });\n if (!savedGifs) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n gifs: {\n ...global.gifs,\n saved: savedGifs,\n },\n });\n}\n\nasync function loadStickersForEmoji(emoji: string, hash = 0) {\n let global = getGlobal();\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {\n ...global.stickers.forEmoji,\n emoji,\n },\n },\n });\n\n const result = await callApi('fetchStickersForEmoji', { emoji, hash });\n\n global = getGlobal();\n\n if (!result || global.stickers.forEmoji.emoji !== emoji) {\n return;\n }\n\n global = updateStickersForEmoji(global, emoji, result.stickers, result.hash);\n\n setGlobal(global);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { callApi } from '../../../api/gramjs';\nimport { ApiChat, ApiGlobalMessageSearchType } from '../../../api/types';\n\nimport {\n addChats,\n addMessages,\n addUsers,\n updateGlobalSearch,\n updateGlobalSearchFetchingStatus,\n updateGlobalSearchResults,\n} from '../../reducers';\nimport { throttle } from '../../../util/schedulers';\nimport { selectChat, selectCurrentGlobalSearchQuery } from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { GLOBAL_SEARCH_SLICE } from '../../../config';\nimport { timestampPlusDay } from '../../../util/dateFormat';\n\nconst searchThrottled = throttle((cb) => cb(), 500, false);\n\naddReducer('setGlobalSearchQuery', (global, actions, payload) => {\n const { chatId } = global.globalSearch;\n const { query } = payload!;\n\n if (query && !chatId) {\n void searchThrottled(() => {\n searchChats(query);\n });\n }\n});\n\naddReducer('setGlobalSearchDate', (global, actions, payload) => {\n const { date } = payload!;\n const maxDate = date ? timestampPlusDay(date) : date;\n const newGlobal = updateGlobalSearch(global, {\n date,\n query: '',\n resultsByType: {\n ...global.globalSearch.resultsByType,\n text: {\n totalCount: undefined,\n foundIds: [],\n nextOffsetId: 0,\n },\n },\n });\n setGlobal(newGlobal);\n const { chatId } = global.globalSearch;\n const chat = chatId ? selectChat(global, chatId) : undefined;\n searchMessagesGlobal('', 'text', undefined, chat, maxDate, date);\n});\n\naddReducer('searchMessagesGlobal', (global, actions, payload) => {\n const {\n query, resultsByType, chatId, date,\n } = global.globalSearch;\n const maxDate = date ? timestampPlusDay(date) : date;\n const { type } = payload;\n const { nextOffsetId } = (resultsByType && resultsByType[type as ApiGlobalMessageSearchType]) || {};\n\n const chat = chatId ? selectChat(global, chatId) : undefined;\n\n searchMessagesGlobal(query, type, nextOffsetId, chat, maxDate, date);\n});\n\nasync function searchChats(query: string) {\n const result = await callApi('searchChats', { query });\n\n let global = getGlobal();\n const currentSearchQuery = selectCurrentGlobalSearchQuery(global);\n if (!result || !currentSearchQuery || (query !== currentSearchQuery)) {\n setGlobal(updateGlobalSearchFetchingStatus(global, { chats: false }));\n return;\n }\n\n const {\n localChats, localUsers, globalChats, globalUsers,\n } = result;\n\n if (localChats.length || globalChats.length) {\n global = addChats(global, buildCollectionByKey([...localChats, ...globalChats], 'id'));\n }\n\n if (localUsers.length || globalUsers.length) {\n global = addUsers(global, buildCollectionByKey([...localUsers, ...globalUsers], 'id'));\n }\n\n global = updateGlobalSearchFetchingStatus(global, { chats: false });\n global = updateGlobalSearch(global, {\n localResults: {\n chatIds: localChats.map(({ id }) => id),\n userIds: localUsers.map(({ id }) => id),\n },\n globalResults: {\n ...global.globalSearch.globalResults,\n chatIds: globalUsers.map(({ id }) => id),\n userIds: globalChats.map(({ id }) => id),\n },\n });\n\n setGlobal(global);\n}\n\nasync function searchMessagesGlobal(\n query = '', type: ApiGlobalMessageSearchType, offsetRate?: number, chat?: ApiChat, maxDate?: number, minDate?: number,\n) {\n let result;\n\n if (chat) {\n const localResult = await callApi('searchMessagesLocal', {\n chatOrUser: chat,\n query,\n type,\n limit: GLOBAL_SEARCH_SLICE,\n offsetId: offsetRate,\n minDate,\n maxDate,\n });\n\n if (localResult) {\n const {\n messages, users, totalCount, nextOffsetId,\n } = localResult;\n\n result = {\n messages,\n users,\n chats: [],\n totalCount,\n nextRate: nextOffsetId,\n };\n }\n } else {\n result = await callApi('searchMessagesGlobal', {\n query,\n offsetRate,\n limit: GLOBAL_SEARCH_SLICE,\n type,\n maxDate,\n minDate,\n });\n }\n\n let global = getGlobal();\n const currentSearchQuery = selectCurrentGlobalSearchQuery(global);\n if (!result || (query !== '' && query !== currentSearchQuery)) {\n setGlobal(updateGlobalSearchFetchingStatus(global, { messages: false }));\n return;\n }\n\n const {\n messages, users, chats, totalCount, nextRate,\n } = result;\n\n if (chats.length) {\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n }\n\n if (users.length) {\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n if (messages.length) {\n global = addMessages(global, messages);\n }\n\n global = updateGlobalSearchResults(\n global,\n messages,\n totalCount,\n type,\n nextRate,\n );\n\n setGlobal(global);\n}\n","import {\n addReducer, getGlobal, setGlobal, getDispatch,\n} from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiFormattedText, ApiUser, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport {\n CHAT_LIST_LOAD_SLICE, DEBUG, MESSAGE_LIST_SLICE,\n} from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport {\n replaceChatListIds,\n replaceChats,\n replaceUsers,\n updateUsers,\n updateChats,\n updateChatListSecondaryInfo,\n updateThreadInfos,\n replaceThreadParam,\n} from '../../reducers';\nimport {\n selectUser, selectChat, selectCurrentMessageList, selectDraft, selectChatMessage, selectThreadInfo,\n} from '../../selectors';\nimport { isChatPrivate } from '../../helpers';\n\naddReducer('sync', (global, actions) => {\n void sync(actions.afterSync);\n});\n\naddReducer('afterSync', (global, actions) => {\n void afterSync(actions);\n});\n\nasync function sync(afterSyncCallback: () => void) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START SYNC');\n }\n\n await callApi('fetchCurrentUser');\n\n // This fetches only active chats and clears archived chats, which will be fetched in `afterSync`\n const savedUsers = await loadAndReplaceChats();\n await loadAndReplaceMessages(savedUsers);\n\n setGlobal({\n ...getGlobal(),\n lastSyncTime: Date.now(),\n });\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH SYNC');\n }\n\n afterSyncCallback();\n}\n\nasync function afterSync(actions: GlobalActions) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START AFTER-SYNC');\n }\n\n actions.loadFavoriteStickers();\n\n await Promise.all([\n loadAndUpdateUsers(),\n loadAndReplaceArchivedChats(),\n ]);\n\n await callApi('fetchCurrentUser');\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH AFTER-SYNC');\n }\n}\n\nasync function loadAndReplaceChats() {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n withPinned: true,\n serverTimeOffset: getGlobal().serverTimeOffset,\n });\n if (!result) {\n return undefined;\n }\n\n let global = getGlobal();\n\n const { recentlyFoundChatIds } = global.globalSearch;\n const { userIds: contactIds } = global.contactList || {};\n const { currentUserId } = global;\n\n const savedPrivateChatIds = [\n ...(recentlyFoundChatIds || []),\n ...(contactIds || []),\n ...(currentUserId ? [currentUserId] : []),\n ];\n\n const savedUsers = savedPrivateChatIds\n .map((id) => selectUser(global, id))\n .filter(Boolean as any);\n\n const savedChats = savedPrivateChatIds\n .map((id) => selectChat(global, id))\n .filter(Boolean as any);\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n if (currentChatId) {\n const selectedChat = selectChat(global, currentChatId);\n if (selectedChat && !savedPrivateChatIds.includes(currentChatId)) {\n savedChats.push(selectedChat);\n }\n\n if (isChatPrivate(currentChatId)) {\n const selectedChatUser = selectUser(global, currentChatId);\n if (selectedChatUser && !savedPrivateChatIds.includes(currentChatId)) {\n savedUsers.push(selectedChatUser);\n }\n }\n }\n\n savedUsers.push(...result.users);\n savedChats.push(...result.chats);\n\n global = replaceChats(global, buildCollectionByKey(savedChats, 'id'));\n global = replaceChatListIds(global, 'active', result.chatIds);\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n },\n };\n\n global = updateChatListSecondaryInfo(global, 'active', result);\n\n Object.keys(result.draftsById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId]);\n });\n\n Object.keys(result.replyingToById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId],\n );\n });\n\n setGlobal(global);\n\n if (currentChatId && !global.chats.byId[currentChatId]) {\n getDispatch().openChat({ id: undefined });\n }\n\n return savedUsers;\n}\n\nasync function loadAndReplaceArchivedChats() {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n archived: true,\n withPinned: true,\n serverTimeOffset: getGlobal().serverTimeOffset,\n });\n\n if (!result) {\n return;\n }\n\n let global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(result.users, 'id'));\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = replaceChatListIds(global, 'archived', result.chatIds);\n global = updateChatListSecondaryInfo(global, 'archived', result);\n setGlobal(global);\n}\n\nasync function loadAndReplaceMessages(savedUsers?: ApiUser[]) {\n let areMessagesLoaded = false;\n let users = savedUsers || [];\n\n let global = getGlobal();\n const { chatId: currentChatId, threadId: currentThreadId } = selectCurrentMessageList(global) || {};\n\n // Memoize drafts\n const draftChatIds = Object.keys(global.messages.byChatId).map(Number);\n const draftsByChatId = draftChatIds.reduce>((acc, chatId) => {\n const draft = selectDraft(global, chatId, MAIN_THREAD_ID);\n return draft ? { ...acc, [chatId]: draft } : acc;\n }, {});\n\n if (currentChatId) {\n const result = await loadTopMessages(global.chats.byId[currentChatId]);\n global = getGlobal();\n const { chatId: newCurrentChatId } = selectCurrentMessageList(global) || {};\n const threadInfo = currentThreadId && selectThreadInfo(global, currentChatId, currentThreadId);\n\n if (result && newCurrentChatId === currentChatId) {\n const currentMessageListInfo = global.messages.byChatId[currentChatId];\n const byId = buildCollectionByKey(result.messages, 'id');\n const listedIds = Object.keys(byId).map(Number);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n [currentChatId]: {\n byId,\n threadsById: {\n [MAIN_THREAD_ID]: {\n ...(currentMessageListInfo && currentMessageListInfo.threadsById[MAIN_THREAD_ID]),\n listedIds,\n viewportIds: listedIds,\n outlyingIds: undefined,\n },\n },\n },\n },\n },\n };\n\n if (currentThreadId && threadInfo && threadInfo.originChannelId) {\n const { originChannelId } = threadInfo;\n const currentMessageListInfoOrigin = global.messages.byChatId[originChannelId];\n const resultOrigin = await loadTopMessages(global.chats.byId[originChannelId]);\n if (resultOrigin) {\n const byIdOrigin = buildCollectionByKey(resultOrigin.messages, 'id');\n const listedIdsOrigin = Object.keys(byIdOrigin)\n .map(Number);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n ...global.messages.byChatId,\n [threadInfo.originChannelId]: {\n byId: byIdOrigin,\n threadsById: {\n [MAIN_THREAD_ID]: {\n ...(currentMessageListInfoOrigin && currentMessageListInfoOrigin.threadsById[MAIN_THREAD_ID]),\n listedIds: listedIdsOrigin,\n viewportIds: listedIdsOrigin,\n outlyingIds: undefined,\n },\n },\n },\n [currentChatId]: {\n ...global.messages.byChatId[currentChatId],\n threadsById: {\n ...global.messages.byChatId[currentChatId].threadsById,\n [currentThreadId]: {\n ...(currentMessageListInfo && currentMessageListInfo.threadsById[currentThreadId]),\n outlyingIds: undefined,\n },\n },\n },\n },\n },\n };\n }\n }\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = updateThreadInfos(global, currentChatId, result.threadInfos);\n\n areMessagesLoaded = true;\n users = Array.prototype.concat(users, result.users);\n }\n }\n\n if (!areMessagesLoaded) {\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {},\n },\n };\n }\n\n // Restore drafts\n Object.keys(draftsByChatId).map(Number).forEach((chatId) => {\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', draftsByChatId[chatId]);\n });\n\n if (savedUsers) {\n global = replaceUsers(global, buildCollectionByKey(users, 'id'));\n } else if (users) {\n // If `fetchChats` has failed for some reason, we don't have saved chats, thus we can not replace\n global = updateUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n setGlobal(global);\n\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n if (audioChatId && audioMessageId && !selectChatMessage(global, audioChatId, audioMessageId)) {\n getDispatch().closeAudioPlayer();\n }\n}\n\nasync function loadAndUpdateUsers() {\n let global = getGlobal();\n const { recentlyFoundChatIds } = global.globalSearch;\n const { userIds: contactIds } = global.contactList || {};\n if (\n (!contactIds || !contactIds.length)\n && (!recentlyFoundChatIds || !recentlyFoundChatIds.length)\n ) {\n return;\n }\n\n const users = [\n ...(recentlyFoundChatIds || []),\n ...(contactIds || []),\n ].map((id) => selectUser(global, id)).filter(Boolean as any);\n\n const updatedUsers = await callApi('fetchUsers', { users });\n if (!updatedUsers) {\n return;\n }\n\n global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(updatedUsers, 'id'));\n setGlobal(global);\n}\n\nfunction loadTopMessages(chat: ApiChat) {\n return callApi('fetchMessages', {\n chat,\n threadId: MAIN_THREAD_ID,\n offsetId: chat.lastReadInboxMessageId,\n addOffset: -(Math.round(MESSAGE_LIST_SLICE / 2) + 1),\n limit: MESSAGE_LIST_SLICE,\n });\n}\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser, MAIN_THREAD_ID } from '../../../api/types';\n\nimport { MESSAGE_SEARCH_SLICE, SHARED_MEDIA_SLICE } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n selectCurrentTextSearch,\n selectCurrentMediaSearchPeerId,\n selectCurrentMediaSearch, selectCurrentMessageList, selectChat, selectThreadInfo,\n} from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport {\n addChatMessagesById,\n addUsers,\n updateLocalMediaSearchResults,\n updateLocalTextSearchResults,\n} from '../../reducers';\nimport { SharedMediaType } from '../../../types';\n\naddReducer('searchTextMessagesLocal', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const currentSearch = selectCurrentTextSearch(global);\n if (!chat || !currentSearch || !threadId) {\n return;\n }\n\n const { query, results } = currentSearch;\n const offsetId = results ? results.nextOffsetId : undefined;\n\n let topMessageId: number | undefined;\n if (threadId !== MAIN_THREAD_ID) {\n const threadInfo = selectThreadInfo(global, chatId!, threadId);\n topMessageId = threadInfo ? threadInfo.topMessageId : undefined;\n }\n\n void searchTextMessages(chat, threadId, topMessageId, query, offsetId);\n});\n\naddReducer('searchMediaMessagesLocal', (global) => {\n const peerId = selectCurrentMediaSearchPeerId(global);\n const chatOrUser = peerId\n ? global.users.byId[peerId] || global.chats.byId[peerId]\n : undefined;\n const currentSearch = selectCurrentMediaSearch(global);\n\n if (!chatOrUser || !currentSearch) {\n return;\n }\n\n const { currentType: type, resultsByType } = currentSearch;\n const currentResults = type && resultsByType && resultsByType[type];\n const offsetId = currentResults ? currentResults.nextOffsetId : undefined;\n\n if (!type) {\n return;\n }\n\n void searchSharedMedia(chatOrUser, type, offsetId);\n});\n\naddReducer('searchMessagesByDate', (global, actions, payload) => {\n const { timestamp } = payload!;\n\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return;\n }\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void searchMessagesByDate(chat, timestamp);\n});\n\nasync function searchTextMessages(\n chatOrUser: ApiChat,\n threadId: number,\n topMessageId?: number,\n query?: string,\n offsetId?: number,\n) {\n const result = await callApi('searchMessagesLocal', {\n chatOrUser,\n type: 'text',\n query,\n topMessageId,\n limit: MESSAGE_SEARCH_SLICE,\n offsetId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, totalCount, nextOffsetId,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const newFoundIds = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n const currentSearch = selectCurrentTextSearch(global);\n if (!currentSearch || (query && query !== currentSearch.query)) {\n return;\n }\n\n global = addChatMessagesById(global, chatOrUser.id, byId);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateLocalTextSearchResults(global, chatOrUser.id, threadId, newFoundIds, totalCount, nextOffsetId);\n setGlobal(global);\n}\n\nasync function searchSharedMedia(\n chatOrUser: ApiChat | ApiUser,\n type: SharedMediaType,\n offsetId?: number,\n) {\n const result = await callApi('searchMessagesLocal', {\n chatOrUser,\n type,\n limit: SHARED_MEDIA_SLICE,\n offsetId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, totalCount, nextOffsetId,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const newFoundIds = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n const currentSearch = selectCurrentMediaSearch(global);\n if (!currentSearch) {\n return;\n }\n\n global = addChatMessagesById(global, chatOrUser.id, byId);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateLocalMediaSearchResults(global, chatOrUser.id, type, newFoundIds, totalCount, nextOffsetId);\n setGlobal(global);\n}\n\n/**\n * @param timestamp start of target date in seconds\n */\nasync function searchMessagesByDate(chat: ApiChat, timestamp: number) {\n const messageId = await callApi('findFirstMessageIdAfterDate', {\n chat,\n timestamp,\n });\n\n if (!messageId) {\n return;\n }\n\n getDispatch().focusMessage({\n chatId: chat.id,\n messageId,\n });\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementProgress } from '../../../types';\nimport { callApi } from '../../../api/gramjs';\nimport { updateManagement, updateManagementProgress } from '../../reducers';\nimport { selectChat, selectCurrentMessageList } from '../../selectors';\nimport { isChatBasicGroup } from '../../helpers';\n\naddReducer('checkPublicLink', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return;\n }\n\n // No need to check the username if already in progress\n if (global.management.progress === ManagementProgress.InProgress) {\n return;\n }\n\n const { username } = payload!;\n\n (async () => {\n global = updateManagementProgress(global, ManagementProgress.InProgress);\n global = updateManagement(global, chatId, { isUsernameAvailable: undefined });\n setGlobal(global);\n\n const isUsernameAvailable = await callApi('checkChatUsername', { username })!;\n\n global = getGlobal();\n global = updateManagementProgress(\n global, isUsernameAvailable ? ManagementProgress.Complete : ManagementProgress.Error,\n );\n global = updateManagement(global, chatId, { isUsernameAvailable });\n setGlobal(global);\n })();\n});\n\naddReducer('updatePublicLink', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n let chat = chatId && selectChat(global, chatId);\n if (!chatId || !chat) {\n return;\n }\n\n const { username } = payload!;\n\n (async () => {\n global = updateManagementProgress(global, ManagementProgress.InProgress);\n setGlobal(global);\n\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n const result = await callApi('setChatUsername', { chat, username });\n\n global = getGlobal();\n global = updateManagementProgress(global, result ? ManagementProgress.Complete : ManagementProgress.Error);\n global = updateManagement(global, chatId, { isUsernameAvailable: undefined });\n setGlobal(global);\n })();\n});\n\naddReducer('updatePrivateLink', (global) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId && selectChat(global, chatId);\n if (!chatId || !chat) {\n return;\n }\n\n callApi('updatePrivateLink', { chat });\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { debounce, throttle } from '../../../util/schedulers';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { isChatPrivate } from '../../helpers';\nimport { callApi } from '../../../api/gramjs';\nimport { selectChat, selectUser } from '../../selectors';\nimport {\n addChats, addUsers, updateChat, updateManagementProgress, updateUser, updateUsers,\n updateUserSearch, updateUserSearchFetchingStatus,\n} from '../../reducers';\n\nconst runDebouncedForFetchFullUser = debounce((cb) => cb(), 500, false, true);\nconst TOP_PEERS_REQUEST_COOLDOWN = 60; // 1 min\nconst runThrottledForSearch = throttle((cb) => cb(), 500, false);\n\naddReducer('loadFullUser', (global, actions, payload) => {\n const { userId } = payload!;\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n const { id, accessHash } = user;\n\n runDebouncedForFetchFullUser(() => callApi('fetchFullUser', { id, accessHash }));\n});\n\naddReducer('loadUser', (global, actions, payload) => {\n const { userId } = payload!;\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n (async () => {\n const updatedUsers = await callApi('fetchUsers', { users: [user] });\n if (!updatedUsers) {\n return;\n }\n\n global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(updatedUsers, 'id'));\n setGlobal(global);\n })();\n});\n\naddReducer('loadTopUsers', (global) => {\n const {\n serverTimeOffset,\n topPeers: {\n hash, lastRequestedAt,\n },\n } = global;\n\n if (!lastRequestedAt || Date.now() / 1000 + serverTimeOffset - lastRequestedAt > TOP_PEERS_REQUEST_COOLDOWN) {\n void loadTopUsers(hash);\n }\n});\n\naddReducer('loadContactList', (global) => {\n const { hash } = global.contactList || {};\n void loadContactList(hash);\n});\n\naddReducer('loadCurrentUser', () => {\n void callApi('fetchCurrentUser');\n});\n\naddReducer('updateContact', (global, actions, payload) => {\n const {\n userId, isMuted, firstName, lastName,\n } = payload!;\n\n void updateContact(userId, isMuted, firstName, lastName);\n});\n\naddReducer('deleteUser', (global, actions, payload) => {\n const { userId } = payload!;\n\n void deleteUser(userId);\n});\n\nasync function loadTopUsers(usersHash?: number) {\n const result = await callApi('fetchTopUsers', { hash: usersHash });\n if (!result) {\n return;\n }\n\n const { hash, ids, users } = result;\n\n let global = getGlobal();\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = {\n ...global,\n topPeers: {\n ...global.topPeers,\n hash,\n userIds: ids,\n lastRequestedAt: Date.now() / 1000 + global.serverTimeOffset,\n },\n };\n setGlobal(global);\n}\n\nasync function loadContactList(hash?: number) {\n const contactList = await callApi('fetchContactList', { hash });\n if (!contactList) {\n return;\n }\n\n let global = addUsers(getGlobal(), buildCollectionByKey(contactList.users, 'id'));\n global = addChats(global, buildCollectionByKey(contactList.chats, 'id'));\n\n // Sort contact list by Last Name (or First Name), with latin names being placed first\n const getCompareString = (user: ApiUser) => (user.lastName || user.firstName || '');\n const collator = new Intl.Collator('en-US');\n\n const sortedUsers = contactList.users.sort((a, b) => (\n collator.compare(getCompareString(a), getCompareString(b))\n )).filter((user) => !user.isSelf);\n\n setGlobal({\n ...global,\n contactList: {\n hash: contactList.hash,\n userIds: sortedUsers.map((user) => user.id),\n },\n });\n}\n\nasync function updateContact(\n userId: number,\n isMuted: boolean,\n firstName: string,\n lastName?: string,\n) {\n const global = getGlobal();\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n getDispatch().updateChatMutedState({ chatId: userId, isMuted });\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress));\n\n const result = await callApi('updateContact', { phone: user.phoneNumber, firstName, lastName });\n\n if (result) {\n setGlobal(updateUser(\n getGlobal(),\n user.id,\n {\n firstName,\n lastName,\n },\n ));\n }\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.Complete));\n}\n\nasync function deleteUser(userId: number) {\n const global = getGlobal();\n const user = selectUser(global, userId);\n\n if (!user) {\n return;\n }\n\n const { id, accessHash } = user;\n\n await callApi('deleteUser', { id, accessHash });\n}\n\naddReducer('loadProfilePhotos', (global, actions, payload) => {\n const { profileId } = payload!;\n const isPrivate = isChatPrivate(profileId);\n const user = isPrivate ? selectUser(global, profileId) : undefined;\n const chat = !isPrivate ? selectChat(global, profileId) : undefined;\n\n (async () => {\n const result = await callApi('fetchProfilePhotos', user, chat);\n if (!result || !result.photos) {\n return;\n }\n\n let newGlobal = getGlobal();\n if (isPrivate) {\n newGlobal = updateUser(newGlobal, profileId, { photos: result.photos });\n } else {\n newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users!, 'id'));\n newGlobal = updateChat(newGlobal, profileId, { photos: result.photos });\n }\n\n setGlobal(newGlobal);\n })();\n});\n\n\naddReducer('setUserSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (!query) return;\n\n void runThrottledForSearch(() => {\n searchUsers(query);\n });\n});\n\nasync function searchUsers(query: string) {\n const result = await callApi('searchChats', { query });\n\n let global = getGlobal();\n const currentSearchQuery = global.userSearch.query;\n\n if (!result || !currentSearchQuery || (query !== currentSearchQuery)) {\n setGlobal(updateUserSearchFetchingStatus(global, false));\n return;\n }\n\n const { localUsers, globalUsers } = result;\n\n let localUserIds;\n let globalUserIds;\n if (localUsers.length) {\n global = addUsers(global, buildCollectionByKey(localUsers, 'id'));\n localUserIds = localUsers.map(({ id }) => id);\n }\n if (globalUsers.length) {\n global = addUsers(global, buildCollectionByKey(globalUsers, 'id'));\n globalUserIds = globalUsers.map(({ id }) => id);\n }\n\n global = updateUserSearchFetchingStatus(global, false);\n global = updateUserSearch(global, { localUserIds, globalUserIds });\n\n setGlobal(global);\n}\n","import { GlobalState } from '../../global/types';\nimport { InlineBotSettings } from '../../types';\n\n\nexport function replaceInlineBotSettings(\n global: GlobalState, username: string, inlineBotSettings: InlineBotSettings | false,\n): GlobalState {\n return {\n ...global,\n inlineBots: {\n ...global.inlineBots,\n byUsername: {\n ...global.inlineBots.byUsername,\n [username]: inlineBotSettings,\n },\n },\n };\n}\n\nexport function replaceInlineBotsIsLoading(global: GlobalState, isLoading: boolean): GlobalState {\n return {\n ...global,\n inlineBots: {\n ...global.inlineBots,\n isLoading,\n },\n };\n}\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../api/types';\nimport { InlineBotSettings } from '../../../types';\n\nimport { RE_TME_INVITE_LINK, RE_TME_LINK } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n selectChat, selectChatBot, selectChatMessage, selectCurrentChat, selectCurrentMessageList,\n selectReplyingToId, selectUser,\n} from '../../selectors';\nimport { addChats, addUsers, removeBlockedContact } from '../../reducers';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { debounce } from '../../../util/schedulers';\nimport { replaceInlineBotSettings, replaceInlineBotsIsLoading } from '../../reducers/bots';\n\nconst TOP_PEERS_REQUEST_COOLDOWN = 60000; // 1 min\nconst runDebouncedForSearch = debounce((cb) => cb(), 500, false);\n\naddReducer('clickInlineButton', (global, actions, payload) => {\n const { button } = payload;\n\n switch (button.type) {\n case 'command':\n actions.sendBotCommand({ command: button.value });\n break;\n case 'url':\n if (button.value.match(RE_TME_INVITE_LINK) || button.value.match(RE_TME_LINK)) {\n actions.openTelegramLink({ url: button.value });\n } else {\n actions.toggleSafeLinkModal({ url: button.value });\n }\n break;\n case 'callback': {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n void answerCallbackButton(chat, button.messageId, button.value);\n break;\n }\n case 'requestPoll':\n actions.openPollModal();\n break;\n case 'buy': {\n const chat = selectCurrentChat(global);\n const { messageId, value } = button;\n if (!chat) {\n return;\n }\n\n if (value) {\n actions.getReceipt({ receiptMessageId: value, chatId: chat.id, messageId });\n } else {\n actions.getPaymentForm({ messageId });\n actions.setInvoiceMessageInfo(selectChatMessage(global, chat.id, messageId));\n actions.openPaymentModal({ messageId });\n }\n break;\n }\n }\n});\n\naddReducer('sendBotCommand', (global, actions, payload) => {\n const { command, chatId } = payload;\n const { currentUserId } = global;\n const chat = chatId ? selectChat(global, chatId) : selectCurrentChat(global);\n if (!currentUserId || !chat) {\n return;\n }\n\n void sendBotCommand(chat, currentUserId, command);\n});\n\naddReducer('restartBot', (global, actions, payload) => {\n const { chatId } = payload;\n const { currentUserId } = global;\n const chat = selectCurrentChat(global);\n const bot = currentUserId && selectChatBot(global, chatId);\n if (!currentUserId || !chat || !bot) {\n return;\n }\n\n (async () => {\n const result = await callApi('unblockContact', bot.id, bot.accessHash);\n if (!result) {\n return;\n }\n\n setGlobal(removeBlockedContact(getGlobal(), bot.id));\n void sendBotCommand(chat, currentUserId, '/start');\n })();\n});\n\naddReducer('loadTopInlineBots', (global) => {\n const { serverTimeOffset } = global;\n const { hash, lastRequestedAt } = global.topInlineBots;\n\n if (lastRequestedAt && Date.now() + serverTimeOffset - lastRequestedAt < TOP_PEERS_REQUEST_COOLDOWN) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchTopInlineBots', { hash });\n if (!result) {\n return;\n }\n\n const { hash: newHash, ids, users } = result;\n\n let newGlobal = getGlobal();\n newGlobal = addUsers(newGlobal, buildCollectionByKey(users, 'id'));\n newGlobal = {\n ...newGlobal,\n topInlineBots: {\n ...newGlobal.topInlineBots,\n hash: newHash,\n userIds: ids,\n lastRequestedAt: Date.now(),\n },\n };\n setGlobal(newGlobal);\n })();\n});\n\naddReducer('queryInlineBot', ((global, actions, payload) => {\n const {\n chatId, username, query, offset,\n } = payload;\n\n (async () => {\n let inlineBotData = global.inlineBots.byUsername[username];\n\n if (inlineBotData === false) {\n return;\n }\n\n if (inlineBotData === undefined) {\n const { user: inlineBot, chat } = await callApi('fetchInlineBot', { username }) || {};\n global = getGlobal();\n if (!inlineBot || !chat) {\n setGlobal(replaceInlineBotSettings(global, username, false));\n return;\n }\n\n global = addUsers(global, { [inlineBot.id]: inlineBot });\n global = addChats(global, { [chat.id]: chat });\n inlineBotData = {\n id: inlineBot.id,\n query: '',\n offset: '',\n switchPm: undefined,\n canLoadMore: true,\n results: [],\n };\n\n global = replaceInlineBotSettings(global, username, inlineBotData);\n setGlobal(global);\n }\n\n if (query === inlineBotData.query && !inlineBotData.canLoadMore) {\n return;\n }\n\n void runDebouncedForSearch(() => {\n searchInlineBot({\n username,\n inlineBotData: inlineBotData as InlineBotSettings,\n chatId,\n query,\n offset,\n });\n });\n })();\n}));\n\naddReducer('sendInlineBotResult', (global, actions, payload) => {\n const { id, queryId } = payload;\n const currentMessageList = selectCurrentMessageList(global);\n\n if (!currentMessageList || !id) {\n return;\n }\n\n const { chatId, threadId } = currentMessageList;\n\n const chat = selectChat(global, chatId)!;\n\n actions.setReplyingToId({ messageId: undefined });\n actions.clearWebPagePreview({ chatId, threadId, value: false });\n\n void callApi('sendInlineBotResult', {\n chat,\n resultId: id,\n queryId,\n replyingTo: selectReplyingToId(global, chatId, threadId),\n });\n});\n\naddReducer('resetInlineBot', ((global, actions, payload) => {\n const { username } = payload;\n\n let inlineBotData = global.inlineBots.byUsername[username];\n\n if (!inlineBotData) {\n return;\n }\n\n inlineBotData = {\n id: inlineBotData.id,\n query: '',\n offset: '',\n switchPm: undefined,\n canLoadMore: true,\n results: [],\n };\n\n setGlobal(replaceInlineBotSettings(global, username, inlineBotData));\n}));\n\nasync function searchInlineBot({\n username,\n inlineBotData,\n chatId,\n query,\n offset,\n} : {\n username: string;\n inlineBotData: InlineBotSettings;\n chatId: number;\n query: string;\n offset?: string;\n}) {\n let global = getGlobal();\n const bot = selectUser(global, inlineBotData.id);\n const chat = selectChat(global, chatId);\n if (!bot || !chat) {\n return;\n }\n\n const shouldReplaceSettings = inlineBotData.query !== query;\n global = replaceInlineBotsIsLoading(global, true);\n global = replaceInlineBotSettings(global, username, {\n ...inlineBotData,\n query,\n ...(shouldReplaceSettings && { offset: undefined, results: [] }),\n });\n setGlobal(global);\n\n const result = await callApi('fetchInlineBotResults', {\n bot,\n chat,\n query,\n offset: shouldReplaceSettings ? undefined : offset,\n });\n\n const newInlineBotData = global.inlineBots.byUsername[username];\n global = replaceInlineBotsIsLoading(getGlobal(), false);\n if (!result || !newInlineBotData || query !== newInlineBotData.query) {\n setGlobal(global);\n return;\n }\n\n const currentIds = new Set((newInlineBotData.results || []).map((data) => data.id));\n const newResults = result.results.filter((data) => !currentIds.has(data.id));\n\n global = replaceInlineBotSettings(global, username, {\n ...newInlineBotData,\n help: result.help,\n ...(newResults.length && { isGallery: result.isGallery }),\n ...(result.switchPm && { switchPm: result.switchPm }),\n canLoadMore: result.results.length > 0 && Boolean(result.nextOffset),\n results: newInlineBotData.offset === '' || newInlineBotData.offset === result.nextOffset\n ? result.results\n : (newInlineBotData.results || []).concat(newResults),\n offset: newResults.length ? result.nextOffset : '',\n });\n\n setGlobal(global);\n}\n\nasync function sendBotCommand(chat: ApiChat, currentUserId: number, command: string) {\n await callApi('sendMessage', {\n chat,\n text: command,\n });\n}\n\nasync function answerCallbackButton(chat: ApiChat, messageId: number, data: string) {\n const result = await callApi('answerCallbackButton', {\n chatId: chat.id,\n accessHash: chat.accessHash,\n messageId,\n data,\n });\n\n if (!result || !result.message) {\n return;\n }\n\n const { message, alert: isError } = result;\n\n if (isError) {\n getDispatch().showDialog({ data: { message } });\n } else {\n getDispatch().showNotification({ message });\n }\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { callApi } from '../../../api/gramjs';\nimport { replaceSettings, updateTwoFaSettings } from '../../reducers';\n\naddReducer('loadPasswordInfo', () => {\n (async () => {\n const result = await callApi('getPasswordInfo');\n if (!result) {\n return;\n }\n\n let global = getGlobal();\n global = replaceSettings(global, { hasPassword: result.hasPassword });\n global = updateTwoFaSettings(global, { hint: result.hint });\n setGlobal(global);\n })();\n});\n\naddReducer('checkPassword', (global, actions, payload) => {\n const { currentPassword, onSuccess } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('checkPassword', currentPassword);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('clearPassword', (global, actions, payload) => {\n const { currentPassword, onSuccess } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('clearPassword', currentPassword);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('updatePassword', (global, actions, payload) => {\n const {\n currentPassword, password, hint, email, onSuccess,\n } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('updatePassword', currentPassword, password, hint, email);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('updateRecoveryEmail', (global, actions, payload) => {\n const {\n currentPassword, email, onSuccess,\n } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('updateRecoveryEmail', currentPassword, email);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false, waitingEmailCodeLength: undefined }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('provideTwoFaEmailCode', (global, actions, payload) => {\n const { code } = payload;\n\n void callApi('provideRecoveryEmailCode', code);\n});\n\naddReducer('clearTwoFaError', (global) => {\n return updateTwoFaSettings(global, { error: undefined });\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { PaymentStep } from '../../../types/index';\nimport { callApi } from '../../../api/gramjs';\nimport {\n selectPaymentMessageId,\n selectPaymentRequestId,\n selectProviderPublishableKey,\n selectStripeCredentials,\n selectChatMessage,\n} from '../../selectors';\n\nimport { getStripeError } from '../../helpers/payments';\nimport { buildQueryString } from '../../../util/requestQuery';\n\nimport {\n updateShippingOptions,\n setPaymentStep,\n setRequestInfoId,\n setPaymentForm,\n setStripeCardInfo,\n setInvoiceMessageInfo,\n setReceipt,\n clearPayment,\n closeInvoice,\n} from '../../reducers';\n\naddReducer('validateRequestedInfo', (global, actions, payload) => {\n const { requestInfo, saveInfo } = payload;\n const messageId = selectPaymentMessageId(global);\n if (!messageId) {\n return;\n }\n validateRequestedInfo(messageId, requestInfo, saveInfo);\n});\n\nasync function validateRequestedInfo(messageId: number, requestInfo: any, shouldSave?: true) {\n const result = await callApi('validateRequestedInfo', { messageId, requestInfo, shouldSave });\n if (!result) {\n return;\n }\n const { id, shippingOptions } = result;\n if (!id) {\n return;\n }\n let global = setRequestInfoId(getGlobal(), id);\n if (shippingOptions) {\n global = updateShippingOptions(global, shippingOptions);\n global = setPaymentStep(global, PaymentStep.Shipping);\n } else {\n global = setPaymentStep(global, PaymentStep.PaymentInfo);\n }\n setGlobal(global);\n}\n\naddReducer('getPaymentForm', (global, actions, payload) => {\n const { messageId } = payload;\n if (!messageId) {\n return;\n }\n getPaymentForm(messageId);\n});\n\n\nasync function getPaymentForm(messageId: number) {\n const result = await callApi('getPaymentForm', { messageId });\n if (!result) {\n return;\n }\n let global = setPaymentForm(getGlobal(), result);\n let step = PaymentStep.PaymentInfo;\n if (global.payment.invoice\n && (global.payment.invoice.shippingAddressRequested\n || global.payment.invoice.nameRequested\n || global.payment.invoice.phoneRequested\n || global.payment.invoice.emailRequested)) {\n step = PaymentStep.ShippingInfo;\n }\n global = setPaymentStep(global, step);\n setGlobal(global);\n}\n\naddReducer('getReceipt', (global, actions, payload) => {\n const { receiptMessageId, chatId, messageId } = payload;\n if (!messageId || !receiptMessageId || !chatId) {\n return;\n }\n getReceipt(messageId, receiptMessageId, chatId);\n});\n\nasync function getReceipt(messageId: number, receiptMessageId: number, chatId: number) {\n const result = await callApi('getReceipt', receiptMessageId);\n if (!result) {\n return;\n }\n let global = getGlobal();\n const message = selectChatMessage(global, chatId, messageId);\n global = setReceipt(global, result, message);\n setGlobal(global);\n}\n\naddReducer('clearPaymentError', (global) => {\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n error: undefined,\n },\n });\n});\n\naddReducer('clearReceipt', (global) => {\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n receipt: undefined,\n },\n });\n});\n\naddReducer('sendCredentialsInfo', (global, actions, payload) => {\n const publishableKey = selectProviderPublishableKey(global);\n if (!publishableKey) {\n return;\n }\n const { credentials } = payload;\n const { data } = credentials;\n sendStipeCredentials(data, publishableKey);\n});\n\naddReducer('sendPaymentForm', (global, actions, payload) => {\n const { shippingOptionId, saveCredentials } = payload;\n const messageId = selectPaymentMessageId(global);\n const requestInfoId = selectPaymentRequestId(global);\n const publishableKey = selectProviderPublishableKey(global);\n const stripeCredentials = selectStripeCredentials(global);\n if (!messageId || !publishableKey) {\n return;\n }\n sendPaymentForm(messageId, {\n save: saveCredentials,\n data: stripeCredentials,\n }, requestInfoId, shippingOptionId);\n});\n\nasync function sendStipeCredentials(data: {\n cardNumber: string;\n cardholder?: string;\n expiryMonth: string;\n expiryYear: string;\n cvv: string;\n country: string;\n zip: string;\n},\npublishableKey: string) {\n const query = buildQueryString({\n 'card[number]': data.cardNumber,\n 'card[exp_month]': data.expiryMonth,\n 'card[exp_year]': data.expiryYear,\n 'card[cvc]': data.cvv,\n 'card[address_zip]': data.zip,\n 'card[address_country]': data.country,\n });\n\n const response = await fetch(`https://api.stripe.com/v1/tokens${query}`, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: `Bearer ${publishableKey}`,\n },\n });\n const result = await response.json();\n if (result.error) {\n const error = getStripeError(result.error);\n const global = getGlobal();\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n error: {\n ...error,\n },\n },\n });\n return;\n }\n let global = setStripeCardInfo(getGlobal(), {\n type: result.type,\n id: result.id,\n });\n global = setPaymentStep(global, PaymentStep.Checkout);\n setGlobal(global);\n}\n\nasync function sendPaymentForm(\n messageId: number,\n credentials: any,\n requestedInfoId?: string,\n shippingOptionId?: string,\n) {\n const result = await callApi('sendPaymentForm', {\n messageId, credentials, requestedInfoId, shippingOptionId,\n });\n if (result) {\n const global = clearPayment(getGlobal());\n setGlobal(closeInvoice(global));\n }\n}\n\naddReducer('setPaymentStep', (global, actions, payload = {}) => {\n return setPaymentStep(global, payload.step || PaymentStep.ShippingInfo);\n});\n\naddReducer('setInvoiceMessageInfo', (global, actions, payload) => {\n return setInvoiceMessageInfo(global, payload);\n});\n","export function buildQueryString(data: Record) {\n const query = Object.keys(data).map((k) => `${k}=${data[k]}`).join('&');\n return query.length > 0 ? `?${query}` : '';\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate, MAIN_THREAD_ID } from '../../../api/types';\n\nimport { ARCHIVED_FOLDER_ID, MAX_ACTIVE_PINNED_CHATS } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { showNewMessageNotification } from '../../../util/notifications';\nimport { updateAppBadge } from '../../../util/appBadge';\nimport {\n updateChat,\n replaceChatListIds,\n updateChatListIds,\n updateChatListType,\n replaceThreadParam,\n} from '../../reducers';\nimport {\n selectChat,\n selectCommonBoxChatId,\n selectIsChatListed,\n selectChatListType,\n selectCurrentMessageList,\n selectCountNotMutedUnread,\n} from '../../selectors';\nimport { throttle } from '../../../util/schedulers';\n\nconst TYPING_STATUS_CLEAR_DELAY = 6000; // 6 seconds\n\n// Enough to animate and mark as read in Message List\nconst CURRENT_CHAT_UNREAD_DELAY = 1000;\nconst runThrottledForUpdateAppBadge = throttle((cb) => cb(), CURRENT_CHAT_UNREAD_DELAY, true);\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updateChat': {\n if (!update.noTopChatsRequest && !selectIsChatListed(global, update.id)) {\n // Chat can appear in dialogs list.\n actions.loadTopChats();\n }\n\n const newGlobal = updateChat(global, update.id, update.chat, update.newProfilePhoto);\n setGlobal(newGlobal);\n\n const unreadCount = selectCountNotMutedUnread(newGlobal);\n runThrottledForUpdateAppBadge(() => updateAppBadge(unreadCount));\n break;\n }\n\n case 'updateChatJoin': {\n const listType = selectChatListType(global, update.id);\n if (!listType) {\n break;\n }\n\n global = updateChatListIds(global, listType, [update.id]);\n global = updateChat(global, update.id, { isNotJoined: false });\n setGlobal(global);\n\n const chat = selectChat(global, update.id);\n if (chat) {\n actions.requestChatUpdate({ chatId: chat.id });\n }\n break;\n }\n\n case 'updateChatLeave': {\n const listType = selectChatListType(global, update.id);\n if (!listType) {\n break;\n }\n\n const { [listType]: listIds } = global.chats.listIds;\n\n if (listIds) {\n global = replaceChatListIds(global, listType, listIds.filter((listId) => listId !== update.id));\n }\n\n global = updateChat(global, update.id, { isNotJoined: true });\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatInbox': {\n setGlobal(updateChat(global, update.id, update.chat));\n\n break;\n }\n\n case 'updateChatTypingStatus': {\n const { id, typingStatus } = update;\n setGlobal(updateChat(global, id, { typingStatus }));\n\n setTimeout(() => {\n const newGlobal = getGlobal();\n const chat = selectChat(newGlobal, id);\n if (chat && typingStatus && chat.typingStatus && chat.typingStatus.timestamp === typingStatus.timestamp) {\n setGlobal(updateChat(newGlobal, id, { typingStatus: undefined }));\n }\n }, TYPING_STATUS_CLEAR_DELAY);\n\n break;\n }\n\n case 'newMessage': {\n const { message } = update;\n const { chatId: currentChatId, threadId, type: messageListType } = selectCurrentMessageList(global) || {};\n\n if (message.senderId === global.currentUserId && !message.isFromScheduled) {\n return;\n }\n\n const chat = selectChat(global, update.chatId);\n if (!chat) {\n return;\n }\n\n const isActiveChat = (\n messageListType === 'thread'\n && threadId === MAIN_THREAD_ID\n && update.chatId === currentChatId\n );\n\n if (isActiveChat) {\n setTimeout(() => {\n actions.requestChatUpdate({ chatId: update.chatId });\n }, CURRENT_CHAT_UNREAD_DELAY);\n } else {\n setGlobal(updateChat(global, update.chatId, {\n unreadCount: chat.unreadCount ? chat.unreadCount + 1 : 1,\n ...(update.message.hasUnreadMention && {\n unreadMentionsCount: chat.unreadMentionsCount ? chat.unreadMentionsCount + 1 : 1,\n }),\n }));\n }\n\n const unreadCount = selectCountNotMutedUnread(getGlobal());\n updateAppBadge(unreadCount);\n showNewMessageNotification({ chat, message, isActiveChat });\n\n break;\n }\n\n case 'updateCommonBoxMessages':\n case 'updateChannelMessages': {\n const { ids, messageUpdate } = update;\n if (messageUpdate.hasUnreadMention !== false) {\n return;\n }\n\n ids.forEach((id) => {\n const chatId = 'channelId' in update ? update.channelId : selectCommonBoxChatId(global, id);\n const chat = selectChat(global, chatId);\n if (chat && chat.unreadMentionsCount) {\n global = updateChat(global, chatId, {\n unreadMentionsCount: chat.unreadMentionsCount - 1,\n });\n }\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatFullInfo': {\n const { fullInfo } = update;\n const targetChat = global.chats.byId[update.id];\n if (!targetChat) {\n return;\n }\n\n setGlobal(updateChat(global, update.id, {\n fullInfo: {\n ...targetChat.fullInfo,\n ...fullInfo,\n },\n }));\n\n break;\n }\n\n case 'updatePinnedChatIds': {\n const { ids, folderId } = update;\n\n const listType = folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [listType]: ids.length ? ids : undefined,\n },\n },\n };\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatPinned': {\n const { id, isPinned } = update;\n const listType = selectChatListType(global, id);\n if (listType) {\n const { [listType]: orderedPinnedIds } = global.chats.orderedPinnedIds;\n\n let newOrderedPinnedIds = orderedPinnedIds || [];\n if (!isPinned) {\n newOrderedPinnedIds = newOrderedPinnedIds.filter((pinnedId) => pinnedId !== id);\n } else if (!newOrderedPinnedIds.includes(id)) {\n // When moving pinned chats to archive, active ordered pinned ids don't get updated\n // (to preserve chat pinned state when it returns from archive)\n // If user already has max pinned chats, we should check for orderedIds\n // that don't point to listed chats\n if (listType === 'active' && newOrderedPinnedIds.length >= MAX_ACTIVE_PINNED_CHATS) {\n const listIds = global.chats.listIds.active;\n newOrderedPinnedIds = newOrderedPinnedIds.filter((pinnedId) => listIds && listIds.includes(pinnedId));\n }\n\n newOrderedPinnedIds = [id, ...newOrderedPinnedIds];\n }\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [listType]: newOrderedPinnedIds.length ? newOrderedPinnedIds : undefined,\n },\n },\n };\n }\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatListType': {\n const { id, folderId } = update;\n\n setGlobal(updateChatListType(global, id, folderId));\n\n break;\n }\n\n case 'updateChatFolder': {\n const { id, folder } = update;\n const { byId: chatFoldersById, orderedIds } = global.chatFolders;\n\n const newChatFoldersById = folder\n ? { ...chatFoldersById, [id]: folder }\n : pick(\n chatFoldersById,\n Object.keys(chatFoldersById).map(Number).filter((folderId) => folderId !== id),\n );\n\n const newOrderedIds = folder\n ? orderedIds && orderedIds.includes(id) ? orderedIds : [...(orderedIds || []), id]\n : orderedIds ? orderedIds.filter((orderedId) => orderedId !== id) : undefined;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n byId: newChatFoldersById,\n orderedIds: newOrderedIds,\n },\n });\n\n break;\n }\n\n case 'updateChatFoldersOrder': {\n const { orderedIds } = update;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n orderedIds,\n },\n });\n\n break;\n }\n\n case 'updateRecommendedChatFolders': {\n const { folders } = update;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: folders,\n },\n });\n\n break;\n }\n\n case 'updateChatMembers': {\n const targetChat = global.chats.byId[update.id];\n const { replacedMembers, addedMember, deletedMemberId } = update;\n if (!targetChat) {\n return;\n }\n\n let shouldUpdate = false;\n let members = targetChat.fullInfo && targetChat.fullInfo.members\n ? [...targetChat.fullInfo.members]\n : [];\n\n if (replacedMembers) {\n members = replacedMembers;\n shouldUpdate = true;\n } else if (addedMember) {\n if (\n !members.length\n || !members.some((m) => m.userId === addedMember.userId)\n ) {\n members.push(addedMember);\n shouldUpdate = true;\n }\n } else if (members.length && deletedMemberId) {\n const deleteIndex = members.findIndex((m) => m.userId === deletedMemberId);\n if (deleteIndex > -1) {\n members.slice(deleteIndex, 1);\n shouldUpdate = true;\n }\n }\n\n if (shouldUpdate) {\n const adminMembers = members.filter(({ isOwner, isAdmin }) => isOwner || isAdmin);\n // TODO Kicked members?\n\n setGlobal(updateChat(global, update.id, {\n membersCount: members.length,\n fullInfo: {\n ...targetChat.fullInfo,\n members,\n adminMembers,\n },\n }));\n }\n\n break;\n }\n\n case 'deleteProfilePhotos': {\n const { chatId, ids } = update;\n const chat = global.chats.byId[chatId];\n\n if (chat && chat.photos) {\n setGlobal(updateChat(global, chatId, {\n photos: chat.photos.filter((photo) => !ids.includes(photo.id)),\n }));\n }\n break;\n }\n\n case 'draftMessage': {\n const {\n chatId, formattedText, date, replyingToId,\n } = update;\n const chat = global.chats.byId[chatId];\n\n if (chat) {\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', formattedText);\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'replyingToId', replyingToId);\n global = updateChat(global, chatId, { draftDate: date });\n\n setGlobal(global);\n }\n break;\n }\n\n case 'showInvite': {\n const { data } = update;\n\n actions.showDialog({ data });\n break;\n }\n }\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiUpdate, ApiMessage, ApiPollResult, ApiThreadInfo, MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { unique } from '../../../util/iteratees';\nimport {\n updateChat,\n deleteChatMessages,\n updateChatMessage,\n updateListedIds,\n addViewportId,\n updateThreadInfo,\n replaceThreadParam,\n updateScheduledMessage,\n deleteChatScheduledMessages,\n} from '../../reducers';\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport {\n selectChatMessage,\n selectChatMessages,\n selectIsViewportNewest,\n selectListedIds,\n selectChatMessageByPollId,\n selectCommonBoxChatId,\n selectIsChatListed,\n selectThreadInfo,\n selectThreadByMessage,\n selectPinnedIds,\n selectScheduledMessage,\n selectScheduledMessages,\n isMessageInCurrentMessageList,\n selectScheduledIds,\n selectCurrentMessageList,\n selectViewportIds,\n selectFirstUnreadId,\n selectChat,\n} from '../../selectors';\nimport { getMessageContent, isChatPrivate, isMessageLocal } from '../../helpers';\n\nconst ANIMATION_DELAY = 350;\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'newMessage': {\n const { chatId, id, message } = update;\n global = updateWithLocalMedia(global, chatId, id, message);\n global = updateListedAndViewportIds(global, message as ApiMessage);\n\n if (message.threadInfo) {\n global = updateThreadInfo(\n global,\n message.threadInfo.chatId,\n message.threadInfo.threadId,\n message.threadInfo,\n );\n }\n\n setGlobal(global);\n\n const newMessage = selectChatMessage(global, chatId, id)!;\n\n if (isMessageInCurrentMessageList(global, chatId, message as ApiMessage)) {\n if (message.isOutgoing && !(message.content && message.content.action)) {\n const currentMessageList = selectCurrentMessageList(global);\n if (currentMessageList) {\n // We do not use `actions.focusLastMessage` as it may be set with a delay (see below)\n actions.focusMessage({\n chatId,\n threadId: currentMessageList.threadId,\n messageId: message.id,\n noHighlight: true,\n });\n }\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message as ApiMessage) || {};\n if (threadInfo) {\n actions.requestThreadInfoUpdate({ chatId, threadId: threadInfo.threadId });\n }\n\n // @perf Wait until scroll animation finishes or simply rely on delivery status update (which is itself delayed)\n if (!isMessageLocal(message as ApiMessage)) {\n setTimeout(() => {\n setGlobal(updateChatLastMessage(getGlobal(), chatId, newMessage));\n }, ANIMATION_DELAY);\n }\n } else {\n setGlobal(updateChatLastMessage(getGlobal(), chatId, newMessage));\n }\n\n // Edge case: New message in an old (not loaded) chat.\n if (!selectIsChatListed(global, chatId)) {\n actions.loadTopChats();\n }\n\n break;\n }\n\n case 'newScheduledMessage': {\n const { chatId, id, message } = update;\n\n global = updateWithLocalMedia(global, chatId, id, message, true);\n\n const scheduledIds = selectScheduledIds(global, chatId) || [];\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', unique([...scheduledIds, id]));\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessage': {\n const { chatId, id, message } = update;\n\n const currentMessage = selectChatMessage(global, chatId, id);\n if (!currentMessage) {\n return;\n }\n\n global = updateWithLocalMedia(global, chatId, id, message);\n\n const newMessage = selectChatMessage(global, chatId, id)!;\n if (message.threadInfo) {\n global = updateThreadInfo(\n global,\n message.threadInfo.chatId,\n message.threadInfo.threadId,\n message.threadInfo,\n );\n }\n global = updateChatLastMessage(global, chatId, newMessage);\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateScheduledMessage': {\n const { chatId, id, message } = update;\n\n const currentMessage = selectScheduledMessage(global, chatId, id);\n if (!currentMessage) {\n return;\n }\n\n global = updateWithLocalMedia(global, chatId, id, message, true);\n const ids = Object.keys(selectScheduledMessages(global, chatId) || {}).map(Number).sort((a, b) => b - a);\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', ids);\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessageSendSucceeded': {\n const { chatId, localId, message } = update;\n\n global = updateListedAndViewportIds(global, message as ApiMessage);\n\n const currentMessage = selectChatMessage(global, chatId, localId);\n\n global = deleteChatMessages(global, chatId, [localId]);\n\n // Edge case for \"Send When Online\"\n if (message.isScheduled) {\n global = deleteChatScheduledMessages(global, chatId, [localId]);\n }\n\n global = updateChatMessage(global, chatId, message.id, {\n ...currentMessage,\n ...message,\n previousLocalId: localId,\n });\n\n const newMessage = selectChatMessage(global, chatId, message.id)!;\n global = updateChatLastMessage(global, chatId, newMessage);\n\n const thread = selectThreadByMessage(global, chatId, message);\n // For some reason Telegram requires to manually mark outgoing thread messages read\n // For some reason Telegram requires to manually mark outgoing thread messages read\n if (thread && thread.threadInfo) {\n actions.markMessageListRead({ maxId: message.id });\n\n global = replaceThreadParam(global, chatId, thread.threadInfo.threadId, 'threadInfo', {\n ...thread.threadInfo,\n lastMessageId: message.id,\n lastReadInboxMessageId: message.id,\n });\n }\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateScheduledMessageSendSucceeded': {\n const { chatId, localId, message } = update;\n const scheduledIds = selectScheduledIds(global, chatId) || [];\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', [...scheduledIds, message.id]);\n\n const currentMessage = selectScheduledMessage(global, chatId, localId);\n\n global = deleteChatScheduledMessages(global, chatId, [localId]);\n global = updateScheduledMessage(global, chatId, message.id, {\n ...currentMessage,\n ...message,\n previousLocalId: localId,\n });\n\n setGlobal(global);\n break;\n }\n\n case 'updatePinnedIds': {\n const { chatId, isPinned, messageIds } = update;\n\n const currentPinnedIds = selectPinnedIds(global, chatId) || [];\n const newPinnedIds = isPinned\n ? [...currentPinnedIds, ...messageIds].sort((a, b) => b - a)\n : currentPinnedIds.filter((id) => !messageIds.includes(id));\n\n setGlobal(replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds', newPinnedIds));\n\n break;\n }\n\n case 'updateThreadInfo': {\n const {\n chatId, threadId, threadInfo, firstMessageId,\n } = update;\n\n const currentThreadInfo = selectThreadInfo(global, chatId, threadId);\n const newTheadInfo = {\n ...currentThreadInfo,\n ...threadInfo,\n };\n\n if (!newTheadInfo.threadId) {\n return;\n }\n\n global = updateThreadInfo(global, chatId, threadId, newTheadInfo as ApiThreadInfo);\n\n if (firstMessageId) {\n global = replaceThreadParam(global, chatId, threadId, 'firstMessageId', firstMessageId);\n }\n\n setGlobal(global);\n\n break;\n }\n\n case 'resetMessages': {\n const { id: chatId } = update;\n const messagesById = selectChatMessages(global, chatId);\n\n if (messagesById && !isChatPrivate(chatId)) {\n global = deleteChatMessages(global, chatId, Object.keys(messagesById).map(Number));\n setGlobal(global);\n actions.loadFullChat({ chatId, force: true });\n }\n\n break;\n }\n\n case 'deleteMessages': {\n const { ids, chatId } = update;\n\n deleteMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'deleteScheduledMessages': {\n const { ids, chatId } = update;\n\n deleteScheduledMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'deleteHistory': {\n const { chatId } = update;\n const chatMessages = global.messages.byChatId[chatId];\n if (chatMessages) {\n const ids = Object.keys(chatMessages.byId).map(Number);\n deleteMessages(chatId, ids, actions, global);\n } else {\n actions.requestChatUpdate({ chatId });\n }\n\n break;\n }\n\n case 'updateCommonBoxMessages': {\n const { ids, messageUpdate } = update;\n\n ids.forEach((id) => {\n const chatId = selectCommonBoxChatId(global, id);\n if (chatId) {\n global = updateChatMessage(global, chatId, id, messageUpdate);\n }\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChannelMessages': {\n const { channelId, ids, messageUpdate } = update;\n\n ids.forEach((id) => {\n global = updateChatMessage(global, channelId, id, messageUpdate);\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessagePoll': {\n const { pollId, pollUpdate } = update;\n\n const message = selectChatMessageByPollId(global, pollId);\n\n if (message && message.content.poll) {\n const updatedPoll = { ...message.content.poll, ...pollUpdate };\n\n // Workaround for poll update bug: `chosen` option gets reset when someone votes after current user\n const { results: updatedResults } = updatedPoll.results || {};\n if (updatedResults && !updatedResults.some(((result) => result.isChosen))) {\n const { results } = message.content.poll.results;\n const chosenAnswers = results && results.filter((result) => result.isChosen);\n if (chosenAnswers) {\n chosenAnswers.forEach((chosenAnswer) => {\n const chosenAnswerIndex = updatedResults.findIndex((result) => result.option === chosenAnswer.option);\n if (chosenAnswerIndex >= 0) {\n updatedPoll.results.results![chosenAnswerIndex].isChosen = true;\n }\n });\n }\n }\n\n setGlobal(updateChatMessage(\n global,\n message.chatId,\n message.id,\n {\n content: {\n ...message.content,\n poll: updatedPoll,\n },\n },\n ));\n }\n break;\n }\n\n case 'updateMessagePollVote': {\n const { pollId, userId, options } = update;\n const message = selectChatMessageByPollId(global, pollId);\n if (!message || !message.content.poll || !message.content.poll.results) {\n break;\n }\n\n const { poll } = message.content;\n\n const { recentVoterIds, totalVoters, results } = poll.results;\n const newRecentVoterIds = recentVoterIds ? [...recentVoterIds] : [];\n const newTotalVoters = totalVoters ? totalVoters + 1 : 1;\n const newResults = results ? [...results] : [];\n\n newRecentVoterIds.push(userId);\n\n options.forEach((option) => {\n const targetOption = newResults.find((result) => result.option === option);\n const targetOptionIndex = newResults.findIndex((result) => result.option === option);\n const updatedOption: ApiPollResult = targetOption ? { ...targetOption } : { option, votersCount: 0 };\n\n updatedOption.votersCount += 1;\n if (userId === global.currentUserId) {\n updatedOption.isChosen = true;\n }\n\n if (targetOptionIndex) {\n newResults[targetOptionIndex] = updatedOption;\n } else {\n newResults.push(updatedOption);\n }\n });\n\n setGlobal(updateChatMessage(\n global,\n message.chatId,\n message.id,\n {\n content: {\n ...message.content,\n poll: {\n ...poll,\n results: {\n ...poll.results,\n recentVoterIds: newRecentVoterIds,\n totalVoters: newTotalVoters,\n results: newResults,\n },\n },\n },\n },\n ));\n\n break;\n }\n }\n});\n\nfunction updateWithLocalMedia(\n global: GlobalState, chatId: number, id: number, message: Partial, isScheduled = false,\n) {\n // Preserve locally uploaded media.\n const currentMessage = isScheduled\n ? selectScheduledMessage(global, chatId, id)\n : selectChatMessage(global, chatId, id);\n if (currentMessage && message.content) {\n const {\n photo, video, sticker, document,\n } = getMessageContent(currentMessage);\n if (photo && message.content.photo) {\n message.content.photo.blobUrl = photo.blobUrl;\n message.content.photo.thumbnail = photo.thumbnail;\n } else if (video && message.content.video) {\n message.content.video.blobUrl = video.blobUrl;\n } else if (sticker && message.content.sticker) {\n message.content.sticker.isPreloadedGlobally = sticker.isPreloadedGlobally;\n } else if (document && message.content.document) {\n message.content.document.previewBlobUrl = document.previewBlobUrl;\n }\n }\n\n return isScheduled\n ? updateScheduledMessage(global, chatId, id, message)\n : updateChatMessage(global, chatId, id, message);\n}\n\nfunction updateListedAndViewportIds(global: GlobalState, message: ApiMessage) {\n const { id, chatId } = message;\n\n const { threadInfo, firstMessageId } = selectThreadByMessage(global, chatId, message) || {};\n\n const chat = selectChat(global, chatId);\n const isUnreadChatNotLoaded = chat && chat.unreadCount && !selectListedIds(global, chatId, MAIN_THREAD_ID);\n\n if (threadInfo) {\n if (firstMessageId || !isMessageLocal(message)) {\n global = updateListedIds(global, chatId, threadInfo.threadId, [id]);\n\n if (selectIsViewportNewest(global, chatId, threadInfo.threadId)) {\n global = addViewportId(global, chatId, threadInfo.threadId, id);\n\n if (!firstMessageId) {\n global = replaceThreadParam(global, chatId, threadInfo.threadId, 'firstMessageId', message.id);\n }\n }\n }\n\n global = replaceThreadParam(global, chatId, threadInfo.threadId, 'threadInfo', {\n ...threadInfo,\n lastMessageId: message.id,\n messagesCount: threadInfo.messagesCount + 1,\n });\n }\n\n if (isUnreadChatNotLoaded) {\n return global;\n }\n\n global = updateListedIds(global, chatId, MAIN_THREAD_ID, [id]);\n\n if (selectIsViewportNewest(global, chatId, MAIN_THREAD_ID)) {\n // Always keep the first unread message in the viewport list\n const firstUnreadId = selectFirstUnreadId(global, chatId, MAIN_THREAD_ID);\n const newGlobal = addViewportId(global, chatId, MAIN_THREAD_ID, id);\n const newViewportIds = selectViewportIds(newGlobal, chatId, MAIN_THREAD_ID);\n\n if (!firstUnreadId || newViewportIds!.includes(firstUnreadId)) {\n global = newGlobal;\n }\n }\n\n return global;\n}\n\nfunction updateChatLastMessage(\n global: GlobalState,\n chatId: number,\n message: ApiMessage,\n force = false,\n) {\n const { chats } = global;\n const currentLastMessage = chats.byId[chatId] && chats.byId[chatId].lastMessage;\n\n if (currentLastMessage && !force) {\n const isSameOrNewer = (\n currentLastMessage.id === message.id || currentLastMessage.id === message.previousLocalId\n ) || message.id > currentLastMessage.id;\n\n if (!isSameOrNewer) {\n return global;\n }\n }\n\n return updateChat(global, chatId, { lastMessage: message });\n}\n\nfunction findLastMessage(global: GlobalState, chatId: number) {\n const byId = selectChatMessages(global, chatId);\n const listedIds = selectListedIds(global, chatId, MAIN_THREAD_ID);\n\n if (!byId || !listedIds) {\n return undefined;\n }\n\n let i = listedIds.length;\n while (i--) {\n const message = byId[listedIds[i]];\n if (!message.isDeleting) {\n return message;\n }\n }\n\n return undefined;\n}\n\nfunction deleteMessages(chatId: number | undefined, ids: number[], actions: GlobalActions, global: GlobalState) {\n // Channel update\n\n if (chatId) {\n ids.forEach((id) => {\n global = updateChatMessage(global, chatId, id, {\n isDeleting: true,\n });\n\n const newLastMessage = findLastMessage(global, chatId);\n if (newLastMessage) {\n global = updateChatLastMessage(global, chatId, newLastMessage, true);\n }\n });\n\n setGlobal(global);\n\n actions.requestChatUpdate({ chatId });\n\n const threadIdsToUpdate: number[] = [];\n\n ids.forEach((id) => {\n const message = selectChatMessage(global, chatId, id);\n if (!message) {\n return;\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n if (threadInfo) {\n threadIdsToUpdate.push(threadInfo.threadId);\n }\n });\n\n setTimeout(() => {\n setGlobal(deleteChatMessages(getGlobal(), chatId, ids));\n\n unique(threadIdsToUpdate).forEach((threadId) => {\n actions.requestThreadInfoUpdate({ chatId, threadId });\n });\n }, ANIMATION_DELAY);\n\n return;\n }\n\n // Common box update\n\n const chatsIdsToUpdate: number[] = [];\n\n ids.forEach((id) => {\n const commonBoxChatId = selectCommonBoxChatId(global, id);\n if (commonBoxChatId) {\n chatsIdsToUpdate.push(commonBoxChatId);\n\n global = updateChatMessage(global, commonBoxChatId, id, {\n isDeleting: true,\n });\n\n const newLastMessage = findLastMessage(global, commonBoxChatId);\n if (newLastMessage) {\n global = updateChatLastMessage(global, commonBoxChatId, newLastMessage, true);\n }\n\n setTimeout(() => {\n setGlobal(deleteChatMessages(getGlobal(), commonBoxChatId, [id]));\n }, ANIMATION_DELAY);\n }\n });\n\n setGlobal(global);\n\n unique(chatsIdsToUpdate).forEach((id) => {\n actions.requestChatUpdate({ chatId: id });\n });\n}\n\nfunction deleteScheduledMessages(\n chatId: number | undefined, ids: number[], actions: GlobalActions, global: GlobalState,\n) {\n if (!chatId) {\n return;\n }\n\n ids.forEach((id) => {\n global = updateScheduledMessage(global, chatId, id, {\n isDeleting: true,\n });\n });\n\n setGlobal(global);\n\n setTimeout(() => {\n global = deleteChatScheduledMessages(getGlobal(), chatId, ids);\n const scheduledMessages = selectScheduledMessages(global, chatId);\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'scheduledIds', Object.keys(scheduledMessages || {}).map(Number),\n );\n setGlobal(global);\n }, ANIMATION_DELAY);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate, ApiUserStatus } from '../../../api/types';\n\nimport { deleteUser, updateUser } from '../../reducers';\nimport { throttle } from '../../../util/schedulers';\n\nconst STATUS_UPDATE_THROTTLE = 3000;\n\nconst flushStatusUpdatesThrottled = throttle(flushStatusUpdates, STATUS_UPDATE_THROTTLE, true);\n\nlet pendingStatusUpdates: [number, ApiUserStatus][] = [];\n\nfunction scheduleStatusUpdate(userId: number, statusUpdate: ApiUserStatus) {\n pendingStatusUpdates.push([userId, statusUpdate]);\n flushStatusUpdatesThrottled();\n}\n\nfunction flushStatusUpdates() {\n let global = getGlobal();\n pendingStatusUpdates.forEach(([userId, statusUpdate]) => {\n global = updateUser(global, userId, {\n status: statusUpdate,\n });\n });\n setGlobal(global);\n\n pendingStatusUpdates = [];\n}\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'deleteUser': {\n return deleteUser(global, update.id);\n }\n\n case 'updateUser': {\n return updateUser(global, update.id, update.user);\n }\n\n case 'updateUserStatus': {\n // Status updates come very often so we throttle them\n scheduleStatusUpdate(update.userId, update.status);\n return undefined;\n }\n\n case 'updateUserFullInfo': {\n const { id, fullInfo } = update;\n const targetUser = global.users.byId[id];\n if (!targetUser) {\n return undefined;\n }\n\n return updateUser(global, id, {\n fullInfo: {\n ...targetUser.fullInfo,\n ...fullInfo,\n },\n });\n }\n }\n\n return undefined;\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\n\nimport { updateStickerSet } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updateStickerSet': {\n return updateStickerSet(global, update.id, update.stickerSet);\n }\n }\n\n return undefined;\n});\n","import {\n addReducer, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { ApiPrivacyKey } from '../../../types';\n\nimport { addBlockedContact, removeBlockedContact } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updatePeerBlocked':\n if (update.isBlocked) {\n return addBlockedContact(getGlobal(), update.id);\n } else {\n return removeBlockedContact(getGlobal(), update.id);\n }\n\n case 'updateResetContactList':\n setGlobal({\n ...getGlobal(),\n contactList: {\n hash: 0,\n userIds: [],\n },\n });\n break;\n\n case 'updateFavoriteStickers':\n actions.loadFavoriteStickers();\n break;\n\n case 'updatePrivacy':\n global.settings.privacy[update.key as ApiPrivacyKey] = update.rules;\n break;\n }\n\n return undefined;\n});\n","import { addReducer, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { GlobalState } from '../../../global/types';\nimport { addNotifyException, updateChat, updateNotifySettings } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate): GlobalState | undefined => {\n switch (update['@type']) {\n case 'updateNotifySettings': {\n return updateNotifySettings(global, update.peerType, update.isSilent, update.shouldShowPreviews);\n }\n\n case 'updateNotifyExceptions': {\n const {\n chatId, isMuted, isSilent, shouldShowPreviews,\n } = update;\n const chat = global.chats.byId[chatId];\n\n if (chat) {\n global = updateChat(global, chatId, { isMuted });\n }\n\n setGlobal(addNotifyException(global, chatId, { isMuted, isSilent, shouldShowPreviews }));\n break;\n }\n }\n\n return undefined;\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { GlobalState } from '../../../global/types';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate): GlobalState | undefined => {\n switch (update['@type']) {\n case 'updateTwoFaStateWaitCode': {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n isLoading: false,\n waitingEmailCodeLength: update.length,\n },\n };\n }\n\n case 'updateTwoFaError': {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n error: update.message,\n },\n };\n }\n }\n\n return undefined;\n});\n","import { useEffect } from '../lib/teact/teact';\n\nimport { onBeforeUnload } from '../util/schedulers';\n\nexport default function useBeforeUnload(callback: AnyToVoidFunction) {\n useEffect(() => {\n return onBeforeUnload(callback);\n }, [callback]);\n}\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Switcher.scss';\n\ntype OwnProps = {\n id?: string;\n name?: string;\n value?: string;\n label: string;\n checked?: boolean;\n disabled?: boolean;\n inactive?: boolean;\n noAnimation?: boolean;\n onChange?: (e: ChangeEvent) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Switcher: FC = ({\n id,\n name,\n value,\n label,\n checked = false,\n disabled,\n inactive,\n noAnimation,\n onChange,\n onCheck,\n}) => {\n const handleChange = useCallback((e: ChangeEvent) => {\n if (onChange) {\n onChange(e);\n }\n\n if (onCheck) {\n onCheck(e.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const className = buildClassName(\n 'Switcher',\n disabled && 'disabled',\n inactive && 'inactive',\n noAnimation && 'no-animation',\n );\n\n return (\n \n );\n};\n\nexport default memo(Switcher);\n","import React, {\n FC, useCallback, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LeftColumnContent, ISettings } from '../../../types';\nimport { ApiChat } from '../../../api/types';\n\nimport {\n ANIMATION_LEVEL_MAX, APP_NAME, APP_VERSION, FEEDBACK_URL,\n} from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport { isChatArchived } from '../../../modules/helpers';\nimport { formatDateToString } from '../../../util/dateFormat';\nimport { selectTheme } from '../../../modules/selectors';\nimport switchTheme from '../../../util/switchTheme';\nimport useLang from '../../../hooks/useLang';\nimport { disableHistoryBack } from '../../../hooks/useHistoryBack';\n\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\nimport Button from '../../ui/Button';\nimport SearchInput from '../../ui/SearchInput';\nimport PickerSelectedItem from '../../common/PickerSelectedItem';\nimport Switcher from '../../ui/Switcher';\n\nimport './LeftMainHeader.scss';\n\ntype OwnProps = {\n content: LeftColumnContent;\n contactsFilter: string;\n shouldSkipTransition?: boolean;\n onSearchQuery: (query: string) => void;\n onSelectSettings: () => void;\n onSelectContacts: () => void;\n onSelectArchived: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n searchQuery?: string;\n isLoading: boolean;\n currentUserId?: number;\n globalSearchChatId?: number;\n searchDate?: number;\n theme: ISettings['theme'];\n animationLevel: 0 | 1 | 2;\n chatsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_LEVEL_OPTIONS = [0, 1, 2];\n\nconst PRODUCTION_HOSTNAME = 'web.telegram.org';\nconst LEGACY_VERSION_URL = 'https://web.telegram.org/?legacy=1';\nconst WEBK_VERSION_URL = 'https://web.telegram.org/k/';\nconst PERMANENT_VERSION_KEY = 'kz_version';\n\nconst LeftMainHeader: FC = ({\n content,\n contactsFilter,\n onSearchQuery,\n onSelectSettings,\n onSelectContacts,\n onSelectArchived,\n setGlobalSearchChatId,\n onReset,\n searchQuery,\n isLoading,\n shouldSkipTransition,\n currentUserId,\n globalSearchChatId,\n searchDate,\n theme,\n animationLevel,\n chatsById,\n openChat,\n openTipsChat,\n setGlobalSearchDate,\n setSettingOption,\n}) => {\n const lang = useLang();\n const hasMenu = content === LeftColumnContent.ChatList;\n const clearedDateSearchParam = { date: undefined };\n const clearedChatSearchParam = { id: undefined };\n const selectedSearchDate = useMemo(() => {\n return searchDate\n ? formatDateToString(new Date(searchDate * 1000))\n : undefined;\n }, [searchDate]);\n const archivedUnreadChatsCount = useMemo(() => {\n if (!hasMenu || !chatsById) {\n return 0;\n }\n\n return Object.values(chatsById).reduce((total, chat) => {\n if (!isChatArchived(chat)) {\n return total;\n }\n\n return chat.unreadCount ? total + 1 : total;\n }, 0);\n }, [hasMenu, chatsById]);\n\n const withOtherVersions = window.location.hostname === PRODUCTION_HOSTNAME;\n\n const MainButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n onReset()}\n ariaLabel={hasMenu ? lang('AccDescrOpenMenu2') : 'Return to chat list'}\n >\n
\n \n );\n }, [hasMenu, lang, onReset, shouldSkipTransition]);\n\n const handleSearchFocus = useCallback(() => {\n if (!searchQuery) {\n onSearchQuery('');\n }\n }, [searchQuery, onSearchQuery]);\n\n const handleSelectSaved = useCallback(() => {\n openChat({ id: currentUserId, shouldReplaceHistory: true });\n }, [currentUserId, openChat]);\n\n const handleDarkModeToggle = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n const newTheme = theme === 'light' ? 'dark' : 'light';\n\n setSettingOption({ theme: newTheme });\n setSettingOption({ shouldUseSystemTheme: false });\n switchTheme(newTheme, animationLevel === ANIMATION_LEVEL_MAX);\n }, [animationLevel, setSettingOption, theme]);\n\n const handleAnimationLevelChange = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n\n const newLevel = animationLevel === 0 ? 2 : 0;\n ANIMATION_LEVEL_OPTIONS.forEach((_, i) => {\n document.body.classList.toggle(`animation-level-${i}`, newLevel === i);\n });\n\n setSettingOption({ animationLevel: newLevel });\n }, [animationLevel, setSettingOption]);\n\n const handleSwitchToWebK = () => {\n localStorage.setItem(PERMANENT_VERSION_KEY, JSON.stringify('K'));\n disableHistoryBack();\n };\n\n const handleOpenTipsChat = () => {\n openTipsChat({ langCode: lang.code });\n };\n\n const isSearchFocused = (\n Boolean(globalSearchChatId)\n || content === LeftColumnContent.GlobalSearch\n || content === LeftColumnContent.Contacts\n );\n\n const searchInputPlaceholder = content === LeftColumnContent.Contacts\n ? lang('SearchFriends')\n : lang('Search');\n\n return (\n
\n
\n \n \n {lang('SavedMessages')}\n \n \n {lang('ArchivedChats')}\n {archivedUnreadChatsCount > 0 && (\n
{archivedUnreadChatsCount}
\n )}\n \n \n {lang('Contacts')}\n \n \n {lang('Settings')}\n \n \n {lang('lng_menu_night_mode')}\n \n \n \n {lang('Appearance.Animations').toLowerCase()}\n 0}\n />\n \n \n {lang('TelegramFeatures')}\n \n \n Report Bug\n \n {withOtherVersions && (\n <>\n \n Switch to K Version\n \n \n Switch to Old Version\n \n \n )}\n \n \n {selectedSearchDate && (\n \n )}\n {globalSearchChatId && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n query: searchQuery, fetchingStatus, chatId, date,\n } = global.globalSearch;\n const { currentUserId } = global;\n const { byId: chatsById } = global.chats;\n const { animationLevel } = global.settings.byKey;\n\n return {\n searchQuery,\n isLoading: fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false,\n currentUserId,\n chatsById,\n globalSearchChatId: chatId,\n searchDate: date,\n theme: selectTheme(global),\n animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'openTipsChat',\n 'setGlobalSearchDate',\n 'setGlobalSearchChatId',\n 'setSettingOption',\n ]),\n)(LeftMainHeader));\n","import React, { memo, FC } from '../../lib/teact/teact';\n\nimport { GlobalState } from '../../global/types';\n\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\n\nimport './ConnectionState.scss';\n\ntype StateProps = Pick;\n\nconst ConnectionState: FC = () => {\n const lang = useLang();\n\n return (\n
\n \n
{lang('WaitingForNetwork')}
\n
\n );\n};\n\nexport default memo(ConnectionState);\n","import { useState } from '../lib/teact/teact';\n\nimport useThrottle from './useThrottle';\nimport useOnChange from './useOnChange';\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\nimport useFlag from './useFlag';\n\nexport default (resolverFn: () => R, ms: number, dependencies: D) => {\n const runThrottled = useThrottle(ms, true);\n const [value, setValue] = useState();\n const [isFrozen, freeze, unfreeze] = useFlag();\n\n useHeavyAnimationCheck(freeze, unfreeze);\n\n useOnChange(() => {\n if (isFrozen) {\n return;\n }\n\n runThrottled(() => {\n setValue(resolverFn());\n });\n }, dependencies.concat([isFrozen]));\n\n return value;\n};\n","import { useMemo } from '../lib/teact/teact';\n\nimport { throttle } from '../util/schedulers';\n\nexport default (ms: number, noFirst = false) => {\n return useMemo(() => {\n return throttle((cb) => cb(), ms, !noFirst);\n }, [ms, noFirst]);\n};\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatFolder, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { NotifyException, NotifySettings, SettingsScreens } from '../../../types';\nimport { FolderEditDispatch } from '../../../hooks/reducers/useFoldersReducer';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { buildCollectionByKey, pick } from '../../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../../util/captureEvents';\nimport { getFolderUnreadDialogs } from '../../../modules/helpers';\nimport { selectNotifyExceptions, selectNotifySettings } from '../../../modules/selectors';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport useThrottledMemo from '../../../hooks/useThrottledMemo';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\n\nimport Transition from '../../ui/Transition';\nimport TabList from '../../ui/TabList';\nimport ChatList from './ChatList';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n foldersDispatch: FolderEditDispatch;\n};\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n chatFoldersById: Record;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n orderedFolderIds?: number[];\n activeChatFolder: number;\n currentUserId?: number;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst INFO_THROTTLE = 3000;\nconst SAVED_MESSAGES_HOTKEY = '0';\n\nconst ChatFolders: FC = ({\n chatsById,\n usersById,\n chatFoldersById,\n notifySettings,\n notifyExceptions,\n orderedFolderIds,\n activeChatFolder,\n currentUserId,\n lastSyncTime,\n foldersDispatch,\n onScreenSelect,\n loadChatFolders,\n setActiveChatFolder,\n openChat,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const transitionRef = useRef(null);\n\n const lang = useLang();\n\n useEffect(() => {\n if (lastSyncTime) {\n loadChatFolders();\n }\n }, [lastSyncTime, loadChatFolders]);\n\n const displayedFolders = useMemo(() => {\n return orderedFolderIds\n ? orderedFolderIds.map((id) => chatFoldersById[id] || {}).filter(Boolean)\n : undefined;\n }, [chatFoldersById, orderedFolderIds]);\n\n const folderCountersById = useThrottledMemo(() => {\n if (!displayedFolders || !displayedFolders.length) {\n return undefined;\n }\n\n const chatIds = Object.keys(chatsById).map(Number);\n const counters = displayedFolders.map((folder) => {\n const {\n unreadDialogsCount, hasActiveDialogs,\n } = getFolderUnreadDialogs(chatsById, usersById, folder, chatIds, notifySettings, notifyExceptions) || {};\n\n return {\n id: folder.id,\n badgeCount: unreadDialogsCount,\n isBadgeActive: hasActiveDialogs,\n };\n });\n\n return buildCollectionByKey(counters, 'id');\n }, INFO_THROTTLE, [displayedFolders, chatsById, usersById, notifySettings, notifyExceptions]);\n\n const folderTabs = useMemo(() => {\n if (!displayedFolders || !displayedFolders.length) {\n return undefined;\n }\n\n return [\n { title: lang.code === 'en' ? 'All' : lang('FilterAllChats') },\n ...displayedFolders.map((folder) => ({\n title: folder.title,\n ...(folderCountersById && folderCountersById[folder.id]),\n })),\n ];\n }, [displayedFolders, folderCountersById, lang]);\n\n const handleSwitchTab = useCallback((index: number) => {\n setActiveChatFolder(index);\n }, [setActiveChatFolder]);\n\n // Prevent `activeTab` pointing at non-existing folder after update\n useEffect(() => {\n if (!folderTabs || !folderTabs.length) {\n return;\n }\n\n if (activeChatFolder >= folderTabs.length) {\n setActiveChatFolder(0);\n }\n }, [activeChatFolder, folderTabs, setActiveChatFolder]);\n\n useEffect(() => {\n if (!transitionRef.current || !IS_TOUCH_ENV || !folderTabs || !folderTabs.length) {\n return undefined;\n }\n\n return captureEvents(transitionRef.current, {\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n setActiveChatFolder(Math.min(activeChatFolder + 1, folderTabs.length - 1));\n } else if (direction === SwipeDirection.Right) {\n setActiveChatFolder(Math.max(0, activeChatFolder - 1));\n }\n }),\n });\n }, [activeChatFolder, folderTabs, setActiveChatFolder]);\n\n const isNotInAllTabRef = useRef();\n isNotInAllTabRef.current = activeChatFolder !== 0;\n useEffect(() => (isNotInAllTabRef.current ? captureEscKeyListener(() => {\n if (isNotInAllTabRef.current) {\n setActiveChatFolder(0);\n }\n }) : undefined), [activeChatFolder, setActiveChatFolder]);\n\n useHistoryBack(activeChatFolder !== 0, () => setActiveChatFolder(0));\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.ctrlKey && e.shiftKey && e.code.startsWith('Digit') && folderTabs) {\n const [, digit] = e.code.match(/Digit(\\d)/) || [];\n if (!digit) return;\n\n if (digit === SAVED_MESSAGES_HOTKEY) {\n openChat({ id: currentUserId, shouldReplaceHistory: true });\n return;\n }\n\n const folder = Number(digit) - 1;\n if (folder > folderTabs.length - 1) return;\n\n setActiveChatFolder(folder);\n e.preventDefault();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, true);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, true);\n };\n });\n\n const {\n shouldRender: shouldRenderPlaceholder, transitionClassNames,\n } = useShowTransition(!orderedFolderIds, undefined, true);\n\n function renderCurrentTab(isActive: boolean) {\n const activeFolder = Object.values(chatFoldersById)\n .find(({ title }) => title === folderTabs![activeChatFolder].title);\n\n if (!activeFolder || activeChatFolder === 0) {\n return (\n \n );\n }\n\n return (\n \n );\n }\n\n return (\n
\n {folderTabs && folderTabs.length ? (\n \n ) : shouldRenderPlaceholder ? (\n
\n ) : undefined}\n \n {renderCurrentTab}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: { byId: chatsById },\n users: { byId: usersById },\n chatFolders: {\n byId: chatFoldersById,\n orderedIds: orderedFolderIds,\n activeChatFolder,\n },\n currentUserId,\n lastSyncTime,\n } = global;\n\n return {\n chatsById,\n usersById,\n chatFoldersById,\n orderedFolderIds,\n lastSyncTime,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n activeChatFolder,\n currentUserId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadChatFolders',\n 'setActiveChatFolder',\n 'openChat',\n ]),\n)(ChatFolders));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\nimport { OwnProps } from './LeftSearch';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst LeftSearchAsync: FC = (props) => {\n const LeftSearch = useModuleLoader(Bundles.Extra, 'LeftSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return LeftSearch ? : ;\n};\n\nexport default memo(LeftSearchAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\nimport { OwnProps } from './ContactList';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst ContactListAsync: FC = (props) => {\n const ContactList = useModuleLoader(Bundles.Extra, 'ContactList');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ContactList ? : ;\n};\n\nexport default memo(ContactListAsync);\n","import React, {\n FC, useCallback, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport Menu from '../ui/Menu';\nimport MenuItem from '../ui/MenuItem';\n\nimport './NewChatButton.scss';\n\nconst MENU_CLOSE_DELAY_MS = 750;\nlet closeTimeout: number | undefined;\n\ntype OwnProps = {\n isShown: boolean;\n onNewPrivateChat: () => void;\n onNewChannel: () => void;\n onNewGroup: () => void;\n};\n\nconst NewChatButton: FC = ({\n isShown,\n onNewPrivateChat,\n onNewChannel,\n onNewGroup,\n}) => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n useEffect(() => {\n if (!isShown) {\n setIsMenuOpen(false);\n }\n }, [isShown]);\n\n const lang = useLang();\n\n const fabClassName = buildClassName(\n 'NewChatButton',\n isShown && 'revealed',\n isMenuOpen && 'menu-is-open',\n );\n\n const toggleIsMenuOpen = () => {\n setIsMenuOpen(!isMenuOpen);\n };\n\n const handleClose = () => {\n setIsMenuOpen(false);\n };\n\n const handleMouseEnter = useCallback(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n setIsMenuOpen(false);\n }, MENU_CLOSE_DELAY_MS);\n }, []);\n\n return (\n \n \n \n \n \n \n {lang('NewChannel')}\n {lang('NewGroup')}\n {lang('NewMessageTitle')}\n \n
\n );\n};\n\nexport default memo(NewChatButton);\n","import React, {\n FC, useState, useRef, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport { LeftColumnContent, SettingsScreens } from '../../../types';\nimport { FolderEditDispatch } from '../../../hooks/reducers/useFoldersReducer';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport useBrowserOnline from '../../../hooks/useBrowserOnline';\nimport useFlag from '../../../hooks/useFlag';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useLang from '../../../hooks/useLang';\n\nimport Transition from '../../ui/Transition';\nimport LeftMainHeader from './LeftMainHeader';\nimport ConnectionState from '../ConnectionState';\nimport ChatFolders from './ChatFolders';\nimport LeftSearch from '../search/LeftSearch.async';\nimport ContactList from './ContactList.async';\nimport NewChatButton from '../NewChatButton';\nimport ShowTransition from '../../ui/ShowTransition';\nimport Button from '../../ui/Button';\n\nimport './LeftMain.scss';\n\ntype OwnProps = {\n content: LeftColumnContent;\n searchQuery?: string;\n searchDate?: number;\n contactsFilter: string;\n shouldSkipTransition?: boolean;\n foldersDispatch: FolderEditDispatch;\n onSearchQuery: (query: string) => void;\n onContentChange: (content: LeftColumnContent) => void;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick;\n\nconst TRANSITION_RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\nconst BUTTON_CLOSE_DELAY_MS = 250;\nconst APP_OUTDATED_TIMEOUT = 3 * 24 * 60 * 60 * 1000; // 3 days\n\nlet closeTimeout: number | undefined;\n\nconst LeftMain: FC = ({\n content,\n searchQuery,\n searchDate,\n contactsFilter,\n shouldSkipTransition,\n foldersDispatch,\n onSearchQuery,\n onContentChange,\n onScreenSelect,\n onReset,\n connectionState,\n}) => {\n const [isNewChatButtonShown, setIsNewChatButtonShown] = useState(IS_TOUCH_ENV);\n\n const isBrowserOnline = useBrowserOnline();\n const isConnecting = !isBrowserOnline || connectionState === 'connectionStateConnecting';\n\n const isMouseInside = useRef(false);\n\n const handleSelectSettings = useCallback(() => {\n onContentChange(LeftColumnContent.Settings);\n }, [onContentChange]);\n\n const handleSelectContacts = useCallback(() => {\n onContentChange(LeftColumnContent.Contacts);\n }, [onContentChange]);\n\n const handleSelectNewChannel = useCallback(() => {\n onContentChange(LeftColumnContent.NewChannelStep1);\n }, [onContentChange]);\n\n const handleSelectNewGroup = useCallback(() => {\n onContentChange(LeftColumnContent.NewGroupStep1);\n }, [onContentChange]);\n\n const handleSelectArchived = useCallback(() => {\n onContentChange(LeftColumnContent.Archived);\n }, [onContentChange]);\n\n const handleMouseEnter = useCallback(() => {\n if (content !== LeftColumnContent.ChatList) {\n return;\n }\n isMouseInside.current = true;\n setIsNewChatButtonShown(true);\n }, [content]);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n setIsNewChatButtonShown(false);\n }\n }, BUTTON_CLOSE_DELAY_MS);\n }, []);\n\n useEffect(() => {\n let autoCloseTimeout: number | undefined;\n if (content !== LeftColumnContent.ChatList) {\n autoCloseTimeout = window.setTimeout(() => {\n setIsNewChatButtonShown(false);\n }, BUTTON_CLOSE_DELAY_MS);\n } else if (isMouseInside.current || IS_TOUCH_ENV) {\n setIsNewChatButtonShown(true);\n }\n\n return () => {\n if (autoCloseTimeout) {\n clearTimeout(autoCloseTimeout);\n autoCloseTimeout = undefined;\n }\n };\n }, [content]);\n\n const [shouldRenderUpdateButton, updateButtonClassNames, handleUpdateClick] = useAppOutdatedCheck();\n\n const lang = useLang();\n\n return (\n \n \n \n {() => }\n \n \n {(isActive) => {\n switch (content) {\n case LeftColumnContent.ChatList:\n return ;\n case LeftColumnContent.GlobalSearch:\n return (\n \n );\n case LeftColumnContent.Contacts:\n return ;\n default:\n return undefined;\n }\n }}\n \n {shouldRenderUpdateButton && (\n \n {lang('lng_update_telegram')}\n \n )}\n \n
\n );\n};\n\nfunction useAppOutdatedCheck() {\n const [isAppOutdated, markIsAppOutdated] = useFlag(false);\n\n useEffect(() => {\n const timeout = window.setTimeout(markIsAppOutdated, APP_OUTDATED_TIMEOUT);\n\n return () => {\n clearTimeout(timeout);\n };\n }, [markIsAppOutdated]);\n\n const { shouldRender, transitionClassNames } = useShowTransition(isAppOutdated);\n\n const handleUpdateClick = () => {\n window.location.reload();\n };\n\n return [shouldRender, transitionClassNames, handleUpdateClick] as const;\n}\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['connectionState']),\n)(LeftMain);\n","import { useEffect, useState } from '../lib/teact/teact';\n\nexport default function useBrowserOnline() {\n const [isOnline, setIsOnline] = useState(window.navigator.onLine);\n\n useEffect(() => {\n function handleChange() {\n setIsOnline(window.navigator.onLine);\n }\n\n window.addEventListener('online', handleChange);\n window.addEventListener('offline', handleChange);\n\n return () => {\n window.removeEventListener('offline', handleChange);\n window.removeEventListener('online', handleChange);\n };\n }, []);\n\n return isOnline;\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './Settings';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst SettingsAsync: FC = (props) => {\n const Settings = useModuleLoader(Bundles.Extra, 'Settings');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Settings ? : ;\n};\n\nexport default memo(SettingsAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './NewChat';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst NewChatAsync: FC = (props) => {\n const NewChat = useModuleLoader(Bundles.Extra, 'NewChat');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return NewChat ? : ;\n};\n\nexport default memo(NewChatAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './ArchivedChats';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst ArchivedChatsAsync: FC = (props) => {\n const ArchivedChats = useModuleLoader(Bundles.Extra, 'ArchivedChats');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ArchivedChats ? : ;\n};\n\nexport default memo(ArchivedChatsAsync);\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { LeftColumnContent, SettingsScreens } from '../../types';\n\nimport { LAYERS_ANIMATION_NAME } from '../../util/environment';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\nimport useFoldersReducer from '../../hooks/reducers/useFoldersReducer';\n\nimport Transition from '../ui/Transition';\nimport LeftMain from './main/LeftMain';\nimport Settings from './settings/Settings.async';\nimport NewChat from './newChat/NewChat.async';\nimport ArchivedChats from './ArchivedChats.async';\n\nimport './LeftColumn.scss';\n\ntype StateProps = {\n searchQuery?: string;\n searchDate?: number;\n activeChatFolder: number;\n shouldSkipHistoryAnimations?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nenum ContentType {\n Main,\n // eslint-disable-next-line no-shadow\n Settings,\n Archived,\n // eslint-disable-next-line no-shadow\n NewGroup,\n // eslint-disable-next-line no-shadow\n NewChannel\n}\n\nconst RENDER_COUNT = Object.keys(ContentType).length / 2;\nconst RESET_TRANSITION_DELAY_MS = 250;\n\nconst LeftColumn: FC = ({\n searchQuery,\n searchDate,\n activeChatFolder,\n shouldSkipHistoryAnimations,\n setGlobalSearchQuery,\n setGlobalSearchChatId,\n resetChatCreation,\n setGlobalSearchDate,\n loadPasswordInfo,\n clearTwoFaError,\n}) => {\n const [content, setContent] = useState(LeftColumnContent.ChatList);\n const [settingsScreen, setSettingsScreen] = useState(SettingsScreens.Main);\n const [contactsFilter, setContactsFilter] = useState('');\n const [foldersState, foldersDispatch] = useFoldersReducer();\n\n // Used to reset child components in background.\n const [lastResetTime, setLastResetTime] = useState(0);\n\n let contentType: ContentType = ContentType.Main;\n switch (content) {\n case LeftColumnContent.Archived:\n contentType = ContentType.Archived;\n break;\n case LeftColumnContent.Settings:\n contentType = ContentType.Settings;\n break;\n case LeftColumnContent.NewChannelStep1:\n case LeftColumnContent.NewChannelStep2:\n contentType = ContentType.NewChannel;\n break;\n case LeftColumnContent.NewGroupStep1:\n case LeftColumnContent.NewGroupStep2:\n contentType = ContentType.NewGroup;\n break;\n }\n\n const handleReset = useCallback((forceReturnToChatList?: boolean) => {\n if (content === LeftColumnContent.NewGroupStep2\n && !forceReturnToChatList\n ) {\n setContent(LeftColumnContent.NewGroupStep1);\n return;\n }\n\n if (content === LeftColumnContent.NewChannelStep2\n && !forceReturnToChatList\n ) {\n setContent(LeftColumnContent.NewChannelStep1);\n return;\n }\n\n if (content === LeftColumnContent.NewGroupStep1) {\n const pickerSearchInput = document.getElementById('new-group-picker-search');\n if (pickerSearchInput) {\n pickerSearchInput.blur();\n }\n }\n\n if (content === LeftColumnContent.Settings) {\n switch (settingsScreen) {\n case SettingsScreens.EditProfile:\n case SettingsScreens.Folders:\n case SettingsScreens.General:\n case SettingsScreens.Notifications:\n case SettingsScreens.Privacy:\n case SettingsScreens.Language:\n setSettingsScreen(SettingsScreens.Main);\n return;\n\n case SettingsScreens.GeneralChatBackground:\n setSettingsScreen(SettingsScreens.General);\n return;\n case SettingsScreens.GeneralChatBackgroundColor:\n setSettingsScreen(SettingsScreens.GeneralChatBackground);\n return;\n\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyGroupChats:\n case SettingsScreens.PrivacyActiveSessions:\n case SettingsScreens.PrivacyBlockedUsers:\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaEnabled:\n case SettingsScreens.TwoFaCongratulations:\n setSettingsScreen(SettingsScreens.Privacy);\n return;\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyPhoneNumber);\n return;\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyLastSeen);\n return;\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyProfilePhoto);\n return;\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyForwarding);\n return;\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyGroupChats);\n return;\n case SettingsScreens.TwoFaNewPassword:\n setSettingsScreen(SettingsScreens.TwoFaDisabled);\n return;\n case SettingsScreens.TwoFaNewPasswordConfirm:\n setSettingsScreen(SettingsScreens.TwoFaNewPassword);\n return;\n case SettingsScreens.TwoFaNewPasswordHint:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordConfirm);\n return;\n case SettingsScreens.TwoFaNewPasswordEmail:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordHint);\n return;\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordEmail);\n return;\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n setSettingsScreen(SettingsScreens.TwoFaEnabled);\n return;\n case SettingsScreens.TwoFaChangePasswordNew:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordCurrent);\n return;\n case SettingsScreens.TwoFaChangePasswordConfirm:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordNew);\n return;\n case SettingsScreens.TwoFaChangePasswordHint:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordConfirm);\n return;\n case SettingsScreens.TwoFaRecoveryEmail:\n setSettingsScreen(SettingsScreens.TwoFaRecoveryEmailCurrentPassword);\n return;\n case SettingsScreens.TwoFaRecoveryEmailCode:\n setSettingsScreen(SettingsScreens.TwoFaRecoveryEmail);\n return;\n\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n setSettingsScreen(SettingsScreens.Folders);\n return;\n\n case SettingsScreens.FoldersIncludedChatsFromChatList:\n case SettingsScreens.FoldersExcludedChatsFromChatList:\n setSettingsScreen(SettingsScreens.FoldersEditFolderFromChatList);\n return;\n\n case SettingsScreens.FoldersEditFolderFromChatList:\n setContent(LeftColumnContent.ChatList);\n setSettingsScreen(SettingsScreens.Main);\n return;\n default:\n break;\n }\n }\n\n if (content === LeftColumnContent.ChatList && activeChatFolder === 0) {\n setContent(LeftColumnContent.GlobalSearch);\n return;\n }\n\n setContent(LeftColumnContent.ChatList);\n setContactsFilter('');\n setGlobalSearchQuery({ query: '' });\n setGlobalSearchDate({ date: undefined });\n setGlobalSearchChatId({ id: undefined });\n resetChatCreation();\n setTimeout(() => {\n setLastResetTime(Date.now());\n }, RESET_TRANSITION_DELAY_MS);\n }, [\n content, activeChatFolder, settingsScreen, setGlobalSearchQuery, setGlobalSearchDate, setGlobalSearchChatId,\n resetChatCreation,\n ]);\n\n const handleSearchQuery = useCallback((query: string) => {\n if (content === LeftColumnContent.Contacts) {\n setContactsFilter(query);\n return;\n }\n\n setContent(LeftColumnContent.GlobalSearch);\n\n if (query !== searchQuery) {\n setGlobalSearchQuery({ query });\n }\n }, [content, searchQuery, setGlobalSearchQuery]);\n\n useEffect(\n () => (content !== LeftColumnContent.ChatList || activeChatFolder === 0\n ? captureEscKeyListener(() => handleReset())\n : undefined),\n [activeChatFolder, content, handleReset],\n );\n\n useEffect(() => {\n clearTwoFaError();\n\n if (settingsScreen === SettingsScreens.Privacy) {\n loadPasswordInfo();\n }\n }, [clearTwoFaError, loadPasswordInfo, settingsScreen]);\n\n const handleSettingsScreenSelect = (screen: SettingsScreens) => {\n setContent(LeftColumnContent.Settings);\n setSettingsScreen(screen);\n };\n\n return (\n \n {(isActive) => {\n switch (contentType) {\n case ContentType.Archived:\n return (\n \n );\n case ContentType.Settings:\n return (\n \n );\n case ContentType.NewChannel:\n return (\n \n );\n case ContentType.NewGroup:\n return (\n \n );\n default:\n return (\n \n );\n }\n }}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n globalSearch: {\n query,\n date,\n },\n chatFolders: {\n activeChatFolder,\n },\n shouldSkipHistoryAnimations,\n } = global;\n return {\n searchQuery: query, searchDate: date, activeChatFolder, shouldSkipHistoryAnimations,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setGlobalSearchQuery', 'setGlobalSearchChatId', 'resetChatCreation', 'setGlobalSearchDate',\n 'loadPasswordInfo', 'clearTwoFaError',\n ]),\n)(LeftColumn));\n","import { useEffect, useState } from '../lib/teact/teact';\n\nimport { throttle } from '../util/schedulers';\nimport windowSize from '../util/windowSize';\nimport { ApiDimensions } from '../api/types';\n\nconst THROTTLE = 250;\n\nexport default () => {\n const [size, setSize] = useState(windowSize.get());\n\n useEffect(() => {\n const handleResize = throttle(() => {\n setSize(windowSize.get());\n }, THROTTLE, false);\n\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, []);\n\n return size;\n};\n","import {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n} from '../../../config';\n\nconst REM = 16; // px\nconst MAX_TOOLBAR_WIDTH = 32 * REM;\nconst MAX_MESSAGES_LIST_WIDTH = 45.5 * REM;\nconst SIDE_COLUMN_MAX_WIDTH = 26.5 * REM;\nconst MIN_LEFT_COLUMN_WIDTH = 18 * REM;\nconst UNPIN_BUTTON_WIDTH = 16.125 * REM;\n\nexport default function calculateMiddleFooterTransforms(windowWidth: number, canPost?: boolean) {\n const sidePadding = windowWidth <= MOBILE_SCREEN_MAX_WIDTH\n ? REM\n : 2 * REM;\n const messageListWidth = getMessageListWidth(windowWidth);\n const sendButtonWidth = windowWidth <= MOBILE_SCREEN_MAX_WIDTH\n ? 3.375 * REM\n : 4 * REM;\n\n const composerWidth = canPost\n ? messageListWidth - sidePadding - sendButtonWidth\n : messageListWidth - sidePadding;\n const toolbarWidth = windowWidth > MOBILE_SCREEN_MAX_WIDTH\n ? Math.min(messageListWidth - sidePadding, MAX_TOOLBAR_WIDTH)\n : messageListWidth - sidePadding;\n\n const composerHiddenScale = toolbarWidth / composerWidth;\n const toolbarHiddenScale = composerWidth / toolbarWidth;\n const unpinHiddenScale = toolbarWidth / UNPIN_BUTTON_WIDTH;\n const toolbarForUnpinHiddenScale = UNPIN_BUTTON_WIDTH / toolbarWidth;\n\n const composerTranslateX = canPost\n ? (sendButtonWidth / 2) * toolbarHiddenScale\n : 0;\n\n const toolbarTranslateX = canPost\n ? (sendButtonWidth / 2) * -1 * composerHiddenScale\n : 0;\n\n return {\n composerHiddenScale,\n toolbarHiddenScale,\n composerTranslateX,\n toolbarTranslateX,\n unpinHiddenScale,\n toolbarForUnpinHiddenScale,\n };\n}\n\nfunction getMessageListWidth(windowWidth: number) {\n if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN) {\n const leftColumnWidth = Math.min(\n Math.max(windowWidth * 0.25, MIN_LEFT_COLUMN_WIDTH),\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n const rightColumnWidth = Math.min(\n windowWidth * 0.25,\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n return Math.min(\n windowWidth - leftColumnWidth - rightColumnWidth,\n MAX_MESSAGES_LIST_WIDTH,\n );\n }\n\n if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN) {\n const leftColumnWidth = Math.min(\n Math.max(windowWidth * 0.4, MIN_LEFT_COLUMN_WIDTH),\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n return Math.min(\n windowWidth - leftColumnWidth,\n MAX_MESSAGES_LIST_WIDTH,\n );\n }\n\n if (windowWidth > MAX_MESSAGES_LIST_WIDTH) {\n return MAX_MESSAGES_LIST_WIDTH;\n }\n\n return windowWidth;\n}\n","import { MessageList, MessageListType } from '../global/types';\nimport { MAIN_THREAD_ID } from '../api/types';\n\nexport const createMessageHash = (messageList: MessageList): string => (\n messageList.chatId.toString()\n + (messageList.type !== 'thread' ? `_${messageList.type}`\n : (messageList.threadId !== -1 ? `_${messageList.threadId}` : ''))\n);\n\nexport const parseMessageHash = (value: string): MessageList => {\n const [chatId, typeOrThreadId] = value.split('_');\n const isType = ['thread', 'pinned', 'scheduled'].includes(typeOrThreadId);\n\n return {\n chatId: Number(chatId),\n type: !!typeOrThreadId && isType ? (typeOrThreadId as MessageListType) : 'thread',\n threadId: !!typeOrThreadId && !isType ? Number(typeOrThreadId) : MAIN_THREAD_ID,\n };\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './HeaderMenuContainer';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst HeaderMenuContainerAsync: FC = (props) => {\n const { isOpen } = props;\n const HeaderMenuContainer = useModuleLoader(Bundles.Extra, 'HeaderMenuContainer', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return HeaderMenuContainer ? : undefined;\n};\n\nexport default memo(HeaderMenuContainerAsync);\n","import React, {\n FC,\n memo,\n useRef,\n useCallback,\n useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { MAIN_THREAD_ID } from '../../api/types';\nimport { IAnchorPosition } from '../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { pick } from '../../util/iteratees';\nimport { isChatChannel, isChatSuperGroup } from '../../modules/helpers';\nimport {\n selectChat,\n selectChatBot,\n selectIsUserBlocked,\n selectIsChatBotNotStarted,\n selectIsChatWithSelf,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n} from '../../modules/selectors';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport HeaderMenuContainer from './HeaderMenuContainer.async';\n\ninterface OwnProps {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n}\n\ninterface StateProps {\n noMenu?: boolean;\n isChannel?: boolean;\n isRightColumnShown?: boolean;\n canStartBot?: boolean;\n canRestartBot?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canMute?: boolean;\n canSelect?: boolean;\n canLeave?: boolean;\n}\n\ntype DispatchProps = Pick;\n\n// Chrome breaks layout when focusing input during transition\nconst SEARCH_FOCUS_DELAY_MS = 400;\n\nconst HeaderActions: FC = ({\n chatId,\n threadId,\n noMenu,\n isChannel,\n canStartBot,\n canRestartBot,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n isRightColumnShown,\n joinChannel,\n sendBotCommand,\n openLocalTextSearch,\n restartBot,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuButtonRef = useRef(null);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [menuPosition, setMenuPosition] = useState(undefined);\n\n const handleHeaderMenuOpen = useCallback(() => {\n setIsMenuOpen(true);\n const rect = menuButtonRef.current!.getBoundingClientRect();\n setMenuPosition({ x: rect.right, y: rect.bottom });\n }, []);\n\n const handleHeaderMenuClose = useCallback(() => {\n setIsMenuOpen(false);\n }, []);\n\n const handleHeaderMenuHide = useCallback(() => {\n setMenuPosition(undefined);\n }, []);\n\n const handleSubscribeClick = useCallback(() => {\n joinChannel({ chatId });\n }, [joinChannel, chatId]);\n\n const handleStartBot = useCallback(() => {\n sendBotCommand({ command: '/start' });\n }, [sendBotCommand]);\n\n const handleRestartBot = useCallback(() => {\n restartBot({ chatId });\n }, [chatId, restartBot]);\n\n const handleSearchClick = useCallback(() => {\n openLocalTextSearch();\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n // iOS requires synchronous focus on user event.\n const searchInput = document.querySelector('#MobileSearch input')!;\n searchInput.focus();\n } else {\n setTimeout(() => {\n const searchInput = document.querySelector('.RightHeader .SearchInput input');\n if (searchInput) {\n searchInput.focus();\n }\n }, SEARCH_FOCUS_DELAY_MS);\n }\n }, [openLocalTextSearch]);\n\n const lang = useLang();\n\n return (\n
\n {!IS_SINGLE_COLUMN_LAYOUT && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {!IS_SINGLE_COLUMN_LAYOUT && canStartBot && (\n \n {lang('BotStart')}\n \n )}\n {!IS_SINGLE_COLUMN_LAYOUT && canRestartBot && (\n \n {lang('BotRestart')}\n \n )}\n {!IS_SINGLE_COLUMN_LAYOUT && canSearch && (\n \n \n \n )}\n {(IS_SINGLE_COLUMN_LAYOUT || !canSubscribe) && (\n \n \n \n )}\n {menuPosition && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const chat = selectChat(global, chatId);\n const isChannel = Boolean(chat && isChatChannel(chat));\n\n if (chat && chat.isRestricted) {\n return {\n noMenu: true,\n };\n }\n\n const bot = selectChatBot(global, chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const isMainThread = messageListType === 'thread' && threadId === MAIN_THREAD_ID;\n const isDiscussionThread = messageListType === 'thread' && threadId !== MAIN_THREAD_ID;\n const isRightColumnShown = selectIsRightColumnShown(global);\n\n const canRestartBot = Boolean(bot && selectIsUserBlocked(global, bot.id));\n const canStartBot = !canRestartBot && Boolean(selectIsChatBotNotStarted(global, chatId));\n const canSubscribe = Boolean(\n isMainThread && chat && (isChannel || isChatSuperGroup(chat)) && chat.isNotJoined,\n );\n const canSearch = isMainThread || isDiscussionThread;\n const canMute = isMainThread && !isChatWithSelf && !canSubscribe;\n const canSelect = !selectIsInSelectMode(global);\n const canLeave = isMainThread && !canSubscribe;\n\n const noMenu = !(\n (IS_SINGLE_COLUMN_LAYOUT && canSubscribe)\n || (IS_SINGLE_COLUMN_LAYOUT && canSearch)\n || canMute\n || canSelect\n || canLeave\n );\n\n return {\n noMenu,\n isChannel,\n isRightColumnShown,\n canStartBot,\n canRestartBot,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'joinChannel', 'sendBotCommand', 'openLocalTextSearch', 'restartBot',\n ]),\n)(HeaderActions));\n","import { useLayoutEffect, useState } from '../lib/teact/teact';\n\nimport { ApiMessage } from '../api/types';\n\nimport { DEBUG } from '../config';\nimport { isWebpSupported } from '../util/environment';\nimport { EMPTY_IMAGE_DATA_URI, webpToPngBase64 } from '../util/webpToPng';\nimport { getMessageMediaThumbDataUri } from '../modules/helpers';\n\nexport default function useWebpThumbnail(message?: ApiMessage) {\n const thumbnail = message && getMessageMediaThumbDataUri(message);\n const { sticker } = (message && message.content) || {};\n const shouldDecodeThumbnail = thumbnail && sticker && !isWebpSupported() && thumbnail.includes('image/webp');\n const [thumbnailDecoded, setThumbnailDecoded] = useState(EMPTY_IMAGE_DATA_URI);\n const messageId = message && message.id;\n\n useLayoutEffect(() => {\n if (!shouldDecodeThumbnail) {\n return;\n }\n\n webpToPngBase64(`b64-${messageId}`, thumbnail!)\n .then(setThumbnailDecoded)\n .catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n });\n }, [messageId, shouldDecodeThumbnail, thumbnail]);\n\n return shouldDecodeThumbnail ? thumbnailDecoded : thumbnail;\n}\n","import React, {\n FC,\n useRef,\n useEffect,\n useMemo,\n memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n count: number;\n index: number;\n};\n\nconst BORDER_MASK_LEVEL = 4;\n\nconst PinnedMessageNavigation: FC = ({\n count, index,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const markupParams = useMemo(() => {\n return calculateMarkup(count, index);\n }, [count, index]);\n\n useEffect(() => {\n if (!containerRef.current) {\n return;\n }\n\n const {\n trackHeight,\n trackTranslateY,\n markHeight,\n markTranslateY,\n clipPathId,\n clipPath,\n } = markupParams;\n\n const firstChild = containerRef.current.firstElementChild;\n if (containerRef && containerRef.current) {\n const currentElement = containerRef.current;\n const { style } = currentElement;\n style.height = `${trackHeight}px`;\n style.transform = `translateY(-${trackTranslateY}px)`;\n style.clipPath = `url(\"#${clipPathId}\")`;\n const svg = currentElement.querySelector('svg');\n const div = currentElement.querySelector('div');\n const defs = currentElement.querySelector('defs');\n if (!svg) {\n if (firstChild) {\n firstChild.innerHTML = ` ${clipPath} `;\n }\n }\n if (defs) {\n defs.innerHTML = clipPath;\n }\n if (div) {\n div.style.height = `${markHeight}px`;\n div.style.transform = `translateY(${markTranslateY}px)`;\n }\n }\n }, [markupParams]);\n\n if (count === 1) {\n return (\n
\n \n
\n );\n }\n\n const {\n trackHeight, trackTranslateY, markHeight, markTranslateY, clipPathId,\n } = markupParams;\n\n return (\n
BORDER_MASK_LEVEL && 'pinned-message-border-mask')}>\n \n \n \n
\n \n );\n};\n\nfunction calculateMarkup(count: number, index: number) {\n const reverseIndex = count - index - 1;\n const barHeight = getBarHeight(count);\n const markHeight = getMarkHeight(count, reverseIndex);\n const trackHeight = getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath${count}`;\n const clipPath = getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = getMarkTranslateY(reverseIndex, barHeight, count);\n const trackTranslateY = getTrackTranslateY(reverseIndex, count, barHeight, trackHeight);\n return {\n markHeight,\n clipPath,\n markTranslateY,\n trackTranslateY,\n trackHeight,\n clipPathId,\n };\n}\n\nfunction getBarHeight(count: number): number {\n let barHeight = 8;\n if (count === 1) {\n barHeight = 36;\n } else if (count === 2) {\n barHeight = 17;\n } else if (count === 3) {\n barHeight = 11;\n } else if (count === 4) {\n barHeight = 7.5;\n } else if (count > 3) {\n barHeight = 7.5;\n }\n\n return barHeight;\n}\n\nfunction getMarkHeight(count: number, index: number) {\n let barHeight = 36;\n if (count === 1) {\n barHeight = 36;\n } else if (count === 2) {\n barHeight = 17;\n } else if (count === 3) {\n barHeight = index === 1 ? 12 : 11;\n } else if (count === 4) {\n barHeight = 7.5;\n } else if (count > 3) {\n barHeight = 7.5;\n }\n\n return barHeight;\n}\n\nfunction getTrackHeight(count: number, barHeight: number) {\n return count <= 3 ? 36 : barHeight * count + 2 * (count - 1);\n}\n\nfunction getClipPath(id: string, barHeight: number, count: number) {\n const radius = 1;\n\n let d = '';\n if (count === 3) {\n d = drawRect(0, 0, 2, barHeight, radius)\n + drawRect(0, 12, 2, barHeight + 1, radius)\n + drawRect(0, 25, 2, barHeight, radius);\n } else {\n for (let i = 0; i < count; i++) {\n d += drawRect(0, (barHeight + 2) * i, 2, barHeight, radius);\n }\n }\n\n return (\n `\n \n `\n );\n}\n\nfunction drawRect(x: number, y: number, width: number, height: number, radius: number) {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,\n ${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n}\n\nfunction getMarkTranslateY(index: number, barHeight: number, count: number) {\n if (count === 1) {\n return 0;\n } else if (count === 2) {\n return index === 0 ? 0 : barHeight + 2;\n }\n\n if (count === 3) {\n if (index === 0) {\n return 0;\n } else if (index === 1) {\n return 12;\n }\n\n return 25;\n } else {\n return (barHeight + 2) * index;\n }\n}\n\nfunction getTrackTranslateY(index: number, count: number, barHeight: number, trackHeight: number) {\n if (count <= 4) {\n return 0;\n }\n\n if (index <= 1) {\n return 0;\n } else if (index >= count - 2) {\n return trackHeight - 36;\n }\n\n return (barHeight + 4) / 2 + (index - 2) * (barHeight + 2);\n}\n\nexport default memo(PinnedMessageNavigation);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { getPictogramDimensions } from '../common/helpers/mediaDimensions';\nimport { getMessageMediaHash, getMessageSummaryText } from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useMedia from '../../hooks/useMedia';\nimport useWebpThumbnail from '../../hooks/useWebpThumbnail';\n\nimport ConfirmDialog from '../ui/ConfirmDialog';\nimport Button from '../ui/Button';\nimport RippleEffect from '../ui/RippleEffect';\nimport buildClassName from '../../util/buildClassName';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport PinnedMessageNavigation from './PinnedMessageNavigation';\n\ntype OwnProps = {\n message: ApiMessage;\n index: number;\n count: number;\n customTitle?: string;\n className?: string;\n onUnpinMessage?: (id: number) => void;\n onClick?: () => void;\n onAllPinnedClick?: () => void;\n};\n\nconst HeaderPinnedMessage: FC = ({\n message, count, index, customTitle, className, onUnpinMessage, onClick, onAllPinnedClick,\n}) => {\n const lang = useLang();\n const mediaThumbnail = useWebpThumbnail(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram'));\n\n const text = getMessageSummaryText(lang, message, Boolean(mediaThumbnail));\n const [isUnpinDialogOpen, openUnpinDialog, closeUnpinDialog] = useFlag();\n\n const handleUnpinMessage = useCallback(() => {\n closeUnpinDialog();\n\n if (onUnpinMessage) {\n onUnpinMessage(message.id);\n }\n }, [closeUnpinDialog, onUnpinMessage, message.id]);\n\n return (\n
\n {count > 1 && (\n \n \n \n )}\n {onUnpinMessage && (\n \n \n \n )}\n \n
\n \n {mediaThumbnail && renderPictogram(mediaThumbnail, mediaBlobUrl)}\n
\n
\n {customTitle || `${lang('PinnedMessage')} ${index > 0 ? `#${count - index}` : ''}`}\n
\n

{renderText(text)}

\n
\n\n \n
\n
\n );\n};\n\nfunction renderPictogram(thumbDataUri: string, blobUrl?: string) {\n const { width, height } = getPictogramDimensions();\n\n return (\n \"\"\n );\n}\n\nexport default memo(HeaderPinnedMessage);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiAudio, ApiChat, ApiMessage, ApiUser,\n} from '../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport * as mediaLoader from '../../util/mediaLoader';\nimport {\n getMediaDuration, getMessageAudio, getMessageKey, getMessageMediaHash, getSenderTitle,\n} from '../../modules/helpers';\nimport { selectSender } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport renderText from '../common/helpers/renderText';\nimport useAudioPlayer from '../../hooks/useAudioPlayer';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport RippleEffect from '../ui/RippleEffect';\nimport Button from '../ui/Button';\n\nimport './AudioPlayer.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n className?: string;\n noUi?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiChat | ApiUser;\n};\n\ntype DispatchProps = Pick;\n\nconst AudioPlayer: FC = ({\n message, className, noUi, sender, focusMessage, closeAudioPlayer,\n}) => {\n const lang = useLang();\n\n const senderName = sender ? getSenderTitle(lang, sender) : undefined;\n const mediaData = mediaLoader.getFromMemory(getMessageMediaHash(message, 'inline')!) as (string | undefined);\n const { playPause, isPlaying } = useAudioPlayer(\n getMessageKey(message), getMediaDuration(message)!, mediaData, undefined, undefined, true,\n );\n\n const handleClick = useCallback(() => {\n focusMessage({ chatId: message.chatId, messageId: message.id });\n }, [focusMessage, message.chatId, message.id]);\n\n const handleClose = useCallback(() => {\n if (isPlaying) {\n playPause();\n }\n closeAudioPlayer();\n }, [closeAudioPlayer, isPlaying, playPause]);\n\n if (noUi) {\n return undefined;\n }\n\n const audio = getMessageAudio(message);\n\n return (\n
\n \n \n \n \n\n
\n {audio ? renderAudio(audio) : renderVoice(lang('AttachAudio'), senderName)}\n \n
\n\n \n \n \n
\n );\n};\n\nfunction renderAudio(audio: ApiAudio) {\n const { title, performer, fileName } = audio;\n\n return (\n <>\n
{renderText(title || fileName)}
\n {performer && (\n
{renderText(performer)}
\n )}\n \n );\n}\n\nfunction renderVoice(subtitle: string, senderName?: string) {\n return (\n <>\n
{senderName && renderText(senderName)}
\n
{subtitle}
\n \n );\n}\n\nexport default withGlobal(\n (global, { message }): StateProps => {\n const sender = selectSender(global, message);\n\n return { sender };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['focusMessage', 'closeAudioPlayer']),\n)(AudioPlayer);\n","import React, {\n FC, useCallback, useMemo, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport cycleRestrict from '../../util/cycleRestrict';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport {\n ApiMessage,\n ApiChat,\n ApiTypingStatus,\n MAIN_THREAD_ID, ApiUser,\n} from '../../api/types';\nimport { NotifyException, NotifySettings } from '../../types';\n\nimport {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n EDITABLE_INPUT_ID,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_CHAT_INFO,\n} from '../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TABLET_COLUMN_LAYOUT } from '../../util/environment';\nimport {\n isChatPrivate,\n isChatArchived,\n getMessageKey,\n getChatTitle,\n getSenderTitle,\n selectIsChatMuted,\n} from '../../modules/helpers';\nimport {\n selectChat,\n selectChatMessage,\n selectAllowedMessageActions,\n selectIsRightColumnShown,\n selectThreadTopMessageId,\n selectThreadInfo,\n selectChatMessages,\n selectPinnedIds,\n selectIsChatWithSelf,\n selectForwardedSender,\n selectScheduledIds,\n selectIsInSelectMode,\n selectIsChatWithBot,\n selectNotifySettings,\n selectNotifyExceptions,\n} from '../../modules/selectors';\nimport useEnsureMessage from '../../hooks/useEnsureMessage';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\nimport { pick } from '../../util/iteratees';\nimport { formatIntegerCompact } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport GroupChatInfo from '../common/GroupChatInfo';\nimport Transition from '../ui/Transition';\nimport Button from '../ui/Button';\nimport HeaderActions from './HeaderActions';\nimport HeaderPinnedMessage from './HeaderPinnedMessage';\nimport AudioPlayer from './AudioPlayer';\n\nimport './MiddleHeader.scss';\n\nconst ANIMATION_DURATION = 350;\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n isReady?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n pinnedMessageIds?: number[] | number;\n messagesById?: Record;\n canUnpin?: boolean;\n topMessageSender?: ApiChat | ApiUser;\n typingStatus?: ApiTypingStatus;\n isSelectModeActive?: boolean;\n isLeftColumnShown?: boolean;\n isRightColumnShown?: boolean;\n audioMessage?: ApiMessage;\n chatsById?: Record;\n messagesCount?: number;\n isChatWithSelf?: boolean;\n isChatWithBot?: boolean;\n lastSyncTime?: number;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n shouldSkipHistoryAnimations?: boolean;\n currentTransitionKey: number;\n};\n\ntype DispatchProps = Pick;\n\nconst MiddleHeader: FC = ({\n chatId,\n threadId,\n messageListType,\n isReady,\n pinnedMessageIds,\n messagesById,\n canUnpin,\n topMessageSender,\n typingStatus,\n isSelectModeActive,\n isLeftColumnShown,\n isRightColumnShown,\n audioMessage,\n chat,\n chatsById,\n messagesCount,\n isChatWithSelf,\n isChatWithBot,\n lastSyncTime,\n notifySettings,\n notifyExceptions,\n shouldSkipHistoryAnimations,\n currentTransitionKey,\n openChatWithInfo,\n pinMessage,\n focusMessage,\n openChat,\n openPreviousChat,\n loadPinnedMessages,\n toggleLeftColumn,\n exitMessageSelectMode,\n}) => {\n const lang = useLang();\n\n const [pinnedMessageIndex, setPinnedMessageIndex] = useState(0);\n const pinnedMessageId = Array.isArray(pinnedMessageIds) ? pinnedMessageIds[pinnedMessageIndex] : pinnedMessageIds;\n const pinnedMessage = messagesById && pinnedMessageId ? messagesById[pinnedMessageId] : undefined;\n const pinnedMessagesCount = Array.isArray(pinnedMessageIds) ? pinnedMessageIds.length : (pinnedMessageIds ? 1 : 0);\n const chatTitleLength = chat && getChatTitle(lang, chat).length;\n const topMessageTitle = topMessageSender ? getSenderTitle(lang, topMessageSender) : undefined;\n\n useEffect(() => {\n if (threadId === MAIN_THREAD_ID && lastSyncTime && isReady) {\n loadPinnedMessages({ chatId });\n }\n }, [chatId, loadPinnedMessages, lastSyncTime, threadId, isReady]);\n\n // Reset pinned index when switching chats and pinning/unpinning\n useEffect(() => {\n setPinnedMessageIndex(0);\n }, [pinnedMessageIds]);\n\n useEnsureMessage(chatId, pinnedMessageId, pinnedMessage);\n\n const { width: windowWidth } = useWindowSize();\n\n const isLeftColumnHideable = windowWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN;\n const shouldShowCloseButton = IS_TABLET_COLUMN_LAYOUT && isLeftColumnShown;\n\n // eslint-disable-next-line no-null/no-null\n const componentRef = useRef(null);\n const shouldAnimateTools = useRef(true);\n\n const handleHeaderClick = useCallback(() => {\n openChatWithInfo({ id: chatId });\n }, [openChatWithInfo, chatId]);\n\n const handleUnpinMessage = useCallback((messageId: number) => {\n pinMessage({ chatId, messageId, isUnpin: true });\n }, [pinMessage, chatId]);\n\n const handlePinnedMessageClick = useCallback((): void => {\n if (pinnedMessage) {\n focusMessage({ chatId: pinnedMessage.chatId, threadId, messageId: pinnedMessage.id });\n\n const newIndex = cycleRestrict(pinnedMessagesCount, pinnedMessageIndex + 1);\n setPinnedMessageIndex(newIndex);\n }\n }, [pinnedMessage, focusMessage, threadId, pinnedMessagesCount, pinnedMessageIndex]);\n\n const handleAllPinnedClick = useCallback(() => {\n openChat({ id: chatId, threadId: MAIN_THREAD_ID, type: 'pinned' });\n }, [openChat, chatId]);\n\n const handleBackClick = useCallback((e: React.MouseEvent) => {\n if (IS_SINGLE_COLUMN_LAYOUT) {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID);\n if (messageInput) {\n messageInput.blur();\n }\n }\n\n if (threadId === MAIN_THREAD_ID && messageListType === 'thread' && currentTransitionKey === 0) {\n if (IS_SINGLE_COLUMN_LAYOUT || shouldShowCloseButton) {\n e.stopPropagation(); // Stop propagation to prevent chat re-opening on tablets\n openChat({ id: undefined });\n } else {\n toggleLeftColumn();\n }\n\n return;\n }\n\n if (messageListType === 'scheduled' && isSelectModeActive) {\n exitMessageSelectMode();\n }\n\n openPreviousChat();\n }, [\n threadId, messageListType, currentTransitionKey, isSelectModeActive, openPreviousChat, shouldShowCloseButton,\n openChat, toggleLeftColumn, exitMessageSelectMode,\n ]);\n\n const unreadCount = useMemo(() => {\n if (!isLeftColumnHideable || !chatsById) {\n return undefined;\n }\n\n let isActive = false;\n\n const totalCount = Object.values(chatsById).reduce((total, currentChat) => {\n if (isChatArchived(currentChat)) {\n return total;\n }\n\n const count = currentChat.unreadCount || 0;\n if (\n count && (!selectIsChatMuted(currentChat, notifySettings, notifyExceptions) || currentChat.unreadMentionsCount)\n ) {\n isActive = true;\n }\n\n return total + count;\n }, 0);\n\n if (!totalCount) {\n return undefined;\n }\n\n return {\n isActive,\n totalCount,\n };\n }, [isLeftColumnHideable, chatsById, notifySettings, notifyExceptions]);\n\n const canToolsCollideWithChatInfo = (\n windowWidth >= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_CHAT_INFO\n ) || (\n windowWidth > MOBILE_SCREEN_MAX_WIDTH\n && windowWidth < MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && (!chatTitleLength || chatTitleLength > 30)\n );\n const shouldUseStackedToolsClass = canToolsCollideWithChatInfo || (\n windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n );\n\n const {\n shouldRender: shouldRenderAudioPlayer,\n transitionClassNames: audioPlayerClassNames,\n } = useShowTransition(Boolean(audioMessage));\n\n const renderingAudioMessage = useCurrentOrPrev(audioMessage);\n\n const {\n shouldRender: shouldRenderPinnedMessage,\n transitionClassNames: pinnedMessageClassNames,\n } = useShowTransition(pinnedMessage && !shouldRenderAudioPlayer);\n\n const renderingPinnedMessage = useCurrentOrPrev(pinnedMessage);\n const renderingPinnedMessageTitle = useCurrentOrPrev(topMessageTitle);\n\n const canRevealTools = (shouldRenderPinnedMessage && renderingPinnedMessage)\n || (shouldRenderAudioPlayer && renderingAudioMessage);\n\n // Logic for transition to and from custom display of AudioPlayer/PinnedMessage on smaller screens\n useEffect(() => {\n const componentEl = componentRef.current;\n if (!componentEl) {\n return;\n }\n\n if (!shouldUseStackedToolsClass || !canRevealTools) {\n componentEl.classList.remove('tools-stacked', 'animated');\n shouldAnimateTools.current = true;\n return;\n }\n\n if (isRightColumnShown || canToolsCollideWithChatInfo) {\n if (shouldAnimateTools.current) {\n componentEl.classList.add('tools-stacked', 'animated');\n shouldAnimateTools.current = false;\n }\n\n // Remove animation class to prevent it messing up the show transitions\n setTimeout(() => {\n componentEl.classList.remove('animated');\n }, ANIMATION_DURATION);\n } else {\n componentEl.classList.remove('tools-stacked');\n shouldAnimateTools.current = true;\n }\n }, [shouldUseStackedToolsClass, canRevealTools, canToolsCollideWithChatInfo, isRightColumnShown]);\n\n function renderInfo() {\n return (\n messageListType === 'thread' && threadId === MAIN_THREAD_ID ? (\n renderMainThreadInfo()\n ) : messageListType === 'thread' ? (\n <>\n {renderBackButton()}\n

\n {lang('CommentsCount', messagesCount)}\n

\n \n ) : messageListType === 'pinned' ? (\n <>\n {renderBackButton()}\n

\n {lang('PinnedMessagesCount', messagesCount)}\n

\n \n ) : messageListType === 'scheduled' ? (\n <>\n {renderBackButton()}\n

\n {isChatWithSelf ? lang('Reminders') : lang('messages', messagesCount, 'i')}\n

\n \n ) : undefined\n );\n }\n\n function renderMainThreadInfo() {\n return (\n <>\n {(isLeftColumnHideable || currentTransitionKey > 0) && renderBackButton(shouldShowCloseButton, unreadCount)}\n
\n {isChatPrivate(chatId) ? (\n \n ) : (\n \n )}\n
\n \n );\n }\n\n function renderBackButton(asClose = false, unreadCountInfo?: typeof unreadCount) {\n return (\n
\n \n
\n \n {unreadCountInfo && (\n
\n {formatIntegerCompact(unreadCountInfo.totalCount)}\n
\n )}\n
\n );\n }\n\n return (\n
\n \n {renderInfo}\n \n\n
\n {shouldRenderPinnedMessage && renderingPinnedMessage && !shouldRenderAudioPlayer && (\n \n )}\n {shouldRenderAudioPlayer && renderingAudioMessage && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const { isLeftColumnShown, lastSyncTime, shouldSkipHistoryAnimations } = global;\n const { byId: chatsById } = global.chats;\n const chat = selectChat(global, chatId);\n\n const { typingStatus } = chat || {};\n\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n const audioMessage = audioChatId && audioMessageId\n ? selectChatMessage(global, audioChatId, audioMessageId)\n : undefined;\n\n let messagesCount: number | undefined;\n if (messageListType === 'pinned') {\n const pinnedIds = selectPinnedIds(global, chatId);\n messagesCount = pinnedIds && pinnedIds.length;\n } else if (messageListType === 'scheduled') {\n const scheduledIds = selectScheduledIds(global, chatId);\n messagesCount = scheduledIds && scheduledIds.length;\n } else if (messageListType === 'thread' && threadId !== MAIN_THREAD_ID) {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (threadInfo) {\n messagesCount = threadInfo.messagesCount;\n }\n }\n\n const state: StateProps = {\n typingStatus,\n isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isSelectModeActive: selectIsInSelectMode(global),\n audioMessage,\n chat,\n chatsById,\n messagesCount,\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n isChatWithBot: chat && selectIsChatWithBot(global, chat),\n lastSyncTime,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n shouldSkipHistoryAnimations,\n currentTransitionKey: Math.max(0, global.messages.messageLists.length - 1),\n };\n\n const messagesById = selectChatMessages(global, chatId);\n if (messageListType !== 'thread' || !messagesById) {\n return state;\n }\n\n Object.assign(state, { messagesById });\n\n if (threadId !== MAIN_THREAD_ID) {\n const pinnedMessageId = selectThreadTopMessageId(global, chatId, threadId);\n const message = pinnedMessageId ? selectChatMessage(global, chatId, pinnedMessageId) : undefined;\n const topMessageSender = message ? selectForwardedSender(global, message) : undefined;\n\n return {\n ...state,\n pinnedMessageIds: pinnedMessageId,\n canUnpin: false,\n topMessageSender,\n };\n }\n\n const pinnedMessageIds = selectPinnedIds(global, chatId);\n if (pinnedMessageIds && pinnedMessageIds.length) {\n const firstPinnedMessage = messagesById[pinnedMessageIds[0]];\n const {\n canUnpin,\n } = (firstPinnedMessage && selectAllowedMessageActions(global, firstPinnedMessage, threadId)) || {};\n\n return {\n ...state,\n pinnedMessageIds,\n canUnpin,\n };\n }\n\n return state;\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChatWithInfo',\n 'pinMessage',\n 'focusMessage',\n 'openChat',\n 'openPreviousChat',\n 'loadPinnedMessages',\n 'toggleLeftColumn',\n 'exitMessageSelectMode',\n ]),\n)(MiddleHeader));\n","import { ApiMessage } from '../../../api/types';\nimport { IAlbum } from '../../../types';\n\nimport { getDayStart } from '../../../util/dateFormat';\nimport { isActionMessage } from '../../../modules/helpers';\n\ntype SenderGroup = (ApiMessage | IAlbum)[];\n\nconst GROUP_INTERVAL_SECONDS = 600; // 10 minutes\n\nexport type MessageDateGroup = {\n originalDate: number;\n datetime: number;\n senderGroups: SenderGroup[];\n};\n\nexport function isAlbum(messageOrAlbum: ApiMessage | IAlbum): messageOrAlbum is IAlbum {\n return 'albumId' in messageOrAlbum;\n}\n\nexport function groupMessages(messages: ApiMessage[], firstUnreadId?: number) {\n let currentSenderGroup: SenderGroup = [];\n let currentDateGroup = {\n originalDate: messages[0].date,\n datetime: Number(getDayStart(messages[0].date * 1000)),\n senderGroups: [currentSenderGroup],\n };\n let currentAlbum: IAlbum | undefined;\n\n const dateGroups: MessageDateGroup[] = [currentDateGroup];\n\n messages.forEach((message, index) => {\n if (message.isInAlbum) {\n if (!currentAlbum) {\n currentAlbum = {\n albumId: message.groupedId!,\n messages: [message],\n mainMessage: message,\n };\n } else {\n currentAlbum.messages.push(message);\n if (message.content.text) {\n currentAlbum.mainMessage = message;\n }\n }\n } else {\n currentSenderGroup.push(message);\n }\n\n const nextMessage = messages[index + 1];\n\n if (\n currentAlbum\n && (!nextMessage || !nextMessage.groupedId || nextMessage.groupedId !== currentAlbum.albumId)\n ) {\n currentSenderGroup.push(currentAlbum);\n currentAlbum = undefined;\n }\n if (nextMessage) {\n const nextMessageDayStartsAt = Number(getDayStart(nextMessage.date * 1000));\n if (currentDateGroup.datetime !== nextMessageDayStartsAt) {\n currentDateGroup = {\n originalDate: nextMessage.date,\n datetime: nextMessageDayStartsAt,\n senderGroups: [],\n };\n dateGroups.push(currentDateGroup);\n\n currentSenderGroup = [];\n currentDateGroup.senderGroups.push(currentSenderGroup);\n } else if (\n nextMessage.id === firstUnreadId\n || message.senderId !== nextMessage.senderId\n || message.isOutgoing !== nextMessage.isOutgoing\n || isActionMessage(message)\n || isActionMessage(nextMessage)\n || (\n message.forwardInfo && nextMessage.forwardInfo\n && (\n message.forwardInfo.senderUserId !== nextMessage.forwardInfo.senderUserId\n || message.forwardInfo.fromChatId !== nextMessage.forwardInfo.fromChatId\n || message.forwardInfo.hiddenUserName !== nextMessage.forwardInfo.hiddenUserName\n )\n )\n || message.inlineButtons\n || nextMessage.inlineButtons\n || (nextMessage.date - message.date) > GROUP_INTERVAL_SECONDS\n ) {\n currentSenderGroup = [];\n currentDateGroup.senderGroups.push(currentSenderGroup);\n }\n }\n });\n\n return dateGroups;\n}\n","import React from '../../../lib/teact/teact';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\n\nexport function preventMessageInputBlur(e: React.MouseEvent) {\n if (\n IS_SINGLE_COLUMN_LAYOUT\n || !document.activeElement\n || document.activeElement.id !== EDITABLE_INPUT_ID\n || e.target !== e.currentTarget\n ) {\n return;\n }\n\n e.preventDefault();\n}\n","import { useCallback } from '../../../lib/teact/teact';\n\nimport { fastRaf } from '../../../util/schedulers';\nimport useDebounce from '../../../hooks/useDebounce';\nimport useFlag from '../../../hooks/useFlag';\n\nconst DEBOUNCE = 1000;\nconst STICKY_TOP = 10;\nconst STICKY_TOP_WITH_TOOLS = 60;\n\nexport default function useStickyDates() {\n // For some reason we can not synchronously hide a sticky element (from `useLayoutEffect`) when chat opens\n // so we will add `position: sticky` only after first scroll. There would be no animation on the first show though.\n const [isScrolled, markIsScrolled] = useFlag(false);\n\n const runDebounced = useDebounce(DEBOUNCE, false);\n\n const updateStickyDates = useCallback((container: HTMLDivElement, hasTools?: boolean) => {\n markIsScrolled();\n\n if (!document.body.classList.contains('is-scrolling-messages')) {\n fastRaf(() => {\n document.body.classList.add('is-scrolling-messages');\n });\n }\n\n runDebounced(() => {\n fastRaf(() => {\n const currentStuck = document.querySelector('.stuck');\n if (currentStuck) {\n currentStuck.classList.remove('stuck');\n }\n\n const stuckDateEl = findStuckDate(container, hasTools);\n if (stuckDateEl) {\n stuckDateEl.classList.add('stuck');\n }\n\n document.body.classList.remove('is-scrolling-messages');\n });\n });\n }, [markIsScrolled, runDebounced]);\n\n return {\n isScrolled,\n updateStickyDates,\n };\n}\n\nfunction findStuckDate(container: HTMLElement, hasTools?: boolean) {\n const allElements = container.querySelectorAll('.sticky-date');\n const containerTop = container.scrollTop;\n\n return Array.from(allElements).find((el) => {\n const { offsetTop, offsetHeight } = el;\n const top = offsetTop - containerTop;\n return -offsetHeight <= top && top <= (hasTools ? STICKY_TOP_WITH_TOOLS : STICKY_TOP);\n });\n}\n","import { useMemo } from '../lib/teact/teact';\n\nimport { debounce } from '../util/schedulers';\n\nexport default function useDebounce(ms: number, shouldRunFirst?: boolean, shouldRunLast?: boolean) {\n return useMemo(() => {\n return debounce((cb) => cb(), ms, shouldRunFirst, shouldRunLast);\n }, [ms, shouldRunFirst, shouldRunLast]);\n}\n","import { RefObject } from 'react';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nimport { MessageListType } from '../../../global/types';\n\nimport { IS_ANDROID, IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useBackgroundMode from '../../../hooks/useBackgroundMode';\n\nconst INTERSECTION_THROTTLE_FOR_MEDIA = IS_ANDROID ? 1000 : 350;\nconst INTERSECTION_MARGIN_FOR_MEDIA = IS_SINGLE_COLUMN_LAYOUT ? 300 : 500;\n\nexport default function useMessageObservers(\n type: MessageListType,\n containerRef: RefObject,\n memoFirstUnreadIdRef: { current: number | undefined },\n) {\n const { markMessageListRead, markMessagesRead } = getDispatch();\n\n const {\n observe: observeIntersectionForMedia,\n } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA,\n margin: INTERSECTION_MARGIN_FOR_MEDIA,\n });\n\n const {\n observe: observeIntersectionForReading, freeze: freezeForReading, unfreeze: unfreezeForReading,\n } = useIntersectionObserver({\n rootRef: containerRef,\n }, (entries) => {\n if (type !== 'thread') {\n return;\n }\n\n let maxId = 0;\n const mentionIds: number[] = [];\n\n entries.forEach((entry) => {\n const { isIntersecting, target } = entry;\n\n if (!isIntersecting) {\n return;\n }\n\n const { dataset } = target as HTMLDivElement;\n\n const messageId = Number(dataset.lastMessageId || dataset.messageId);\n if (messageId > maxId) {\n maxId = messageId;\n }\n\n if (dataset.hasUnreadMention) {\n mentionIds.push(messageId);\n }\n });\n\n if (memoFirstUnreadIdRef.current && maxId >= memoFirstUnreadIdRef.current) {\n markMessageListRead({ maxId });\n }\n\n if (mentionIds.length) {\n markMessagesRead({ messageIds: mentionIds });\n }\n });\n\n useBackgroundMode(freezeForReading, unfreezeForReading);\n\n const { observe: observeIntersectionForAnimatedStickers } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA,\n });\n\n return {\n observeIntersectionForMedia,\n observeIntersectionForReading,\n observeIntersectionForAnimatedStickers,\n };\n}\n","import { ApiMessage } from '../../../../api/types';\n\nimport { getMessageContent } from '../../../../modules/helpers';\n\nexport function isEmojiOnlyMessage(customShape?: boolean | number) {\n return typeof customShape === 'number';\n}\n\nexport function buildContentClassName(\n message: ApiMessage,\n {\n hasReply,\n customShape,\n isLastInGroup,\n asForwarded,\n hasThread,\n forceSenderName,\n hasComments,\n hasActionButton,\n }: {\n hasReply?: boolean;\n customShape?: boolean | number;\n isLastInGroup?: boolean;\n asForwarded?: boolean;\n hasThread?: boolean;\n forceSenderName?: boolean;\n hasComments?: boolean;\n hasActionButton?: boolean;\n } = {},\n) {\n const {\n text, photo, video, audio, voice, document, poll, webPage, contact,\n } = getMessageContent(message);\n\n const classNames = ['message-content'];\n const isMedia = photo || video;\n const isMediaWithNoText = isMedia && !text;\n const isViaBot = Boolean(message.viaBotId);\n\n if (isEmojiOnlyMessage(customShape)) {\n classNames.push(`emoji-only emoji-only-${customShape}`);\n } else if (text) {\n classNames.push('text');\n }\n\n if (hasActionButton) {\n classNames.push('has-action-button');\n }\n\n if (customShape) {\n classNames.push('custom-shape');\n if (video && video.isRound) {\n classNames.push('round');\n }\n\n if (hasComments) {\n classNames.push('has-comments');\n }\n }\n if (photo || video) {\n classNames.push('media');\n } else if (audio) {\n classNames.push('audio');\n } else if (voice) {\n classNames.push('voice');\n } else if (document) {\n classNames.push('document');\n } else if (contact) {\n classNames.push('contact');\n } else if (poll) {\n classNames.push('poll');\n } else if (webPage) {\n classNames.push('web-page');\n\n if (webPage.photo || webPage.video) {\n classNames.push('media');\n }\n }\n\n if (asForwarded && !customShape) {\n classNames.push('is-forwarded');\n }\n\n if (hasReply) {\n classNames.push('is-reply');\n }\n\n if (hasThread) {\n classNames.push('has-replies');\n }\n\n if (isViaBot) {\n classNames.push('is-via-bot');\n }\n\n if (forceSenderName) {\n classNames.push('force-sender-name');\n }\n\n if (!customShape) {\n classNames.push('has-shadow');\n\n if (isMedia && hasComments) {\n classNames.push('has-background');\n }\n\n if (hasReply || asForwarded || !isMediaWithNoText || isViaBot || forceSenderName) {\n classNames.push('has-solid-background');\n }\n\n if (isLastInGroup && (photo || !isMediaWithNoText)) {\n classNames.push('has-appendix');\n }\n }\n\n return classNames.join(' ');\n}\n","import { ApiMessage } from '../../../../api/types';\nimport { calculateInlineImageDimensions, calculateVideoDimensions } from '../../../common/helpers/mediaDimensions';\nimport {\n getMessageText,\n getMessagePhoto,\n getMessageWebPagePhoto,\n isForwardedMessage,\n isOwnMessage,\n getMessageVideo,\n} from '../../../../modules/helpers';\n\nconst MIN_MEDIA_WIDTH = 100;\nconst MIN_MEDIA_WIDTH_WITH_COMMENTS = 238;\nconst MIN_MEDIA_WIDTH_WITH_TEXT = 175;\nconst MIN_MEDIA_WIDTH_WITH_TEXT_AND_COMMENTS = 238;\nconst MIN_MEDIA_HEIGHT = 90;\nconst SMALL_IMAGE_THRESHOLD = 12;\n\nexport function getMinMediaWidth(hasText?: boolean, hasCommentButton?: boolean) {\n return hasText\n ? (hasCommentButton ? MIN_MEDIA_WIDTH_WITH_TEXT_AND_COMMENTS : MIN_MEDIA_WIDTH_WITH_TEXT)\n : (hasCommentButton ? MIN_MEDIA_WIDTH_WITH_COMMENTS : MIN_MEDIA_WIDTH);\n}\n\nexport function calculateMediaDimensions(message: ApiMessage, noAvatars?: boolean) {\n const isOwn = isOwnMessage(message);\n const isForwarded = isForwardedMessage(message);\n const photo = getMessagePhoto(message) || getMessageWebPagePhoto(message);\n const video = getMessageVideo(message);\n\n const isWebPagePhoto = Boolean(getMessageWebPagePhoto(message));\n const { width, height } = photo\n ? calculateInlineImageDimensions(photo, isOwn, isForwarded, isWebPagePhoto, noAvatars)\n : calculateVideoDimensions(video!, isOwn, isForwarded, noAvatars);\n\n const hasText = Boolean(getMessageText(message));\n const minMediaWidth = getMinMediaWidth(hasText);\n\n let stretchFactor = 1;\n if (width < minMediaWidth && minMediaWidth - width < SMALL_IMAGE_THRESHOLD) {\n stretchFactor = minMediaWidth / width;\n }\n if (height * stretchFactor < MIN_MEDIA_HEIGHT && MIN_MEDIA_HEIGHT - height * stretchFactor < SMALL_IMAGE_THRESHOLD) {\n stretchFactor = MIN_MEDIA_HEIGHT / height;\n }\n\n const finalWidth = Math.round(width * stretchFactor);\n const finalHeight = Math.round(height * stretchFactor);\n\n return {\n width: finalWidth,\n height: finalHeight,\n isSmall: finalWidth < minMediaWidth || finalHeight < MIN_MEDIA_HEIGHT,\n };\n}\n","/* eslint-disable no-bitwise */\n// Based on\n// https://github.com/telegramdesktop/tdesktop/blob/dev/Telegram/SourceFiles/ui/grouped_layout.cpp\n// https://github.com/overtake/TelegramSwift/blob/master/Telegram-Mac/GroupedLayout.swift#L83\n\nimport { IAlbum } from '../../../../types';\nimport { ApiMessage, ApiDimensions } from '../../../../api/types';\n\nimport { getAvailableWidth, REM } from '../../../common/helpers/mediaDimensions';\nimport { calculateMediaDimensions } from './mediaDimensions';\n\nexport const AlbumRectPart = {\n None: 0,\n Top: 1,\n Right: 2,\n Bottom: 4,\n Left: 8,\n};\n\ntype IAttempt = {\n lineCounts: number[];\n heights: number[];\n};\nexport type IMediaDimensions = {\n width: number;\n height: number;\n x: number;\n y: number;\n};\ntype IMediaLayout = {\n dimensions: IMediaDimensions;\n sides: number;\n};\ntype ILayoutParams = {\n ratios: number[];\n proportions: string;\n averageRatio: number;\n maxWidth: number;\n minWidth: number;\n maxHeight: number;\n spacing: number;\n};\nexport type IAlbumLayout = {\n layout: IMediaLayout[];\n containerStyle: ApiDimensions;\n};\n\nfunction getRatios(messages: ApiMessage[]) {\n return messages.map(\n (message) => {\n const dimensions = calculateMediaDimensions(message) as ApiDimensions;\n\n return dimensions.width / dimensions.height;\n },\n );\n}\n\nfunction getProportions(ratios: number[]) {\n return ratios.map((ratio) => (ratio > 1.2 ? 'w' : (ratio < 0.8 ? 'n' : 'q'))).join('');\n}\n\nfunction getAverageRatio(ratios: number[]) {\n return ratios.reduce((result, ratio) => ratio + result, 1) / ratios.length;\n}\n\nfunction accumulate(list: number[], initValue: number) {\n return list.reduce((accumulator, item) => accumulator + item, initValue);\n}\n\nfunction clamp(num: number, low: number, high: number) {\n return num < low ? low : (num > high ? high : num);\n}\n\nfunction cropRatios(ratios: number[], averageRatio: number) {\n return ratios.map((ratio) => (averageRatio > 1.1 ? clamp(ratio, 1, 2.75) : clamp(ratio, 0.6667, 1)));\n}\n\nfunction calculateContainerSize(layout: IMediaLayout[]) {\n const styles: ApiDimensions = { width: 0, height: 0 };\n layout.forEach(({\n dimensions,\n sides,\n }) => {\n if (sides & AlbumRectPart.Right) {\n styles.width = dimensions.width + dimensions.x;\n }\n if (sides & AlbumRectPart.Bottom) {\n styles.height = dimensions.height + dimensions.y;\n }\n });\n\n return styles;\n}\n\nexport function calculateAlbumLayout(\n isOwn: boolean,\n isForwarded: boolean,\n noAvatars: boolean,\n album: IAlbum,\n): IAlbumLayout {\n const spacing = 2;\n const ratios = getRatios(album.messages);\n const proportions = getProportions(ratios);\n const averageRatio = getAverageRatio(ratios);\n const albumCount = ratios.length;\n const forceCalc = ratios.some((ratio) => ratio > 2);\n const maxWidth = getAvailableWidth(isOwn, isForwarded, false, noAvatars) - (isForwarded ? 2.5 : 0) * REM;\n const maxHeight = maxWidth;\n\n let layout;\n\n const params = {\n ratios,\n proportions,\n averageRatio,\n maxWidth,\n minWidth: 100,\n maxHeight,\n spacing,\n };\n\n if (albumCount >= 5 || forceCalc) {\n layout = layoutWithComplexLayouter(params);\n } else if (albumCount === 2) {\n layout = layoutTwo(params);\n } else if (albumCount === 3) {\n layout = layoutThree(params);\n } else {\n layout = layoutFour(params);\n }\n\n return {\n layout,\n containerStyle: calculateContainerSize(layout),\n };\n}\n\nfunction layoutWithComplexLayouter({\n ratios: originalRatios,\n averageRatio,\n maxWidth,\n minWidth,\n spacing,\n maxHeight = (4 * maxWidth) / 3,\n}: ILayoutParams) {\n const ratios = cropRatios(originalRatios, averageRatio);\n const count = originalRatios.length;\n const result = new Array(count);\n const attempts: IAttempt[] = [];\n\n const multiHeight = (offset: number, attemptCount: number) => {\n const attemptRatios = ratios.slice(offset, offset + attemptCount);\n const sum = accumulate(attemptRatios, 0);\n\n return (maxWidth - (attemptCount - 1) * spacing) / sum;\n };\n\n const pushAttempt = (lineCounts: number[]) => {\n const heights: number[] = [];\n let offset = 0;\n lineCounts.forEach((currentCount) => {\n heights.push(multiHeight(offset, currentCount));\n offset += currentCount;\n });\n\n attempts.push({\n lineCounts,\n heights,\n });\n };\n\n for (let first = 1; first !== count; ++first) {\n const second = count - first;\n if (first <= 3 && second <= 3) {\n pushAttempt([first, second]);\n }\n }\n\n for (let first = 1; first !== count - 1; ++first) {\n for (let second = 1; second !== count - first; ++second) {\n const third = count - first - second;\n if (first <= 3 && second <= (averageRatio < 0.85 ? 4 : 3) && third <= 3) {\n pushAttempt([first, second, third]);\n }\n }\n }\n\n for (let first = 1; first !== count - 1; ++first) {\n for (let second = 1; second !== count - first; ++second) {\n for (let third = 1; third !== count - first - second; ++third) {\n const fourth = count - first - second - third;\n if (first <= 3 && second <= 3 && third <= 3 && fourth <= 4) {\n pushAttempt([first, second, third, fourth]);\n }\n }\n }\n }\n\n let optimalAttempt: IAttempt | undefined;\n let optimalDiff = 0;\n for (let i = 0; i < attempts.length; i++) {\n const {\n heights,\n lineCounts,\n } = attempts[i];\n const lineCount = lineCounts.length;\n const totalHeight = accumulate(heights, 0) + spacing * (lineCount - 1);\n const minLineHeight = Math.min(...heights);\n const bad1 = minLineHeight < minWidth ? 1.5 : 1;\n const bad2 = (() => {\n for (let line = 1; line !== lineCount; ++line) {\n if (lineCounts[line - 1] > lineCounts[line]) {\n return 1.5;\n }\n }\n\n return 1;\n })();\n const diff = Math.abs(totalHeight - maxHeight) * bad1 * bad2;\n\n if (!optimalAttempt || diff < optimalDiff) {\n optimalAttempt = attempts[i];\n optimalDiff = diff;\n }\n }\n\n const optimalCounts = optimalAttempt!.lineCounts;\n const optimalHeights = optimalAttempt!.heights;\n const rowCount = optimalCounts.length;\n let index = 0;\n let y = 0;\n for (let row = 0; row !== rowCount; ++row) {\n const colCount = optimalCounts[row];\n const lineHeight = optimalHeights[row];\n const height = Math.round(lineHeight);\n let x = 0;\n\n for (let col = 0; col !== colCount; ++col) {\n const sides = AlbumRectPart.None\n | (row === 0 ? AlbumRectPart.Top : AlbumRectPart.None)\n | (row === rowCount - 1 ? AlbumRectPart.Bottom : AlbumRectPart.None)\n | (col === 0 ? AlbumRectPart.Left : AlbumRectPart.None)\n | (col === colCount - 1 ? AlbumRectPart.Right : AlbumRectPart.None);\n const ratio = ratios[index];\n const width = col === colCount - 1 ? maxWidth - x : Math.round(ratio * lineHeight);\n result[index] = {\n dimensions: {\n x,\n y,\n width,\n height,\n },\n sides,\n };\n x += width + spacing;\n ++index;\n }\n y += height + spacing;\n }\n\n return result;\n}\n\n\nfunction layoutTwo(params: ILayoutParams) {\n const {\n ratios,\n proportions,\n averageRatio,\n } = params;\n return proportions === 'ww' && averageRatio > 1.4 && ratios[1] - ratios[0] < 0.2\n ? layoutTwoTopBottom(params)\n : proportions === 'ww' || proportions === 'qq'\n ? layoutTwoLeftRightEqual(params)\n : layoutTwoLeftRight(params);\n}\n\nfunction layoutTwoTopBottom(params: ILayoutParams) {\n const {\n ratios,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const height = Math.round(Math.min(maxWidth / ratios[0], Math.min(maxWidth / ratios[1], (maxHeight - spacing) / 2)));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: maxWidth,\n height,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: height + spacing,\n width: maxWidth,\n height,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutTwoLeftRightEqual(params: ILayoutParams) {\n const {\n ratios,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const width = (maxWidth - spacing) / 2;\n const height = Math.round(Math.min(width / ratios[0], Math.min(width / ratios[1], maxHeight)));\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: width + spacing,\n y: 0,\n width,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutTwoLeftRight(params: ILayoutParams) {\n const {\n ratios,\n minWidth,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const minimalWidth = Math.round(1.5 * minWidth);\n const secondWidth = Math.min(\n Math.round(\n Math.max(\n 0.4 * (maxWidth - spacing),\n (maxWidth - spacing) / ratios[0] / (1 / ratios[0] + 1 / ratios[1]),\n ),\n ),\n maxWidth - spacing - minimalWidth,\n );\n const firstWidth = maxWidth - secondWidth - spacing;\n const height = Math.min(maxHeight, Math.round(Math.min(firstWidth / ratios[0], secondWidth / ratios[1])));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: firstWidth,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: firstWidth + spacing,\n y: 0,\n width: secondWidth,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutThree(params: ILayoutParams) {\n const { proportions } = params;\n\n return proportions[0] === 'n'\n ? layoutThreeLeftAndOther(params)\n : layoutThreeTopAndOther(params);\n}\n\nfunction layoutThreeLeftAndOther(params: ILayoutParams) {\n const {\n maxHeight,\n spacing,\n ratios,\n maxWidth,\n minWidth,\n } = params;\n const firstHeight = maxHeight;\n const thirdHeight = Math.round(\n Math.min(\n (maxHeight - spacing) / 2,\n (ratios[1] * (maxWidth - spacing)) / (ratios[2] + ratios[1]),\n ),\n );\n const secondHeight = firstHeight - thirdHeight - spacing;\n const rightWidth = Math.max(\n minWidth,\n Math.round(\n Math.min(\n (maxWidth - spacing) / 2,\n Math.min(\n thirdHeight * ratios[2],\n secondHeight * ratios[1],\n ),\n ),\n ),\n );\n const leftWidth = Math.min(Math.round(firstHeight * ratios[0]), maxWidth - spacing - rightWidth);\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: leftWidth,\n height: firstHeight,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: leftWidth + spacing,\n y: 0,\n width: rightWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: leftWidth + spacing,\n y: secondHeight + spacing,\n width: rightWidth,\n height: thirdHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutThreeTopAndOther(params: ILayoutParams) {\n const {\n maxWidth,\n ratios,\n maxHeight,\n spacing,\n } = params;\n const firstWidth = maxWidth;\n const firstHeight = Math.round(Math.min(firstWidth / ratios[0], 0.66 * (maxHeight - spacing)));\n const secondWidth = (maxWidth - spacing) / 2;\n const secondHeight = Math.min(\n maxHeight - firstHeight - spacing,\n Math.round(Math.min(\n secondWidth / ratios[1],\n secondWidth / ratios[2],\n )),\n );\n const thirdWidth = firstWidth - secondWidth - spacing;\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: firstWidth,\n height: firstHeight,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: firstHeight + spacing,\n width: secondWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Left,\n }, {\n dimensions: {\n x: secondWidth + spacing,\n y: firstHeight + spacing,\n width: thirdWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutFour(params: ILayoutParams) {\n const { proportions } = params;\n\n return proportions[0] === 'w'\n ? layoutFourTopAndOther(params)\n : layoutFourLeftAndOther(params);\n}\n\nfunction layoutFourTopAndOther({\n maxWidth,\n ratios,\n spacing,\n maxHeight,\n minWidth,\n}: ILayoutParams) {\n const w = maxWidth;\n const h0 = Math.round(Math.min(w / ratios[0], 0.66 * (maxHeight - spacing)));\n const h = Math.round((maxWidth - 2 * spacing) / (ratios[1] + ratios[2] + ratios[3]));\n const w0 = Math.max(minWidth, Math.round(Math.min(0.4 * (maxWidth - 2 * spacing), h * ratios[1])));\n const w2 = Math.round(Math.max(Math.max(minWidth, 0.33 * (maxWidth - 2 * spacing)), h * ratios[3]));\n const w1 = w - w0 - w2 - 2 * spacing;\n const h1 = Math.min(maxHeight - h0 - spacing, h);\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: w,\n height: h0,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: h0 + spacing,\n width: w0,\n height: h1,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Left,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + spacing,\n width: w1,\n height: h1,\n },\n sides: AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: w0 + spacing + w1 + spacing,\n y: h0 + spacing,\n width: w2,\n height: h1,\n },\n sides: AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutFourLeftAndOther({\n maxHeight,\n ratios,\n maxWidth,\n spacing,\n minWidth,\n}: ILayoutParams) {\n const h = maxHeight;\n const w0 = Math.round(Math.min(h * ratios[0], 0.6 * (maxWidth - spacing)));\n const w = Math.round((maxHeight - 2 * spacing) / (1 / ratios[1] + 1 / ratios[2] + 1 / ratios[3]));\n const h0 = Math.round(w / ratios[1]);\n const h1 = Math.round(w / ratios[2]);\n const h2 = h - h0 - h1 - 2 * spacing;\n const w1 = Math.max(minWidth, Math.min(maxWidth - w0 - spacing, w));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: w0,\n height: h,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: 0,\n width: w1,\n height: h0,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + spacing,\n width: w1,\n height: h1,\n },\n sides: AlbumRectPart.Right,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + h1 + 2 * spacing,\n width: w1,\n height: h2,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n","import { IS_IOS } from '../../../../util/environment';\n\nlet element: HTMLSpanElement | undefined;\n\nexport default function calculateAuthorWidth(text: string) {\n if (!element) {\n element = document.createElement('span');\n // eslint-disable-next-line max-len\n element.style.font = IS_IOS\n // eslint-disable-next-line max-len\n ? '400 12px system-ui, -apple-system, BlinkMacSystemFont, \"Roboto\", \"Apple Color Emoji\", \"Helvetica Neue\", sans-serif'\n : '400 12px \"Roboto\", -apple-system, \"Apple Color Emoji\", BlinkMacSystemFont, \"Helvetica Neue\", sans-serif';\n element.style.whiteSpace = 'nowrap';\n element.style.position = 'absolute';\n element.style.left = '-999px';\n element.style.opacity = '.01';\n document.body.appendChild(element);\n }\n\n element.innerHTML = text;\n\n return element.offsetWidth;\n}\n","import { FocusDirection } from '../../../../types';\n\nimport { useLayoutEffect } from '../../../../lib/teact/teact';\nimport fastSmoothScroll from '../../../../util/fastSmoothScroll';\n\n// This is used when the viewport was replaced.\nconst RELOCATED_FOCUS_OFFSET = 1000;\nconst FOCUS_MARGIN = 20;\n\nexport default function useFocusMessage(\n elementRef: { current: HTMLDivElement | null },\n chatId: number,\n isFocused?: boolean,\n focusDirection?: FocusDirection,\n noFocusHighlight?: boolean,\n) {\n useLayoutEffect(() => {\n if (isFocused && elementRef.current) {\n const messagesContainer = elementRef.current.closest('.MessageList')!;\n\n fastSmoothScroll(\n messagesContainer,\n elementRef.current,\n // `noFocusHighlight` always called from “scroll-to-bottom” buttons\n noFocusHighlight ? 'end' : 'centerOrTop',\n FOCUS_MARGIN,\n focusDirection !== undefined ? RELOCATED_FOCUS_OFFSET : undefined,\n focusDirection,\n );\n }\n }, [elementRef, chatId, isFocused, focusDirection, noFocusHighlight]);\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './ContextMenuContainer';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst ContextMenuContainerAsync: FC = (props) => {\n const { isOpen } = props;\n const ContextMenuContainer = useModuleLoader(Bundles.Extra, 'ContextMenuContainer', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ContextMenuContainer ? : undefined;\n};\n\nexport default memo(ContextMenuContainerAsync);\n","import React, {\n FC, memo, useEffect, useMemo, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiMessage, ApiChat } from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport {\n selectUser,\n selectChatMessage,\n selectIsMessageFocused,\n selectChat,\n} from '../../modules/selectors';\nimport { isChatChannel } from '../../modules/helpers';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\nimport { renderActionMessageText } from '../common/helpers/renderActionMessageText';\nimport useEnsureMessage from '../../hooks/useEnsureMessage';\nimport useContextMenuHandlers from '../../hooks/useContextMenuHandlers';\nimport { ObserveFn, useOnIntersect } from '../../hooks/useIntersectionObserver';\nimport useFocusMessage from './message/hooks/useFocusMessage';\nimport useLang from '../../hooks/useLang';\n\nimport ContextMenuContainer from './message/ContextMenuContainer.async';\nimport useFlag from '../../hooks/useFlag';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport { preventMessageInputBlur } from './helpers/preventMessageInputBlur';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n isEmbedded?: boolean;\n appearanceOrder?: number;\n isLastInList?: boolean;\n};\n\ntype StateProps = {\n usersById: Record;\n sender?: ApiUser | ApiChat;\n targetUserIds?: number[];\n targetMessage?: ApiMessage;\n targetChatId?: number;\n isFocused: boolean;\n focusDirection?: FocusDirection;\n noFocusHighlight?: boolean;\n};\n\nconst APPEARANCE_DELAY = 10;\n\nconst ActionMessage: FC = ({\n message,\n observeIntersection,\n isEmbedded,\n appearanceOrder = 0,\n isLastInList,\n usersById,\n sender,\n targetUserIds,\n targetMessage,\n targetChatId,\n isFocused,\n focusDirection,\n noFocusHighlight,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n useEnsureMessage(message.chatId, message.replyToMessageId, targetMessage);\n useFocusMessage(ref, message.chatId, isFocused, focusDirection, noFocusHighlight);\n\n const lang = useLang();\n\n const noAppearanceAnimation = appearanceOrder <= 0;\n const [isShown, markShown] = useFlag(noAppearanceAnimation);\n useEffect(() => {\n if (noAppearanceAnimation) {\n return;\n }\n\n setTimeout(markShown, appearanceOrder * APPEARANCE_DELAY);\n }, [appearanceOrder, markShown, noAppearanceAnimation]);\n const { transitionClassNames } = useShowTransition(isShown, undefined, noAppearanceAnimation, false);\n\n const targetUsers = useMemo(() => {\n return targetUserIds\n ? targetUserIds.map((userId) => usersById && usersById[userId]).filter(Boolean as any)\n : undefined;\n }, [targetUserIds, usersById]);\n\n const content = renderActionMessageText(\n lang,\n message,\n sender,\n targetUsers,\n targetMessage,\n targetChatId,\n isEmbedded ? { isEmbedded: true, asPlain: true } : undefined,\n );\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(ref);\n const isContextMenuShown = contextMenuPosition !== undefined;\n\n const handleMouseDown = (e: React.MouseEvent) => {\n preventMessageInputBlur(e);\n handleBeforeContextMenu(e);\n };\n\n if (isEmbedded) {\n return {renderText(content as string)};\n }\n\n const className = buildClassName(\n 'ActionMessage message-list-item',\n isFocused && !noFocusHighlight && 'focused',\n isContextMenuShown && 'has-menu-open',\n isLastInList && 'last-in-list',\n transitionClassNames,\n );\n\n return (\n \n {content}\n {contextMenuPosition && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { message }): StateProps => {\n const { byId: usersById } = global.users;\n const userId = message.senderId;\n const { targetUserIds, targetChatId } = message.content.action || {};\n const targetMessageId = message.replyToMessageId;\n const targetMessage = targetMessageId\n ? selectChatMessage(global, message.chatId, targetMessageId)\n : undefined;\n\n const isFocused = selectIsMessageFocused(global, message);\n const { direction: focusDirection, noHighlight: noFocusHighlight } = (isFocused && global.focusedMessage) || {};\n\n const chat = selectChat(global, message.chatId);\n const sender = chat && (isChatChannel(chat) || userId === message.chatId)\n ? chat\n : userId ? selectUser(global, userId) : undefined;\n\n return {\n usersById,\n sender,\n targetChatId,\n targetUserIds,\n targetMessage,\n isFocused,\n ...(isFocused && { focusDirection, noFocusHighlight }),\n };\n },\n)(ActionMessage));\n","import React, { FC, useRef } from '../../lib/teact/teact';\n\nimport { ApiUser, ApiMessage, ApiChat } from '../../api/types';\n\nimport {\n getMessageMediaHash,\n isActionMessage,\n getMessageSummaryText,\n getSenderTitle,\n getMessageRoundVideo,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { getPictogramDimensions } from './helpers/mediaDimensions';\nimport buildClassName from '../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useWebpThumbnail from '../../hooks/useWebpThumbnail';\nimport useLang from '../../hooks/useLang';\n\nimport ActionMessage from '../middle/ActionMessage';\n\nimport './EmbeddedMessage.scss';\n\ntype OwnProps = {\n observeIntersection?: ObserveFn;\n className?: string;\n message?: ApiMessage;\n sender?: ApiUser | ApiChat;\n title?: string;\n customText?: string;\n onClick: NoneToVoidFunction;\n};\n\nconst NBSP = '\\u00A0';\n\nconst EmbeddedMessage: FC = ({\n className,\n message,\n sender,\n title,\n customText,\n observeIntersection,\n onClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaBlobUrl = useMedia(message && getMessageMediaHash(message, 'pictogram'), !isIntersecting);\n const pictogramId = message && `sticker-reply-thumb${message.id}`;\n const mediaThumbnail = useWebpThumbnail(message);\n const isRoundVideo = Boolean(message && getMessageRoundVideo(message));\n\n const lang = useLang();\n\n const senderTitle = sender && getSenderTitle(lang, sender);\n\n return (\n \n {mediaThumbnail && renderPictogram(pictogramId, mediaThumbnail, mediaBlobUrl, isRoundVideo)}\n
\n

\n {!message ? (\n customText || NBSP\n ) : isActionMessage(message) ? (\n \n ) : (\n renderText(getMessageSummaryText(lang, message, Boolean(mediaThumbnail)))\n )}\n

\n
{renderText(senderTitle || title || NBSP)}
\n
\n \n );\n};\n\nfunction renderPictogram(\n id: string | undefined,\n thumbDataUri: string,\n blobUrl?: string,\n isRoundVideo?: boolean,\n) {\n const { width, height } = getPictogramDimensions();\n\n return (\n \n );\n}\n\nexport default EmbeddedMessage;\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiMessage, ApiMessageOutgoingStatus } from '../../../api/types';\n\nimport { formatTime } from '../../../util/dateFormat';\nimport { formatIntegerCompact } from '../../../util/textFormat';\n\nimport MessageOutgoingStatus from '../../common/MessageOutgoingStatus';\nimport renderText from '../../common/helpers/renderText';\nimport useLang from '../../../hooks/useLang';\n\nimport './MessageMeta.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n outgoingStatus?: ApiMessageOutgoingStatus;\n signature?: string;\n onClick: () => void;\n};\n\nconst MessageMeta: FC = ({\n message, outgoingStatus, signature, onClick,\n}) => {\n const lang = useLang();\n\n return (\n \n {Boolean(message.views) && (\n <>\n \n {formatIntegerCompact(message.views!)}\n \n \n \n )}\n {signature && (\n {renderText(signature)}\n )}\n \n {message.isEdited && `${lang('EditedMessage')} `}\n {formatTime(message.date * 1000)}\n \n {outgoingStatus && (\n \n )}\n \n );\n};\n\nexport default memo(MessageMeta);\n","import React, { FC, useRef } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { MEMOJI_STICKER_ID } from '../../../config';\nimport { getStickerDimensions } from '../../common/helpers/mediaDimensions';\nimport { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport buildClassName from '../../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useFlag from '../../../hooks/useFlag';\nimport useWebpThumbnail from '../../../hooks/useWebpThumbnail';\n\nimport AnimatedSticker from '../../common/AnimatedSticker';\nimport StickerSetModal from '../../common/StickerSetModal.async';\n\nimport './Sticker.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection: ObserveFn;\n observeIntersectionForPlaying: ObserveFn;\n shouldLoop?: boolean;\n lastSyncTime?: number;\n};\n\nconst Sticker: FC = ({\n message, observeIntersection, observeIntersectionForPlaying, shouldLoop, lastSyncTime,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isModalOpen, openModal, closeModal] = useFlag();\n\n const sticker = message.content.sticker!;\n const { isAnimated, stickerSetId } = sticker;\n const isMemojiSticker = stickerSetId === MEMOJI_STICKER_ID;\n\n const shouldLoad = useIsIntersecting(ref, observeIntersection);\n const shouldPlay = useIsIntersecting(ref, observeIntersectionForPlaying);\n\n const mediaHash = sticker.isPreloadedGlobally ? `sticker${sticker.id}` : getMessageMediaHash(message, 'inline')!;\n const thumbDataUri = useWebpThumbnail(message);\n const mediaData = useMedia(\n mediaHash,\n !shouldLoad,\n getMessageMediaFormat(message, 'inline', true),\n lastSyncTime,\n );\n\n const isMediaLoaded = Boolean(mediaData);\n const [isAnimationLoaded, markAnimationLoaded] = useFlag(isMediaLoaded);\n const isMediaReady = isAnimated ? isAnimationLoaded : isMediaLoaded;\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(isMediaReady, 'slow');\n\n const { width, height } = getStickerDimensions(sticker);\n const thumbClassName = buildClassName('thumbnail', !thumbDataUri && 'empty');\n\n const stickerClassName = buildClassName(\n 'Sticker media-inner',\n isMemojiSticker && 'inactive',\n );\n\n return (\n
\n {!isMediaReady && (\n \n )}\n {!isAnimated && shouldRenderFullMedia && (\n \n )}\n {isAnimated && isMediaLoaded && (\n \n )}\n \n
\n );\n};\n\nexport default Sticker;\n","import { ApiMessage } from '../../../../api/types';\n\nimport { IS_CANVAS_FILTER_SUPPORTED, IS_SINGLE_COLUMN_LAYOUT } from '../../../../util/environment';\nimport { getMessageMediaThumbDataUri } from '../../../../modules/helpers';\nimport useCanvasBlur from '../../../../hooks/useCanvasBlur';\n\nexport default function useBlurredMediaThumbRef(message: ApiMessage, fullMediaData?: string) {\n return useCanvasBlur(\n getMessageMediaThumbDataUri(message),\n Boolean(fullMediaData),\n IS_SINGLE_COLUMN_LAYOUT && !IS_CANVAS_FILTER_SUPPORTED,\n );\n}\n","const SELECTED_APPENDIX_BACKGROUND = Promise.resolve('rgba(255,255,255,1)');\n\nexport default function getCustomAppendixBg(src: string, isOwn: boolean, inSelectMode?: boolean, isSelected?: boolean) {\n return isSelected ? SELECTED_APPENDIX_BACKGROUND : getAppendixColorFromImage(src, isOwn);\n}\n\nasync function getAppendixColorFromImage(src: string, isOwn: boolean) {\n const img = new Image();\n img.src = src;\n\n if (!img.width) {\n await new Promise((resolve) => {\n img.onload = resolve;\n });\n }\n\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n\n canvas.width = img.width;\n canvas.height = img.height;\n\n ctx.drawImage(img, 0, 0, img.width, img.height);\n\n const x = isOwn ? img.width - 1 : 0;\n const y = img.height - 1;\n\n const pixel = Array.from(ctx.getImageData(x, y, 1, 1).data);\n return `rgba(${pixel.join(',')})`;\n}\n","import React, {\n FC, useCallback, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IMediaDimensions } from './helpers/calculateAlbumLayout';\n\nimport {\n getMessagePhoto,\n getMessageWebPagePhoto,\n getMessageMediaHash,\n getMediaTransferState,\n isOwnMessage,\n} from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\nimport usePrevious from '../../../hooks/usePrevious';\nimport buildClassName from '../../../util/buildClassName';\nimport getCustomAppendixBg from './helpers/getCustomAppendixBg';\nimport { calculateMediaDimensions } from './helpers/mediaDimensions';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nexport type OwnProps = {\n id?: string;\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n noAvatars?: boolean;\n shouldAutoLoad?: boolean;\n isInSelectMode?: boolean;\n isSelected?: boolean;\n uploadProgress?: number;\n size?: 'inline' | 'pictogram';\n shouldAffectAppendix?: boolean;\n dimensions?: IMediaDimensions & { isSmall?: boolean };\n nonInteractive?: boolean;\n onClick?: (id: number) => void;\n onCancelUpload?: (message: ApiMessage) => void;\n};\n\nconst CUSTOM_APPENDIX_ATTRIBUTE = 'data-has-custom-appendix';\n\nconst Photo: FC = ({\n id,\n message,\n observeIntersection,\n noAvatars,\n shouldAutoLoad,\n isInSelectMode,\n isSelected,\n uploadProgress,\n size = 'inline',\n dimensions,\n nonInteractive,\n shouldAffectAppendix,\n onClick,\n onCancelUpload,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const photo = (getMessagePhoto(message) || getMessageWebPagePhoto(message))!;\n const localBlobUrl = photo.blobUrl;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad);\n const shouldDownload = isDownloadAllowed && isIntersecting;\n const {\n mediaData, downloadProgress,\n } = useMediaWithDownloadProgress(getMessageMediaHash(message, size), !shouldDownload);\n const fullMediaData = localBlobUrl || mediaData;\n const thumbRef = useBlurredMediaThumbRef(message, fullMediaData);\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, shouldDownload && !fullMediaData);\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasDownloadDisabled, 'slow');\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(fullMediaData, 'slow');\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (!fullMediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n } else if (onClick) {\n onClick(message.id);\n }\n }, [fullMediaData, isUploading, message, onCancelUpload, onClick]);\n\n const isOwn = isOwnMessage(message);\n useLayoutEffect(() => {\n if (!shouldAffectAppendix) {\n return;\n }\n\n const contentEl = ref.current!.closest('.message-content')!;\n\n if (fullMediaData) {\n getCustomAppendixBg(fullMediaData, isOwn, isInSelectMode, isSelected).then((appendixBg) => {\n contentEl.style.setProperty('--appendix-bg', appendixBg);\n contentEl.setAttribute(CUSTOM_APPENDIX_ATTRIBUTE, '');\n });\n } else {\n contentEl.classList.add('has-appendix-thumb');\n }\n }, [fullMediaData, isOwn, shouldAffectAppendix, isInSelectMode, isSelected]);\n\n const { width, height, isSmall } = dimensions || calculateMediaDimensions(message, noAvatars);\n\n const className = buildClassName(\n 'media-inner',\n !isUploading && !nonInteractive && 'interactive',\n isSmall && 'small-image',\n width === height && 'square-image',\n );\n\n const style = dimensions\n ? `width: ${width}px; height: ${height}px; left: ${dimensions.x}px; top: ${dimensions.y}px;`\n : '';\n\n return (\n \n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n {!fullMediaData && !isDownloadAllowed && (\n \n )}\n {isTransferring && (\n {Math.round(transferProgress * 100)}%\n )}\n \n );\n};\n\nexport default Photo;\n","import { RefObject } from 'react';\nimport { useCallback, useRef } from '../lib/teact/teact';\n\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\nimport safePlay from '../util/safePlay';\n\nexport default function useHeavyAnimationCheckForVideo(playerRef: RefObject, shouldPlay: boolean) {\n const shouldPlayRef = useRef();\n shouldPlayRef.current = shouldPlay;\n\n const pause = useCallback(() => {\n if (playerRef.current) {\n playerRef.current.pause();\n }\n }, [playerRef]);\n\n const play = useCallback(() => {\n if (playerRef.current && shouldPlayRef.current) {\n safePlay(playerRef.current);\n }\n }, [playerRef]);\n\n useHeavyAnimationCheck(pause, play);\n}\n","import { useCallback, useRef } from '../../../../lib/teact/teact';\nimport { fastRaf } from '../../../../util/schedulers';\nimport useBackgroundMode from '../../../../hooks/useBackgroundMode';\nimport safePlay from '../../../../util/safePlay';\n\nexport default (playerRef: { current: HTMLVideoElement | null }, isPlayAllowed = false) => {\n const wasPlaying = useRef(false);\n const isFrozen = useRef(false);\n\n const freezePlaying = useCallback(() => {\n isFrozen.current = true;\n\n if (!isPlayAllowed || !playerRef.current) {\n return;\n }\n\n if (!wasPlaying.current) {\n wasPlaying.current = !playerRef.current.paused;\n }\n\n playerRef.current.pause();\n }, [isPlayAllowed, playerRef]);\n\n const unfreezePlaying = useCallback(() => {\n // At this point HTMLVideoElement can be unmounted from the DOM\n if (isPlayAllowed && playerRef.current && wasPlaying.current && document.body.contains(playerRef.current)) {\n safePlay(playerRef.current);\n }\n\n wasPlaying.current = false;\n isFrozen.current = false;\n }, [isPlayAllowed, playerRef]);\n\n const unfreezePlayingOnRaf = useCallback(() => {\n fastRaf(unfreezePlaying);\n }, [unfreezePlaying]);\n\n if (!document.hasFocus()) {\n freezePlaying();\n }\n\n useBackgroundMode(freezePlaying, unfreezePlayingOnRaf);\n};\n","import React, {\n FC, useCallback, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IMediaDimensions } from './helpers/calculateAlbumLayout';\n\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport { calculateVideoDimensions } from '../../common/helpers/mediaDimensions';\nimport {\n getMediaTransferState,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageVideo,\n getMessageWebPageVideo,\n isForwardedMessage,\n isOwnMessage,\n} from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useMedia from '../../../hooks/useMedia';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBuffering from '../../../hooks/useBuffering';\nimport useHeavyAnimationCheckForVideo from '../../../hooks/useHeavyAnimationCheckForVideo';\nimport useVideoCleanup from '../../../hooks/useVideoCleanup';\nimport usePauseOnInactive from './hooks/usePauseOnInactive';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nexport type OwnProps = {\n id?: string;\n message: ApiMessage;\n observeIntersection: ObserveFn;\n noAvatars?: boolean;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n uploadProgress?: number;\n dimensions?: IMediaDimensions;\n lastSyncTime?: number;\n onClick?: (id: number) => void;\n onCancelUpload?: (message: ApiMessage) => void;\n};\n\nconst Video: FC = ({\n id,\n message,\n observeIntersection,\n noAvatars,\n shouldAutoLoad,\n shouldAutoPlay,\n uploadProgress,\n lastSyncTime,\n dimensions,\n onClick,\n onCancelUpload,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n\n const video = (getMessageVideo(message) || getMessageWebPageVideo(message))!;\n const localBlobUrl = video.blobUrl;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad);\n const shouldDownload = Boolean(isDownloadAllowed && isIntersecting && lastSyncTime);\n const [isPlayAllowed, setIsPlayAllowed] = useState(shouldAutoPlay);\n\n const previewBlobUrl = useMedia(\n getMessageMediaHash(message, 'pictogram'),\n !(isIntersecting && lastSyncTime),\n getMessageMediaFormat(message, 'pictogram'),\n lastSyncTime,\n );\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n const fullMediaData = localBlobUrl || mediaData;\n const isInline = Boolean(isIntersecting && fullMediaData);\n // Thumbnail is always rendered so we can only disable blur if we have preview\n const thumbRef = useBlurredMediaThumbRef(message, previewBlobUrl);\n\n const { isBuffered, bufferingHandlers } = useBuffering(!shouldAutoLoad);\n const { isUploading, isTransferring, transferProgress } = getMediaTransferState(\n message,\n uploadProgress || downloadProgress,\n shouldDownload && !isBuffered,\n );\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasDownloadDisabled);\n const { transitionClassNames } = useTransitionForMedia(fullMediaData, 'slow');\n\n const [playProgress, setPlayProgress] = useState(0);\n const handleTimeUpdate = useCallback((e: React.SyntheticEvent) => {\n setPlayProgress(Math.max(0, e.currentTarget.currentTime - 1));\n }, []);\n\n const duration = (videoRef.current && videoRef.current.duration) || video.duration || 0;\n\n const isOwn = isOwnMessage(message);\n const isForwarded = isForwardedMessage(message);\n const { width, height } = dimensions || calculateVideoDimensions(video, isOwn, isForwarded, noAvatars);\n\n useHeavyAnimationCheckForVideo(videoRef, Boolean(isInline && shouldAutoPlay));\n usePauseOnInactive(videoRef, isPlayAllowed);\n useVideoCleanup(videoRef, [isInline]);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (!fullMediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n } else if (fullMediaData && !isPlayAllowed) {\n setIsPlayAllowed(true);\n videoRef.current!.play();\n } else if (onClick) {\n onClick(message.id);\n }\n }, [isUploading, fullMediaData, isPlayAllowed, onClick, onCancelUpload, message]);\n\n const className = buildClassName('media-inner dark', !isUploading && 'interactive');\n const videoClassName = buildClassName('full-media', transitionClassNames);\n\n const style = dimensions\n ? `width: ${width}px; height: ${height}px; left: ${dimensions.x}px; top: ${dimensions.y}px;`\n : '';\n\n return (\n \n {!previewBlobUrl && (\n \n )}\n {previewBlobUrl && (\n \n )}\n {isInline && (\n \n \n \n )}\n {(isDownloadAllowed && !isPlayAllowed && !shouldRenderSpinner) && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n {!isDownloadAllowed && (\n \n )}\n {isTransferring ? (\n ...\n ) : (\n
\n {video.isGif ? 'GIF' : formatMediaDuration(Math.max(duration - playProgress, 0))}\n
\n )}\n \n );\n};\n\nexport default Video;\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser, ApiContact } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\n\nimport Avatar from '../../common/Avatar';\n\nimport './Contact.scss';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\n\ntype OwnProps = {\n contact: ApiContact;\n};\n\ntype StateProps = {\n user?: ApiUser;\n};\n\ntype DispatchProps = Pick;\n\nconst Contact: FC = ({\n contact, user, openUserInfo,\n}) => {\n const {\n firstName,\n lastName,\n phoneNumber,\n userId,\n } = contact;\n\n const handleClick = useCallback(() => {\n openUserInfo({ id: userId });\n }, [openUserInfo, userId]);\n\n return (\n \n \n
\n
{firstName} {lastName}
\n
{formatPhoneNumberWithCode(phoneNumber)}
\n
\n \n );\n};\n\nexport default withGlobal(\n (global, { contact }): StateProps => {\n return {\n user: selectUser(global, contact.userId),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n ]),\n)(Contact);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, memo, useState,\n} from '../../lib/teact/teact';\n\nimport Checkbox from './Checkbox';\n\ntype IRadioOption = {\n label: string;\n subLabel?: string;\n value: string;\n};\n\ntype OwnProps = {\n id?: string;\n options: IRadioOption[];\n selected?: string[];\n disabled?: boolean;\n round?: boolean;\n loadingOptions?: string[];\n onChange: (value: string[]) => void;\n};\n\nconst CheckboxGroup: FC = ({\n id,\n options,\n selected = [],\n disabled,\n round,\n loadingOptions,\n onChange,\n}) => {\n const [values, setValues] = useState([]);\n\n const handleChange = useCallback((event: ChangeEvent) => {\n const { value, checked } = event.currentTarget;\n let newValues: string[];\n if (checked) {\n newValues = [...values, value];\n } else {\n newValues = values.filter((v) => v !== value);\n }\n\n setValues(newValues);\n onChange(newValues);\n }, [onChange, values]);\n\n return (\n
\n {options.map((option) => (\n \n ))}\n
\n );\n};\n\nexport default memo(CheckboxGroup);\n","import React, {\n FC, useState, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiPollAnswer, ApiPollResult } from '../../../api/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport renderText from '../../common/helpers/renderText';\n\nimport './PollOption.scss';\n\ntype OwnProps = {\n answer: ApiPollAnswer;\n voteResults?: ApiPollResult[];\n totalVoters?: number;\n maxVotersCount?: number;\n correctResults: string[];\n shouldAnimate: boolean;\n};\n\nconst PollOption: FC = ({\n answer,\n voteResults,\n totalVoters,\n maxVotersCount,\n correctResults,\n shouldAnimate,\n}) => {\n const result = voteResults && voteResults.find((r) => r.option === answer.option);\n const correctAnswer = correctResults.length === 0 || correctResults.indexOf(answer.option) !== -1;\n const showIcon = (correctResults.length > 0 && correctAnswer) || (result && result.isChosen);\n const answerPercent = result ? getPercentage(result.votersCount, totalVoters || 0) : 0;\n const [finalPercent, setFinalPercent] = useState(shouldAnimate ? 0 : answerPercent);\n // eslint-disable-next-line no-null/no-null\n const lineRef = useRef(null);\n const lineWidth = result ? getPercentage(result.votersCount, maxVotersCount || 0) : 0;\n const isAnimationDoesNotStart = finalPercent < answerPercent;\n\n useEffect(() => {\n if (shouldAnimate) {\n setFinalPercent(answerPercent);\n }\n }, [shouldAnimate, answerPercent]);\n\n useEffect(() => {\n const lineEl = lineRef.current;\n\n if (lineEl && shouldAnimate) {\n const svgEl = lineEl.firstElementChild;\n\n const style = isAnimationDoesNotStart ? '' : 'stroke-dasharray: 100% 200%; stroke-dashoffset: -44';\n if (!svgEl) {\n lineEl.innerHTML = `\n \n \n `;\n } else {\n svgEl.setAttribute('style', style);\n }\n }\n }, [isAnimationDoesNotStart, shouldAnimate]);\n\n if (!voteResults || !result) {\n return undefined;\n }\n\n const lineStyle = `width: ${lineWidth}%; transform:scaleX(${isAnimationDoesNotStart ? 0 : 1})`;\n\n return (\n
\n
\n {answerPercent}%\n {showIcon && (\n \n \n \n )}\n
\n
\n
\n {renderText(answer.text)}\n
\n
\n
\n \n
\n
\n
\n );\n};\n\nfunction getPercentage(value: number, total: number) {\n return total > 0 ? ((value / total) * 100).toFixed() : 0;\n}\n\nexport default PollOption;\n","import React, {\n FC,\n useCallback,\n useEffect,\n useState,\n memo,\n useMemo,\n useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiMessage, ApiPoll, ApiUser, ApiPollAnswer,\n} from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport renderText from '../../common/helpers/renderText';\nimport { renderTextWithEntities } from '../../common/helpers/renderMessageText';\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport useLang, { LangFn } from '../../../hooks/useLang';\n\nimport CheckboxGroup from '../../ui/CheckboxGroup';\nimport RadioGroup from '../../ui/RadioGroup';\nimport Avatar from '../../common/Avatar';\nimport Button from '../../ui/Button';\nimport Notification from '../../ui/Notification';\nimport PollOption from './PollOption';\n\nimport './Poll.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n poll: ApiPoll;\n onSendVote: (options: string[]) => void;\n};\n\ntype StateProps = {\n recentVoterIds?: number[];\n usersById: Record;\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst SOLUTION_CONTAINER_ID = '#middle-column-portals';\nconst SOLUTION_DURATION = 5000;\nconst NBSP = '\\u00A0';\n\nconst Poll: FC = ({\n message,\n poll,\n recentVoterIds,\n usersById,\n loadMessage,\n onSendVote,\n openPollResults,\n serverTimeOffset,\n}) => {\n const { id: messageId, chatId } = message;\n const { summary, results } = poll;\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [chosenOptions, setChosenOptions] = useState([]);\n const [isSolutionShown, setIsSolutionShown] = useState(false);\n const [wasSubmitted, setWasSubmitted] = useState(false);\n const [closePeriod, setClosePeriod] = useState(\n !summary.closed && summary.closeDate && summary.closeDate > 0\n ? Math.min(summary.closeDate - Math.floor(Date.now() / 1000) + serverTimeOffset, summary.closePeriod!)\n : 0,\n );\n // eslint-disable-next-line no-null/no-null\n const countdownRef = useRef(null);\n const { results: voteResults, totalVoters } = results;\n const hasVoted = voteResults && voteResults.some((r) => r.isChosen);\n const canVote = !summary.closed && !hasVoted;\n const canViewResult = !canVote && summary.isPublic && Number(results.totalVoters) > 0;\n const isMultiple = canVote && summary.multipleChoice;\n const maxVotersCount = voteResults ? Math.max(...voteResults.map((r) => r.votersCount)) : totalVoters;\n const correctResults = voteResults ? voteResults.reduce((answers: string[], r) => {\n if (r.isCorrect) {\n answers.push(r.option);\n }\n\n return answers;\n }, []) : [];\n const answers = summary.answers.map((a) => ({\n label: a.text,\n value: a.option,\n hidden: Boolean(summary.quiz && summary.closePeriod && closePeriod <= 0),\n }));\n\n useEffect(() => {\n if (\n isSubmitting\n && poll.results.results\n && poll.results.results.some((result) => result.isChosen)\n ) {\n setIsSubmitting(false);\n }\n }, [isSubmitting, poll.results.results]);\n\n useEffect(() => {\n if (closePeriod > 0) {\n setTimeout(() => setClosePeriod(closePeriod - 1), 1000);\n }\n\n const countdownEl = countdownRef.current;\n\n if (countdownEl) {\n const circumference = 6 * 2 * Math.PI;\n const svgEl = countdownEl.lastElementChild;\n const timerEl = countdownEl.firstElementChild;\n if (closePeriod <= 5) {\n countdownEl.classList.add('hurry-up');\n }\n\n if (!svgEl || !timerEl) {\n countdownEl.innerHTML = `\n ${formatMediaDuration(closePeriod)}\n \n \n `;\n } else {\n const strokeDashOffset = ((summary.closePeriod! - closePeriod) / summary.closePeriod!) * circumference;\n timerEl.textContent = formatMediaDuration(closePeriod);\n (svgEl.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', `-${strokeDashOffset}`);\n }\n }\n }, [closePeriod, summary.closePeriod]);\n\n useEffect(() => {\n if (summary.quiz && (closePeriod <= 0 || (hasVoted && !summary.closed))) {\n loadMessage({ chatId, messageId });\n }\n }, [chatId, closePeriod, hasVoted, loadMessage, messageId, summary.closed, summary.quiz]);\n\n // If the client time is not synchronized, the poll must be updated after the closePeriod time has expired.\n useEffect(() => {\n let timer: number | undefined;\n\n if (summary.quiz && !summary.closed && summary.closePeriod && summary.closePeriod > 0) {\n timer = window.setTimeout(() => {\n loadMessage({ chatId, messageId });\n }, summary.closePeriod * 1000);\n }\n\n return () => {\n if (timer) {\n window.clearTimeout(timer);\n }\n };\n }, [canVote, chatId, loadMessage, messageId, summary.closePeriod, summary.closed, summary.quiz]);\n\n const recentVoters = useMemo(() => {\n return recentVoterIds ? recentVoterIds.reduce((result: ApiUser[], id) => {\n const user = usersById[id];\n if (user) {\n result.push(user);\n }\n\n return result;\n }, []) : [];\n }, [usersById, recentVoterIds]);\n\n const handleRadioChange = useCallback(\n (option: string) => {\n setChosenOptions([option]);\n setIsSubmitting(true);\n setWasSubmitted(true);\n onSendVote([option]);\n }, [onSendVote],\n );\n\n const handleCheckboxChange = useCallback(\n (options: string[]) => {\n setChosenOptions(options);\n }, [],\n );\n\n const handleVoteClick = useCallback(\n () => {\n setIsSubmitting(true);\n setWasSubmitted(true);\n onSendVote(chosenOptions);\n }, [onSendVote, chosenOptions],\n );\n\n const handleViewResultsClick = useCallback(\n () => {\n openPollResults({ chatId, messageId });\n }, [chatId, messageId, openPollResults],\n );\n\n const handleSolutionShow = useCallback(() => {\n setIsSolutionShown(true);\n }, []);\n\n const handleSolutionHide = useCallback(() => {\n setIsSolutionShown(false);\n setWasSubmitted(false);\n }, []);\n\n // Show the solution to quiz if the answer was incorrect\n useEffect(() => {\n if (wasSubmitted && hasVoted && summary.quiz && results.results && poll.results.solution) {\n const correctResult = results.results.find((r) => r.isChosen && r.isCorrect);\n if (!correctResult) {\n setIsSolutionShown(true);\n }\n }\n }, [hasVoted, wasSubmitted, results.results, summary.quiz, poll.results.solution]);\n\n const lang = useLang();\n\n function renderResultOption(answer: ApiPollAnswer) {\n return (\n \n );\n }\n\n function renderRecentVoters() {\n return (\n recentVoters.length > 0 && (\n
\n {recentVoters.map((user) => (\n \n ))}\n
\n )\n );\n }\n\n function renderSolution() {\n return (\n isSolutionShown && poll.results.solution && (\n \n )\n );\n }\n\n return (\n
\n {renderSolution()}\n
{renderText(summary.question)}
\n
\n {lang(getPollTypeString(summary))}\n {renderRecentVoters()}\n {closePeriod > 0 && canVote &&
}\n {summary.quiz && poll.results.solution && !canVote && (\n \n \n \n )}\n
\n {canVote && (\n
\n {isMultiple\n ? (\n \n )\n : (\n \n )}\n
\n )}\n {!canVote && (\n
\n {summary.answers.map(renderResultOption)}\n
\n )}\n {!canViewResult && !isMultiple && (\n
{getReadableVotersCount(lang, summary.quiz, results.totalVoters)}
\n )}\n {isMultiple && (\n \n {lang('PollSubmitVotes')}\n \n )}\n {canViewResult && (\n \n {lang('PollViewResults')}\n \n )}\n
\n );\n};\n\nfunction getPollTypeString(summary: ApiPoll['summary']) {\n // When we just created the poll, some properties don't exist.\n if (typeof summary.isPublic === 'undefined') {\n return NBSP;\n }\n\n if (summary.quiz) {\n return summary.isPublic ? 'QuizPoll' : 'AnonymousQuizPoll';\n }\n\n if (summary.closed) {\n return 'FinalResults';\n }\n\n return summary.isPublic ? 'PublicPoll' : 'AnonymousPoll';\n}\n\nfunction getReadableVotersCount(lang: LangFn, isQuiz: true | undefined, count?: number) {\n if (!count) {\n return lang(isQuiz ? 'Chat.Quiz.TotalVotesEmpty' : 'Chat.Poll.TotalVotesResultEmpty');\n }\n\n return lang(isQuiz ? 'Answer' : 'Vote', count, 'i');\n}\n\nexport default memo(withGlobal(\n (global, { poll }) => {\n const { recentVoterIds } = poll.results;\n const { serverTimeOffset, users: { byId: usersById } } = global;\n if (!recentVoterIds || recentVoterIds.length === 0) {\n return {};\n }\n\n return {\n recentVoterIds,\n usersById,\n serverTimeOffset,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMessage', 'openPollResults']),\n)(Poll));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\n\nimport { getMessageWebPage } from '../../../modules/helpers';\nimport { calculateMediaDimensions } from './helpers/mediaDimensions';\nimport renderText from '../../common/helpers/renderText';\nimport trimText from '../../../util/trimText';\nimport buildClassName from '../../../util/buildClassName';\n\nimport SafeLink from '../../common/SafeLink';\nimport Photo from './Photo';\nimport Video from './Video';\n\nimport './WebPage.scss';\n\nconst MAX_TEXT_LENGTH = 170; // symbols\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n noAvatars?: boolean;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n inPreview?: boolean;\n lastSyncTime?: number;\n onMediaClick?: () => void;\n onCancelMediaTransfer?: () => void;\n};\n\nconst WebPage: FC = ({\n message,\n observeIntersection,\n noAvatars,\n shouldAutoLoad,\n shouldAutoPlay,\n inPreview,\n lastSyncTime,\n onMediaClick,\n onCancelMediaTransfer,\n}) => {\n const webPage = getMessageWebPage(message);\n\n let isSquarePhoto = false;\n if (webPage && webPage.photo && !webPage.video) {\n const { width, height } = calculateMediaDimensions(message);\n isSquarePhoto = width === height;\n }\n\n const handleMediaClick = useCallback(() => {\n onMediaClick!();\n }, [onMediaClick]);\n\n if (!webPage) {\n return undefined;\n }\n\n const {\n siteName,\n url,\n displayUrl,\n title,\n description,\n photo,\n video,\n } = webPage;\n const isMediaInteractive = (photo || video) && onMediaClick && !isSquarePhoto;\n const truncatedDescription = trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebPage',\n isSquarePhoto && 'with-square-photo',\n !photo && !video && !inPreview && 'without-media',\n video && 'with-video',\n );\n\n return (\n \n {photo && !video && (\n \n )}\n
\n \n {!inPreview && title && (\n

{renderText(title)}

\n )}\n {truncatedDescription && (\n

{renderText(truncatedDescription, ['emoji', 'br'])}

\n )}\n
\n {!inPreview && video && (\n \n )}\n
\n );\n};\n\nexport default memo(WebPage);\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { getMessageInvoice } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\n\nimport './Invoice.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n};\n\nconst Invoice: FC = ({\n message,\n}) => {\n const invoice = getMessageInvoice(message);\n\n const {\n title,\n text,\n description,\n photoUrl,\n } = invoice!;\n\n return (\n \n {title && (\n

{renderText(title)}

\n )}\n {text && (\n

{renderText(text, ['emoji', 'br'])}

\n )}\n
\n {photoUrl && (\n \n )}\n {description && (\n

{renderText(description, ['emoji', 'br'])}

\n )}\n
\n
\n );\n};\n\nexport default memo(Invoice);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC,\n useCallback,\n useMemo,\n memo,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { OwnProps as PhotoProps } from '../Photo';\nimport { OwnProps as VideoProps } from '../Video';\n\nimport buildClassName from '../../../../util/buildClassName';\nimport { GlobalActions } from '../../../../global/types';\nimport {\n selectIsInSelectMode,\n selectIsMessageSelected,\n} from '../../../../modules/selectors';\n\nimport { pick } from '../../../../util/iteratees';\n\ntype OwnProps = PhotoProps & VideoProps;\n\ntype StateProps = {\n isInSelectMode?: boolean;\n isSelected?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nexport default function withSelectControl(WrappedComponent: FC) {\n const ComponentWithSelectControl: FC = (props) => {\n const {\n isInSelectMode,\n isSelected,\n message,\n toggleMessageSelection,\n dimensions,\n } = props;\n\n const handleMessageSelect = useCallback((e: ReactMouseEvent) => {\n e.stopPropagation();\n toggleMessageSelection({ messageId: message.id, withShift: e && e.shiftKey });\n }, [toggleMessageSelection, message]);\n\n const newProps = useMemo(() => {\n return {\n ...props,\n isInSelectMode,\n isSelected,\n dimensions: {\n ...props.dimensions,\n x: 0,\n y: 0,\n },\n onClick: isInSelectMode ? undefined : props.onClick,\n };\n }, [props, isInSelectMode, isSelected]);\n\n return (\n \n {isInSelectMode && (\n
\n {isSelected && (\n \n )}\n
\n )}\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n \n \n );\n };\n\n return memo(withGlobal(\n (global, ownProps) => {\n const { message } = ownProps;\n return {\n isInSelectMode: selectIsInSelectMode(global),\n isSelected: selectIsMessageSelected(global, message.id),\n };\n },\n (setGlobal, actions) => pick(actions, [\n 'toggleMessageSelection',\n ]),\n )(ComponentWithSelectControl));\n}\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\n\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\nimport { IAlbum } from '../../../types';\nimport { AlbumRectPart, IAlbumLayout } from './helpers/calculateAlbumLayout';\n\nimport { getMessageContent } from '../../../modules/helpers';\nimport { withGlobal } from '../../../lib/teact/teactn';\nimport { pick } from '../../../util/iteratees';\nimport withSelectControl from './hocs/withSelectControl';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\n\nimport Photo from './Photo';\nimport Video from './Video';\n\nimport './Album.scss';\n\nconst PhotoWithSelect = withSelectControl(Photo);\nconst VideoWithSelect = withSelectControl(Video);\n\ntype OwnProps = {\n album: IAlbum;\n observeIntersection: ObserveFn;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n hasCustomAppendix?: boolean;\n lastSyncTime?: number;\n isOwn: boolean;\n albumLayout: IAlbumLayout;\n onMediaClick: (messageId: number) => void;\n};\n\ntype StateProps = {\n uploadsById: GlobalState['fileUploads']['byMessageLocalId'];\n};\n\ntype DispatchProps = Pick;\n\nconst Album: FC = ({\n album,\n observeIntersection,\n shouldAutoLoad,\n shouldAutoPlay,\n hasCustomAppendix,\n lastSyncTime,\n isOwn,\n albumLayout,\n onMediaClick,\n uploadsById,\n cancelSendingMessage,\n}) => {\n const mediaCount = album.messages.length;\n\n const handleCancelUpload = useCallback((message: ApiMessage) => {\n cancelSendingMessage({ chatId: message.chatId, messageId: message.id });\n }, [cancelSendingMessage]);\n\n function renderAlbumMessage(message: ApiMessage, index: number) {\n const { photo, video } = getMessageContent(message);\n const fileUpload = uploadsById[message.previousLocalId || message.id];\n const uploadProgress = fileUpload ? fileUpload.progress : undefined;\n const { dimensions, sides } = albumLayout.layout[index];\n\n if (photo) {\n const shouldAffectAppendix = hasCustomAppendix && (\n // eslint-disable-next-line no-bitwise\n isOwn ? index === mediaCount - 1 : Boolean(sides & AlbumRectPart.Left && sides & AlbumRectPart.Bottom)\n );\n\n return (\n \n );\n } else if (video) {\n return (\n \n );\n }\n\n return undefined;\n }\n\n const { width: containerWidth, height: containerHeight } = albumLayout.containerStyle;\n\n return (\n \n {album.messages.map(renderAlbumMessage)}\n \n );\n};\n\nexport default withGlobal(\n (global): StateProps => {\n return {\n uploadsById: global.fileUploads.byMessageLocalId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'cancelSendingMessage',\n ]),\n)(Album);\n","import React, {\n FC,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { ROUND_VIDEO_DIMENSIONS } from '../../common/helpers/mediaDimensions';\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBuffering from '../../../hooks/useBuffering';\nimport buildClassName from '../../../util/buildClassName';\nimport useHeavyAnimationCheckForVideo from '../../../hooks/useHeavyAnimationCheckForVideo';\nimport useVideoCleanup from '../../../hooks/useVideoCleanup';\nimport usePauseOnInactive from './hooks/usePauseOnInactive';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\nimport safePlay from '../../../util/safePlay';\nimport { fastRaf } from '../../../util/schedulers';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './RoundVideo.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection: ObserveFn;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n lastSyncTime?: number;\n};\n\nlet currentOnRelease: NoneToVoidFunction;\n\nfunction createCapture(onRelease: NoneToVoidFunction) {\n return () => {\n if (currentOnRelease) {\n currentOnRelease();\n }\n\n currentOnRelease = onRelease;\n };\n}\n\nconst RoundVideo: FC = ({\n message,\n observeIntersection,\n shouldAutoLoad,\n shouldAutoPlay,\n lastSyncTime,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const playingProgressRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const playerRef = useRef(null);\n\n const video = message.content.video!;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad && shouldAutoPlay);\n const shouldDownload = Boolean(isDownloadAllowed && isIntersecting && lastSyncTime);\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n const thumbRef = useBlurredMediaThumbRef(message, mediaData);\n\n const { isBuffered, bufferingHandlers } = useBuffering();\n const isTransferring = isDownloadAllowed && !isBuffered;\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldSpinnerRender,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring || !isBuffered, undefined, wasDownloadDisabled);\n const { shouldRenderThumb, transitionClassNames } = useTransitionForMedia(mediaData, 'slow');\n\n const [isActivated, setIsActivated] = useState(false);\n const [progress, setProgress] = useState(0);\n\n useEffect(() => {\n if (!isActivated) {\n return;\n }\n\n const circumference = 94 * 2 * Math.PI;\n const strokeDashOffset = circumference - progress * circumference;\n\n const playerEl = playerRef.current!;\n const playingProgressEl = playingProgressRef.current!;\n const svgEl = playingProgressEl.firstElementChild;\n\n if (!svgEl) {\n playingProgressEl.innerHTML = `\n \n `;\n } else {\n (svgEl.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', strokeDashOffset.toString());\n }\n\n setProgress(playerEl.currentTime / playerEl.duration);\n }, [isActivated, progress]);\n\n const shouldPlay = Boolean(mediaData && isIntersecting);\n\n const stopPlaying = () => {\n setIsActivated(false);\n setProgress(0);\n safePlay(playerRef.current!);\n\n fastRaf(() => {\n playingProgressRef.current!.innerHTML = '';\n });\n };\n\n const capturePlaying = createCapture(stopPlaying);\n\n useEffect(() => {\n if (!playerRef.current) {\n return;\n }\n\n if (shouldPlay) {\n safePlay(playerRef.current);\n } else {\n playerRef.current.pause();\n }\n }, [shouldPlay]);\n\n useHeavyAnimationCheckForVideo(playerRef, shouldPlay);\n usePauseOnInactive(playerRef, Boolean(mediaData));\n useVideoCleanup(playerRef, [mediaData]);\n\n const handleClick = useCallback(() => {\n if (!mediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n\n return;\n }\n\n const playerEl = playerRef.current!;\n if (isActivated) {\n if (playerEl.paused) {\n safePlay(playerEl);\n } else {\n playerEl.pause();\n }\n } else {\n capturePlaying();\n // Pause is a workaround for iOS Safari – otherwise it stops video after several frames\n playerEl.pause();\n playerEl.currentTime = 0;\n safePlay(playerEl);\n\n setIsActivated(true);\n }\n }, [capturePlaying, isActivated, mediaData]);\n\n const handleTimeUpdate = useCallback((e: React.UIEvent) => {\n const playerEl = e.currentTarget;\n\n setProgress(playerEl.currentTime / playerEl.duration);\n }, []);\n\n const videoClassName = buildClassName('full-media', transitionClassNames);\n\n return (\n \n {(shouldRenderThumb || mediaData) && (\n
\n \n
\n )}\n {mediaData && (\n
\n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n \n \n
\n )}\n
\n {shouldSpinnerRender && (\n
\n \n
\n )}\n {!mediaData && !isDownloadAllowed && (\n \n )}\n
\n {isActivated ? formatMediaDuration(playerRef.current!.currentTime) : formatMediaDuration(video.duration)}\n {(!isActivated || playerRef.current!.paused) && }\n
\n
\n );\n};\n\nexport default RoundVideo;\n","import React, { FC } from '../../../lib/teact/teact';\n\nimport { ApiKeyboardButton, ApiMessage } from '../../../api/types';\n\nimport { RE_TME_LINK } from '../../../config';\nimport renderText from '../../common/helpers/renderText';\n\nimport Button from '../../ui/Button';\n\nimport './InlineButtons.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n onClick: ({ button }: { button: ApiKeyboardButton }) => void;\n};\n\nconst InlineButtons: FC = ({ message, onClick }) => {\n return (\n
\n {message.inlineButtons!.map((row) => (\n
\n {row.map((button) => (\n onClick({ button })}\n >\n {renderText(button.text)}\n {button.type === 'url' && !button.value!.match(RE_TME_LINK) && }\n \n ))}\n
\n ))}\n
\n );\n};\n\nexport default InlineButtons;\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiMessage, ApiThreadInfo, ApiUser,\n} from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { isChatPrivate } from '../../../modules/helpers';\nimport { formatIntegerCompact } from '../../../util/textFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport { selectThreadInfo, selectThreadOriginChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\n\nimport Avatar from '../../common/Avatar';\n\nimport './CommentButton.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n disabled?: boolean;\n};\n\ntype StateProps = {\n threadInfo: ApiThreadInfo;\n usersById?: Record;\n chatsById?: Record;\n shouldRequestThreadUpdate: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CommentButton: FC = ({\n disabled,\n threadInfo,\n usersById,\n chatsById,\n shouldRequestThreadUpdate,\n openChat,\n requestThreadInfoUpdate,\n}) => {\n const lang = useLang();\n const {\n threadId, chatId, messagesCount, lastMessageId, lastReadInboxMessageId, recentReplierIds,\n } = threadInfo;\n\n const handleClick = useCallback(() => {\n openChat({ id: chatId, threadId });\n }, [openChat, chatId, threadId]);\n\n\n useEffect(() => {\n if (shouldRequestThreadUpdate) {\n requestThreadInfoUpdate({ chatId, threadId });\n }\n }, [chatId, requestThreadInfoUpdate, shouldRequestThreadUpdate, threadId]);\n\n if (messagesCount === undefined) {\n return undefined;\n }\n\n const recentRepliers = recentReplierIds && recentReplierIds.map((peerId) => {\n return isChatPrivate(peerId) ? usersById![peerId] : chatsById![peerId];\n }).filter(Boolean);\n\n function renderRecentRepliers() {\n return (\n recentRepliers && recentRepliers.length > 0 && (\n
\n {recentRepliers.map((user) => (\n \n ))}\n
\n )\n );\n }\n\n const hasUnread = Boolean(lastReadInboxMessageId && lastMessageId && lastReadInboxMessageId < lastMessageId);\n\n return (\n \n \n {(!recentRepliers || recentRepliers.length === 0) && }\n {renderRecentRepliers()}\n
\n {messagesCount ? lang('Comments', messagesCount, 'i') : lang('LeaveAComment')}\n
\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { message }) => {\n const { threadId, chatId } = message.threadInfo!;\n\n const threadInfo = selectThreadInfo(global, chatId, threadId) || message.threadInfo!;\n const chat = selectThreadOriginChat(global, chatId, threadId);\n const { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n\n return {\n threadInfo,\n usersById,\n chatsById,\n shouldRequestThreadUpdate: !!chat && !threadInfo.topMessageId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'requestThreadInfoUpdate',\n ]),\n)(CommentButton));\n","import React, {\n FC,\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport {\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n ApiChat,\n ApiSticker,\n MAIN_THREAD_ID,\n} from '../../../api/types';\nimport {\n FocusDirection, IAlbum, ISettings, MediaViewerOrigin,\n} from '../../../types';\n\nimport { IS_ANDROID, IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport {\n selectChat,\n selectChatMessage,\n selectUploadProgress,\n selectIsChatWithSelf,\n selectOutgoingStatus,\n selectUser,\n selectIsMessageFocused,\n selectCurrentTextSearch,\n selectAnimatedEmoji,\n selectIsInSelectMode,\n selectIsMessageSelected,\n selectIsDocumentGroupSelected,\n selectSender,\n selectForwardedSender,\n selectThreadTopMessageId,\n selectShouldAutoLoadMedia,\n selectShouldAutoPlayMedia,\n selectShouldLoopStickers,\n selectTheme,\n} from '../../../modules/selectors';\nimport {\n getMessageContent,\n isOwnMessage,\n isReplyMessage,\n isAnonymousOwnMessage,\n isMessageLocal,\n isChatPrivate,\n getMessageCustomShape,\n isChatChannel,\n getMessageSingleEmoji,\n getSenderTitle,\n getUserColorKey,\n} from '../../../modules/helpers';\nimport buildClassName from '../../../util/buildClassName';\nimport windowSize from '../../../util/windowSize';\nimport useEnsureMessage from '../../../hooks/useEnsureMessage';\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport { renderMessageText } from '../../common/helpers/renderMessageText';\nimport { ROUND_VIDEO_DIMENSIONS } from '../../common/helpers/mediaDimensions';\nimport { buildContentClassName, isEmojiOnlyMessage } from './helpers/buildContentClassName';\nimport { getMinMediaWidth, calculateMediaDimensions } from './helpers/mediaDimensions';\nimport { calculateAlbumLayout } from './helpers/calculateAlbumLayout';\nimport { preventMessageInputBlur } from '../helpers/preventMessageInputBlur';\nimport renderText from '../../common/helpers/renderText';\nimport calculateAuthorWidth from './helpers/calculateAuthorWidth';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useFocusMessage from './hooks/useFocusMessage';\nimport useLang from '../../../hooks/useLang';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\n\nimport Button from '../../ui/Button';\nimport Avatar from '../../common/Avatar';\nimport EmbeddedMessage from '../../common/EmbeddedMessage';\nimport Document from '../../common/Document';\nimport Audio from '../../common/Audio';\nimport MessageMeta from './MessageMeta';\nimport ContextMenuContainer from './ContextMenuContainer.async';\nimport Sticker from './Sticker';\nimport AnimatedEmoji from '../../common/AnimatedEmoji';\nimport Photo from './Photo';\nimport Video from './Video';\nimport Contact from './Contact';\nimport Poll from './Poll';\nimport WebPage from './WebPage';\nimport Invoice from './Invoice';\nimport Album from './Album';\nimport RoundVideo from './RoundVideo';\nimport InlineButtons from './InlineButtons';\nimport CommentButton from './CommentButton';\n\nimport './Message.scss';\n\ntype MessagePositionProperties = {\n isFirstInGroup: boolean;\n isLastInGroup: boolean;\n isFirstInDocumentGroup: boolean;\n isLastInDocumentGroup: boolean;\n isLastInList: boolean;\n};\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersectionForBottom: ObserveFn;\n observeIntersectionForMedia: ObserveFn;\n observeIntersectionForAnimatedStickers: ObserveFn;\n album?: IAlbum;\n noAvatars?: boolean;\n withAvatar?: boolean;\n withSenderName?: boolean;\n threadId: number;\n messageListType: MessageListType;\n noComments: boolean;\n appearanceOrder: number;\n} & MessagePositionProperties;\n\ntype StateProps = {\n theme: ISettings['theme'];\n forceSenderName?: boolean;\n chatUsername?: string;\n sender?: ApiUser | ApiChat;\n originSender?: ApiUser | ApiChat;\n botSender?: ApiUser;\n isThreadTop?: boolean;\n shouldHideReply?: boolean;\n replyMessage?: ApiMessage;\n replyMessageSender?: ApiUser | ApiChat;\n outgoingStatus?: ApiMessageOutgoingStatus;\n uploadProgress?: number;\n isFocused?: boolean;\n focusDirection?: FocusDirection;\n noFocusHighlight?: boolean;\n isForwarding?: boolean;\n isChatWithSelf?: boolean;\n isChannel?: boolean;\n lastSyncTime?: number;\n highlight?: string;\n isSingleEmoji?: boolean;\n animatedEmoji?: ApiSticker;\n isInSelectMode?: boolean;\n isSelected?: boolean;\n isGroupSelected?: boolean;\n threadId?: number;\n isPinnedList?: boolean;\n shouldAutoLoadMedia?: boolean;\n shouldAutoPlayMedia?: boolean;\n shouldLoopStickers?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst NBSP = '\\u00A0';\nconst GROUP_MESSAGE_HOVER_ATTRIBUTE = 'data-is-document-group-hover';\n// eslint-disable-next-line max-len\nconst APPENDIX_OWN = '';\n// eslint-disable-next-line max-len\nconst APPENDIX_NOT_OWN = '';\nconst APPEARANCE_DELAY = 10;\nconst NO_MEDIA_CORNERS_THRESHOLD = 18;\nconst ANDROID_KEYBOARD_HIDE_DELAY_MS = 350;\n\nconst Message: FC = ({\n message,\n chatUsername,\n observeIntersectionForBottom,\n observeIntersectionForMedia,\n observeIntersectionForAnimatedStickers,\n album,\n noAvatars,\n withAvatar,\n withSenderName,\n noComments,\n appearanceOrder,\n isFirstInGroup,\n isLastInGroup,\n isFirstInDocumentGroup,\n isLastInDocumentGroup,\n isLastInList,\n theme,\n forceSenderName,\n sender,\n originSender,\n botSender,\n isThreadTop,\n shouldHideReply,\n replyMessage,\n replyMessageSender,\n outgoingStatus,\n uploadProgress,\n isFocused,\n focusDirection,\n noFocusHighlight,\n isForwarding,\n isChatWithSelf,\n isChannel,\n lastSyncTime,\n highlight,\n animatedEmoji,\n isInSelectMode,\n isSelected,\n isGroupSelected,\n threadId,\n messageListType,\n isPinnedList,\n shouldAutoLoadMedia,\n shouldAutoPlayMedia,\n shouldLoopStickers,\n focusMessage,\n openMediaViewer,\n openAudioPlayer,\n openUserInfo,\n openChat,\n cancelSendingMessage,\n markMessagesRead,\n sendPollVote,\n toggleMessageSelection,\n setReplyingToId,\n openForwardMenu,\n clickInlineButton,\n disableContextMenuHint,\n showNotification,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const bottomMarkerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const appendixRef = useRef(null);\n const lang = useLang();\n\n\n useOnIntersect(bottomMarkerRef, observeIntersectionForBottom);\n\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu: onContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(ref, IS_TOUCH_ENV && isInSelectMode, true, IS_ANDROID);\n\n useEffect(() => {\n if (isContextMenuOpen) {\n disableContextMenuHint();\n }\n }, [isContextMenuOpen, disableContextMenuHint]);\n\n const noAppearanceAnimation = appearanceOrder <= 0;\n const [isShown, markShown] = useFlag(noAppearanceAnimation);\n useEffect(() => {\n if (noAppearanceAnimation) {\n return;\n }\n\n setTimeout(markShown, appearanceOrder * APPEARANCE_DELAY);\n }, [appearanceOrder, markShown, noAppearanceAnimation]);\n const { transitionClassNames } = useShowTransition(isShown, undefined, noAppearanceAnimation, false);\n\n const { chatId, id: messageId, threadInfo } = message;\n\n const isLocal = isMessageLocal(message);\n const isOwn = isOwnMessage(message);\n const isScheduled = messageListType === 'scheduled' || message.isScheduled;\n const hasReply = isReplyMessage(message) && !shouldHideReply;\n const hasThread = Boolean(threadInfo) && messageListType === 'thread';\n const { forwardInfo, viaBotId } = message;\n const asForwarded = forwardInfo && !isChatWithSelf && !forwardInfo.isLinkedChannelPost;\n const isInDocumentGroup = !!message.groupedId && !message.isInAlbum;\n const isAlbum = Boolean(album) && album!.messages.length > 1;\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, webPage, invoice,\n } = getMessageContent(message);\n const customShape = getMessageCustomShape(message);\n const textParts = renderMessageText(message, highlight, isEmojiOnlyMessage(customShape));\n const isContextMenuShown = contextMenuPosition !== undefined;\n const signature = (\n (isChannel && message.adminTitle) || (forwardInfo && !asForwarded && forwardInfo.adminTitle) || undefined\n );\n const metaSafeAuthorWidth = useMemo(() => {\n return signature ? calculateAuthorWidth(signature) : undefined;\n }, [signature]);\n const canShowActionButton = (\n !(isContextMenuShown || isInSelectMode || isForwarding)\n && (!isInDocumentGroup || isLastInDocumentGroup)\n );\n const canForward = canShowActionButton && isChannel && !isScheduled;\n const canFocus = Boolean(canShowActionButton && (\n (forwardInfo && (forwardInfo.isChannelPost || (isChatWithSelf && !isOwn)) && forwardInfo.fromMessageId)\n || isPinnedList\n ));\n const avatarPeer = forwardInfo && (isChatWithSelf || !sender) ? originSender : sender;\n const senderPeer = forwardInfo ? originSender : sender;\n\n const containerClassName = buildClassName(\n 'Message message-list-item',\n isFirstInGroup && 'first-in-group',\n isLastInGroup && 'last-in-group',\n isFirstInDocumentGroup && 'first-in-document-group',\n isLastInDocumentGroup && 'last-in-document-group',\n isLastInList && 'last-in-list',\n isOwn && 'own',\n Boolean(message.views) && 'has-views',\n message.isEdited && 'was-edited',\n hasReply && 'has-reply',\n isContextMenuShown && 'has-menu-open',\n isFocused && !noFocusHighlight && 'focused',\n isForwarding && 'is-forwarding',\n message.isDeleting && 'is-deleting',\n isInDocumentGroup && 'is-in-document-group',\n isAlbum && 'is-album',\n message.hasUnreadMention && 'has-unread-mention',\n isSelected && 'is-selected',\n isInSelectMode && 'is-in-selection-mode',\n isThreadTop && 'is-thread-top',\n Boolean(message.inlineButtons) && 'has-inline-buttons',\n transitionClassNames,\n );\n const contentClassName = buildContentClassName(message, {\n hasReply,\n customShape,\n isLastInGroup,\n asForwarded,\n hasThread,\n forceSenderName,\n hasComments: message.threadInfo && message.threadInfo.messagesCount > 0,\n hasActionButton: canForward || canFocus,\n });\n const withCommentButton = message.threadInfo && (!isInDocumentGroup || isLastInDocumentGroup)\n && messageListType === 'thread' && !noComments;\n const withAppendix = contentClassName.includes('has-appendix');\n\n useEnsureMessage(chatId, hasReply ? message.replyToMessageId : undefined, replyMessage, message.id);\n useFocusMessage(ref, chatId, isFocused, focusDirection, noFocusHighlight);\n useLayoutEffect(() => {\n if (!appendixRef.current) {\n return;\n }\n\n appendixRef.current.innerHTML = isOwn ? APPENDIX_OWN : APPENDIX_NOT_OWN;\n }, [isOwn, withAppendix]);\n\n const handleGroupDocumentMessagesSelect = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n\n toggleMessageSelection({\n messageId,\n groupedId: message.groupedId,\n });\n }, [messageId, message.groupedId, toggleMessageSelection]);\n\n const handleMessageSelect = useCallback((e?: React.MouseEvent) => {\n if (isLocal) {\n return;\n }\n\n const params = isAlbum && album && album.messages\n ? {\n messageId,\n childMessageIds: album.messages.map(({ id }) => id),\n withShift: e && e.shiftKey,\n }\n : { messageId, withShift: e && e.shiftKey };\n toggleMessageSelection(params);\n }, [isLocal, isAlbum, album, messageId, toggleMessageSelection]);\n\n const handleContainerDoubleClick = useCallback(() => {\n setReplyingToId({ messageId });\n }, [setReplyingToId, messageId]);\n\n const handleContentDoubleClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n }, []);\n\n const handleMouseDown = (e: React.MouseEvent) => {\n preventMessageInputBlur(e);\n\n if (!isLocal) {\n handleBeforeContextMenu(e);\n }\n };\n\n const handleAvatarClick = useCallback(() => {\n if (!avatarPeer) {\n return;\n }\n\n if (isChatPrivate(avatarPeer.id)) {\n openUserInfo({ id: avatarPeer.id });\n } else {\n openChat({ id: avatarPeer.id });\n }\n }, [avatarPeer, openUserInfo, openChat]);\n\n const handleSenderClick = useCallback(() => {\n if (!senderPeer) {\n showNotification({ message: lang('HidAccount') });\n\n return;\n }\n\n if (isChatPrivate(senderPeer.id)) {\n openUserInfo({ id: senderPeer.id });\n } else {\n openChat({ id: senderPeer.id });\n }\n }, [senderPeer, showNotification, lang, openUserInfo, openChat]);\n\n const handleViaBotClick = useCallback(() => {\n if (!botSender) {\n return;\n }\n\n openUserInfo({ id: botSender.id });\n }, [botSender, openUserInfo]);\n\n const handleReplyClick = useCallback((): void => {\n focusMessage({\n chatId, threadId, messageId: message.replyToMessageId, replyMessageId: messageId,\n });\n }, [focusMessage, chatId, threadId, message.replyToMessageId, messageId]);\n\n const handleMediaClick = useCallback((): void => {\n openMediaViewer({\n chatId, threadId, messageId, origin: isScheduled ? MediaViewerOrigin.ScheduledInline : MediaViewerOrigin.Inline,\n });\n }, [chatId, threadId, messageId, openMediaViewer, isScheduled]);\n\n const handleAudioPlay = useCallback((): void => {\n openAudioPlayer({ chatId, messageId });\n }, [chatId, messageId, openAudioPlayer]);\n\n const handleAlbumMediaClick = useCallback((albumMessageId: number): void => {\n openMediaViewer({\n chatId,\n threadId,\n messageId: albumMessageId,\n origin: isScheduled ? MediaViewerOrigin.ScheduledAlbum : MediaViewerOrigin.Album,\n });\n }, [chatId, threadId, openMediaViewer, isScheduled]);\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n const target = e.target as HTMLDivElement;\n if (!target.classList.contains('text-content') && !target.classList.contains('Message')) {\n return;\n }\n\n if (IS_ANDROID) {\n if (windowSize.getIsKeyboardVisible()) {\n setTimeout(() => { onContextMenu(e); }, ANDROID_KEYBOARD_HIDE_DELAY_MS);\n } else {\n onContextMenu(e);\n }\n } else {\n onContextMenu(e);\n }\n }, [onContextMenu]);\n\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n if (IS_ANDROID) {\n handleMessageSelect(e);\n } else {\n onContextMenu(e);\n }\n }, [onContextMenu, handleMessageSelect]);\n\n const handleReadMedia = useCallback((): void => {\n markMessagesRead({ messageIds: [messageId] });\n }, [messageId, markMessagesRead]);\n\n const handleCancelUpload = useCallback(() => {\n cancelSendingMessage({ chatId, messageId });\n }, [cancelSendingMessage, chatId, messageId]);\n\n const handleVoteSend = useCallback((options: string[]) => {\n sendPollVote({ chatId, messageId, options });\n }, [chatId, messageId, sendPollVote]);\n\n const handleGroupForward = useCallback(() => {\n openForwardMenu({ fromChatId: chatId, groupedId: message.groupedId });\n }, [openForwardMenu, chatId, message.groupedId]);\n\n const handleForward = useCallback(() => {\n if (album && album.messages) {\n const messageIds = album.messages.map(({ id }) => id);\n openForwardMenu({ fromChatId: chatId, messageIds });\n } else {\n openForwardMenu({ fromChatId: chatId, messageIds: [messageId] });\n }\n }, [album, openForwardMenu, chatId, messageId]);\n\n const handleFocus = useCallback(() => {\n focusMessage({\n chatId, threadId: MAIN_THREAD_ID, messageId,\n });\n }, [focusMessage, chatId, messageId]);\n\n const handleFocusForwarded = useCallback(() => {\n if (isInDocumentGroup) {\n focusMessage({\n chatId: forwardInfo!.fromChatId, groupedId: message.groupedId, groupedChatId: chatId,\n });\n return;\n }\n focusMessage({\n chatId: forwardInfo!.fromChatId, messageId: forwardInfo!.fromMessageId,\n });\n }, [focusMessage, forwardInfo, message, chatId, isInDocumentGroup]);\n\n let style = '';\n let calculatedWidth;\n let noMediaCorners = false;\n const albumLayout = useMemo(() => {\n return isAlbum ? calculateAlbumLayout(isOwn, Boolean(asForwarded), Boolean(noAvatars), album!) : undefined;\n }, [isAlbum, isOwn, asForwarded, noAvatars, album]);\n\n const extraPadding = asForwarded ? 28 : 0;\n if (!isAlbum && (photo || video)) {\n let width: number | undefined;\n if (photo) {\n width = calculateMediaDimensions(message, noAvatars).width;\n } else if (video) {\n if (video.isRound) {\n width = ROUND_VIDEO_DIMENSIONS;\n } else {\n width = calculateMediaDimensions(message, noAvatars).width;\n }\n }\n\n if (width) {\n calculatedWidth = Math.max(getMinMediaWidth(Boolean(text), withCommentButton), width);\n if (calculatedWidth - width > NO_MEDIA_CORNERS_THRESHOLD) {\n noMediaCorners = true;\n }\n }\n } else if (albumLayout) {\n calculatedWidth = Math.max(getMinMediaWidth(Boolean(text), withCommentButton), albumLayout.containerStyle.width);\n if (calculatedWidth - albumLayout.containerStyle.width > NO_MEDIA_CORNERS_THRESHOLD) {\n noMediaCorners = true;\n }\n }\n\n if (calculatedWidth) {\n style = `width: ${calculatedWidth + extraPadding}px`;\n }\n\n function renderAvatar() {\n const isAvatarPeerUser = avatarPeer && isChatPrivate(avatarPeer.id);\n const avatarUser = avatarPeer && isAvatarPeerUser ? avatarPeer as ApiUser : undefined;\n const avatarChat = avatarPeer && !isAvatarPeerUser ? avatarPeer as ApiChat : undefined;\n const hiddenName = !avatarPeer && forwardInfo ? forwardInfo.hiddenUserName : undefined;\n\n return (\n \n );\n }\n\n function renderContent() {\n const className = buildClassName(\n 'content-inner',\n asForwarded && !customShape && 'forwarded-message',\n hasReply && 'reply-message',\n noMediaCorners && 'no-media-corners',\n );\n const hasCustomAppendix = isLastInGroup && !textParts && !asForwarded && !hasThread;\n const shouldInlineMeta = !webPage && !animatedEmoji && textParts;\n const textContentClass = buildClassName(\n 'text-content',\n shouldInlineMeta && 'with-meta',\n outgoingStatus && 'with-outgoing-icon',\n );\n\n return (\n
\n {renderSenderName()}\n {hasReply && (\n \n )}\n {sticker && (\n \n )}\n {animatedEmoji && (\n \n )}\n {isAlbum && (\n \n )}\n {!isAlbum && photo && (\n \n )}\n {!isAlbum && video && video.isRound && (\n \n )}\n {!isAlbum && video && !video.isRound && (\n \n )}\n {(audio || voice) && (\n \n )}\n {document && (\n \n )}\n {contact && (\n \n )}\n {poll && (\n \n )}\n {!animatedEmoji && textParts && (\n

\n {textParts}\n {shouldInlineMeta && (\n \n )}\n

\n )}\n {webPage && (\n \n )}\n {invoice && (\n \n )}\n
\n );\n }\n\n function renderSenderName() {\n const shouldRender = !(customShape && !viaBotId) && (\n (withSenderName && !photo && !video) || asForwarded || viaBotId || forceSenderName\n ) && (!isInDocumentGroup || isFirstInDocumentGroup);\n\n if (!shouldRender) {\n return undefined;\n }\n\n let senderTitle;\n let senderColor;\n if (senderPeer && !(customShape && viaBotId)) {\n senderTitle = getSenderTitle(lang, senderPeer);\n\n if (!asForwarded) {\n senderColor = `color-${getUserColorKey(senderPeer)}`;\n }\n } else if (forwardInfo && forwardInfo.hiddenUserName) {\n senderTitle = forwardInfo.hiddenUserName;\n }\n\n return (\n
\n {senderTitle ? (\n \n {renderText(senderTitle)}\n \n ) : !botSender ? (\n NBSP\n ) : undefined}\n {botSender && (\n <>\n {lang('ViaBot')}\n \n {renderText(`@${botSender.username}`)}\n \n \n )}\n {forwardInfo && forwardInfo.isLinkedChannelPost ? (\n {lang('DiscussChannel')}\n ) : message.adminTitle && !isChannel ? (\n {message.adminTitle}\n ) : undefined}\n
\n );\n }\n\n return (\n \n \n {!isLocal && !isInDocumentGroup && (\n
\n {isSelected && }\n
\n )}\n {!isLocal && isLastInDocumentGroup && (\n \n {isGroupSelected && (\n \n )}\n \n )}\n {withAvatar && renderAvatar()}\n \n \n {asForwarded && !customShape && (!isInDocumentGroup || isFirstInDocumentGroup) && (\n
{lang('ForwardedMessage')}
\n )}\n {renderContent()}\n {(!isInDocumentGroup || isLastInDocumentGroup) && !(!webPage && !animatedEmoji && textParts) && (\n \n )}\n {canForward ? (\n \n \n \n ) : canFocus ? (\n \n \n \n ) : undefined}\n {withCommentButton && }\n {withAppendix &&
}\n
\n {message.inlineButtons && (\n \n )}\n \n {contextMenuPosition && (\n \n )}\n \n );\n};\n\nfunction handleDocumentGroupMouseEnter(e: React.MouseEvent) {\n const lastGroupElement = getLastElementInDocumentGroup(e.currentTarget);\n if (lastGroupElement) {\n lastGroupElement.setAttribute(GROUP_MESSAGE_HOVER_ATTRIBUTE, '');\n }\n}\n\nfunction handleDocumentGroupMouseLeave(e: React.MouseEvent) {\n const lastGroupElement = getLastElementInDocumentGroup(e.currentTarget);\n if (lastGroupElement) {\n lastGroupElement.removeAttribute(GROUP_MESSAGE_HOVER_ATTRIBUTE);\n }\n}\n\nfunction getLastElementInDocumentGroup(element: Element) {\n let current: Element | null = element;\n\n do {\n current = current.nextElementSibling;\n } while (current && !current.classList.contains('last-in-document-group'));\n\n return current;\n}\n\nexport default memo(withGlobal(\n (global, ownProps): StateProps => {\n const { focusedMessage, forwardMessages, lastSyncTime } = global;\n const {\n message, album, withSenderName, withAvatar, threadId, messageListType,\n } = ownProps;\n const {\n id, chatId, viaBotId, replyToMessageId, isOutgoing,\n } = message;\n\n const chat = selectChat(global, chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const isChannel = chat && isChatChannel(chat);\n const chatUsername = chat && chat.username;\n\n const forceSenderName = !isChatWithSelf && isAnonymousOwnMessage(message);\n const canShowSender = withSenderName || withAvatar || forceSenderName;\n const sender = canShowSender ? selectSender(global, message) : undefined;\n const originSender = selectForwardedSender(global, message);\n const botSender = viaBotId ? selectUser(global, viaBotId) : undefined;\n\n const threadTopMessageId = threadId ? selectThreadTopMessageId(global, chatId, threadId) : undefined;\n const isThreadTop = message.id === threadTopMessageId;\n\n const shouldHideReply = replyToMessageId === threadTopMessageId;\n const replyMessage = replyToMessageId && !shouldHideReply\n ? selectChatMessage(global, chatId, replyToMessageId)\n : undefined;\n const replyMessageSender = replyMessage && selectSender(global, replyMessage);\n\n const uploadProgress = selectUploadProgress(global, message);\n const isFocused = messageListType === 'thread' && (\n album\n ? album.messages.some((m) => selectIsMessageFocused(global, m))\n : selectIsMessageFocused(global, message)\n );\n\n const { direction: focusDirection, noHighlight: noFocusHighlight } = (isFocused && focusedMessage) || {};\n\n const isForwarding = forwardMessages.messageIds && forwardMessages.messageIds.includes(id);\n\n const { query: highlight } = selectCurrentTextSearch(global) || {};\n\n const singleEmoji = getMessageSingleEmoji(message);\n let isSelected: boolean;\n\n if (album && album.messages) {\n isSelected = album.messages.every(({ id: messageId }) => selectIsMessageSelected(global, messageId));\n } else {\n isSelected = selectIsMessageSelected(global, id);\n }\n\n return {\n theme: selectTheme(global),\n chatUsername,\n forceSenderName,\n sender,\n originSender,\n botSender,\n shouldHideReply,\n isThreadTop,\n replyMessage,\n replyMessageSender,\n isFocused,\n isForwarding,\n isChatWithSelf,\n isChannel,\n lastSyncTime,\n highlight,\n isSingleEmoji: Boolean(singleEmoji),\n animatedEmoji: singleEmoji ? selectAnimatedEmoji(global, singleEmoji) : undefined,\n isInSelectMode: selectIsInSelectMode(global),\n isSelected,\n isGroupSelected: (\n !!message.groupedId && !message.isInAlbum && selectIsDocumentGroupSelected(global, chatId, message.groupedId)\n ),\n threadId,\n isPinnedList: messageListType === 'pinned',\n shouldAutoLoadMedia: chat ? selectShouldAutoLoadMedia(global, message, chat, sender) : undefined,\n shouldAutoPlayMedia: selectShouldAutoPlayMedia(global, message),\n shouldLoopStickers: selectShouldLoopStickers(global),\n ...(isOutgoing && { outgoingStatus: selectOutgoingStatus(global, message, messageListType === 'scheduled') }),\n ...(typeof uploadProgress === 'number' && { uploadProgress }),\n ...(isFocused && { focusDirection, noFocusHighlight }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'focusMessage',\n 'openMediaViewer',\n 'openAudioPlayer',\n 'cancelSendingMessage',\n 'openUserInfo',\n 'openChat',\n 'markMessagesRead',\n 'sendPollVote',\n 'toggleMessageSelection',\n 'setReplyingToId',\n 'openForwardMenu',\n 'clickInlineButton',\n 'disableContextMenuHint',\n 'showNotification',\n ]),\n)(Message));\n","import { RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport { MessageListType } from '../../global/types';\n\nimport { SCHEDULED_WHEN_ONLINE } from '../../config';\nimport buildClassName from '../../util/buildClassName';\nimport { compact, flatten } from '../../util/iteratees';\nimport { formatHumanDate } from '../../util/dateFormat';\nimport { getMessageOriginalId, isActionMessage, isOwnMessage } from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport { isAlbum, MessageDateGroup } from './helpers/groupMessages';\nimport { preventMessageInputBlur } from './helpers/preventMessageInputBlur';\nimport useScrollHooks from './hooks/useScrollHooks';\nimport useMessageObservers from './hooks/useMessageObservers';\n\nimport Message from './message/Message';\nimport ActionMessage from './ActionMessage';\n\ninterface OwnProps {\n messageIds: number[];\n messageGroups: MessageDateGroup[];\n isViewportNewest: boolean;\n isUnread: boolean;\n withUsers: boolean;\n noAvatars: boolean;\n containerRef: RefObject;\n anchorIdRef: { current: string | undefined };\n memoFirstUnreadIdRef: { current: number | undefined };\n threadId: number;\n type: MessageListType;\n threadTopMessageId: number | undefined;\n hasLinkedChat: boolean | undefined;\n isSchedule: boolean;\n noAppearanceAnimation: boolean;\n onFabToggle: AnyToVoidFunction;\n onNotchToggle: AnyToVoidFunction;\n openHistoryCalendar: Function;\n}\n\nconst UNREAD_DIVIDER_CLASS = 'unread-divider';\n\nconst MessageListContent: FC = ({\n messageIds,\n messageGroups,\n isViewportNewest,\n isUnread,\n withUsers,\n noAvatars,\n containerRef,\n anchorIdRef,\n memoFirstUnreadIdRef,\n threadId,\n type,\n threadTopMessageId,\n hasLinkedChat,\n isSchedule,\n noAppearanceAnimation,\n onFabToggle,\n onNotchToggle,\n openHistoryCalendar,\n}) => {\n const {\n observeIntersectionForMedia,\n observeIntersectionForReading,\n observeIntersectionForAnimatedStickers,\n } = useMessageObservers(type, containerRef, memoFirstUnreadIdRef);\n\n const {\n backwardsTriggerRef,\n forwardsTriggerRef,\n fabTriggerRef,\n } = useScrollHooks(\n type,\n containerRef,\n messageIds,\n isViewportNewest,\n isUnread,\n onFabToggle,\n onNotchToggle,\n );\n\n const lang = useLang();\n\n const unreadDivider = (\n
\n {lang('UnreadMessages')}\n
\n );\n\n const messageCountToAnimate = noAppearanceAnimation ? 0 : messageGroups.reduce((acc, messageGroup) => {\n return acc + flatten(messageGroup.senderGroups).length;\n }, 0);\n let appearanceIndex = 0;\n\n const dateGroups = messageGroups.map((\n dateGroup: MessageDateGroup,\n dateGroupIndex: number,\n dateGroupsArray: MessageDateGroup[],\n ) => {\n const senderGroups = dateGroup.senderGroups.map((\n senderGroup,\n senderGroupIndex,\n senderGroupsArray,\n ) => {\n if (senderGroup.length === 1 && !isAlbum(senderGroup[0]) && isActionMessage(senderGroup[0])) {\n const message = senderGroup[0];\n const isLastInList = (\n senderGroupIndex === senderGroupsArray.length - 1\n && dateGroupIndex === dateGroupsArray.length - 1\n );\n\n return compact([\n message.id === memoFirstUnreadIdRef.current && unreadDivider,\n ,\n ]);\n }\n\n let currentDocumentGroupId: string | undefined;\n\n return flatten(senderGroup.map((\n messageOrAlbum,\n messageIndex,\n ) => {\n const message = isAlbum(messageOrAlbum) ? messageOrAlbum.mainMessage : messageOrAlbum;\n const album = isAlbum(messageOrAlbum) ? messageOrAlbum : undefined;\n const isOwn = isOwnMessage(message);\n const isMessageAlbum = isAlbum(messageOrAlbum);\n const nextMessage = senderGroup[messageIndex + 1];\n\n if (message.previousLocalId && anchorIdRef.current === `message${message.previousLocalId}`) {\n anchorIdRef.current = `message${message.id}`;\n }\n\n const documentGroupId = !isMessageAlbum && message.groupedId ? message.groupedId : undefined;\n const nextDocumentGroupId = nextMessage && !isAlbum(nextMessage) ? nextMessage.groupedId : undefined;\n\n const position = {\n isFirstInGroup: messageIndex === 0,\n isLastInGroup: messageIndex === senderGroup.length - 1,\n isFirstInDocumentGroup: Boolean(documentGroupId && documentGroupId !== currentDocumentGroupId),\n isLastInDocumentGroup: Boolean(documentGroupId && documentGroupId !== nextDocumentGroupId),\n isLastInList: (\n messageIndex === senderGroup.length - 1\n && senderGroupIndex === senderGroupsArray.length - 1\n && dateGroupIndex === dateGroupsArray.length - 1\n ),\n };\n\n currentDocumentGroupId = documentGroupId;\n\n const originalId = getMessageOriginalId(message);\n // Scheduled messages can have local IDs in the middle of the list,\n // and keys should be ordered, so we prefix it with a date.\n // However, this may lead to issues if server date is not synchronized with the local one.\n const key = type !== 'scheduled' ? originalId : `${message.date}_${originalId}`;\n\n return compact([\n message.id === memoFirstUnreadIdRef.current ? unreadDivider : undefined,\n ,\n message.id === threadTopMessageId && (\n
\n {lang('DiscussionStarted')}\n
\n ),\n ]);\n }));\n });\n\n return (\n \n openHistoryCalendar({ selectedAt: dateGroup.datetime }) : undefined}\n >\n \n {isSchedule && dateGroup.originalDate === SCHEDULED_WHEN_ONLINE && (\n lang('MessageScheduledUntilOnline')\n )}\n {isSchedule && dateGroup.originalDate !== SCHEDULED_WHEN_ONLINE && (\n lang('MessageScheduledOn', formatHumanDate(lang, dateGroup.datetime, undefined, true))\n )}\n {!isSchedule && formatHumanDate(lang, dateGroup.datetime)}\n \n \n {flatten(senderGroups)}\n \n );\n });\n\n return (\n
\n
\n {flatten(dateGroups)}\n \n \n
\n );\n};\n\nexport default memo(MessageListContent);\n","import { RefObject } from 'react';\nimport { getDispatch } from '../../../lib/teact/teactn';\nimport { useCallback, useMemo, useRef } from '../../../lib/teact/teact';\n\nimport { LoadMoreDirection } from '../../../types';\nimport { MessageListType } from '../../../global/types';\n\nimport { debounce } from '../../../util/schedulers';\nimport { useIntersectionObserver, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport { MESSAGE_LIST_SENSITIVE_AREA } from '../../../config';\nimport resetScroll from '../../../util/resetScroll';\nimport useOnChange from '../../../hooks/useOnChange';\n\nconst FAB_THRESHOLD = 50;\nconst TOOLS_FREEZE_TIMEOUT = 100;\n\nexport default function useScrollHooks(\n type: MessageListType,\n containerRef: RefObject,\n messageIds: number[],\n isViewportNewest: boolean,\n isUnread: boolean,\n onFabToggle: AnyToVoidFunction,\n onNotchToggle: AnyToVoidFunction,\n) {\n const { loadViewportMessages } = getDispatch();\n\n const [loadMoreBackwards, loadMoreForwards] = useMemo(\n () => (type === 'thread' ? [\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Backwards }), 1000, true, false),\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Forwards }), 1000, true, false),\n ] : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [loadViewportMessages, messageIds],\n );\n\n // eslint-disable-next-line no-null/no-null\n const backwardsTriggerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const forwardsTriggerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const fabTriggerRef = useRef(null);\n\n const toggleScrollTools = useCallback(() => {\n if (!messageIds || !messageIds.length) {\n onFabToggle(false);\n onNotchToggle(false);\n return;\n }\n\n if (!isViewportNewest) {\n onFabToggle(true);\n onNotchToggle(true);\n return;\n }\n\n const { offsetHeight, scrollHeight, scrollTop } = containerRef.current!;\n const scrollBottom = scrollHeight - scrollTop - offsetHeight;\n const isNearBottom = scrollBottom <= FAB_THRESHOLD;\n const isAtBottom = scrollBottom <= 0;\n\n onFabToggle(isUnread ? !isAtBottom : !isNearBottom);\n onNotchToggle(!isAtBottom);\n }, [messageIds, isViewportNewest, containerRef, onFabToggle, isUnread, onNotchToggle]);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({\n rootRef: containerRef,\n margin: MESSAGE_LIST_SENSITIVE_AREA,\n }, (entries) => {\n if (!loadMoreForwards || !loadMoreBackwards) {\n return;\n }\n\n const triggerEntry = entries.find(({ isIntersecting }) => isIntersecting);\n if (!triggerEntry) {\n return;\n }\n\n const { target } = triggerEntry;\n\n if (target.className === 'backwards-trigger') {\n resetScroll(containerRef.current!);\n loadMoreBackwards();\n } else if (target.className === 'forwards-trigger') {\n resetScroll(containerRef.current!);\n loadMoreForwards();\n }\n });\n\n useOnIntersect(backwardsTriggerRef, observeIntersection);\n useOnIntersect(forwardsTriggerRef, observeIntersection);\n\n const {\n observe: observeIntersectionForFab,\n freeze: freezeForFab,\n unfreeze: unfreezeForFab,\n } = useIntersectionObserver({\n rootRef: containerRef,\n margin: FAB_THRESHOLD,\n }, toggleScrollTools);\n\n useOnIntersect(fabTriggerRef, observeIntersectionForFab);\n\n const {\n observe: observeIntersectionForNotch,\n freeze: freezeForNotch,\n unfreeze: unfreezeForNotch,\n } = useIntersectionObserver({\n rootRef: containerRef,\n }, toggleScrollTools);\n\n useOnIntersect(fabTriggerRef, observeIntersectionForNotch);\n\n // Workaround for FAB and notch flickering with tall incoming message\n useOnChange(() => {\n freezeForFab();\n freezeForNotch();\n\n setTimeout(() => {\n unfreezeForNotch();\n unfreezeForFab();\n }, TOOLS_FREEZE_TIMEOUT);\n }, [messageIds]);\n\n return { backwardsTriggerRef, forwardsTriggerRef, fabTriggerRef };\n}\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiSticker, ApiUpdateConnectionStateType } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport { selectChat } from '../../modules/selectors';\nimport { useIntersectionObserver } from '../../hooks/useIntersectionObserver';\nimport useLang from '../../hooks/useLang';\n\nimport StickerButton from '../common/StickerButton';\n\nimport './ContactGreeting.scss';\n\ntype OwnProps = {\n userId: number;\n};\n\ntype StateProps = {\n sticker?: ApiSticker;\n lastUnreadMessageId?: number;\n connectionState?: ApiUpdateConnectionStateType;\n};\n\ntype DispatchProps = Pick;\n\nconst INTERSECTION_DEBOUNCE_MS = 200;\n\nconst ContactGreeting: FC = ({\n sticker,\n connectionState,\n lastUnreadMessageId,\n loadGreetingStickers,\n sendMessage,\n markMessageListRead,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({\n rootRef: containerRef,\n debounceMs: INTERSECTION_DEBOUNCE_MS,\n });\n useEffect(() => {\n if (sticker || connectionState !== 'connectionStateReady') {\n return;\n }\n\n loadGreetingStickers();\n }, [connectionState, loadGreetingStickers, sticker]);\n\n useEffect(() => {\n if (connectionState === 'connectionStateReady' && lastUnreadMessageId) {\n markMessageListRead({ maxId: lastUnreadMessageId });\n }\n }, [connectionState, markMessageListRead, lastUnreadMessageId]);\n\n const handleStickerSelect = useCallback((selectedSticker: ApiSticker) => {\n selectedSticker = {\n ...selectedSticker,\n isPreloadedGlobally: true,\n };\n sendMessage({ sticker: selectedSticker });\n }, [sendMessage]);\n\n return (\n
\n
\n

{lang('Conversation.EmptyPlaceholder')}

\n

{lang('Conversation.GreetingText')}

\n\n
\n {sticker && (\n \n )}\n
\n
\n
\n );\n};\n\n\nexport default memo(withGlobal(\n (global, { userId }): StateProps => {\n const { stickers } = global.stickers.greeting;\n const sticker = stickers && stickers.length ? stickers[userId % stickers.length] : undefined;\n const chat = selectChat(global, userId);\n if (!chat) {\n return {};\n }\n\n return {\n sticker,\n lastUnreadMessageId: chat.lastMessage && chat.lastMessage.id !== chat.lastReadInboxMessageId\n ? chat.lastMessage.id\n : undefined,\n connectionState: global.connectionState,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadGreetingStickers', 'sendMessage', 'markMessageListRead',\n ]),\n\n)(ContactGreeting));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { MessageListType } from '../../global/types';\n\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport './NoMessages.scss';\n\ntype OwnProps = {\n chatId: number;\n isChatWithSelf?: boolean;\n type: MessageListType;\n isGroupChatJustCreated?: boolean;\n};\n\nconst NoMessages: FC = ({\n isChatWithSelf, type, isGroupChatJustCreated,\n}) => {\n const lang = useLang();\n\n if (type === 'scheduled') {\n return renderScheduled(lang);\n }\n\n if (isChatWithSelf) {\n return renderSavedMessages(lang);\n }\n\n if (isGroupChatJustCreated) {\n return renderGroup(lang);\n }\n\n return (\n
{lang('NoMessages')}
\n );\n};\n\nfunction renderScheduled(lang: LangFn) {\n return (\n
{lang('ScheduledMessages.EmptyPlaceholder')}
\n );\n}\n\nfunction renderSavedMessages(lang: LangFn) {\n return (\n
\n
\n \n

{lang('Conversation.CloudStorageInfo.Title')}

\n
    \n
  • {lang('Conversation.ClousStorageInfo.Description1')}
  • \n
  • {lang('Conversation.ClousStorageInfo.Description2')}
  • \n
  • {lang('Conversation.ClousStorageInfo.Description3')}
  • \n
  • {lang('Conversation.ClousStorageInfo.Description4')}
  • \n
\n
\n
\n );\n}\n\nfunction renderGroup(lang: LangFn) {\n return (\n
\n
\n

{lang('EmptyGroupInfo.Title')}

\n

{lang('EmptyGroupInfo.Subtitle')}

\n
    \n
  • {lang('EmptyGroupInfo.Line1')}
  • \n
  • {lang('EmptyGroupInfo.Line2')}
  • \n
  • {lang('EmptyGroupInfo.Line3')}
  • \n
  • {lang('EmptyGroupInfo.Line4')}
  • \n
\n
\n
\n );\n}\n\n\nexport default memo(NoMessages);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiAction, ApiMessage, ApiRestrictionReason, MAIN_THREAD_ID,\n} from '../../api/types';\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { LoadMoreDirection } from '../../types';\n\nimport { ANIMATION_END_DELAY, MESSAGE_LIST_SLICE } from '../../config';\nimport {\n selectChatMessages,\n selectIsViewportNewest,\n selectFirstUnreadId,\n selectFocusedMessageId,\n selectChat,\n selectIsInSelectMode,\n selectIsChatWithSelf,\n selectChatBot,\n selectIsChatBotNotStarted,\n selectScrollOffset,\n selectThreadTopMessageId,\n selectFirstMessageId,\n selectScheduledMessages,\n selectCurrentMessageIds,\n} from '../../modules/selectors';\nimport { isChatChannel, isChatGroup, isChatPrivate } from '../../modules/helpers';\nimport { orderBy, pick } from '../../util/iteratees';\nimport { fastRaf, debounce, onTickEnd } from '../../util/schedulers';\nimport useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport buildClassName from '../../util/buildClassName';\nimport { groupMessages, MessageDateGroup } from './helpers/groupMessages';\nimport { preventMessageInputBlur } from './helpers/preventMessageInputBlur';\nimport useOnChange from '../../hooks/useOnChange';\nimport useStickyDates from './hooks/useStickyDates';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport resetScroll from '../../util/resetScroll';\nimport fastSmoothScroll, { isAnimatingScroll } from '../../util/fastSmoothScroll';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport useWindowSize from '../../hooks/useWindowSize';\n\nimport Loading from '../ui/Loading';\nimport MessageListContent from './MessageListContent';\nimport ContactGreeting from './ContactGreeting';\nimport NoMessages from './NoMessages';\n\nimport './MessageList.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n type: MessageListType;\n canPost: boolean;\n isReady: boolean;\n onFabToggle: (shouldShow: boolean) => void;\n onNotchToggle: (shouldShow: boolean) => void;\n hasTools?: boolean;\n};\n\ntype StateProps = {\n isChatLoaded?: boolean;\n isChannelChat?: boolean;\n isGroupChat?: boolean;\n isChatWithSelf?: boolean;\n isCreator?: boolean;\n isBot?: boolean;\n messageIds?: number[];\n messagesById?: Record;\n firstUnreadId?: number;\n isViewportNewest?: boolean;\n isRestricted?: boolean;\n restrictionReason?: ApiRestrictionReason;\n focusingId?: number;\n hasFocusHighlight?: boolean;\n isSelectModeActive?: boolean;\n animationLevel?: number;\n lastMessage?: ApiMessage;\n botDescription?: string;\n threadTopMessageId?: number;\n threadFirstMessageId?: number;\n hasLinkedChat?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst BOTTOM_THRESHOLD = 100;\nconst UNREAD_DIVIDER_TOP = 10;\nconst UNREAD_DIVIDER_TOP_WITH_TOOLS = 60;\nconst SCROLL_DEBOUNCE = 200;\nconst FOCUSING_DURATION = 1000;\nconst BOTTOM_FOCUS_MARGIN = 20;\nconst SELECT_MODE_ANIMATION_DURATION = 200;\nconst UNREAD_DIVIDER_CLASS = 'unread-divider';\n\nconst runDebouncedForScroll = debounce((cb) => cb(), SCROLL_DEBOUNCE, false);\n\nconst MessageList: FC = ({\n chatId,\n threadId,\n type,\n hasTools,\n onFabToggle,\n onNotchToggle,\n isChatLoaded,\n isChannelChat,\n isGroupChat,\n canPost,\n isReady,\n isChatWithSelf,\n isCreator,\n isBot,\n messageIds,\n messagesById,\n firstUnreadId,\n isViewportNewest,\n threadFirstMessageId,\n isRestricted,\n restrictionReason,\n focusingId,\n hasFocusHighlight,\n isSelectModeActive,\n loadViewportMessages,\n setScrollOffset,\n lastMessage,\n botDescription,\n threadTopMessageId,\n hasLinkedChat,\n openHistoryCalendar,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n // We update local cached `scrollOffsetRef` when opening chat.\n // Then we update global version every second on scrolling.\n const scrollOffsetRef = useRef((type === 'thread' && selectScrollOffset(getGlobal(), chatId, threadId)) || 0);\n const anchorIdRef = useRef();\n const anchorTopRef = useRef();\n const listItemElementsRef = useRef();\n const memoUnreadDividerBeforeIdRef = useRef();\n // Updated every time (to be used from intersection callback closure)\n const memoFirstUnreadIdRef = useRef();\n const memoFocusingIdRef = useRef();\n const isScrollTopJustUpdatedRef = useRef(false);\n const shouldAnimateAppearanceRef = useRef(Boolean(lastMessage));\n\n const [containerHeight, setContainerHeight] = useState();\n\n const areMessagesLoaded = Boolean(messageIds);\n\n useOnChange(() => {\n // We only need it first time when message list appears\n if (areMessagesLoaded) {\n onTickEnd(() => {\n shouldAnimateAppearanceRef.current = false;\n });\n }\n }, [areMessagesLoaded]);\n\n useOnChange(() => {\n memoFirstUnreadIdRef.current = firstUnreadId;\n\n // Updated only once (to preserve divider even after messages are read)\n if (!memoUnreadDividerBeforeIdRef.current) {\n memoUnreadDividerBeforeIdRef.current = firstUnreadId;\n }\n }, [firstUnreadId]);\n\n useOnChange(() => {\n memoFocusingIdRef.current = focusingId;\n }, [focusingId]);\n\n const messageGroups = useMemo(() => {\n if (!messageIds || !messagesById) {\n return undefined;\n }\n\n const viewportIds = threadTopMessageId && (!messageIds[0] || threadFirstMessageId === messageIds[0])\n ? [threadTopMessageId, ...messageIds]\n : messageIds;\n\n if (!viewportIds.length) {\n return undefined;\n }\n\n const listedMessages = viewportIds.map((id) => messagesById[id]).filter(Boolean);\n return groupMessages(orderBy(listedMessages, ['date', 'id']), memoUnreadDividerBeforeIdRef.current);\n }, [messageIds, messagesById, threadFirstMessageId, threadTopMessageId]);\n\n const loadMoreAround = useMemo(() => {\n if (type !== 'thread') {\n return undefined;\n }\n\n return debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Around }), 1000, true, false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loadViewportMessages, messageIds]);\n\n const { isScrolled, updateStickyDates } = useStickyDates();\n\n const handleScroll = useCallback(() => {\n if (isScrollTopJustUpdatedRef.current) {\n isScrollTopJustUpdatedRef.current = false;\n return;\n }\n\n const container = containerRef.current!;\n\n if (!memoFocusingIdRef.current) {\n updateStickyDates(container, hasTools);\n }\n\n runDebouncedForScroll(() => {\n fastRaf(() => {\n if (!container.parentElement) {\n return;\n }\n\n scrollOffsetRef.current = container.scrollHeight - container.scrollTop;\n\n if (type === 'thread') {\n setScrollOffset({ chatId, threadId, scrollOffset: scrollOffsetRef.current });\n }\n });\n });\n }, [updateStickyDates, hasTools, type, setScrollOffset, chatId, threadId]);\n\n // Container resize observer (caused by Composer reply/webpage panels)\n useEffect(() => {\n if (!('ResizeObserver' in window) || process.env.APP_ENV === 'perf') {\n return undefined;\n }\n\n const observer = new ResizeObserver(([entry]) => {\n // During animation\n if (!(entry.target as HTMLDivElement).offsetParent) {\n return;\n }\n\n setContainerHeight(entry.contentRect.height);\n });\n\n observer.observe(containerRef.current!);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n // Memorize height for scroll animation\n const { height: windowHeight } = useWindowSize();\n\n useEffect(() => {\n if (isReady) {\n containerRef.current!.dataset.normalHeight = String(containerRef.current!.offsetHeight);\n }\n }, [windowHeight, isReady]);\n\n // Initial message loading\n useEffect(() => {\n if (!loadMoreAround || !isChatLoaded || isRestricted || focusingId) {\n return;\n }\n\n const container = containerRef.current!;\n\n if (!messageIds || (\n messageIds.length < MESSAGE_LIST_SLICE / 2\n && (container.firstElementChild as HTMLDivElement).clientHeight <= container.offsetHeight\n )) {\n loadMoreAround();\n }\n }, [isChatLoaded, messageIds, loadMoreAround, focusingId, isRestricted]);\n\n // Remember scroll position before repositioning it\n useOnChange(() => {\n if (!messageIds || !listItemElementsRef.current || !isReady) {\n return;\n }\n\n const preservedItemElements = listItemElementsRef.current\n .filter((element) => messageIds.includes(Number(element.dataset.messageId)));\n\n // We avoid the very first item as it may be a partly-loaded album\n // and also because it may be removed when messages limit is reached\n const anchor = preservedItemElements[1] || preservedItemElements[0];\n if (!anchor) {\n return;\n }\n\n anchorIdRef.current = anchor.id;\n anchorTopRef.current = anchor.getBoundingClientRect().top;\n // This should match deps for `useLayoutEffectWithPrevDeps` below\n }, [messageIds, isViewportNewest, containerHeight, hasTools, isReady]);\n\n // Handles updated message list, takes care of scroll repositioning\n useLayoutEffectWithPrevDeps(([\n prevMessageIds, prevIsViewportNewest, prevContainerHeight,\n ]: [\n typeof messageIds, typeof isViewportNewest, typeof containerHeight\n ]) => {\n const container = containerRef.current!;\n listItemElementsRef.current = Array.from(container.querySelectorAll('.message-list-item'));\n\n // During animation\n if (!container.offsetParent) {\n return;\n }\n\n // Add extra height when few messages to allow smooth scroll animation. Uses assumption that `parentElement`\n // is a Transition slide and its CSS class can not be reset in a declarative way.\n const shouldForceScroll = (\n isViewportNewest\n && (messageIds && messageIds.length < MESSAGE_LIST_SLICE / 2)\n && !container.parentElement!.classList.contains('force-messages-scroll')\n && (container.firstElementChild as HTMLDivElement)!.clientHeight <= container.offsetHeight * 2\n );\n\n if (shouldForceScroll) {\n container.parentElement!.classList.add('force-messages-scroll');\n\n setTimeout(() => {\n if (container.parentElement) {\n container.parentElement.classList.remove('force-messages-scroll');\n }\n }, FOCUSING_DURATION);\n }\n\n const { scrollTop, scrollHeight, offsetHeight } = container;\n const scrollOffset = scrollOffsetRef.current!;\n const lastItemElement = listItemElementsRef.current[listItemElementsRef.current.length - 1];\n\n // If two messages come at once (e.g. via Quiz Bot) then the first message will update `scrollOffset`\n // right away (before animation) which creates inconsistency until the animation completes.\n // To workaround that, we calculate `isAtBottom` with a \"buffer\" of the latest message height (this is approximate).\n const lastItemHeight = lastItemElement ? lastItemElement.offsetHeight : 0;\n const isAtBottom = isViewportNewest && prevIsViewportNewest && (\n scrollOffset - (prevContainerHeight || offsetHeight) - lastItemHeight <= BOTTOM_THRESHOLD\n );\n\n let newScrollTop!: number;\n\n const hasFirstMessageChanged = messageIds && prevMessageIds && messageIds[0] !== prevMessageIds[0];\n const hasLastMessageChanged = (\n messageIds && prevMessageIds && messageIds[messageIds.length - 1] !== prevMessageIds[prevMessageIds.length - 1]\n );\n const isAlreadyFocusing = messageIds && memoFocusingIdRef.current === messageIds[messageIds.length - 1];\n\n if (isAtBottom && hasLastMessageChanged && !hasFirstMessageChanged && !isAlreadyFocusing) {\n if (lastItemElement) {\n fastRaf(() => {\n fastSmoothScroll(\n container,\n lastItemElement,\n 'end',\n BOTTOM_FOCUS_MARGIN,\n undefined,\n undefined,\n undefined,\n true,\n );\n });\n }\n\n newScrollTop = scrollHeight - offsetHeight;\n scrollOffsetRef.current = Math.max(scrollHeight - newScrollTop, offsetHeight);\n\n // Scroll still needs to be restored after container resize\n if (!shouldForceScroll) {\n return;\n }\n }\n\n if (process.env.APP_ENV === 'perf') {\n // eslint-disable-next-line no-console\n console.time('scrollTop');\n }\n\n const isResized = prevContainerHeight !== undefined && prevContainerHeight !== containerHeight;\n const anchor = anchorIdRef.current && container.querySelector(`#${anchorIdRef.current}`);\n const unreadDivider = (\n !anchor\n && memoUnreadDividerBeforeIdRef.current\n && container.querySelector(`.${UNREAD_DIVIDER_CLASS}`)\n );\n\n if (isAtBottom && isResized) {\n if (isAnimatingScroll()) {\n return;\n }\n\n newScrollTop = scrollHeight - offsetHeight;\n } else if (anchor) {\n const newAnchorTop = anchor.getBoundingClientRect().top;\n newScrollTop = scrollTop + (newAnchorTop - (anchorTopRef.current || 0));\n } else if (unreadDivider) {\n newScrollTop = Math.min(\n unreadDivider.offsetTop - (hasTools ? UNREAD_DIVIDER_TOP_WITH_TOOLS : UNREAD_DIVIDER_TOP),\n scrollHeight - scrollOffset,\n );\n } else {\n newScrollTop = scrollHeight - scrollOffset;\n }\n\n resetScroll(container, newScrollTop);\n\n if (!memoFocusingIdRef.current) {\n isScrollTopJustUpdatedRef.current = true;\n fastRaf(() => {\n isScrollTopJustUpdatedRef.current = false;\n });\n }\n\n scrollOffsetRef.current = Math.max(scrollHeight - newScrollTop, offsetHeight);\n\n if (process.env.APP_ENV === 'perf') {\n // eslint-disable-next-line no-console\n console.timeEnd('scrollTop');\n }\n // This should match deps for `useOnChange` above\n }, [messageIds, isViewportNewest, containerHeight, hasTools]);\n\n useEffectWithPrevDeps(([prevIsSelectModeActive]) => {\n if (prevIsSelectModeActive !== undefined) {\n dispatchHeavyAnimationEvent(SELECT_MODE_ANIMATION_DURATION + ANIMATION_END_DELAY);\n }\n }, [isSelectModeActive]);\n\n const lang = useLang();\n\n const isPrivate = Boolean(chatId && isChatPrivate(chatId));\n const withUsers = Boolean((!isPrivate && !isChannelChat) || isChatWithSelf);\n const noAvatars = Boolean(!withUsers || isChannelChat);\n const shouldRenderGreeting = isChatPrivate(chatId) && !isChatWithSelf && !isBot\n && ((\n !messageGroups && !lastMessage && messageIds\n // Used to avoid flickering when deleting a greeting that has just been sent\n && (!listItemElementsRef.current || listItemElementsRef.current.length === 0))\n || checkSingleMessageActionByType('contactSignUp', messageGroups)\n || (lastMessage && lastMessage.content.action && lastMessage.content.action.type === 'contactSignUp')\n );\n const isGroupChatJustCreated = isGroupChat && isCreator\n && checkSingleMessageActionByType('chatCreate', messageGroups);\n\n const className = buildClassName(\n 'MessageList custom-scroll',\n noAvatars && 'no-avatars',\n !canPost && 'no-composer',\n type === 'pinned' && 'type-pinned',\n hasFocusHighlight && 'has-focus-highlight',\n isSelectModeActive && 'select-mode-active',\n isScrolled && 'scrolled',\n !isReady && 'is-animating',\n );\n\n return (\n \n {isRestricted ? (\n
\n \n {restrictionReason ? restrictionReason.text : `This is a private ${isChannelChat ? 'channel' : 'chat'}`}\n \n
\n ) : botDescription ? (\n
{renderText(lang(botDescription), ['br', 'emoji', 'links'])}
\n ) : shouldRenderGreeting ? (\n \n ) : messageIds && (!messageGroups || isGroupChatJustCreated) ? (\n \n ) : ((messageIds && messageGroups) || lastMessage) ? (\n \n ) : (\n \n )}\n
\n );\n};\n\nfunction checkSingleMessageActionByType(type: ApiAction['type'], messageGroups?: MessageDateGroup[]) {\n return messageGroups\n && messageGroups.length === 1\n && messageGroups[0].senderGroups.length === 1\n && messageGroups[0].senderGroups[0].length === 1\n && 'content' in messageGroups[0].senderGroups[0][0]\n && messageGroups[0].senderGroups[0][0].content.action\n && messageGroups[0].senderGroups[0][0].content.action.type === type;\n}\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, type }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return {};\n }\n\n const messageIds = selectCurrentMessageIds(global, chatId, threadId, type);\n const messagesById = type === 'scheduled'\n ? selectScheduledMessages(global, chatId)\n : selectChatMessages(global, chatId);\n const threadTopMessageId = selectThreadTopMessageId(global, chatId, threadId);\n\n if (\n threadId !== MAIN_THREAD_ID\n && !(messagesById && threadTopMessageId && messagesById[threadTopMessageId])\n ) {\n return {};\n }\n\n const { isRestricted, restrictionReason, lastMessage } = chat;\n const focusingId = selectFocusedMessageId(global, chatId);\n const hasFocusHighlight = focusingId ? !global.focusedMessage!.noHighlight : undefined;\n\n const withLastMessageWhenPreloading = (\n threadId === MAIN_THREAD_ID\n && !messageIds && !chat.unreadCount && !focusingId && lastMessage && !lastMessage.groupedId\n );\n\n const bot = selectChatBot(global, chatId);\n let botDescription: string | undefined;\n if (selectIsChatBotNotStarted(global, chatId)) {\n const chatBot = selectChatBot(global, chatId)!;\n if (chatBot.fullInfo) {\n botDescription = chatBot.fullInfo.botDescription || 'NoMessages';\n } else {\n botDescription = 'Updating bot info...';\n }\n }\n\n return {\n isChatLoaded: true,\n isRestricted,\n restrictionReason,\n isChannelChat: isChatChannel(chat),\n isGroupChat: isChatGroup(chat),\n isCreator: chat.isCreator,\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n isBot: Boolean(bot),\n messageIds,\n messagesById,\n firstUnreadId: selectFirstUnreadId(global, chatId, threadId),\n isViewportNewest: type !== 'thread' || selectIsViewportNewest(global, chatId, threadId),\n threadFirstMessageId: selectFirstMessageId(global, chatId, threadId),\n focusingId,\n hasFocusHighlight,\n isSelectModeActive: selectIsInSelectMode(global),\n botDescription,\n threadTopMessageId,\n hasLinkedChat: chat.fullInfo && ('linkedChatId' in chat.fullInfo)\n ? Boolean(chat.fullInfo.linkedChatId)\n : undefined,\n ...(withLastMessageWhenPreloading && { lastMessage }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadViewportMessages',\n 'setScrollOffset',\n 'openHistoryCalendar',\n ]),\n)(MessageList));\n","import React, {\n FC, useCallback, memo, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { MAIN_THREAD_ID } from '../../api/types';\n\nimport { selectChat, selectCurrentMessageList } from '../../modules/selectors';\nimport { formatIntegerCompact } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport { pick } from '../../util/iteratees';\nimport fastSmoothScroll from '../../util/fastSmoothScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './ScrollDownButton.scss';\n\ntype OwnProps = {\n isShown: boolean;\n canPost?: boolean;\n};\n\ntype StateProps = {\n messageListType?: MessageListType;\n unreadCount?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FOCUS_MARGIN = 20;\n\nconst ScrollDownButton: FC = ({\n isShown,\n canPost,\n messageListType,\n unreadCount,\n focusNextReply,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const elementRef = useRef(null);\n\n const handleClick = useCallback(() => {\n if (!isShown) {\n return;\n }\n\n if (messageListType === 'thread') {\n focusNextReply();\n } else {\n const messagesContainer = elementRef.current!.parentElement!.querySelector('.MessageList')!;\n const messageElements = messagesContainer.querySelectorAll('.message-list-item');\n const lastMessageElement = messageElements[messageElements.length - 1];\n if (!lastMessageElement) {\n return;\n }\n\n fastSmoothScroll(messagesContainer, lastMessageElement, 'end', FOCUS_MARGIN);\n }\n }, [isShown, messageListType, focusNextReply]);\n\n const fabClassName = buildClassName(\n 'ScrollDownButton',\n isShown && 'revealed',\n !canPost && 'no-composer',\n );\n\n return (\n
\n
\n \n \n \n {Boolean(unreadCount) && (\n
{formatIntegerCompact(unreadCount!)}
\n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return {};\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n\n return {\n messageListType,\n unreadCount: chat && threadId === MAIN_THREAD_ID && messageListType === 'thread' ? chat.unreadCount : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['focusNextReply']),\n)(ScrollDownButton));\n","import { ApiAttachment } from '../../../../api/types';\nimport { preloadImage, preloadVideo, createPosterForVideo } from '../../../../util/files';\n\nconst MAX_QUICK_VIDEO_SIZE = 10 * 1024 ** 2; // 10 MB\nconst MAX_QUICK_IMG_SIZE = 1280; // px\n\nexport default async function buildAttachment(\n filename: string, blob: Blob, isQuick: boolean, options?: Partial,\n): Promise {\n const blobUrl = URL.createObjectURL(blob);\n const { type: mimeType, size } = blob;\n let quick;\n let previewBlobUrl;\n\n if (mimeType.startsWith('image/')) {\n if (isQuick) {\n const img = await preloadImage(blobUrl);\n const { width, height } = img;\n\n if (width > MAX_QUICK_IMG_SIZE || height > MAX_QUICK_IMG_SIZE || mimeType !== 'image/jpeg') {\n const newBlob = await squeezeImage(img);\n if (newBlob) {\n URL.revokeObjectURL(blobUrl);\n return buildAttachment(filename, newBlob, true, options);\n } else {\n return buildAttachment(filename, blob, false, options);\n }\n }\n\n quick = { width, height };\n } else {\n previewBlobUrl = blobUrl;\n }\n } else if (mimeType.startsWith('video/')) {\n // Videos < 10 MB are always sent in quick mode (in other clients).\n // Quick mode for videos > 10 MB is not supported until client-side video squeezing is implemented.\n if (size < MAX_QUICK_VIDEO_SIZE) {\n const { videoWidth: width, videoHeight: height, duration } = await preloadVideo(blobUrl);\n quick = { width, height, duration };\n }\n\n previewBlobUrl = await createPosterForVideo(blobUrl);\n }\n\n return {\n blobUrl,\n filename,\n mimeType,\n size,\n quick,\n previewBlobUrl,\n ...options,\n };\n}\n\nfunction squeezeImage(img: HTMLImageElement): Promise {\n return new Promise((resolve) => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n\n let { width, height } = img;\n\n if (width > MAX_QUICK_IMG_SIZE || height > MAX_QUICK_IMG_SIZE) {\n if (width >= height) {\n height *= MAX_QUICK_IMG_SIZE / width;\n width = MAX_QUICK_IMG_SIZE;\n } else {\n width *= MAX_QUICK_IMG_SIZE / height;\n height = MAX_QUICK_IMG_SIZE;\n }\n }\n\n canvas.width = width;\n canvas.height = height;\n\n ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, width, height);\n canvas.toBlob(resolve, 'image/jpeg', 100);\n });\n}\n","import { IS_IOS } from '../../../../util/environment';\n\nlet resetInput: HTMLInputElement;\n\nif (IS_IOS) {\n resetInput = document.createElement('input');\n resetInput.classList.add('for-ios-autocapitalization-fix');\n document.body.appendChild(resetInput);\n}\n\n// https://stackoverflow.com/a/55652503\nexport default function applyIosAutoCapitalizationFix(inputEl: HTMLElement) {\n resetInput.focus();\n inputEl.focus();\n}\n","export default __webpack_public_path__ + \"c0155344d336103c2b6a0b28cc510750.js\";","// @ts-ignore\nimport encoderPath from 'file-loader!opus-recorder/dist/encoderWorker.min';\n\nexport type Result = { blob: Blob; duration: number; waveform: number[] };\n\ninterface OpusRecorder extends Omit {\n new(options: AnyLiteral): OpusRecorder;\n\n start(stream?: MediaStreamAudioSourceNode): void;\n\n sourceNode: MediaStreamAudioSourceNode;\n\n ondataavailable: (typedArray: Uint8Array) => void;\n}\n\nconst MIN_RECORDING_TIME = 1000;\nconst POLYFILL_OPTIONS = { encoderPath, reuseWorker: true };\nconst BLOB_PARAMS = { type: 'audio/ogg' };\nconst FFT_SIZE = 64;\nconst MIN_VOLUME = 0.1;\n\nlet opusRecorderPromise: Promise<{ default: OpusRecorder }>;\nlet OpusRecorder: OpusRecorder;\nlet mediaRecorder: OpusRecorder;\n\nexport async function init() {\n if (!opusRecorderPromise) {\n // @ts-ignore\n opusRecorderPromise = import('opus-recorder');\n OpusRecorder = (await opusRecorderPromise).default;\n mediaRecorder = new OpusRecorder(POLYFILL_OPTIONS);\n }\n\n return opusRecorderPromise;\n}\n\nexport async function start(analyzerCallback: Function) {\n await startMediaRecorder();\n\n const startedAt = Date.now();\n let pausedAt: number;\n const chunks: Uint8Array[] = [];\n const waveform: number[] = [];\n\n mediaRecorder.ondataavailable = (typedArray) => {\n chunks.push(typedArray);\n };\n\n const releaseAnalyzer = subscribeToAnalyzer(mediaRecorder, (volume: number) => {\n waveform.push(volume * 255);\n analyzerCallback(volume);\n });\n\n return {\n stop: () => new Promise((resolve, reject) => {\n mediaRecorder.onstop = () => {\n resolve({\n blob: new Blob(chunks, BLOB_PARAMS),\n duration: Math.round(((pausedAt || Date.now()) - startedAt) / 1000),\n waveform,\n });\n };\n mediaRecorder.onerror = reject;\n\n const delayStop = Math.max(0, startedAt + MIN_RECORDING_TIME - Date.now());\n setTimeout(() => {\n mediaRecorder.stop();\n releaseAnalyzer();\n }, delayStop);\n }),\n pause: () => {\n const delayStop = Math.max(0, startedAt + MIN_RECORDING_TIME - Date.now());\n setTimeout(() => {\n mediaRecorder.pause();\n pausedAt = Date.now();\n releaseAnalyzer();\n }, delayStop);\n },\n };\n}\n\nasync function startMediaRecorder() {\n await init();\n await mediaRecorder.start();\n}\n\nfunction subscribeToAnalyzer(recorder: OpusRecorder, cb: Function) {\n const source = recorder.sourceNode;\n const analyser = source.context.createAnalyser();\n analyser.fftSize = FFT_SIZE;\n source.connect(analyser);\n\n const dataLength = analyser.frequencyBinCount;\n const dataArray = new Uint8Array(dataLength);\n let isDestroyed = false;\n\n function tick() {\n if (isDestroyed) {\n return;\n }\n\n analyser.getByteFrequencyData(dataArray);\n\n const sum = dataArray.reduce((acc, current) => acc + current, 0);\n const mean = (sum / dataLength);\n const volume = mean / 255;\n\n cb(volume < MIN_VOLUME ? 0 : volume);\n\n requestAnimationFrame(tick);\n }\n\n tick();\n\n return () => {\n isDestroyed = true;\n };\n}\n","import { StateHookSetter, useEffect } from '../../../../lib/teact/teact';\nimport { ApiAttachment, ApiMessage } from '../../../../api/types';\n\nimport buildAttachment from '../helpers/buildAttachment';\nimport { EDITABLE_INPUT_ID, EDITABLE_INPUT_MODAL_ID } from '../../../../config';\n\nconst CLIPBOARD_ACCEPTED_TYPES = ['image/png', 'image/jpeg', 'image/gif'];\nconst MAX_MESSAGE_LENGTH = 4096;\n\nexport default (\n insertTextAndUpdateCursor: (text: string, inputId?: string) => void,\n setAttachments: StateHookSetter,\n editedMessage: ApiMessage | undefined,\n) => {\n useEffect(() => {\n async function handlePaste(e: ClipboardEvent) {\n if (!e.clipboardData) {\n return;\n }\n\n const input = document.activeElement;\n if (input && ![EDITABLE_INPUT_ID, EDITABLE_INPUT_MODAL_ID].includes(input.id)) {\n return;\n }\n\n const { items } = e.clipboardData;\n const media = Array.from(items).find((item) => CLIPBOARD_ACCEPTED_TYPES.includes(item.type));\n const file = media && media.getAsFile();\n const pastedText = e.clipboardData.getData('text').substring(0, MAX_MESSAGE_LENGTH);\n\n if (!file && !pastedText) {\n return;\n }\n\n e.preventDefault();\n\n if (file && !editedMessage) {\n const attachment = await buildAttachment(file.name, file, true);\n setAttachments((attachments) => [\n ...attachments,\n attachment,\n ]);\n }\n\n if (pastedText) {\n insertTextAndUpdateCursor(pastedText, input ? input.id : undefined);\n }\n }\n\n document.addEventListener('paste', handlePaste, false);\n\n return () => {\n document.removeEventListener('paste', handlePaste, false);\n };\n }, [insertTextAndUpdateCursor, editedMessage, setAttachments]);\n};\n","import { ApiFormattedText } from '../../../../api/types';\nimport { renderTextWithEntities } from '../../../common/helpers/renderMessageText';\n\nexport default function getMessageTextAsHtml(formattedText?: ApiFormattedText) {\n const { text, entities } = formattedText || {};\n if (!text) {\n return '';\n }\n\n const result = renderTextWithEntities(\n text,\n entities,\n undefined,\n undefined,\n true,\n );\n\n if (Array.isArray(result)) {\n return result.join('');\n }\n\n return result;\n}\n","import { useCallback, useEffect, useMemo } from '../../../../lib/teact/teact';\n\nimport { ApiFormattedText, ApiMessage } from '../../../../api/types';\nimport { GlobalActions } from '../../../../global/types';\n\nimport { DRAFT_DEBOUNCE, EDITABLE_INPUT_ID } from '../../../../config';\nimport usePrevious from '../../../../hooks/usePrevious';\nimport { debounce } from '../../../../util/schedulers';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport parseMessageInput from '../helpers/parseMessageInput';\nimport getMessageTextAsHtml from '../helpers/getMessageTextAsHtml';\nimport useBackgroundMode from '../../../../hooks/useBackgroundMode';\nimport useBeforeUnload from '../../../../hooks/useBeforeUnload';\nimport { IS_TOUCH_ENV } from '../../../../util/environment';\n\n// Used to avoid running debounced callbacks when chat changes.\nlet currentChatId: number | undefined;\nlet currentThreadId: number | undefined;\n\nexport default (\n draft: ApiFormattedText | undefined,\n chatId: number,\n threadId: number,\n html: string,\n htmlRef: { current: string },\n setHtml: (html: string) => void,\n editedMessage: ApiMessage | undefined,\n saveDraft: GlobalActions['saveDraft'],\n clearDraft: GlobalActions['clearDraft'],\n) => {\n const updateDraft = useCallback((draftChatId: number, draftThreadId: number) => {\n if (htmlRef.current.length && !editedMessage) {\n saveDraft({ chatId: draftChatId, threadId: draftThreadId, draft: parseMessageInput(htmlRef.current!) });\n } else {\n clearDraft({ chatId: draftChatId, threadId: draftThreadId });\n }\n }, [clearDraft, editedMessage, htmlRef, saveDraft]);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const runDebouncedForSaveDraft = useMemo(() => debounce((cb) => cb(), DRAFT_DEBOUNCE, false), [chatId]);\n\n const prevChatId = usePrevious(chatId);\n const prevThreadId = usePrevious(threadId);\n\n // Save draft on chat change\n useEffect(() => {\n currentChatId = chatId;\n currentThreadId = threadId;\n\n return () => {\n currentChatId = undefined;\n currentThreadId = undefined;\n\n updateDraft(chatId, threadId);\n };\n }, [chatId, threadId, updateDraft]);\n\n // Restore draft on chat change\n useEffect(() => {\n if (chatId === prevChatId && threadId === prevThreadId) {\n return;\n }\n\n if (!draft) {\n return;\n }\n\n setHtml(getMessageTextAsHtml(draft));\n\n if (!IS_TOUCH_ENV) {\n requestAnimationFrame(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n focusEditableElement(messageInput, true);\n });\n }\n }, [chatId, threadId, draft, setHtml, updateDraft, prevChatId, prevThreadId]);\n\n // Update draft when input changes\n const prevHtml = usePrevious(html);\n useEffect(() => {\n if (!chatId || !threadId || prevChatId !== chatId || prevThreadId !== threadId || prevHtml === html) {\n return;\n }\n\n if (html.length) {\n runDebouncedForSaveDraft(() => {\n if (currentChatId !== chatId || currentThreadId !== threadId) {\n return;\n }\n\n updateDraft(chatId, threadId);\n });\n } else {\n updateDraft(chatId, threadId);\n }\n }, [chatId, html, prevChatId, prevHtml, prevThreadId, runDebouncedForSaveDraft, threadId, updateDraft]);\n\n const handleBlur = useCallback(() => {\n if (chatId && threadId) {\n updateDraft(chatId, threadId);\n }\n }, [chatId, threadId, updateDraft]);\n\n useBackgroundMode(handleBlur);\n useBeforeUnload(handleBlur);\n};\n","import { useCallback, useEffect } from '../../../../lib/teact/teact';\nimport { getDispatch } from '../../../../lib/teact/teactn';\nimport { InlineBotSettings } from '../../../../types';\nimport useFlag from '../../../../hooks/useFlag';\nimport usePrevious from '../../../../hooks/usePrevious';\n\nconst tempEl = document.createElement('div');\nconst INLINE_BOT_QUERY_REGEXP = /^@([a-z0-9_]{1,32})[\\u00A0\\u0020]+(.*)/i;\nconst HAS_NEW_LINE = /^@([a-z0-9_]{1,32})[\\u00A0\\u0020]+\\n{2,}/i;\n\nexport default function useInlineBotTooltip(\n isAllowed: boolean,\n chatId: number,\n html: string,\n inlineBots?: Record,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const text = getPlainText(html);\n const { queryInlineBot, resetInlineBot } = getDispatch();\n const { username, query, canShowHelp } = parseStartWithUsernameString(text);\n const usernameLowered = username.toLowerCase();\n const prevQuery = usePrevious(query);\n const prevUsername = usePrevious(username);\n const inlineBotData = inlineBots && inlineBots[usernameLowered];\n const {\n id: botId,\n switchPm,\n offset,\n results,\n isGallery,\n help,\n } = inlineBotData || {};\n\n useEffect(() => {\n if (prevQuery !== query) {\n unmarkIsOpen();\n }\n }, [prevQuery, query, unmarkIsOpen]);\n\n useEffect(() => {\n if (isAllowed && usernameLowered && chatId) {\n queryInlineBot({ chatId, username: usernameLowered, query });\n }\n }, [query, isAllowed, queryInlineBot, chatId, usernameLowered]);\n\n const loadMore = useCallback(() => {\n queryInlineBot({\n chatId, username: usernameLowered, query, offset,\n });\n }, [offset, chatId, query, queryInlineBot, usernameLowered]);\n\n useEffect(() => {\n if (isAllowed && botId && (switchPm || (results && results.length))) {\n markIsOpen();\n } else {\n unmarkIsOpen();\n }\n }, [botId, isAllowed, markIsOpen, results, switchPm, unmarkIsOpen]);\n\n if (prevUsername !== username) {\n resetInlineBot({ username: prevUsername });\n }\n\n return {\n isOpen,\n closeTooltip: unmarkIsOpen,\n loadMore,\n username,\n id: botId,\n isGallery,\n switchPm,\n results,\n help: canShowHelp && help ? `@${username} ${help}` : undefined,\n };\n}\n\nfunction getPlainText(html: string) {\n tempEl.innerHTML = html.replace(/
/g, '\\n');\n\n return tempEl.innerText;\n}\n\nfunction parseStartWithUsernameString(text: string) {\n const result = text.match(INLINE_BOT_QUERY_REGEXP);\n if (!result) {\n return { username: '', query: '', canShowHelp: false };\n }\n\n return {\n username: result[1],\n query: result[2],\n canShowHelp: result[2] === '' && !text.match(HAS_NEW_LINE),\n };\n}\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './DeleteMessageModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst DeleteMessageModalAsync: FC = (props) => {\n const { isOpen } = props;\n const DeleteMessageModal = useModuleLoader(Bundles.Extra, 'DeleteMessageModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return DeleteMessageModal ? : undefined;\n};\n\nexport default memo(DeleteMessageModalAsync);\n","import React, {\n FC, useRef, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\n\nimport Button, { OwnProps as ButtonProps } from './Button';\n\ntype OwnProps = {\n onActivate: NoneToVoidFunction;\n} & Omit;\n\nconst BUTTON_ACTIVATE_DELAY = 200;\nlet openTimeout: number | undefined;\nlet isFirstTimeActivation = true;\n\nconst ResponsiveHoverButton: FC = ({ onActivate, ...buttonProps }) => {\n const isMouseInside = useRef(false);\n\n const handleMouseEnter = useCallback(() => {\n isMouseInside.current = true;\n\n // This is used to counter additional delay caused by asynchronous module loading\n if (isFirstTimeActivation) {\n isFirstTimeActivation = false;\n onActivate();\n return;\n }\n\n if (openTimeout) {\n clearTimeout(openTimeout);\n openTimeout = undefined;\n }\n openTimeout = window.setTimeout(() => {\n if (isMouseInside.current) {\n onActivate();\n }\n }, BUTTON_ACTIVATE_DELAY);\n }, [onActivate]);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n }, []);\n\n return (\n \n );\n};\n\nexport default memo(ResponsiveHoverButton);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './AttachMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst AttachMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const AttachMenu = useModuleLoader(Bundles.Extra, 'AttachMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return AttachMenu ? : undefined;\n};\n\nexport default memo(AttachMenuAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './SymbolMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst SymbolMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const SymbolMenu = useModuleLoader(Bundles.Extra, 'SymbolMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return SymbolMenu ? : undefined;\n};\n\nexport default memo(SymbolMenuAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './InlineBotTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst InlineBotTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const InlineBotTooltip = useModuleLoader(Bundles.Extra, 'InlineBotTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return InlineBotTooltip ? : undefined;\n};\n\nexport default memo(InlineBotTooltipAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './MentionTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst MentionTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const MentionTooltip = useModuleLoader(Bundles.Extra, 'MentionTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MentionTooltip ? : undefined;\n};\n\nexport default memo(MentionTooltipAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './CustomSendMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst CustomSendMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const CustomSend = useModuleLoader(Bundles.Extra, 'CustomSendMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return CustomSend ? : undefined;\n};\n\nexport default memo(CustomSendMenuAsync);\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './StickerTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst StickerTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const StickerTooltip = useModuleLoader(Bundles.Extra, 'StickerTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerTooltip ? : undefined;\n};\n\nexport default StickerTooltipAsync;\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './BotKeyboardMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst BotKeyboardMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const BotKeyboardMenu = useModuleLoader(Bundles.Extra, 'BotKeyboardMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return BotKeyboardMenu ? : undefined;\n};\n\nexport default memo(BotKeyboardMenuAsync);\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiMessage, ApiUser } from '../../../api/types';\n\nimport {\n selectChat,\n selectChatMessage,\n selectSender,\n selectForwardedSender,\n selectUser,\n selectCurrentMessageList,\n selectReplyingToId,\n selectEditingId,\n selectEditingScheduledId,\n selectEditingMessage,\n} from '../../../modules/selectors';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport { pick } from '../../../util/iteratees';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport { isChatPrivate } from '../../../modules/helpers';\n\nimport Button from '../../ui/Button';\nimport EmbeddedMessage from '../../common/EmbeddedMessage';\n\nimport './ComposerEmbeddedMessage.scss';\n\ntype StateProps = {\n replyingToId?: number;\n editingId?: number;\n message?: ApiMessage;\n sender?: ApiUser | ApiChat;\n shouldAnimate?: boolean;\n forwardedMessagesCount?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FORWARD_RENDERING_DELAY = 300;\n\nconst ComposerEmbeddedMessage: FC = ({\n replyingToId,\n editingId,\n message,\n sender,\n shouldAnimate,\n forwardedMessagesCount,\n setReplyingToId,\n setEditingId,\n focusMessage,\n exitForwardMode,\n}) => {\n const isShown = Boolean(\n ((replyingToId || editingId) && message)\n || (sender && forwardedMessagesCount),\n );\n const canAnimate = useAsyncRendering(\n [forwardedMessagesCount],\n forwardedMessagesCount ? FORWARD_RENDERING_DELAY : undefined,\n );\n\n const {\n shouldRender, transitionClassNames,\n } = useShowTransition(canAnimate && isShown, undefined, !shouldAnimate, undefined, !shouldAnimate);\n\n const clearEmbedded = useCallback(() => {\n if (replyingToId) {\n setReplyingToId({ messageId: undefined });\n } else if (editingId) {\n setEditingId({ messageId: undefined });\n } else if (forwardedMessagesCount) {\n exitForwardMode();\n }\n }, [replyingToId, editingId, forwardedMessagesCount, setReplyingToId, setEditingId, exitForwardMode]);\n\n useEffect(() => (isShown ? captureEscKeyListener(clearEmbedded) : undefined), [isShown, clearEmbedded]);\n\n const handleMessageClick = useCallback((): void => {\n focusMessage({ chatId: message!.chatId, messageId: message!.id });\n }, [focusMessage, message]);\n\n const className = buildClassName('ComposerEmbeddedMessage', transitionClassNames);\n\n const customText = forwardedMessagesCount && forwardedMessagesCount > 1\n ? `${forwardedMessagesCount} forwarded messages`\n : undefined;\n\n if (!shouldRender) {\n return undefined;\n }\n\n return (\n
\n
\n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId, threadId, type: messageListType } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId || !messageListType) {\n return {};\n }\n\n const {\n currentUserId,\n forwardMessages: { fromChatId, toChatId, messageIds: forwardMessageIds },\n } = global;\n\n const replyingToId = selectReplyingToId(global, chatId, threadId);\n const editingId = messageListType === 'scheduled'\n ? selectEditingScheduledId(global, chatId)\n : selectEditingId(global, chatId, threadId);\n const shouldAnimate = global.settings.byKey.animationLevel >= 1;\n const isForwarding = toChatId === chatId;\n\n let message;\n if (replyingToId) {\n message = selectChatMessage(global, chatId, replyingToId);\n } else if (editingId) {\n message = selectEditingMessage(global, chatId, threadId, messageListType);\n } else if (isForwarding && forwardMessageIds!.length === 1) {\n message = selectChatMessage(global, fromChatId!, forwardMessageIds![0]);\n }\n\n let sender: ApiChat | ApiUser | undefined;\n if (replyingToId && message) {\n const { forwardInfo } = message;\n const isChatWithSelf = chatId === currentUserId;\n\n if (forwardInfo && (forwardInfo.isChannelPost || isChatWithSelf)) {\n sender = selectForwardedSender(global, message);\n }\n\n if (!sender) {\n sender = selectSender(global, message);\n }\n } else if (isForwarding) {\n sender = isChatPrivate(fromChatId!) ? selectUser(global, fromChatId!) : selectChat(global, fromChatId!);\n }\n\n return {\n replyingToId,\n editingId,\n message,\n sender,\n shouldAnimate,\n forwardedMessagesCount: isForwarding ? forwardMessageIds!.length : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setReplyingToId',\n 'setEditingId',\n 'focusMessage',\n 'exitForwardMode',\n ]),\n)(ComposerEmbeddedMessage));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './AttachmentModal';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst AttachmentModalAsync: FC = (props) => {\n const { attachments } = props;\n const AttachmentModal = useModuleLoader(Bundles.Extra, 'AttachmentModal', !attachments.length);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return AttachmentModal ? : undefined;\n};\n\nexport default memo(AttachmentModalAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './PollModal';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst PollModalAsync: FC = (props) => {\n const { isOpen } = props;\n const PollModal = useModuleLoader(Bundles.Extra, 'PollModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return PollModal ? : undefined;\n};\n\nexport default memo(PollModalAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './DropArea';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst DropAreaAsync: FC = (props) => {\n const { isOpen } = props;\n const DropArea = useModuleLoader(Bundles.Extra, 'DropArea', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return DropArea ? : undefined;\n};\n\nexport default memo(DropAreaAsync);\nexport { DropAreaState } from './DropArea';\n","import React, {\n FC, memo, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiMessage, ApiMessageEntityTypes, ApiWebPage } from '../../../api/types';\n\nimport { RE_LINK_TEMPLATE } from '../../../config';\nimport { selectNoWebPage } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport useOnChange from '../../../hooks/useOnChange';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useCurrentOrPrev from '../../../hooks/useCurrentOrPrev';\nimport buildClassName from '../../../util/buildClassName';\n\nimport WebPage from '../message/WebPage';\nimport Button from '../../ui/Button';\n\nimport './WebPagePreview.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageText: string;\n disabled?: boolean;\n};\n\ntype StateProps = {\n webPagePreview?: ApiWebPage;\n noWebPage?: boolean;\n};\ntype DispatchProps = Pick;\n\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\n\nconst WebPagePreview: FC = ({\n chatId,\n threadId,\n messageText,\n disabled,\n webPagePreview,\n noWebPage,\n loadWebPagePreview,\n clearWebPagePreview,\n toggleMessageWebPage,\n}) => {\n const link = useMemo(() => {\n const { text, entities } = parseMessageInput(messageText);\n\n const linkEntity = entities && entities.find(({ type }) => type === ApiMessageEntityTypes.TextUrl);\n if (linkEntity) {\n return linkEntity.url;\n }\n\n const textMatch = text.match(RE_LINK);\n if (textMatch) {\n return textMatch[0];\n }\n\n return undefined;\n }, [messageText]);\n\n useEffect(() => {\n if (link) {\n loadWebPagePreview({ text: link });\n } else {\n clearWebPagePreview();\n toggleMessageWebPage({ chatId, threadId });\n }\n }, [chatId, toggleMessageWebPage, clearWebPagePreview, link, loadWebPagePreview, threadId]);\n\n useOnChange(() => {\n clearWebPagePreview();\n toggleMessageWebPage({ chatId, threadId });\n }, [chatId]);\n\n const isShown = Boolean(webPagePreview && messageText.length && !noWebPage && !disabled);\n const { shouldRender, transitionClassNames } = useShowTransition(isShown);\n\n const renderingWebPage = useCurrentOrPrev(webPagePreview);\n\n if (!shouldRender || !renderingWebPage) {\n return undefined;\n }\n\n const handleClearWebpagePreview = () => {\n toggleMessageWebPage({ chatId, threadId, noWebPage: true });\n };\n\n // TODO Refactor so `WebPage` can be used without message\n const { photo, ...webPageWithoutPhoto } = renderingWebPage;\n const messageStub = {\n content: {\n webPage: webPageWithoutPhoto,\n },\n } as ApiMessage;\n\n return (\n
\n
\n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId }): StateProps => {\n const noWebPage = selectNoWebPage(global, chatId, threadId);\n return {\n webPagePreview: global.webPagePreview,\n noWebPage,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadWebPagePreview', 'clearWebPagePreview', 'toggleMessageWebPage',\n ]),\n)(WebPagePreview));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './CalendarModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst CalendarModalAsync: FC = (props) => {\n const { isOpen } = props;\n const CalendarModal = useModuleLoader(Bundles.Extra, 'CalendarModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return CalendarModal ? : undefined;\n};\n\nexport default memo(CalendarModalAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './PaymentModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst PaymentModalAsync: FC = (props) => {\n const { isOpen } = props;\n const PaymentModal = useModuleLoader(Bundles.Extra, 'PaymentModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return PaymentModal ? : undefined;\n};\n\nexport default memo(PaymentModalAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './ReceiptModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ReceiptModalAsync: FC = (props) => {\n const { isOpen } = props;\n const ReceiptModal = useModuleLoader(Bundles.Extra, 'ReceiptModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ReceiptModal ? : undefined;\n};\n\nexport default memo(ReceiptModalAsync);\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState, MessageListType } from '../../../global/types';\nimport {\n ApiAttachment,\n ApiBotInlineResult,\n ApiBotInlineMediaResult,\n ApiSticker,\n ApiVideo,\n ApiNewPoll,\n ApiMessage,\n ApiFormattedText,\n ApiChat,\n ApiChatMember,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { InlineBotSettings } from '../../../types';\n\nimport { BASE_EMOJI_KEYWORD_LANG, EDITABLE_INPUT_ID, SCHEDULED_WHEN_ONLINE } from '../../../config';\nimport { IS_VOICE_RECORDING_SUPPORTED, IS_SINGLE_COLUMN_LAYOUT, IS_IOS } from '../../../util/environment';\nimport {\n selectChat,\n selectIsChatWithBot,\n selectIsRightColumnShown,\n selectIsInSelectMode,\n selectNewestMessageWithBotKeyboardButtons,\n selectDraft,\n selectScheduledIds,\n selectEditingMessage,\n selectIsChatWithSelf,\n selectChatUser,\n} from '../../../modules/selectors';\nimport {\n getAllowedAttachmentOptions,\n getChatSlowModeOptions,\n isChatPrivate,\n isChatAdmin,\n} from '../../../modules/helpers';\nimport { formatMediaDuration, formatVoiceRecordDuration, getDayStartAt } from '../../../util/dateFormat';\nimport focusEditableElement from '../../../util/focusEditableElement';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport buildAttachment from './helpers/buildAttachment';\nimport renderText from '../../common/helpers/renderText';\nimport insertHtmlInSelection from '../../../util/insertHtmlInSelection';\nimport deleteLastCharacterOutsideSelection from '../../../util/deleteLastCharacterOutsideSelection';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport { isSelectionInsideInput } from './helpers/selection';\nimport applyIosAutoCapitalizationFix from './helpers/applyIosAutoCapitalizationFix';\n\nimport useFlag from '../../../hooks/useFlag';\nimport useVoiceRecording from './hooks/useVoiceRecording';\nimport useClipboardPaste from './hooks/useClipboardPaste';\nimport useDraft from './hooks/useDraft';\nimport useEditing from './hooks/useEditing';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useStickerTooltip from './hooks/useStickerTooltip';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useMentionTooltip from './hooks/useMentionTooltip';\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport useLang from '../../../hooks/useLang';\nimport useInlineBotTooltip from './hooks/useInlineBotTooltip';\nimport windowSize from '../../../util/windowSize';\n\nimport DeleteMessageModal from '../../common/DeleteMessageModal.async';\nimport Button from '../../ui/Button';\nimport ResponsiveHoverButton from '../../ui/ResponsiveHoverButton';\nimport Spinner from '../../ui/Spinner';\nimport AttachMenu from './AttachMenu.async';\nimport SymbolMenu from './SymbolMenu.async';\nimport InlineBotTooltip from './InlineBotTooltip.async';\nimport MentionTooltip from './MentionTooltip.async';\nimport CustomSendMenu from './CustomSendMenu.async';\nimport StickerTooltip from './StickerTooltip.async';\nimport EmojiTooltip from './EmojiTooltip.async';\nimport BotKeyboardMenu from './BotKeyboardMenu.async';\nimport MessageInput from './MessageInput';\nimport ComposerEmbeddedMessage from './ComposerEmbeddedMessage';\nimport AttachmentModal from './AttachmentModal.async';\nimport PollModal from './PollModal.async';\nimport DropArea, { DropAreaState } from './DropArea.async';\nimport WebPagePreview from './WebPagePreview';\nimport Portal from '../../ui/Portal';\nimport CalendarModal from '../../common/CalendarModal.async';\nimport PaymentModal from '../../payment/PaymentModal.async';\nimport ReceiptModal from '../../payment/ReceiptModal.async';\n\nimport './Composer.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n dropAreaState: string;\n isReady: boolean;\n onDropHide: NoneToVoidFunction;\n};\n\ntype StateProps = {\n editingMessage?: ApiMessage;\n chat?: ApiChat;\n draft?: ApiFormattedText;\n isChatWithBot?: boolean;\n isChatWithSelf?: boolean;\n isRightColumnShown?: boolean;\n isSelectModeActive?: boolean;\n isForwarding?: boolean;\n isPollModalOpen?: boolean;\n isPaymentModalOpen?: boolean;\n isReceiptModalOpen?: boolean;\n botKeyboardMessageId?: number;\n withScheduledButton?: boolean;\n shouldSchedule?: boolean;\n canScheduleUntilOnline?: boolean;\n stickersForEmoji?: ApiSticker[];\n groupChatMembers?: ApiChatMember[];\n currentUserId?: number;\n usersById?: Record;\n recentEmojis: string[];\n lastSyncTime?: number;\n contentToBeScheduled?: GlobalState['messages']['contentToBeScheduled'];\n shouldSuggestStickers?: boolean;\n baseEmojiKeywords?: Record;\n emojiKeywords?: Record;\n serverTimeOffset: number;\n topInlineBotIds?: number[];\n isInlineBotLoading: boolean;\n inlineBots?: Record;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nenum MainButtonState {\n Send = 'send',\n Record = 'record',\n Edit = 'edit',\n}\n\nconst VOICE_RECORDING_FILENAME = 'wonderful-voice-message.ogg';\n// When voice recording is active, composer placeholder will hide to prevent overlapping\nconst SCREEN_WIDTH_TO_HIDE_PLACEHOLDER = 600; // px\n\nconst MOBILE_KEYBOARD_HIDE_DELAY_MS = 100;\nconst SELECT_MODE_TRANSITION_MS = 200;\nconst CAPTION_MAX_LENGTH = 1024;\nconst SENDING_ANIMATION_DURATION = 350;\n// eslint-disable-next-line max-len\nconst APPENDIX = '';\n\nconst Composer: FC = ({\n dropAreaState,\n shouldSchedule,\n canScheduleUntilOnline,\n isReady,\n onDropHide,\n editingMessage,\n chatId,\n threadId,\n messageListType,\n draft,\n chat,\n connectionState,\n isChatWithBot,\n isChatWithSelf,\n isRightColumnShown,\n isSelectModeActive,\n isForwarding,\n isPollModalOpen,\n isPaymentModalOpen,\n isReceiptModalOpen,\n botKeyboardMessageId,\n withScheduledButton,\n stickersForEmoji,\n groupChatMembers,\n topInlineBotIds,\n currentUserId,\n usersById,\n lastSyncTime,\n contentToBeScheduled,\n shouldSuggestStickers,\n baseEmojiKeywords,\n emojiKeywords,\n serverTimeOffset,\n recentEmojis,\n inlineBots,\n isInlineBotLoading,\n sendMessage,\n editMessage,\n saveDraft,\n clearDraft,\n showDialog,\n setStickerSearchQuery,\n setGifSearchQuery,\n forwardMessages,\n openPollModal,\n closePollModal,\n loadScheduledHistory,\n closePaymentModal,\n openChat,\n clearReceipt,\n addRecentEmoji,\n sendInlineBotResult,\n}) => {\n const lang = useLang();\n\n // eslint-disable-next-line no-null/no-null\n const appendixRef = useRef(null);\n const [html, setHtml] = useState('');\n const lastMessageSendTimeSeconds = useRef();\n const prevDropAreaState = usePrevious(dropAreaState);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n const [\n scheduledMessageArgs, setScheduledMessageArgs,\n ] = useState();\n const { width: windowWidth } = windowSize.get();\n\n // Cache for frequently updated state\n const htmlRef = useRef(html);\n useEffect(() => {\n htmlRef.current = html;\n }, [html]);\n\n useEffect(() => {\n lastMessageSendTimeSeconds.current = undefined;\n }, [chatId]);\n\n useEffect(() => {\n if (chatId && lastSyncTime && threadId === MAIN_THREAD_ID && isReady) {\n loadScheduledHistory();\n }\n }, [isReady, chatId, loadScheduledHistory, lastSyncTime, threadId]);\n\n useLayoutEffect(() => {\n if (!appendixRef.current) return;\n\n appendixRef.current.innerHTML = APPENDIX;\n }, []);\n\n useEffect(() => {\n if (contentToBeScheduled) {\n setScheduledMessageArgs(contentToBeScheduled);\n openCalendar();\n }\n }, [contentToBeScheduled, openCalendar]);\n\n const [attachments, setAttachments] = useState([]);\n\n const [isBotKeyboardOpen, openBotKeyboard, closeBotKeyboard] = useFlag();\n const [isAttachMenuOpen, openAttachMenu, closeAttachMenu] = useFlag();\n const [isSymbolMenuOpen, openSymbolMenu, closeSymbolMenu] = useFlag();\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n const [isSymbolMenuLoaded, onSymbolMenuLoadingComplete] = useFlag();\n const [isHoverDisabled, disableHover, enableHover] = useFlag();\n\n const {\n startRecordingVoice,\n stopRecordingVoice,\n pauseRecordingVoice,\n activeVoiceRecording,\n currentRecordTime,\n recordButtonRef: mainButtonRef,\n startRecordTimeRef,\n } = useVoiceRecording();\n\n const mainButtonState = editingMessage\n ? MainButtonState.Edit\n : !IS_VOICE_RECORDING_SUPPORTED || activeVoiceRecording || (html && !attachments.length) || isForwarding\n ? MainButtonState.Send\n : MainButtonState.Record;\n const canShowCustomSendMenu = !shouldSchedule;\n\n const {\n isMentionTooltipOpen, mentionFilter,\n closeMentionTooltip, insertMention,\n mentionFilteredUsers,\n } = useMentionTooltip(\n !attachments.length,\n html,\n setHtml,\n undefined,\n groupChatMembers,\n topInlineBotIds,\n currentUserId,\n usersById,\n );\n\n const {\n isOpen: isInlineBotTooltipOpen,\n id: inlineBotId,\n isGallery: isInlineBotTooltipGallery,\n switchPm: inlineBotSwitchPm,\n results: inlineBotResults,\n closeTooltip: closeInlineBotTooltip,\n help: inlineBotHelp,\n loadMore: loadMoreForInlineBot,\n } = useInlineBotTooltip(\n Boolean(!attachments.length && lastSyncTime),\n chatId,\n html,\n inlineBots,\n );\n\n const {\n isContextMenuOpen: isCustomSendMenuOpen,\n handleContextMenu,\n handleContextMenuClose,\n handleContextMenuHide,\n } = useContextMenuHandlers(mainButtonRef, !(mainButtonState === MainButtonState.Send && canShowCustomSendMenu));\n\n const allowedAttachmentOptions = useMemo(() => {\n return getAllowedAttachmentOptions(chat, isChatWithBot);\n }, [chat, isChatWithBot]);\n\n const isAdmin = chat && isChatAdmin(chat);\n const slowMode = getChatSlowModeOptions(chat);\n\n const { isStickerTooltipOpen, closeStickerTooltip } = useStickerTooltip(\n Boolean(shouldSuggestStickers && allowedAttachmentOptions.canSendStickers && !attachments.length),\n html,\n stickersForEmoji,\n !isReady,\n );\n const {\n isEmojiTooltipOpen, closeEmojiTooltip, filteredEmojis, insertEmoji,\n } = useEmojiTooltip(\n Boolean(shouldSuggestStickers && allowedAttachmentOptions.canSendStickers && !attachments.length),\n html,\n recentEmojis,\n undefined,\n setHtml,\n baseEmojiKeywords,\n emojiKeywords,\n !isReady,\n );\n\n const insertTextAndUpdateCursor = useCallback((text: string, inputId: string = EDITABLE_INPUT_ID) => {\n const selection = window.getSelection()!;\n const messageInput = document.getElementById(inputId)!;\n const newHtml = renderText(text, ['escape_html', 'emoji_html', 'br_html'])\n .join('')\n .replace(/\\u200b+/g, '\\u200b');\n\n if (selection.rangeCount) {\n const selectionRange = selection.getRangeAt(0);\n if (isSelectionInsideInput(selectionRange, inputId)) {\n insertHtmlInSelection(newHtml);\n messageInput.dispatchEvent(new Event('input', { bubbles: true }));\n return;\n }\n }\n\n setHtml(`${htmlRef.current!}${newHtml}`);\n\n // If selection is outside of input, set cursor at the end of input\n requestAnimationFrame(() => {\n focusEditableElement(messageInput);\n });\n }, []);\n\n const removeSymbol = useCallback(() => {\n const selection = window.getSelection()!;\n\n if (selection.rangeCount) {\n const selectionRange = selection.getRangeAt(0);\n if (isSelectionInsideInput(selectionRange, EDITABLE_INPUT_ID)) {\n document.execCommand('delete', false);\n return;\n }\n }\n\n setHtml(deleteLastCharacterOutsideSelection(htmlRef.current!));\n }, []);\n\n const resetComposer = useCallback((shouldPreserveInput = false) => {\n if (!shouldPreserveInput) {\n setHtml('');\n }\n setAttachments([]);\n closeStickerTooltip();\n closeCalendar();\n setScheduledMessageArgs(undefined);\n closeMentionTooltip();\n closeEmojiTooltip();\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n // @perf\n setTimeout(() => closeSymbolMenu(), SENDING_ANIMATION_DURATION);\n } else {\n closeSymbolMenu();\n }\n }, [closeStickerTooltip, closeCalendar, closeMentionTooltip, closeEmojiTooltip, closeSymbolMenu]);\n\n // Handle chat change\n const prevChatId = usePrevious(chatId);\n useEffect(() => {\n if (!prevChatId || chatId === prevChatId) {\n return;\n }\n\n stopRecordingVoice();\n resetComposer();\n }, [chatId, prevChatId, resetComposer, stopRecordingVoice]);\n\n const handleEditComplete = useEditing(htmlRef, setHtml, editingMessage, resetComposer, openDeleteModal, editMessage);\n useDraft(draft, chatId, threadId, html, htmlRef, setHtml, editingMessage, saveDraft, clearDraft);\n useClipboardPaste(insertTextAndUpdateCursor, setAttachments, editingMessage);\n\n const handleFileSelect = useCallback(async (files: File[], isQuick: boolean) => {\n setAttachments(await Promise.all(files.map((file) => buildAttachment(file.name, file, isQuick))));\n }, []);\n\n const handleAppendFiles = useCallback(async (files: File[], isQuick: boolean) => {\n setAttachments([\n ...attachments,\n ...await Promise.all(files.map((file) => buildAttachment(file.name, file, isQuick))),\n ]);\n }, [attachments]);\n\n const handleClearAttachment = useCallback(() => {\n setAttachments([]);\n }, []);\n\n const handleSend = useCallback(async (isSilent = false, scheduledAt?: number) => {\n if (connectionState !== 'connectionStateReady') {\n return;\n }\n\n let currentAttachments = attachments;\n\n if (activeVoiceRecording) {\n const record = await stopRecordingVoice();\n if (record) {\n const { blob, duration, waveform } = record;\n currentAttachments = [await buildAttachment(\n VOICE_RECORDING_FILENAME,\n blob,\n false,\n { voice: { duration, waveform } },\n )];\n }\n }\n\n const { text, entities } = parseMessageInput(htmlRef.current!);\n if (!currentAttachments.length && !text && !isForwarding) {\n return;\n }\n\n if (currentAttachments.length && text && text.length > CAPTION_MAX_LENGTH) {\n const extraLength = text.length - CAPTION_MAX_LENGTH;\n showDialog({\n data: {\n message: 'CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS',\n textParams: {\n '{EXTRA_CHARS_COUNT}': extraLength,\n '{PLURAL_S}': extraLength > 1 ? 's' : '',\n },\n hasErrorKey: true,\n },\n });\n return;\n }\n\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n\n if (currentAttachments.length || text) {\n if (slowMode && !isAdmin) {\n const nowSeconds = Math.floor(Date.now() / 1000) + serverTimeOffset;\n const secondsSinceLastMessage = lastMessageSendTimeSeconds.current\n && Math.floor(nowSeconds - lastMessageSendTimeSeconds.current);\n const nextSendDateNotReached = slowMode.nextSendDate && slowMode.nextSendDate > nowSeconds;\n\n if (\n (secondsSinceLastMessage && secondsSinceLastMessage < slowMode.seconds)\n || nextSendDateNotReached\n ) {\n const secondsRemaining = nextSendDateNotReached\n ? slowMode.nextSendDate! - nowSeconds\n : slowMode.seconds - secondsSinceLastMessage!;\n showDialog({\n data: {\n message: lang('SlowModeHint', formatMediaDuration(secondsRemaining)),\n isSlowMode: true,\n hasErrorKey: false,\n },\n });\n\n messageInput.blur();\n\n return;\n }\n }\n\n sendMessage({\n text,\n entities,\n attachments: currentAttachments,\n scheduledAt,\n isSilent,\n });\n }\n if (isForwarding) {\n forwardMessages();\n }\n\n lastMessageSendTimeSeconds.current = Math.floor(Date.now() / 1000) + serverTimeOffset;\n\n clearDraft({ chatId, localOnly: true });\n\n if (IS_IOS && messageInput === document.activeElement) {\n applyIosAutoCapitalizationFix(messageInput);\n }\n\n // Wait until message animation starts\n requestAnimationFrame(() => {\n resetComposer();\n });\n }, [\n connectionState, attachments, activeVoiceRecording, isForwarding, serverTimeOffset, clearDraft, chatId,\n resetComposer, stopRecordingVoice, showDialog, slowMode, isAdmin, sendMessage, forwardMessages, lang,\n ]);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker, shouldPreserveInput = false) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n if (shouldSchedule) {\n setScheduledMessageArgs({ sticker });\n openCalendar();\n } else {\n sendMessage({ sticker });\n requestAnimationFrame(() => {\n resetComposer(shouldPreserveInput);\n });\n }\n }, [shouldSchedule, openCalendar, sendMessage, resetComposer]);\n\n const handleGifSelect = useCallback((gif: ApiVideo) => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ gif });\n openCalendar();\n } else {\n sendMessage({ gif });\n requestAnimationFrame(() => {\n resetComposer(true);\n });\n }\n }, [shouldSchedule, openCalendar, sendMessage, resetComposer]);\n\n const handleInlineBotSelect = useCallback((inlineResult: ApiBotInlineResult | ApiBotInlineMediaResult) => {\n if (connectionState !== 'connectionStateReady') {\n return;\n }\n\n sendInlineBotResult({\n id: inlineResult.id,\n queryId: inlineResult.queryId,\n });\n\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n if (IS_IOS && messageInput === document.activeElement) {\n applyIosAutoCapitalizationFix(messageInput);\n }\n\n clearDraft({ chatId, localOnly: true });\n requestAnimationFrame(() => {\n resetComposer();\n });\n }, [chatId, clearDraft, connectionState, resetComposer, sendInlineBotResult]);\n\n const handlePollSend = useCallback((poll: ApiNewPoll) => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ poll });\n closePollModal();\n openCalendar();\n } else {\n sendMessage({ poll });\n closePollModal();\n }\n }, [closePollModal, openCalendar, sendMessage, shouldSchedule]);\n\n const handleSilentSend = useCallback(() => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ isSilent: true });\n openCalendar();\n } else {\n handleSend(true);\n }\n }, [handleSend, openCalendar, shouldSchedule]);\n\n const handleMessageSchedule = useCallback((date: Date, isWhenOnline = false) => {\n const { isSilent, ...restArgs } = scheduledMessageArgs || {};\n\n // Scheduled time can not be less than 10 seconds in future\n const scheduledAt = Math.round(Math.max(date.getTime(), Date.now() + 60 * 1000) / 1000)\n + (isWhenOnline ? 0 : serverTimeOffset);\n\n if (!scheduledMessageArgs || Object.keys(restArgs).length === 0) {\n handleSend(!!isSilent, scheduledAt);\n } else {\n sendMessage({\n ...scheduledMessageArgs,\n scheduledAt,\n });\n requestAnimationFrame(() => {\n resetComposer();\n });\n }\n closeCalendar();\n }, [closeCalendar, handleSend, resetComposer, scheduledMessageArgs, sendMessage, serverTimeOffset]);\n\n const handleMessageScheduleUntilOnline = useCallback(() => {\n handleMessageSchedule(new Date(SCHEDULED_WHEN_ONLINE * 1000), true);\n }, [handleMessageSchedule]);\n\n const handleCloseCalendar = useCallback(() => {\n closeCalendar();\n setScheduledMessageArgs(undefined);\n }, [closeCalendar]);\n\n const handleSearchOpen = useCallback((type: 'stickers' | 'gifs') => {\n if (type === 'stickers') {\n setStickerSearchQuery({ query: '' });\n setGifSearchQuery({ query: undefined });\n } else {\n setGifSearchQuery({ query: '' });\n setStickerSearchQuery({ query: undefined });\n }\n }, [setStickerSearchQuery, setGifSearchQuery]);\n\n const handleSymbolMenuOpen = useCallback(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n\n if (!IS_SINGLE_COLUMN_LAYOUT || messageInput !== document.activeElement) {\n openSymbolMenu();\n return;\n }\n\n messageInput.blur();\n setTimeout(() => {\n openSymbolMenu();\n }, MOBILE_KEYBOARD_HIDE_DELAY_MS);\n }, [openSymbolMenu]);\n\n const handleAllScheduledClick = useCallback(() => {\n openChat({ id: chatId, threadId, type: 'scheduled' });\n }, [openChat, chatId, threadId]);\n\n useEffect(() => {\n if (isRightColumnShown && IS_SINGLE_COLUMN_LAYOUT) {\n closeSymbolMenu();\n }\n }, [isRightColumnShown, closeSymbolMenu]);\n\n useEffect(() => {\n if (!isReady) return;\n\n if (isSelectModeActive) {\n disableHover();\n } else {\n setTimeout(() => {\n enableHover();\n }, SELECT_MODE_TRANSITION_MS);\n }\n }, [isSelectModeActive, enableHover, disableHover, isReady]);\n\n const mainButtonHandler = useCallback(() => {\n switch (mainButtonState) {\n case MainButtonState.Send:\n if (shouldSchedule) {\n if (activeVoiceRecording) {\n pauseRecordingVoice();\n }\n openCalendar();\n } else {\n handleSend();\n requestAnimationFrame(() => {\n resetComposer();\n });\n }\n break;\n case MainButtonState.Record:\n startRecordingVoice();\n break;\n case MainButtonState.Edit:\n handleEditComplete();\n break;\n default:\n break;\n }\n }, [\n mainButtonState, resetComposer, shouldSchedule, startRecordingVoice, handleEditComplete,\n activeVoiceRecording, openCalendar, pauseRecordingVoice, handleSend,\n ]);\n\n const areVoiceMessagesNotAllowed = mainButtonState === MainButtonState.Record\n && !allowedAttachmentOptions.canAttachMedia;\n\n const prevEditedMessage = usePrevious(editingMessage, true);\n const renderedEditedMessage = editingMessage || prevEditedMessage;\n\n const scheduledDefaultDate = new Date();\n scheduledDefaultDate.setSeconds(0);\n scheduledDefaultDate.setMilliseconds(0);\n\n const scheduledMaxDate = new Date();\n scheduledMaxDate.setFullYear(scheduledMaxDate.getFullYear() + 1);\n\n let sendButtonAriaLabel = 'SendMessage';\n switch (mainButtonState) {\n case MainButtonState.Edit:\n sendButtonAriaLabel = 'Save edited message';\n break;\n case MainButtonState.Record:\n sendButtonAriaLabel = areVoiceMessagesNotAllowed\n ? 'Conversation.DefaultRestrictedMedia'\n : 'AccDescrVoiceMessage';\n }\n\n const className = buildClassName(\n 'Composer',\n !isSelectModeActive && 'shown',\n isHoverDisabled && 'hover-disabled',\n );\n\n const symbolMenuButtonClassName = buildClassName(\n 'mobile-symbol-menu-button',\n !isReady && 'not-ready',\n isSymbolMenuLoaded\n ? (isSymbolMenuOpen && 'menu-opened')\n : (isSymbolMenuOpen && 'is-loading'),\n );\n\n const onSend = mainButtonState === MainButtonState.Edit\n ? handleEditComplete\n : (shouldSchedule ? openCalendar : handleSend);\n\n return (\n
\n {allowedAttachmentOptions.canAttachMedia && isReady && (\n \n \n \n )}\n \n \n \n \n {renderedEditedMessage && (\n \n )}\n \n \n
\n
\n \n \n
\n {IS_SINGLE_COLUMN_LAYOUT ? (\n \n \n \n {isSymbolMenuOpen && !isSymbolMenuLoaded && }\n \n ) : (\n \n \n \n )}\n \n {isInlineBotLoading && Boolean(inlineBotId) && (\n \n )}\n {withScheduledButton && (\n \n \n \n )}\n {botKeyboardMessageId && !activeVoiceRecording && !editingMessage && (\n \n \n \n )}\n {!activeVoiceRecording && !editingMessage && (\n \n \n \n )}\n {activeVoiceRecording && currentRecordTime && (\n \n {formatVoiceRecordDuration(currentRecordTime - startRecordTimeRef.current!)}\n \n )}\n \n \n \n {botKeyboardMessageId && (\n \n )}\n \n
\n
\n {activeVoiceRecording && (\n \n \n \n )}\n \n \n \n \n \n {canShowCustomSendMenu && (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const chat = selectChat(global, chatId);\n const chatUser = chat && selectChatUser(global, chat);\n const isChatWithBot = chat ? selectIsChatWithBot(global, chat) : undefined;\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const messageWithActualBotKeyboard = isChatWithBot && selectNewestMessageWithBotKeyboardButtons(global, chatId);\n const scheduledIds = selectScheduledIds(global, chatId);\n const { language } = global.settings.byKey;\n const baseEmojiKeywords = global.emojiKeywords[BASE_EMOJI_KEYWORD_LANG];\n const emojiKeywords = language !== BASE_EMOJI_KEYWORD_LANG ? global.emojiKeywords[language] : undefined;\n\n return {\n editingMessage: selectEditingMessage(global, chatId, threadId, messageListType),\n connectionState: global.connectionState,\n draft: selectDraft(global, chatId, threadId),\n chat,\n isChatWithBot,\n isChatWithSelf,\n canScheduleUntilOnline: (\n !isChatWithSelf && !isChatWithBot\n && (chat && chatUser && isChatPrivate(chatId) && chatUser.status && Boolean(chatUser.status.wasOnline))\n ),\n isRightColumnShown: selectIsRightColumnShown(global),\n isSelectModeActive: selectIsInSelectMode(global),\n withScheduledButton: (\n threadId === MAIN_THREAD_ID\n && messageListType === 'thread'\n && Boolean(scheduledIds && scheduledIds.length)\n ),\n shouldSchedule: messageListType === 'scheduled',\n botKeyboardMessageId: messageWithActualBotKeyboard ? messageWithActualBotKeyboard.id : undefined,\n isForwarding: chatId === global.forwardMessages.toChatId,\n isPollModalOpen: global.isPollModalOpen,\n stickersForEmoji: global.stickers.forEmoji.stickers,\n groupChatMembers: chat && chat.fullInfo && chat.fullInfo.members,\n topInlineBotIds: global.topInlineBots && global.topInlineBots.userIds,\n currentUserId: global.currentUserId,\n usersById: global.users.byId,\n lastSyncTime: global.lastSyncTime,\n contentToBeScheduled: global.messages.contentToBeScheduled,\n isPaymentModalOpen: global.payment.isPaymentModalOpen,\n isReceiptModalOpen: Boolean(global.payment.receipt),\n shouldSuggestStickers: global.settings.byKey.shouldSuggestStickers,\n recentEmojis: global.recentEmojis,\n baseEmojiKeywords: baseEmojiKeywords ? baseEmojiKeywords.keywords : undefined,\n emojiKeywords: emojiKeywords ? emojiKeywords.keywords : undefined,\n serverTimeOffset: global.serverTimeOffset,\n inlineBots: global.inlineBots.byUsername,\n isInlineBotLoading: global.inlineBots.isLoading,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'sendMessage',\n 'editMessage',\n 'saveDraft',\n 'clearDraft',\n 'showDialog',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'forwardMessages',\n 'openPollModal',\n 'closePollModal',\n 'closePaymentModal',\n 'clearReceipt',\n 'loadScheduledHistory',\n 'openChat',\n 'addRecentEmoji',\n 'sendInlineBotResult',\n ]),\n)(Composer));\n","import {\n useCallback, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\n\nimport { IS_IOS, IS_VOICE_RECORDING_SUPPORTED } from '../../../../util/environment';\nimport * as voiceRecording from '../../../../util/voiceRecording';\nimport captureEscKeyListener from '../../../../util/captureEscKeyListener';\n\ntype ActiveVoiceRecording = { stop: () => Promise; pause: NoneToVoidFunction } | undefined;\n\nexport default () => {\n // eslint-disable-next-line no-null/no-null\n const recordButtonRef = useRef(null);\n const [activeVoiceRecording, setActiveVoiceRecording] = useState();\n const startRecordTimeRef = useRef();\n const [currentRecordTime, setCurrentRecordTime] = useState();\n\n useEffect(() => {\n // Preloading worker fixes silent first record on iOS\n if (IS_IOS && IS_VOICE_RECORDING_SUPPORTED) {\n void voiceRecording.init();\n }\n }, []);\n\n const startRecordingVoice = useCallback(async () => {\n try {\n const { stop, pause } = await voiceRecording.start((tickVolume: number) => {\n if (recordButtonRef.current) {\n if (startRecordTimeRef.current && Date.now() % 4 === 0) {\n recordButtonRef.current.style.boxShadow = `0 0 0 ${(tickVolume || 0) * 50}px rgba(0,0,0,.15)`;\n }\n setCurrentRecordTime(Date.now());\n }\n });\n startRecordTimeRef.current = Date.now();\n setCurrentRecordTime(Date.now());\n\n setActiveVoiceRecording({ stop, pause });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }, []);\n\n const pauseRecordingVoice = useCallback(() => {\n if (!activeVoiceRecording) {\n return undefined;\n }\n\n if (recordButtonRef.current) {\n recordButtonRef.current.style.boxShadow = 'none';\n }\n\n try {\n return activeVoiceRecording!.pause();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n return undefined;\n }\n }, [activeVoiceRecording]);\n\n const stopRecordingVoice = useCallback(() => {\n if (!activeVoiceRecording) {\n return undefined;\n }\n\n setActiveVoiceRecording(undefined);\n startRecordTimeRef.current = undefined;\n setCurrentRecordTime(undefined);\n if (recordButtonRef.current) {\n recordButtonRef.current.style.boxShadow = 'none';\n }\n try {\n return activeVoiceRecording!.stop();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n return undefined;\n }\n }, [activeVoiceRecording]);\n\n useEffect(() => {\n return activeVoiceRecording ? captureEscKeyListener(stopRecordingVoice) : undefined;\n }, [activeVoiceRecording, stopRecordingVoice]);\n\n return {\n startRecordingVoice,\n pauseRecordingVoice,\n stopRecordingVoice,\n activeVoiceRecording,\n currentRecordTime,\n recordButtonRef,\n startRecordTimeRef,\n };\n};\n","import { useEffect } from '../../../../lib/teact/teact';\nimport { getDispatch } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { IS_EMOJI_SUPPORTED } from '../../../../util/environment';\n\nimport parseEmojiOnlyString from '../../../common/helpers/parseEmojiOnlyString';\n\nexport default function useStickerTooltip(\n isAllowed: boolean,\n html: string,\n stickers?: ApiSticker[],\n isDisabled = false,\n) {\n const { loadStickersForEmoji, clearStickersForEmoji } = getDispatch();\n const isSingleEmoji = (\n (IS_EMOJI_SUPPORTED && parseEmojiOnlyString(html) === 1)\n || (!IS_EMOJI_SUPPORTED && Boolean(html.match(/^]*?>$/g)))\n );\n const hasStickers = Boolean(stickers) && isSingleEmoji;\n\n useEffect(() => {\n if (isDisabled) return;\n\n if (isAllowed && isSingleEmoji) {\n loadStickersForEmoji({ emoji: html });\n } else if (hasStickers || !isSingleEmoji) {\n clearStickersForEmoji();\n }\n // We omit `hasStickers` here to prevent re-fetching after manually closing tooltip (via ).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [html, isSingleEmoji, clearStickersForEmoji, loadStickersForEmoji, isAllowed, isDisabled]);\n\n return {\n isStickerTooltipOpen: hasStickers,\n closeStickerTooltip: clearStickersForEmoji,\n };\n}\n","export default function insertHtmlInSelection(html: string) {\n const selection = window.getSelection();\n\n if (selection && selection.getRangeAt && selection.rangeCount) {\n const range = selection.getRangeAt(0);\n range.deleteContents();\n\n const fragment = range.createContextualFragment(html);\n const lastInsertedNode = fragment.lastChild;\n range.insertNode(fragment);\n if (lastInsertedNode) {\n range.setStartAfter(lastInsertedNode);\n range.setEndAfter(lastInsertedNode);\n } else {\n range.collapse(false);\n }\n selection.removeAllRanges();\n selection.addRange(range);\n }\n}\n","export default function deleteLastCharacterOutsideSelection(html: string) {\n const tempInput = document.createElement('div');\n tempInput.contentEditable = 'true';\n tempInput.style.position = 'absolute';\n tempInput.style.left = '-10000px';\n tempInput.style.top = '-10000px';\n tempInput.innerHTML = html;\n document.body.appendChild(tempInput);\n let element = tempInput.lastChild!;\n\n if (element.lastChild) {\n // Selects the last and the deepest child of the element.\n while (element.lastChild) {\n element = element.lastChild;\n }\n }\n\n // Gets length of the element's content.\n const textLength = element.textContent!.length;\n const range = document.createRange();\n const selection = window.getSelection()!;\n\n // Sets selection position to the end of the element.\n range.setStart(element, textLength);\n range.setEnd(element, textLength);\n selection.removeAllRanges();\n selection.addRange(range);\n document.execCommand('delete', false);\n\n const result = tempInput.innerHTML;\n document.body.removeChild(tempInput);\n\n return result;\n}\n","import { useCallback, useEffect } from '../../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../../api/types';\nimport { GlobalActions } from '../../../../global/types';\n\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport parseMessageInput from '../helpers/parseMessageInput';\nimport getMessageTextAsHtml from '../helpers/getMessageTextAsHtml';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport { hasMessageMedia } from '../../../../modules/helpers';\n\nexport default (\n htmlRef: { current: string },\n setHtml: (html: string) => void,\n editedMessage: ApiMessage | undefined,\n resetComposer: () => void,\n openDeleteModal: () => void,\n editMessage: GlobalActions['editMessage'],\n) => {\n // TODO useOnChange\n // Handle editing message\n useEffect(() => {\n if (!editedMessage) {\n setHtml('');\n return;\n }\n\n setHtml(getMessageTextAsHtml(editedMessage.content.text));\n\n requestAnimationFrame(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n focusEditableElement(messageInput, true);\n });\n }, [editedMessage, setHtml]);\n\n const handleEditComplete = useCallback(() => {\n const { text, entities } = parseMessageInput(htmlRef.current!);\n\n if (!editedMessage) {\n return;\n }\n\n if (!text && !hasMessageMedia(editedMessage)) {\n openDeleteModal();\n return;\n }\n\n editMessage({\n messageId: editedMessage.id,\n text,\n entities,\n });\n\n resetComposer();\n }, [editMessage, editedMessage, htmlRef, openDeleteModal, resetComposer]);\n\n return handleEditComplete;\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './MobileSearch';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MobileSearchAsync: FC = (props) => {\n const { isActive } = props;\n const MobileSearch = useModuleLoader(Bundles.Extra, 'MobileSearch', !isActive, true);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MobileSearch ? : undefined;\n};\n\nexport default memo(MobileSearchAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\nimport { OwnProps } from './MessageSelectToolbar';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MessageSelectToolbarAsync: FC = (props) => {\n const { isActive } = props;\n const MessageSelectToolbar = useModuleLoader(Bundles.Extra, 'MessageSelectToolbar', !isActive);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MessageSelectToolbar ? : undefined;\n};\n\nexport default memo(MessageSelectToolbarAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './UnpinAllMessagesModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst UnpinAllMessagesModalAsync: FC = (props) => {\n const { isOpen } = props;\n const UnpinAllMessagesModal = useModuleLoader(Bundles.Extra, 'UnpinAllMessagesModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return UnpinAllMessagesModal ? : undefined;\n};\n\nexport default memo(UnpinAllMessagesModalAsync);\n","import React, {\n FC, useEffect, useState, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChatBannedRights, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalActions, MessageListType, MessageList as GlobalMessageList } from '../../global/types';\nimport { ThemeKey } from '../../types';\n\nimport {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_CHAT_INFO,\n CONTENT_TYPES_FOR_QUICK_UPLOAD,\n ANIMATION_LEVEL_MAX,\n ANIMATION_END_DELAY,\n DARK_THEME_BG_COLOR,\n LIGHT_THEME_BG_COLOR,\n ANIMATION_LEVEL_MIN,\n} from '../../config';\nimport {\n IS_SINGLE_COLUMN_LAYOUT,\n IS_TABLET_COLUMN_LAYOUT,\n IS_TOUCH_ENV,\n MASK_IMAGE_DISABLED,\n} from '../../util/environment';\nimport { DropAreaState } from './composer/DropArea';\nimport {\n selectChat,\n selectCurrentMessageList,\n selectCurrentTextSearch,\n selectIsChatBotNotStarted,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n selectPinnedIds,\n selectTheme,\n} from '../../modules/selectors';\nimport { getCanPostInChat, getMessageSendingRestrictionReason, isChatPrivate } from '../../modules/helpers';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport useCustomBackground from '../../hooks/useCustomBackground';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport usePrevDuringAnimation from '../../hooks/usePrevDuringAnimation';\nimport calculateMiddleFooterTransforms from './helpers/calculateMiddleFooterTransforms';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport { createMessageHash } from '../../util/routing';\n\nimport Transition from '../ui/Transition';\nimport MiddleHeader from './MiddleHeader';\nimport MessageList from './MessageList';\nimport ScrollDownButton from './ScrollDownButton';\nimport Composer from './composer/Composer';\nimport Button from '../ui/Button';\nimport MobileSearch from './MobileSearch.async';\nimport MessageSelectToolbar from './MessageSelectToolbar.async';\nimport UnpinAllMessagesModal from '../common/UnpinAllMessagesModal.async';\n\nimport './MiddleColumn.scss';\n\ntype StateProps = {\n chatId?: number;\n threadId?: number;\n messageListType?: MessageListType;\n isPrivate?: boolean;\n isPinnedMessageList?: boolean;\n isScheduledMessageList?: boolean;\n canPost?: boolean;\n currentUserBannedRights?: ApiChatBannedRights;\n defaultBannedRights?: ApiChatBannedRights;\n hasPinnedOrAudioMessage?: boolean;\n pinnedMessagesCount?: number;\n theme: ThemeKey;\n customBackground?: string;\n backgroundColor?: string;\n patternColor?: string;\n isLeftColumnShown?: boolean;\n isRightColumnShown?: boolean;\n isBackgroundBlurred?: boolean;\n isMobileSearchActive?: boolean;\n isSelectModeActive?: boolean;\n animationLevel?: number;\n shouldSkipHistoryAnimations?: boolean;\n currentTransitionKey: number;\n messageLists?: GlobalMessageList[];\n};\n\ntype DispatchProps = Pick;\n\nconst CLOSE_ANIMATION_DURATION = IS_SINGLE_COLUMN_LAYOUT ? 450 + ANIMATION_END_DELAY : undefined;\n\nfunction canBeQuicklyUploaded(item: DataTransferItem) {\n return item.kind === 'file' && item.type && CONTENT_TYPES_FOR_QUICK_UPLOAD.has(item.type);\n}\n\nconst MiddleColumn: FC = ({\n chatId,\n threadId,\n messageListType,\n isPrivate,\n isPinnedMessageList,\n messageLists,\n canPost,\n currentUserBannedRights,\n defaultBannedRights,\n hasPinnedOrAudioMessage,\n pinnedMessagesCount,\n customBackground,\n theme,\n backgroundColor,\n patternColor,\n isLeftColumnShown,\n isRightColumnShown,\n isBackgroundBlurred,\n isMobileSearchActive,\n isSelectModeActive,\n animationLevel,\n shouldSkipHistoryAnimations,\n currentTransitionKey,\n openChat,\n unpinAllMessages,\n loadUser,\n closeLocalTextSearch,\n exitMessageSelectMode,\n}) => {\n const { width: windowWidth } = useWindowSize();\n\n const lang = useLang();\n const [dropAreaState, setDropAreaState] = useState(DropAreaState.None);\n const [isFabShown, setIsFabShown] = useState();\n const [isNotchShown, setIsNotchShown] = useState();\n const [isUnpinModalOpen, setIsUnpinModalOpen] = useState(false);\n const [isReady, setIsReady] = useState(!IS_SINGLE_COLUMN_LAYOUT || animationLevel === ANIMATION_LEVEL_MIN);\n\n const hasTools = hasPinnedOrAudioMessage && (\n windowWidth < MOBILE_SCREEN_MAX_WIDTH\n || (\n isRightColumnShown && windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n ) || (\n windowWidth >= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_CHAT_INFO\n )\n );\n\n const renderingChatId = usePrevDuringAnimation(chatId, CLOSE_ANIMATION_DURATION);\n const renderingThreadId = usePrevDuringAnimation(threadId, CLOSE_ANIMATION_DURATION);\n const renderingMessageListType = usePrevDuringAnimation(messageListType, CLOSE_ANIMATION_DURATION);\n const renderingCanPost = usePrevDuringAnimation(canPost, CLOSE_ANIMATION_DURATION);\n const renderingHasTools = usePrevDuringAnimation(hasTools, CLOSE_ANIMATION_DURATION);\n const renderingIsFabShown = usePrevDuringAnimation(isFabShown, CLOSE_ANIMATION_DURATION);\n\n useEffect(() => {\n return chatId\n ? captureEscKeyListener(() => {\n openChat({ id: undefined });\n })\n : undefined;\n }, [chatId, openChat]);\n\n useEffect(() => {\n setDropAreaState(DropAreaState.None);\n setIsFabShown(undefined);\n setIsNotchShown(undefined);\n }, [chatId]);\n\n useEffect(() => {\n if (animationLevel === ANIMATION_LEVEL_MIN) {\n setIsReady(true);\n }\n }, [animationLevel]);\n\n const handleTransitionEnd = (e: React.TransitionEvent) => {\n if (e.propertyName === 'transform' && e.target === e.currentTarget) {\n setIsReady(Boolean(chatId));\n }\n };\n\n useEffect(() => {\n if (isPrivate) {\n loadUser({ userId: chatId });\n }\n }, [chatId, isPrivate, loadUser]);\n\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n const { items } = e.dataTransfer || {};\n const shouldDrawQuick = items && Array.from(items)\n // Filter unnecessary element for drag and drop images in Firefox (https://github.com/Ajaxy/telegram-tt/issues/49)\n // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Recommended_drag_types#image\n .filter((item) => item.type !== 'text/uri-list')\n .every(canBeQuicklyUploaded);\n\n setDropAreaState(shouldDrawQuick ? DropAreaState.QuickFile : DropAreaState.Document);\n }, []);\n\n const handleHideDropArea = useCallback(() => {\n setDropAreaState(DropAreaState.None);\n }, []);\n\n const handleOpenUnpinModal = useCallback(() => {\n setIsUnpinModalOpen(true);\n }, []);\n\n const closeUnpinModal = useCallback(() => {\n setIsUnpinModalOpen(false);\n }, []);\n\n const handleUnpinAllMessages = useCallback(() => {\n unpinAllMessages({ chatId });\n closeUnpinModal();\n openChat({ id: chatId });\n }, [unpinAllMessages, openChat, closeUnpinModal, chatId]);\n\n const handleTabletFocus = useCallback(() => {\n openChat({ id: chatId });\n }, [openChat, chatId]);\n\n const customBackgroundValue = useCustomBackground(theme, customBackground);\n\n const className = buildClassName(\n renderingHasTools && 'has-header-tools',\n customBackground && 'custom-bg-image',\n backgroundColor && 'custom-bg-color',\n customBackground && isBackgroundBlurred && 'blurred',\n MASK_IMAGE_DISABLED ? 'mask-image-disabled' : 'mask-image-enabled',\n );\n\n const messagingDisabledClassName = buildClassName(\n 'messaging-disabled',\n !isSelectModeActive && 'shown',\n );\n\n\n const messageSendingRestrictionReason = getMessageSendingRestrictionReason(\n lang, currentUserBannedRights, defaultBannedRights,\n );\n\n // CSS Variables calculation doesn't work properly with transforms, so we calculate transform values in JS\n const {\n composerHiddenScale, toolbarHiddenScale,\n composerTranslateX, toolbarTranslateX,\n unpinHiddenScale, toolbarForUnpinHiddenScale,\n } = useMemo(\n () => calculateMiddleFooterTransforms(windowWidth, renderingCanPost),\n [renderingCanPost, windowWidth],\n );\n\n const footerClassName = buildClassName(\n 'middle-column-footer',\n !renderingCanPost && 'no-composer',\n renderingCanPost && isNotchShown && !isSelectModeActive && 'with-notch',\n );\n\n const closeChat = () => {\n openChat({ id: undefined }, true);\n };\n\n useHistoryBack(renderingChatId && renderingThreadId,\n closeChat, undefined, undefined, undefined,\n messageLists ? messageLists.map(createMessageHash) : []);\n\n useHistoryBack(isMobileSearchActive, closeLocalTextSearch);\n useHistoryBack(isSelectModeActive, exitMessageSelectMode);\n\n return (\n \n \n
\n {renderingChatId && renderingThreadId && (\n <>\n
\n \n \n {() => (\n <>\n \n
\n {renderingCanPost && (\n \n )}\n {isPinnedMessageList && (\n
\n \n \n {lang('Chat.Pinned.UnpinAll', pinnedMessagesCount, 'i')}\n \n
\n )}\n {!isPinnedMessageList && !renderingCanPost && messageSendingRestrictionReason && (\n
\n
\n \n {messageSendingRestrictionReason}\n \n
\n
\n )}\n \n
\n \n )}\n \n\n \n
\n {IS_SINGLE_COLUMN_LAYOUT && }\n \n )}\n {chatId && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const theme = selectTheme(global);\n const {\n isBlurred: isBackgroundBlurred, background: customBackground, backgroundColor, patternColor,\n } = global.settings.themes[theme] || {};\n\n const { messageLists } = global.messages;\n const currentMessageList = selectCurrentMessageList(global);\n const { isLeftColumnShown, chats: { listIds } } = global;\n\n const state: StateProps = {\n theme,\n customBackground,\n backgroundColor,\n patternColor,\n isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isBackgroundBlurred,\n isMobileSearchActive: Boolean(IS_SINGLE_COLUMN_LAYOUT && selectCurrentTextSearch(global)),\n isSelectModeActive: selectIsInSelectMode(global),\n animationLevel: global.settings.byKey.animationLevel,\n currentTransitionKey: Math.max(0, global.messages.messageLists.length - 1),\n };\n\n if (!currentMessageList || !listIds.active) {\n return state;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n const pinnedIds = selectPinnedIds(global, chatId);\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n\n const canPost = chat && getCanPostInChat(chat, threadId);\n const isBotNotStarted = selectIsChatBotNotStarted(global, chatId);\n const isPinnedMessageList = messageListType === 'pinned';\n const isScheduledMessageList = messageListType === 'scheduled';\n\n return {\n ...state,\n chatId,\n threadId,\n messageListType,\n isPrivate: isChatPrivate(chatId),\n canPost: !isPinnedMessageList && (!chat || canPost) && !isBotNotStarted,\n isPinnedMessageList,\n isScheduledMessageList,\n currentUserBannedRights: chat && chat.currentUserBannedRights,\n defaultBannedRights: chat && chat.defaultBannedRights,\n hasPinnedOrAudioMessage: (\n threadId !== MAIN_THREAD_ID\n || Boolean(pinnedIds && pinnedIds.length)\n || Boolean(audioChatId && audioMessageId)\n ),\n pinnedMessagesCount: pinnedIds ? pinnedIds.length : 0,\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n messageLists,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat', 'unpinAllMessages', 'loadUser', 'closeLocalTextSearch', 'exitMessageSelectMode',\n ]),\n)(MiddleColumn));\n","import { useEffect, useState } from '../lib/teact/teact';\n\nimport { ThemeKey } from '../types';\n\nimport { CUSTOM_BG_CACHE_NAME } from '../config';\nimport * as cacheApi from '../util/cacheApi';\nimport { preloadImage } from '../util/files';\n\nexport default (theme: ThemeKey, settingValue?: string) => {\n const [value, setValue] = useState(settingValue);\n\n useEffect(() => {\n if (!settingValue) {\n return;\n }\n\n if (settingValue.startsWith('#')) {\n setValue(settingValue);\n } else {\n cacheApi.fetch(CUSTOM_BG_CACHE_NAME, theme, cacheApi.Type.Blob)\n .then((blob) => {\n const url = URL.createObjectURL(blob);\n preloadImage(url)\n .then(() => {\n setValue(`url(${url})`);\n });\n });\n }\n }, [settingValue, theme]);\n\n return settingValue ? value : undefined;\n};\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ManagementScreens, ProfileState } from '../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { debounce } from '../../util/schedulers';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport {\n selectChat,\n selectCurrentGifSearch,\n selectCurrentStickerSearch,\n selectCurrentTextSearch,\n selectIsChatWithSelf,\n} from '../../modules/selectors';\nimport { isChatAdmin, isChatChannel, isChatPrivate } from '../../modules/helpers';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\nimport useLang from '../../hooks/useLang';\n\nimport SearchInput from '../ui/SearchInput';\nimport Button from '../ui/Button';\nimport Transition from '../ui/Transition';\nimport './RightHeader.scss';\nimport { getDayStartAt } from '../../util/dateFormat';\n\ntype OwnProps = {\n chatId?: number;\n isColumnOpen?: boolean;\n isProfile?: boolean;\n isSearch?: boolean;\n isManagement?: boolean;\n isStickerSearch?: boolean;\n isGifSearch?: boolean;\n isPollResults?: boolean;\n isAddingChatMembers?: boolean;\n shouldSkipAnimation?: boolean;\n profileState?: ProfileState;\n managementScreen?: ManagementScreens;\n onClose: () => void;\n};\n\ntype StateProps = {\n canManage?: boolean;\n isChannel?: boolean;\n messageSearchQuery?: string;\n stickerSearchQuery?: string;\n gifSearchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst COLUMN_CLOSE_DELAY_MS = 300;\nconst runDebouncedForSearch = debounce((cb) => cb(), 200, false);\n\nenum HeaderContent {\n Profile,\n MemberList,\n SharedMedia,\n Search,\n Management,\n ManageInitial,\n ManageChannelSubscribers,\n ManageChatAdministrators,\n ManageChatPrivacyType,\n ManageDiscussion,\n ManageGroupPermissions,\n ManageGroupRemovedUsers,\n ManageGroupUserPermissionsCreate,\n ManageGroupUserPermissions,\n ManageGroupRecentActions,\n ManageGroupAdminRights,\n ManageGroupMembers,\n StickerSearch,\n GifSearch,\n PollResults,\n AddingMembers,\n}\n\nconst RightHeader: FC = ({\n isColumnOpen,\n isProfile,\n isSearch,\n isManagement,\n isStickerSearch,\n isGifSearch,\n isPollResults,\n isAddingChatMembers,\n profileState,\n managementScreen,\n canManage,\n isChannel,\n onClose,\n messageSearchQuery,\n stickerSearchQuery,\n gifSearchQuery,\n setLocalTextSearchQuery,\n setStickerSearchQuery,\n setGifSearchQuery,\n searchTextMessagesLocal,\n toggleManagement,\n openHistoryCalendar,\n shouldSkipAnimation,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const backButtonRef = useRef(null);\n\n const handleMessageSearchQueryChange = useCallback((query: string) => {\n setLocalTextSearchQuery({ query });\n\n if (query.length) {\n runDebouncedForSearch(searchTextMessagesLocal);\n }\n }, [searchTextMessagesLocal, setLocalTextSearchQuery]);\n\n const handleStickerSearchQueryChange = useCallback((query: string) => {\n setStickerSearchQuery({ query });\n }, [setStickerSearchQuery]);\n\n const handleGifSearchQueryChange = useCallback((query: string) => {\n setGifSearchQuery({ query });\n }, [setGifSearchQuery]);\n\n const [shouldSkipTransition, setShouldSkipTransition] = useState(!isColumnOpen);\n\n useEffect(() => {\n setTimeout(() => {\n setShouldSkipTransition(!isColumnOpen);\n }, COLUMN_CLOSE_DELAY_MS);\n }, [isColumnOpen]);\n\n const lang = useLang();\n const contentKey = isProfile ? (\n profileState === ProfileState.Profile ? (\n HeaderContent.Profile\n ) : profileState === ProfileState.SharedMedia ? (\n HeaderContent.SharedMedia\n ) : profileState === ProfileState.MemberList ? (\n HeaderContent.MemberList\n ) : -1 // Never reached\n ) : isSearch ? (\n HeaderContent.Search\n ) : isPollResults ? (\n HeaderContent.PollResults\n ) : isStickerSearch ? (\n HeaderContent.StickerSearch\n ) : isGifSearch ? (\n HeaderContent.GifSearch\n ) : isAddingChatMembers ? (\n HeaderContent.AddingMembers\n ) : isManagement ? (\n managementScreen === ManagementScreens.Initial ? (\n HeaderContent.ManageInitial\n ) : managementScreen === ManagementScreens.ChatPrivacyType ? (\n HeaderContent.ManageChatPrivacyType\n ) : managementScreen === ManagementScreens.Discussion ? (\n HeaderContent.ManageDiscussion\n ) : managementScreen === ManagementScreens.ChannelSubscribers ? (\n HeaderContent.ManageChannelSubscribers\n ) : managementScreen === ManagementScreens.GroupPermissions ? (\n HeaderContent.ManageGroupPermissions\n ) : managementScreen === ManagementScreens.ChatAdministrators ? (\n HeaderContent.ManageChatAdministrators\n ) : managementScreen === ManagementScreens.GroupRemovedUsers ? (\n HeaderContent.ManageGroupRemovedUsers\n ) : managementScreen === ManagementScreens.GroupUserPermissionsCreate ? (\n HeaderContent.ManageGroupUserPermissionsCreate\n ) : managementScreen === ManagementScreens.GroupUserPermissions ? (\n HeaderContent.ManageGroupUserPermissions\n ) : managementScreen === ManagementScreens.GroupRecentActions ? (\n HeaderContent.ManageGroupRecentActions\n ) : managementScreen === ManagementScreens.ChatAdminRights ? (\n HeaderContent.ManageGroupAdminRights\n ) : managementScreen === ManagementScreens.GroupMembers ? (\n HeaderContent.ManageGroupMembers\n ) : undefined // Never reached\n ) : undefined; // When column is closed\n\n const renderingContentKey = useCurrentOrPrev(contentKey, true) ?? -1;\n\n function renderHeaderContent() {\n if (renderingContentKey === -1) {\n return undefined;\n }\n\n switch (renderingContentKey) {\n case HeaderContent.PollResults:\n return

{lang('PollResults')}

;\n case HeaderContent.Search:\n return (\n <>\n \n openHistoryCalendar({ selectedAt: getDayStartAt(Date.now()) })}\n ariaLabel=\"Search messages by date\"\n >\n \n \n \n );\n case HeaderContent.AddingMembers:\n return

{lang('GroupAddMembers')}

;\n case HeaderContent.ManageInitial:\n return

{lang('Edit')}

;\n case HeaderContent.ManageChatPrivacyType:\n return

{lang(isChannel ? 'ChannelTypeHeader' : 'GroupTypeHeader')}

;\n case HeaderContent.ManageDiscussion:\n return

{lang('Discussion')}

;\n case HeaderContent.ManageChatAdministrators:\n return

{lang('ChannelAdministrators')}

;\n case HeaderContent.ManageGroupRecentActions:\n return

{lang('Group.Info.AdminLog')}

;\n case HeaderContent.ManageGroupAdminRights:\n return

{lang('EditAdminRights')}

;\n case HeaderContent.ManageGroupPermissions:\n return

{lang('ChannelPermissions')}

;\n case HeaderContent.ManageGroupRemovedUsers:\n return

{lang('ChannelBlockedUsers')}

;\n case HeaderContent.ManageGroupUserPermissionsCreate:\n return

{lang('ChannelAddException')}

;\n case HeaderContent.ManageGroupUserPermissions:\n return

{lang('UserRestrictions')}

;\n case HeaderContent.StickerSearch:\n return (\n \n );\n case HeaderContent.GifSearch:\n return (\n \n );\n case HeaderContent.SharedMedia:\n return

{lang('SharedMedia')}

;\n case HeaderContent.ManageChannelSubscribers:\n return

{lang('ChannelSubscribers')}

;\n case HeaderContent.MemberList:\n case HeaderContent.ManageGroupMembers:\n return

{lang('GroupMembers')}

;\n default:\n return (\n <>\n

Profile

\n
\n {canManage && (\n \n \n \n )}\n
\n \n );\n }\n }\n\n const isBackButton = (\n IS_SINGLE_COLUMN_LAYOUT\n || contentKey === HeaderContent.SharedMedia\n || contentKey === HeaderContent.MemberList\n || contentKey === HeaderContent.AddingMembers\n || isManagement\n );\n\n const buttonClassName = buildClassName(\n 'animated-close-icon',\n (shouldSkipTransition || shouldSkipAnimation) && 'no-transition',\n );\n\n // Add class in the next AF to synchronize with animation with Transition components\n useEffect(() => {\n backButtonRef.current!.classList.toggle('state-back', isBackButton);\n }, [isBackButton]);\n\n return (\n
\n \n
\n \n \n {renderHeaderContent}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, isProfile, isManagement }): StateProps => {\n const { query: messageSearchQuery } = selectCurrentTextSearch(global) || {};\n const { query: stickerSearchQuery } = selectCurrentStickerSearch(global) || {};\n const { query: gifSearchQuery } = selectCurrentGifSearch(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const isChannel = chat && isChatChannel(chat);\n\n const canManage = Boolean(\n !isManagement\n && isProfile\n && chat\n && !selectIsChatWithSelf(global, chat.id)\n // chat.isCreator is for Basic Groups\n && (isChatPrivate(chat.id) || ((isChatAdmin(chat) || chat.isCreator) && !chat.isNotJoined)),\n );\n\n return {\n canManage,\n isChannel,\n messageSearchQuery,\n stickerSearchQuery,\n gifSearchQuery,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'searchTextMessagesLocal',\n 'toggleManagement',\n 'openHistoryCalendar',\n ]),\n)(RightHeader));\n","import { useMemo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiChatMember, ApiMessage, ApiUser } from '../../../api/types';\nimport { ProfileTabType, SharedMediaType } from '../../../types';\n\nimport { MEMBERS_SLICE, MESSAGE_SEARCH_SLICE, SHARED_MEDIA_SLICE } from '../../../config';\nimport { getMessageContentIds, sortUserIds } from '../../../modules/helpers';\nimport useOnChange from '../../../hooks/useOnChange';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\n\nexport default function useProfileViewportIds(\n isRightColumnShown: boolean,\n loadMoreMembers: AnyToVoidFunction,\n searchMessages: AnyToVoidFunction,\n tabType: ProfileTabType,\n mediaSearchType?: SharedMediaType,\n groupChatMembers?: ApiChatMember[],\n usersById?: Record,\n chatMessages?: Record,\n foundIds?: number[],\n chatId?: number,\n lastSyncTime?: number,\n serverTimeOffset = 0,\n) {\n const resultType = tabType === 'members' || !mediaSearchType ? tabType : mediaSearchType;\n\n const memberIds = useMemo(() => {\n if (!groupChatMembers || !usersById) {\n return undefined;\n }\n\n return sortUserIds(groupChatMembers.map(({ userId }) => userId), usersById, undefined, serverTimeOffset);\n }, [groupChatMembers, serverTimeOffset, usersById]);\n\n const [memberViewportIds, getMoreMembers, noProfileInfoForMembers] = useInfiniteScrollForMembers(\n resultType, loadMoreMembers, lastSyncTime, memberIds,\n );\n\n const [mediaViewportIds, getMoreMedia, noProfileInfoForMedia] = useInfiniteScrollForSharedMedia(\n 'media', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [documentViewportIds, getMoreDocuments, noProfileInfoForDocuments] = useInfiniteScrollForSharedMedia(\n 'documents', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [linkViewportIds, getMoreLinks, noProfileInfoForLinks] = useInfiniteScrollForSharedMedia(\n 'links', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [audioViewportIds, getMoreAudio, noProfileInfoForAudio] = useInfiniteScrollForSharedMedia(\n 'audio', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n let viewportIds: number[] | undefined;\n let getMore: AnyToVoidFunction | undefined;\n let noProfileInfo = false;\n\n switch (resultType) {\n case 'members':\n viewportIds = memberViewportIds;\n getMore = getMoreMembers;\n noProfileInfo = noProfileInfoForMembers;\n break;\n case 'media':\n viewportIds = mediaViewportIds;\n getMore = getMoreMedia;\n noProfileInfo = noProfileInfoForMedia;\n break;\n case 'documents':\n viewportIds = documentViewportIds;\n getMore = getMoreDocuments;\n noProfileInfo = noProfileInfoForDocuments;\n break;\n case 'links':\n viewportIds = linkViewportIds;\n getMore = getMoreLinks;\n noProfileInfo = noProfileInfoForLinks;\n break;\n case 'audio':\n viewportIds = audioViewportIds;\n getMore = getMoreAudio;\n noProfileInfo = noProfileInfoForAudio;\n break;\n }\n\n return [resultType, viewportIds, getMore, noProfileInfo] as const;\n}\n\nfunction useInfiniteScrollForMembers(\n currentResultType?: ProfileTabType,\n handleLoadMore?: AnyToVoidFunction,\n lastSyncTime?: number,\n memberIds?: number[],\n) {\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? handleLoadMore : undefined,\n memberIds,\n undefined,\n MEMBERS_SLICE,\n );\n\n const isOnTop = !viewportIds || !memberIds || viewportIds[0] === memberIds[0];\n\n return [viewportIds, getMore, !isOnTop] as const;\n}\n\nfunction useInfiniteScrollForSharedMedia(\n forSharedMediaType: SharedMediaType,\n currentResultType?: ProfileTabType,\n handleLoadMore?: AnyToVoidFunction,\n lastSyncTime?: number,\n chatMessages?: Record,\n foundIds?: number[],\n) {\n const messageIdsRef = useRef();\n\n useOnChange(() => {\n if (currentResultType === forSharedMediaType && chatMessages && foundIds) {\n messageIdsRef.current = getMessageContentIds(\n chatMessages,\n foundIds,\n forSharedMediaType,\n ).reverse();\n }\n }, [chatMessages, foundIds, currentResultType, forSharedMediaType]);\n\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? handleLoadMore : undefined,\n messageIdsRef.current,\n undefined,\n forSharedMediaType === 'media' ? SHARED_MEDIA_SLICE : MESSAGE_SEARCH_SLICE,\n );\n\n const isOnTop = !viewportIds || !messageIdsRef.current || viewportIds[0] === messageIdsRef.current[0];\n\n return [viewportIds, getMore, !isOnTop] as const;\n}\n","import { useCallback, useEffect } from '../../../lib/teact/teact';\n\nimport { ProfileState } from '../../../types';\n\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport { throttle } from '../../../util/schedulers';\nimport useEffectWithPrevDeps from '../../../hooks/useEffectWithPrevDeps';\n\nconst TRANSITION_DURATION = 300;\nconst PROGRAMMATIC_SCROLL_TIMEOUT_MS = 350;\n\nconst runThrottledForScroll = throttle((cb) => cb(), 250, false);\n\nlet isScrollingProgrammatically = false;\n\nexport default function useProfileState(\n containerRef: { current: HTMLDivElement | null },\n tabType: string,\n profileState: ProfileState,\n onProfileStateChange: (state: ProfileState) => void,\n) {\n // Scroll to tabs if needed\n useEffectWithPrevDeps(([prevTabType]) => {\n if (prevTabType && prevTabType !== tabType) {\n const container = containerRef.current!;\n const tabsEl = container.querySelector('.TabList')!;\n if (container.scrollTop < tabsEl.offsetTop) {\n onProfileStateChange(tabType === 'members' ? ProfileState.MemberList : ProfileState.SharedMedia);\n isScrollingProgrammatically = true;\n fastSmoothScroll(container, tabsEl, 'start', undefined, undefined, undefined, TRANSITION_DURATION);\n setTimeout(() => {\n isScrollingProgrammatically = false;\n }, PROGRAMMATIC_SCROLL_TIMEOUT_MS);\n }\n }\n }, [tabType, onProfileStateChange]);\n\n // Scroll to top\n useEffectWithPrevDeps(([prevProfileState]) => {\n if (profileState !== ProfileState.Profile || profileState === prevProfileState) {\n return;\n }\n\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const tabListEl = container.querySelector('.TabList');\n if (!tabListEl || tabListEl.offsetTop > container.scrollTop) {\n return;\n }\n\n isScrollingProgrammatically = true;\n fastSmoothScroll(\n container,\n container.firstElementChild as HTMLElement,\n 'start',\n undefined,\n container.offsetHeight * 2,\n );\n\n setTimeout(() => {\n isScrollingProgrammatically = false;\n }, PROGRAMMATIC_SCROLL_TIMEOUT_MS);\n\n onProfileStateChange(profileState);\n }, [profileState]);\n\n const determineProfileState = useCallback(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const tabListEl = container.querySelector('.TabList');\n if (!tabListEl) {\n return;\n }\n\n let state: ProfileState = ProfileState.Profile;\n if (container.scrollTop >= tabListEl.offsetTop) {\n state = tabType === 'members'\n ? ProfileState.MemberList\n : ProfileState.SharedMedia;\n }\n\n onProfileStateChange(state);\n }, [containerRef, onProfileStateChange, tabType]);\n\n // Determine profile state when switching tabs\n useEffect(() => {\n if (isScrollingProgrammatically) {\n return;\n }\n\n determineProfileState();\n }, [determineProfileState, tabType]);\n\n // Determine profile state when scrolling\n const handleScroll = useCallback(() => {\n if (isScrollingProgrammatically) {\n return;\n }\n\n runThrottledForScroll(determineProfileState);\n }, [determineProfileState]);\n\n return { handleScroll };\n}\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport {\n ApiUser, ApiChat, ApiMediaFormat, ApiPhoto,\n} from '../../api/types';\n\nimport {\n getChatAvatarHash, isDeletedUser, getUserColorKey, getChatTitle, isChatPrivate, getUserFullName,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport buildClassName from '../../util/buildClassName';\nimport { getFirstLetters } from '../../util/textFormat';\nimport useMedia from '../../hooks/useMedia';\nimport useBlurSync from '../../hooks/useBlurSync';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\n\nimport './ProfilePhoto.scss';\n\ntype OwnProps = {\n chat?: ApiChat;\n user?: ApiUser;\n isFirstPhoto?: boolean;\n isSavedMessages?: boolean;\n photo?: ApiPhoto;\n lastSyncTime?: number;\n onClick: NoneToVoidFunction;\n};\n\nconst ProfilePhoto: FC = ({\n chat,\n user,\n photo,\n isFirstPhoto,\n isSavedMessages,\n lastSyncTime,\n onClick,\n}) => {\n const lang = useLang();\n const isDeleted = user && isDeletedUser(user);\n\n function getMediaHash(size: 'normal' | 'big' = 'big', forceAvatar?: boolean) {\n if (photo && !forceAvatar) {\n return `photo${photo.id}?size=c`;\n }\n\n let hash: string | undefined;\n if (!isSavedMessages && !isDeleted) {\n if (user) {\n hash = getChatAvatarHash(user, size);\n } else if (chat) {\n hash = getChatAvatarHash(chat, size);\n }\n }\n\n return hash;\n }\n\n const imageHash = getMediaHash();\n const fullMediaData = useMedia(imageHash, false, ApiMediaFormat.BlobUrl, lastSyncTime);\n const avatarThumbnailData = useMedia(\n !fullMediaData && isFirstPhoto ? getMediaHash('normal', true) : undefined,\n false,\n ApiMediaFormat.BlobUrl,\n lastSyncTime,\n );\n const thumbDataUri = useBlurSync(!fullMediaData && photo && photo.thumbnail && photo.thumbnail.dataUri);\n const imageSrc = fullMediaData || avatarThumbnailData || thumbDataUri;\n const prevImageSrc = usePrevious(imageSrc);\n\n let content: string | undefined = '';\n\n if (isSavedMessages) {\n content = ;\n } else if (isDeleted) {\n content = ;\n } else if (imageSrc) {\n content = \"\";\n } else if (!imageSrc && user) {\n const userFullName = getUserFullName(user);\n content = userFullName ? getFirstLetters(userFullName, 2) : undefined;\n } else if (!imageSrc && chat) {\n const title = getChatTitle(lang, chat);\n content = title && getFirstLetters(title, isChatPrivate(chat.id) ? 2 : 1);\n } else {\n content = (\n
\n \n
\n );\n }\n\n const fullClassName = buildClassName(\n 'ProfilePhoto',\n `color-bg-${getUserColorKey(user || chat)}`,\n isSavedMessages && 'saved-messages',\n isDeleted && 'deleted-account',\n (!isSavedMessages && !(imageSrc)) && 'no-photo',\n );\n\n return (\n
\n {prevImageSrc && imageSrc && prevImageSrc !== imageSrc && (\n \"\"\n )}\n {typeof content === 'string' ? renderText(content, ['hq_emoji']) : content}\n
\n );\n};\n\nexport default memo(ProfilePhoto);\n","import React, {\n FC, useEffect, useCallback, memo, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiChat } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { selectChat, selectUser } from '../../modules/selectors';\nimport {\n getUserFullName, getUserStatus, isChatChannel, isUserOnline,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport usePhotosPreload from './hooks/usePhotosPreload';\nimport useLang from '../../hooks/useLang';\n\nimport VerifiedIcon from '../common/VerifiedIcon';\nimport ProfilePhoto from './ProfilePhoto';\nimport Transition from '../ui/Transition';\n\nimport './ProfileInfo.scss';\n\ntype OwnProps = {\n userId: number;\n forceShowSelf?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat?: ApiChat;\n isSavedMessages?: boolean;\n animationLevel: 0 | 1 | 2;\n serverTimeOffset: number;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst PrivateChatInfo: FC = ({\n user,\n chat,\n isSavedMessages,\n lastSyncTime,\n animationLevel,\n loadFullUser,\n openMediaViewer,\n serverTimeOffset,\n}) => {\n const { id: userId } = user || {};\n const { id: chatId } = chat || {};\n const fullName = user ? getUserFullName(user) : (chat ? chat.title : '');\n const photos = (user ? user.photos : (chat ? chat.photos : undefined)) || [];\n const slideAnimation = animationLevel >= 1 ? 'slide' : 'none';\n\n const [currentPhotoIndex, setCurrentPhotoIndex] = useState(0);\n const isFirst = isSavedMessages || photos.length <= 1 || currentPhotoIndex === 0;\n const isLast = isSavedMessages || photos.length <= 1 || currentPhotoIndex === photos.length - 1;\n\n // Deleting the last profile photo may result in an error\n useEffect(() => {\n if (currentPhotoIndex > photos.length) {\n setCurrentPhotoIndex(Math.max(0, photos.length - 1));\n }\n }, [currentPhotoIndex, photos.length]);\n\n const lang = useLang();\n\n useEffect(() => {\n if (lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [userId, loadFullUser, lastSyncTime]);\n\n usePhotosPreload(user || chat, photos, currentPhotoIndex);\n\n const handleProfilePhotoClick = useCallback(() => {\n openMediaViewer({\n avatarOwnerId: userId || chatId,\n profilePhotoIndex: currentPhotoIndex,\n origin: MediaViewerOrigin.ProfileAvatar,\n });\n }, [openMediaViewer, userId, chatId, currentPhotoIndex]);\n\n const selectPreviousMedia = useCallback(() => {\n if (isFirst) {\n return;\n }\n\n setCurrentPhotoIndex(currentPhotoIndex - 1);\n }, [currentPhotoIndex, isFirst]);\n\n const selectNextMedia = useCallback(() => {\n if (isLast) {\n return;\n }\n\n setCurrentPhotoIndex(currentPhotoIndex + 1);\n }, [currentPhotoIndex, isLast]);\n\n // Support for swipe gestures and closing on click\n useEffect(() => {\n const element = document.querySelector('.photo-wrapper');\n if (!element) {\n return undefined;\n }\n\n return captureEvents(element, {\n onSwipe: IS_TOUCH_ENV ? (e, direction) => {\n if (direction === SwipeDirection.Right) {\n selectPreviousMedia();\n } else if (direction === SwipeDirection.Left) {\n selectNextMedia();\n }\n } : undefined,\n });\n }, [selectNextMedia, selectPreviousMedia]);\n\n if (!user && !chat) {\n return undefined;\n }\n\n function renderPhotoTabs() {\n if (isSavedMessages || !photos || photos.length <= 1) {\n return undefined;\n }\n\n return (\n
\n {photos.map((_, i) => (\n \n ))}\n
\n );\n }\n\n function renderPhoto() {\n const photo = !isSavedMessages && photos && photos.length > 0 ? photos[currentPhotoIndex] : undefined;\n\n return (\n \n );\n }\n\n function renderStatus() {\n if (user) {\n return (\n
\n {getUserStatus(lang, user, serverTimeOffset)}\n
\n );\n }\n\n return (\n {\n isChatChannel(chat!)\n ? lang('Subscribers', chat!.membersCount, 'i')\n : lang('Members', chat!.membersCount, 'i')\n }\n \n );\n }\n\n const isVerifiedIconShown = (user && user.isVerified) || (chat && chat.isVerified);\n\n return (\n
\n
\n {renderPhotoTabs()}\n \n {renderPhoto}\n \n\n {!isFirst && (\n \n )}\n {!isLast && (\n \n )}\n
\n\n
\n {isSavedMessages ? (\n
\n

{lang('SavedMessages')}

\n
\n ) : (\n
\n

{fullName && renderText(fullName)}

\n {isVerifiedIconShown && }\n
\n )}\n {!isSavedMessages && renderStatus()}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId, forceShowSelf }): StateProps => {\n const { lastSyncTime, serverTimeOffset } = global;\n const user = selectUser(global, userId);\n const chat = selectChat(global, userId);\n const isSavedMessages = !forceShowSelf && user && user.isSelf;\n const { animationLevel } = global.settings.byKey;\n\n return {\n lastSyncTime, user, chat, isSavedMessages, animationLevel, serverTimeOffset,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullUser', 'openMediaViewer']),\n)(PrivateChatInfo));\n","import {\n ApiChat, ApiMediaFormat, ApiPhoto, ApiUser,\n} from '../../../api/types';\nimport { useEffect } from '../../../lib/teact/teact';\nimport * as mediaLoader from '../../../util/mediaLoader';\n\nconst PHOTOS_TO_PRELOAD = 4;\n\nexport default function usePhotosPreload(\n profile: ApiUser | ApiChat | undefined,\n photos: ApiPhoto[],\n currentIndex: number,\n) {\n useEffect(() => {\n photos.slice(currentIndex, currentIndex + PHOTOS_TO_PRELOAD).forEach((photo) => {\n const mediaData = mediaLoader.getFromMemory(`photo${photo.id}?size=c`);\n if (!mediaData) {\n mediaLoader.fetch(`photo${photo.id}?size=c`, ApiMediaFormat.BlobUrl);\n }\n });\n }, [currentIndex, photos]);\n}\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport {\n selectChat, selectNotifyExceptions, selectNotifySettings, selectUser,\n} from '../../modules/selectors';\nimport {\n getChatDescription, getChatLink, getHasAdminRight, isChatChannel, isChatPrivate, isUserRightBanned, selectIsChatMuted,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport { copyTextToClipboard } from '../../util/clipboard';\nimport { formatPhoneNumberWithCode } from '../../util/phoneNumber';\nimport useLang from '../../hooks/useLang';\n\nimport ListItem from '../ui/ListItem';\nimport Switcher from '../ui/Switcher';\n\ntype OwnProps = {\n chatOrUserId: number;\n forceShowSelf?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat?: ApiChat;\n canInviteUsers?: boolean;\n isMuted?: boolean;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst ChatExtra: FC = ({\n lastSyncTime,\n user,\n chat,\n forceShowSelf,\n canInviteUsers,\n isMuted,\n loadFullUser,\n showNotification,\n updateChatMutedState,\n}) => {\n const {\n id: userId,\n fullInfo,\n username,\n phoneNumber,\n isSelf,\n } = user || {};\n const { id: chatId } = chat || {};\n const lang = useLang();\n\n useEffect(() => {\n if (lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [loadFullUser, userId, lastSyncTime]);\n\n const handleNotificationChange = useCallback(() => {\n updateChatMutedState({ chatId, isMuted: !isMuted });\n }, [chatId, isMuted, updateChatMutedState]);\n\n if (!chat || chat.isRestricted || (isSelf && !forceShowSelf)) {\n return undefined;\n }\n\n function copy(text: string, entity: string) {\n copyTextToClipboard(text);\n showNotification({ message: `${entity} was copied` });\n }\n\n const formattedNumber = phoneNumber && formatPhoneNumberWithCode(phoneNumber);\n const link = getChatLink(chat);\n const description = (fullInfo && fullInfo.bio) || getChatDescription(chat);\n\n return (\n
\n {formattedNumber && !!formattedNumber.length && (\n copy(formattedNumber, lang('Phone'))}>\n {formattedNumber}\n {lang('Phone')}\n \n )}\n {username && (\n copy(`@${username}`, lang('Username'))}\n >\n {renderText(username)}\n {lang('Username')}\n \n )}\n {description && !!description.length && (\n \n \n {renderText(description, ['br', 'links', 'emoji'])}\n \n {lang(userId ? 'UserBio' : 'Info')}\n \n )}\n {(canInviteUsers || !username) && link && (\n copy(link, lang('SetUrlPlaceholder'))}>\n
{link}
\n {lang('SetUrlPlaceholder')}\n
\n )}\n \n {lang('Notifications')}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatOrUserId }): StateProps => {\n const { lastSyncTime } = global;\n\n const chat = chatOrUserId ? selectChat(global, chatOrUserId) : undefined;\n const user = isChatPrivate(chatOrUserId) ? selectUser(global, chatOrUserId) : undefined;\n const isMuted = chat && selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global));\n\n const canInviteUsers = chat && !user && (\n (!isChatChannel(chat) && !isUserRightBanned(chat, 'inviteUsers'))\n || getHasAdminRight(chat, 'inviteUsers')\n );\n\n return {\n lastSyncTime, chat, user, canInviteUsers, isMuted,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadFullUser', 'updateChatMutedState', 'showNotification',\n ]),\n)(ChatExtra));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport { selectCurrentChat, selectUser } from '../../modules/selectors';\nimport { getUserFirstOrLastName } from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n userId?: number;\n onClose: () => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n contactName?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteMemberModal: FC = ({\n isOpen,\n chat,\n userId,\n contactName,\n onClose,\n deleteChatMember,\n}) => {\n const lang = useLang();\n\n const handleDeleteChatMember = useCallback(() => {\n deleteChatMember({ chatId: chat!.id, userId });\n onClose();\n }, [chat, deleteChatMember, onClose, userId]);\n\n if (!chat || !userId) {\n return undefined;\n }\n\n return (\n \n

{renderText(lang('PeerInfo.Confirm.RemovePeer', contactName))}

\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { userId }): StateProps => {\n const chat = selectCurrentChat(global);\n const user = userId && selectUser(global, userId);\n const contactName = user ? getUserFirstOrLastName(user) : undefined;\n\n return {\n chat,\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['deleteChatMember']),\n)(DeleteMemberModal));\n","import React, {\n FC, useCallback, useEffect, useMemo, useRef, useState, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiMessage,\n ApiChatMember,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport {\n NewChatMembersProgress, ISettings, MediaViewerOrigin, ProfileState, ProfileTabType, SharedMediaType,\n} from '../../types';\n\nimport {\n MEMBERS_SLICE,\n PROFILE_SENSITIVE_AREA,\n SHARED_MEDIA_SLICE,\n SLIDE_TRANSITION_DURATION,\n} from '../../config';\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport {\n getHasAdminRight, isChatAdmin, isChatChannel, isChatGroup, isChatPrivate,\n} from '../../modules/helpers';\nimport {\n selectChatMessages,\n selectChat,\n selectCurrentMediaSearch,\n selectIsRightColumnShown,\n selectTheme,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport useCacheBuster from '../../hooks/useCacheBuster';\nimport useProfileViewportIds from './hooks/useProfileViewportIds';\nimport useProfileState from './hooks/useProfileState';\nimport useTransitionFixes from './hooks/useTransitionFixes';\nimport useAsyncRendering from './hooks/useAsyncRendering';\nimport useLang from '../../hooks/useLang';\n\nimport Transition from '../ui/Transition';\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport TabList from '../ui/TabList';\nimport Spinner from '../ui/Spinner';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport ProfileInfo from './ProfileInfo';\nimport Document from '../common/Document';\nimport Audio from '../common/Audio';\nimport ChatExtra from './ChatExtra';\nimport Media from '../common/Media';\nimport WebLink from '../common/WebLink';\nimport NothingFound from '../common/NothingFound';\nimport FloatingActionButton from '../ui/FloatingActionButton';\nimport DeleteMemberModal from './DeleteMemberModal';\n\nimport './Profile.scss';\n\ntype OwnProps = {\n chatId: number;\n userId?: number;\n profileState: ProfileState;\n onProfileStateChange: (state: ProfileState) => void;\n};\n\ntype StateProps = {\n theme: ISettings['theme'];\n isChannel?: boolean;\n currentUserId?: number;\n resolvedUserId?: number;\n chatMessages?: Record;\n foundIds?: number[];\n mediaSearchType?: SharedMediaType;\n hasMembersTab?: boolean;\n areMembersHidden?: boolean;\n canAddMembers?: boolean;\n canDeleteMembers?: boolean;\n members?: ApiChatMember[];\n usersById?: Record;\n isRightColumnShown: boolean;\n isRestricted?: boolean;\n lastSyncTime?: number;\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst TABS = [\n { type: 'media', title: 'SharedMediaTab2' },\n { type: 'documents', title: 'SharedFilesTab2' },\n { type: 'links', title: 'SharedLinksTab2' },\n { type: 'audio', title: 'SharedMusicTab2' },\n];\n\nconst HIDDEN_RENDER_DELAY = 1000;\n\nconst Profile: FC = ({\n chatId,\n profileState,\n onProfileStateChange,\n theme,\n isChannel,\n resolvedUserId,\n currentUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasMembersTab,\n areMembersHidden,\n canAddMembers,\n canDeleteMembers,\n members,\n usersById,\n isRightColumnShown,\n isRestricted,\n lastSyncTime,\n setLocalMediaSearchType,\n loadMoreMembers,\n searchMediaMessagesLocal,\n openMediaViewer,\n openAudioPlayer,\n openUserInfo,\n focusMessage,\n loadProfilePhotos,\n setNewChatMembersDialogState,\n serverTimeOffset,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const transitionRef = useRef(null);\n const lang = useLang();\n const [activeTab, setActiveTab] = useState(0);\n const [deletingUserId, setDeletingUserId] = useState();\n\n const tabs = useMemo(() => ([\n ...(hasMembersTab ? [{\n type: 'members', title: isChannel ? 'ChannelSubscribers' : 'GroupMembers',\n }] : []),\n ...TABS,\n ]), [hasMembersTab, isChannel]);\n const tabType = tabs[activeTab].type as ProfileTabType;\n\n const [resultType, viewportIds, getMore, noProfileInfo] = useProfileViewportIds(\n isRightColumnShown, loadMoreMembers, searchMediaMessagesLocal, tabType, mediaSearchType, members,\n usersById, chatMessages, foundIds, chatId, lastSyncTime, serverTimeOffset,\n );\n const activeKey = tabs.findIndex(({ type }) => type === resultType);\n\n const { handleScroll } = useProfileState(containerRef, tabType, profileState, onProfileStateChange);\n\n const { applyTransitionFix, releaseTransitionFix } = useTransitionFixes(containerRef);\n\n const [cacheBuster, resetCacheBuster] = useCacheBuster();\n\n const handleTransitionStop = useCallback(() => {\n releaseTransitionFix();\n resetCacheBuster();\n }, [releaseTransitionFix, resetCacheBuster]);\n\n const handleNewMemberDialogOpen = useCallback(() => {\n setNewChatMembersDialogState(NewChatMembersProgress.InProgress);\n }, [setNewChatMembersDialogState]);\n\n // Update search type when switching tabs\n useEffect(() => {\n setLocalMediaSearchType({ mediaType: tabType });\n }, [setLocalMediaSearchType, tabType]);\n\n const profileId = resolvedUserId || chatId;\n\n useEffect(() => {\n if (lastSyncTime) {\n loadProfilePhotos({ profileId });\n }\n }, [loadProfilePhotos, profileId, lastSyncTime]);\n\n const handleSelectMedia = useCallback((messageId: number) => {\n openMediaViewer({\n chatId: profileId,\n threadId: MAIN_THREAD_ID,\n messageId,\n origin: MediaViewerOrigin.SharedMedia,\n });\n }, [profileId, openMediaViewer]);\n\n const handlePlayAudio = useCallback((messageId: number) => {\n openAudioPlayer({ chatId: profileId, messageId });\n }, [profileId, openAudioPlayer]);\n\n const handleMemberClick = useCallback((id: number) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n const handleMessageFocus = useCallback((messageId: number) => {\n focusMessage({ chatId: profileId, messageId });\n }, [profileId, focusMessage]);\n\n const handleDeleteMembersModalClose = useCallback(() => {\n setDeletingUserId(undefined);\n }, []);\n\n useEffect(() => {\n if (!transitionRef.current || !IS_TOUCH_ENV) {\n return undefined;\n }\n\n return captureEvents(transitionRef.current, {\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n setActiveTab(Math.min(activeTab + 1, tabs.length - 1));\n } else if (direction === SwipeDirection.Right) {\n setActiveTab(Math.max(0, activeTab - 1));\n }\n }),\n });\n }, [activeTab, tabs.length]);\n\n let renderingDelay;\n const isFirstTab = resultType === 'members' || (!hasMembersTab && resultType === 'media');\n // @optimization Used to unparallelize rendering of message list and profile media\n if (isFirstTab) {\n renderingDelay = !isRightColumnShown ? HIDDEN_RENDER_DELAY : 0;\n // @optimization Used to delay first render of secondary tabs while animating\n } else if (!viewportIds) {\n renderingDelay = SLIDE_TRANSITION_DURATION;\n }\n const canRenderContents = useAsyncRendering([chatId, resultType], renderingDelay);\n\n function getMemberContextAction(id: number) {\n return id === currentUserId || !canDeleteMembers ? undefined : [{\n title: lang('lng_context_remove_from_group'),\n icon: 'stop',\n handler: () => {\n setDeletingUserId(id);\n },\n }];\n }\n\n function renderSharedMedia() {\n if (!viewportIds || !canRenderContents || !chatMessages) {\n // This is just a single-frame delay, so we do not show spinner\n const noSpinner = isFirstTab && viewportIds && !canRenderContents;\n\n return (\n
\n {!noSpinner && }\n
\n );\n }\n\n if (!viewportIds.length) {\n let text: string;\n\n switch (resultType) {\n case 'members':\n text = areMembersHidden ? 'You have no access to group members list.' : 'No members found';\n break;\n case 'documents':\n text = lang('lng_media_file_empty_search');\n break;\n case 'links':\n text = lang('lng_media_link_empty_search');\n break;\n case 'audio':\n text = lang('lng_media_song_empty_search');\n break;\n default:\n text = lang('SharedMedia.EmptyTitle');\n }\n\n return (\n
\n \n
\n );\n }\n\n return (\n \n {resultType === 'media' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'documents' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'links' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'audio' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'members' ? (\n viewportIds!.map((id, i) => (\n handleMemberClick(id)}\n contextActions={getMemberContextAction(id)}\n >\n \n \n ))\n ) : undefined}\n
\n );\n }\n\n return (\n \n {!noProfileInfo && renderProfileInfo(chatId, resolvedUserId)}\n {!isRestricted && (\n \n \n {renderSharedMedia}\n \n \n\n
\n )}\n\n {canAddMembers && (\n \n \n \n )}\n {canDeleteMembers && (\n \n )}\n \n );\n};\n\nfunction renderProfileInfo(chatId: number, resolvedUserId?: number) {\n return (\n
\n \n \n
\n );\n}\n\nfunction buildInfiniteScrollItemSelector(resultType: string) {\n return [\n // Used on first render\n `.shared-media-transition > div:only-child > .${resultType}-list > .scroll-item`,\n // Used after transition\n `.shared-media-transition > div.active > .${resultType}-list > .scroll-item`,\n ].join(', ');\n}\n\nexport default memo(withGlobal(\n (global, { chatId, userId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n const chatMessages = selectChatMessages(global, userId || chatId);\n const { currentType: mediaSearchType, resultsByType } = selectCurrentMediaSearch(global) || {};\n const { foundIds } = (resultsByType && mediaSearchType && resultsByType[mediaSearchType]) || {};\n\n const { byId: usersById } = global.users;\n\n const isGroup = chat && isChatGroup(chat);\n const isChannel = chat && isChatChannel(chat);\n const hasMembersTab = isGroup || (isChannel && isChatAdmin(chat!));\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const areMembersHidden = hasMembersTab && chat && chat.fullInfo && !chat.fullInfo.canViewMembers;\n const canAddMembers = hasMembersTab && chat && (getHasAdminRight(chat, 'inviteUsers') || chat.isCreator);\n const canDeleteMembers = hasMembersTab && chat && (getHasAdminRight(chat, 'banUsers') || chat.isCreator);\n\n let resolvedUserId;\n if (userId) {\n resolvedUserId = userId;\n } else if (isChatPrivate(chatId)) {\n resolvedUserId = chatId;\n }\n\n return {\n theme: selectTheme(global),\n isChannel,\n resolvedUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasMembersTab,\n areMembersHidden,\n canAddMembers,\n canDeleteMembers,\n currentUserId: global.currentUserId,\n isRightColumnShown: selectIsRightColumnShown(global),\n isRestricted: chat && chat.isRestricted,\n lastSyncTime: global.lastSyncTime,\n serverTimeOffset: global.serverTimeOffset,\n ...(hasMembersTab && members && {\n members,\n usersById,\n }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalMediaSearchType',\n 'loadMoreMembers',\n 'searchMediaMessagesLocal',\n 'openMediaViewer',\n 'openAudioPlayer',\n 'openUserInfo',\n 'focusMessage',\n 'loadProfilePhotos',\n 'setNewChatMembersDialogState',\n ]),\n)(Profile));\n","import { useCallback, useEffect } from '../../../lib/teact/teact';\n\nexport default function useTransitionFixes(\n containerRef: { current: HTMLDivElement | null },\n transitionElSelector = '.Transition.shared-media-transition',\n) {\n // Set `min-height` for shared media container to prevent jumping when switching tabs\n useEffect(() => {\n function setMinHeight() {\n const container = containerRef.current!;\n const transitionEl = container.querySelector(transitionElSelector);\n const tabsEl = container.querySelector('.TabList');\n if (transitionEl && tabsEl) {\n transitionEl.style.minHeight = `${container.offsetHeight - tabsEl.offsetHeight}px`;\n }\n }\n\n setMinHeight();\n\n window.addEventListener('resize', setMinHeight, false);\n\n return () => {\n window.removeEventListener('resize', setMinHeight, false);\n };\n }, [containerRef, transitionElSelector]);\n\n // Workaround for scrollable content flickering during animation.\n const applyTransitionFix = useCallback(() => {\n const container = containerRef.current!;\n if (container.style.overflowY !== 'hidden') {\n const scrollBarWidth = container.offsetWidth - container.clientWidth;\n container.style.overflowY = 'hidden';\n container.style.marginRight = `${scrollBarWidth}px`;\n }\n }, [containerRef]);\n\n const releaseTransitionFix = useCallback(() => {\n const container = containerRef.current!;\n container.style.overflowY = 'scroll';\n container.style.marginRight = '0';\n }, [containerRef]);\n\n return { applyTransitionFix, releaseTransitionFix };\n}\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default () => {\n const [cacheBuster, setCacheBuster] = useState(false);\n\n const updateCacheBuster = useCallback(() => {\n setCacheBuster((current) => !current);\n }, []);\n\n return [cacheBuster, updateCacheBuster] as const;\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './RightSearch';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst RightSearchAsync: FC = (props) => {\n const RightSearch = useModuleLoader(Bundles.Extra, 'RightSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return RightSearch ? : ;\n};\n\nexport default memo(RightSearchAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './Management';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nimport Loading from '../../ui/Loading';\n\nconst ManagementAsync: FC = (props) => {\n const Management = useModuleLoader(Bundles.Extra, 'Management');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Management ? : ;\n};\n\nexport default memo(ManagementAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst StickerSearchAsync: FC = () => {\n const StickerSearch = useModuleLoader(Bundles.Extra, 'StickerSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerSearch ? : ;\n};\n\nexport default memo(StickerSearchAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst GifSearchAsync: FC = () => {\n const GifSearch = useModuleLoader(Bundles.Extra, 'GifSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return GifSearch ? : ;\n};\n\nexport default memo(GifSearchAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst PollResultsAsync: FC = () => {\n const PollResults = useModuleLoader(Bundles.Extra, 'PollResults');\n\n return PollResults ? : ;\n};\n\nexport default memo(PollResultsAsync);\n","import React, {\n FC, useCallback, useMemo, memo, useState, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiChat, ApiChatMember, ApiUpdateConnectionStateType, ApiUser,\n} from '../../api/types';\nimport { NewChatMembersProgress } from '../../types';\n\nimport { pick, unique } from '../../util/iteratees';\nimport { selectChat } from '../../modules/selectors';\nimport searchWords from '../../util/searchWords';\nimport {\n getUserFullName, isChatChannel, isUserBot, sortChatIds,\n} from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport usePrevious from '../../hooks/usePrevious';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Picker from '../common/Picker';\nimport FloatingActionButton from '../ui/FloatingActionButton';\nimport Spinner from '../ui/Spinner';\n\nimport './AddChatMembers.scss';\n\nexport type OwnProps = {\n chatId: number;\n isActive: boolean;\n onNextStep: (memberIds: number[]) => void;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n connectionState?: ApiUpdateConnectionStateType;\n isChannel?: boolean;\n members?: ApiChatMember[];\n currentUserId?: number;\n usersById: Record;\n chatsById: Record;\n localContactIds?: number[];\n searchQuery?: string;\n isLoading: boolean;\n isSearching?: boolean;\n localUserIds?: number[];\n globalUserIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst AddChatMembers: FC = ({\n isChannel,\n connectionState,\n members,\n onNextStep,\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n isLoading,\n searchQuery,\n isSearching,\n localUserIds,\n globalUserIds,\n setUserSearchQuery,\n onClose,\n isActive,\n loadContactList,\n}) => {\n const lang = useLang();\n const [selectedMemberIds, setSelectedMemberIds] = useState([]);\n const prevSelectedMemberIds = usePrevious(selectedMemberIds);\n const noPickerScrollRestore = prevSelectedMemberIds === selectedMemberIds;\n\n useEffect(() => {\n if (isActive && connectionState === 'connectionStateReady') {\n loadContactList();\n }\n }, [connectionState, isActive, loadContactList]);\n\n useHistoryBack(isActive, onClose);\n\n const memberIds = useMemo(() => {\n return members ? members.map((member) => member.userId) : [];\n }, [members]);\n\n const handleFilterChange = useCallback((query: string) => {\n setUserSearchQuery({ query });\n }, [setUserSearchQuery]);\n\n const displayedIds = useMemo(() => {\n const contactIds = localContactIds\n ? sortChatIds(localContactIds.filter((id) => id !== currentUserId), chatsById)\n : [];\n\n if (!searchQuery) {\n return contactIds.filter((id) => !memberIds.includes(id));\n }\n\n const foundContactIds = contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, searchQuery);\n });\n\n return sortChatIds(\n unique([\n ...foundContactIds,\n ...(localUserIds || []),\n ...(globalUserIds || []),\n ]).filter((contactId) => {\n const user = usersById[contactId];\n\n // The user can be added to the chat if the following conditions are met:\n // the user has not yet been added to the current chat\n // AND (it is not found (user from global search) OR it is not a bot OR it is a bot,\n // but the current chat is not a channel AND the appropriate permission is set).\n return !memberIds.includes(contactId)\n && (!user || !isUserBot(user) || (!isChannel && user.canBeInvitedToGroup));\n }),\n chatsById,\n );\n }, [\n localContactIds, chatsById, searchQuery, localUserIds, globalUserIds,\n currentUserId, usersById, memberIds, isChannel,\n ]);\n\n const handleNextStep = useCallback(() => {\n if (selectedMemberIds.length) {\n setUserSearchQuery({ query: '' });\n onNextStep(selectedMemberIds);\n }\n }, [selectedMemberIds, setUserSearchQuery, onNextStep]);\n\n return (\n
\n
\n \n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { userIds: localContactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n const { currentUserId, newChatMembersProgress, connectionState } = global;\n const isChannel = chat && isChatChannel(chat);\n\n const {\n query: searchQuery,\n fetchingStatus,\n globalUserIds,\n localUserIds,\n } = global.userSearch;\n\n return {\n isChannel,\n members: chat && chat.fullInfo ? chat.fullInfo.members : undefined,\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching: fetchingStatus,\n isLoading: newChatMembersProgress === NewChatMembersProgress.Loading,\n globalUserIds,\n localUserIds,\n connectionState,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'setUserSearchQuery']),\n)(AddChatMembers));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ManagementScreens, NewChatMembersProgress, ProfileState, RightColumnContent,\n} from '../../types';\n\nimport { MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN } from '../../config';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\nimport {\n selectAreActiveChatsLoaded,\n selectCurrentMessageList,\n selectRightColumnContentKey,\n} from '../../modules/selectors';\nimport useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport RightHeader from './RightHeader';\nimport Profile from './Profile';\nimport Transition from '../ui/Transition';\nimport RightSearch from './RightSearch.async';\nimport Management from './management/Management.async';\nimport StickerSearch from './StickerSearch.async';\nimport GifSearch from './GifSearch.async';\nimport PollResults from './PollResults.async';\nimport AddChatMembers from './AddChatMembers';\n\nimport './RightColumn.scss';\n\ntype StateProps = {\n contentKey?: RightColumnContent;\n chatId?: number;\n threadId?: number;\n currentProfileUserId?: number;\n isChatSelected: boolean;\n shouldSkipHistoryAnimations?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst COLUMN_CLOSE_DELAY_MS = 300;\nconst MAIN_SCREENS_COUNT = Object.keys(RightColumnContent).length / 2;\nconst MANAGEMENT_SCREENS_COUNT = Object.keys(ManagementScreens).length / 2;\n\nfunction blurSearchInput() {\n const searchInput = document.querySelector('.RightHeader .SearchInput input') as HTMLInputElement;\n if (searchInput) {\n searchInput.blur();\n }\n}\n\nconst RightColumn: FC = ({\n contentKey,\n chatId,\n threadId,\n currentProfileUserId,\n isChatSelected,\n toggleChatInfo,\n toggleManagement,\n openUserInfo,\n closeLocalTextSearch,\n setStickerSearchQuery,\n setGifSearchQuery,\n closePollResults,\n addChatMembers,\n setNewChatMembersDialogState,\n shouldSkipHistoryAnimations,\n}) => {\n const { width: windowWidth } = useWindowSize();\n const [profileState, setProfileState] = useState(ProfileState.Profile);\n const [managementScreen, setManagementScreen] = useState(ManagementScreens.Initial);\n const [selectedChatMemberId, setSelectedChatMemberId] = useState();\n const [isPromotedByCurrentUser, setIsPromotedByCurrentUser] = useState();\n const isScrolledDown = profileState !== ProfileState.Profile;\n\n const isOpen = contentKey !== undefined;\n const isProfile = contentKey === RightColumnContent.ChatInfo || contentKey === RightColumnContent.UserInfo;\n const isSearch = contentKey === RightColumnContent.Search;\n const isManagement = contentKey === RightColumnContent.Management;\n const isStickerSearch = contentKey === RightColumnContent.StickerSearch;\n const isGifSearch = contentKey === RightColumnContent.GifSearch;\n const isPollResults = contentKey === RightColumnContent.PollResults;\n const isAddingChatMembers = contentKey === RightColumnContent.AddingMembers;\n const isOverlaying = windowWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN;\n\n const [shouldSkipTransition, setShouldSkipTransition] = useState(!isOpen);\n\n const renderingContentKey = useCurrentOrPrev(contentKey, true, !isChatSelected) ?? -1;\n\n const close = useCallback((shouldScrollUp = true) => {\n switch (contentKey) {\n case RightColumnContent.AddingMembers:\n setNewChatMembersDialogState(NewChatMembersProgress.Closed);\n break;\n case RightColumnContent.ChatInfo:\n if (isScrolledDown && shouldScrollUp) {\n setProfileState(ProfileState.Profile);\n break;\n }\n toggleChatInfo(undefined, true);\n break;\n case RightColumnContent.UserInfo:\n if (isScrolledDown && shouldScrollUp) {\n setProfileState(ProfileState.Profile);\n break;\n }\n openUserInfo({ id: undefined }, true);\n break;\n case RightColumnContent.Management: {\n switch (managementScreen) {\n case ManagementScreens.Initial:\n toggleManagement();\n break;\n case ManagementScreens.ChatPrivacyType:\n case ManagementScreens.Discussion:\n case ManagementScreens.GroupPermissions:\n case ManagementScreens.GroupType:\n case ManagementScreens.ChatAdministrators:\n case ManagementScreens.ChannelSubscribers:\n case ManagementScreens.GroupMembers:\n setManagementScreen(ManagementScreens.Initial);\n break;\n case ManagementScreens.GroupUserPermissionsCreate:\n case ManagementScreens.GroupRemovedUsers:\n case ManagementScreens.GroupUserPermissions:\n setManagementScreen(ManagementScreens.GroupPermissions);\n setSelectedChatMemberId(undefined);\n setIsPromotedByCurrentUser(undefined);\n break;\n case ManagementScreens.ChatAdminRights:\n case ManagementScreens.GroupRecentActions:\n setManagementScreen(ManagementScreens.ChatAdministrators);\n break;\n }\n\n break;\n }\n case RightColumnContent.Search: {\n blurSearchInput();\n closeLocalTextSearch();\n break;\n }\n case RightColumnContent.StickerSearch:\n blurSearchInput();\n setStickerSearchQuery({ query: undefined });\n break;\n case RightColumnContent.GifSearch: {\n blurSearchInput();\n setGifSearchQuery({ query: undefined });\n break;\n }\n case RightColumnContent.PollResults:\n closePollResults();\n break;\n }\n }, [\n contentKey, isScrolledDown, toggleChatInfo, openUserInfo, closePollResults, setNewChatMembersDialogState,\n managementScreen, toggleManagement, closeLocalTextSearch, setStickerSearchQuery, setGifSearchQuery,\n ]);\n\n const handleSelectChatMember = useCallback((memberId, isPromoted) => {\n setSelectedChatMemberId(memberId);\n setIsPromotedByCurrentUser(isPromoted);\n }, []);\n\n const handleAppendingChatMembers = useCallback((memberIds: number[]) => {\n addChatMembers({ chatId, memberIds });\n }, [addChatMembers, chatId]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(close) : undefined), [isOpen, close]);\n\n useEffect(() => {\n setTimeout(() => {\n setShouldSkipTransition(!isOpen);\n }, COLUMN_CLOSE_DELAY_MS);\n }, [isOpen]);\n\n // Close Right Column when it transforms into overlayed state on screen resize\n useEffect(() => {\n if (isOpen && isOverlaying) {\n close();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOverlaying]);\n\n // We need to clear profile state and management screen state, when changing chats\n useLayoutEffectWithPrevDeps(([prevContentKey, prevChatId]) => {\n if (\n (prevContentKey === RightColumnContent.ChatInfo && contentKey === RightColumnContent.UserInfo)\n || (prevContentKey === RightColumnContent.UserInfo && contentKey === RightColumnContent.ChatInfo)\n || (prevChatId !== chatId)\n ) {\n setProfileState(ProfileState.Profile);\n setManagementScreen(ManagementScreens.Initial);\n }\n }, [contentKey, chatId]);\n\n\n useHistoryBack(isChatSelected && (contentKey === RightColumnContent.ChatInfo\n || contentKey === RightColumnContent.UserInfo || contentKey === RightColumnContent.Management\n || contentKey === RightColumnContent.AddingMembers),\n () => close(false), toggleChatInfo);\n\n // eslint-disable-next-line consistent-return\n function renderContent(isActive: boolean) {\n if (renderingContentKey === -1) {\n return undefined;\n }\n\n switch (renderingContentKey) {\n case RightColumnContent.AddingMembers:\n return (\n \n );\n case RightColumnContent.ChatInfo:\n case RightColumnContent.UserInfo:\n return (\n \n );\n case RightColumnContent.Search:\n return ;\n case RightColumnContent.Management:\n return (\n \n );\n\n case RightColumnContent.StickerSearch:\n return ;\n case RightColumnContent.GifSearch:\n return ;\n case RightColumnContent.PollResults:\n return ;\n }\n }\n\n return (\n \n {isOverlaying && (\n
\n )}\n
\n \n \n {renderContent}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const areActiveChatsLoaded = selectAreActiveChatsLoaded(global);\n\n return {\n contentKey: selectRightColumnContentKey(global),\n chatId,\n threadId,\n currentProfileUserId: global.users.selectedId,\n isChatSelected: Boolean(chatId && areActiveChatsLoaded),\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n 'toggleChatInfo',\n 'toggleManagement',\n 'closeLocalTextSearch',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'closePollResults',\n 'addChatMembers',\n 'setNewChatMembersDialogState',\n ]),\n)(RightColumn));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { Bundles } from '../../util/moduleLoader';\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\ninterface OwnProps {\n isOpen: boolean;\n}\n\nconst MediaViewerAsync: FC = ({ isOpen }) => {\n const MediaViewer = useModuleLoader(Bundles.Extra, 'MediaViewer', !isOpen);\n\n return MediaViewer ? : undefined;\n};\n\nexport default memo(MediaViewerAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst NotificationsAsync: FC = ({ isOpen }) => {\n const Notifications = useModuleLoader(Bundles.Extra, 'Notifications', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Notifications ? : undefined;\n};\n\nexport default memo(NotificationsAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst DialogsAsync: FC = ({ isOpen }) => {\n const Dialogs = useModuleLoader(Bundles.Extra, 'Dialogs', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Dialogs ? : undefined;\n};\n\nexport default memo(DialogsAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\nimport { OwnProps } from './ForwardPicker';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ForwardPickerAsync: FC = (props) => {\n const { isOpen } = props;\n const ForwardPicker = useModuleLoader(Bundles.Extra, 'ForwardPicker', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ForwardPicker ? : undefined;\n};\n\nexport default memo(ForwardPickerAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport { OwnProps } from './SafeLinkModal';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst SafeLinkModalAsync: FC = (props) => {\n const { url } = props;\n const SafeLinkModal = useModuleLoader(Bundles.Extra, 'SafeLinkModal', !url);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return SafeLinkModal ? : undefined;\n};\n\nexport default memo(SafeLinkModalAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport { OwnProps } from './HistoryCalendar';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst HistoryCalendarAsync: FC = (props) => {\n const { isOpen } = props;\n const HistoryCalendar = useModuleLoader(Bundles.Extra, 'HistoryCalendar', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return HistoryCalendar ? : undefined;\n};\n\nexport default memo(HistoryCalendarAsync);\n","import React, {\n FC, useEffect, memo, useCallback,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\nimport { LangCode } from '../../types';\n\nimport '../../modules/actions/all';\nimport {\n BASE_EMOJI_KEYWORD_LANG, DEBUG, INACTIVE_MARKER, PAGE_TITLE,\n} from '../../config';\nimport { pick } from '../../util/iteratees';\nimport {\n selectChatMessage,\n selectCountNotMutedUnread,\n selectIsForwardModalOpen,\n selectIsMediaViewerOpen,\n selectIsRightColumnShown,\n} from '../../modules/selectors';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport buildClassName from '../../util/buildClassName';\nimport { fastRaf } from '../../util/schedulers';\nimport { waitForTransitionEnd } from '../../util/cssAnimationEndListeners';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\nimport useBeforeUnload from '../../hooks/useBeforeUnload';\nimport useOnChange from '../../hooks/useOnChange';\n\nimport LeftColumn from '../left/LeftColumn';\nimport MiddleColumn from '../middle/MiddleColumn';\nimport RightColumn from '../right/RightColumn';\nimport MediaViewer from '../mediaViewer/MediaViewer.async';\nimport AudioPlayer from '../middle/AudioPlayer';\nimport Notifications from './Notifications.async';\nimport Dialogs from './Dialogs.async';\nimport ForwardPicker from './ForwardPicker.async';\nimport SafeLinkModal from './SafeLinkModal.async';\nimport HistoryCalendar from './HistoryCalendar.async';\n\nimport './Main.scss';\n\ntype StateProps = {\n animationLevel: number;\n lastSyncTime?: number;\n isLeftColumnShown: boolean;\n isRightColumnShown: boolean;\n isMediaViewerOpen: boolean;\n isForwardModalOpen: boolean;\n hasNotifications: boolean;\n hasDialogs: boolean;\n audioMessage?: ApiMessage;\n safeLinkModalUrl?: string;\n isHistoryCalendarOpen: boolean;\n shouldSkipHistoryAnimations?: boolean;\n language?: LangCode;\n};\n\ntype DispatchProps = Pick;\n\nconst NOTIFICATION_INTERVAL = 1000;\n\nlet notificationInterval: number | undefined;\n\nlet DEBUG_isLogged = false;\n\nconst Main: FC = ({\n lastSyncTime,\n isLeftColumnShown,\n isRightColumnShown,\n isMediaViewerOpen,\n isForwardModalOpen,\n animationLevel,\n hasNotifications,\n hasDialogs,\n audioMessage,\n safeLinkModalUrl,\n isHistoryCalendarOpen,\n shouldSkipHistoryAnimations,\n language,\n loadAnimatedEmojis,\n loadNotificationSettings,\n loadNotificationExceptions,\n updateIsOnline,\n loadTopInlineBots,\n loadEmojiKeywords,\n}) => {\n if (DEBUG && !DEBUG_isLogged) {\n DEBUG_isLogged = true;\n // eslint-disable-next-line no-console\n console.log('>>> RENDER MAIN');\n }\n\n // Initial API calls\n useEffect(() => {\n if (lastSyncTime) {\n updateIsOnline(true);\n loadAnimatedEmojis();\n loadNotificationSettings();\n loadNotificationExceptions();\n loadTopInlineBots();\n\n loadEmojiKeywords({ language: BASE_EMOJI_KEYWORD_LANG });\n if (language !== BASE_EMOJI_KEYWORD_LANG) {\n loadEmojiKeywords({ language });\n }\n }\n }, [\n lastSyncTime, loadAnimatedEmojis, loadNotificationExceptions, loadNotificationSettings, updateIsOnline,\n loadTopInlineBots, loadEmojiKeywords, language,\n ]);\n\n const {\n transitionClassNames: middleColumnTransitionClassNames,\n } = useShowTransition(!isLeftColumnShown, undefined, true, undefined, shouldSkipHistoryAnimations);\n\n const {\n transitionClassNames: rightColumnTransitionClassNames,\n } = useShowTransition(isRightColumnShown, undefined, true, undefined, shouldSkipHistoryAnimations);\n\n\n const className = buildClassName(\n middleColumnTransitionClassNames.replace(/([\\w-]+)/g, 'middle-column-$1'),\n rightColumnTransitionClassNames.replace(/([\\w-]+)/g, 'right-column-$1'),\n shouldSkipHistoryAnimations && 'history-animation-disabled',\n );\n\n // Dispatch heavy transition event when opening middle column\n useOnChange(([prevIsLeftColumnShown]) => {\n if (prevIsLeftColumnShown === undefined || animationLevel === 0) {\n return;\n }\n\n const dispatchHeavyAnimationEnd = dispatchHeavyAnimationEvent();\n\n waitForTransitionEnd(document.getElementById('MiddleColumn')!, dispatchHeavyAnimationEnd);\n }, [isLeftColumnShown]);\n\n // Dispatch heavy transition event and add body class when opening right column\n useOnChange(([prevIsRightColumnShown]) => {\n if (prevIsRightColumnShown === undefined || animationLevel === 0) {\n return;\n }\n\n fastRaf(() => {\n document.body.classList.add('animating-right-column');\n });\n\n const dispatchHeavyAnimationEnd = dispatchHeavyAnimationEvent();\n\n waitForTransitionEnd(document.getElementById('RightColumn')!, () => {\n dispatchHeavyAnimationEnd();\n\n fastRaf(() => {\n document.body.classList.remove('animating-right-column');\n });\n });\n }, [isRightColumnShown]);\n\n const handleBlur = useCallback(() => {\n updateIsOnline(false);\n\n const initialUnread = selectCountNotMutedUnread(getGlobal());\n let index = 0;\n\n clearInterval(notificationInterval);\n notificationInterval = window.setInterval(() => {\n if (document.title.includes(INACTIVE_MARKER)) {\n updateIcon(false);\n return;\n }\n\n if (index % 2 === 0) {\n const newUnread = selectCountNotMutedUnread(getGlobal()) - initialUnread;\n if (newUnread > 0) {\n updatePageTitle(`${newUnread} notification${newUnread > 1 ? 's' : ''}`);\n updateIcon(true);\n }\n } else {\n updatePageTitle(PAGE_TITLE);\n updateIcon(false);\n }\n\n index++;\n }, NOTIFICATION_INTERVAL);\n }, [updateIsOnline]);\n\n const handleFocus = useCallback(() => {\n updateIsOnline(true);\n\n clearInterval(notificationInterval);\n notificationInterval = undefined;\n\n if (!document.title.includes(INACTIVE_MARKER)) {\n updatePageTitle(PAGE_TITLE);\n }\n\n updateIcon(false);\n }, [updateIsOnline]);\n\n // Online status and browser tab indicators\n useBackgroundMode(handleBlur, handleFocus);\n useBeforeUnload(handleBlur);\n\n function stopEvent(e: React.MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n return (\n
\n \n \n \n \n \n \n \n {audioMessage && }\n \n \n
\n );\n};\n\nfunction updateIcon(asUnread: boolean) {\n document.querySelectorAll('link[rel=\"icon\"]')\n .forEach((link) => {\n if (asUnread) {\n if (!link.href.includes('favicon-unread')) {\n link.href = link.href.replace('favicon', 'favicon-unread');\n }\n } else {\n link.href = link.href.replace('favicon-unread', 'favicon');\n }\n });\n}\n\n// For some reason setting `document.title` to the same value\n// causes increment of Chrome Dev Tools > Performance Monitor > DOM Nodes counter\nfunction updatePageTitle(nextTitle: string) {\n if (document.title !== nextTitle) {\n document.title = nextTitle;\n }\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n const audioMessage = audioChatId && audioMessageId\n ? selectChatMessage(global, audioChatId, audioMessageId)\n : undefined;\n\n return {\n animationLevel: global.settings.byKey.animationLevel,\n lastSyncTime: global.lastSyncTime,\n isLeftColumnShown: global.isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isMediaViewerOpen: selectIsMediaViewerOpen(global),\n isForwardModalOpen: selectIsForwardModalOpen(global),\n hasNotifications: Boolean(global.notifications.length),\n hasDialogs: Boolean(global.dialogs.length),\n audioMessage,\n safeLinkModalUrl: global.safeLinkModalUrl,\n isHistoryCalendarOpen: Boolean(global.historyCalendarSelectedAt),\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n language: global.settings.byKey.language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadAnimatedEmojis', 'loadNotificationSettings', 'loadNotificationExceptions', 'updateIsOnline',\n 'loadTopInlineBots', 'loadEmojiKeywords',\n ]),\n)(Main));\n","import { getDispatch, getGlobal } from '../lib/teact/teactn';\n\nimport { DEBUG } from '../config';\n\nexport { default as Main } from '../components/main/Main';\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH LOAD MAIN BUNDLE');\n}\n\nif (!getGlobal().connectionState) {\n getDispatch().initApi();\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/4.f46a6915735f9deb48a8.css.map b/dist/4.f46a6915735f9deb48a8.css.map deleted file mode 100644 index c12e8b468..000000000 --- a/dist/4.f46a6915735f9deb48a8.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/ui/Switcher.scss","webpack:///./src/components/left/main/LeftMainHeader.scss","webpack:///./src/components/left/ConnectionState.scss","webpack:///./src/components/left/NewChatButton.scss","webpack:///./src/components/left/main/LeftMain.scss","webpack:///./src/components/left/LeftColumn.scss","webpack:///./src/components/middle/AudioPlayer.scss","webpack:///./src/components/middle/MiddleHeader.scss","webpack:///./src/components/common/EmbeddedMessage.scss","webpack:///./src/components/middle/message/MessageMeta.scss","webpack:///./src/components/middle/message/Sticker.scss","webpack:///./src/components/middle/message/Contact.scss","webpack:///./src/components/middle/message/PollOption.scss","webpack:///./src/components/middle/message/Poll.scss","webpack:///./src/components/middle/message/WebPage.scss","webpack:///./src/components/middle/message/Invoice.scss","webpack:///./src/components/middle/message/Album.scss","webpack:///./src/components/middle/message/RoundVideo.scss","webpack:///./src/components/middle/message/InlineButtons.scss","webpack:///./src/components/middle/message/CommentButton.scss","webpack:///./src/components/middle/message/Message.scss","webpack:///./src/components/middle/MessageList.scss","webpack:///./src/components/middle/ScrollDownButton.scss","webpack:///./src/components/middle/composer/ComposerEmbeddedMessage.scss","webpack:///./src/components/middle/composer/WebPagePreview.scss","webpack:///./src/components/middle/composer/Composer.scss","webpack:///./src/components/middle/MiddleColumn.scss","webpack:///./src/components/right/RightHeader.scss","webpack:///./src/components/right/ProfilePhoto.scss","webpack:///./src/components/right/ProfileInfo.scss","webpack:///./src/components/right/Profile.scss","webpack:///./src/components/right/AddChatMembers.scss","webpack:///./src/components/right/RightColumn.scss","webpack:///./src/components/main/Main.scss"],"names":[],"mappings":"AAAA,UAAU,oBAAoB,mBAAmB,kBAAkB,SAAS,mBAAmB,oBAAoB,YAAY,mBAAmB,oBAAoB,8JAA8J,2BAA2B,kGAAkG,eAAe,gBAAgB,SAAS,QAAQ,kBAAkB,kBAAkB,uBAAuB,UAAU,kBAAkB,eAAe,mBAAmB,eAAe,gBAAgB,6BAA6B,qBAAqB,oBAAoB,kBAAkB,kCAAkC,wBAAwB,WAAW,kBAAkB,aAAa,OAAO,eAAe,gBAAgB,mCAAmC,qBAAqB,yBAAyB,wCAAwC,gCAAgC,gCAAgC,sCAAsC,2BAA2B,6CAA6C,kCAAkC,+BAA+B;;ACAntC,gBAAgB,kBAAkB,oCAAoC,kBAAkB,2HAA2H,eAAe,gBAAgB,uBAAuB,6CAA6C,0BAA0B,oBAAoB,uFAAuF,kBAAkB,OAAO,WAAW,4CAA4C,eAAe,2CAA2C,cAAc,+CAA+C,yBAAyB,uDAAuD,qEAAqE,sDAAsD,qEAAqE,iDAAiD,gBAAgB,iHAAiH,gBAAgB,gCAAgC,iBAAiB,cAAc,iBAAiB,6BAA6B,sBAAsB,iBAAiB,YAAY,mBAAmB,mBAAmB,gBAAgB,kBAAkB,cAAc,0CAA0C,cAAc,kBAAkB,8BAA8B,gBAAgB,2CAA2C,gBAAgB,mBAAmB,qHAAqH;;ACAroD,iBAAiB,cAAc,aAAa,mBAAmB,uBAAuB,gBAAgB,+BAA+B,2CAA2C,0BAA0B,wBAAwB,6BAA6B,gCAAgC,gBAAgB,iBAAiB,6BAA6B,mBAAmB,0BAA0B,6BAA6B;;ACAva,eAAe,kBAAkB,WAAW,YAAY,2BAA2B,6DAA6D,sCAAsC,0BAA0B,UAAU,wBAAwB,+CAA+C,UAAU,wBAAwB,wBAAwB,0BAA0B,wBAAwB,kCAAkC,6BAA6B,oCAAoC,WAAW,cAAc,kBAAkB,WAAW,YAAY,YAAY,aAAa,WAAW,6CAA6C,kBAAkB,YAAY,aAAa,WAAW,cAAc,gFAAgF,kBAAkB,0DAA0D,iCAAiC,gDAAgD,0CAA0C,0CAA0C,iCAAiC,oDAAoD;;ACA7lC,iBAAiB,YAAY,kBAAkB,aAAa,sBAAsB,gBAAgB,UAAU,2CAA2C,kBAAkB,YAAY,WAAW,6BAA6B,OAAO,gBAAgB,gCAAgC,uCAAuC,8BAA8B,8BAA8B,YAAY,aAAa,sBAAsB,gBAAgB,gDAAgD,gBAAgB,6BAA6B,2DAA2D,SAAS,uCAAuC,2BAA2B,sBAAsB,mBAAmB,gBAAgB,UAAU,mCAAmC,cAAc,sBAAsB,uBAAuB,wCAAwC,oBAAoB,qBAAqB,0CAA0C,OAAO,gBAAgB,2HAA2H,YAAY,gBAAgB,6BAA6B,kBAAkB,YAAY,UAAU,WAAW;;ACAnrC,YAAY,gBAAgB,SAAS,YAAY,aAAa,4BAA4B,yCAAyC,aAAa,mBAAmB,cAAc,yCAAyC,gBAAgB,gBAAgB,kBAAkB,gBAAgB,qBAAqB,0BAA0B,qBAAqB,gCAAgC,0BAA0B,0BAA0B,iCAAiC,0BAA0B,aAAa;;ACA5f,aAAa,aAAa,iBAAiB,mBAAmB,sBAAsB,oCAAoC,2BAA2B,qBAAqB,cAAc,eAAe,0BAA0B,6CAA6C,2DAA2D,0CAA0C,2CAA2C,0CAA0C,mBAAmB,kCAAkC,WAAW,YAAY,oCAAoC,mBAAmB,oBAAoB,4BAA4B,kBAAkB,oBAAoB,mBAAmB,sCAAsC,kBAAkB,2EAA2E,UAAU,mBAAmB,yEAAyE,iLAAiL,UAAU,qBAAqB,qBAAqB,aAAa,uBAAuB,sBAAsB,cAAc,qBAAqB,kBAAkB,gBAAgB,eAAe,gBAAgB,kDAAkD,2BAA2B,wDAAwD,mDAAmD,qBAAqB,iBAAiB,yCAAyC,cAAc,gBAAgB,8BAA8B,iBAAiB,YAAY,mBAAmB,gBAAgB,uBAAuB,qDAAqD,8BAA8B,qBAAqB,+BAA+B,6BAA6B,kCAAkC,qBAAqB,gBAAgB,mBAAmB,gBAAgB,uBAAuB,mBAAmB,2CAA2C;;ACA3hE,cAAc,aAAa,mBAAmB,WAAW,+CAA+C,mCAAmC,oCAAoC,kBAAkB,+BAA+B,0BAA0B,cAAc,eAAe,kBAAkB,kCAAkC,6BAA6B,0BAA0B,WAAW,YAAY,8BAA8B,aAAa,mBAAmB,WAAW,2BAA2B,oBAAoB,oBAAoB,kBAAkB,0BAA0B,2BAA2B,eAAe,yCAAyC,kBAAkB,eAAe,mBAAmB,uBAAuB,kBAAkB,oBAAoB,gBAAgB,kBAAkB,kBAAkB,aAAa,cAAc,6BAA6B,YAAY,oBAAoB,gDAAgD,gCAAgC,iCAAiC,YAAY,gBAAgB,4BAA4B,aAAa,mBAAmB,yBAAyB,iBAAiB,cAAc,qQAAqQ,2BAA2B,mDAAmD,2CAA2C,+BAA+B,6CAA6C,mEAAmE,mEAAmE,2BAA2B,4BAA4B,+BAA+B,6CAA6C,oDAAoD,mEAAmE,iHAAiH,oBAAoB,mDAAmD,0IAA0I,UAAU,0LAA0L,WAAW,8HAA8H,kBAAkB,SAAS,OAAO,QAAQ,gBAAgB,gBAAgB,+CAA+C,aAAa,2BAA2B,wBAAwB,qBAAqB,mCAAmC,8IAA8I,WAAW,cAAc,kBAAkB,cAAc,OAAO,QAAQ,eAAe,yDAAyD,wKAAwK,gBAAgB,sBAAsB,uDAAuD,eAAe,mBAAmB,wBAAwB,+DAA+D,iBAAiB,YAAY,+DAA+D,SAAS,qEAAqE,iBAAiB,+DAA+D,YAAY,cAAc,iBAAiB,uEAAuE,aAAa,gBAAgB,6EAA6E,eAAe,2BAA2B,8KAA8K,wDAAwD,gJAAgJ,mDAAmD,8LAA8L,eAAe,iBAAiB,gBAAgB,mBAAmB,qBAAqB,gBAAgB,SAAS,gBAAgB,uBAAuB,uBAAuB,4DAA4D,oBAAoB,gBAAgB,0BAA0B,iBAAiB,cAAc,gBAAgB,wBAAwB,2BAA2B,yCAAyC,kDAAkD,wBAAwB,eAAe,aAAa,mBAAmB,8BAA8B,aAAa,sBAAsB,uBAAuB,YAAY,gBAAgB,+BAA+B,aAAa,mBAAmB,6CAA6C,cAAc,eAAe,oBAAoB,mBAAmB,qEAAqE,uBAAuB,sBAAsB,qBAAqB,aAAa,cAAc,oBAAoB,mDAAmD,mBAAmB,qBAAqB,SAAS,kCAAkC,gBAAgB,mBAAmB,uBAAuB,qBAAqB,uEAAuE,oBAAoB,iEAAiE,2BAA2B,2EAA2E,iBAAiB,8BAA8B,aAAa,cAAc,2CAA2C,aAAa,mBAAmB,iBAAiB,eAAe,2BAA2B,oFAAoF,aAAa,gEAAgE,gBAAgB,mDAAmD,cAAc,mCAAmC,aAAa,cAAc,oBAAoB,uBAAuB,gBAAgB,sBAAsB,kDAAkD,kBAAkB,gBAAgB,eAAe,yCAAyC,wDAAwD,0DAA0D,kBAAkB,eAAe,kBAAkB,eAAe,mBAAmB,gBAAgB,2FAA2F,eAAe,eAAe,wBAAwB,gCAAgC,yFAAyF,8CAA8C,kBAAkB,sBAAsB,sCAAsC,sFAAsF,kBAAkB,OAAO,MAAM,eAAe,gCAAgC,wBAAwB,sBAAsB,sCAAsC,iDAAiD,gBAAgB,6BAA6B,oBAAoB,gBAAgB,mDAAmD,iDAAiD,iBAAiB,wDAAwD,gBAAgB,mBAAmB,iBAAiB,YAAY,2BAA2B,uBAAuB,gBAAgB,mBAAmB,oEAAoE,mBAAmB,mDAAmD,mBAAmB,qBAAqB,gBAAgB,mBAAmB,gBAAgB,uBAAuB,SAAS,+DAA+D,mBAAmB,gDAAgD,WAAW,YAAY,uCAAuC,cAAc,eAAe,iBAAiB,sBAAsB,6BAA6B,oBAAoB,cAAc,qDAAqD,gBAAgB,6BAA6B,cAAc,iBAAiB,aAAa,mBAAmB,yBAAyB,8DAA8D,2BAA2B,UAAU,wFAAwF,oBAAoB,kGAAkG,qBAAqB,0BAA0B,sEAAsE,kBAAkB,SAAS,OAAO,QAAQ,gBAAgB,gBAAgB,+CAA+C,aAAa,2BAA2B,wBAAwB,qBAAqB,mCAAmC,sFAAsF,WAAW,cAAc,kBAAkB,cAAc,OAAO,QAAQ,eAAe,yDAAyD,gHAAgH,gBAAgB,sBAAsB,2BAA2B,eAAe,mBAAmB,wBAAwB,mCAAmC,iBAAiB,YAAY,mCAAmC,SAAS,yCAAyC,iBAAiB,mCAAmC,YAAY,cAAc,iBAAiB,2CAA2C,aAAa,gBAAgB,iDAAiD,eAAe,sEAAsE,gCAAgC,oDAAoD,sEAAsE,mBAAmB,mBAAmB,KAAK,UAAU,GAAG;;ACAjkV,iBAAiB,aAAa,mBAAmB,yDAAyD,qBAAqB,2BAA2B,2CAA2C,kDAAkD,kBAAkB,gBAAgB,eAAe,cAAc,0DAA0D,aAAa,+BAA+B,gBAAgB,eAAe,SAAS,yCAAyC,iDAAiD,uCAAuC,aAAa,YAAY,eAAe,+CAA+C,0BAA0B,wCAAwC,eAAe,yBAAyB,WAAW,cAAc,kBAAkB,aAAa,gBAAgB,cAAc,UAAU,+BAA+B,kBAAkB,uBAAuB,oCAAoC,wBAAwB,qCAAqC,gCAAgC,yDAAyD,+BAA+B,gBAAgB,2BAA2B,aAAa,8BAA8B,8CAA8C,mBAAmB,gBAAgB,uBAAuB,uBAAuB,OAAO,cAAc,iCAAiC,mBAAmB,gBAAgB,uBAAuB,gBAAgB,gBAAgB,OAAO,wCAAwC,aAAa,aAAa,sCAAsC,8DAA8D,+DAA+D,sCAAsC,0CAA0C,0BAA0B,aAAa,iCAAiC,WAAW,YAAY,iBAAiB,qBAAqB,mBAAmB,cAAc,uCAAuC,mBAAmB,8BAA8B,+BAA+B,+BAA+B,aAAa,+BAA+B,uBAAuB,WAAW,qCAAqC,sDAAsD,sCAAsC,gBAAgB,8CAA8C,oBAAoB,4CAA4C,4BAA4B,6CAA6C,gBAAgB;;ACA1gF,aAAa,kBAAkB,eAAe,SAAS,QAAQ,aAAa,mBAAmB,iCAAiC,sBAAsB,iBAAiB,YAAY,eAAe,eAAe,uFAAuF,iBAAiB,mBAAmB,2BAA2B,sBAAsB,4BAA4B,qBAAqB,gCAAgC,gBAAgB,uBAAuB,sBAAsB,gCAAgC,qBAAqB,sBAAsB,mBAAmB,kBAAkB,eAAe,mCAAmC,6CAA6C,gBAAgB,mEAAmE,2BAA2B,0BAA0B,sBAAsB,uBAAuB,UAAU,cAAc,aAAa,UAAU,gBAAgB,6BAA6B,qHAAqH,uBAAuB,qFAAqF,sBAAsB,YAAY,6BAA6B,+GAA+G,cAAc,4CAA4C,gBAAgB,gBAAgB,yBAAyB,QAAQ,gDAAgD,oCAAoC,oCAAoC,sBAAsB,oBAAoB,sBAAsB,iDAAiD,8BAA8B,6DAA6D,gBAAgB,kEAAkE,iBAAiB,6DAA6D,WAAW,aAAa,eAAe,6DAA6D,YAAY,6DAA6D,YAAY,6DAA6D;;ACA/sE,wBAAwB,eAAe,kBAAkB;;ACAzD,SAAS,aAAa,mBAAmB,gBAAgB,qBAAqB,eAAe,iBAAiB,oBAAoB,uBAAuB,eAAe,eAAe,mBAAmB,gBAAgB,qCAAqC,eAAe,iBAAiB,sBAAsB,gBAAgB,sCAAsC,iBAAiB;;ACA5X,YAAY,aAAa,qBAAqB,sBAAsB,uBAAuB,gBAAgB,8BAA8B,sBAAsB,+BAA+B,kBAAkB,mBAAmB,cAAc,wBAAwB,cAAc,gBAAgB,kBAAkB,iBAAiB,2CAA2C,oBAAoB,uBAAuB,iBAAiB,gCAAgC,kBAAkB,QAAQ,YAAY,WAAW,YAAY,+BAA+B,8BAA8B,oBAAoB,iBAAiB,kBAAkB,sCAAsC,8BAA8B,gDAAgD,gBAAgB,wCAAwC,UAAU,qCAAqC,qBAAqB,uBAAuB,6BAA6B,+BAA+B,YAAY,gCAAgC,kBAAkB,8BAA8B,kBAAkB,QAAQ,eAAe,iBAAiB,uBAAuB,kBAAkB,+BAA+B,qBAAqB,yBAAyB,sBAAsB,uBAAuB,WAAW,YAAY,kBAAkB,WAAW,YAAY,uDAAuD,oBAAoB,yBAAyB,4BAA4B,iBAAiB,qBAAqB,2BAA2B,UAAU,qCAAqC,8BAA8B,mCAAmC,0BAA0B,iCAAiC,GAAG,UAAU,KAAK;;ACA5rD,MAAM,gBAAgB,mBAAmB,0BAA0B,MAAM,gBAAgB,qBAAqB,gBAAgB,oBAAoB,kBAAkB,sBAAsB,0CAA0C,6BAA6B,mBAAmB,iBAAiB,qBAAqB,aAAa,mBAAmB,oBAAoB,yBAAyB,2BAA2B,kBAAkB,oBAAoB,oBAAoB,oBAAoB,6BAA6B,qBAAqB,mDAAmD,qBAAqB,+CAA+C,qBAAqB,mBAAmB,gJAAgJ,cAAc,yCAAyC,gMAAgM,4CAA4C,oMAAoM,qCAAqC,4IAA4I,eAAe,qCAAqC,gNAAgN,iCAAiC,+CAA+C,cAAc,sCAAsC,cAAc,sCAAsC,mDAAmD,qCAAqC,mBAAmB,0CAA0C,+BAA+B,2CAA2C,gCAAgC,2CAA2C,4CAA4C,2CAA2C,0BAA0B,oBAAoB,mBAAmB,2BAA2B,oBAAoB,mBAAmB,gBAAgB,kCAAkC,oCAAoC,eAAe,uBAAuB,oDAAoD,iBAAiB,sBAAsB,iBAAiB,iBAAiB,qBAAqB,+BAA+B,yBAAyB,wDAAwD,0BAA0B,0BAA0B,oBAAoB,+BAA+B,4BAA4B,iBAAiB,eAAe,qBAAqB,4CAA4C,sBAAsB,gCAAgC,yCAAyC,2BAA2B,wCAAwC,oBAAoB,sBAAsB,cAAc,oBAAoB,eAAe,2BAA2B,0BAA0B,mDAAmD,cAAc,oBAAoB;;ACAl5G,SAAS,mBAAmB,uBAAuB,qBAAqB,yDAAyD,qBAAqB,gBAAgB,kBAAkB,iBAAiB,WAAW,cAAc,kBAAkB,MAAM,SAAS,OAAO,cAAc,+BAA+B,sBAAsB,cAAc,aAAa,sBAAsB,uBAAuB,sBAAsB,oBAAoB,kCAAkC,sFAAsF,6DAA6D,mCAAmC,WAAW,YAAY,aAAa,2BAA2B,uCAAuC,WAAW,YAAY,iCAAiC,6BAA6B,8BAA8B,2BAA2B,aAAa,mBAAmB,yCAAyC,QAAQ,mBAAmB,wCAAwC,QAAQ,cAAc,kDAAkD,wBAAwB,kMAAkM,WAAW,qBAAqB,iCAAiC,eAAe,YAAY,oEAAoE,sBAAsB,eAAe,oBAAoB,0BAA0B,gBAAgB,uBAAuB,qBAAqB,gBAAgB,uBAAuB,2BAA2B,iBAAiB,gBAAgB,uCAAuC,qBAAqB,kBAAkB,6BAA6B,0BAA0B,UAAU;;ACA11D,gBAAgB,0BAA0B,gBAAgB,sBAAsB,kBAAkB,+CAA+C,eAAe,aAAa,0BAA0B,+CAA+C,cAAc,kDAAkD,kBAAkB,MAAM,qBAAqB,cAAc,qCAAqC,kDAAkD,wBAAwB;;ACAhe,OAAO,kBAAkB,gBAAgB,mCAAmC,oCAAoC,0BAA0B,sBAAsB,sDAAsD,qBAAqB,qCAAqC,sCAAsC,0HAA0H,oBAAoB,uJAAuJ,2BAA2B;;ACAtnB,YAAY,kBAAkB,YAAY,aAAa,eAAe,+BAA+B,YAAY,aAAa,kBAAkB,gBAAgB,2BAA2B,kBAAkB,OAAO,MAAM,kBAAkB,gBAAgB,sBAAsB,kBAAkB,MAAM,OAAO,WAAW,YAAY,oBAAoB,6BAA6B,aAAa,iBAAiB,eAAe,mBAAmB,qBAAqB,kKAAkK;;ACAhnB,eAAe,aAAa,sBAAsB,oBAAoB,aAAa,mBAAmB,uBAAuB,OAAO,WAAW,gBAAgB,gCAAgC,kDAAkD,gBAAgB,oBAAoB,+BAA+B,WAAW,oCAAoC,UAAU,kBAAkB,MAAM,OAAO,QAAQ,SAAS,kDAAkD,uBAAuB,yBAAyB,6BAA6B,2CAA2C,qCAAqC,WAAW,qCAAqC,cAAc,oCAAoC,eAAe,yBAAyB,kBAAkB,kBAAkB,eAAe,aAAa,cAAc,yBAAyB,0CAA0C,8BAA8B,yCAAyC,gBAAgB,uDAAuD,wDAAwD,sDAAsD;;ACAnoC,eAAe,4CAA4C,uCAAuC,aAAa,WAAW,mBAAmB,yCAAyC,6BAA6B,0BAA0B,mCAAmC,6DAA6D,2DAA2D,mBAAmB,gBAAgB,iBAAiB,0BAA0B,mBAAmB,eAAe,6CAA6C,sCAAsC,2BAA2B,8CAA8C,WAAW,cAAc,kBAAkB,iBAAiB,eAAe,eAAe,eAAe,gCAAgC,g1BAAg1B,UAAU,qCAAqC,gEAAgE,oBAAoB,qEAAqE,2BAA2B,6BAA6B,kBAAkB,YAAY,cAAc,YAAY,gBAAgB,uBAAuB,iCAAiC,uBAAuB,YAAY,iCAAiC,UAAU,4BAA4B,yBAAyB,6BAA6B,sBAAsB,mCAAmC,kCAAkC,4CAA4C,UAAU,oCAAoC,uBAAuB,kBAAkB,iBAAiB,OAAO,WAAW,kBAAkB,eAAe,cAAc,2CAA2C,eAAe,kDAAkD,aAAa,oDAAoD,cAAc,iBAAiB,cAAc,sKAAsK,aAAa,qBAAqB,8BAA8B,oDAAoD,UAAU,6BAA6B,2CAA2C,mHAAmH,0CAA0C,qDAAqD,+BAA+B,sCAAsC,qBAAqB,sCAAsC,wBAAwB,6OAA6O,wBAAwB,sCAAsC,aAAa,8BAA8B,oBAAoB,iBAAiB,0BAA0B,0BAA0B,yBAAyB,iBAAiB,gCAAgC,oBAAoB,mBAAmB,wBAAwB,6BAA6B,wCAAwC,uBAAuB,yCAAyC,oBAAoB,UAAU,gBAAgB,+CAA+C,WAAW,qBAAqB,gDAAgD,UAAU,wDAAwD,UAAU,0DAA0D,4BAA4B,iCAAiC,kBAAkB,wCAAwC,WAAW,qBAAqB,YAAY,aAAa,kBAAkB,+BAA+B,2BAA2B,wBAAwB,eAAe;;ACAhoJ,SAAS,aAAa,qBAAqB,uBAAuB,kBAAkB,4CAA4C,wCAAwC,0CAA0C,mBAAmB,qCAAqC,iDAAiD,+CAA+C,+BAA+B,8BAA8B,kCAAkC,4HAA4H,6BAA6B,4BAA4B,iCAAiC,mDAAmD,UAAU,iCAAiC,8CAA8C,iGAAiG,2BAA2B,iBAAiB,kBAAkB,SAAS,OAAO,0BAA0B,iBAAiB,aAAa,eAAe,uBAAuB,uBAAuB,sBAAsB,uBAAuB,qCAAqC,gDAAgD,gDAAgD,+DAA+D,wCAAwC,2DAA2D,oBAAoB,6CAA6C,+DAA+D,mBAAmB,oBAAoB,gEAAgE,eAAe,0BAA0B,mBAAmB,sBAAsB,gEAAgE,sBAAsB,aAAa,2BAA2B,gDAAgD,4CAA4C,8CAA8C,mBAAmB,wCAAwC,yCAAyC,2CAA2C,oCAAoC,0CAA0C,sCAAsC,4CAA4C,8BAA8B,4BAA4B,4CAA4C,oDAAoD,0DAA0D,4DAA4D,8DAA8D,0BAA0B,aAAa,uBAAuB,2EAA2E,mDAAmD,UAAU,6DAA6D,wBAAwB,mBAAmB,mCAAmC,oBAAoB,qCAAqC,8BAA8B,qCAAqC,kCAAkC,qCAAqC,4CAA4C,qCAAqC,6BAA6B,eAAe,0BAA0B,6BAA6B,yBAAyB,kBAAkB,+GAA+G,6BAA6B,mDAAmD,WAAW,kBAAkB,aAAa,gBAAgB,WAAW,YAAY,qCAAqC,wIAAwI,qBAAqB,qDAAqD,UAAU,6CAA6C,8BAA8B,0DAA0D,uBAAuB,sEAAsE,8BAA8B,wDAAwD,8BAA8B,6HAA6H,qDAAqD,qIAAqI,yDAAyD,wCAAwC,eAAe,aAAa,qDAAqD,wCAAwC,6eAA6e,2BAA2B,qBAAqB,4DAA4D,+BAA+B,eAAe,kBAAkB,uCAAuC,kBAAkB,SAAS,UAAU,UAAU,iDAAiD,uCAAuC,4DAA4D,kBAAkB,aAAa,eAAe,WAAW,iDAAiD,8CAA8C,iDAAiD,kFAAkF,8CAA8C,wEAAwE,8BAA8B,0GAA0G,6CAA6C,4FAA4F,8BAA8B,wEAAwE,2BAA2B,oEAAoE,iBAAiB,6EAA6E,gBAAgB,oCAAoC,qCAAqC,uFAAuF,YAAY,2DAA2D,gBAAgB,mEAAmE,oBAAoB,4EAA4E,uCAAuC,wCAAwC,wPAAwP,iBAAiB,sQAAsQ,WAAW,cAAc,eAAe,uBAAuB,iBAAiB,sCAAsC,kBAAkB,kSAAkS,mCAAmC,qCAAqC,gTAAgT,mCAAmC,2CAA2C,4OAA4O,4CAA4C,4PAA4P,yDAAyD,gDAAgD,uDAAuD,iBAAiB,+CAA+C,qDAAqD,2DAA2D,aAAa,yBAAyB,4EAA4E,WAAW,oCAAoC,kBAAkB,4DAA4D,kBAAkB,UAAU,iCAAiC,kBAAkB,OAAO,eAAe,aAAa,cAAc,uBAAuB,kBAAkB,wCAAwC,aAAa,mBAAmB,uBAAuB,YAAY,eAAe,UAAU,oBAAoB,4CAA4C,8CAA8C,kBAAkB,UAAU,SAAS,mBAAmB,6CAA6C,uBAAuB,iBAAiB,oBAAoB,wDAAwD,gCAAgC,+EAA+E,gCAAgC,gFAAgF,6BAA6B,sKAAsK,qDAAqD,uDAAuD,2DAA2D,6DAA6D,8BAA8B,kCAAkC,aAAa,gBAAgB,6BAA6B,2BAA2B,SAAS,wDAAwD,yDAAyD,2DAA2D,4DAA4D,sDAAsD,iEAAiE,4DAA4D,8DAA8D,iEAAiE,sDAAsD,8DAA8D,iCAAiC,iEAAiE,+DAA+D,+BAA+B,gDAAgD,kEAAkE,sDAAsD,+DAA+D,kEAAkE,gDAAgD,+DAA+D,2BAA2B,kEAAkE,yDAAyD,gCAAgC,wNAAwN,+BAA+B,gCAAgC,gLAAgL,mBAAmB,iRAAiR,4BAA4B,6BAA6B,qEAAqE,sBAAsB,gCAAgC,kBAAkB,SAAS,YAAY,iCAAiC,UAAU,4BAA4B,yBAAyB,gCAAgC,sBAAsB,mHAAmH,6CAA6C,oGAAoG,UAAU,oCAAoC,WAAW,0CAA0C,YAAY,wBAAwB,WAAW,UAAU,kBAAkB,8CAA8C,cAAc,iBAAiB,kBAAkB,2BAA2B,0BAA0B,iBAAiB,+BAA+B,uEAAuE,6BAA6B,kDAAkD,iBAAiB,qCAAqC,yCAAyC,mCAAmC,8BAA8B,oCAAoC,mCAAmC,6BAA6B,2GAA2G,+BAA+B,kDAAkD,mCAAmC,mCAAmC,2DAA2D,qCAAqC,gDAAgD,uCAAuC,+BAA+B,SAAS,sBAAsB,mBAAmB,mBAAmB,kBAAkB,uBAAuB,mCAAmC,uBAAuB,sHAAsH,kBAAkB,YAAY,uBAAuB,YAAY,cAAc,mBAAmB,qBAAqB,oBAAoB,wIAAwI,WAAW,oBAAoB,sBAAsB,4CAA4C,WAAW,cAAc,WAAW,kDAAkD,SAAS,yBAAyB,mBAAmB,iEAAiE,oBAAoB,4DAA4D,0BAA0B,kEAAkE,qBAAqB,oCAAoC,yCAAyC,gDAAgD,8CAA8C,mDAAmD,YAAY,0CAA0C,mBAAmB,sBAAsB,mBAAmB,gCAAgC,mBAAmB,gBAAgB,uBAAuB,yDAAyD,gBAAgB,oBAAoB,0BAA0B,uBAAuB,aAAa,6CAA6C,gBAAgB,uBAAuB,yFAAyF,eAAe,qGAAqG,aAAa,yCAAyC,0BAA0B,yCAAyC,0BAA0B,yCAAyC,0BAA0B,yCAAyC,0BAA0B,yCAAyC,0BAA0B,yCAAyC,0BAA0B,yCAAyC,0BAA0B,kEAAkE,0BAA0B,sCAAsC,kBAAkB,qCAAqC,qBAAqB,gBAAgB,0CAA0C,oBAAoB,6CAA6C,OAAO,iBAAiB,iBAAiB,gBAAgB,kBAAkB,mBAAmB,6CAA6C,0DAA0D,0BAA0B,4BAA4B,iDAAiD,iGAAiG,mCAAmC,sCAAsC,+BAA+B,+GAA+G,yBAAyB,8FAA8F,eAAe,yLAAyL,WAAW,qBAAqB,qEAAqE,YAAY,YAAY,kDAAkD,aAAa,+BAA+B,gBAAgB,kBAAkB,iBAAiB,eAAe,gBAAgB,0BAA0B,uCAAuC,6BAA6B,4CAA4C,eAAe,kDAAkD,cAAc,iEAAiE,wBAAwB,2DAA2D,yBAAyB,UAAU,8BAA8B,0BAA0B,yBAAyB,4CAA4C,kDAAkD,8CAA8C,oBAAoB,8IAA8I,qBAAqB,uBAAuB,uBAAuB,yBAAyB,4CAA4C,iBAAiB,uBAAuB,qBAAqB,wCAAwC,4CAA4C,kBAAkB,8DAA8D,yBAAyB,2CAA2C,qBAAqB,cAAc,wBAAwB,kBAAkB,sBAAsB,2BAA2B,sDAAsD,wDAAwD,kBAAkB,yDAAyD,kDAAkD,mDAAmD,4DAA4D,mCAAmC,4BAA4B,6BAA6B,yCAAyC,6BAA6B,wDAAwD,oBAAoB,kBAAkB,YAAY,4BAA4B,8BAA8B,gBAAgB,yCAAyC,4CAA4C,qEAAqE,kBAAkB,sDAAsD,oBAAoB,0DAA0D,aAAa,uBAAuB,mBAAmB,kFAAkF,eAAe,wGAAwG,yBAAyB,8DAA8D,sBAAsB,gdAAgd,oBAAoB,qBAAqB,oEAAoE,sBAAsB,0TAA0T,oBAAoB,wBAAwB,4HAA4H,uBAAuB,8DAA8D,aAAa,mBAAmB,uBAAuB,oFAAoF,YAAY,mBAAmB,gDAAgD,gIAAgI,kBAAkB,aAAa,mBAAmB,uBAAuB,WAAW,YAAY,yBAAyB,wJAAwJ,UAAU,4JAA4J,aAAa,mBAAmB,uBAAuB,eAAe,gBAAgB,kBAAkB,4BAA4B,8DAA8D,iBAAiB,kEAAkE,iBAAiB,kKAAkK,4BAA4B,WAAW,kBAAkB,kBAAkB,cAAc,aAAa,UAAU,kBAAkB,qBAAqB,qBAAqB,kHAAkH,yBAAyB,oBAAoB,oBAAoB,8BAA8B,gBAAgB,gBAAgB,aAAa,eAAe,qBAAqB,2CAA2C,mBAAmB,wBAAwB,uDAAuD,kBAAkB,uCAAuC,eAAe,6CAA6C,aAAa,uBAAuB,2BAA2B,cAAc,+CAA+C,gBAAgB,8DAA8D,mBAAmB,4CAA4C,0BAA0B,8DAA8D,8BAA8B,0BAA0B,8DAA8D,kBAAkB,UAAU,8BAA8B,4CAA4C,mBAAmB,2CAA2C,cAAc,eAAe,cAAc,uDAAuD,MAAM,OAAO,SAAS,QAAQ,qCAAqC,qBAAqB,kBAAkB,gDAAgD,wDAAwD,kBAAkB,uDAAuD,gBAAgB,2CAA2C,eAAe,iBAAiB,0DAA0D,YAAY,yDAAyD,gBAAgB,kBAAkB,+DAA+D,gBAAgB,kDAAkD,WAAW,YAAY,2CAA2C,eAAe,iBAAiB,gBAAgB,wDAAwD,mBAAmB,+DAA+D,gBAAgB,kDAAkD,WAAW,YAAY,2CAA2C,eAAe,mBAAmB,gBAAgB,wDAAwD,kBAAkB,+DAA+D,gBAAgB,kDAAkD,WAAW,YAAY,iDAAiD,wCAAwC,0CAA0C,2CAA2C,4CAA4C,8CAA8C,0DAA0D,mBAAmB,2EAA2E,oBAAoB,0BAA0B,2EAA2E,cAAc,UAAU,gCAAgC,mBAAmB,8DAA8D,+DAA+D,iEAAiE,kEAAkE,yCAAyC,qBAAqB,uDAAuD,kBAAkB,mBAAmB,sBAAsB,+DAA+D,WAAW,cAAc,kBAAkB,MAAM,SAAS,aAAa,UAAU,+BAA+B,kBAAkB,gEAAgE,8BAA8B,wEAAwE,UAAU,cAAc,gCAAgC,oBAAoB,iCAAiC,qBAAqB,qBAAqB,kBAAkB,oCAAoC,qBAAqB,sBAAsB,eAAe,qBAAqB,2EAA2E,0CAA0C,0BAA0B,mCAAmC,wBAAwB,gCAAgC,qBAAqB,SAAS,gBAAgB,kBAAkB;;ACA314B,aAAa,OAAO,WAAW,qBAAqB,gBAAgB,kBAAkB,mBAAmB,oBAAoB,iCAAiC,uEAAuE,+DAA+D,yBAAyB,aAAa,yBAAyB,iBAAiB,mBAAmB,gCAAgC,yBAAyB,iBAAiB,uBAAuB,yCAAyC,aAAa,iCAAiC,WAAW,0CAA0C,gBAAgB,cAAc,aAAa,yBAAyB,sBAAsB,6BAA6B,wDAAwD,4BAA4B,0BAA0B,iCAAiC,YAAY,yBAAyB,UAAU,yBAAyB,gBAAgB,uCAAuC,mBAAmB,yDAAyD,gBAAgB,qFAAqF,uBAAuB,0BAA0B,qFAAqF,uBAAuB,iHAAiH,wBAAwB,kDAAkD,kBAAkB,UAAU,mBAAmB,gDAAgD,wEAAwE,qBAAqB,UAAU,wEAAwE,eAAe,kEAAkE,WAAW,kBAAkB,eAAe,kBAAkB,WAAW,YAAY,iBAAiB,WAAW,UAAU,4CAA4C,gHAAgH,2BAA2B,0GAA0G,kBAAkB,4GAA4G,eAAe,kFAAkF,2BAA2B,wWAAwW,YAAY,oBAAoB,WAAW,YAAY,aAAa,mBAAmB,uBAAuB,6GAA6G,kBAAkB,iIAAiI,qBAAqB,gCAAgC,YAAY,0DAA0D,gBAAgB,iBAAiB,gBAAgB,mBAAmB,sBAAsB,0WAA0W,yDAAyD,qLAAqL,2BAA2B,kDAAkD,mDAAmD,4DAA4D,qJAAqJ,cAAc,gBAAgB,kTAAkT,2CAA2C,sUAAsU,iDAAiD,0BAA0B,gBAAgB,mBAAmB,6BAA6B,oBAAoB,UAAU,4BAA4B,iEAAiE,UAAU,sEAAsE,oBAAoB,iDAAiD,gBAAgB,sCAAsC,eAAe,+BAA+B,oBAAoB,sDAAsD,gBAAgB,aAAa,0BAA0B,gBAAgB,kDAAkD,wBAAwB,4CAA4C,YAAY,+DAA+D,kBAAkB,qBAAqB,yCAAyC,eAAe,+CAA+C,0BAA0B,yCAAyC,mBAAmB,2BAA2B,aAAa,WAAW,+BAA+B,6CAA6C,iCAAiC,6CAA6C,oCAAoC,gBAAgB,qCAAqC,kEAAkE,0NAA0N,6CAA6C,sRAAsR,YAAY,0BAA0B,aAAa,6CAA6C,gDAAgD,+BAA+B,sCAAsC,wGAAwG,gIAAgI,gBAAgB,4MAA4M,QAAQ,kCAAkC,gIAAgI,uBAAuB,sBAAsB,iJAAiJ;;ACAv8P,kBAAkB,wBAAwB,kBAAkB,8BAA8B,WAAW,UAAU,6BAA6B,+EAA+E,WAAW,oBAAoB,yCAAyC,0BAA0B,wBAAwB,0BAA0B,kBAAkB,aAAa,eAAe,wBAAwB,aAAa,sBAAsB,mBAAmB,gCAAgC,iDAAiD,kCAAkC,kBAAkB,2BAA2B,wBAAwB,wBAAwB,6CAA6C,+CAA+C,2BAA2B,gDAAgD,4DAA4D,0BAA0B,gCAAgC,eAAe,iBAAiB,2BAA2B,wBAAwB,UAAU,mBAAmB,uCAAuC,2BAA2B,gCAAgC,iBAAiB,cAAc,iBAAiB,sBAAsB,mBAAmB,mBAAmB,gBAAgB,kBAAkB,kBAAkB,YAAY,cAAc,8BAA8B,YAAY,oBAAoB,0BAA0B,gCAAgC,YAAY,YAAY,0BAA0B,2CAA2C;;ACAzjD,yBAAyB,gBAAgB,yDAAyD,mEAAmE,aAAa,oCAAoC,oBAAoB,gDAAgD,2BAA2B,6BAA6B,aAAa,mBAAmB,uBAAuB,oBAAoB,qCAAqC,cAAc,2BAA2B,eAAe,gBAAgB,kBAAkB,UAAU;;ACAtiB,gBAAgB,gBAAgB,yDAAyD,qCAAqC,uCAAuC,2BAA2B,0DAA0D,aAAa,2BAA2B,oBAAoB,oBAAoB,aAAa,mBAAmB,uBAAuB,oBAAoB,yCAAyC,mBAAmB,4BAA4B,cAAc,2BAA2B,eAAe,gBAAgB,kBAAkB,UAAU,kBAAkB,yBAAyB,YAAY,sCAAsC,gCAAgC,iCAAiC,UAAU,cAAc,iDAAiD,aAAa,gFAAgF,OAAO,eAAe,gBAAgB,qCAAqC,mBAAmB,wBAAwB,2CAA2C,gBAAgB,mBAAmB;;ACAzlC,UAAU,qBAAqB,oDAAoD,kBAAkB,mBAAmB,SAAS,0BAA0B,oDAAoD,oBAAoB,4DAA4D,eAAe,0BAA0B,4DAA4D,YAAY,kEAAkE,UAAU,wBAAwB,kBAAkB,kBAAkB,cAAc,kBAAkB,0BAA0B,kBAAkB,eAAe,iBAAiB,kGAAkG,kBAAkB,qIAAqI,2BAA2B,yBAAyB,kBAAkB,UAAU,+DAA+D,mCAAmC,4BAA4B,kBAAkB,UAAU,0BAA0B,kCAAkC,iCAAiC,+EAA+E,0CAA0C,8CAA8C,iCAAiC,yEAAyE,0CAA0C,8EAA8E,0CAA0C,mCAAmC,iCAAiC,8BAA8B,kCAAkC,8UAA8U,kCAAkC,qCAAqC,eAAe,gBAAgB,kBAAkB,mJAAmJ,kBAAkB,8CAA8C,uBAAuB,iDAAiD,iCAAiC,kGAAkG,0CAA0C,iDAAiD,kCAAkC,yDAAyD,iCAAiC,2HAA2H,0CAA0C,gEAAgE,iCAAiC,uHAAuH,0CAA0C,iBAAiB,YAAY,4BAA4B,mCAAmC,4CAA4C,6BAA6B,iDAAiD,kBAAkB,UAAU,+BAA+B,kBAAkB,iBAAiB,eAAe,eAAe,eAAe,yBAAyB,0BAA0B,uCAAuC,6BAA6B,0BAA0B,iBAAiB,6BAA6B,uBAAuB,aAAa,gCAAgC,kBAAkB,uBAAuB,+BAA+B,cAAc,2BAA2B,eAAe,gBAAgB,SAAS,iBAAiB,oBAAoB,0BAA0B,+BAA+B,eAAe,gBAAgB,kBAAkB,uCAAuC,oBAAoB,yDAAyD,WAAW,kBAAkB,WAAW,aAAa,+CAA+C,uBAAuB,YAAY,aAAa,kBAAkB,qCAAqC,mEAAmE,0BAA0B,yDAAyD,UAAU,aAAa,oCAAoC,YAAY,gBAAgB,wCAAwC,qBAAqB,kBAAkB,mBAAmB,cAAc,0BAA0B,+CAA+C,WAAW,WAAW,YAAY,8BAA8B,kBAAkB,kBAAkB,QAAQ,gBAAgB,eAAe,0BAA0B,wCAAwC,gBAAgB,sBAAsB,wCAAwC,kBAAkB,oEAAoE,qIAAqI,gBAAgB,kBAAkB,qFAAqF,uBAAuB,mBAAmB,0CAA0C,4LAA4L,sHAAsH,wFAAwF,gBAAgB,kBAAkB,4OAA4O,aAAa,kGAAkG,oBAAoB,4JAA4J,kBAAkB,gCAAgC,oBAAoB,uBAAuB,mBAAmB,mBAAmB,0CAA0C,kEAAkE,YAAY,gFAAgF,uBAAuB,OAAO,mBAAmB,gBAAgB,eAAe,uBAAuB,8FAA8F,QAAQ,4EAA4E,oCAAoC,eAAe,qBAAqB,8QAA8Q,0CAA0C,sDAAsD,kBAAkB,MAAM,OAAO,UAAU,oBAAoB,YAAY,uBAAuB,mBAAmB,oBAAoB,YAAY,kCAAkC,gBAAgB,kCAAkC,uBAAuB,2BAA2B,2BAA2B,8BAA8B,kBAAkB,iBAAiB,mBAAmB,wEAAwE,6BAA6B,0BAA0B,kCAAkC,gBAAgB,oBAAoB,iBAAiB,0EAA0E,eAAe,yDAAyD,2BAA2B,8EAA8E,kEAAkE,0BAA0B,8EAA8E,qEAAqE,mDAAmD,eAAe,gBAAgB,+KAA+K,mBAAmB,2BAA2B,cAAc,eAAe,kBAAkB,iBAAiB,oBAAoB,kCAAkC,eAAe,mBAAmB,iBAAiB,sCAAsC,gBAAgB,eAAe,kBAAkB,kBAAkB,0BAA0B,OAAO,WAAW,mCAAmC,4CAA4C,iBAAiB,iBAAiB,kBAAkB,gBAAgB,mBAAmB,iDAAiD,UAAU,6BAA6B,wBAAwB,6EAA6E,8BAA8B,aAAa,uBAAuB,UAAU,wBAAwB,2BAA2B;;ACAvnT,kBAAkB,kBAAkB,MAAM,OAAO,SAAS,QAAQ,gBAAgB,WAAW,mDAAmD,WAAW,cAAc,kBAAkB,MAAM,OAAO,SAAS,QAAQ,+CAA+C,yBAAyB,2BAA2B,4BAA4B,sBAAsB,sCAAsC,mEAAmE,0BAA0B,sCAAsC,2EAA2E,4DAA4D,qEAAqE,gDAAgD,gBAAgB,gEAAgE,UAAU,0CAA0C,qDAAqD,YAAY,qBAAqB,kDAAkD,kBAAkB,sCAAsC,gDAAgD,6BAA6B,gBAAgB,mBAAmB,6BAA6B,6CAA6C,wEAAwE,kCAAkC,cAAc,aAAa,uBAAuB,YAAY,kBAAkB,UAAU,0BAA0B,cAAc,iBAAiB,+BAA+B,wDAAwD,aAAa,sBAAsB,mBAAmB,WAAW,YAAY,kBAAkB,gBAAgB,2CAA2C,WAAW,YAAY,gBAAgB,+CAA+C,aAAa,sBAAsB,mBAAmB,wCAAwC,WAAW,aAAa,4CAA4C,mCAAmC,kCAAkC,kBAAkB,iDAAiD,yCAAyC,kCAAkC,kGAAkG,iDAAiD,mCAAmC,8CAA8C,wIAAwI,2BAA2B,+EAA+E,UAAU,4CAA4C,6HAA6H,2BAA2B,gCAAgC,UAAU,mBAAmB,+EAA+E,uDAAuD,2BAA2B,2EAA2E,oBAAoB,6DAA6D,SAAS,qDAAqD,6FAA6F,yDAAyD,6DAA6D,sCAAsC,2DAA2D,yBAAyB,0BAA0B,2DAA2D,0BAA0B,uGAAuG,UAAU,4CAA4C,qBAAqB,qBAAqB,kCAAkC,oBAAoB,8CAA8C,iEAAiE,UAAU,4CAA4C,wFAAwF,2BAA2B,yDAAyD,2BAA2B,8CAA8C,kDAAkD,oBAAoB,6EAA6E,UAAU,oCAAoC,WAAW,0CAA0C,eAAe,kBAAkB,aAAa,qBAAqB,+BAA+B,+BAA+B,6CAA6C,2DAA2D,2BAA2B,2BAA2B,oCAAoC,6CAA6C,4DAA4D,mEAAmE,0BAA0B,oCAAoC,iBAAiB,6DAA6D,wGAAwG,4CAA4C,WAAW,kBAAkB,cAAc,OAAO,QAAQ,WAAW,yIAAyI,UAAU,8BAA8B,0BAA0B,4CAA4C,SAAS,WAAW,uDAAuD,UAAU,4DAA4D,yIAAyI,oDAAoD,sBAAsB,0BAA0B,oDAAoD,sBAAsB,sEAAsE,WAAW,aAAa,uBAAuB,kBAAkB,iIAAiI,iEAAiE,wBAAwB,WAAW,aAAa,uBAAuB,kBAAkB,uBAAuB,0CAA0C,0BAA0B,yBAAyB,cAAc,iBAAiB,oBAAoB,iFAAiF,4DAA4D,yBAAyB,oFAAoF,gBAAgB,4CAA4C,0BAA0B,0CAA0C,eAAe,sDAAsD,+BAA+B,yBAAyB,kCAAkC,iBAAiB,sBAAsB,0BAA0B,wBAAwB,wBAAwB,qDAAqD;;ACA14O,aAAa,aAAa,mBAAmB,4BAA4B,wBAAwB,oBAAoB,0BAA0B,aAAa,gBAAgB,2BAA2B,cAAc,yBAAyB,OAAO,YAAY,6BAA6B,aAAa,mBAAmB,gBAAgB,gBAAgB,kBAAkB,gBAAgB,qBAAqB,oBAAoB,aAAa,iBAAiB,0BAA0B,iBAAiB,0BAA0B,0BAA0B,mBAAmB,2BAA2B;;ACAplB,cAAc,WAAW,YAAY,eAAe,kBAAkB,kBAAkB,WAAW,iBAAiB,iCAAiC,kBAAkB,OAAO,MAAM,WAAW,+BAA+B,WAAW,YAAY,iHAAiH,aAAa,mBAAmB,uBAAuB,yBAAyB,wEAAwE,eAAe,uBAAuB,gBAAgB,2DAA2D;;ACA/mB,aAAa,mBAAmB,kBAAkB,kCAAkC,qBAAqB,WAAW,iBAAiB,WAAW,oBAAoB,cAAc,WAAW,YAAY,4BAA4B,WAAW,kBAAkB,OAAO,MAAM,SAAS,wCAAwC,WAAW,YAAY,2BAA2B,kBAAkB,WAAW,eAAe,kBAAkB,UAAU,aAAa,UAAU,OAAO,yBAAyB,cAAc,oCAAoC,WAAW,sBAAsB,iBAAiB,iCAAiC,UAAU,yBAAyB,kBAAkB,MAAM,SAAS,UAAU,YAAY,UAAU,SAAS,wBAAwB,gBAAgB,iCAAiC,wBAAwB,YAAY,wBAAwB,aAAa,eAAe,UAAU,sEAAsE,UAAU,8BAA8B,OAAO,qFAAqF,gCAAgC,8BAA8B,QAAQ,iFAAiF,6CAA6C,mBAAmB,kBAAkB,SAAS,OAAO,WAAW,iBAAiB,uBAAuB,yEAAyE,yBAAyB,aAAa,sBAAsB,yBAAyB,oBAAoB,oCAAoC,mBAAmB,uBAAuB,oCAAoC,mBAAmB,uBAAuB,oBAAoB,aAAa,mBAAmB,uBAAuB,gBAAgB,kBAAkB,qBAAqB,qBAAqB,sBAAsB,qBAAqB,kCAAkC,oBAAoB,qBAAqB,2BAA2B,aAAa,cAAc,uBAAuB,qBAAqB,mBAAmB,WAAW,uCAAuC,UAAU,QAAQ,qBAAqB,uCAAuC,OAAO,WAAW;;ACAtuE,SAAS,YAAY,aAAa,sBAAsB,kBAAkB,kBAAkB,gCAAgC,SAAS,+BAA+B,iCAAiC,oBAAoB,gDAAgD,2BAA2B,kCAAkC,4BAA4B,2EAA2E,+DAA+D,0CAA0C,gBAAgB,yDAAyD,iBAAiB,oCAAoC,4CAA4C,iBAAiB,sDAAsD,cAAc,kBAAkB,+BAA+B,UAAU,cAAc,aAAa,8BAA8B,uBAAuB,mCAAmC,SAAS,UAAU,4BAA4B,oBAAoB,8BAA8B,aAAa,0BAA0B,OAAO,kCAAkC,YAAY,iBAAiB,aAAa,uBAAuB,uBAAuB,2CAA2C,wBAAwB,kCAAkC,aAAa,qCAAqC,mBAAmB,kBAAkB,sCAAsC,gBAAgB,kDAAkD,mBAAmB,kCAAkC,gBAAgB,8GAA8G,aAAa,kCAAkC,gBAAgB,wDAAwD,MAAM,OAAO,aAAa,mBAAmB,uBAAuB,gDAAgD,qBAAqB,oCAAoC,oBAAoB,0BAA0B,oCAAoC,gBAAgB,kEAAkE;;ACA3mE,gBAAgB,YAAY,gBAAgB,kBAAkB,sBAAsB,YAAY;;ACAhG,aAAa,kBAAkB,MAAM,QAAQ,gCAAgC,YAAY,uDAAuD,mCAAmC,2CAA2C,8BAA8B,6CAA6C,oCAAoC,gBAAgB,qFAAqF,wBAAwB,2BAA2B,aAAa,iEAAiE,kBAAkB,0BAA0B,aAAa,YAAY,oCAAoC,yBAAyB,yCAAyC,gBAAgB,4CAA4C,iBAAiB,cAAc,kBAAkB,oDAAoD,oBAAoB,6DAA6D,0BAA0B,mDAAmD,aAAa,uBAAuB,mBAAmB,sDAAsD,gBAAgB,kBAAkB,iBAAiB,qBAAqB,sBAAsB,iEAAiE,oBAAoB,oBAAoB,0DAA0D,aAAa,cAAc,uBAAuB,oDAAoD,mBAAmB,cAAc,qBAAqB,kBAAkB,MAAM,OAAO,QAAQ,SAAS,8BAA8B,gBAAgB,kBAAkB,oBAAoB,2BAA2B,qBAAqB,gBAAgB,+BAA+B,aAAa,uCAAuC,kBAAkB,MAAM,QAAQ,SAAS,OAAO,WAAW,iBAAiB,UAAU,0BAA0B,uCAAuC,2CAA2C,8DAA8D,iBAAiB,8FAA8F,mBAAmB,0BAA0B,+DAA+D,uCAAuC,0DAA0D,oBAAoB;;ACA94E,MAAM,aAAa,YAAY,gBAAgB,gBAAgB,2BAA2B,MAAM,mBAAmB,0BAA0B,MAAM,mCAAmC,YAAY,OAAO,gBAAgB,kBAAkB,YAAY,0BAA0B,YAAY,mCAAmC,2BAA2B,YAAY,4CAA4C,2BAA2B,YAAY,QAAQ,0BAA0B,YAAY,eAAe,OAAO,MAAM,kCAAkC,cAAc,mCAAmC,6CAA6C,mCAAmC,gBAAgB,mBAAmB,WAAW,cAAc,kBAAkB,OAAO,MAAM,QAAQ,SAAS,iBAAiB,sCAAsC,2CAA2C,UAAU,0CAA0C,gBAAgB,mCAAmC,aAAa,wDAAwD,cAAc,2CAA2C,+BAA+B,kDAAkD,UAAU,oBAAoB,6CAA6C,gBAAgB,mDAAmD,iBAAiB,0BAA0B,YAAY,eAAe,YAAY,oCAAoC,2BAA2B,aAAa,6CAA6C,0BAA0B,aAAa,yCAAyC,8CAA8C,gBAAgB,gEAAgE,gBAAgB,mDAAmD,gBAAgB,cAAc,OAAO,2CAA2C,eAAe,2BAA2B,cAAc,iCAAiC,6BAA6B,cAAc,gBAAgB,2BAA2B,cAAc,4CAA4C,kCAAkC,0BAA0B,cAAc,eAAe,eAAe,OAAO,MAAM,SAAS,QAAQ,+BAA+B,6CAA6C,qCAAqC,gBAAgB,6CAA6C,sCAAsC,0BAA0B,cAAc,iBAAiB,6CAA6C,mCAAmC,sCAAsC,oCAAoC,+CAA+C,gBAAgB,qDAAqD,gBAAgB,kCAAkC,sCAAsC,6IAA6I,6EAA6E,gFAAgF,aAAa,+EAA+E,kCAAkC,UAAU,uEAAuE,+BAA+B,UAAU,8EAA8E,aAAa,6EAA6E,kCAAkC,UAAU,wEAAwE,+BAA+B","file":"4.f46a6915735f9deb48a8.css","sourcesContent":[".Switcher{display:inline-flex;align-items:center;position:relative;margin:0}.Switcher.disabled{pointer-events:none;opacity:0.5}.Switcher.inactive{pointer-events:none}body.animation-level-0 .Switcher .widget,body.animation-level-0 .Switcher .widget::after,.Switcher.no-animation .widget,.Switcher.no-animation .widget::after{transition:none !important}body.animation-level-0 .Switcher .widget:active:after,.Switcher.no-animation .widget:active:after{width:1.125rem}.Switcher input{height:0;width:0;visibility:hidden;position:absolute;z-index:var(--z-below);opacity:0}.Switcher .widget{cursor:pointer;text-indent:-999px;width:2.125rem;height:0.875rem;background:var(--color-gray);display:inline-block;border-radius:.5rem;position:relative;transition:background .2s ease-in}.Switcher .widget:after{content:'';position:absolute;top:-.125rem;left:0;width:1.125rem;height:1.125rem;background:var(--color-background);border-radius:.75rem;transition:0.2s ease-out;border:0.125rem solid var(--color-gray)}.Switcher input:checked+.widget{background:var(--color-primary)}.Switcher input:checked+.widget:after{left:calc(100% - 1.125rem);transform:translateX(calc(-100% + 1.125rem));border-color:var(--color-primary)}.Switcher .widget:active:after{width:1.25rem}\n","#LeftMainHeader{position:relative}#LeftMainHeader .animated-menu-icon{position:absolute}#LeftMainHeader .animated-menu-icon,#LeftMainHeader .animated-menu-icon::before,#LeftMainHeader .animated-menu-icon::after{width:1.125rem;height:0.125rem;border-radius:0.125rem;background-color:var(--color-text-secondary);transition:transform .25s;transform:rotate(0)}#LeftMainHeader .animated-menu-icon::before,#LeftMainHeader .animated-menu-icon::after{position:absolute;left:0;content:''}#LeftMainHeader .animated-menu-icon::before{top:-0.3125rem}#LeftMainHeader .animated-menu-icon::after{top:0.3125rem}#LeftMainHeader .animated-menu-icon.state-back{transform:rotate(180deg)}#LeftMainHeader .animated-menu-icon.state-back::before{transform:rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem)}#LeftMainHeader .animated-menu-icon.state-back::after{transform:rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem)}#LeftMainHeader .animated-menu-icon.no-animation{transition:none}#LeftMainHeader .animated-menu-icon.no-animation::before,#LeftMainHeader .animated-menu-icon.no-animation::after{transition:none}#LeftMainHeader .archived-badge{min-width:1.5rem;height:1.5rem;margin-left:auto;background:var(--color-gray);border-radius:0.75rem;padding:0 .45rem;color:white;font-size:0.875rem;line-height:1.5rem;font-weight:500;text-align:center;flex-shrink:0}#LeftMainHeader [dir=rtl] .archived-badge{margin-left:0;margin-right:auto}#LeftMainHeader .Menu .bubble{min-width:17rem;max-height:calc(100 * var(--vh) - 3.75rem);overflow-y:auto;overflow-y:overlay}.Transition>div:not(.active) #LeftMainHeader .Menu .bubble,body.animating-right-column #LeftMainHeader .Menu .bubble{transition:none !important}\n","#ConnectionState{flex:0 0 auto;display:flex;align-items:center;margin:0 0.5rem 0.5rem;padding:0.75rem;background:var(--color-yellow);border-radius:var(--border-radius-default)}#ConnectionState>.Spinner{--spinner-size: 1.75rem}#ConnectionState>.state-text{color:var(--color-text-lighter);font-weight:500;line-height:2rem;margin-inline-start:1.875rem;white-space:nowrap}@media (max-width: 950px){#ConnectionState>.state-text{margin-inline-start:1.25rem}}\n",".NewChatButton{position:absolute;right:1rem;bottom:1rem;transform:translateY(5rem);transition:transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1)}body.animation-level-0 .NewChatButton{transform:none !important;opacity:0;transition:opacity .15s}body.animation-level-0 .NewChatButton.revealed{opacity:1}.NewChatButton.revealed{transform:translateY(0)}@media (max-width: 600px){.NewChatButton.revealed{transform:translate3d(0, 0, 10px);transform-style:preserve-3d}}.NewChatButton.menu-is-open::before{content:'';display:block;position:absolute;top:-13rem;left:-11rem;right:-1rem;bottom:-1rem;z-index:-1}.is-touch-env .NewChatButton .Menu>.backdrop{position:absolute;left:-100vw;right:-100vw;top:-100vh;bottom:-100vh}.NewChatButton>.Button .icon-new-chat-filled,.NewChatButton>.Button .icon-close{position:absolute}.NewChatButton>.Button:not(.active) .icon-new-chat-filled{animation:grow-icon .4s ease-out}.NewChatButton>.Button:not(.active) .icon-close{animation:hide-icon .4s forwards ease-out}.NewChatButton>.Button.active .icon-close{animation:grow-icon .4s ease-out}.NewChatButton>.Button.active .icon-new-chat-filled{animation:hide-icon .4s forwards ease-out}\n","#LeftColumn-main{height:100%;position:relative;display:flex;flex-direction:column;overflow:hidden;z-index:1}#LeftColumn-main .connection-state-wrapper{position:absolute;top:3.75rem;width:100%}#LeftColumn-main>.Transition{flex:1;overflow:hidden;transition:transform 300ms ease}#LeftColumn-main>.Transition.pull-down{transform:translateY(3.75rem)}#LeftColumn-main .ChatFolders{height:100%;display:flex;flex-direction:column;overflow:hidden}#LeftColumn-main .ChatFolders .tabs-placeholder{height:2.625rem;transition:height 150ms ease}#LeftColumn-main .ChatFolders .tabs-placeholder:not(.open){height:0}#LeftColumn-main .ChatFolders .TabList{justify-content:flex-start;padding-left:.5625rem;padding-bottom:1px;border-bottom:0;z-index:1}#LeftColumn-main .ChatFolders .Tab{flex:0 0 auto;padding-left:0.625rem;padding-right:0.625rem}#LeftColumn-main .ChatFolders .Tab>span{padding-left:0.5rem;padding-right:0.5rem}#LeftColumn-main .ChatFolders>.Transition{flex:1;overflow:hidden}#LeftColumn-main .chat-list,#LeftColumn-main .RecentContacts,#LeftColumn-main .LeftSearch,#LeftColumn-main .search-content{height:100%;overflow-y:auto}#LeftColumn-main .btn-update{position:absolute;bottom:1rem;left:1rem;right:1rem;margin:0 auto}\n","#LeftColumn{overflow:hidden}#NewChat{height:100%}.left-header{height:var(--header-height);padding:0.375rem 1.25rem .5rem 0.8125rem;display:flex;align-items:center;flex-shrink:0;background-color:var(--color-background)}.left-header h3{margin-bottom:0;font-size:1.25rem;font-weight:500;margin-left:1.375rem}.left-header .SearchInput{margin-left:0.875rem;max-width:calc(100% - 3.625rem)}@media (max-width: 600px){.left-header .SearchInput{max-width:calc(100% - 3.375rem)}}@media (max-width: 600px){.left-header{padding:0.5rem}}\n",".AudioPlayer{display:flex;margin-left:auto;margin-top:-.25rem;margin-bottom:-.25rem}body.animation-level-0 .AudioPlayer{transition:none !important}.AudioPlayer>.Button{flex-shrink:0;margin:.125rem}.AudioPlayer>.toggle-play{--color-text-secondary: var(--color-primary);--color-text-secondary-rgb: var(--color-primary-shade-rgb);--color-primary-shade: var(--color-green);--color-white: var(--color-background-own)}.MiddleHeader .AudioPlayer+.HeaderActions{margin-left:1.5rem}.AudioPlayer .toggle-play.smaller{width:3rem;height:3rem}.AudioPlayer .toggle-play.smaller i{font-size:1.625rem;margin-top:-.025rem}.AudioPlayer .toggle-play i{position:absolute;font-size:1.9375rem;margin-top:-.05rem}.AudioPlayer .toggle-play i.icon-play{margin-left:.1rem}.AudioPlayer .toggle-play .icon-play,.AudioPlayer .toggle-play .icon-pause{opacity:1;transform:scale(1);transition:opacity 0.4s,transform 0.6s cubic-bezier(0.34, 1.56, 0.64, 1)}.AudioPlayer .toggle-play.play .icon-pause,.AudioPlayer .toggle-play.pause .icon-play,.AudioPlayer .toggle-play.loading .icon-play,.AudioPlayer .toggle-play.loading .icon-pause{opacity:0;transform:scale(0.5)}.AudioPlayer-content{display:flex;justify-content:center;flex-direction:column;flex-shrink:1;padding:.25rem .5rem;position:relative;overflow:hidden;cursor:pointer;max-width:15rem;border-radius:var(--border-radius-messages-small)}.AudioPlayer-content:hover{background-color:var(--color-interactive-element-hover)}@media (min-width: 1440px) and (max-width: 1500px){.AudioPlayer-content{max-width:14rem}}.AudioPlayer .AudioPlayer-content .title{display:block;font-weight:500;font-size:0.875rem !important;line-height:1rem;height:1rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}body.is-ios .AudioPlayer .AudioPlayer-content .title{font-size:.9375rem !important;line-height:.8125rem}.AudioPlayer-content .subtitle{font-size:0.85rem !important;color:var(--color-text-secondary);line-height:1.125rem;height:1.125rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:.125rem 0 0}body.is-ios .AudioPlayer-content .subtitle{font-size:.9375rem !important}\n",".MiddleHeader{display:flex;align-items:center;width:100%;box-shadow:0 2px 2px var(--color-light-shadow);background:var(--color-background);padding:.5rem .8125rem .5rem 1.5rem;position:relative;z-index:var(--z-middle-header)}@media (max-width: 600px){.MiddleHeader{padding:0.5rem;position:relative;transform:translate3d(0, 0, 10px);transform-style:preserve-3d}}.MiddleHeader .Transition{width:100%;min-width:0}.MiddleHeader .Transition>div{display:flex;align-items:center;width:100%}.MiddleHeader .back-button{margin-left:-0.5rem;margin-right:0.5rem;position:relative}@media (max-width: 600px){.MiddleHeader .back-button{margin-left:0}}.MiddleHeader .back-button .unread-count{min-width:1.25rem;height:1.25rem;padding:0 0.375rem;border-radius:0.625rem;font-size:0.75rem;line-height:1.25rem;font-weight:500;text-align:center;position:absolute;top:-0.25rem;right:-0.5rem;background:var(--color-gray);color:white;pointer-events:none}.MiddleHeader .back-button .unread-count.active{background:var(--color-primary)}.MiddleHeader .chat-info-wrapper{flex-grow:1;overflow:hidden}.MiddleHeader .header-tools{display:flex;align-items:center;justify-content:flex-end;margin-left:auto;flex-shrink:0}body.animation-level-0 .MiddleHeader .header-tools,body.animation-level-0 .MiddleHeader .header-tools .HeaderPinnedMessage-wrapper,body.animation-level-0 .MiddleHeader .header-tools .AudioPlayer,body.animation-level-0 .MiddleHeader .header-tools .HeaderActions{transition:none !important}@media (min-width: 1276px) and (max-width: 1439px){.MiddleHeader .header-tools .HeaderActions{transform:translate3d(0, 0, 0);transition:transform var(--layer-transition)}#Main.right-column-open .MiddleHeader .header-tools .HeaderActions{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0)}}@media (min-width: 1440px){.MiddleHeader .header-tools{transform:translate3d(0, 0, 0);transition:transform var(--layer-transition)}#Main.right-column-open .MiddleHeader .header-tools{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0)}}.Transition>div:not(.active) .MiddleHeader .header-tools,body.animating-right-column .MiddleHeader .header-tools{pointer-events:none}@media (min-width: 1276px) and (max-width: 1439px){.MiddleHeader:not(.tools-stacked) .header-tools .HeaderPinnedMessage-wrapper,.MiddleHeader:not(.tools-stacked) .header-tools .AudioPlayer{opacity:1}#Main.right-column-open .MiddleHeader:not(.tools-stacked) .header-tools .HeaderPinnedMessage-wrapper,#Main.right-column-open .MiddleHeader:not(.tools-stacked) .header-tools .AudioPlayer{opacity:0}}.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage-wrapper,.MiddleHeader.tools-stacked .header-tools .AudioPlayer{position:absolute;top:100%;left:0;right:0;height:2.875rem;overflow:hidden;box-shadow:0 2px 2px var(--color-light-shadow);display:flex;flex-direction:row-reverse;padding:0.375rem 0.5rem;padding-left:0.75rem;background:var(--color-background)}.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage-wrapper::before,.MiddleHeader.tools-stacked .header-tools .AudioPlayer::before{content:\"\";display:block;position:absolute;top:-.1875rem;left:0;right:0;height:.125rem;box-shadow:0 0.125rem 0.125rem var(--color-light-shadow)}.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage-wrapper .HeaderPinnedMessage,.MiddleHeader.tools-stacked .header-tools .AudioPlayer .HeaderPinnedMessage{max-width:unset;margin-top:-0.1875rem}.MiddleHeader.tools-stacked .header-tools .AudioPlayer{height:3.25rem;flex-direction:row;padding:0.375rem 0.5rem}.MiddleHeader.tools-stacked .header-tools .AudioPlayer-content{padding:0 0.5rem;flex-grow:1}.MiddleHeader.tools-stacked .header-tools .AudioPlayer>.Button{margin:0}.MiddleHeader.tools-stacked .header-tools .AudioPlayer>.player-close{margin-left:auto}.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage{flex-grow:1;padding-top:0;padding-bottom:0}.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage::before{top:0.125rem;bottom:0.125rem}.MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage .message-text{max-width:none}@media (min-width: 1150px){#Main.right-column-open .MiddleHeader.tools-stacked .header-tools .HeaderPinnedMessage-wrapper,#Main.right-column-open .MiddleHeader.tools-stacked .header-tools .AudioPlayer{padding-right:calc(0.5rem + var(--right-column-width))}}.MiddleHeader.tools-stacked.animated .header-tools .HeaderPinnedMessage-wrapper,.MiddleHeader.tools-stacked.animated .header-tools .AudioPlayer{animation:fade-in var(--layer-transition) forwards}body.animation-level-0 .MiddleHeader.tools-stacked.animated .header-tools .HeaderPinnedMessage-wrapper,body.animation-level-0 .MiddleHeader.tools-stacked.animated .header-tools .AudioPlayer{animation:none}.MiddleHeader h3{font-weight:500;font-size:1.125rem;line-height:1.375rem;white-space:pre;margin:0;overflow:hidden;text-overflow:ellipsis;unicode-bidi:plaintext}body.is-ios .MiddleHeader h3,body.is-macos .MiddleHeader h3{font-size:1.0625rem;font-weight:600}@media (max-width: 600px){.MiddleHeader h3{display:block;overflow:hidden;text-overflow:ellipsis}}@media (min-width: 1275px){#Main.right-column-open .MiddleHeader h3{max-width:calc(100% - var(--right-column-width))}}.MiddleHeader .ChatInfo{cursor:pointer;display:flex;align-items:center}.MiddleHeader .ChatInfo .info{display:flex;flex-direction:column;justify-content:center;flex-grow:1;overflow:hidden}.MiddleHeader .ChatInfo .title{display:flex;align-items:center}.MiddleHeader .ChatInfo .title .VerifiedIcon{width:1.25rem;height:1.25rem;margin-left:0.25rem;margin-top:0.05rem}.MiddleHeader .ChatInfo .user-status,.MiddleHeader .ChatInfo .status{unicode-bidi:plaintext}.MiddleHeader .Avatar{margin-right:.625rem;width:2.5rem;height:2.5rem;font-size:1.0625rem}.MiddleHeader .status,.MiddleHeader .typing-status{font-size:0.875rem;line-height:1.125rem;margin:0;color:var(--color-text-secondary);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;display:inline-block}.MiddleHeader .status .ellipsis,.MiddleHeader .typing-status .ellipsis{display:inline-flex}.MiddleHeader .status.online,.MiddleHeader .typing-status.online{color:var(--color-primary)}.MiddleHeader .status .font-emoji,.MiddleHeader .typing-status .font-emoji{line-height:1rem}.MiddleHeader .Button.smaller{width:2.5rem;height:2.5rem}.MiddleHeader .HeaderPinnedMessage-wrapper{display:flex;align-items:center;margin-left:auto;cursor:default;flex-direction:row-reverse}body.animation-level-1 .MiddleHeader .HeaderPinnedMessage-wrapper .ripple-container{display:none}.MiddleHeader .HeaderPinnedMessage-wrapper .HeaderPinnedMessage{min-width:16rem}.MiddleHeader .HeaderPinnedMessage-wrapper>.Button{flex-shrink:0}.MiddleHeader .HeaderPinnedMessage{display:flex;flex-shrink:1;margin-top:-0.25rem;margin-bottom:-0.25rem;padding:0.25rem;padding-left:0.375rem;border-radius:var(--border-radius-messages-small);position:relative;overflow:hidden;cursor:pointer}.MiddleHeader .HeaderPinnedMessage:hover{background-color:var(--color-interactive-element-hover)}.MiddleHeader .HeaderPinnedMessage .pinned-message-border{position:relative;height:2.25rem;margin:0.125rem 0;width:0.125rem;min-width:0.125rem;overflow:hidden}.MiddleHeader .HeaderPinnedMessage .pinned-message-border .pinned-message-border-wrapper-1{height:2.25rem;width:0.125rem;border-radius:0.0625rem;background:var(--color-primary)}.MiddleHeader .HeaderPinnedMessage .pinned-message-border .pinned-message-border-wrapper{background-color:var(--color-primary-opacity);position:relative;will-change:transform;transition:transform .25s ease-in-out}.MiddleHeader .HeaderPinnedMessage .pinned-message-border .pinned-message-border-mark{position:absolute;left:0;top:0;width:0.125rem;background:var(--color-primary);border-radius:0.0625rem;will-change:transform;transition:transform .25s ease-in-out}.MiddleHeader .HeaderPinnedMessage .message-text{overflow:hidden;margin-inline-start:0.375rem;margin-top:0.125rem;max-width:15rem}@media (min-width: 1440px) and (max-width: 1500px){.MiddleHeader .HeaderPinnedMessage .message-text{max-width:14rem}}.MiddleHeader .HeaderPinnedMessage .message-text .title{font-weight:500;font-size:0.875rem;line-height:1rem;height:1rem;color:var(--color-primary);margin-bottom:0.125rem;white-space:pre;text-align:initial}body.is-ios .MiddleHeader .HeaderPinnedMessage .message-text .title{font-size:.9375rem}.MiddleHeader .HeaderPinnedMessage .message-text p{font-size:0.875rem;line-height:1.125rem;height:1.125rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0}body.is-ios .MiddleHeader .HeaderPinnedMessage .message-text p{font-size:.9375rem}.MiddleHeader .HeaderPinnedMessage .emoji-small{width:1rem;height:1rem}.MiddleHeader .HeaderPinnedMessage>img{width:2.25rem;height:2.25rem;object-fit:cover;border-radius:0.25rem;margin-inline-start:0.375rem;margin-top:0.125rem;flex-shrink:0}.MiddleHeader .HeaderPinnedMessage>img+.message-text{max-width:12rem}.MiddleHeader .HeaderActions{flex-shrink:0;margin-left:auto;display:flex;align-items:center;justify-content:flex-end}.MiddleHeader .HeaderActions .toggle-right-pane-button.active{color:var(--color-primary);opacity:1}.MiddleHeader .HeaderPinnedMessage-wrapper .Button,.MiddleHeader .HeaderActions .Button{margin-left:0.25rem}.MiddleHeader .HeaderPinnedMessage-wrapper .Button.tiny,.MiddleHeader .HeaderActions .Button.tiny{margin-right:.625rem}@media (max-width: 600px){.MiddleHeader .HeaderPinnedMessage-wrapper,.MiddleHeader .AudioPlayer{position:absolute;top:100%;left:0;right:0;height:2.875rem;overflow:hidden;box-shadow:0 2px 2px var(--color-light-shadow);display:flex;flex-direction:row-reverse;padding:0.375rem 0.5rem;padding-left:0.75rem;background:var(--color-background)}.MiddleHeader .HeaderPinnedMessage-wrapper::before,.MiddleHeader .AudioPlayer::before{content:\"\";display:block;position:absolute;top:-.1875rem;left:0;right:0;height:.125rem;box-shadow:0 0.125rem 0.125rem var(--color-light-shadow)}.MiddleHeader .HeaderPinnedMessage-wrapper .HeaderPinnedMessage,.MiddleHeader .AudioPlayer .HeaderPinnedMessage{max-width:unset;margin-top:-0.1875rem}.MiddleHeader .AudioPlayer{height:3.25rem;flex-direction:row;padding:0.375rem 0.5rem}.MiddleHeader .AudioPlayer-content{padding:0 0.5rem;flex-grow:1}.MiddleHeader .AudioPlayer>.Button{margin:0}.MiddleHeader .AudioPlayer>.player-close{margin-left:auto}.MiddleHeader .HeaderPinnedMessage{flex-grow:1;padding-top:0;padding-bottom:0}.MiddleHeader .HeaderPinnedMessage::before{top:0.125rem;bottom:0.125rem}.MiddleHeader .HeaderPinnedMessage .message-text{max-width:none}.MiddleHeader .HeaderPinnedMessage-wrapper,.MiddleHeader .AudioPlayer{transform:translate3d(0, 0, 0)}}@media (min-width: 925px) and (max-width: 1149.9px){.MiddleHeader .HeaderPinnedMessage-wrapper,.MiddleHeader .AudioPlayer{position:absolute}}@keyframes fade-in{from{opacity:0}to{opacity:1}}\n",".EmbeddedMessage{display:flex;align-items:center;font-size:calc(var(--message-text-size, 1rem) - .125rem);line-height:1.125rem;margin:0 -0.25rem .0625rem;padding:.1875rem 0.25rem .1875rem .4375rem;border-radius:var(--border-radius-messages-small);position:relative;overflow:hidden;cursor:pointer;direction:ltr}body.animation-level-1 .EmbeddedMessage .ripple-container{display:none}.custom-shape .EmbeddedMessage{max-width:15rem;padding:0.5rem;margin:0;background-color:var(--background-color);box-shadow:0 1px 2px var(--color-default-shadow)}.custom-shape .EmbeddedMessage::before{left:.625rem;top:.625rem;bottom:.625rem}.custom-shape .EmbeddedMessage img:not(.emoji){margin-inline-start:.5rem}.custom-shape .EmbeddedMessage:dir(rtl){padding:0.5rem}.EmbeddedMessage::before{content:'';display:block;position:absolute;top:.3125rem;bottom:.3125rem;left:.3125rem;width:2px;background:var(--accent-color);border-radius:2px}.EmbeddedMessage:hover{background-color:var(--hover-color)}.EmbeddedMessage:active{background-color:var(--active-color)}.EmbeddedMessage .message-title{font-size:calc(var(--message-text-size, 1rem) - .125rem)}.EmbeddedMessage .message-text{overflow:hidden;margin-inline-start:0.5rem;display:flex;flex-direction:column-reverse}.EmbeddedMessage .message-text .message-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:0.125rem;flex:1;display:block}.EmbeddedMessage .message-text p{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:1.125rem;margin-bottom:0;flex:1}.EmbeddedMessage .message-text p::after{content:none;display:none}.EmbeddedMessage .message-text .emoji{width:calc(1.125 * var(--message-text-size, 1rem)) !important;height:calc(1.125 * var(--message-text-size, 1rem)) !important;vertical-align:text-bottom !important}.EmbeddedMessage .embedded-action-message{color:var(--accent-color);opacity:0.75}.EmbeddedMessage img:not(.emoji){width:2rem;height:2rem;object-fit:cover;border-radius:.25rem;margin-left:.25rem;flex-shrink:0}.EmbeddedMessage img:not(.emoji).round{border-radius:1rem}.EmbeddedMessage.inside-input{padding-inline-start:0.5625rem;margin:0 0 -.125rem -0.1875rem;display:grid;grid-template-columns:auto 1fr;grid-template-rows:1fr;width:100%;--accent-color: var(--color-primary);--hover-color: var(--color-interactive-element-hover)}.EmbeddedMessage.inside-input::before{bottom:.3125rem}.EmbeddedMessage.inside-input img:not(.emoji){margin-left:.125rem}.EmbeddedMessage.inside-input .message-text{margin-inline-start:.375rem}.EmbeddedMessage.inside-input .message-title{font-weight:500;color:var(--accent-color)}\n",".MessageMeta{position:absolute;height:1.25rem;bottom:0;right:0;display:flex;align-items:center;background:rgba(153,153,153,0.6);border-radius:.625rem;padding:0 .25rem;color:white;cursor:pointer;max-width:100%}.MessageMeta .message-time,.MessageMeta .message-signature,.MessageMeta .message-views{font-size:.75rem;white-space:nowrap}.MessageMeta .message-time{margin-right:.1875rem}.MessageMeta .message-views{margin-left:.1875rem}.MessageMeta .message-signature{overflow:hidden;text-overflow:ellipsis;margin-right:0.375rem}.MessageMeta .icon-channelviews{margin-left:0.125rem;margin-right:0.375rem;font-size:1.125rem;position:relative;top:-0.0625rem}.has-solid-background .MessageMeta{color:rgba(var(--color-text-meta-rgb), 0.75);background:none}.media:not(.text) .MessageMeta,.Message .custom-shape .MessageMeta{background:rgba(0,0,0,0.2);--color-accent-own: white;--color-accent: white;color:white !important;opacity:1;bottom:.25rem;right:.25rem;left:auto;height:1.125rem;padding:0 .3125rem 0 .375rem}.media:not(.text) .MessageMeta .MessageOutgoingStatus i,.Message .custom-shape .MessageMeta .MessageOutgoingStatus i{background:transparent}.media:not(.text):dir(rtl) .MessageMeta,.Message .custom-shape:dir(rtl) .MessageMeta{right:auto !important;left:.25rem;padding:0 .375rem 0 .3125rem}.is-forwarded.media:not(.text):dir(rtl) .MessageMeta,.Message .is-forwarded.custom-shape:dir(rtl) .MessageMeta{left:.8125rem}.is-forwarded.media:not(.text) .MessageMeta{bottom:0.935rem;right:0.8125rem}.emoji-only .MessageMeta{right:0}.Message.own .has-solid-background .MessageMeta{color:var(--color-message-meta-own)}.MessageMeta .MessageOutgoingStatus{margin-left:-.1875rem;font-size:1.1875rem;border-radius:.625rem}.Message.own .MessageMeta .MessageOutgoingStatus{color:var(--color-accent-own)}.message-content.has-replies:not(.custom-shape) .MessageMeta{bottom:3.375rem}.message-content.has-replies.text:not(.custom-shape) .MessageMeta{bottom:3.4375rem}.Message:not(.own) .custom-shape .reply-message+.MessageMeta{right:auto;left:13.2rem;bottom:0.25rem}.Message:not(.own) .emoji-only-1 .reply-message+.MessageMeta{left:2.5rem}.Message:not(.own) .emoji-only-2 .reply-message+.MessageMeta{left:5.5rem}.Message:not(.own) .emoji-only-3 .reply-message+.MessageMeta{left:6.5rem}\n",".Sticker:not(.inactive){cursor:pointer}.Sticker.inactive{pointer-events:none}\n",".Contact{display:flex;align-items:center;padding:0.25rem}.Contact.interactive{cursor:pointer}.Contact .Avatar{margin-right:0.8rem}.Contact .contact-info{padding:0.5rem;padding-left:0;white-space:nowrap;overflow:hidden}.Contact .contact-info .contact-name{font-size:1rem;line-height:1rem;margin-bottom:0.25rem;font-weight:500}.Contact .contact-info .contact-phone{line-height:1rem;color:var(--secondary-color)}\n",".PollOption{display:flex;flex-flow:row nowrap;margin-bottom:0.75rem}.PollOption:last-child{margin-bottom:0}.PollOption .poll-option-text{word-break:break-word}.PollOption .poll-option-share{position:relative;margin-top:.125rem;width:1.75rem;margin-inline-end:.5rem;flex-shrink:0;font-weight:500;font-size:.875rem;text-align:right}.PollOption .poll-option-share.limit-width{display:inline-flex;justify-content:center;font-size:.75rem}.PollOption .poll-option-chosen{position:absolute;right:0;bottom:-5px;width:1rem;height:1rem;background:var(--accent-color);color:var(--background-color);border-radius:.5rem;font-size:.75rem;text-align:center}.PollOption .poll-option-chosen.wrong{background:var(--color-error)}.is-forwarded .PollOption .poll-option-chosen>i{margin-left:1px}.PollOption .poll-option-chosen.animate{opacity:0;animation-name:PollOptionIconAnimate;animation-delay:.09s;animation-duration:.3s;animation-fill-mode:forwards}.PollOption .poll-option-right{flex-grow:1}.PollOption .poll-option-answer{position:relative}.PollOption .poll-option-line{position:relative;width:0;height:0.25rem;min-width:0.5rem;border-radius:0.125rem;margin-top:0.5rem;background:var(--accent-color);transform-origin:0 0;transition:transform .3s;transition-delay:.09s}.PollOption .poll-line{width:30px;height:35px;position:absolute;left:-27px;bottom:-5px;transition:stroke-dashoffset .3s, stroke-dasharray .3s;stroke-dashoffset:0;stroke-dasharray:0, 200%}.PollOption .poll-line path{stroke-width:4px;stroke-linecap:round;stroke:var(--accent-color);fill:none}.PollOption .wrong .poll-option-line{background:var(--color-error)}.PollOption .wrong .poll-line path{stroke:var(--color-error)}@keyframes PollOptionIconAnimate{0%{opacity:0}100%{opacity:1}}\n",".Poll{min-width:15rem;text-align:initial}@media (max-width: 600px){.Poll{min-width:50vw}}.Poll .poll-question{font-weight:500;line-height:1.25rem;margin:0.125rem 0;word-break:break-word}.Poll .poll-type,.Poll .poll-voters-count{color:var(--secondary-color);font-size:0.875rem}.Poll .poll-type{margin-bottom:0.5rem;display:flex;align-items:center;min-height:1.375rem}.Poll .poll-voters-count{margin:.4375rem 0 .3125rem;text-align:center}.Poll .poll-answers{padding-top:0.25rem;padding-bottom:1rem}.Poll .Checkbox,.Poll .Radio{padding-left:2.25rem}.Poll .Checkbox:last-child,.Poll .Radio:last-child{margin-bottom:.75rem}.Poll .Checkbox.disabled,.Poll .Radio.disabled{opacity:1 !important;cursor:not-allowed}.Poll .Checkbox .Checkbox-main::before,.Poll .Checkbox .Radio-main::before,.Poll .Radio .Checkbox-main::before,.Poll .Radio .Radio-main::before{left:0.125rem;background-color:var(--background-color)}.theme-dark .Poll .Checkbox .Checkbox-main::before,.theme-dark .Poll .Checkbox .Radio-main::before,.theme-dark .Poll .Radio .Checkbox-main::before,.theme-dark .Poll .Radio .Radio-main::before{--color-borders: var(--color-borders-input)}.Message.own .Poll .Checkbox .Checkbox-main::before,.Message.own .Poll .Checkbox .Radio-main::before,.Message.own .Poll .Radio .Checkbox-main::before,.Message.own .Poll .Radio .Radio-main::before{--color-borders: var(--accent-color)}.Poll .Checkbox .Checkbox-main::after,.Poll .Checkbox .Radio-main::after,.Poll .Radio .Checkbox-main::after,.Poll .Radio .Radio-main::after{left:0.4375rem;background-color:var(--accent-color)}.Poll .Checkbox input:checked ~ .Radio-main::before,.Poll .Checkbox input:checked ~ .Checkbox-main::before,.Poll .Radio input:checked ~ .Radio-main::before,.Poll .Radio input:checked ~ .Checkbox-main::before{border-color:var(--accent-color)}.Poll .Checkbox .Spinner,.Poll .Radio .Spinner{left:0.125rem}.Poll .Checkbox .Checkbox-main::after{left:0.125rem;background-color:var(--color-primary)}.Message.own .Poll .Checkbox .Checkbox-main::after{background-color:var(--accent-color)}.Poll .Spinner>div{background-image:var(--spinner-gray-data)}.theme-dark .Poll .Spinner>div{background-image:var(--spinner-white-data)}.Message.own .Poll .Spinner>div{background-image:var(--spinner-green-data)}.theme-dark .Message.own .Poll .Spinner>div{background-image:var(--spinner-white-data)}.Poll .poll-recent-voters{display:inline-flex;align-items:center;vertical-align:text-bottom;margin-left:.875rem;margin-right:.5rem;margin-top:-2px}.Poll .poll-recent-voters .Avatar{border:1px solid var(--color-white);margin-right:0;box-sizing:content-box}.Poll .poll-recent-voters .Avatar:not(:first-child){margin-left:-3px}.Poll .poll-countdown{margin-left:auto;font-size:.75rem;transition:color .2s}.Poll .poll-countdown.hurry-up{color:var(--color-error)}.Poll .poll-countdown.hurry-up .poll-countdown-progress{stroke:var(--color-error)}.Poll .poll-countdown svg{vertical-align:-3px}.Poll .poll-countdown-progress{stroke:var(--color-primary);fill:transparent;stroke-width:2;stroke-linecap:round;transition:stroke-dashoffset 2s, stroke .2s}.Poll .poll-quiz-help{margin:-.625rem 0 -.625rem auto}.Message:not(.own) .Poll .poll-quiz-help{color:var(--color-primary)}.Poll .poll-results,.Poll .poll-answers{padding-top:0.25rem;padding-bottom:0.5rem}.Poll .Button{text-transform:none;font-size:1rem}.Message.own .Poll .Button{color:var(--accent-color);--color-primary-shade-rgb: var(--color-accent-own)}.Poll>.Button{margin-top:-.125rem;margin-bottom:-.0625rem}\n",".WebPage{margin-top:0.25rem;margin-bottom:0.125rem;padding-left:.625rem;font-size:calc(var(--message-text-size, 1rem) - .125rem);line-height:1.125rem;max-width:29rem;position:relative}.WebPage::before{content:'';display:block;position:absolute;top:0;bottom:0;left:0;width:.125rem;background:var(--accent-color);border-radius:.125rem}.WebPage-text{display:flex;flex-direction:column;align-items:flex-start}.WebPage .media-inner{margin:0 !important;margin-bottom:0.375rem !important}.WebPage .media-inner,.WebPage .media-inner img,.WebPage .media-inner.small-image img{border-radius:var(--border-radius-messages-small) !important}.WebPage .media-inner.square-image{width:5rem;height:5rem;min-height:0;margin-bottom:0 !important}.WebPage .media-inner.square-image img{width:100%;height:100%}.WebPage.with-video .media-inner{margin-top:0.5rem !important;margin-bottom:1rem !important}.WebPage.with-square-photo{display:flex;margin-bottom:1rem}.WebPage.with-square-photo .WebPage-text{order:1;padding-right:1rem}.WebPage.with-square-photo .media-inner{order:2;flex-shrink:0}.WebPage.with-square-photo:dir(rtl) .WebPage-text{padding-inline-end:1rem}.WebPage:not(.with-square-photo) .site-name:last-child::after,.WebPage:not(.with-square-photo) .site-title:last-child::after,.WebPage:not(.with-square-photo) .site-description:last-child::after{content:'';display:inline-block;width:var(--meta-safe-area-size);height:0.75rem;float:right}.WebPage .site-name,.WebPage .site-description,.WebPage .site-title{word-break:break-word;max-width:100%}.WebPage .site-name{color:var(--accent-color);font-weight:500;margin-bottom:0.125rem}.WebPage .site-title{font-weight:500;margin-bottom:0.125rem}.WebPage .site-description{line-height:1.25;margin-bottom:0}body.is-ios .WebPage .site-description{line-height:1.125rem}.WebPage:dir(rtl){padding-inline-start:.625rem}.WebPage:dir(rtl)::before{left:auto;right:0}\n",".Invoice .title{color:var(--accent-color);font-weight:500}.Invoice .description{position:relative}.Invoice .description.has-image .invoice-image{max-width:100%;height:20rem}@media (max-width: 600px){.Invoice .description.has-image .invoice-image{height:10rem}}.Invoice .description.has-image .description-text{position:absolute;top:0;padding:.25rem .5rem;margin:.25rem;background-color:rgba(90,110,70,0.6);border-radius:var(--border-radius-messages-small);color:var(--color-text);font-weight:500}\n",".Album{position:relative;overflow:hidden}.message-content.media.text .Album{margin:-0.3125rem -0.5rem 0.3125rem}.forwarded-message .Album{margin-bottom:.125rem}.message-content.media.text .forwarded-message .Album{margin:0 0 0.3125rem;--border-bottom-left-radius: inherit;--border-bottom-right-radius: inherit}.Album>.album-item-select-wrapper .media-inner,.message-content.media.text .Album>.album-item-select-wrapper .media-inner{margin:0 !important}.Album>.album-item-select-wrapper .media-inner,.Album>.album-item-select-wrapper .media-inner img,.Album>.album-item-select-wrapper .media-inner video{border-radius:0 !important;object-fit:cover}\n",".RoundVideo{position:relative;width:200px;height:200px;cursor:pointer}.RoundVideo .thumbnail-wrapper{width:200px;height:200px;border-radius:50%;overflow:hidden}.RoundVideo .video-wrapper{position:absolute;left:0;top:0;border-radius:50%;overflow:hidden}.RoundVideo .progress{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.RoundVideo .progress-circle{stroke:white;fill:transparent;stroke-width:4;stroke-opacity:.35;stroke-linecap:round}.RoundVideo video::-internal-media-controls-cast-button,.RoundVideo video::-webkit-media-controls,.RoundVideo video::-webkit-media-controls-start-playback-button{display:none}\n",".InlineButtons{display:flex;flex-direction:column}.InlineButtons .row{display:flex;flex-direction:row}.InlineButtons .Button{flex:1;width:auto;margin:0.125rem;background:var(--pattern-color);border-radius:var(--border-radius-messages-small);font-weight:500;text-transform:none}.InlineButtons .Button::before{content:'';background-color:var(--color-white);opacity:0;position:absolute;top:0;left:0;right:0;bottom:0;border-radius:var(--border-radius-messages-small);z-index:var(--z-below);transition:opacity 200ms}.InlineButtons .Button:hover{background:var(--pattern-color) !important}.InlineButtons .Button:hover::before{opacity:.4}.InlineButtons .Button:first-of-type{margin-left:0}.InlineButtons .Button:last-of-type{margin-right:0}.InlineButtons .Button i{font-size:0.75rem;position:absolute;right:0.125rem;top:0.125rem;display:block;transform:rotate(-45deg)}.InlineButtons .row:first-of-type .Button{margin-top:0.25rem !important}.InlineButtons .row:last-of-type .Button{margin-bottom:0}.InlineButtons .row:last-of-type .Button:first-of-type{border-bottom-left-radius:var(--border-radius-messages)}.InlineButtons .row:last-of-type .Button:last-of-type{border-bottom-right-radius:var(--border-radius-messages)}\n",".CommentButton{--background-color: var(--color-background);--hover-color: var(--color-chat-hover);display:flex;width:100%;align-items:center;padding:.5625rem .25rem .5625rem .625rem;padding-inline-start:.625rem;padding-inline-end:.25rem;background:var(--background-color);border-bottom-right-radius:var(--border-bottom-right-radius);border-bottom-left-radius:var(--border-bottom-left-radius);font-size:.9375rem;font-weight:500;line-height:2rem;color:var(--accent-color);white-space:nowrap;cursor:pointer;transition:background-color .15s, color .15s}body.animation-level-0 .CommentButton{transition:none !important}.Message .has-appendix .CommentButton::before{content:'';display:block;position:absolute;bottom:-.1875rem;left:-.5625rem;width:.5625rem;height:1.25rem;background-position:bottom left;background-image:url('data:image/svg+xml,%3Csvg width=\"9\" height=\"20\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"%3E%3Cdefs%3E%3Cfilter x=\"-50%25\" y=\"-14.7%25\" width=\"200%25\" height=\"141.2%25\" filterUnits=\"objectBoundingBox\" id=\"a\"%3E%3CfeOffset dy=\"1\" in=\"SourceAlpha\" result=\"shadowOffsetOuter1\"/%3E%3CfeGaussianBlur stdDeviation=\"1\" in=\"shadowOffsetOuter1\" result=\"shadowBlurOuter1\"/%3E%3CfeColorMatrix values=\"0 0 0 0 0.0621962482 0 0 0 0 0.138574144 0 0 0 0 0.185037364 0 0 0 0.15 0\" in=\"shadowBlurOuter1\"/%3E%3C/filter%3E%3Cpath d=\"M3 17h6V0c-.193 2.84-.876 5.767-2.05 8.782-.904 2.325-2.446 4.485-4.625 6.48A1 1 0 003 17z\" id=\"b\"/%3E%3C/defs%3E%3Cg fill=\"none\" fill-rule=\"evenodd\"%3E%3Cuse fill=\"%23000\" filter=\"url(%23a)\" xlink:href=\"%23b\"/%3E%3Cuse fill=\"%23FFF\" xlink:href=\"%23b\"/%3E%3C/g%3E%3C/svg%3E');opacity:0;transition:opacity .15s, filter .15s}.theme-dark #root .Message .has-appendix .CommentButton::before{filter:invert(0.83)}body.animation-level-0 .Message .has-appendix .CommentButton::before{transition:none !important}.custom-shape .CommentButton{position:absolute;right:-3rem;width:2.25rem;bottom:3rem;height:3.375rem;border-radius:1.375rem;padding:0.375rem .3125rem .25rem;align-items:flex-start;color:white;background-color:rgba(0,0,0,0.2);opacity:0;transition:opacity .2s ease}@media (pointer: coarse){.custom-shape .CommentButton{opacity:1 !important}}.custom-shape .CommentButton:hover{background-color:rgba(0,0,0,0.28)}.Message:hover .custom-shape .CommentButton{opacity:1}.custom-shape .CommentButton::after{content:attr(data-cnt);position:absolute;bottom:-.0625rem;left:0;width:100%;text-align:center;font-size:12px;display:block}.custom-shape .CommentButton[data-cnt=\"0\"]{height:2.25rem}.custom-shape .CommentButton[data-cnt=\"0\"]::after{display:none}.custom-shape .CommentButton .icon-comments-sticker{display:block;font-size:1.5rem;margin:0 auto}.custom-shape .CommentButton .recent-repliers,.custom-shape .CommentButton .icon-comments,.custom-shape .CommentButton .label,.custom-shape .CommentButton .icon-next{display:none}.CommentButton:hover{background:var(--hover-color)}.Message .has-appendix .CommentButton:hover::before{opacity:1}.CommentButton:hover .Avatar{border-color:var(--hover-color) !important}.is-forwarded .CommentButton,.audio .CommentButton,.voice .CommentButton,.poll .CommentButton,.text .CommentButton{border-top:1px solid var(--color-borders)}.message-content.has-solid-background .CommentButton{margin:.375rem -.5rem -.375rem}.message-content.voice .CommentButton{margin-bottom:-.5rem}.message-content.audio .CommentButton{margin-bottom:-.8125rem}.message-content.audio .CommentButton,.message-content.voice .CommentButton,.message-content.poll .CommentButton,.message-content.has-solid-background.text .CommentButton,.message-content.has-solid-background.is-forwarded .CommentButton{width:calc(100% + 1rem)}.CommentButton .icon-comments-sticker{display:none}.CommentButton .icon-comments{font-size:1.5625rem;line-height:2rem;margin-inline-end:.875rem}.CommentButton .icon-next{margin-inline-start:auto;font-size:1.5rem}.CommentButton .recent-repliers{display:inline-flex;align-items:center;margin-inline-end:.5rem;margin-inline-start:-.125rem}.CommentButton .recent-repliers .Avatar{transition:border .15s;border:2px solid var(--color-background);margin-inline-end:0;z-index:3;overflow:hidden}.CommentButton .recent-repliers .Avatar .emoji{width:1rem;background-size:1rem}.CommentButton .recent-repliers .Avatar+.Avatar{z-index:2}.CommentButton .recent-repliers .Avatar+.Avatar+.Avatar{z-index:1}.CommentButton .recent-repliers .Avatar:not(:first-child){margin-inline-start:-.75rem}.CommentButton.has-unread .label{position:relative}.CommentButton.has-unread .label::after{content:'';display:inline-block;width:.5rem;height:.5rem;border-radius:50%;background:var(--accent-color);margin-inline-start:.75rem}.CommentButton.disabled{cursor:default;pointer-events:none}\n",".Message{display:flex;align-items:flex-end;margin-bottom:0.375rem;position:relative;--background-color: var(--color-background);--hover-color: var(--color-reply-hover);--active-color: var(--color-reply-active);--max-width: 29rem;--accent-color: var(--color-primary);--accent-shade-color: var(--color-primary-shade);--secondary-color: var(--color-text-secondary);--meta-safe-area-base: 2.25rem;--meta-safe-author-width: 0px;--meta-safe-area-extra-width: 0px;--meta-safe-area-size: calc(var(--meta-safe-area-base) + var(--meta-safe-author-width) + var(--meta-safe-area-extra-width));--deleting-translate-x: -50%;--select-message-scale: 0.9;--select-background-color: white}.Message>.Avatar,.Message>.message-content-wrapper{opacity:1;transform:scale(1) translateX(0);transition:transform var(--select-transition)}body.animation-level-0 .Message>.Avatar,body.animation-level-0 .Message>.message-content-wrapper{transition:none !important}.Message>.Avatar{position:absolute;bottom:0;left:0}@media (max-width: 600px){.Message>.Avatar{width:2.5rem;height:2.5rem}}.Message.last-in-group{margin-bottom:0.625rem}.Message.last-in-list{margin-bottom:0.375rem}.Message.is-in-selection-mode .Album{border:1px var(--select-background-color) solid;background-color:var(--select-background-color)}body.is-android .Message.is-in-selection-mode .can-select-text{z-index:var(--z-message-select-control)}body.is-android .Message.is-in-selection-mode .media-inner{pointer-events:none}.Message.has-inline-buttons .message-content{border-bottom-right-radius:var(--border-radius-messages-small)}.Message:not(.own){padding-left:2.5rem}.no-avatars .Message:not(.own),.Message:not(.own).is-thread-top{padding-left:0}@media (max-width: 600px){.Message:not(.own){padding-left:2.875rem}.no-avatars .Message:not(.own),.Message:not(.own).is-thread-top{padding-left:0.25rem}}.Message.own{flex-direction:row-reverse;--background-color: var(--color-background-own);--hover-color: var(--color-reply-own-hover);--active-color: var(--color-reply-own-active);--max-width: 30rem;--accent-color: var(--color-accent-own);--accent-shade-color: var(--color-green);--secondary-color: var(--color-accent-own);--color-code: var(--color-code-own);--color-code-bg: var(--color-code-own-bg);--color-links: var(--color-own-links);--color-links-hover: var(--color-own-links);--meta-safe-area-base: 3.5rem;--deleting-translate-x: 50%;--color-text-green: var(--color-accent-own)}body.is-ios .Message.own,body.is-macos .Message.own{--color-background-own: var(--color-background-own-apple);--color-reply-own-hover: var(--color-reply-own-hover-apple);--color-reply-own-active: var(--color-reply-own-active-apple)}@media (max-width: 600px){.Message.own{padding-right:0.25rem}}.Message.is-deleting>.Avatar,.Message.is-deleting>.message-content-wrapper{transition:opacity .2s ease, transform .2s ease-in;opacity:0;transform:scale(0.3) translateX(var(--deleting-translate-x));transform-origin:bottom}.Message.has-views{--meta-safe-area-extra-width: 4rem}.Message.was-edited{--meta-safe-area-extra-width: 2.5rem}.Message.was-edited.has-views{--meta-safe-area-extra-width: 7.5rem}html[lang=ru] .Message.was-edited{--meta-safe-area-extra-width: 3.5rem}html[lang=ru] .Message.was-edited.has-views{--meta-safe-area-extra-width: 8.5rem}.select-mode-active .Message{cursor:pointer}@media (min-width: 600px){.select-mode-active .Message{-webkit-user-select:none;user-select:none}}.select-mode-active .Message:not(.own)>.Avatar,.select-mode-active .Message:not(.own)>.message-content-wrapper{transform:translateX(2.5rem)}.select-mode-active .Message:not(.is-album)::after{content:\"\";position:absolute;top:-0.25rem;bottom:-0.25rem;left:-4rem;right:-4rem;z-index:var(--z-message-select-area)}.select-mode-active .Message.is-album .message-select-control,.select-mode-active .Message.is-in-document-group .message-select-control{pointer-events:unset}.select-mode-active .Message .message-select-control{opacity:1}.Message.is-selected .message-select-control{background:var(--color-green)}.Message.is-selected .message-select-control.group-select{background:transparent}.Message.is-selected .message-select-control.group-select.is-selected{background:var(--color-green)}.Message .File.file-is-selected .message-select-control{background:var(--color-green)}.Message.is-in-document-group .File.file-is-selected .file-icon,.Message.has-menu-open.is-in-document-group .File .file-icon{--background-color: var(--color-background-selected)}.Message.own.is-in-document-group .File.file-is-selected .file-icon,.Message.own.has-menu-open.is-in-document-group .File .file-icon{--background-color: var(--color-background-own-selected)}.Message .Audio .message-select-control{left:1.0625rem;top:1.375rem}html.theme-dark .Message.own .Audio .ProgressSpinner{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjODA3QkQ1IiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+);background-position:center;background-size:1rem}html.theme-dark .Message.own .Audio .ProgressSpinner circle{stroke:var(--background-color)}.Message .File{position:relative}.Message .File .message-select-control{position:absolute;top:2rem;left:2rem;z-index:2}.Message.own .Message .album-item-select-wrapper{background:var(--color-background-own)}.Message .album-item-select-wrapper .message-select-control{position:absolute;top:0.438rem;right:0.438rem;left:unset}.Message .album-item-select-wrapper .media-inner{border:0 var(--select-background-color) solid;transition:border-width var(--select-transition)}.Message .album-item-select-wrapper img,.Message .album-item-select-wrapper video{transition:transform var(--select-transition)}.Message .album-item-select-wrapper.is-selected .message-select-control{background:var(--color-green)}.Message .album-item-select-wrapper.is-selected img,.Message .album-item-select-wrapper.is-selected video{transform:scale(var(--select-message-scale))}.Message.is-selected .message-select-control,.Message.is-forwarding .message-select-control{background:var(--color-green)}.Message.is-selected .Menu .bubble,.Message.is-forwarding .Menu .bubble{transition:none !important}.Message.is-in-document-group:not(.first-in-document-group)::before{top:0 !important}.Message.is-in-document-group:not(.first-in-document-group) .message-content{box-shadow:none;border-top-left-radius:0 !important;border-top-right-radius:0 !important}.Message.is-in-document-group:not(.first-in-document-group) .forwarded-message::before{top:-1.5rem}.Message.is-in-document-group:not(.last-in-document-group){margin-bottom:0}.Message.is-in-document-group:not(.last-in-document-group)::before{bottom:0 !important}.Message.is-in-document-group:not(.last-in-document-group) .message-content{border-bottom-left-radius:0 !important;border-bottom-right-radius:0 !important}.Message.is-in-document-group.is-in-selection-mode .Audio:not(.audio-is-selected) .message-select-control:not(.group-select),.Message.is-in-document-group.is-in-selection-mode .File:not(.file-is-selected) .message-select-control:not(.group-select){background:white}.Message.is-in-document-group.is-in-selection-mode .Audio:not(.audio-is-selected) .message-select-control:not(.group-select)::after,.Message.is-in-document-group.is-in-selection-mode .File:not(.file-is-selected) .message-select-control:not(.group-select)::after{content:'';width:1.25rem;height:1.25rem;border-radius:0.688rem;background:white;border:0.125rem rgba(0,0,0,0.2) solid;position:absolute}.Message.is-in-document-group.is-in-selection-mode.own .message-content .Audio:not(.audio-is-selected) .message-select-control:not(.group-select),.Message.is-in-document-group.is-in-selection-mode.own .message-content .File:not(.file-is-selected) .message-select-control:not(.group-select){background:var(--background-color);border-color:var(--background-color)}.Message.is-in-document-group.is-in-selection-mode.own .message-content .Audio:not(.audio-is-selected) .message-select-control:not(.group-select)::after,.Message.is-in-document-group.is-in-selection-mode.own .message-content .File:not(.file-is-selected) .message-select-control:not(.group-select)::after{background:var(--background-color);border-color:var(--color-message-meta-own)}.Message.is-in-document-group.focused .message-content,.Message.is-in-document-group.has-menu-open .message-content,.Message.is-in-document-group.is-forwarding .message-content,.Message.is-in-document-group.is-selected .message-content{background:var(--color-background-selected)}.Message.is-in-document-group.focused.own .message-content,.Message.is-in-document-group.has-menu-open.own .message-content,.Message.is-in-document-group.is-forwarding.own .message-content,.Message.is-in-document-group.is-selected.own .message-content{--background-color: var(--color-background-own-selected);background:var(--color-background-own-selected)}.Message.is-in-document-group .message-content-wrapper{width:17.1875rem}.Message.is-in-document-group .message-content{transition:background-color var(--select-transition)}.Message.is-in-document-group.own .message-content-wrapper{display:flex;justify-content:flex-end}.Message.is-in-document-group.own .message-content-wrapper .message-content{width:100%}.Message .album-item-select-wrapper{position:absolute}.Message .album-item-select-wrapper .message-select-control{position:absolute;z-index:2}.Message .message-select-control{position:absolute;left:0;bottom:0.25rem;width:1.5rem;height:1.5rem;border:2px solid white;border-radius:50%;z-index:var(--z-message-select-control);display:flex;align-items:center;justify-content:center;color:white;font-size:1rem;opacity:0;pointer-events:none;transition:opacity var(--select-transition)}.Message .message-select-control .icon-select{position:absolute;left:-3px;top:-3px;font-size:1.625rem}.theme-dark .Message .message-select-control{border-color:#ffffff80}.Message .Avatar{margin-right:0.3rem}.Message.is-in-document-group .message-content.document{padding:.25rem .5rem !important}.Message.is-in-document-group.last-in-document-group .message-content.document{padding-bottom:.5rem !important}.Message.is-in-document-group.first-in-document-group .message-content.document{padding-top:.5rem !important}.message-content,.Album,.media-inner,.message-content.media .media-inner img,.message-content.media .media-inner video,.message-content.custom-shape .media-inner img{border-top-left-radius:var(--border-top-left-radius);border-top-right-radius:var(--border-top-right-radius);border-bottom-left-radius:var(--border-bottom-left-radius);border-bottom-right-radius:var(--border-bottom-right-radius)}.media-inner video.full-media{background:transparent !important}.media-inner{overflow:hidden}.media-inner.small-image img{border-radius:0 !important}.Message{--border-top-left-radius: var(--border-radius-messages);--border-top-right-radius: var(--border-radius-messages);--border-bottom-left-radius: var(--border-radius-messages);--border-bottom-right-radius: var(--border-radius-messages)}.Message:not(.own).first-in-group:not(.last-in-group){--border-bottom-left-radius: var(--border-radius-messages-small)}.Message:not(.own):not(.first-in-group):not(.last-in-group){--border-top-left-radius: var(--border-radius-messages-small);--border-bottom-left-radius: var(--border-radius-messages-small)}.Message:not(.own).last-in-group:not(.first-in-group){--border-top-left-radius: var(--border-radius-messages-small)}.Message:not(.own).last-in-group{--border-bottom-left-radius: var(--border-radius-messages-small)}.Message:not(.own).last-in-group .message-content.has-appendix{--border-bottom-left-radius: 0}.Message.own.first-in-group:not(.last-in-group){--border-bottom-right-radius: var(--border-radius-messages-small)}.Message.own:not(.first-in-group):not(.last-in-group){--border-top-right-radius: var(--border-radius-messages-small);--border-bottom-right-radius: var(--border-radius-messages-small)}.Message.own.last-in-group:not(.first-in-group){--border-top-right-radius: var(--border-radius-messages-small)}.Message.own.last-in-group{--border-bottom-right-radius: var(--border-radius-messages-small)}.Message.own.last-in-group .message-content.has-appendix{--border-bottom-right-radius: 0}.Message .message-content.has-replies:not(.custom-shape) .media-inner,.Message .message-content.has-replies:not(.custom-shape) .Album,.Message .message-content.text .media-inner,.Message .message-content.text .Album{--border-bottom-left-radius: 0;--border-bottom-right-radius: 0}.Message .message-content.is-reply .EmbeddedMessage+.Album,.Message .message-content.is-reply .EmbeddedMessage+.Audio,.Message .message-content.is-reply .EmbeddedMessage+.File{margin-top:.375rem}.Message .message-content:not(.custom-shape).is-reply .media-inner,.Message .message-content:not(.custom-shape).is-reply .Album,.Message .message-content:not(.custom-shape).force-sender-name .Album,.Message .message-content:not(.is-forwarded) .message-title ~ .media-inner{--border-top-left-radius: 0;--border-top-right-radius: 0}.Message .message-content.is-forwarded .content-inner .message-title{margin-bottom:0.25rem}.Message .message-action-button{position:absolute;bottom:0;color:white;background-color:rgba(0,0,0,0.2);opacity:0;transition:opacity .2s ease}@media (pointer: coarse){.Message .message-action-button{opacity:1 !important}}.Message .message-action-button:hover,.Message .message-action-button:active,.Message .message-action-button:focus{background-color:rgba(0,0,0,0.28) !important}.Message:hover .message-action-button,.Message[data-is-document-group-hover] .message-action-button{opacity:1}.Message.own .message-action-button{left:-3rem}.Message:not(.own) .message-action-button{right:-3rem}.Message .bottom-marker{height:1px;width:1px;visibility:hidden}.Message .custom-shape .message-action-button{bottom:.25rem}.message-content{position:relative;max-width:var(--max-width)}@media (max-width: 600px){.message-content{max-width:calc(100vw - 5.5rem)}.Message.own .message-content,.MessageList.no-avatars .message-content{max-width:calc(100vw - 3rem)}@supports (max-width: min(29rem, 100vw - 5.5rem)){.message-content{max-width:min(29rem, 100vw - 5.5rem)}.MessageList.no-avatars .message-content{max-width:min(29rem, 100vw - 3rem)}.Message.own .message-content{max-width:min(30rem, 100vw - 3rem)}}.message-content.has-action-button{max-width:calc(100vw - 7rem)}.Message.own .message-content.has-action-button,.MessageList.no-avatars .message-content.has-action-button{max-width:calc(100vw - 4.5rem)}@supports (max-width: min(29rem, 100vw - 5.5rem)){.message-content.has-action-button{max-width:min(29rem, 100vw - 7rem)}.MessageList.no-avatars .message-content.has-action-button{max-width:min(29rem, 100vw - 4.5rem)}.Message.own .message-content.has-action-button{max-width:min(30rem, 100vw - 4.5rem)}}}.message-content .text-content{margin:0;word-break:break-word;line-height:1.3125;text-align:initial;display:flow-root;unicode-bidi:plaintext}.message-content .text-entity-link{unicode-bidi:plaintext}.message-content:not(.custom-shape) .text-content:not(.with-meta)>.MessageMeta,.message-content.document>.MessageMeta{position:relative;top:.375rem;bottom:auto !important;float:right;line-height:1;margin-top:.125rem;margin-left:.4375rem;margin-right:-.5rem}.message-content:not(.custom-shape) .text-content:not(.with-meta):dir(rtl)>.MessageMeta,.message-content.document:dir(rtl)>.MessageMeta{float:left;margin-left:-.25rem;margin-right:.4375rem}.message-content.document:not(.text)::after{content:\"\";display:block;clear:both}.message-content.document:not(.text)>.MessageMeta{top:auto;bottom:-.5rem !important;margin-top:-.25rem}.message-content.document:not(.text)>.MessageMeta:not([dir=rtl]){margin-top:-1.25rem}.theme-dark .Message.own .message-content .text-entity-link{text-decoration:underline}.theme-dark .Message.own .message-content .text-entity-link:hover{text-decoration:none}.message-content:not(.custom-shape){font-size:var(--message-text-size, 1rem)}body.is-ios .message-content:not(.custom-shape){font-size:var(--message-text-size, 1.0625rem)}.message-content:not(.custom-shape)>.content-inner{min-width:0}.message-content .matching-text-highlight{background:#CAE3F7;border-radius:0.25rem;padding:0 0.125rem}.message-content .message-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:calc(var(--message-text-size, 1rem) - .125rem);font-weight:500;line-height:1.25rem;color:var(--accent-color);unicode-bidi:plaintext;display:flex}.message-content .message-title>.interactive{overflow:hidden;text-overflow:ellipsis}.message-content .message-title.interactive,.message-content .message-title>.interactive{cursor:pointer}.message-content .message-title.interactive:hover,.message-content .message-title>.interactive:hover{opacity:0.85}.message-content .message-title>.color-1{color:var(--color-user-1)}.message-content .message-title>.color-2{color:var(--color-user-2)}.message-content .message-title>.color-4{color:var(--color-user-4)}.message-content .message-title>.color-5{color:var(--color-user-5)}.message-content .message-title>.color-6{color:var(--color-user-6)}.message-content .message-title>.color-7{color:var(--color-user-7)}.message-content .message-title>.color-8{color:var(--color-user-8)}.theme-dark .Message.own .message-content .message-title>.color-1{color:var(--accent-color)}.message-content .message-title+.File{margin-top:.25rem}.message-content .message-title .via{padding-right:.25rem;font-weight:400}.message-content .message-title span+.via{padding-left:.25rem}.message-content .message-title .admin-title{flex:1;margin-left:1rem;text-align:right;font-weight:400;font-size:0.75rem;margin-top:-0.1rem;color:rgba(var(--color-text-meta-rgb), 0.75)}.Message.own .message-content .message-title .admin-title{color:var(--accent-color)}.message-content.has-shadow{box-shadow:0 1px 2px var(--color-default-shadow)}.message-content.has-solid-background,.message-content.has-background,.is-album .message-content{background:var(--background-color)}.message-content.has-solid-background{padding:.3125rem .5rem .375rem}.message-content.has-solid-background .forwarded-message .text-content.with-meta.with-outgoing-icon:last-child{--meta-icon-width: .5rem}.message-content.has-solid-background .forwarded-message .text-content.with-meta .MessageMeta{bottom:-.25rem}.message-content.has-solid-background .text-content.with-meta:last-child::after,.message-content.has-solid-background .forwarded-message>.text-content:not(.with-meta):last-child::after{content:'';display:inline-block;width:calc(var(--meta-safe-area-size) + var(--meta-icon-width, 0px));height:1rem;float:right}.message-content:not(.has-appendix) .svg-appendix{display:none}.message-content .svg-appendix{overflow:hidden;position:absolute;bottom:-.0875rem;width:.5625rem;height:1.125rem;font-size:1rem !important}.message-content .svg-appendix .corner{fill:var(--background-color)}.Message.own .message-content .svg-appendix{right:-.551rem}.Message:not(.own) .message-content .svg-appendix{left:-.562rem}.message-content[data-has-custom-appendix] .svg-appendix .corner{fill:var(--appendix-bg)}.Message .message-content.has-appendix-thumb .svg-appendix{--background-color: #ccc;opacity:1;transition:opacity 500ms ease}.message-content.document{padding:.5rem !important}.theme-dark .message-content.document .File{--color-primary: var(--color-selection-highlight)}.message-content.document .File+.text-content{margin-top:.3125rem}.message-content.voice .message-title,.message-content.voice .Embedded,.message-content.audio .message-title,.message-content.audio .Embedded{margin-top:-.1875rem;margin-bottom:.1875rem}.message-content.voice{padding:.5rem !important}.message-content.voice .Voice+.text-content{margin-top:.5rem}.message-content.audio{min-width:17.1875rem;padding:.5rem .5rem .8125rem !important}.message-content.audio .Audio+.text-content{margin-top:.25rem}.message-content.audio:not(.has-replies) .Audio+.text-content{margin-bottom:-0.4375rem}.message-content:not(.custom-shape) .emoji{display:inline-block;width:1.25rem;background-size:1.25rem;color:transparent;margin-inline-end:1px;vertical-align:text-bottom}.message-content:not(.custom-shape) .emoji::selection{background-color:var(--color-selection-highlight-emoji);color:transparent}.message-content:not(.custom-shape) .text-content .emoji{width:calc(1.25 * var(--message-text-size, 1rem));height:calc(1.25 * var(--message-text-size, 1rem));background-size:calc(1.25 * var(--message-text-size, 1rem))}.message-content .no-media-corners{--border-top-left-radius: 0;--border-top-right-radius: 0}.message-content.custom-shape.is-via-bot{font-size:inherit !important}.message-content.custom-shape.is-via-bot .message-title{display:inline-flex;position:relative;top:.125rem;max-width:calc(100% - 3rem);margin-left:calc(100% - 3rem);padding:0 .5rem;background-color:var(--background-color);border-radius:var(--border-radius-messages)}.Message.own .message-content.custom-shape.is-via-bot .message-title{margin-left:-3rem}.message-content.custom-shape.is-via-bot .media-inner{margin-top:0.375rem}.message-content.media .media-inner,.WebPage .media-inner{display:flex;justify-content:center;align-items:center}.message-content.media .media-inner.interactive,.WebPage .media-inner.interactive{cursor:pointer}.message-content.media .media-inner.interactive.dark video,.WebPage .media-inner.interactive.dark video{background-color:#232323}.message-content.media.round.is-reply,.WebPage.round.is-reply{width:auto !important}.message-content.media.force-sender-name .media-inner,.message-content.media.force-sender-name .Album,.message-content.media.text .media-inner,.message-content.media.is-via-bot .media-inner,.message-content.media.is-reply .media-inner,.message-content.media.is-reply .Album,.WebPage.force-sender-name .media-inner,.WebPage.force-sender-name .Album,.WebPage.text .media-inner,.WebPage.is-via-bot .media-inner,.WebPage.is-reply .media-inner,.WebPage.is-reply .Album{margin-left:-0.5rem;margin-right:-0.5rem}.message-content.media.text .media-inner,.WebPage.text .media-inner{margin-top:-0.3125rem}.message-content.media.is-reply .media-inner,.message-content.media.force-sender-name .Album,.message-content.media.is-reply .Album,.message-content.media .message-title ~ .media-inner,.WebPage.is-reply .media-inner,.WebPage.force-sender-name .Album,.WebPage.is-reply .Album,.WebPage .message-title ~ .media-inner{margin-top:0.375rem;margin-bottom:-0.375rem}.message-content.media.text .media-inner,.message-content.media.text .Album,.WebPage.text .media-inner,.WebPage.text .Album{margin-bottom:0.375rem}.message-content.media .media-loading,.WebPage .media-loading{display:flex;align-items:center;justify-content:center}.message-content.media .media-loading:not(.open),.WebPage .media-loading:not(.open){opacity:0.5;transform:scale(0);transition:opacity .3s ease, transform .3s ease}.message-content.media .icon-large-play,.message-content.media .icon-download,.WebPage .icon-large-play,.WebPage .icon-download{position:absolute;display:flex;align-items:center;justify-content:center;color:#fff;opacity:0.7;transition:opacity 150ms}.message-content.media .icon-large-play:hover,.message-content.media .icon-download:hover,.WebPage .icon-large-play:hover,.WebPage .icon-download:hover{opacity:1}.message-content.media .icon-large-play:before,.message-content.media .icon-download:before,.WebPage .icon-large-play:before,.WebPage .icon-download:before{display:flex;align-items:center;justify-content:center;width:3.375rem;height:3.375rem;border-radius:50%;background:rgba(0,0,0,0.25)}.message-content.media .icon-download,.WebPage .icon-download{font-size:1.5rem}.message-content.media .icon-large-play,.WebPage .icon-large-play{font-size:2.5rem}.message-content.media .message-media-duration,.message-content.media .message-upload-progress,.WebPage .message-media-duration,.WebPage .message-upload-progress{background:rgba(0,0,0,0.25);color:#fff;font-size:0.75rem;position:absolute;left:.1875rem;top:.1875rem;z-index:1;padding:0 .375rem;border-radius:.75rem;line-height:1.125rem}.message-content.media .message-media-duration .icon-muted-chat,.WebPage .message-media-duration .icon-muted-chat{vertical-align:-.1875rem;margin-left:.375rem;font-size:1.0625rem}.message-content.custom-shape{line-height:1.2;font-size:10rem;display:flex;flex-wrap:wrap;align-items:flex-end}.message-content.custom-shape.has-comments{min-height:5.25rem;margin-top:0 !important}.message-content.custom-shape.has-comments.has-replies{min-height:6.5rem}.message-content.custom-shape.is-reply{max-width:100%}.message-content.custom-shape .reply-message{display:flex;align-items:flex-start;flex-direction:row-reverse;direction:ltr}.message-content.custom-shape .reply-message>p{margin-bottom:0}.message-content.custom-shape .reply-message .EmbeddedMessage{margin-left:0.5rem;border-radius:var(--border-radius-messages)}@media (max-width: 600px){.message-content.custom-shape .reply-message .EmbeddedMessage{max-width:calc(90vw - 13rem)}}@media (max-width: 340px){.message-content.custom-shape .reply-message .EmbeddedMessage{margin-left:-1rem;z-index:1;max-width:calc(90vw - 12rem)}}.message-content.custom-shape .text-content{margin-bottom:1rem}.message-content.custom-shape .media-inner{line-height:1;font-size:1rem;flex-shrink:0}.message-content.custom-shape .media-inner .full-media{top:0;left:0;bottom:0;right:0}.message-content.custom-shape .emoji{display:inline-block;color:transparent}.message-content.custom-shape .emoji::selection{background-color:var(--color-selection-highlight-emoji);color:transparent}.message-content.custom-shape.emoji-only .text-content{margin-bottom:0}.message-content.custom-shape.emoji-only-1{min-width:8rem;font-size:4.5rem}.message-content.custom-shape.emoji-only-1 .content-inner{height:7rem}.message-content.custom-shape.emoji-only-1 .text-content{line-height:1.5;text-align:center}.Message.was-edited .message-content.custom-shape.emoji-only-1{min-width:10rem}.message-content.custom-shape.emoji-only-1 .emoji{width:5rem;height:5rem}.message-content.custom-shape.emoji-only-2{font-size:4rem;margin-top:.5rem;min-width:10rem}.message-content.custom-shape.emoji-only-2.has-comments{margin-top:1.25rem}.Message.was-edited .message-content.custom-shape.emoji-only-2{min-width:12rem}.message-content.custom-shape.emoji-only-2 .emoji{width:4rem;height:4rem}.message-content.custom-shape.emoji-only-3{font-size:3rem;margin-top:1.75rem;min-width:12rem}.message-content.custom-shape.emoji-only-3.has-comments{margin-top:2.5rem}.Message.was-edited .message-content.custom-shape.emoji-only-3{min-width:14rem}.message-content.custom-shape.emoji-only-3 .emoji{width:3rem;height:3rem}.Message:not(.own) .message-content.custom-shape{--hover-color: var(--color-reply-hover);--active-color: var(--color-reply-active)}.Message.own .message-content.custom-shape{--hover-color: var(--color-reply-own-hover);--active-color: var(--color-reply-own-active)}.Message.own .message-content.custom-shape .reply-message{flex-direction:row}.Message.own .message-content.custom-shape .reply-message .EmbeddedMessage{margin-right:0.5rem}@media (max-width: 340px){.Message.own .message-content.custom-shape .reply-message .EmbeddedMessage{margin-left:0;z-index:1;max-width:calc(90vw - 11.5rem)}}.forwarded-message{--border-top-left-radius: var(--border-radius-messages-small);--border-top-right-radius: var(--border-radius-messages-small);--border-bottom-left-radius: var(--border-radius-messages-small);--border-bottom-right-radius: var(--border-radius-messages-small)}.message-content.poll .forwarded-message{margin-bottom:0.5rem}.message-content:not(.custom-shape) .forwarded-message{position:relative;margin-top:0.25rem;padding-left:0.625rem}.message-content:not(.custom-shape) .forwarded-message::before{content:'';display:block;position:absolute;top:0;bottom:0;left:0.05rem;width:2px;background:var(--accent-color);border-radius:2px}.message-content:not(.custom-shape) .forwarded-message:dir(rtl){padding-inline-start:0.625rem}.message-content:not(.custom-shape) .forwarded-message:dir(rtl)::before{left:auto;right:0.05rem}.forwarded-message>.media-inner{margin:0 !important;margin-bottom:0.25rem !important}.long-word-break-all{word-break:break-all}.text-entity-link{color:var(--color-links) !important;text-decoration:none;word-break:break-word;cursor:pointer;unicode-bidi:initial}.text-entity-link:hover,.text-entity-link:active,.text-entity-link:visited{color:var(--color-links-hover) !important;text-decoration:underline}.text-entity-code,.text-entity-pre{color:var(--color-code);background:var(--color-code-bg);white-space:pre-wrap;margin:0;padding:1px 2px;border-radius:4px;font-size:calc(var(--message-text-size, 1rem) - 0.0625rem)}\n",".MessageList{flex:1;width:100%;overflow-anchor:none;overflow:scroll;overflow-x:hidden;overflow-y:overlay;margin-bottom:.5rem}.mask-image-enabled .MessageList{-webkit-mask-image:linear-gradient(to top, transparent 0, #000 0.5rem);mask-image:linear-gradient(to top, transparent 0, #000 0.5rem)}@media (pointer: coarse){.MessageList{-webkit-user-select:none;user-select:none;touch-callout:none}.MessageList.select-mode-active{-webkit-user-select:auto;user-select:auto;touch-callout:default}}.MessageList.no-avatars .Message>.Avatar{display:none}.MessageList .messages-container{width:100%;max-width:var(--messages-container-width);min-height:100%;margin:0 auto;display:flex;justify-content:flex-end;flex-direction:column;padding:1rem 1rem 0 1.125rem}.force-messages-scroll .MessageList .messages-container{margin-top:100vh !important}@media (max-width: 600px){.MessageList .messages-container{width:100vw;padding:2.75rem 0.5rem 0;margin:0}}.MessageList.no-composer{margin-bottom:0}.MessageList.no-composer .last-in-list{margin-bottom:1rem}.MessageList.select-mode-active,.MessageList.type-pinned{margin-bottom:0}.MessageList.select-mode-active .last-in-list,.MessageList.type-pinned .last-in-list{margin-bottom:5.625rem}@media (max-width: 600px){.MessageList.select-mode-active .last-in-list,.MessageList.type-pinned .last-in-list{margin-bottom:4.25rem}}.MessageList.select-mode-active .last-in-list.ActionMessage,.MessageList.type-pinned .last-in-list.ActionMessage{padding-bottom:0.125rem}.MessageList .Message,.MessageList .ActionMessage{position:relative;opacity:1;transform:scale(1);transition:opacity .2s ease, transform .2s ease}.MessageList .Message:not(.open),.MessageList .ActionMessage:not(.open){transform:scale(0.8);opacity:0}.MessageList .Message.open.shown,.MessageList .ActionMessage.open.shown{transform:none}.MessageList .Message::before,.MessageList .ActionMessage::before{content:\"\";position:absolute;top:-0.1875rem;bottom:-0.1875rem;left:-50vw;right:-50vw;background:black;z-index:-1;opacity:0;transition:opacity var(--select-transition)}body.animation-level-0 .MessageList .Message::before,body.animation-level-0 .MessageList .ActionMessage::before{transition:none !important}.MessageList .Message:not(.last-in-group)::before,.MessageList .ActionMessage:not(.last-in-group)::before{bottom:-0.1875rem}.MessageList .Message:not(.first-in-group)::before,.MessageList .ActionMessage:not(.first-in-group)::before{top:-0.1875rem}.MessageList .Message.focused::before,.MessageList .ActionMessage.focused::before{transition:none !important}.MessageList .Message.focused::before,.MessageList .Message.is-forwarding::before,.MessageList .Message.is-selected::before,.MessageList .Message.has-menu-open::before,.MessageList .ActionMessage.focused::before,.MessageList .ActionMessage.is-forwarding::before,.MessageList .ActionMessage.is-selected::before,.MessageList .ActionMessage.has-menu-open::before{opacity:0.1}.MessageList>.empty{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.MessageList .sticky-date,.MessageList .local-action-message,.MessageList .ActionMessage,.MessageList .empty{text-align:center}.MessageList .sticky-date>span,.MessageList .local-action-message>span,.MessageList .ActionMessage>span,.MessageList .empty>span{display:inline-block;background:var(--pattern-color);color:white;font-size:calc(var(--message-text-size, 1rem) - .0625rem);font-weight:500;line-height:1.75;padding:0 .5rem;border-radius:2rem;word-break:break-word}body.is-ios .MessageList .sticky-date>span,body.is-macos .MessageList .sticky-date>span,body.is-ios .MessageList .local-action-message>span,body.is-macos .MessageList .local-action-message>span,body.is-ios .MessageList .ActionMessage>span,body.is-macos .MessageList .ActionMessage>span,body.is-ios .MessageList .empty>span,body.is-macos .MessageList .empty>span{font-size:calc(var(--message-text-size, 1rem) - .125rem)}.MessageList .sticky-date>span .emoji-small,.MessageList .local-action-message>span .emoji-small,.MessageList .ActionMessage>span .emoji-small,.MessageList .empty>span .emoji-small{vertical-align:text-bottom;width:calc(1.25 * var(--message-text-size, 1rem));height:calc(1.25 * var(--message-text-size, 1rem));background-size:calc(1.25 * var(--message-text-size, 1rem))}.MessageList .sticky-date.rich>span,.MessageList .local-action-message.rich>span,.MessageList .ActionMessage.rich>span,.MessageList .empty.rich>span{max-width:80%;text-align:left}.MessageList .sticky-date.rich a,.MessageList .sticky-date.rich a:visited,.MessageList .local-action-message.rich a,.MessageList .local-action-message.rich a:visited,.MessageList .ActionMessage.rich a,.MessageList .ActionMessage.rich a:visited,.MessageList .empty.rich a,.MessageList .empty.rich a:visited{color:var(--color-links-darker) !important}.MessageList .sticky-date.rich a:hover,.MessageList .sticky-date.rich a:active,.MessageList .local-action-message.rich a:hover,.MessageList .local-action-message.rich a:active,.MessageList .ActionMessage.rich a:hover,.MessageList .ActionMessage.rich a:active,.MessageList .empty.rich a:hover,.MessageList .empty.rich a:active{color:var(--color-links-darker-hover) !important}.MessageList .sticky-date{margin-top:1rem;margin-bottom:1rem;z-index:var(--z-sticky-date);pointer-events:none;opacity:1;transition:opacity .3s ease}body:not(.is-scrolling-messages) .MessageList .sticky-date.stuck{opacity:0}body:not(.is-scrolling-messages) .MessageList .sticky-date.stuck span{pointer-events:none}body.animation-level-0 .MessageList .sticky-date{transition:none}.MessageList .sticky-date.interactive{cursor:pointer}.MessageList .sticky-date span{pointer-events:auto}.MessageList.scrolled:not(.is-animating) .sticky-date{position:sticky;top:0.625rem}.MessageList.is-animating{overflow:hidden}.MessageList.is-animating .message-select-control{display:none !important}.has-header-tools .MessageList .sticky-date{top:3.75rem}.MessageList .local-action-message,.MessageList .ActionMessage{margin-top:0.5rem;margin-bottom:0.5rem}.MessageList .ActionMessage .action-link{cursor:pointer}.MessageList .ActionMessage .action-link:hover{text-decoration:underline}.MessageList .sticky-date+.ActionMessage{margin-top:-0.5rem}@media (min-width: 1276px){.MessageList{width:100%;transform:translate3d(0, 0, 0);transition:transform var(--layer-transition)}.MessageList .messages-container{width:calc(100% - var(--right-column-width))}body.animation-level-0 .MessageList{transition:none}#Main.right-column-open .MessageList{transform:translate3d(calc(var(--right-column-width) / -2), 0, 0)}body:not(.animating-right-column) #Main.right-column-open .MessageList.select-mode-active,#Main.right-column-open .MessageList:not(.select-mode-active),body.animating-right-column .MessageList:not(.select-mode-active){width:calc(100% - var(--right-column-width))}body:not(.animating-right-column) #Main.right-column-open .MessageList.select-mode-active .messages-container,#Main.right-column-open .MessageList:not(.select-mode-active) .messages-container,body.animating-right-column .MessageList:not(.select-mode-active) .messages-container{width:100%}}@media (max-width: 600px){.MessageList{transition:transform var(--layer-transition)}body.enable-symbol-menu-transforms .MessageList{transform:translate3d(0, 0, 0)}body.is-symbol-menu-open .MessageList{transform:translate3d(0, calc(-1 * (var(--symbol-menu-height) + var(--symbol-menu-footer-height))), 0)}}.MessageList.select-mode-active,.MessageList.has-focus-highlight,body.has-context-menu .MessageList,.animating>div>.MessageList{padding-right:0}.MessageList.select-mode-active::-webkit-scrollbar,.MessageList.has-focus-highlight::-webkit-scrollbar,body.has-context-menu .MessageList::-webkit-scrollbar,.animating>div>.MessageList::-webkit-scrollbar{width:0}@supports (scrollbar-width: none){.MessageList.select-mode-active,.MessageList.has-focus-highlight,body.has-context-menu .MessageList,.animating>div>.MessageList{padding-right:.6875rem;scrollbar-width:none}}.is-safari .MessageList.select-mode-active,.is-safari .MessageList.has-focus-highlight,.is-safari.has-context-menu .messages-layout .MessageList{padding-right:.375rem}\n",".ScrollDownButton{--base-bottom-pos: 6rem;position:absolute;bottom:var(--base-bottom-pos);right:1rem;opacity:0;transform:translateY(4.5rem);transition:transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),opacity 0.2s ease;z-index:10;pointer-events:none}body.animation-level-0 .ScrollDownButton{transform:none !important;transition:opacity .15s}@media (max-width: 600px){.ScrollDownButton{right:0.5rem;bottom:4.5rem}}.ScrollDownButton-inner{display:flex;flex-direction:column;align-items:center}.ScrollDownButton-inner>.Button{box-shadow:0 1px 2px var(--color-default-shadow)}.ScrollDownButton-inner>.Button i{font-size:1.75rem}@media (min-width: 1276px){.ScrollDownButton-inner{transform:translateX(0);transition:transform var(--layer-transition)}body.animation-level-0 .ScrollDownButton-inner{transition:none !important}#Main.right-column-open .ScrollDownButton-inner{transform:translateX(calc(-1 * var(--right-column-width)))}}@media (max-width: 600px){.ScrollDownButton-inner>.Button{width:2.875rem;height:2.875rem}}.ScrollDownButton.revealed{transform:translateY(0);opacity:1;pointer-events:all}.ScrollDownButton.revealed.no-composer{transform:translateY(4rem)}.ScrollDownButton .unread-count{min-width:1.5rem;height:1.5rem;padding:0 .45rem;border-radius:0.75rem;font-size:0.875rem;line-height:1.5rem;font-weight:500;text-align:center;position:absolute;top:-0.3rem;right:-0.3rem;background:var(--color-green);color:white;pointer-events:none}@media (max-width: 600px){.ScrollDownButton .unread-count{top:-0.7rem;right:auto}}@media (max-width: 600px){body.is-symbol-menu-open .ScrollDownButton{bottom:calc(var(--base-bottom-pos) + var(--symbol-menu-height) + var(--symbol-menu-footer-height))}}\n",".ComposerEmbeddedMessage{height:2.625rem;transition:height 150ms ease-out, opacity 150ms ease-out}.select-mode-active+.middle-column-footer .ComposerEmbeddedMessage{display:none}.ComposerEmbeddedMessage:not(.open){height:0 !important}body.animation-level-0 .ComposerEmbeddedMessage{transition:none !important}.ComposerEmbeddedMessage>div{display:flex;align-items:center;padding-right:0.625rem;padding-top:0.45rem}.ComposerEmbeddedMessage>div>.Button{flex-shrink:0;background:none !important;width:2.125rem;height:2.125rem;margin:0 0.625rem;padding:0;align-self:center}\n",".WebPagePreview{height:2.625rem;transition:height 150ms ease-out, opacity 150ms ease-out;--accent-color: var(--color-primary)}body.animation-level-0 .WebPagePreview{transition:none !important}.select-mode-active+.middle-column-footer .WebPagePreview{display:none}.WebPagePreview:not(.open){height:0 !important}.WebPagePreview>div{display:flex;align-items:center;padding-right:0.625rem;padding-top:0.45rem}.ComposerEmbeddedMessage+.WebPagePreview{margin-top:0.75rem}.WebPagePreview>div>.Button{flex-shrink:0;background:none !important;width:2.125rem;height:2.125rem;margin:0 0.625rem;padding:0;align-self:center}.WebPagePreview .WebPage{flex-grow:1;margin:0.1875rem 0 0.1875rem 0.125rem;max-width:calc(100% - 3.375rem)}.WebPagePreview .WebPage::before{top:.1rem;bottom:.05rem}.WebPagePreview .WebPage.with-video .media-inner{display:none}.WebPagePreview .WebPage .site-title,.WebPagePreview .WebPage .site-description{flex:1;max-width:100%;max-height:1rem}.WebPagePreview .WebPage .site-title{margin-top:.125rem;margin-bottom:0.1875rem}.WebPagePreview .WebPage .site-description{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}\n",".Composer{align-items:flex-end}.select-mode-active+.middle-column-footer .Composer{position:absolute;padding-right:2rem;bottom:0}@media (max-width: 600px){.select-mode-active+.middle-column-footer .Composer{padding-right:1rem}}.select-mode-active+.middle-column-footer .Composer::before{right:2.125rem}@media (max-width: 600px){.select-mode-active+.middle-column-footer .Composer::before{right:1rem}}.select-mode-active+.middle-column-footer .Composer .svg-appendix{opacity:0}.Composer .form-control{--border-width: 0}.Composer>.Button{flex-shrink:0;margin-left:.5rem}@media (max-width: 600px){.Composer>.Button{width:2.875rem;height:2.875rem}}.Composer>.Button .icon-send,.Composer>.Button .icon-microphone-alt,.Composer>.Button .icon-check{position:absolute}.Composer>.Button:not(:active):not(:focus):not(:hover) .icon-send,.Composer>.Button:not(:active):not(:focus):not(:hover) .icon-check{color:var(--color-primary)}.Composer>.Button.cancel{position:relative;z-index:1}.Composer>.Button.cancel:hover,.Composer>.Button.cancel.active{background:var(--color-chat-hover)}.Composer>.Button.recording{position:relative;z-index:0;transition:box-shadow .1s}.Composer>.Button.send .icon-send{animation:grow-icon .4s ease-out}.Composer>.Button.send .icon-microphone-alt,.Composer>.Button.send .icon-check{animation:hide-icon .4s forwards ease-out}.Composer>.Button.record .icon-microphone-alt{animation:grow-icon .4s ease-out}.Composer>.Button.record .icon-send,.Composer>.Button.record .icon-check{animation:hide-icon .4s forwards ease-out}.Composer>.Button.edit .icon-send,.Composer>.Button.edit .icon-microphone-alt{animation:hide-icon .4s forwards ease-out}.Composer>.Button.edit .icon-check{animation:grow-icon .4s ease-out}.Composer>.Button.not-ready>i{animation-duration:0ms !important}body.animation-level-0 .Composer>.Button .icon-send,body.animation-level-0 .Composer>.Button .icon-microphone-alt,body.animation-level-0 .Composer>.Button .icon-check,body.animation-level-1 .Composer>.Button .icon-send,body.animation-level-1 .Composer>.Button .icon-microphone-alt,body.animation-level-1 .Composer>.Button .icon-check{animation-duration:0ms !important}.Composer .mobile-symbol-menu-button{width:2.875rem;height:2.875rem;position:relative}.Composer .mobile-symbol-menu-button .icon-smile,.Composer .mobile-symbol-menu-button .icon-keyboard,.Composer .mobile-symbol-menu-button .Spinner{position:absolute}.Composer .mobile-symbol-menu-button .Spinner{--spinner-size: 1.5rem}.Composer .mobile-symbol-menu-button .icon-smile{animation:grow-icon .4s ease-out}.Composer .mobile-symbol-menu-button .icon-keyboard,.Composer .mobile-symbol-menu-button .Spinner{animation:hide-icon .4s forwards ease-out}.Composer .mobile-symbol-menu-button.not-ready>i{animation-duration:0ms !important}.Composer .mobile-symbol-menu-button.is-loading .Spinner{animation:grow-icon .4s ease-out}.Composer .mobile-symbol-menu-button.is-loading .icon-keyboard,.Composer .mobile-symbol-menu-button.is-loading .icon-smile{animation:hide-icon .4s forwards ease-out}.Composer .mobile-symbol-menu-button.menu-opened .icon-keyboard{animation:grow-icon .4s ease-out}.Composer .mobile-symbol-menu-button.menu-opened .icon-smile,.Composer .mobile-symbol-menu-button.menu-opened .Spinner{animation:hide-icon .4s forwards ease-out}#message-compose{flex-grow:1;max-width:calc(100% - 4rem);background:var(--color-background);border-radius:var(--border-radius-messages);border-bottom-right-radius:0;box-shadow:0 1px 2px var(--color-default-shadow);position:relative;z-index:1}#message-compose .svg-appendix{position:absolute;bottom:-.1875rem;right:-.551rem;width:.5625rem;height:1.25rem;transition:opacity 200ms;font-size:1rem !important}#message-compose .svg-appendix .corner{fill:var(--color-background)}@media (max-width: 600px){#message-compose{max-width:calc(100% - 3rem)}}.message-input-wrapper{display:flex}.message-input-wrapper>.Spinner{align-self:center;--spinner-size: 1.5rem}.message-input-wrapper>.Button{flex-shrink:0;background:none !important;width:3.375rem;height:3.375rem;margin:0;padding:0.625rem;align-self:flex-end}@media (max-width: 600px){.message-input-wrapper>.Button{width:2.875rem;height:2.875rem;margin:0 0.25rem}}.message-input-wrapper>.Button+.Button{margin-left:-.25rem}.message-input-wrapper>.Button.scheduled-button i::after{content:'';position:absolute;top:.75rem;right:.75rem;border:0.1875rem solid var(--color-background);box-sizing:content-box;width:.5rem;height:.5rem;border-radius:50%;background:var(--color-green-darker);box-shadow:-0.375rem -0.25rem 0 -0.1875rem var(--color-background)}@media (max-width: 600px){.message-input-wrapper>.Button.scheduled-button i::after{top:.5rem;right:.5rem}}.message-input-wrapper>.input-group{flex-grow:1;margin-bottom:0}.message-input-wrapper .recording-state{display:inline-block;position:relative;line-height:3.5rem;height:3.5rem;padding:0 3.125rem 0 1rem}.message-input-wrapper .recording-state::after{content:'';width:10px;height:10px;background:var(--color-error);border-radius:5px;position:absolute;top:50%;margin-top:-5px;right:1.375rem}@media (max-width: 600px){.message-input-wrapper .recording-state{height:2.875rem;line-height:2.875rem}}#message-input-text,#caption-input-text{position:relative}#message-input-text .form-control,#caption-input-text .form-control{padding:calc((3.25rem - var(--composer-text-size, 1rem) * 1.375) / 2 - var(--border-width, 0) * 2) calc(.9rem - var(--border-width));overflow:hidden;line-height:1.375;font-family:Roboto, -apple-system, \"Apple Color Emoji\", \"Helvetica Neue\", sans-serif;unicode-bidi:plaintext;text-align:initial;font-size:var(--composer-text-size, 1rem)}body.is-ios #message-input-text .form-control,body.is-macos #message-input-text .form-control,body.is-ios #caption-input-text .form-control,body.is-macos #caption-input-text .form-control{font-family:system-ui, -apple-system, BlinkMacSystemFont, \"Roboto\", \"Apple Color Emoji\", \"Helvetica Neue\", sans-serif}#message-input-text .form-control.overflown,#caption-input-text .form-control.overflown{overflow-y:auto;overflow-x:hidden}#message-input-text .form-control.touched+.placeholder-text,#message-input-text .form-control:focus+.placeholder-text,#caption-input-text .form-control.touched+.placeholder-text,#caption-input-text .form-control:focus+.placeholder-text{display:none}#message-input-text .form-control.focus-disabled,#caption-input-text .form-control.focus-disabled{pointer-events:none}#message-input-text .forced-placeholder,#message-input-text .placeholder-text,#caption-input-text .forced-placeholder,#caption-input-text .placeholder-text{position:absolute;color:var(--color-placeholders);pointer-events:none;unicode-bidi:plaintext;text-align:initial;line-height:1.3125;font-size:var(--composer-text-size, 1rem);top:calc((3.25rem - var(--composer-text-size, 1rem) * 1.375) / 2);bottom:auto}#message-input-text .forced-placeholder,#caption-input-text .forced-placeholder{z-index:var(--z-below);left:0;white-space:nowrap;overflow:hidden;max-width:100%;text-overflow:ellipsis}#message-input-text[dir=rtl] .placeholder-text,#caption-input-text[dir=rtl] .placeholder-text{right:0}#message-input-text .text-entity-link,#caption-input-text .text-entity-link{color:var(--color-links) !important;cursor:default;text-decoration:none}#message-input-text .text-entity-link:hover,#message-input-text .text-entity-link:active,#message-input-text .text-entity-link:visited,#caption-input-text .text-entity-link:hover,#caption-input-text .text-entity-link:active,#caption-input-text .text-entity-link:visited{color:var(--color-links-hover) !important}#message-input-text .clone,#caption-input-text .clone{position:absolute;top:0;left:0;opacity:0;pointer-events:none;z-index:-10;unicode-bidi:plaintext;text-align:initial}#message-input-text{flex-grow:1}#message-input-text .form-control{margin-bottom:0;background:transparent !important;border:none !important;border-radius:0 !important;box-shadow:none !important;caret-color:var(--color-text);min-height:3.5rem;max-height:26rem;line-height:1.3125;padding:calc((3.5rem - var(--composer-text-size, 1rem) * 1.3125) / 2) 0;transition:height 100ms ease}@media (max-width: 600px){#message-input-text .form-control{height:2.875rem;min-height:2.875rem;max-height:16rem;padding:calc((2.875rem - var(--composer-text-size, 1rem) * 1.3125) / 2) 0;overflow:auto}}body.animation-level-0 #message-input-text .form-control{transition:none !important}#message-input-text .forced-placeholder,#message-input-text .placeholder-text{top:calc((3.5rem - var(--composer-text-size, 1rem) * 1.3125) / 2)}@media (max-width: 600px){#message-input-text .forced-placeholder,#message-input-text .placeholder-text{top:calc((2.875rem - var(--composer-text-size, 1rem) * 1.3125) / 2)}}#message-input-text:not(:only-child) .form-control{padding-left:0;padding-right:0}.ComposerEmbeddedMessage+.message-input-wrapper #message-input-text .form-control.overflown,.WebPagePreview+.message-input-wrapper #message-input-text .form-control.overflown{margin-top:0.75rem}#message-input-text .emoji{width:1.25rem;height:1.25rem;margin:0 1px -5px;vertical-align:0;pointer-events:none}#caption-input-text .form-control{height:3.25rem;min-height:3.25rem;max-height:15rem}#caption-input-text .placeholder-text{bottom:.8125rem;left:.90625rem}.composer-tooltip{position:absolute;bottom:calc(100% + .5rem);left:0;width:100%;background:var(--color-background);border-radius:var(--border-radius-messages);padding:0.5rem 0;max-height:15rem;overflow-x:hidden;overflow-y:auto;overflow-y:overlay;box-shadow:0 1px 2px var(--color-default-shadow);opacity:0;transform:translateY(1.5rem);transform-origin:bottom;transition:opacity var(--layer-transition),transform var(--layer-transition)}.composer-tooltip:not(.shown){display:none}.composer-tooltip.open{opacity:1;transform:translateY(0)}.composer-tooltip .Loading{margin:1rem 0}\n","#middle-column-bg{position:absolute;top:0;left:0;bottom:0;right:0;overflow:hidden;z-index:-1}#middle-column-bg::before,#middle-column-bg::after{content:\"\";display:block;position:absolute;top:0;left:0;bottom:0;right:0;background-color:var(--theme-background-color)}#middle-column-bg::after{background-position:center;background-repeat:no-repeat;background-size:cover}.theme-light #middle-column-bg::after{background-image:url(chat-bg.f607e788298d8a7de37a3b39b76c1efa.jpg)}@media (max-width: 600px){.theme-light #middle-column-bg::after{background-image:url(chat-bg-mobile.3ebe59c803c10092f2233e6e00ab2492.jpg)}}body:not(.animation-level-0) #root #middle-column-bg::after{transition:transform var(--layer-transition),opacity 0.2s !important}body.animation-level-0 #middle-column-bg::after{transition:none}.custom-bg-color:not(.custom-bg-image)>#middle-column-bg::after{opacity:0}.custom-bg-image>#middle-column-bg::after{background-image:var(--custom-background) !important;filter:none;transform:scale(1.1)}.custom-bg-image.blurred>#middle-column-bg::after{filter:blur(12px)}@media screen and (min-width: 1276px){body.animation-level-2 #middle-column-bg::after{margin:-16rem -5rem -20rem 0;overflow:hidden;transform:scale(1);transform-origin:left center;transition:transform var(--layer-transition)}body.animation-level-2 #Main.right-column-open #middle-column-bg::after{transform:scale(0.67) !important}}#MiddleColumn{display:flex;justify-content:center;height:100%;position:relative;z-index:1}@media (max-width: 600px){#MiddleColumn{overflow:hidden}}#MiddleColumn .messages-layout{--slide-transition: 450ms cubic-bezier(0.25, 1, 0.5, 1);display:flex;flex-direction:column;align-items:center;width:100%;height:100%;position:relative;overflow:hidden}#MiddleColumn .messages-layout>.Transition{width:100%;height:100%;overflow:hidden}#MiddleColumn .messages-layout>.Transition>div{display:flex;flex-direction:column;align-items:center}#MiddleColumn .messaging-disabled-inner{width:100%;padding:1rem;border-radius:var(--border-radius-messages);background:var(--color-background);color:var(--color-text-secondary);text-align:center;box-shadow:0 1px 2px var(--color-default-shadow)}#MiddleColumn .Composer #message-compose{transform:scaleX(1) translateX(0);transition:transform var(--select-transition),border-bottom-right-radius var(--select-transition)}#MiddleColumn .Composer #message-compose::before{transform:scaleX(-1) translateX(0);transition:transform var(--select-transition)}body.animation-level-0 #MiddleColumn .Composer #message-compose,body.animation-level-0 #MiddleColumn .Composer #message-compose::before{transition:none !important}#MiddleColumn .Composer .message-input-wrapper,#MiddleColumn .Composer::before{opacity:1;transition:opacity var(--select-transition)}body.animation-level-0 #MiddleColumn .Composer .message-input-wrapper,body.animation-level-0 #MiddleColumn .Composer::before{transition:none !important}#MiddleColumn .Composer>.Button{opacity:1;transform:scale(1);transition:opacity var(--select-transition),transform var(--select-transition)}body.animation-level-0 #MiddleColumn .Composer>.Button{transition:none !important}#MiddleColumn .Composer.hover-disabled,#MiddleColumn .Composer:not(.shown){pointer-events:none}#MiddleColumn .Composer:not(.shown) .ComposerEmbeddedMessage{height:0}#MiddleColumn .Composer:not(.shown) #message-compose{transform:scaleX(var(--composer-hidden-scale, 1)) translateX(var(--composer-translate-x, 0));border-bottom-right-radius:var(--border-radius-messages)}#MiddleColumn .Composer:not(.shown) #message-compose::before{transform:scaleX(-1) translateX(200%)}#MiddleColumn .Composer:not(.shown) #editable-message-text{height:3.5rem !important}@media (max-width: 600px){#MiddleColumn .Composer:not(.shown) #editable-message-text{height:2.5rem !important}}#MiddleColumn .Composer:not(.shown) .message-input-wrapper,#MiddleColumn .Composer:not(.shown)::before{opacity:0}#MiddleColumn .Composer:not(.shown)>.Button{opacity:0 !important;transform:scale(0.5)}#MiddleColumn .messaging-disabled{transform:scaleX(1);transition:transform var(--select-transition)}#MiddleColumn .messaging-disabled .messaging-disabled-inner span{opacity:1;transition:opacity var(--select-transition)}body.animation-level-0 #MiddleColumn .messaging-disabled .messaging-disabled-inner span{transition:none !important}body.animation-level-0 #MiddleColumn .messaging-disabled{transition:none !important}#MiddleColumn .messaging-disabled:not(.shown){transform:scaleX(var(--composer-hidden-scale, 1));pointer-events:none}#MiddleColumn .messaging-disabled:not(.shown) .messaging-disabled-inner span{opacity:0}#MiddleColumn .middle-column-footer{width:100%;max-width:var(--messages-container-width);padding:0 1rem;position:relative;display:flex;align-items:flex-end;z-index:var(--z-middle-footer);transform:translate3d(0, 0, 0);transition:transform var(--layer-transition)}body.animation-level-0 #MiddleColumn .middle-column-footer{transition:none !important}@media (min-width: 1276px){#MiddleColumn .middle-column-footer{width:calc(100% - var(--right-column-width))}#Main.right-column-open #MiddleColumn .middle-column-footer{transform:translate3d(calc(var(--right-column-width) / -2), 0, 0)}}@media (max-width: 600px){#MiddleColumn .middle-column-footer{padding:0 0.5rem}body.is-symbol-menu-open #MiddleColumn .middle-column-footer{transform:translate3d(0, calc(-1 * (var(--symbol-menu-height) + var(--symbol-menu-footer-height))), 0)}}#MiddleColumn .middle-column-footer::before{content:\"\";position:absolute;top:-.5625rem;left:0;right:0;height:1px;background:linear-gradient(90deg, rgba(255,255,255,0) 0%, rgba(255,255,255,0.4) 2%, rgba(255,255,255,0.4) 98%, rgba(255,255,255,0) 100%);opacity:0;transition:opacity 350ms ease}@media (max-width: 600px){#MiddleColumn .middle-column-footer::before{left:-2%;right:-2%}}#MiddleColumn .middle-column-footer.with-notch::before{opacity:1}html.theme-dark #MiddleColumn .middle-column-footer::before{background:linear-gradient(90deg, rgba(127,127,127,0) 0%, rgba(127,127,127,0.4) 2%, rgba(127,127,127,0.4) 98%, rgba(127,127,127,0) 100%)}.Composer,.MessageSelectToolbar,.messaging-disabled{margin-bottom:1.25rem}@media (max-width: 600px){.Composer,.MessageSelectToolbar,.messaging-disabled{margin-bottom:0.5rem}}.Composer,.MessageSelectToolbar,.unpin-all-button,.messaging-disabled{width:100%;display:flex;justify-content:center;position:relative}.mask-image-disabled .MessageSelectToolbar-inner,.mask-image-disabled .unpin-all-button,.mask-image-disabled .messaging-disabled{box-shadow:0 0.25rem 0.5rem 0.125rem var(--color-default-shadow)}.unpin-button-container{width:100%;display:flex;justify-content:center;position:absolute;padding-bottom:1.25rem}.unpin-button-container .unpin-all-button{text-transform:capitalize;color:var(--color-black);height:3.5rem;overflow:visible;transform:scaleX(1);transition:transform var(--select-transition),background-color 0.15s,color 0.15s}.unpin-button-container .unpin-all-button:hover .icon-unpin{color:var(--color-white)}.select-mode-active+.middle-column-footer .unpin-button-container .unpin-all-button{box-shadow:none;transform:scaleX(var(--unpin-hidden-scale))}@media (max-width: 600px){.unpin-button-container .unpin-all-button{height:2.5rem}}.unpin-button-container .unpin-all-button .icon-unpin{margin-inline-start:-0.4375rem;margin-inline-end:.75rem;color:var(--color-text-secondary);font-size:1.5rem;transition:color .15s}@media (max-width: 600px){.unpin-button-container{padding-bottom:0.75rem}}.mask-image-disabled .unpin-button-container::before{background:unset}\n",".RightHeader{display:flex;align-items:center;height:var(--header-height);padding:0.5rem .8125rem;pointer-events:auto}@media (max-width: 600px){.RightHeader{padding:0.5rem}}.RightHeader .close-button{flex-shrink:0}.RightHeader>.Transition{flex:1;height:100%}.RightHeader>.Transition>div{display:flex;align-items:center}.RightHeader h3{margin-bottom:0;font-size:1.25rem;font-weight:500;margin-left:1.375rem}.RightHeader .tools{display:flex;margin-left:auto}.RightHeader .SearchInput{margin-left:1rem}@media (min-width: 600px){.RightHeader .SearchInput{margin-right:1rem}}.RightHeader .DropdownMenu{margin-left:auto}\n",".ProfilePhoto{width:100%;height:100%;cursor:pointer;position:relative}.ProfilePhoto img{width:100%;object-fit:cover}.ProfilePhoto .prev-avatar-media{position:absolute;left:0;top:0;z-index:-1}.ProfilePhoto .spinner-wrapper{width:100%;height:100%}.ProfilePhoto .spinner-wrapper,.ProfilePhoto.deleted-account,.ProfilePhoto.no-photo,.ProfilePhoto.saved-messages{display:flex;align-items:center;justify-content:center;color:var(--color-white);background:linear-gradient(var(--color-white) -125%, var(--color-user));cursor:default}.ProfilePhoto.no-photo{font-size:14rem}.ProfilePhoto.deleted-account,.ProfilePhoto.saved-messages{font-size:20rem}\n",".ProfileInfo{aspect-ratio:1 / 1;position:relative}@supports not (aspect-ratio: 1/1){.ProfileInfo::before{float:left;padding-top:100%;content:\"\"}.ProfileInfo::after{display:block;content:\"\";clear:both}}.ProfileInfo .photo-wrapper{width:100%;position:absolute;left:0;top:0;bottom:0}.ProfileInfo .photo-wrapper>.Transition{width:100%;height:100%}.ProfileInfo .photo-dashes{position:absolute;width:100%;height:.125rem;padding:0 .375rem;z-index:1;display:flex;top:.5rem;left:0}.ProfileInfo .photo-dash{flex:1 1 auto;background-color:var(--color-white);opacity:.5;border-radius:.125rem;margin:0 .125rem}.ProfileInfo .photo-dash.current{opacity:1}.ProfileInfo .navigation{position:absolute;top:0;bottom:0;width:25%;border:none;padding:0;margin:0;-webkit-appearance:none;appearance:none;background:transparent no-repeat;background-size:1.25rem;opacity:.25;transition:opacity .15s;outline:none;cursor:pointer;z-index:1}.ProfileInfo .navigation:hover,.is-touch-env .ProfileInfo .navigation{opacity:1}.ProfileInfo .navigation.prev{left:0;background-image:url(media_navigation_previous.11f3cfece8fead5a78e6349db2545210.svg);background-position:1.25rem 50%}.ProfileInfo .navigation.next{right:0;background-image:url(media_navigation_next.3d6e264d21e73ad725738beb8e9dbbb8.svg);background-position:calc(100% - 1.25rem) 50%}.ProfileInfo .info{position:absolute;bottom:0;left:0;width:100%;min-height:100px;padding:0 1.5rem .5rem;background:linear-gradient(0deg, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0) 100%);color:var(--color-white);display:flex;flex-direction:column;justify-content:flex-end;pointer-events:none}.ProfileInfo .info:dir(rtl) .status{text-align:initial;unicode-bidi:plaintext}.ProfileInfo .info[dir=rtl] .status{text-align:initial;unicode-bidi:plaintext}.ProfileInfo .title{display:flex;align-items:center}.ProfileInfo .title h3{font-weight:500;font-size:1.25rem;line-height:1.375rem;white-space:pre-wrap;word-break:break-word;margin-bottom:.25rem}.ProfileInfo .title .VerifiedIcon{margin-left:0.25rem;margin-top:-0.125rem}.ProfileInfo .title .emoji{width:1.5rem;height:1.5rem;background-size:1.5rem}.ProfileInfo .status{font-size:0.875rem;opacity:.5}.ProfileInfo[dir=rtl] .navigation.prev{left:auto;right:0;transform:scaleX(-1)}.ProfileInfo[dir=rtl] .navigation.next{left:0;right:auto;transform:scaleX(-1)}\n",".Profile{height:100%;display:flex;flex-direction:column;overflow-y:scroll;overflow-x:hidden}@supports (overflow-y: overlay){.Profile{overflow-y:overlay !important}}.Profile>.profile-info>.ChatInfo{grid-area:chat_info}.Profile>.profile-info>.ChatInfo .status.online{color:var(--color-primary)}.Profile>.profile-info>.ChatExtra{padding:.875rem .5rem .5rem;box-shadow:inset 0 -0.0625rem 0 0 var(--color-background-secondary-accent);border-bottom:0.625rem solid var(--color-background-secondary)}.Profile>.profile-info>.ChatExtra .narrow{margin-bottom:0}.Profile>.profile-info>.ChatExtra .inactive.no-selection{user-select:auto;-webkit-user-select:auto !important}.Profile>.profile-info>.ChatExtra .Switcher{margin-left:auto}.Profile>.profile-info>.ChatExtra [dir=rtl] .Switcher{margin-left:0;margin-right:auto}.Profile .FloatingActionButton{z-index:1}.shared-media{display:flex;flex-direction:column-reverse}.shared-media .TabList{background:var(--color-background);top:-1px;z-index:1}.shared-media .TabList .Tab{padding:1rem .25rem}.shared-media .TabList .Tab i{bottom:-1rem}.shared-media .Transition{flex:1}.shared-media .content.empty-list{height:100%;padding-top:5rem;display:flex;align-items:flex-start;justify-content:center}.shared-media .content.empty-list .Spinner{--spinner-size: 2.75rem}.shared-media .content.media-list{display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.0625rem}.shared-media .content.documents-list{padding:1.25rem}.shared-media .content.documents-list .File+.File{margin-top:1.25rem}.shared-media .content.links-list{padding:1.25rem}.shared-media .content.links-list .ProgressSpinner,.shared-media .content.links-list .message-upload-progress{display:none}.shared-media .content.audio-list{padding:1.25rem}.shared-media .content.audio-list .Audio .media-loading{top:0;left:0;display:flex;align-items:center;justify-content:center}.shared-media .content.audio-list .Audio+.Audio{margin-top:1.6875rem}.shared-media .content.members-list{padding:0.5rem 1rem}@media (max-width: 600px){.shared-media .content.members-list{padding:.5rem 0}.shared-media .content.members-list .ListItem.chat-item-clickable{margin:0}}\n",".AddChatMembers{height:100%;overflow:hidden;position:relative}.AddChatMembers-inner{height:100%;overflow:hidden}\n","#RightColumn{position:absolute;top:0;right:0;width:var(--right-column-width);height:100%;transform:translate3d(var(--right-column-width), 0, 0);background:var(--color-background);border-left:1px solid var(--color-borders);z-index:var(--z-right-column);transition:transform var(--layer-transition)}body.animation-level-0 #RightColumn{transition:none}#RightColumn:not(:hover) .chat-item-clickable:not(.picker-list-item):nth-child(n+18){display:none !important}@media (max-width: 1275px){#RightColumn{box-shadow:0 0.25rem 0.5rem 0.125rem var(--color-default-shadow);border-left:none}}@media (max-width: 600px){#RightColumn{width:100vw;transform:translate3d(110vw, 0, 0)}}#RightColumn>.Transition{height:calc(100% - var(--header-height));overflow:hidden}#RightColumn .Management .section>.ChatInfo{padding:0 1.5rem;margin:1rem 0;text-align:center}#RightColumn .Management .section>.ChatInfo .Avatar{margin:0 auto .5rem}#RightColumn .Management .section>.ChatInfo .Avatar.no-photo{cursor:default !important}#RightColumn .Management .section>.ChatInfo .title{display:flex;justify-content:center;align-items:center}#RightColumn .Management .section>.ChatInfo .title h3{font-weight:500;font-size:1.25rem;line-height:2rem;white-space:pre-wrap;word-break:break-word}#RightColumn .Management .section>.ChatInfo .title .VerifiedIcon{margin-left:0.25rem;margin-bottom:.5rem}#RightColumn .Management .section>.ChatInfo .title .emoji{width:1.5rem;height:1.5rem;background-size:1.5rem}#RightColumn .Management .section>.ChatInfo .status{font-size:0.875rem;color:#868e96}#RightColumn-wrapper{position:absolute;top:0;left:0;right:0;bottom:0;z-index:var(--z-right-column);overflow:hidden;visibility:hidden;pointer-events:none}@media (max-width: 1275px){#RightColumn-wrapper{position:fixed}}#RightColumn-wrapper.is-hidden{display:none}#RightColumn-wrapper .overlay-backdrop{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;background:black;opacity:0}@media (max-width: 600px){#RightColumn-wrapper .overlay-backdrop{transition:opacity var(--layer-transition)}body.animation-level-0 #RightColumn-wrapper .overlay-backdrop{transition:none}}#Main.right-column-open #RightColumn-wrapper,body.animating-right-column #RightColumn-wrapper{visibility:visible}@media (max-width: 600px){#Main.right-column-open #RightColumn-wrapper .overlay-backdrop{opacity:var(--layer-blackout-opacity)}}#Main.right-column-open #RightColumn-wrapper #RightColumn{pointer-events:auto;transform:translate3d(0, 0, 0)}\n","#Main{display:flex;height:100%;text-align:left;overflow:hidden}@media (min-width: 1276px){#Main{position:relative}}@media (max-width: 600px){#Main{height:calc(var(--vh, 1vh) * 100)}}#LeftColumn{flex:1;min-width:18rem;max-width:26.5rem;height:100%}@media (max-width: 600px){#LeftColumn{height:calc(var(--vh, 1vh) * 100)}}@media (min-width: 1680px){#LeftColumn{border-left:1px solid var(--color-borders)}}@media (max-width: 1275px){#LeftColumn{flex:2}}@media (max-width: 925px){#LeftColumn{position:fixed;left:0;top:0;height:calc(var(--vh, 1vh) * 100);width:26.5rem;transform:translate3d(-5rem, 0, 0);transition:transform var(--layer-transition)}body.animation-level-0 #LeftColumn{transition:none}#LeftColumn::after{content:'';display:block;position:absolute;left:0;top:0;right:0;bottom:0;background:black;opacity:var(--layer-blackout-opacity);transition:opacity var(--layer-transition);z-index:1}body.animation-level-0 #LeftColumn::after{transition:none}body.is-android #LeftColumn::after{display:none}body.is-android .middle-column-shown #LeftColumn::after{display:block}#Main:not(.middle-column-open) #LeftColumn{transform:translate3d(0, 0, 0)}#Main:not(.middle-column-open) #LeftColumn::after{opacity:0;pointer-events:none}#Main.history-animation-disabled #LeftColumn{transition:none}#Main.history-animation-disabled #LeftColumn:after{transition:none}}@media (max-width: 600px){#LeftColumn{max-width:none;width:100vw;transform:translate3d(-20vw, 0, 0)}}@media (min-width: 1680px){#RightColumn{border-right:1px solid var(--color-borders)}}@media (max-width: 600px){#RightColumn{height:calc(var(--vh, 1vh) * 100 + 1px)}}#Main.history-animation-disabled #RightColumn{transition:none}#Main.history-animation-disabled #RightColumn .overlay-backdrop{transition:none}#Main.history-animation-disabled .overlay-backdrop{transition:none}#MiddleColumn{flex:3;border-left:1px solid var(--color-borders);max-width:75vw}@media (max-width: 1275px){#MiddleColumn{max-width:calc(100vw - 26.5rem)}}@media (max-width: 66.25rem){#MiddleColumn{max-width:60vw}}@media (min-width: 1680px){#MiddleColumn{border-right:1px solid var(--color-borders);max-width:calc(1680px - 26.5rem)}}@media (max-width: 925px){#MiddleColumn{max-width:none;position:fixed;left:0;top:0;bottom:0;right:0;transform:translate3d(0, 0, 0);transition:transform var(--layer-transition)}body.animation-level-0 #MiddleColumn{transition:none}#Main:not(.middle-column-open) #MiddleColumn{transform:translate3d(26.5rem, 0, 0)}}@media (max-width: 600px){#MiddleColumn{border-left:none}#Main:not(.middle-column-open) #MiddleColumn{transform:translate3d(100vw, 0, 0)}#Main.right-column-open #MiddleColumn{transform:translate3d(-20vw, 0, 0)}}#Main.history-animation-disabled #MiddleColumn{transition:none}#Main.history-animation-disabled #MiddleColumn:after{transition:none}body.is-android.animation-level-1{--layer-transition: 250ms ease-in-out}body.is-android.animation-level-1 #LeftColumn,body.is-android.animation-level-1 #MiddleColumn,body.is-android.animation-level-1 #RightColumn{transition:transform var(--layer-transition),opacity var(--layer-transition)}body.is-android.animation-level-1 #Main:not(.middle-column-shown) #MiddleColumn{display:none}body.is-android.animation-level-1 #Main:not(.middle-column-open) #MiddleColumn{transform:translate3d(10vw, 0, 0);opacity:0}body.is-android.animation-level-1 #Main.middle-column-open #LeftColumn{transform:translate3d(0, 0, 0);opacity:0}body.is-android.animation-level-1 #Main:not(.right-column-shown) #RightColumn{display:none}body.is-android.animation-level-1 #Main:not(.right-column-open) #RightColumn{transform:translate3d(10vw, 0, 0);opacity:0}body.is-android.animation-level-1 #Main.right-column-open #MiddleColumn{transform:translate3d(0, 0, 0);opacity:0}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/4.f46a6915735f9deb48a8.js b/dist/4.f46a6915735f9deb48a8.js deleted file mode 100644 index 68e771425..000000000 --- a/dist/4.f46a6915735f9deb48a8.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{105:function(e,t,a){"use strict";a.r(t),a.d(t,"Main",(function(){return tc}));var s=a(1),n=a(2),c=a(0),o=(a(85),a(11)),r=a(7),i=a(51),l=a(4);function d(e){const{chatId:t,threadId:a}=Object(r.z)(e)||{};return t&&a?(e=Object(o.Z)(e,t,a,!1),e=Object(o.u)(e,t,a,void 0)):e}Object(s.b)("openLocalTextSearch",e=>{const{chatId:t,threadId:a}=Object(r.z)(e)||{};if(t&&a)return Object(o.Z)(e,t,a,!0)}),Object(s.b)("closeLocalTextSearch",d),Object(s.b)("setLocalTextSearchQuery",(e,t,a)=>{const{chatId:s,threadId:n}=Object(r.z)(e)||{};if(!s||!n)return;const{query:c}=a,d=Object(l.a)(s,n),{query:b}=e.localTextSearch.byChatThreadKey[d]||{};return c!==b&&(e=Object(o.u)(e,s,n,i.a)),e=Object(o.Z)(e,s,n,!0,c)}),Object(s.b)("setLocalMediaSearchType",(e,t,a)=>{const{chatId:s}=Object(r.z)(e)||{};if(!s)return;const{mediaType:n}=a;return Object(o.Y)(e,s,n)}),Object(s.b)("openChat",(e,t,a)=>{const{id:n,threadId:c=-1,type:i="thread",shouldReplaceHistory:l=!1}=a,b=Object(r.z)(e);return b&&b.chatId===n&&b.threadId===c&&b.type===i||(e=Object(o.y)(e,n,c,"replyStack",[]),e=d(e=Object(o.o)(e)),e={...e,messages:{...e.messages,contentToBeScheduled:void 0},...n!==e.forwardMessages.toChatId&&{forwardMessages:{}}},Object(s.g)(e)),Object(o.O)(e,n,c,i,l)}),Object(s.b)("openPreviousChat",e=>Object(o.O)(e,void 0)),Object(s.b)("openChatWithInfo",(e,t,a)=>{Object(s.g)({...e,isChatInfoShown:!0}),t.openChat(a)}),Object(s.b)("resetChatCreation",e=>({...e,chatCreation:void 0})),Object(s.b)("setNewChatMembersDialogState",(e,t,a)=>({...e,newChatMembersProgress:a})),Object(s.b)("openNextChat",(e,t,a)=>{const{targetIndexDelta:s,orderedIds:n}=a,{chatId:c}=Object(r.z)(e)||{};if(!c)return void t.openChat({id:n[0]});const o=n.indexOf(c);if(-1===o)return;const i=n[o+s];t.openChat({id:i,shouldReplaceHistory:!0})});var b=a(8),u=a(13),m=a(6),h=a(3);const O=n.C+n.c;let j;Object(s.b)("setScrollOffset",(e,t,a)=>{const{chatId:s,threadId:n,scrollOffset:c}=a;return Object(o.y)(e,s,n,"scrollOffset",c)}),Object(s.b)("setReplyingToId",(e,t,a)=>{const{messageId:s}=a,n=Object(r.z)(e);if(!n)return;const{chatId:c,threadId:i}=n;return Object(o.y)(e,c,i,"replyingToId",s)}),Object(s.b)("setEditingId",(e,t,a)=>{const{messageId:s}=a,n=Object(r.z)(e);if(!n)return;const{chatId:c,threadId:i,type:l}=n,d="scheduled"===l?"editingScheduledId":"editingId";return Object(o.y)(e,c,i,d,s)}),Object(s.b)("editLastMessage",e=>{const{chatId:t,threadId:a}=Object(r.z)(e)||{};if(!t||!a)return;const s=Object(r.n)(e,t),n=Object(r.Kb)(e,t,a);if(!s||!n)return;const c=Object(h.g)(n,t=>Boolean(s[t]&&Object(r.b)(e,s[t],a).canEdit));return c?Object(o.y)(e,t,a,"editingId",c):void 0}),Object(s.b)("replyToNextMessage",(e,t,a)=>{const{targetIndexDelta:s}=a,{chatId:n,threadId:c}=Object(r.z)(e)||{};if(!n||!c)return;const o=Object(r.n)(e,n),i=Object(r.Kb)(e,n,c);if(!o||!i)return;const l=Object(r.ob)(e,n,c);let d;if(Object(r.Y)(e,n,c)&&l){const e=Object.keys(o),t=e.indexOf(l.toString())+s;d=t<=e.length+1&&t>=0?Number(e[t]):void 0}else if(c===b.MAIN_THREAD_ID){const t=Object(r.g)(e,n);d=t&&t.lastMessage?t.lastMessage.id:void 0}else{const t=Object(r.Fb)(e,n,c);d=t?t.lastMessageId:void 0}t.setReplyingToId({messageId:d}),t.focusMessage({chatId:n,threadId:c,messageId:d})}),Object(s.b)("openMediaViewer",(e,t,a)=>{const{chatId:s,threadId:n,messageId:c,avatarOwnerId:o,profilePhotoIndex:r,origin:i}=a;return{...e,mediaViewer:{chatId:s,threadId:n,messageId:c,avatarOwnerId:o,profilePhotoIndex:r,origin:i},forwardMessages:{}}}),Object(s.b)("closeMediaViewer",e=>({...e,mediaViewer:{}})),Object(s.b)("openAudioPlayer",(e,t,a)=>{const{chatId:s,threadId:n,messageId:c}=a;return{...e,audioPlayer:{chatId:s,threadId:n,messageId:c}}}),Object(s.b)("closeAudioPlayer",e=>({...e,audioPlayer:{}})),Object(s.b)("openPollResults",(e,t,a)=>{const{chatId:n,messageId:c}=a;Object(r.W)(e)?n===e.pollResults.chatId&&c===e.pollResults.messageId||Object(s.g)({...e,pollResults:{chatId:n,messageId:c,voters:{}}}):window.setTimeout(()=>{const e=Object(s.e)();Object(s.g)({...e,pollResults:{chatId:n,messageId:c,voters:{}}})},450)}),Object(s.b)("closePollResults",e=>{Object(s.g)({...e,pollResults:{}})}),Object(s.b)("focusLastMessage",(e,t)=>{const a=Object(r.z)(e);if(!a)return;const{chatId:s,threadId:n}=a;let c;if(n===b.MAIN_THREAD_ID){const t=Object(r.g)(e,s);c=t&&t.lastMessage?t.lastMessage.id:void 0}else{const t=Object(r.Fb)(e,s,n);c=t?t.lastMessageId:void 0}c&&t.focusMessage({chatId:s,threadId:n,messageId:c,noHighlight:!0})}),Object(s.b)("focusNextReply",(e,t)=>{const a=Object(r.z)(e);if(!a)return;const{chatId:n,threadId:c}=a,i=Object(r.nb)(e,n,c);if(i&&0!==i.length){const a=i.pop();e=Object(o.y)(e,n,c,"replyStack",[...i]),Object(s.g)(e),t.focusMessage({chatId:n,threadId:c,messageId:a})}else t.focusLastMessage()}),Object(s.b)("focusMessage",(e,t,a)=>{const{chatId:n,threadId:c=b.MAIN_THREAD_ID,messageListType:i="thread",noHighlight:l,groupedId:d,groupedChatId:m,replyMessageId:h}=a;let{messageId:g}=a;if(void 0!==d){const t=Object(r.J)(e,m,d);t&&t.length&&([g]=t)}const f=Object(r.z)(e),p=!f||n!==f.chatId||c!==f.threadId||i!==f.type;if(j&&(clearTimeout(j),j=void 0),j=window.setTimeout(()=>{let e=Object(s.e)();e=Object(o.Q)(e),e=Object(o.P)(e),Object(s.g)(e)},l?O:1500),e=Object(o.Q)(e,n,g,l),e=Object(o.P)(e,void 0),h){const t=Object(r.nb)(e,n,c)||[];e=Object(o.y)(e,n,c,"replyStack",[...t,h])}p&&(e=Object(o.P)(e,u.b.Static));const I=Object(r.Kb)(e,n,c);if(I&&I.includes(g))return Object(s.g)(e),void t.openChat({id:n,threadId:c});if(p&&(e=Object(o.y)(e,n,c,"viewportIds",void 0)),e=Object(o.y)(e,n,c,"outlyingIds",void 0),I&&!p){const t=g>I[0]?u.b.Down:u.b.Up;e=Object(o.P)(e,t)}Object(s.g)(e),t.openChat({id:n,threadId:c}),t.loadViewportMessages()}),Object(s.b)("openForwardMenu",(e,t,a)=>{const{fromChatId:s,messageIds:n,groupedId:c}=a;let o;return c&&(o=Object(r.bb)(e,s,c)),{...e,forwardMessages:{fromChatId:s,messageIds:o||n,isModalShown:!0}}}),Object(s.b)("exitForwardMode",e=>{Object(s.g)({...e,forwardMessages:{}})}),Object(s.b)("setForwardChatId",(e,t,a)=>{const{id:n}=a;Object(s.g)({...e,forwardMessages:{...e.forwardMessages,toChatId:n,isModalShown:!1}}),t.openChat({id:n}),t.closeMediaViewer(),t.exitMessageSelectMode()}),Object(s.b)("openForwardMenuForSelectedMessages",(e,t)=>{if(!e.selectedMessages)return;const{chatId:a,messageIds:s}=e.selectedMessages;t.openForwardMenu({fromChatId:a,messageIds:s})}),Object(s.b)("enterMessageSelectMode",(e,t,a)=>{const{messageId:s}=a||{},n=Object(r.s)(e);return n?Object(o.n)(e,n.id,s):e}),Object(s.b)("toggleMessageSelection",(e,t,a)=>{const{messageId:n,groupedId:c,childMessageIds:i,withShift:l}=a,d=Object(r.z)(e);if(!d)return;const{chatId:b,threadId:u,type:h}=d;e=Object(o.H)(e,b,u,h,n,c,i,l),Object(s.g)(e),e.shouldShowContextMenuHint&&(t.disableContextMenuHint(),t.showNotification({message:`To **edit** or **reply**, close this menu. Then ${m.n?"long tap":"right click"} on a message.`}))}),Object(s.b)("disableContextMenuHint",e=>{if(e.shouldShowContextMenuHint)return{...e,shouldShowContextMenuHint:!1}}),Object(s.b)("exitMessageSelectMode",o.o),Object(s.b)("openPollModal",e=>({...e,isPollModalOpen:!0})),Object(s.b)("closePollModal",e=>({...e,isPollModalOpen:!1}));Object(s.b)("setGlobalSearchQuery",(e,t,a)=>{const{query:s}=a,{chatId:n}=e.globalSearch;return Object(o.S)(e,{globalResults:{},localResults:{},resultsByType:void 0,...s?{fetchingStatus:{chats:!n,messages:!0}}:{fetchingStatus:void 0},query:s})}),Object(s.b)("addRecentlyFoundChatId",(e,t,a)=>{const{id:s}=a,{recentlyFoundChatIds:n}=e.globalSearch;if(!n)return Object(o.S)(e,{recentlyFoundChatIds:[s]});const c=n.filter(e=>e!==s);return c.unshift(s),c.length>10&&c.pop(),Object(o.S)(e,{recentlyFoundChatIds:c})}),Object(s.b)("clearRecentlyFoundChats",e=>Object(o.S)(e,{recentlyFoundChatIds:void 0})),Object(s.b)("setGlobalSearchContent",(e,t,a)=>{const{content:s}=a;return Object(o.T)(e,s)}),Object(s.b)("setGlobalSearchChatId",(e,t,a)=>{const{id:s}=a;return Object(o.S)(e,{chatId:s,query:void 0,resultsByType:void 0})}),Object(s.b)("setStickerSearchQuery",(e,t,a)=>{const{query:s}=a;return{...e,stickers:{...e.stickers,search:{query:s,resultIds:void 0}}}}),Object(s.b)("setGifSearchQuery",(e,t,a)=>{const{query:s}=a;return{...e,gifs:{...e.gifs,search:{query:s,offsetId:void 0,results:void 0}}}}),Object(s.b)("openUserInfo",(e,t,a)=>{const{id:s}=a;t.openChat({id:s})});Object(s.b)("openChat",e=>Object(o.gb)(e,void 0)),Object(s.b)("setUserSearchQuery",(e,t,a)=>{const{query:s}=a;return Object(o.pb)(e,{globalUserIds:void 0,localUserIds:void 0,fetchingStatus:Boolean(s),query:s})});a(86);var g=a(174);Object(s.b)("toggleChatInfo",e=>({...e,isChatInfoShown:!e.isChatInfoShown})),Object(s.b)("toggleManagement",e=>{const{chatId:t}=Object(r.z)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!(e.management.byChatId[t]||{}).isActive}}}}}),Object(s.b)("closeManagement",e=>{const{chatId:t}=Object(r.z)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!1}}}}}),Object(s.b)("openChat",e=>{if(m.l||m.m)return{...e,isLeftColumnShown:0===e.messages.messageLists.length}}),Object(s.b)("toggleLeftColumn",e=>({...e,isLeftColumnShown:!e.isLeftColumnShown})),Object(s.b)("addRecentEmoji",(e,t,a)=>{const{emoji:s}=a,{recentEmojis:n}=e;if(!n)return{...e,recentEmojis:[s]};const c=n.filter(e=>e!==s);return c.unshift(s),c.length>18&&c.pop(),{...e,recentEmojis:c}}),Object(s.b)("addRecentSticker",(e,t,a)=>{const{sticker:s}=a,{recent:n}=e.stickers;if(!n)return{...e,stickers:{...e.stickers,recent:{hash:0,stickers:[s]}}};const c=n.stickers.filter(e=>e.id!==s.id);return c.unshift(s),{...e,stickers:{...e.stickers,recent:{...n,stickers:c}}}}),Object(s.b)("showNotification",(e,t,a)=>{const s=a,n=[...e.notifications],c=n.findIndex(e=>e.message===s.message);return-1!==c&&n.splice(c,1),n.push(s),{...e,notifications:n}}),Object(s.b)("dismissNotification",e=>{const t=[...e.notifications];return t.pop(),{...e,notifications:t}}),Object(s.b)("showDialog",(e,t,a)=>{const{data:s}=a;if("message"in s&&s.hasErrorKey&&!Object(g.a)(s))return e;const n=[...e.dialogs];if("message"in s){const e=n.findIndex(e=>e.message===s.message);-1!==e&&n.splice(e,1)}return n.push(s),{...e,dialogs:n}}),Object(s.b)("dismissDialog",e=>{const t=[...e.dialogs];return t.pop(),{...e,dialogs:t}}),Object(s.b)("toggleSafeLinkModal",(e,t,a)=>{const{url:s}=a;return{...e,safeLinkModalUrl:s}}),Object(s.b)("openHistoryCalendar",(e,t,a)=>{const{selectedAt:s}=a;return{...e,historyCalendarSelectedAt:s}}),Object(s.b)("closeHistoryCalendar",e=>({...e,historyCalendarSelectedAt:void 0})),Object(s.b)("openPaymentModal",(e,t,a)=>{const{messageId:s}=a;return{...e,payment:{...e.payment,messageId:s,isPaymentModalOpen:!0}}}),Object(s.b)("closePaymentModal",e=>{const t=Object(o.i)(e);return Object(o.j)(t)});a(87);var f=a(5),p=a(10);const I=Object(p.h)(e=>e(),1e3,!0),v=Object(p.h)(e=>e(),3e3,!0),y=Object(p.a)(e=>e(),500,!1,!0);async function C(e,t,a){const c=await Object(f.a)("fetchChats",{limit:n.l,offsetDate:a,archived:"archived"===e,withPinned:void 0===Object(s.e)().chats.orderedPinnedIds[e],serverTimeOffset:Object(s.e)().serverTimeOffset});if(!c)return;const{chatIds:r}=c;r.length>0&&r[0]===t&&r.shift();let i=Object(s.e)();i=Object(o.g)(i,Object(h.c)(c.users,"id")),i=Object(o.N)(i,Object(h.c)(c.chats,"id")),i=Object(o.J)(i,e,r),i=Object(o.K)(i,e,c),Object.keys(c.draftsById).map(Number).forEach(e=>{i=Object(o.y)(i,e,b.MAIN_THREAD_ID,"draft",c.draftsById[e])}),Object.keys(c.replyingToById).map(Number).forEach(e=>{i=Object(o.y)(i,e,b.MAIN_THREAD_ID,"replyingToId",c.replyingToById[e])}),0!==r.length||i.chats.isFullyLoaded[e]||(i={...i,chats:{...i.chats,isFullyLoaded:{...i.chats.isFullyLoaded,[e]:!0}}}),Object(s.g)(i)}async function w(e){const t=await Object(f.a)("fetchFullChat",e);if(!t)return;const{users:a,fullInfo:n}=t;let c=Object(s.e)();a&&(c=Object(o.g)(c,Object(h.c)(a,"id"))),c=Object(o.I)(c,e.id,{fullInfo:n}),Object(s.g)(c)}async function E(e,t,a){const n=Object(s.e)(),c=Object(r.i)(n,t);if(c&&!c.isMin)return void(a?e.focusMessage({chatId:c.id,messageId:a}):e.openChat({id:c.id}));const i=Object(r.s)(n);e.openChat({id:-1});const l=await Object(f.a)("getChatByUsername",t);if(!l)return i&&e.openChat({id:i.id}),void e.showNotification({message:"User does not exist"});Object(s.g)(Object(o.I)(Object(s.e)(),l.id,l)),a?e.focusMessage({chatId:l.id,messageId:a}):e.openChat({id:l.id})}Object(s.b)("preloadTopChatMessages",(e,t)=>{(async()=>{const a=[];for(let c=0;ce!==i&&!a.includes(e));if(!m)return;a.push(m.id),t.loadViewportMessages({chatId:m.id,threadId:b.MAIN_THREAD_ID})}})()}),Object(s.b)("openChat",(e,t,a)=>{const{id:s,threadId:n}=a,{currentUserId:c}=e,o=Object(r.g)(e,s);if(o&&o.hasUnreadMark&&t.toggleChatUnread({id:s}),o)Object(l.pb)(o)&&!o.isMin&&t.requestChatUpdate({chatId:s});else if(s===c)Object(f.a)("fetchChat",{type:"self"});else{const t=Object(r.Jb)(e,s);t&&Object(f.a)("fetchChat",{type:"user",user:t})}if(n!==b.MAIN_THREAD_ID){Object(r.Hb)(e,s,n)||t.requestThreadInfoUpdate({chatId:s,threadId:n})}}),Object(s.b)("openSupportChat",(e,t)=>{const a=Object(r.Cb)(e);t.openChat({id:a?a.id:-1}),a||(async()=>{const e=await Object(f.a)("fetchChat",{type:"support"});e&&t.openChat({id:e.chatId})})()}),Object(s.b)("openTipsChat",(e,t,a)=>{const{langCode:s}=a,c="pt-br"===s?"BR":n.S.includes(s)?s.toUpperCase():"";t.openChatByUsername({username:`${n.Pb}${c}`})}),Object(s.b)("loadMoreChats",(e,t,a)=>{const{listType:s="active"}=a,n=e.chats.listIds[s];if(e.chats.isFullyLoaded[s])return;const c=n?n.map(t=>e.chats.byId[t]).filter(t=>Boolean(t&&t.lastMessage)&&!Object(r.N)(e,t.id)).sort((e,t)=>e.lastMessage.date-t.lastMessage.date)[0]:void 0;I(c?()=>C(s,c.id,c.lastMessage.date):()=>C(s))}),Object(s.b)("loadFullChat",(e,t,a)=>{const{chatId:s,force:n}=a,c=Object(r.g)(e,s);c&&(n?w(c):y(()=>w(c)))}),Object(s.b)("loadTopChats",()=>{v(()=>C("active"))}),Object(s.b)("requestChatUpdate",(e,t,a)=>{const{serverTimeOffset:s}=e,{chatId:n}=a,c=Object(r.g)(e,n);c&&Object(f.a)("requestChatUpdate",{chat:c,serverTimeOffset:s})}),Object(s.b)("updateChatMutedState",(e,t,a)=>{const{serverTimeOffset:n}=e,{chatId:c,isMuted:i}=a,l=Object(r.g)(e,c);l&&(Object(s.g)(Object(o.I)(e,c,{isMuted:i})),Object(f.a)("updateChatMutedState",{chat:l,isMuted:i,serverTimeOffset:n}))}),Object(s.b)("createChannel",(e,t,a)=>{const{title:n,about:c,photo:i,memberIds:l}=a;!async function(e,t,a,n){Object(s.g)({...Object(s.e)(),chatCreation:{progress:u.a.InProgress}});const c=await Object(f.a)("createChannel",{title:e,about:a,users:t});if(!c)return;const{id:r,accessHash:i}=c;let l=Object(s.e)();l=Object(o.I)(l,r,c),l={...l,chatCreation:{...l.chatCreation,progress:c?u.a.Complete:u.a.Error}},Object(s.g)(l),Object(s.d)().openChat({id:r}),r&&i&&n&&await Object(f.a)("editChatPhoto",{chatId:r,accessHash:i,photo:n})}(n,l.map(t=>Object(r.Jb)(e,t)).filter(Boolean),c,i)}),Object(s.b)("joinChannel",(e,t,a)=>{const{chatId:s}=a,n=Object(r.g)(e,s);if(!n)return;const{id:c,accessHash:o}=n;c&&o&&Object(f.a)("joinChannel",{channelId:c,accessHash:o})}),Object(s.b)("deleteChatUser",(e,t,a)=>{(async()=>{const{chatId:s,userId:n}=a,c=Object(r.g)(e,s),o=Object(r.Jb)(e,n);if(!c||!o)return;await Object(f.a)("deleteChatUser",{chat:c,user:o});const i=Object(r.z)(e);i&&i.chatId===s&&e.currentUserId===n&&t.openChat({id:void 0})})()}),Object(s.b)("deleteChat",(e,t,a)=>{(async()=>{const{chatId:s}=a,n=Object(r.g)(e,s);if(!n)return;await Object(f.a)("deleteChat",{chatId:n.id});const c=Object(r.z)(e);c&&c.chatId===s&&t.openChat({id:void 0})})()}),Object(s.b)("leaveChannel",(e,t,a)=>{(async()=>{const{chatId:s}=a,n=Object(r.g)(e,s);if(!n)return;const{id:c,accessHash:o}=n;c&&o&&await Object(f.a)("leaveChannel",{channelId:c,accessHash:o});const i=Object(r.z)(e);i&&i.chatId===s&&t.openChat({id:void 0})})()}),Object(s.b)("deleteChannel",(e,t,a)=>{(async()=>{const{chatId:s}=a,n=Object(r.g)(e,s);if(!n)return;const{id:c,accessHash:o}=n;c&&o&&await Object(f.a)("deleteChannel",{channelId:c,accessHash:o});const i=Object(r.z)(e);i&&i.chatId===s&&t.openChat({id:void 0})})()}),Object(s.b)("createGroupChat",(e,t,a)=>{const{title:n,memberIds:c,photo:i}=a;!async function(e,t,a){Object(s.g)({...Object(s.e)(),chatCreation:{progress:u.a.InProgress}});const n=await Object(f.a)("createGroupChat",{title:e,users:t});if(!n)return;const{id:c}=n;let r=Object(s.e)();r=Object(o.I)(r,c,n),r={...r,chatCreation:{...r.chatCreation,progress:n?u.a.Complete:u.a.Error}},Object(s.g)(r),Object(s.d)().openChat({id:c}),c&&a&&await Object(f.a)("editChatPhoto",{chatId:c,photo:a})}(n,c.map(t=>Object(r.Jb)(e,t)).filter(Boolean),i)}),Object(s.b)("toggleChatPinned",(e,t,a)=>{const{id:s,folderId:c}=a,o=Object(r.g)(e,s);if(o)if(c){const t=Object(r.j)(e,c);if(t){const a=!Object(r.N)(e,s,c),{pinnedChatIds:n,includedChatIds:o}=t,i=a?[s,...n||[]]:(n||[]).filter(e=>e!==s),l=[s,...o];Object(f.a)("editChatFolder",{id:c,folderUpdate:{...t,pinnedChatIds:i,includedChatIds:l}})}}else{const t=Object(r.k)(e,s),a=Object(r.N)(e,s,"archived"===t?n.i:void 0);Object(f.a)("toggleChatPinned",{chat:o,shouldBePinned:!a})}}),Object(s.b)("toggleChatArchived",(e,t,a)=>{const{id:s}=a,c=Object(r.g)(e,s);c&&Object(f.a)("toggleChatArchived",{chat:c,folderId:Object(l.kb)(c)?0:n.i})}),Object(s.b)("loadChatFolders",()=>{!async function(){const e=await Object(f.a)("fetchChatFolders");if(e){const t=Object(s.e)();Object(s.g)({...t,chatFolders:{...t.chatFolders,...e}})}}()}),Object(s.b)("loadRecommendedChatFolders",()=>{!async function(){const e=await Object(f.a)("fetchRecommendedChatFolders");if(e){const t=Object(s.e)();Object(s.g)({...t,chatFolders:{...t.chatFolders,recommended:e}})}}()}),Object(s.b)("editChatFolder",(e,t,a)=>{const{id:s,folderUpdate:n}=a,c=Object(r.j)(e,s);c&&Object(f.a)("editChatFolder",{id:s,folderUpdate:{id:s,emoticon:c.emoticon,pinnedChatIds:c.pinnedChatIds,...n}})}),Object(s.b)("addChatFolder",(e,t,a)=>{const{folder:c}=a,{orderedIds:o}=e.chatFolders;!async function(e,t){const{id:a,description:n,...c}=e;if(await Object(f.a)("editChatFolder",{id:t+1,folderUpdate:{id:t+1,...c}}),!n)return;const o=Object(s.e)(),{recommended:r}=o.chatFolders;r&&Object(s.g)({...o,chatFolders:{...o.chatFolders,recommended:r.filter(({id:e})=>e!==a)}})}(c,o&&o.length?Math.max.apply(Math.max,o):n.i)}),Object(s.b)("deleteChatFolder",(e,t,a)=>{const{id:s}=a;Object(r.j)(e,s)&&async function(e){await Object(f.a)("deleteChatFolder",e)}(s)}),Object(s.b)("toggleChatUnread",(e,t,a)=>{const{id:s}=a,{serverTimeOffset:n}=e,c=Object(r.g)(e,s);c&&(c.unreadCount?Object(f.a)("markMessageListRead",{serverTimeOffset:n,chat:c,threadId:b.MAIN_THREAD_ID}):Object(f.a)("toggleDialogUnread",{chat:c,hasUnreadMark:!c.hasUnreadMark}))}),Object(s.b)("openTelegramLink",(e,t,a)=>{const{url:s}=a;let c=n.tb.exec(s);if(c){const e=c[1];(async()=>{const a=await Object(f.a)("openChatByInvite",e);a&&t.openChat({id:a.chatId})})()}else{c=n.ub.exec(s);const e=c[1],a=c[2]?Number(c[2]):void 0,o=c[3]?Number(c[3]):void 0;"c"===e&&a&&o?t.focusMessage({chatId:-a,messageId:o}):E(t,e,a)}}),Object(s.b)("acceptInviteConfirmation",(e,t,a)=>{const{hash:s}=a;(async()=>{const e=await Object(f.a)("importChatInvite",{hash:s});e&&t.openChat({id:e.id})})()}),Object(s.b)("openChatByUsername",(e,t,a)=>{const{username:s}=a;E(t,s)}),Object(s.b)("togglePreHistoryHidden",(e,t,a)=>{const{chatId:s,isEnabled:n}=a;let c=Object(r.g)(e,s);c&&(async()=>{if(Object(l.lb)(c)){if(c=await Object(f.a)("migrateChat",c),!c)return;t.openChat({id:c.id})}Object(f.a)("togglePreHistoryHidden",{chat:c,isEnabled:n})})()}),Object(s.b)("updateChatDefaultBannedRights",(e,t,a)=>{const{chatId:s,bannedRights:n}=a,c=Object(r.g)(e,s);c&&Object(f.a)("updateChatDefaultBannedRights",{chat:c,bannedRights:n})}),Object(s.b)("updateChatMemberBannedRights",(e,t,a)=>{const{chatId:n,userId:c,bannedRights:i}=a;let d=Object(r.g)(e,n);const b=Object(r.Jb)(e,c);d&&b&&(async()=>{if(Object(l.lb)(d)){if(d=await Object(f.a)("migrateChat",d),!d)return;t.openChat({id:d.id})}await Object(f.a)("updateChatMemberBannedRights",{chat:d,user:b,bannedRights:i});const e=Object(s.e)(),a=Object(r.g)(e,n);if(!a||!a.fullInfo)return;const{members:u,kickedMembers:m}=a.fullInfo,h=!!i.viewMessages,O=!Object.keys(i).length;Object(s.g)(Object(o.I)(e,n,{fullInfo:{...a.fullInfo,...u&&h&&{members:u.filter(e=>e.userId!==c)},...u&&!h&&{members:u.map(e=>e.userId===c?{...e,bannedRights:i}:e)},...O&&m&&{kickedMembers:m.filter(e=>e.userId!==c)}}}))})()}),Object(s.b)("updateChatAdmin",(e,t,a)=>{const{chatId:n,userId:c,adminRights:i,customTitle:d}=a;let b=Object(r.g)(e,n);const u=Object(r.Jb)(e,c);b&&u&&(async()=>{if(Object(l.lb)(b)){if(b=await Object(f.a)("migrateChat",b),!b)return;t.openChat({id:b.id})}await Object(f.a)("updateChatAdmin",{chat:b,user:u,adminRights:i,customTitle:d});const e=Object(s.e)(),a=Object(r.g)(e,n);if(!a||!a.fullInfo)return;const{adminMembers:m}=a.fullInfo,h=!Object.keys(i).length;Object(s.g)(Object(o.I)(e,n,{fullInfo:{...a.fullInfo,...m&&h&&{adminMembers:m.filter(e=>e.userId!==c)},...m&&!h&&{adminMembers:m.map(e=>e.userId===c?{...e,adminRights:i,customTitle:d}:e)}}}))})()}),Object(s.b)("updateChat",(e,t,a)=>{const{chatId:n,title:c,about:i,photo:l}=a,d=Object(r.g)(e,n);d&&(async()=>{Object(s.g)(Object(o.cb)(Object(s.e)(),u.f.InProgress)),await Promise.all([d.title!==c?Object(f.a)("updateChatTitle",d,c):void 0,d.fullInfo&&d.fullInfo.about!==i?Object(f.a)("updateChatAbout",d,i):void 0,l?Object(f.a)("editChatPhoto",{chatId:n,accessHash:d.accessHash,photo:l}):void 0]),Object(s.g)(Object(o.cb)(Object(s.e)(),u.f.Complete))})()}),Object(s.b)("toggleSignatures",(e,t,a)=>{const{chatId:s,isEnabled:n}=a,c=Object(r.g)(e,s);c&&Object(f.a)("toggleSignatures",{chat:c,isEnabled:n})}),Object(s.b)("loadGroupsForDiscussion",()=>{(async()=>{const e=await Object(f.a)("fetchGroupsForDiscussion");if(!e)return;const t=e.reduce((e,t)=>(t&&(e[t.id]=t),e),{}),a=Object(o.c)(Object(s.e)(),t);Object(s.g)({...a,chats:{...a.chats,forDiscussionIds:Object.keys(t).map(Number)}})})()}),Object(s.b)("linkDiscussionGroup",(e,t,a)=>{const{channelId:s,chatId:n}=a,c=Object(r.g)(e,s);let o=Object(r.g)(e,n);c&&o&&(async()=>{if(Object(l.lb)(o)){if(o=await Object(f.a)("migrateChat",o),!o)return;t.openChat({id:o.id})}let{fullInfo:e}=o;if(!e){const t=await Object(f.a)("fetchFullChat",o);if(!t)return;e=t.fullInfo}e.isPreHistoryHidden&&await Object(f.a)("togglePreHistoryHidden",{chat:o,isEnabled:!1}),Object(f.a)("setDiscussionGroup",{channel:c,chat:o})})()}),Object(s.b)("unlinkDiscussionGroup",(e,t,a)=>{const{channelId:s}=a,n=Object(r.g)(e,s);if(!n)return;let c;n.fullInfo&&n.fullInfo.linkedChatId&&(c=Object(r.g)(e,n.fullInfo.linkedChatId)),(async()=>{await Object(f.a)("setDiscussionGroup",{channel:n}),c&&w(c)})()}),Object(s.b)("setActiveChatFolder",(e,t,a)=>({...e,chatFolders:{...e.chatFolders,activeChatFolder:a}})),Object(s.b)("loadMoreMembers",e=>{(async()=>{const{chatId:t}=Object(r.z)(e)||{},a=t?Object(r.g)(e,t):void 0;if(!a||Object(l.lb)(a))return;const n=a.fullInfo&&a.fullInfo.members&&a.fullInfo.members.length||void 0,c=await Object(f.a)("fetchMembers",a.id,a.accessHash,"recent",n);if(!c)return;const{members:i,users:d}=c;i&&i.length&&(e=Object(s.e)(),e=Object(o.g)(e,Object(h.c)(d,"id")),e=Object(o.I)(e,a.id,{fullInfo:{...a.fullInfo,members:[...(a.fullInfo||{}).members||[],...i||[]]}}),Object(s.g)(e))})()}),Object(s.b)("addChatMembers",(e,t,a)=>{const{chatId:s,memberIds:n}=a,c=Object(r.g)(e,s),o=n.map(t=>Object(r.Jb)(e,t)).filter(Boolean);c&&o.length&&(t.setNewChatMembersDialogState(u.i.Loading),(async()=>{await Object(f.a)("addChatMembers",c,o),t.setNewChatMembersDialogState(u.i.Closed),w(c)})())}),Object(s.b)("deleteChatMember",(e,t,a)=>{const{chatId:s,userId:n}=a,c=Object(r.g)(e,s),o=Object(r.Jb)(e,n);c&&o&&(async()=>{await Object(f.a)("deleteChatMember",c,o),w(c)})()});const M=new Map,S=Object(p.h)(e=>e(),1e3,!0);async function k(e,t,a,c,i=!1,l=!1){const d=e.id;let b;switch(c){case u.e.Backwards:b=void 0;break;case u.e.Around:b=-(Math.round(n.gb/2)+1);break;case u.e.Forwards:b=-(n.gb+1)}const m=await Object(f.a)("fetchMessages",{chat:Object(r.Gb)(Object(s.e)(),d,t),offsetId:a,addOffset:b,limit:n.gb,threadId:t});if(!m)return;const{messages:O,users:j,chats:g,threadInfos:p}=m,I=Object(h.c)(O,"id"),v=Object.keys(I).map(Number);let y=Object(s.e)();y=Object(o.b)(y,d,I),y=i?Object(o.eb)(y,d,t,v):Object(o.W)(y,d,t,v),y=Object(o.g)(y,Object(h.c)(j,"id")),y=Object(o.c)(y,Object(h.c)(g,"id")),y=Object(o.mb)(y,d,p);let C=Object(r.Z)(y,d,t);const w=Object(r.hb)(y,d,t);if(i&&C&&w&&Object(h.b)(C,w)&&(y=Object(o.W)(y,d,t,w),C=Object(r.Z)(y,d,t),y=Object(o.y)(y,d,t,"outlyingIds",void 0),i=!1),!l){const e=i?w:C,{newViewportIds:s}=N(e,a,c);y=Object(o.A)(y,d,t,s)}Object(s.g)(y)}function N(e,t,a){const{length:s}=e,c=t?function(e,t){return te[e.length-1]?e.length-1:e.findIndex((a,s)=>a===t||at)}(e,t):-1,o=a===u.e.Backwards?c:c+1||s,r=o-n.gb,i=o+n.gb-1,l=e.slice(Math.max(0,r),i+1);let d,b;switch(a){case u.e.Backwards:d=o>0,b=r>=0;break;case u.e.Forwards:d=o0,b=l.length===n.gb}return{newViewportIds:l,areSomeLocal:d,areAllLocal:b}}async function T(e){let t;const a=e.attachment?(e,n)=>{M.has(n)||(t=n,M.set(n,a));const c=Object(s.e)();Object(s.g)({...c,fileUploads:{byMessageLocalId:{...c.fileUploads.byMessageLocalId,[n]:{progress:e}}}})}:void 0;(e.replyingTo||m.e)&&await Object(p.g)();const n=Object(s.e)();e.serverTimeOffset=n.serverTimeOffset;const c=Object(r.z)(n);if(!c)return;const{threadId:o}=c;e.replyingTo||o===b.MAIN_THREAD_ID||(e.replyingTo=Object(r.Hb)(n,e.chat.id,o)),await Object(f.a)("sendMessage",e,a),a&&t&&M.delete(t)}Object(s.b)("loadViewportMessages",(e,t,a)=>{const{direction:s=u.e.Around,isBudgetPreload:c=!1}=a||{};let{chatId:i,threadId:l}=a||{};if(!i){const t=Object(r.z)(e);if(!t)return;i=t.chatId,l=t.threadId}const d=Object(r.g)(e,i);if(!d||d.isRestricted)return;const b=Object(r.Kb)(e,i,l),m=Object(r.Z)(e,i,l),h=Object(r.hb)(e,i,l);if(b&&b.length&&s!==u.e.Around){const a=s===u.e.Backwards?b[0]:b[b.length-1],n=Boolean(h),r=n?h:m,{newViewportIds:O,areSomeLocal:j,areAllLocal:g}=N(r,a,s);if(j&&(e=Object(o.A)(e,i,l,O)),async function(e,t,a,s,n,c,o,r){t||await k(n,c,r,o,a,s);s||(await Promise.resolve(),e.loadViewportMessages({chatId:n.id,threadId:c,direction:o,isBudgetPreload:!0}))}(t,g,n,c,d,l,s,a),c)return}else{const t=Object(r.I)(e,i)||Object(r.mb)(e,i,l),a=Boolean(t&&m&&!m.includes(t)),s=(a?h:m)||[],{newViewportIds:b,areSomeLocal:O,areAllLocal:j}=N(s,t,u.e.Around);O&&b.length>=n.gb&&(e=Object(o.A)(e,i,l,b)),j||k(d,l,t,u.e.Around,a,c)}return e}),Object(s.b)("loadMessage",(e,t,a)=>{const{chatId:n,messageId:c,replyOriginForId:i}=a,l=Object(r.g)(e,n);l&&async function(e,t,a){const n=await Object(f.a)("fetchMessage",{chat:e,messageId:t});if(!n)return;if(n===b.MESSAGE_DELETED){if(a){let t=Object(s.e)();const n=Object(r.l)(t,e.id,a);t=Object(o.M)(t,e.id,a,{...n,replyToMessageId:void 0}),Object(s.g)(t)}return}let c=Object(s.e)();c=Object(o.M)(c,e.id,t,n.message),c=Object(o.g)(c,Object(h.c)(n.users,"id")),Object(s.g)(c)}(l,c,i)}),Object(s.b)("sendMessage",(e,t,a)=>{const s=Object(r.z)(e);if(!s)return;const{chatId:c,threadId:o,type:i}=s;if("scheduled"===i&&!a.scheduledAt)return{...e,messages:{...e.messages,contentToBeScheduled:a}};const l=Object(r.g)(e,c);t.setReplyingToId({messageId:void 0}),t.clearWebPagePreview({chatId:c,threadId:o,value:!1});const d={...a,chat:l,replyingTo:Object(r.ob)(e,c,o),noWebPage:Object(r.db)(e,c,o)},b=!a.attachments||a.attachments.length<=1,u=!b&&a.attachments&&a.attachments.length>1;if(b){const{attachments:e,...t}=d;T({...t,attachment:e?e[0]:void 0})}else if(u){const{text:e,entities:t,attachments:a,...s}=d,c=Object(h.n)(a,n.W);for(let a=0;a0?r:void 0}),o.forEach(e=>{T({...s,attachment:e,groupedId:r})})}}else{const{text:e,entities:t,attachments:a,replyingTo:s,...n}=d;e&&T({...n,text:e,entities:t,replyingTo:s}),a.forEach(e=>{T({...n,attachment:e})})}}),Object(s.b)("editMessage",(e,t,a)=>{const{serverTimeOffset:s}=e,{text:n,entities:c}=a,o=Object(r.z)(e);if(!o)return;const{chatId:i,threadId:l,type:d}=o,b=Object(r.g)(e,i),u=Object(r.E)(e,i,l,d);b&&u&&(Object(f.a)("editMessage",{chat:b,message:u,text:n,entities:c,noWebPage:Object(r.db)(e,i,l),serverTimeOffset:s}),t.setEditingId({messageId:void 0}))}),Object(s.b)("cancelSendingMessage",(e,t,a)=>{const{chatId:s,messageId:n}=a,c=Object(r.l)(e,s,n),o=c&&M.get(c.previousLocalId||c.id);o&&Object(f.b)(o),t.apiUpdate({"@type":"deleteMessages",ids:[n],chatId:s})}),Object(s.b)("saveDraft",(e,t,a)=>{const{chatId:s,threadId:n,draft:c}=a;if(!c)return;const{text:i,entities:l}=c,d=Object(r.g)(e,s);return n===b.MAIN_THREAD_ID&&Object(f.a)("saveDraft",{chat:d,text:i,entities:l,replyToMsgId:Object(r.ob)(e,s,n)}),e=Object(o.y)(e,s,n,"draft",c),e=Object(o.I)(e,s,{draftDate:Math.round(Date.now()/1e3)})}),Object(s.b)("clearDraft",(e,t,a)=>{const{chatId:s,threadId:n,localOnly:c}=a;if(!Object(r.C)(e,s,n))return;const i=Object(r.g)(e,s);return c||n!==b.MAIN_THREAD_ID||Object(f.a)("clearDraft",i),e=Object(o.y)(e,s,n,"draft",void 0),e=Object(o.I)(e,s,{draftDate:void 0})}),Object(s.b)("toggleMessageWebPage",(e,t,a)=>{const{chatId:s,threadId:n,noWebPage:c}=a;return Object(o.y)(e,s,n,"noWebPage",c)}),Object(s.b)("pinMessage",(e,t,a)=>{const s=Object(r.s)(e);if(!s)return;const{messageId:n,isUnpin:c,isOneSide:o,isSilent:i}=a;Object(f.a)("pinMessage",{chat:s,messageId:n,isUnpin:c,isOneSide:o,isSilent:i})}),Object(s.b)("unpinAllMessages",(e,t,a)=>{const n=Object(r.g)(e,a.chatId);n&&async function(e){await Object(f.a)("unpinAllMessages",{chat:e});let t=Object(s.e)();t=Object(o.y)(t,e.id,b.MAIN_THREAD_ID,"pinnedIds",[]),Object(s.g)(t)}(n)}),Object(s.b)("deleteMessages",(e,t,a)=>{const{messageIds:s,shouldDeleteForAll:n}=a,c=Object(r.z)(e);if(!c)return;const{chatId:o,threadId:i}=c,l=Object(r.g)(e,o);Object(f.a)("deleteMessages",{chat:l,messageIds:s,shouldDeleteForAll:n});const d=Object(r.D)(e,o,i);s.includes(d)&&t.setEditingId({messageId:void 0})}),Object(s.b)("deleteScheduledMessages",(e,t,a)=>{const{messageIds:s}=a,n=Object(r.z)(e);if(!n)return;const{chatId:c}=n,o=Object(r.g)(e,c);Object(f.a)("deleteScheduledMessages",{chat:o,messageIds:s});const i=Object(r.F)(e,c);s.includes(i)&&t.setEditingId({messageId:void 0})}),Object(s.b)("deleteHistory",(e,t,a)=>{(async()=>{const{chatId:s,shouldDeleteForAll:n}=a,c=Object(r.g)(e,s);if(!c)return;const o=c.lastMessage&&c.lastMessage.id;await Object(f.a)("deleteHistory",{chat:c,shouldDeleteForAll:n,maxId:o});const i=Object(r.z)(e);i&&i.chatId===s&&t.openChat({id:void 0})})()}),Object(s.b)("reportMessages",(e,t,a)=>{(async()=>{const{messageIds:s,reason:n,description:c}=a,o=Object(r.z)(e);if(!o)return;const{chatId:i}=o,l=Object(r.g)(e,i),d=await Object(f.a)("reportMessages",{peer:l,messageIds:s,reason:n,description:c});t.showNotification({message:d?"Thank you! Your report will be reviewed by our team.":"Error occured while submiting report. Please, try again later."})})()}),Object(s.b)("markMessageListRead",(e,t,a)=>{const{serverTimeOffset:s}=e,n=Object(r.z)(e);if(!n)return;const{chatId:c,threadId:o}=n,i=Object(r.Gb)(e,c,o);if(!i)return;const{maxId:l}=a;S(()=>{Object(f.a)("markMessageListRead",{serverTimeOffset:s,chat:i,threadId:o,maxId:l})})}),Object(s.b)("markMessagesRead",(e,t,a)=>{const s=Object(r.s)(e);if(!s)return;const{messageIds:n}=a;Object(f.a)("markMessagesRead",{chat:s,messageIds:n})}),Object(s.b)("loadWebPagePreview",(e,t,a)=>{const{text:n}=a;!async function(e){const t=await Object(f.a)("fetchWebPagePreview",{message:e});Object(s.g)({...Object(s.e)(),webPagePreview:t})}(n)}),Object(s.b)("clearWebPagePreview",e=>{if(e.webPagePreview)return{...e,webPagePreview:void 0}}),Object(s.b)("sendPollVote",(e,t,a)=>{const{chatId:s,messageId:n,options:c}=a,o=Object(r.g)(e,s);o&&Object(f.a)("sendPollVote",{chat:o,messageId:n,options:c})}),Object(s.b)("loadPollOptionResults",(e,t,a)=>{const{chat:n,messageId:c,option:r,offset:i,limit:l,shouldResetVoters:d}=a;!async function(e,t,a,n,c,r){const i=await Object(f.a)("loadPollOptionResults",{chat:e,messageId:t,option:a,offset:n,limit:c});if(!i)return;let l=Object(s.e)();l=Object(o.g)(l,Object(h.c)(i.users,"id"));const{voters:d}=l.pollResults;Object(s.g)({...l,pollResults:{...l.pollResults,voters:{...d,[a]:[...!r&&d&&d[a]?d[a]:[],...i&&i.users.map(e=>e.id)].filter((e,t,a)=>a.indexOf(e)===t)},offsets:{...l.pollResults.offsets?l.pollResults.offsets:{},[a]:i.nextOffset||""}}})}(n,c,r,i,l,d)}),Object(s.b)("forwardMessages",e=>{const{fromChatId:t,messageIds:a,toChatId:n}=e.forwardMessages,c=t?Object(r.g)(e,t):void 0,o=n?Object(r.g)(e,n):void 0,i=t&&a?a.sort((e,t)=>e-t).map(a=>Object(r.l)(e,t,a)).filter(Boolean):void 0;c&&o&&i&&i.length&&function(e,t,a){Object(f.a)("forwardMessages",{fromChat:e,toChat:t,messages:a,serverTimeOffset:Object(s.e)().serverTimeOffset}),Object(s.g)({...Object(s.e)(),forwardMessages:{}})}(c,o,i)}),Object(s.b)("loadScheduledHistory",e=>{const t=Object(r.s)(e);if(!t)return;const{hash:a}=e.scheduledMessages.byChatId[t.id]||{};!async function(e,t){const a=await Object(f.a)("fetchScheduledHistory",{chat:e,hash:t});if(!a)return;const{hash:n,messages:c}=a,r=Object(h.c)(c,"id"),i=Object.keys(r).map(Number).sort((e,t)=>t-e);let l=Object(s.e)();l=Object(o.v)(l,e.id,r,n),l=Object(o.y)(l,e.id,b.MAIN_THREAD_ID,"scheduledIds",i),Object(s.g)(l)}(t,a)}),Object(s.b)("sendScheduledMessages",(e,t,a)=>{const{chatId:s,id:n}=a,c=Object(r.g)(e,s);c&&Object(f.a)("sendScheduledMessages",{chat:c,ids:[n]})}),Object(s.b)("rescheduleMessage",(e,t,a)=>{const{chatId:s,messageId:n,scheduledAt:c}=a,o=Object(r.g)(e,s),i=o&&Object(r.rb)(e,o.id,n);o&&i&&Object(f.a)("rescheduleMessage",{chat:o,message:i,scheduledAt:c})}),Object(s.b)("requestThreadInfoUpdate",(e,t,a)=>{const{chatId:s,threadId:n}=a,c=Object(r.Gb)(e,s,n);c&&Object(f.a)("requestThreadInfoUpdate",{chat:c,threadId:n})}),Object(s.b)("loadPinnedMessages",(e,t,a)=>{const{chatId:n}=a,c=Object(r.g)(e,n);c&&async function(e){const t=await Object(f.a)("fetchPinnedMessages",{chat:e});if(!t)return;const{messages:a,chats:n,users:c}=t,r=Object(h.c)(a,"id"),i=Object.keys(r).map(Number).sort((e,t)=>t-e);let l=Object(s.e)();l=Object(o.b)(l,e.id,r),l=Object(o.y)(l,e.id,b.MAIN_THREAD_ID,"pinnedIds",i),l=Object(o.g)(l,Object(h.c)(c,"id")),l=Object(o.c)(l,Object(h.c)(n,"id")),Object(s.g)(l)}(c)});var A=a(53);const P=Object(p.h)(e=>e(),500,!1);async function R(e,t){const a=await Object(f.a)("searchGifs",{query:e,offset:t});a&&Object(s.g)(Object(o.R)(Object(s.e)(),!t,a.gifs,a.nextOffset))}Object(s.b)("loadStickerSets",e=>{const{hash:t}=e.stickers.added||{};!async function(e=0){const t=await Object(f.a)("fetchStickerSets",{hash:e});if(!t)return;Object(s.g)(Object(o.jb)(Object(s.e)(),"added",t.hash,t.sets))}(t)}),Object(s.b)("loadAddedStickers",(e,t)=>{const{setIds:a}=e.stickers.added;a&&a.length&&(async()=>{for(let e=0;e0&&await Object(p.f)(500)})()}),Object(s.b)("loadRecentStickers",e=>{const{hash:t}=e.stickers.recent||{};!async function(e=0){const t=await Object(f.a)("fetchRecentStickers",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,recent:t}})}(t)}),Object(s.b)("loadFavoriteStickers",e=>{const{hash:t}=e.stickers.favorite||{};!async function(e=0){const t=await Object(f.a)("fetchFavoriteStickers",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,favorite:t}})}(t)}),Object(s.b)("loadFeaturedStickers",e=>{const{hash:t}=e.stickers.featured||{};!async function(e=0){const t=await Object(f.a)("fetchFeaturedStickers",{hash:e});if(!t)return;Object(s.g)(Object(o.jb)(Object(s.e)(),"featured",t.hash,t.sets))}(t)}),Object(s.b)("loadStickers",(e,t,a)=>{const{stickerSetId:n}=a;let{stickerSetAccessHash:c}=a;if(!c){const t=Object(r.zb)(e,n);if(!t)return;c=t.accessHash}!async function(e,t){const a=await Object(f.a)("fetchStickers",{stickerSetId:e,accessHash:t});if(!a)return;const{set:n,stickers:c,packs:r}=a;let i=Object(s.e)();i=Object(o.ib)(i,n.id,{...n,stickers:c,packs:r});const l=i.stickers.forEmoji.emoji;l&&r[l]&&(i=Object(o.p)(i));Object(s.g)(i)}(n,c)}),Object(s.b)("loadAnimatedEmojis",()=>{!async function(){const e=await Object(f.a)("fetchAnimatedEmojis");if(!e)return;const{set:t,stickers:a}=e;Object(s.g)(Object(o.r)(Object(s.e)(),{...t,stickers:a}))}()}),Object(s.b)("loadSavedGifs",e=>{const{hash:t}=e.gifs.saved;!async function(e=0){const t=await Object(f.a)("fetchSavedGifs",{hash:e});if(!t)return;const a=Object(s.e)();Object(s.g)({...a,gifs:{...a.gifs,saved:t}})}(t)}),Object(s.b)("faveSticker",(e,t,a)=>{const{sticker:s}=a;s&&Object(f.a)("faveSticker",{sticker:s})}),Object(s.b)("unfaveSticker",(e,t,a)=>{const{sticker:n}=a;n&&function(e){const t=Object(s.e)();Object(s.g)({...t,stickers:{...t.stickers,favorite:{...t.stickers.favorite,stickers:t.stickers.favorite.stickers.filter(({id:t})=>t!==e.id)}}}),Object(f.a)("faveSticker",{sticker:e,unfave:!0})}(n)}),Object(s.b)("toggleStickerSet",(e,t,a)=>{const{stickerSetId:s}=a,n=Object(r.zb)(e,s);if(!n)return;const{accessHash:c,installedDate:o}=n;Object(f.a)(o?"uninstallStickerSet":"installStickerSet",{stickerSetId:s,accessHash:c})}),Object(s.b)("loadEmojiKeywords",(e,t,a)=>{const{language:n}=a;let c=e.emojiKeywords[n];c&&c.isLoading||(Object(s.g)({...e,emojiKeywords:{...e.emojiKeywords,[n]:{...c,isLoading:!0}}}),(async()=>{const t=await Object(f.a)("fetchEmojiKeywords",{language:n,fromVersion:c?c.version:0});e=Object(s.e)(),c=e.emojiKeywords[n],t?Object(s.g)({...e,emojiKeywords:{...e.emojiKeywords,[n]:{isLoading:!1,version:t.version,keywords:{...c&&c.keywords,...t.keywords}}}}):Object(s.g)({...e,emojiKeywords:{...e.emojiKeywords,[n]:{...c,isLoading:!1}}})})())}),Object(s.b)("setStickerSearchQuery",(e,t,a)=>{const{query:n}=a;n&&P(()=>{!async function(e,t=0){const a=await Object(f.a)("searchStickers",{query:e,hash:t});if(!a)return;const n=Object(s.e)(),{setsById:c,added:r}=n.stickers,i=a.sets.map(({id:e})=>e);r.setIds&&r.setIds.forEach(t=>{if(!i.includes(t)){const{title:a}=c[t]||{};a&&Object(A.a)(a,e)&&i.unshift(t)}});Object(s.g)(Object(o.jb)(n,"search",a.hash,a.sets,i))}(n)})}),Object(s.b)("setGifSearchQuery",(e,t,a)=>{const{query:s}=a;"string"==typeof s&&P(()=>{R(s)})}),Object(s.b)("searchMoreGifs",e=>{const{query:t,offset:a}=e.gifs.search;"string"==typeof t&&P(()=>{R(t,a)})}),Object(s.b)("loadStickersForEmoji",(e,t,a)=>{const{emoji:n}=a,{hash:c}=e.stickers.forEmoji;P(()=>{!async function(e,t=0){let a=Object(s.e)();Object(s.g)({...a,stickers:{...a.stickers,forEmoji:{...a.stickers.forEmoji,emoji:e}}});const n=await Object(f.a)("fetchStickersForEmoji",{emoji:e,hash:t});if(a=Object(s.e)(),!n||a.stickers.forEmoji.emoji!==e)return;a=Object(o.kb)(a,e,n.stickers,n.hash),Object(s.g)(a)}(n,c)})}),Object(s.b)("clearStickersForEmoji",e=>({...e,stickers:{...e.stickers,forEmoji:{}}}));var x=a(30);const L=Object(p.h)(e=>e(),500,!1);async function B(e="",t,a,c,i,l){let d;if(c){const s=await Object(f.a)("searchMessagesLocal",{chatOrUser:c,query:e,type:t,limit:n.G,offsetId:a,minDate:l,maxDate:i});if(s){const{messages:e,users:t,totalCount:a,nextOffsetId:n}=s;d={messages:e,users:t,chats:[],totalCount:a,nextRate:n}}}else d=await Object(f.a)("searchMessagesGlobal",{query:e,offsetRate:a,limit:n.G,type:t,maxDate:i,minDate:l});let b=Object(s.e)();const u=Object(r.u)(b);if(!d||""!==e&&e!==u)return void Object(s.g)(Object(o.U)(b,{messages:!1}));const{messages:m,users:O,chats:j,totalCount:g,nextRate:p}=d;j.length&&(b=Object(o.c)(b,Object(h.c)(j,"id"))),O.length&&(b=Object(o.g)(b,Object(h.c)(O,"id"))),m.length&&(b=Object(o.d)(b,m)),b=Object(o.V)(b,m,g,t,p),Object(s.g)(b)}async function D(){const e=await Object(f.a)("fetchChats",{limit:n.l,archived:!0,withPinned:!0,serverTimeOffset:Object(s.e)().serverTimeOffset});if(!e)return;let t=Object(s.e)();t=Object(o.rb)(t,Object(h.c)(e.users,"id")),t=Object(o.N)(t,Object(h.c)(e.chats,"id")),t=Object(o.s)(t,"archived",e.chatIds),t=Object(o.K)(t,"archived",e),Object(s.g)(t)}async function F(){let e=Object(s.e)();const{recentlyFoundChatIds:t}=e.globalSearch,{userIds:a}=e.contactList||{};if(!(a&&a.length||t&&t.length))return;const n=[...t||[],...a||[]].map(t=>Object(r.Jb)(e,t)).filter(Boolean),c=await Object(f.a)("fetchUsers",{users:n});c&&(e=Object(s.e)(),e=Object(o.rb)(e,Object(h.c)(c,"id")),Object(s.g)(e))}function U(e){return Object(f.a)("fetchMessages",{chat:e,threadId:b.MAIN_THREAD_ID,offsetId:e.lastReadInboxMessageId,addOffset:-(Math.round(n.gb/2)+1),limit:n.gb})}Object(s.b)("setGlobalSearchQuery",(e,t,a)=>{const{chatId:n}=e.globalSearch,{query:c}=a;c&&!n&&L(()=>{!async function(e){const t=await Object(f.a)("searchChats",{query:e});let a=Object(s.e)();const n=Object(r.u)(a);if(!t||!n||e!==n)return void Object(s.g)(Object(o.U)(a,{chats:!1}));const{localChats:c,localUsers:i,globalChats:l,globalUsers:d}=t;(c.length||l.length)&&(a=Object(o.c)(a,Object(h.c)([...c,...l],"id")));(i.length||d.length)&&(a=Object(o.g)(a,Object(h.c)([...i,...d],"id")));a=Object(o.U)(a,{chats:!1}),a=Object(o.S)(a,{localResults:{chatIds:c.map(({id:e})=>e),userIds:i.map(({id:e})=>e)},globalResults:{...a.globalSearch.globalResults,chatIds:d.map(({id:e})=>e),userIds:l.map(({id:e})=>e)}}),Object(s.g)(a)}(c)})}),Object(s.b)("setGlobalSearchDate",(e,t,a)=>{const{date:n}=a,c=n?Object(x.m)(n):n,i=Object(o.S)(e,{date:n,query:"",resultsByType:{...e.globalSearch.resultsByType,text:{totalCount:void 0,foundIds:[],nextOffsetId:0}}});Object(s.g)(i);const{chatId:l}=e.globalSearch;B("","text",void 0,l?Object(r.g)(e,l):void 0,c,n)}),Object(s.b)("searchMessagesGlobal",(e,t,a)=>{const{query:s,resultsByType:n,chatId:c,date:o}=e.globalSearch,i=o?Object(x.m)(o):o,{type:l}=a,{nextOffsetId:d}=n&&n[l]||{};B(s,l,d,c?Object(r.g)(e,c):void 0,i,o)}),Object(s.b)("searchTextMessagesLocal",e=>{const{chatId:t,threadId:a}=Object(r.z)(e)||{},c=t?Object(r.g)(e,t):void 0,i=Object(r.B)(e);if(!c||!i||!a)return;const{query:l,results:d}=i,u=d?d.nextOffsetId:void 0;let m;if(a!==b.MAIN_THREAD_ID){const s=Object(r.Fb)(e,t,a);m=s?s.topMessageId:void 0}!async function(e,t,a,c,i){const l=await Object(f.a)("searchMessagesLocal",{chatOrUser:e,type:"text",query:c,topMessageId:a,limit:n.ib,offsetId:i});if(!l)return;const{messages:d,users:b,totalCount:u,nextOffsetId:m}=l,O=Object(h.c)(d,"id"),j=Object.keys(O).map(Number);let g=Object(s.e)();const p=Object(r.B)(g);if(!p||c&&c!==p.query)return;g=Object(o.b)(g,e.id,O),g=Object(o.g)(g,Object(h.c)(b,"id")),g=Object(o.ab)(g,e.id,t,j,u,m),Object(s.g)(g)}(c,a,m,l,u)}),Object(s.b)("searchMediaMessagesLocal",e=>{const t=Object(r.x)(e),a=t?e.users.byId[t]||e.chats.byId[t]:void 0,c=Object(r.w)(e);if(!a||!c)return;const{currentType:i,resultsByType:l}=c,d=i&&l&&l[i],b=d?d.nextOffsetId:void 0;i&&async function(e,t,a){const c=await Object(f.a)("searchMessagesLocal",{chatOrUser:e,type:t,limit:n.Ab,offsetId:a});if(!c)return;const{messages:i,users:l,totalCount:d,nextOffsetId:b}=c,u=Object(h.c)(i,"id"),m=Object.keys(u).map(Number);let O=Object(s.e)();if(!Object(r.w)(O))return;O=Object(o.b)(O,e.id,u),O=Object(o.g)(O,Object(h.c)(l,"id")),O=Object(o.X)(O,e.id,t,m,d,b),Object(s.g)(O)}(a,i,b)}),Object(s.b)("searchMessagesByDate",(e,t,a)=>{const{timestamp:n}=a,{chatId:c}=Object(r.z)(e)||{};if(!c)return;const o=Object(r.g)(e,c);o&&async function(e,t){const a=await Object(f.a)("findFirstMessageIdAfterDate",{chat:e,timestamp:t});if(!a)return;Object(s.d)().focusMessage({chatId:e.id,messageId:a})}(o,n)}),Object(s.b)("checkPublicLink",(e,t,a)=>{const{chatId:n}=Object(r.z)(e)||{};if(!n)return;if(e.management.progress===u.f.InProgress)return;const{username:c}=a;(async()=>{e=Object(o.cb)(e,u.f.InProgress),e=Object(o.bb)(e,n,{isUsernameAvailable:void 0}),Object(s.g)(e);const t=await Object(f.a)("checkChatUsername",{username:c});e=Object(s.e)(),e=Object(o.cb)(e,t?u.f.Complete:u.f.Error),e=Object(o.bb)(e,n,{isUsernameAvailable:t}),Object(s.g)(e)})()}),Object(s.b)("updatePublicLink",(e,t,a)=>{const{chatId:n}=Object(r.z)(e)||{};let c=n&&Object(r.g)(e,n);if(!n||!c)return;const{username:i}=a;(async()=>{if(e=Object(o.cb)(e,u.f.InProgress),Object(s.g)(e),Object(l.lb)(c)){if(c=await Object(f.a)("migrateChat",c),!c)return;t.openChat({id:c.id})}const a=await Object(f.a)("setChatUsername",{chat:c,username:i});e=Object(s.e)(),e=Object(o.cb)(e,a?u.f.Complete:u.f.Error),e=Object(o.bb)(e,n,{isUsernameAvailable:void 0}),Object(s.g)(e)})()}),Object(s.b)("updatePrivateLink",e=>{const{chatId:t}=Object(r.z)(e)||{},a=t&&Object(r.g)(e,t);t&&a&&Object(f.a)("updatePrivateLink",{chat:a})}),Object(s.b)("sync",(e,t)=>{!async function(e){n.r&&console.log(">>> START SYNC");await Object(f.a)("fetchCurrentUser");const t=await async function(){const e=await Object(f.a)("fetchChats",{limit:n.l,withPinned:!0,serverTimeOffset:Object(s.e)().serverTimeOffset});if(!e)return;let t=Object(s.e)();const{recentlyFoundChatIds:a}=t.globalSearch,{userIds:c}=t.contactList||{},{currentUserId:i}=t,d=[...a||[],...c||[],...i?[i]:[]],u=d.map(e=>Object(r.Jb)(t,e)).filter(Boolean),m=d.map(e=>Object(r.g)(t,e)).filter(Boolean),{chatId:O}=Object(r.z)(t)||{};if(O){const e=Object(r.g)(t,O);if(e&&!d.includes(O)&&m.push(e),Object(l.ob)(O)){const e=Object(r.Jb)(t,O);e&&!d.includes(O)&&u.push(e)}}u.push(...e.users),m.push(...e.chats),t=Object(o.t)(t,Object(h.c)(m,"id")),t=Object(o.s)(t,"active",e.chatIds),t={...t,chats:{...t.chats}},t=Object(o.K)(t,"active",e),Object.keys(e.draftsById).map(Number).forEach(a=>{t=Object(o.y)(t,a,b.MAIN_THREAD_ID,"draft",e.draftsById[a])}),Object.keys(e.replyingToById).map(Number).forEach(a=>{t=Object(o.y)(t,a,b.MAIN_THREAD_ID,"replyingToId",e.replyingToById[a])}),Object(s.g)(t),O&&!t.chats.byId[O]&&Object(s.d)().openChat({id:void 0});return u}();await async function(e){let t=!1,a=e||[],n=Object(s.e)();const{chatId:c,threadId:i}=Object(r.z)(n)||{},l=Object.keys(n.messages.byChatId).map(Number).reduce((e,t)=>{const a=Object(r.C)(n,t,b.MAIN_THREAD_ID);return a?{...e,[t]:a}:e},{});if(c){const e=await U(n.chats.byId[c]);n=Object(s.e)();const{chatId:l}=Object(r.z)(n)||{},d=i&&Object(r.Fb)(n,c,i);if(e&&l===c){const s=n.messages.byChatId[c],r=Object(h.c)(e.messages,"id"),l=Object.keys(r).map(Number);if(n={...n,messages:{...n.messages,byChatId:{[c]:{byId:r,threadsById:{[b.MAIN_THREAD_ID]:{...s&&s.threadsById[b.MAIN_THREAD_ID],listedIds:l,viewportIds:l,outlyingIds:void 0}}}}}},i&&d&&d.originChannelId){const{originChannelId:e}=d,t=n.messages.byChatId[e],a=await U(n.chats.byId[e]);if(a){const e=Object(h.c)(a.messages,"id"),o=Object.keys(e).map(Number);n={...n,messages:{...n.messages,byChatId:{...n.messages.byChatId,[d.originChannelId]:{byId:e,threadsById:{[b.MAIN_THREAD_ID]:{...t&&t.threadsById[b.MAIN_THREAD_ID],listedIds:o,viewportIds:o,outlyingIds:void 0}}},[c]:{...n.messages.byChatId[c],threadsById:{...n.messages.byChatId[c].threadsById,[i]:{...s&&s.threadsById[i],outlyingIds:void 0}}}}}}}}n=Object(o.N)(n,Object(h.c)(e.chats,"id")),n=Object(o.mb)(n,c,e.threadInfos),t=!0,a=Array.prototype.concat(a,e.users)}}t||(n={...n,messages:{...n.messages,byChatId:{}}});Object.keys(l).map(Number).forEach(e=>{n=Object(o.y)(n,e,b.MAIN_THREAD_ID,"draft",l[e])}),e?n=Object(o.z)(n,Object(h.c)(a,"id")):a&&(n=Object(o.rb)(n,Object(h.c)(a,"id")));Object(s.g)(n);const{chatId:d,messageId:u}=n.audioPlayer;d&&u&&!Object(r.l)(n,d,u)&&Object(s.d)().closeAudioPlayer()}(t),Object(s.g)({...Object(s.e)(),lastSyncTime:Date.now()}),n.r&&console.log(">>> FINISH SYNC");e()}(t.afterSync)}),Object(s.b)("afterSync",(e,t)=>{!async function(e){n.r&&console.log(">>> START AFTER-SYNC");e.loadFavoriteStickers(),await Promise.all([F(),D()]),await Object(f.a)("fetchCurrentUser"),n.r&&console.log(">>> FINISH AFTER-SYNC")}(t)});const H=Object(p.a)(e=>e(),500,!1,!0),q=Object(p.h)(e=>e(),500,!1);function G(e,t,a){return{...e,inlineBots:{...e.inlineBots,byUsername:{...e.inlineBots.byUsername,[t]:a}}}}function _(e,t){return{...e,inlineBots:{...e.inlineBots,isLoading:t}}}Object(s.b)("loadFullUser",(e,t,a)=>{const{userId:s}=a,n=Object(r.Jb)(e,s);if(!n)return;const{id:c,accessHash:o}=n;H(()=>Object(f.a)("fetchFullUser",{id:c,accessHash:o}))}),Object(s.b)("loadUser",(e,t,a)=>{const{userId:n}=a,c=Object(r.Jb)(e,n);c&&(async()=>{const t=await Object(f.a)("fetchUsers",{users:[c]});t&&(e=Object(s.e)(),e=Object(o.rb)(e,Object(h.c)(t,"id")),Object(s.g)(e))})()}),Object(s.b)("loadTopUsers",e=>{const{serverTimeOffset:t,topPeers:{hash:a,lastRequestedAt:n}}=e;(!n||Date.now()/1e3+t-n>60)&&async function(e){const t=await Object(f.a)("fetchTopUsers",{hash:e});if(!t)return;const{hash:a,ids:n,users:c}=t;let r=Object(s.e)();r=Object(o.g)(r,Object(h.c)(c,"id")),r={...r,topPeers:{...r.topPeers,hash:a,userIds:n,lastRequestedAt:Date.now()/1e3+r.serverTimeOffset}},Object(s.g)(r)}(a)}),Object(s.b)("loadContactList",e=>{const{hash:t}=e.contactList||{};!async function(e){const t=await Object(f.a)("fetchContactList",{hash:e});if(!t)return;let a=Object(o.g)(Object(s.e)(),Object(h.c)(t.users,"id"));a=Object(o.c)(a,Object(h.c)(t.chats,"id"));const n=e=>e.lastName||e.firstName||"",c=new Intl.Collator("en-US"),r=t.users.sort((e,t)=>c.compare(n(e),n(t))).filter(e=>!e.isSelf);Object(s.g)({...a,contactList:{hash:t.hash,userIds:r.map(e=>e.id)}})}(t)}),Object(s.b)("loadCurrentUser",()=>{Object(f.a)("fetchCurrentUser")}),Object(s.b)("updateContact",(e,t,a)=>{const{userId:n,isMuted:c,firstName:i,lastName:l}=a;!async function(e,t,a,n){const c=Object(s.e)(),i=Object(r.Jb)(c,e);if(!i)return;Object(s.d)().updateChatMutedState({chatId:e,isMuted:t}),Object(s.g)(Object(o.cb)(Object(s.e)(),u.f.InProgress));await Object(f.a)("updateContact",{phone:i.phoneNumber,firstName:a,lastName:n})&&Object(s.g)(Object(o.ob)(Object(s.e)(),i.id,{firstName:a,lastName:n}));Object(s.g)(Object(o.cb)(Object(s.e)(),u.f.Complete))}(n,c,i,l)}),Object(s.b)("deleteUser",(e,t,a)=>{const{userId:n}=a;!async function(e){const t=Object(s.e)(),a=Object(r.Jb)(t,e);if(!a)return;const{id:n,accessHash:c}=a;await Object(f.a)("deleteUser",{id:n,accessHash:c})}(n)}),Object(s.b)("loadProfilePhotos",(e,t,a)=>{const{profileId:n}=a,c=Object(l.ob)(n),i=c?Object(r.Jb)(e,n):void 0,d=c?void 0:Object(r.g)(e,n);(async()=>{const e=await Object(f.a)("fetchProfilePhotos",i,d);if(!e||!e.photos)return;let t=Object(s.e)();c?t=Object(o.ob)(t,n,{photos:e.photos}):(t=Object(o.g)(t,Object(h.c)(e.users,"id")),t=Object(o.I)(t,n,{photos:e.photos})),Object(s.g)(t)})()}),Object(s.b)("setUserSearchQuery",(e,t,a)=>{const{query:n}=a;n&&q(()=>{!async function(e){const t=await Object(f.a)("searchChats",{query:e});let a=Object(s.e)();const n=a.userSearch.query;if(!t||!n||e!==n)return void Object(s.g)(Object(o.qb)(a,!1));const{localUsers:c,globalUsers:r}=t;let i,l;c.length&&(a=Object(o.g)(a,Object(h.c)(c,"id")),i=c.map(({id:e})=>e));r.length&&(a=Object(o.g)(a,Object(h.c)(r,"id")),l=r.map(({id:e})=>e));a=Object(o.qb)(a,!1),a=Object(o.pb)(a,{localUserIds:i,globalUserIds:l}),Object(s.g)(a)}(n)})});const z=Object(p.a)(e=>e(),500,!1);async function $(e,t,a){await Object(f.a)("sendMessage",{chat:e,text:a})}Object(s.b)("clickInlineButton",(e,t,a)=>{const{button:c}=a;switch(c.type){case"command":t.sendBotCommand({command:c.value});break;case"url":c.value.match(n.tb)||c.value.match(n.ub)?t.openTelegramLink({url:c.value}):t.toggleSafeLinkModal({url:c.value});break;case"callback":{const t=Object(r.s)(e);if(!t)return;!async function(e,t,a){const n=await Object(f.a)("answerCallbackButton",{chatId:e.id,accessHash:e.accessHash,messageId:t,data:a});if(!n||!n.message)return;const{message:c,alert:o}=n;o?Object(s.d)().showDialog({data:{message:c}}):Object(s.d)().showNotification({message:c})}(t,c.messageId,c.value);break}case"requestPoll":t.openPollModal();break;case"buy":{const a=Object(r.s)(e),{messageId:s,value:n}=c;if(!a)return;n?t.getReceipt({receiptMessageId:n,chatId:a.id,messageId:s}):(t.getPaymentForm({messageId:s}),t.setInvoiceMessageInfo(Object(r.l)(e,a.id,s)),t.openPaymentModal({messageId:s}));break}}}),Object(s.b)("sendBotCommand",(e,t,a)=>{const{command:s,chatId:n}=a,{currentUserId:c}=e,o=n?Object(r.g)(e,n):Object(r.s)(e);c&&o&&$(o,c,s)}),Object(s.b)("restartBot",(e,t,a)=>{const{chatId:n}=a,{currentUserId:c}=e,i=Object(r.s)(e),l=c&&Object(r.h)(e,n);c&&i&&l&&(async()=>{await Object(f.a)("unblockContact",l.id,l.accessHash)&&(Object(s.g)(Object(o.q)(Object(s.e)(),l.id)),$(i,c,"/start"))})()}),Object(s.b)("loadTopInlineBots",e=>{const{serverTimeOffset:t}=e,{hash:a,lastRequestedAt:n}=e.topInlineBots;n&&Date.now()+t-n<6e4||(async()=>{const e=await Object(f.a)("fetchTopInlineBots",{hash:a});if(!e)return;const{hash:t,ids:n,users:c}=e;let r=Object(s.e)();r=Object(o.g)(r,Object(h.c)(c,"id")),r={...r,topInlineBots:{...r.topInlineBots,hash:t,userIds:n,lastRequestedAt:Date.now()}},Object(s.g)(r)})()}),Object(s.b)("queryInlineBot",(e,t,a)=>{const{chatId:n,username:c,query:i,offset:l}=a;(async()=>{let t=e.inlineBots.byUsername[c];if(!1!==t){if(void 0===t){const{user:a,chat:n}=await Object(f.a)("fetchInlineBot",{username:c})||{};if(e=Object(s.e)(),!a||!n)return void Object(s.g)(G(e,c,!1));e=Object(o.g)(e,{[a.id]:a}),e=Object(o.c)(e,{[n.id]:n}),t={id:a.id,query:"",offset:"",switchPm:void 0,canLoadMore:!0,results:[]},e=G(e,c,t),Object(s.g)(e)}(i!==t.query||t.canLoadMore)&&z(()=>{!async function({username:e,inlineBotData:t,chatId:a,query:n,offset:c}){let o=Object(s.e)();const i=Object(r.Jb)(o,t.id),l=Object(r.g)(o,a);if(!i||!l)return;const d=t.query!==n;o=_(o,!0),o=G(o,e,{...t,query:n,...d&&{offset:void 0,results:[]}}),Object(s.g)(o);const b=await Object(f.a)("fetchInlineBotResults",{bot:i,chat:l,query:n,offset:d?void 0:c}),u=o.inlineBots.byUsername[e];if(o=_(Object(s.e)(),!1),!b||!u||n!==u.query)return void Object(s.g)(o);const m=new Set((u.results||[]).map(e=>e.id)),h=b.results.filter(e=>!m.has(e.id));o=G(o,e,{...u,help:b.help,...h.length&&{isGallery:b.isGallery},...b.switchPm&&{switchPm:b.switchPm},canLoadMore:b.results.length>0&&Boolean(b.nextOffset),results:""===u.offset||u.offset===b.nextOffset?b.results:(u.results||[]).concat(h),offset:h.length?b.nextOffset:""}),Object(s.g)(o)}({username:c,inlineBotData:t,chatId:n,query:i,offset:l})})}})()}),Object(s.b)("sendInlineBotResult",(e,t,a)=>{const{id:s,queryId:n}=a,c=Object(r.z)(e);if(!c||!s)return;const{chatId:o,threadId:i}=c,l=Object(r.g)(e,o);t.setReplyingToId({messageId:void 0}),t.clearWebPagePreview({chatId:o,threadId:i,value:!1}),Object(f.a)("sendInlineBotResult",{chat:l,resultId:s,queryId:n,replyingTo:Object(r.ob)(e,o,i)})}),Object(s.b)("resetInlineBot",(e,t,a)=>{const{username:n}=a;let c=e.inlineBots.byUsername[n];c&&(c={id:c.id,query:"",offset:"",switchPm:void 0,canLoadMore:!0,results:[]},Object(s.g)(G(e,n,c)))});a(88);Object(s.b)("loadPasswordInfo",()=>{(async()=>{const e=await Object(f.a)("getPasswordInfo");if(!e)return;let t=Object(s.e)();t=Object(o.w)(t,{hasPassword:e.hasPassword}),t=Object(o.nb)(t,{hint:e.hint}),Object(s.g)(t)})()}),Object(s.b)("checkPassword",(e,t,a)=>{const{currentPassword:n,onSuccess:c}=a;Object(s.g)(Object(o.nb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(f.a)("checkPassword",n);Object(s.g)(Object(o.nb)(Object(s.e)(),{isLoading:!1})),e&&c()})()}),Object(s.b)("clearPassword",(e,t,a)=>{const{currentPassword:n,onSuccess:c}=a;Object(s.g)(Object(o.nb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(f.a)("clearPassword",n);Object(s.g)(Object(o.nb)(Object(s.e)(),{isLoading:!1})),e&&c()})()}),Object(s.b)("updatePassword",(e,t,a)=>{const{currentPassword:n,password:c,hint:r,email:i,onSuccess:l}=a;Object(s.g)(Object(o.nb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(f.a)("updatePassword",n,c,r,i);Object(s.g)(Object(o.nb)(Object(s.e)(),{isLoading:!1})),e&&l()})()}),Object(s.b)("updateRecoveryEmail",(e,t,a)=>{const{currentPassword:n,email:c,onSuccess:r}=a;Object(s.g)(Object(o.nb)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await Object(f.a)("updateRecoveryEmail",n,c);Object(s.g)(Object(o.nb)(Object(s.e)(),{isLoading:!1,waitingEmailCodeLength:void 0})),e&&r()})()}),Object(s.b)("provideTwoFaEmailCode",(e,t,a)=>{const{code:s}=a;Object(f.a)("provideRecoveryEmailCode",s)}),Object(s.b)("clearTwoFaError",e=>Object(o.nb)(e,{error:void 0}));var V=a(61);Object(s.b)("validateRequestedInfo",(e,t,a)=>{const{requestInfo:n,saveInfo:c}=a,i=Object(r.ib)(e);i&&async function(e,t,a){const n=await Object(f.a)("validateRequestedInfo",{messageId:e,requestInfo:t,shouldSave:a});if(!n)return;const{id:c,shippingOptions:r}=n;if(!c)return;let i=Object(o.F)(Object(s.e)(),c);r?(i=Object(o.hb)(i,r),i=Object(o.D)(i,u.j.Shipping)):i=Object(o.D)(i,u.j.PaymentInfo);Object(s.g)(i)}(i,n,c)}),Object(s.b)("getPaymentForm",(e,t,a)=>{const{messageId:n}=a;n&&async function(e){const t=await Object(f.a)("getPaymentForm",{messageId:e});if(!t)return;let a=Object(o.C)(Object(s.e)(),t),n=u.j.PaymentInfo;a.payment.invoice&&(a.payment.invoice.shippingAddressRequested||a.payment.invoice.nameRequested||a.payment.invoice.phoneRequested||a.payment.invoice.emailRequested)&&(n=u.j.ShippingInfo);a=Object(o.D)(a,n),Object(s.g)(a)}(n)}),Object(s.b)("getReceipt",(e,t,a)=>{const{receiptMessageId:n,chatId:c,messageId:i}=a;i&&n&&c&&async function(e,t,a){const n=await Object(f.a)("getReceipt",t);if(!n)return;let c=Object(s.e)();const i=Object(r.l)(c,a,e);c=Object(o.E)(c,n,i),Object(s.g)(c)}(i,n,c)}),Object(s.b)("clearPaymentError",e=>{Object(s.g)({...e,payment:{...e.payment,error:void 0}})}),Object(s.b)("clearReceipt",e=>{Object(s.g)({...e,payment:{...e.payment,receipt:void 0}})}),Object(s.b)("sendCredentialsInfo",(e,t,a)=>{const n=Object(r.lb)(e);if(!n)return;const{credentials:c}=a,{data:i}=c;!async function(e,t){const a=function(e){const t=Object.keys(e).map(t=>`${t}=${e[t]}`).join("&");return t.length>0?"?"+t:""}({"card[number]":e.cardNumber,"card[exp_month]":e.expiryMonth,"card[exp_year]":e.expiryYear,"card[cvc]":e.cvv,"card[address_zip]":e.zip,"card[address_country]":e.country}),n=await fetch("https://api.stripe.com/v1/tokens"+a,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:"Bearer "+t}}),c=await n.json();if(c.error){const e=Object(V.b)(c.error),t=Object(s.e)();return void Object(s.g)({...t,payment:{...t.payment,error:{...e}}})}let r=Object(o.G)(Object(s.e)(),{type:c.type,id:c.id});r=Object(o.D)(r,u.j.Checkout),Object(s.g)(r)}(i,n)}),Object(s.b)("sendPaymentForm",(e,t,a)=>{const{shippingOptionId:n,saveCredentials:c}=a,i=Object(r.ib)(e),l=Object(r.jb)(e),d=Object(r.lb)(e),b=Object(r.Bb)(e);i&&d&&async function(e,t,a,n){if(await Object(f.a)("sendPaymentForm",{messageId:e,credentials:t,requestedInfoId:a,shippingOptionId:n})){const e=Object(o.i)(Object(s.e)());Object(s.g)(Object(o.j)(e))}}(i,{save:c,data:b},l,n)}),Object(s.b)("setPaymentStep",(e,t,a={})=>Object(o.D)(e,a.step||u.j.ShippingInfo)),Object(s.b)("setInvoiceMessageInfo",(e,t,a)=>Object(o.B)(e,a));a(89);var W=a(34),K=a(79);const Q=Object(p.h)(e=>e(),1e3,!0);Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateChat":{a.noTopChatsRequest||Object(r.M)(e,a.id)||t.loadTopChats();const n=Object(o.I)(e,a.id,a.chat,a.newProfilePhoto);Object(s.g)(n);const c=Object(r.r)(n);Q(()=>Object(K.a)(c));break}case"updateChatJoin":{const n=Object(r.k)(e,a.id);if(!n)break;e=Object(o.J)(e,n,[a.id]),e=Object(o.I)(e,a.id,{isNotJoined:!1}),Object(s.g)(e);const c=Object(r.g)(e,a.id);c&&t.requestChatUpdate({chatId:c.id});break}case"updateChatLeave":{const t=Object(r.k)(e,a.id);if(!t)break;const{[t]:n}=e.chats.listIds;n&&(e=Object(o.s)(e,t,n.filter(e=>e!==a.id))),e=Object(o.I)(e,a.id,{isNotJoined:!0}),Object(s.g)(e);break}case"updateChatInbox":Object(s.g)(Object(o.I)(e,a.id,a.chat));break;case"updateChatTypingStatus":{const{id:t,typingStatus:n}=a;Object(s.g)(Object(o.I)(e,t,{typingStatus:n})),setTimeout(()=>{const e=Object(s.e)(),a=Object(r.g)(e,t);a&&n&&a.typingStatus&&a.typingStatus.timestamp===n.timestamp&&Object(s.g)(Object(o.I)(e,t,{typingStatus:void 0}))},6e3);break}case"newMessage":{const{message:n}=a,{chatId:c,threadId:i,type:l}=Object(r.z)(e)||{};if(n.senderId===e.currentUserId&&!n.isFromScheduled)return;const d=Object(r.g)(e,a.chatId);if(!d)return;const u="thread"===l&&i===b.MAIN_THREAD_ID&&a.chatId===c;u?setTimeout(()=>{t.requestChatUpdate({chatId:a.chatId})},1e3):Object(s.g)(Object(o.I)(e,a.chatId,{unreadCount:d.unreadCount?d.unreadCount+1:1,...a.message.hasUnreadMention&&{unreadMentionsCount:d.unreadMentionsCount?d.unreadMentionsCount+1:1}}));const m=Object(r.r)(Object(s.e)());Object(K.a)(m),Object(W.b)({chat:d,message:n,isActiveChat:u});break}case"updateCommonBoxMessages":case"updateChannelMessages":{const{ids:t,messageUpdate:n}=a;if(!1!==n.hasUnreadMention)return;t.forEach(t=>{const s="channelId"in a?a.channelId:Object(r.q)(e,t),n=Object(r.g)(e,s);n&&n.unreadMentionsCount&&(e=Object(o.I)(e,s,{unreadMentionsCount:n.unreadMentionsCount-1}))}),Object(s.g)(e);break}case"updateChatFullInfo":{const{fullInfo:t}=a,n=e.chats.byId[a.id];if(!n)return;Object(s.g)(Object(o.I)(e,a.id,{fullInfo:{...n.fullInfo,...t}}));break}case"updatePinnedChatIds":{const{ids:t,folderId:c}=a,o=c===n.i?"archived":"active";e={...e,chats:{...e.chats,orderedPinnedIds:{...e.chats.orderedPinnedIds,[o]:t.length?t:void 0}}},Object(s.g)(e);break}case"updateChatPinned":{const{id:t,isPinned:c}=a,o=Object(r.k)(e,t);if(o){const{[o]:a}=e.chats.orderedPinnedIds;let s=a||[];if(c){if(!s.includes(t)){if("active"===o&&s.length>=n.V){const t=e.chats.listIds.active;s=s.filter(e=>t&&t.includes(e))}s=[t,...s]}}else s=s.filter(e=>e!==t);e={...e,chats:{...e.chats,orderedPinnedIds:{...e.chats.orderedPinnedIds,[o]:s.length?s:void 0}}}}Object(s.g)(e);break}case"updateChatListType":{const{id:t,folderId:n}=a;Object(s.g)(Object(o.L)(e,t,n));break}case"updateChatFolder":{const{id:t,folder:n}=a,{byId:c,orderedIds:o}=e.chatFolders,r=n?{...c,[t]:n}:Object(h.l)(c,Object.keys(c).map(Number).filter(e=>e!==t)),i=n?o&&o.includes(t)?o:[...o||[],t]:o?o.filter(e=>e!==t):void 0;Object(s.g)({...e,chatFolders:{...e.chatFolders,byId:r,orderedIds:i}});break}case"updateChatFoldersOrder":{const{orderedIds:t}=a;Object(s.g)({...e,chatFolders:{...e.chatFolders,orderedIds:t}});break}case"updateRecommendedChatFolders":{const{folders:t}=a;Object(s.g)({...e,chatFolders:{...e.chatFolders,recommended:t}});break}case"updateChatMembers":{const t=e.chats.byId[a.id],{replacedMembers:n,addedMember:c,deletedMemberId:r}=a;if(!t)return;let i=!1,l=t.fullInfo&&t.fullInfo.members?[...t.fullInfo.members]:[];if(n)l=n,i=!0;else if(c)l.length&&l.some(e=>e.userId===c.userId)||(l.push(c),i=!0);else if(l.length&&r){const e=l.findIndex(e=>e.userId===r);e>-1&&(l.slice(e,1),i=!0)}if(i){const n=l.filter(({isOwner:e,isAdmin:t})=>e||t);Object(s.g)(Object(o.I)(e,a.id,{membersCount:l.length,fullInfo:{...t.fullInfo,members:l,adminMembers:n}}))}break}case"deleteProfilePhotos":{const{chatId:t,ids:n}=a,c=e.chats.byId[t];c&&c.photos&&Object(s.g)(Object(o.I)(e,t,{photos:c.photos.filter(e=>!n.includes(e.id))}));break}case"draftMessage":{const{chatId:t,formattedText:n,date:c,replyingToId:r}=a;e.chats.byId[t]&&(e=Object(o.y)(e,t,b.MAIN_THREAD_ID,"draft",n),e=Object(o.y)(e,t,b.MAIN_THREAD_ID,"replyingToId",r),e=Object(o.I)(e,t,{draftDate:c}),Object(s.g)(e));break}case"showInvite":{const{data:e}=a;t.showDialog({data:e});break}}});function J(e,t,a,s,n=!1){const c=n?Object(r.rb)(e,t,a):Object(r.l)(e,t,a);if(c&&s.content){const{photo:e,video:t,sticker:a,document:n}=Object(l.v)(c);e&&s.content.photo?(s.content.photo.blobUrl=e.blobUrl,s.content.photo.thumbnail=e.thumbnail):t&&s.content.video?s.content.video.blobUrl=t.blobUrl:a&&s.content.sticker?s.content.sticker.isPreloadedGlobally=a.isPreloadedGlobally:n&&s.content.document&&(s.content.document.previewBlobUrl=n.previewBlobUrl)}return n?Object(o.fb)(e,t,a,s):Object(o.M)(e,t,a,s)}function Y(e,t){const{id:a,chatId:s}=t,{threadInfo:n,firstMessageId:c}=Object(r.Eb)(e,s,t)||{},i=Object(r.g)(e,s),d=i&&i.unreadCount&&!Object(r.Z)(e,s,b.MAIN_THREAD_ID);if(n&&(!c&&Object(l.xb)(t)||(e=Object(o.W)(e,s,n.threadId,[a]),Object(r.Y)(e,s,n.threadId)&&(e=Object(o.h)(e,s,n.threadId,a),c||(e=Object(o.y)(e,s,n.threadId,"firstMessageId",t.id)))),e=Object(o.y)(e,s,n.threadId,"threadInfo",{...n,lastMessageId:t.id,messagesCount:n.messagesCount+1})),d)return e;if(e=Object(o.W)(e,s,b.MAIN_THREAD_ID,[a]),Object(r.Y)(e,s,b.MAIN_THREAD_ID)){const t=Object(r.H)(e,s,b.MAIN_THREAD_ID),n=Object(o.h)(e,s,b.MAIN_THREAD_ID,a),c=Object(r.Kb)(n,s,b.MAIN_THREAD_ID);t&&!c.includes(t)||(e=n)}return e}function X(e,t,a,s=!1){const{chats:n}=e,c=n.byId[t]&&n.byId[t].lastMessage;if(c&&!s){if(!(c.id===a.id||c.id===a.previousLocalId||a.id>c.id))return e}return Object(o.I)(e,t,{lastMessage:a})}function Z(e,t){const a=Object(r.n)(e,t),s=Object(r.Z)(e,t,b.MAIN_THREAD_ID);if(!a||!s)return;let n=s.length;for(;n--;){const e=a[s[n]];if(!e.isDeleting)return e}}function ee(e,t,a,n){if(e){t.forEach(t=>{const a=Z(n=Object(o.M)(n,e,t,{isDeleting:!0}),e);a&&(n=X(n,e,a,!0))}),Object(s.g)(n),a.requestChatUpdate({chatId:e});const c=[];return t.forEach(t=>{const a=Object(r.l)(n,e,t);if(!a)return;const{threadInfo:s}=Object(r.Eb)(n,e,a)||{};s&&c.push(s.threadId)}),void setTimeout(()=>{Object(s.g)(Object(o.k)(Object(s.e)(),e,t)),Object(h.o)(c).forEach(t=>{a.requestThreadInfoUpdate({chatId:e,threadId:t})})},350)}const c=[];t.forEach(e=>{const t=Object(r.q)(n,e);if(t){c.push(t);const a=Z(n=Object(o.M)(n,t,e,{isDeleting:!0}),t);a&&(n=X(n,t,a,!0)),setTimeout(()=>{Object(s.g)(Object(o.k)(Object(s.e)(),t,[e]))},350)}}),Object(s.g)(n),Object(h.o)(c).forEach(e=>{a.requestChatUpdate({chatId:e})})}Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"newMessage":{const{chatId:n,id:c,message:i}=a;e=Y(e=J(e,n,c,i),i),i.threadInfo&&(e=Object(o.lb)(e,i.threadInfo.chatId,i.threadInfo.threadId,i.threadInfo)),Object(s.g)(e);const d=Object(r.l)(e,n,c);if(Object(r.a)(e,n,i)){if(i.isOutgoing&&(!i.content||!i.content.action)){const a=Object(r.z)(e);a&&t.focusMessage({chatId:n,threadId:a.threadId,messageId:i.id,noHighlight:!0})}const{threadInfo:a}=Object(r.Eb)(e,n,i)||{};a&&t.requestThreadInfoUpdate({chatId:n,threadId:a.threadId}),Object(l.xb)(i)||setTimeout(()=>{Object(s.g)(X(Object(s.e)(),n,d))},350)}else Object(s.g)(X(Object(s.e)(),n,d));Object(r.M)(e,n)||t.loadTopChats();break}case"newScheduledMessage":{const{chatId:t,id:n,message:c}=a;e=J(e,t,n,c,!0);const i=Object(r.qb)(e,t)||[];e=Object(o.y)(e,t,b.MAIN_THREAD_ID,"scheduledIds",Object(h.o)([...i,n])),Object(s.g)(e);break}case"updateMessage":{const{chatId:t,id:n,message:c}=a;if(!Object(r.l)(e,t,n))return;e=J(e,t,n,c);const i=Object(r.l)(e,t,n);c.threadInfo&&(e=Object(o.lb)(e,c.threadInfo.chatId,c.threadInfo.threadId,c.threadInfo)),e=X(e,t,i),Object(s.g)(e);break}case"updateScheduledMessage":{const{chatId:t,id:n,message:c}=a;if(!Object(r.rb)(e,t,n))return;e=J(e,t,n,c,!0);const i=Object.keys(Object(r.sb)(e,t)||{}).map(Number).sort((e,t)=>t-e);e=Object(o.y)(e,t,b.MAIN_THREAD_ID,"scheduledIds",i),Object(s.g)(e);break}case"updateMessageSendSucceeded":{const{chatId:n,localId:c,message:i}=a;e=Y(e,i);const l=Object(r.l)(e,n,c);e=Object(o.k)(e,n,[c]),i.isScheduled&&(e=Object(o.l)(e,n,[c])),e=Object(o.M)(e,n,i.id,{...l,...i,previousLocalId:c});const d=Object(r.l)(e,n,i.id);e=X(e,n,d);const b=Object(r.Eb)(e,n,i);b&&b.threadInfo&&(t.markMessageListRead({maxId:i.id}),e=Object(o.y)(e,n,b.threadInfo.threadId,"threadInfo",{...b.threadInfo,lastMessageId:i.id,lastReadInboxMessageId:i.id})),Object(s.g)(e);break}case"updateScheduledMessageSendSucceeded":{const{chatId:t,localId:n,message:c}=a,i=Object(r.qb)(e,t)||[];e=Object(o.y)(e,t,b.MAIN_THREAD_ID,"scheduledIds",[...i,c.id]);const l=Object(r.rb)(e,t,n);e=Object(o.l)(e,t,[n]),e=Object(o.fb)(e,t,c.id,{...l,...c,previousLocalId:n}),Object(s.g)(e);break}case"updatePinnedIds":{const{chatId:t,isPinned:n,messageIds:c}=a,i=Object(r.kb)(e,t)||[],l=n?[...i,...c].sort((e,t)=>t-e):i.filter(e=>!c.includes(e));Object(s.g)(Object(o.y)(e,t,b.MAIN_THREAD_ID,"pinnedIds",l));break}case"updateThreadInfo":{const{chatId:t,threadId:n,threadInfo:c,firstMessageId:i}=a,l={...Object(r.Fb)(e,t,n),...c};if(!l.threadId)return;e=Object(o.lb)(e,t,n,l),i&&(e=Object(o.y)(e,t,n,"firstMessageId",i)),Object(s.g)(e);break}case"resetMessages":{const{id:n}=a,c=Object(r.n)(e,n);c&&!Object(l.ob)(n)&&(e=Object(o.k)(e,n,Object.keys(c).map(Number)),Object(s.g)(e),t.loadFullChat({chatId:n,force:!0}));break}case"deleteMessages":{const{ids:s,chatId:n}=a;ee(n,s,t,e);break}case"deleteScheduledMessages":{const{ids:t,chatId:n}=a;!function(e,t,a,n){if(!e)return;t.forEach(t=>{n=Object(o.fb)(n,e,t,{isDeleting:!0})}),Object(s.g)(n),setTimeout(()=>{n=Object(o.l)(Object(s.e)(),e,t);const a=Object(r.sb)(n,e);n=Object(o.y)(n,e,b.MAIN_THREAD_ID,"scheduledIds",Object.keys(a||{}).map(Number)),Object(s.g)(n)},350)}(n,t,0,e);break}case"deleteHistory":{const{chatId:s}=a,n=e.messages.byChatId[s];if(n){ee(s,Object.keys(n.byId).map(Number),t,e)}else t.requestChatUpdate({chatId:s});break}case"updateCommonBoxMessages":{const{ids:t,messageUpdate:n}=a;t.forEach(t=>{const a=Object(r.q)(e,t);a&&(e=Object(o.M)(e,a,t,n))}),Object(s.g)(e);break}case"updateChannelMessages":{const{channelId:t,ids:n,messageUpdate:c}=a;n.forEach(a=>{e=Object(o.M)(e,t,a,c)}),Object(s.g)(e);break}case"updateMessagePoll":{const{pollId:t,pollUpdate:n}=a,c=Object(r.m)(e,t);if(c&&c.content.poll){const t={...c.content.poll,...n},{results:a}=t.results||{};if(a&&!a.some(e=>e.isChosen)){const{results:e}=c.content.poll.results,s=e&&e.filter(e=>e.isChosen);s&&s.forEach(e=>{const s=a.findIndex(t=>t.option===e.option);s>=0&&(t.results.results[s].isChosen=!0)})}Object(s.g)(Object(o.M)(e,c.chatId,c.id,{content:{...c.content,poll:t}}))}break}case"updateMessagePollVote":{const{pollId:t,userId:n,options:c}=a,i=Object(r.m)(e,t);if(!i||!i.content.poll||!i.content.poll.results)break;const{poll:l}=i.content,{recentVoterIds:d,totalVoters:b,results:u}=l.results,m=d?[...d]:[],h=b?b+1:1,O=u?[...u]:[];m.push(n),c.forEach(t=>{const a=O.find(e=>e.option===t),s=O.findIndex(e=>e.option===t),c=a?{...a}:{option:t,votersCount:0};c.votersCount+=1,n===e.currentUserId&&(c.isChosen=!0),s?O[s]=c:O.push(c)}),Object(s.g)(Object(o.M)(e,i.chatId,i.id,{content:{...i.content,poll:{...l,results:{...l.results,recentVoterIds:m,totalVoters:h,results:O}}}}));break}}});const te=Object(p.h)((function(){let e=Object(s.e)();ae.forEach(([t,a])=>{e=Object(o.ob)(e,t,{status:a})}),Object(s.g)(e),ae=[]}),3e3,!0);let ae=[];Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"deleteUser":return Object(o.m)(e,a.id);case"updateUser":return Object(o.ob)(e,a.id,a.user);case"updateUserStatus":return s=a.userId,n=a.status,ae.push([s,n]),void te();case"updateUserFullInfo":{const{id:t,fullInfo:s}=a,n=e.users.byId[t];if(!n)return;return Object(o.ob)(e,t,{fullInfo:{...n.fullInfo,...s}})}}var s,n}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateStickerSet":return Object(o.ib)(e,a.id,a.stickerSet)}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updatePeerBlocked":return a.isBlocked?Object(o.a)(Object(s.e)(),a.id):Object(o.q)(Object(s.e)(),a.id);case"updateResetContactList":Object(s.g)({...Object(s.e)(),contactList:{hash:0,userIds:[]}});break;case"updateFavoriteStickers":t.loadFavoriteStickers();break;case"updatePrivacy":e.settings.privacy[a.key]=a.rules}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateNotifySettings":return Object(o.db)(e,a.peerType,a.isSilent,a.shouldShowPreviews);case"updateNotifyExceptions":{const{chatId:t,isMuted:n,isSilent:c,shouldShowPreviews:r}=a;e.chats.byId[t]&&(e=Object(o.I)(e,t,{isMuted:n})),Object(s.g)(Object(o.e)(e,t,{isMuted:n,isSilent:c,shouldShowPreviews:r}));break}}}),Object(s.b)("apiUpdate",(e,t,a)=>{switch(a["@type"]){case"updateTwoFaStateWaitCode":return{...e,twoFaSettings:{...e.twoFaSettings,isLoading:!1,waitingEmailCodeLength:a.length}};case"updateTwoFaError":return{...e,twoFaSettings:{...e.twoFaSettings,error:a.message}}}});var se=a(37),ne=a(9),ce=a(175),oe=a(40),re=a(126);function ie(e){Object(c.n)(()=>Object(p.c)(e),[e])}var le=a(52),de=a(49),be=a(113);var ue=a(25),me=a(16),he=a(45),Oe=a(39),je=a(63),ge=a(43),fe=a(21),pe=a(156),Ie=a(144);a(203);var ve=Object(c.h)(({id:e,name:t,value:a,label:s,checked:n=!1,disabled:o,inactive:r,noAnimation:i,onChange:l,onCheck:d})=>{const b=Object(c.m)(e=>{l&&l(e),d&&d(e.currentTarget.checked)},[l,d]),u=Object(ne.a)("Switcher",o&&"disabled",r&&"inactive",i&&"no-animation");return c.a.createElement("label",{className:u,title:s},c.a.createElement("input",{type:"checkbox",id:e,name:t,value:a,checked:n,disabled:o,onChange:b}),c.a.createElement("span",{className:"widget"}))});a(204);const ye=[0,1,2];var Ce=Object(c.h)(Object(s.h)(e=>{const{query:t,fetchingStatus:a,chatId:s,date:n}=e.globalSearch,{currentUserId:c}=e,{byId:o}=e.chats,{animationLevel:i}=e.settings.byKey;return{searchQuery:t,isLoading:!!a&&Boolean(a.chats||a.messages),currentUserId:c,chatsById:o,globalSearchChatId:s,searchDate:n,theme:Object(r.Db)(e),animationLevel:i}},(e,t)=>Object(h.l)(t,["openChat","openTipsChat","setGlobalSearchDate","setGlobalSearchChatId","setSettingOption"]))(({content:e,contactsFilter:t,onSearchQuery:a,onSelectSettings:s,onSelectContacts:o,onSelectArchived:r,setGlobalSearchChatId:i,onReset:d,searchQuery:b,isLoading:h,shouldSkipTransition:O,currentUserId:j,globalSearchChatId:g,searchDate:f,theme:p,animationLevel:I,chatsById:v,openChat:y,openTipsChat:C,setGlobalSearchDate:w,setSettingOption:E})=>{const M=Object(me.a)(),S=e===u.d.ChatList,k={date:void 0},N={id:void 0},T=Object(c.p)(()=>f?Object(x.a)(new Date(1e3*f)):void 0,[f]),A=Object(c.p)(()=>S&&v?Object.values(v).reduce((e,t)=>Object(l.kb)(t)&&t.unreadCount?e+1:e,0):0,[S,v]),P="web.telegram.org"===window.location.hostname,R=Object(c.p)(()=>({onTrigger:e,isOpen:t})=>c.a.createElement(fe.a,{round:!0,ripple:S&&!m.l,size:"smaller",color:"translucent",className:t?"active":"",onClick:S?e:()=>d(),ariaLabel:S?M("AccDescrOpenMenu2"):"Return to chat list"},c.a.createElement("div",{className:Object(ne.a)("animated-menu-icon",!S&&"state-back",O&&"no-animation")})),[S,M,d,O]),L=Object(c.m)(()=>{b||a("")},[b,a]),B=Object(c.m)(()=>{y({id:j,shouldReplaceHistory:!0})},[j,y]),D=Object(c.m)(e=>{e.stopPropagation();const t="light"===p?"dark":"light";E({theme:t}),E({shouldUseSystemTheme:!1}),Object(he.a)(t,I===n.e)},[I,E,p]),F=Object(c.m)(e=>{e.stopPropagation();const t=0===I?2:0;ye.forEach((e,a)=>{document.body.classList.toggle("animation-level-"+a,t===a)}),E({animationLevel:t})},[I,E]),U=Boolean(g)||e===u.d.GlobalSearch||e===u.d.Contacts,H=e===u.d.Contacts?M("SearchFriends"):M("Search");return c.a.createElement("div",{className:"LeftMainHeader"},c.a.createElement("div",{id:"LeftMainHeader",className:"left-header"},c.a.createElement(je.a,{trigger:R,footer:`${n.g} alpha ${n.h}`},c.a.createElement(ge.a,{icon:"saved-messages",onClick:B},M("SavedMessages")),c.a.createElement(ge.a,{icon:"archive",onClick:r},c.a.createElement("span",{className:"menu-item-name"},M("ArchivedChats")),A>0&&c.a.createElement("div",{className:"archived-badge"},A)),c.a.createElement(ge.a,{icon:"user",onClick:o},M("Contacts")),c.a.createElement(ge.a,{icon:"settings",onClick:s},M("Settings")),c.a.createElement(ge.a,{icon:"darkmode",onClick:D},c.a.createElement("span",{className:"menu-item-name"},M("lng_menu_night_mode")),c.a.createElement(ve,{id:"darkmode",label:M("dark"===p?"lng_settings_disable_night_theme":"lng_settings_enable_night_theme"),checked:"dark"===p,noAnimation:!0})),c.a.createElement(ge.a,{icon:"animations",onClick:F},c.a.createElement("span",{className:"menu-item-name capitalize"},M("Appearance.Animations").toLowerCase()),c.a.createElement(ve,{id:"animations",label:"Toggle Animations",checked:I>0})),c.a.createElement(ge.a,{icon:"help",onClick:()=>{C({langCode:M.code})}},M("TelegramFeatures")),c.a.createElement(ge.a,{icon:"bug",href:n.F},"Report Bug"),P&&c.a.createElement(c.a.Fragment,null,c.a.createElement(ge.a,{icon:"char-K",href:"https://web.telegram.org/k/",onClick:()=>{localStorage.setItem("kz_version",JSON.stringify("K")),Object(Oe.b)()}},"Switch to K Version"),c.a.createElement(ge.a,{icon:"char-W",href:"https://web.telegram.org/?legacy=1",onClick:Oe.b},"Switch to Old Version"))),c.a.createElement(pe.a,{inputId:"telegram-search-input",parentContainerClassName:"LeftSearch",className:g||f?"with-picker-item":"",value:t||b,focused:U,isLoading:h,placeholder:H,autoComplete:"off",canClose:Boolean(g||f),onChange:a,onReset:d,onFocus:L},T&&c.a.createElement(Ie.a,{icon:"calendar",title:T,canClose:!0,isMinimized:Boolean(g),className:"search-date",onClick:w,clickArg:k}),g&&c.a.createElement(Ie.a,{chatOrUserId:g,onClick:i,canClose:!0,clickArg:N}))))})),we=a(26);a(205);var Ee=Object(c.h)(()=>{const e=Object(me.a)();return c.a.createElement("div",{id:"ConnectionState",dir:e.isRtl?"rtl":void 0},c.a.createElement(we.a,{color:"black"}),c.a.createElement("div",{className:"state-text"},e("WaitingForNetwork")))}),Me=a(136),Se=(e,t,a)=>{const s=((e,t=!1)=>Object(c.p)(()=>Object(p.h)(e=>e(),e,!t),[e,t]))(t,!0),[n,o]=Object(c.r)(),[r,i,l]=Object(ue.a)();return Object(se.c)(i,l),Object(le.a)(()=>{r||s(()=>{o(e())})},a.concat([r])),n},ke=a(173),Ne=a(195);var Te=Object(c.h)(Object(s.h)(e=>{const{chats:{byId:t},users:{byId:a},chatFolders:{byId:s,orderedIds:n,activeChatFolder:c},currentUserId:o,lastSyncTime:i}=e;return{chatsById:t,usersById:a,chatFoldersById:s,orderedFolderIds:n,lastSyncTime:i,notifySettings:Object(r.fb)(e),notifyExceptions:Object(r.eb)(e),activeChatFolder:c,currentUserId:o}},(e,t)=>Object(h.l)(t,["loadChatFolders","setActiveChatFolder","openChat"]))(({chatsById:e,usersById:t,chatFoldersById:a,notifySettings:s,notifyExceptions:n,orderedFolderIds:o,activeChatFolder:r,currentUserId:i,lastSyncTime:d,loadChatFolders:b,setActiveChatFolder:u,openChat:O})=>{const j=Object(c.q)(null),g=Object(me.a)();Object(c.n)(()=>{d&&b()},[d,b]);const f=Object(c.p)(()=>o?o.map(e=>a[e]||{}).filter(Boolean):void 0,[a,o]),p=Se(()=>{if(!f||!f.length)return;const a=Object.keys(e).map(Number),c=f.map(c=>{const{unreadDialogsCount:o,hasActiveDialogs:r}=Object(l.o)(e,t,c,a,s,n)||{};return{id:c.id,badgeCount:o,isBadgeActive:r}});return Object(h.c)(c,"id")},3e3,[f,e,t,s,n]),I=Object(c.p)(()=>{if(f&&f.length)return[{title:"en"===g.code?"All":g("FilterAllChats")},...f.map(e=>({title:e.title,...p&&p[e.id]}))]},[f,p,g]),v=Object(c.m)(e=>{u(e)},[u]);Object(c.n)(()=>{I&&I.length&&r>=I.length&&u(0)},[r,I,u]),Object(c.n)(()=>{if(j.current&&m.n&&I&&I.length)return Object(Me.b)(j.current,{onSwipe:(e,t)=>{t===Me.a.Left?u(Math.min(r+1,I.length-1)):t===Me.a.Right&&u(Math.max(0,r-1))}})},[r,I,u]);const y=Object(c.q)();y.current=0!==r,Object(c.n)(()=>y.current?Object(de.a)(()=>{y.current&&u(0)}):void 0,[r,u]),Object(Oe.a)(0!==r,()=>u(0)),Object(c.n)(()=>{const e=e=>{if(e.ctrlKey&&e.shiftKey&&e.code.startsWith("Digit")&&I){const[,t]=e.code.match(/Digit(\d)/)||[];if(!t)return;if("0"===t)return void O({id:i,shouldReplaceHistory:!0});const a=Number(t)-1;if(a>I.length-1)return;u(a),e.preventDefault()}};return document.addEventListener("keydown",e,!0),()=>{document.removeEventListener("keydown",e,!0)}});const{shouldRender:C,transitionClassNames:w}=Object(oe.a)(!o,void 0,!0);function E(e){const t=Object.values(a).find(({title:e})=>e===I[r].title);return t&&0!==r?c.a.createElement(Ne.a,{folderType:"folder",folderId:t.id,noChatsText:g("FilterNoChatsToDisplay"),isActive:e}):c.a.createElement(Ne.a,{folderType:"all",isActive:e})}return c.a.createElement("div",{className:"ChatFolders"},I&&I.length?c.a.createElement(ke.a,{tabs:I,activeTab:r,onSwitchTab:v}):C?c.a.createElement("div",{className:Object(ne.a)("tabs-placeholder",w)}):void 0,c.a.createElement(be.a,{ref:j,name:g.isRtl?"slide-reversed":"slide",activeKey:r,renderCount:I?I.length:void 0},E))})),Ae=a(15),Pe=a(24),Re=a(20);var xe=Object(c.h)(e=>{const t=Object(Pe.a)(Ae.a.Extra,"LeftSearch");return t?c.a.createElement(t,e):c.a.createElement(Re.a,null)});var Le=Object(c.h)(e=>{const t=Object(Pe.a)(Ae.a.Extra,"ContactList");return t?c.a.createElement(t,e):c.a.createElement(Re.a,null)}),Be=a(55);a(216);let De;var Fe=Object(c.h)(({isShown:e,onNewPrivateChat:t,onNewChannel:a,onNewGroup:s})=>{const[n,o]=Object(c.r)(!1);Object(c.n)(()=>{e||o(!1)},[e]);const r=Object(me.a)(),i=Object(ne.a)("NewChatButton",e&&"revealed",n&&"menu-is-open"),l=Object(c.m)(()=>{De&&(clearTimeout(De),De=void 0)},[]),d=Object(c.m)(()=>{De&&(clearTimeout(De),De=void 0),De=window.setTimeout(()=>{o(!1)},750)},[]);return c.a.createElement("div",{className:i,onMouseEnter:l,onMouseLeave:d},c.a.createElement(fe.a,{round:!0,color:"primary",className:n?"active":"",onClick:()=>{o(!n)},ariaLabel:r(n?"Close":"NewMessageTitle"),tabIndex:-1},c.a.createElement("i",{className:"icon-new-chat-filled"}),c.a.createElement("i",{className:"icon-close"})),c.a.createElement(Be.a,{isOpen:n,positionX:"right",positionY:"bottom",autoClose:!0,onClose:()=>{o(!1)}},c.a.createElement(ge.a,{icon:"channel",onClick:a},r("NewChannel")),c.a.createElement(ge.a,{icon:"group",onClick:s},r("NewGroup")),c.a.createElement(ge.a,{icon:"user",onClick:t},r("NewMessageTitle"))))}),Ue=a(160);a(217);const He=Object.keys(u.d).length/2;let qe;var Ge=Object(s.h)(e=>Object(h.l)(e,["connectionState"]))(({content:e,searchQuery:t,searchDate:a,contactsFilter:s,shouldSkipTransition:n,onSearchQuery:o,onContentChange:r,onReset:i,connectionState:l})=>{const[d,b]=Object(c.r)(m.n),h=!function(){const[e,t]=Object(c.r)(window.navigator.onLine);return Object(c.n)(()=>{function e(){t(window.navigator.onLine)}return window.addEventListener("online",e),window.addEventListener("offline",e),()=>{window.removeEventListener("offline",e),window.removeEventListener("online",e)}},[]),e}()||"connectionStateConnecting"===l,O=Object(c.q)(!1),j=Object(c.m)(()=>{r(u.d.Settings)},[r]),g=Object(c.m)(()=>{r(u.d.Contacts)},[r]),f=Object(c.m)(()=>{r(u.d.NewChannelStep1)},[r]),p=Object(c.m)(()=>{r(u.d.NewGroupStep1)},[r]),I=Object(c.m)(()=>{r(u.d.Archived)},[r]),v=Object(c.m)(()=>{e===u.d.ChatList&&(O.current=!0,b(!0))},[e]),y=Object(c.m)(()=>{O.current=!1,qe&&(clearTimeout(qe),qe=void 0),qe=window.setTimeout(()=>{O.current||b(!1)},250)},[]);Object(c.n)(()=>{let t;return e!==u.d.ChatList?t=window.setTimeout(()=>{b(!1)},250):(O.current||m.n)&&b(!0),()=>{t&&(clearTimeout(t),t=void 0)}},[e]);const[C,w,E]=function(){const[e,t]=Object(ue.a)(!1);Object(c.n)(()=>{const e=window.setTimeout(t,2592e5);return()=>{clearTimeout(e)}},[t]);const{shouldRender:a,transitionClassNames:s}=Object(oe.a)(e);return[a,s,()=>{window.location.reload()}]}(),M=Object(me.a)();return c.a.createElement("div",{id:"LeftColumn-main",onMouseEnter:m.n?void 0:v,onMouseLeave:m.n?void 0:y},c.a.createElement(Ce,{content:e,contactsFilter:s,onSearchQuery:o,onSelectSettings:j,onSelectContacts:g,onSelectArchived:I,onReset:i,shouldSkipTransition:n}),c.a.createElement(Ue.a,{isOpen:h,isCustom:!0,className:"connection-state-wrapper opacity-transition slow"},()=>c.a.createElement(Ee,null)),c.a.createElement(be.a,{name:n?"none":"zoom-fade",renderCount:He,activeKey:e,shouldCleanup:!0,cleanupExceptionKey:u.d.ChatList,className:h?"pull-down":void 0},n=>{switch(e){case u.d.ChatList:return c.a.createElement(Te,null);case u.d.GlobalSearch:return c.a.createElement(xe,{searchQuery:t,searchDate:a,isActive:n,onReset:i});case u.d.Contacts:return c.a.createElement(Le,{filter:s,isActive:n,onReset:i});default:return}}),C&&c.a.createElement(fe.a,{fluid:!0,pill:!0,className:Object(ne.a)("btn-update",w),onClick:E},M("lng_update_telegram")),c.a.createElement(Fe,{isShown:d,onNewPrivateChat:g,onNewChannel:f,onNewGroup:p}))});var _e=Object(c.h)(e=>{const t=Object(Pe.a)(Ae.a.Extra,"Settings");return t?c.a.createElement(t,e):c.a.createElement(Re.a,null)});var ze=Object(c.h)(e=>{const t=Object(Pe.a)(Ae.a.Extra,"NewChat");return t?c.a.createElement(t,e):c.a.createElement(Re.a,null)});var $e,Ve=Object(c.h)(e=>{const t=Object(Pe.a)(Ae.a.Extra,"ArchivedChats");return t?c.a.createElement(t,e):c.a.createElement(Re.a,null)});a(218);!function(e){e[e.Main=0]="Main",e[e.Settings=1]="Settings",e[e.Archived=2]="Archived",e[e.NewGroup=3]="NewGroup",e[e.NewChannel=4]="NewChannel"}($e||($e={}));const We=Object.keys($e).length/2;var Ke=Object(c.h)(Object(s.h)(e=>{const{globalSearch:{query:t,date:a},chatFolders:{activeChatFolder:s},shouldSkipHistoryAnimations:n}=e;return{searchQuery:t,searchDate:a,activeChatFolder:s,shouldSkipHistoryAnimations:n}},(e,t)=>Object(h.l)(t,["setGlobalSearchQuery","setGlobalSearchChatId","resetChatCreation","setGlobalSearchDate","loadPasswordInfo","clearTwoFaError"]))(({searchQuery:e,searchDate:t,activeChatFolder:a,shouldSkipHistoryAnimations:s,setGlobalSearchQuery:n,setGlobalSearchChatId:o,resetChatCreation:r,setGlobalSearchDate:i,loadPasswordInfo:l,clearTwoFaError:d})=>{const[b,h]=Object(c.r)(u.d.ChatList),[O,j]=Object(c.r)(u.n.Main),[g,f]=Object(c.r)(""),[p,I]=Object(c.r)(0);let v=$e.Main;switch(b){case u.d.Archived:v=$e.Archived;break;case u.d.Settings:v=$e.Settings;break;case u.d.NewChannelStep1:case u.d.NewChannelStep2:v=$e.NewChannel;break;case u.d.NewGroupStep1:case u.d.NewGroupStep2:v=$e.NewGroup}const y=Object(c.m)(e=>{if(b!==u.d.NewGroupStep2||e)if(b!==u.d.NewChannelStep2||e){if(b===u.d.NewGroupStep1){const e=document.getElementById("new-group-picker-search");e&&e.blur()}if(b===u.d.Settings)switch(O){case u.n.EditProfile:case u.n.Folders:case u.n.General:case u.n.Notifications:case u.n.Privacy:case u.n.Language:return void j(u.n.Main);case u.n.GeneralChatBackground:return void j(u.n.General);case u.n.GeneralChatBackgroundColor:return void j(u.n.GeneralChatBackground);case u.n.PrivacyPhoneNumber:case u.n.PrivacyLastSeen:case u.n.PrivacyProfilePhoto:case u.n.PrivacyForwarding:case u.n.PrivacyGroupChats:case u.n.PrivacyActiveSessions:case u.n.PrivacyBlockedUsers:case u.n.TwoFaDisabled:case u.n.TwoFaEnabled:case u.n.TwoFaCongratulations:return void j(u.n.Privacy);case u.n.PrivacyPhoneNumberAllowedContacts:case u.n.PrivacyPhoneNumberDeniedContacts:return void j(u.n.PrivacyPhoneNumber);case u.n.PrivacyLastSeenAllowedContacts:case u.n.PrivacyLastSeenDeniedContacts:return void j(u.n.PrivacyLastSeen);case u.n.PrivacyProfilePhotoAllowedContacts:case u.n.PrivacyProfilePhotoDeniedContacts:return void j(u.n.PrivacyProfilePhoto);case u.n.PrivacyForwardingAllowedContacts:case u.n.PrivacyForwardingDeniedContacts:return void j(u.n.PrivacyForwarding);case u.n.PrivacyGroupChatsAllowedContacts:case u.n.PrivacyGroupChatsDeniedContacts:return void j(u.n.PrivacyGroupChats);case u.n.TwoFaNewPassword:return void j(u.n.TwoFaDisabled);case u.n.TwoFaNewPasswordConfirm:return void j(u.n.TwoFaNewPassword);case u.n.TwoFaNewPasswordHint:return void j(u.n.TwoFaNewPasswordConfirm);case u.n.TwoFaNewPasswordEmail:return void j(u.n.TwoFaNewPasswordHint);case u.n.TwoFaNewPasswordEmailCode:return void j(u.n.TwoFaNewPasswordEmail);case u.n.TwoFaChangePasswordCurrent:case u.n.TwoFaTurnOff:case u.n.TwoFaRecoveryEmailCurrentPassword:return void j(u.n.TwoFaEnabled);case u.n.TwoFaChangePasswordNew:return void j(u.n.TwoFaChangePasswordCurrent);case u.n.TwoFaChangePasswordConfirm:return void j(u.n.TwoFaChangePasswordNew);case u.n.TwoFaChangePasswordHint:return void j(u.n.TwoFaChangePasswordConfirm);case u.n.TwoFaRecoveryEmail:return void j(u.n.TwoFaRecoveryEmailCurrentPassword);case u.n.TwoFaRecoveryEmailCode:return void j(u.n.TwoFaRecoveryEmail);case u.n.FoldersCreateFolder:case u.n.FoldersEditFolder:return void j(u.n.Folders)}b!==u.d.ChatList||0!==a?(h(u.d.ChatList),f(""),n({query:""}),i({date:void 0}),o({id:void 0}),r(),setTimeout(()=>{I(Date.now())},250)):h(u.d.GlobalSearch)}else h(u.d.NewChannelStep1);else h(u.d.NewGroupStep1)},[b,a,O,n,i,o,r]),C=Object(c.m)(t=>{b!==u.d.Contacts?(h(u.d.GlobalSearch),t!==e&&n({query:t})):f(t)},[b,e,n]);Object(c.n)(()=>b!==u.d.ChatList||0===a?Object(de.a)(()=>y()):void 0,[a,b,y]),Object(c.n)(()=>{d(),O===u.n.Privacy&&l()},[d,l,O]);const w=e=>{h(u.d.Settings),j(e)};return c.a.createElement(be.a,{id:"LeftColumn",name:s?"none":m.p,renderCount:We,activeKey:v,shouldCleanup:!0,cleanupExceptionKey:$e.Main},a=>{switch(v){case $e.Archived:return c.a.createElement(Ve,{isActive:a,onReset:y,onContentChange:h});case $e.Settings:return c.a.createElement(_e,{isActive:a,currentScreen:O,onScreenSelect:w,onReset:y,shouldSkipTransition:s});case $e.NewChannel:return c.a.createElement(ze,{key:p,isActive:a,isChannel:!0,content:b,onContentChange:h,onReset:y});case $e.NewGroup:return c.a.createElement(ze,{key:p,isActive:a,content:b,onContentChange:h,onReset:y});default:return c.a.createElement(Ge,{content:b,searchQuery:e,searchDate:t,contactsFilter:g,onContentChange:h,onSearchQuery:C,onReset:y,shouldSkipTransition:s})}})})),Qe=a(142),Je=a(12),Ye=a(17),Xe=a(54);var Ze=()=>{const[e,t]=Object(c.r)(Xe.a.get());return Object(c.n)(()=>{const e=Object(p.h)(()=>{t(Xe.a.get())},250,!1);return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}},[]),e},et=a(180);function tt(e,t){const a=e<=n.ob?16:32,s=function(e){if(e>n.lb){const t=Math.min(Math.max(.25*e,288),424),a=Math.min(.25*e,424);return Math.min(e-t-a,728)}if(e>n.kb){const t=Math.min(Math.max(.4*e,288),424);return Math.min(e-t,728)}if(e>728)return 728;return e}(e),c=e<=n.ob?54:64,o=t?s-a-c:s-a,r=e>n.ob?Math.min(s-a,512):s-a,i=r/o,l=o/r;return{composerHiddenScale:i,toolbarHiddenScale:l,composerTranslateX:t?c/2*l:0,toolbarTranslateX:t?c/2*-1*i:0,unpinHiddenScale:r/258,toolbarForUnpinHiddenScale:258/r}}const at=e=>e.chatId.toString()+("thread"!==e.type?"_"+e.type:-1!==e.threadId?"_"+e.threadId:"");var st=a(132),nt=a(147),ct=a(138),ot=a(50),rt=a(111),it=a(128);var lt=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"HeaderMenuContainer",!t);return a?c.a.createElement(a,e):void 0});var dt=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const n=Object(r.g)(e,t),c=Boolean(n&&Object(l.mb)(n));if(n&&n.isRestricted)return{noMenu:!0};const o=Object(r.h)(e,t),i=Object(r.P)(e,t),d="thread"===s&&a===b.MAIN_THREAD_ID,u="thread"===s&&a!==b.MAIN_THREAD_ID,h=Object(r.W)(e),O=Boolean(o&&Object(r.X)(e,o.id)),j=!O&&Boolean(Object(r.L)(e,t)),g=Boolean(d&&n&&(c||Object(l.qb)(n))&&n.isNotJoined),f=d||u,p=d&&!i&&!g,I=!Object(r.S)(e),v=d&&!g;return{noMenu:!(m.l&&g||m.l&&f||p||I||v),isChannel:c,isRightColumnShown:h,canStartBot:j,canRestartBot:O,canSubscribe:g,canSearch:f,canMute:p,canSelect:I,canLeave:v}},(e,t)=>Object(h.l)(t,["joinChannel","sendBotCommand","openLocalTextSearch","restartBot"]))(({chatId:e,threadId:t,noMenu:a,isChannel:s,canStartBot:n,canRestartBot:o,canSubscribe:r,canSearch:i,canMute:l,canSelect:d,canLeave:b,isRightColumnShown:u,joinChannel:h,sendBotCommand:O,openLocalTextSearch:j,restartBot:g})=>{const f=Object(c.q)(null),[p,I]=Object(c.r)(!1),[v,y]=Object(c.r)(void 0),C=Object(c.m)(()=>{I(!0);const e=f.current.getBoundingClientRect();y({x:e.right,y:e.bottom})},[]),w=Object(c.m)(()=>{I(!1)},[]),E=Object(c.m)(()=>{y(void 0)},[]),M=Object(c.m)(()=>{h({chatId:e})},[h,e]),S=Object(c.m)(()=>{O({command:"/start"})},[O]),k=Object(c.m)(()=>{g({chatId:e})},[e,g]),N=Object(c.m)(()=>{if(j(),m.l){document.querySelector("#MobileSearch input").focus()}else setTimeout(()=>{const e=document.querySelector(".RightHeader .SearchInput input");e&&e.focus()},400)},[j]),T=Object(me.a)();return c.a.createElement("div",{className:"HeaderActions"},!m.l&&r&&c.a.createElement(fe.a,{size:"tiny",ripple:!0,fluid:!0,onClick:M},T(s?"Subscribe":"Join Group")),!m.l&&n&&c.a.createElement(fe.a,{size:"tiny",ripple:!0,fluid:!0,onClick:S},T("BotStart")),!m.l&&o&&c.a.createElement(fe.a,{size:"tiny",ripple:!0,fluid:!0,onClick:k},T("BotRestart")),!m.l&&i&&c.a.createElement(fe.a,{round:!0,ripple:u,color:"translucent",size:"smaller",onClick:N,ariaLabel:"Search in this chat"},c.a.createElement("i",{className:"icon-search"})),(m.l||!r)&&c.a.createElement(fe.a,{ref:f,className:p?"active":"",round:!0,ripple:!m.l,size:"smaller",color:"translucent",disabled:a,ariaLabel:"More actions",onClick:C},c.a.createElement("i",{className:"icon-more"})),v&&c.a.createElement(lt,{chatId:e,threadId:t,isOpen:p,anchor:v,isChannel:s,canStartBot:n,canRestartBot:o,canSubscribe:r,canSearch:i,canMute:l,canSelect:d,canLeave:b,onSubscribeChannel:M,onSearchClick:N,onClose:w,onCloseAnimationEnd:E}))})),bt=a(118),ut=a(22),mt=a(110),ht=a(46);function Ot(e){const t=e&&Object(l.F)(e),{sticker:a}=e&&e.content||{},s=t&&a&&!Object(m.t)()&&t.includes("image/webp"),[o,r]=Object(c.r)(ht.a),i=e&&e.id;return Object(c.o)(()=>{s&&Object(ht.c)("b64-"+i,t).then(r).catch(e=>{n.r&&console.error(e)})},[i,s,t]),s?o:t}var jt=a(120),gt=a(44);function ft(e,t,a,s,n){return`M${e},${t+n}a${n},${n},0,0,1,\n ${a},0v${s-2*n}a${n},${n},0,0,1,${-a},0Z`}var pt=Object(c.h)(({count:e,index:t})=>{const a=Object(c.q)(null),s=Object(c.p)(()=>function(e,t){const a=e-t-1,s=function(e){let t=8;1===e?t=36:2===e?t=17:3===e?t=11:(4===e||e>3)&&(t=7.5);return t}(e),n=function(e,t){let a=36;1===e?a=36:2===e?a=17:3===e?a=1===t?12:11:(4===e||e>3)&&(a=7.5);return a}(e,a),c=function(e,t){return e<=3?36:t*e+2*(e-1)}(e,s),o="clipPath"+e,r=function(e,t,a){let s="";if(3===a)s=ft(0,0,2,t,1)+ft(0,12,2,t+1,1)+ft(0,25,2,t,1);else for(let e=0;e\n \n `}(o,s,e),i=function(e,t,a){if(1===a)return 0;if(2===a)return 0===e?0:t+2;return 3===a?0===e?0:1===e?12:25:(t+2)*e}(a,s,e),l=function(e,t,a,s){if(t<=4)return 0;if(e<=1)return 0;if(e>=t-2)return s-36;return(a+4)/2+(e-2)*(a+2)}(a,e,s,c);return{markHeight:n,clipPath:r,markTranslateY:i,trackTranslateY:l,trackHeight:c,clipPathId:o}}(e,t),[e,t]);if(Object(c.n)(()=>{if(!a.current)return;const{trackHeight:e,trackTranslateY:t,markHeight:n,markTranslateY:c,clipPathId:o,clipPath:r}=s,i=a.current.firstElementChild;if(a&&a.current){const s=a.current,{style:l}=s;l.height=e+"px",l.transform=`translateY(-${t}px)`,l.clipPath=`url("#${o}")`;const d=s.querySelector("svg"),b=s.querySelector("div"),u=s.querySelector("defs");d||i&&(i.innerHTML=` ${r} `),u&&(u.innerHTML=r),b&&(b.style.height=n+"px",b.style.transform=`translateY(${c}px)`)}},[s]),1===e)return c.a.createElement("div",{className:"pinned-message-border"},c.a.createElement("div",{className:"pinned-message-border-wrapper-1",ref:a}));const{trackHeight:n,trackTranslateY:o,markHeight:r,markTranslateY:i,clipPathId:l}=s;return c.a.createElement("div",{className:Object(ne.a)("pinned-message-border",e>4&&"pinned-message-border-mask")},c.a.createElement("div",{className:"pinned-message-border-wrapper",ref:a,style:`clip-path: url("#${l}"); width: 2px;\n height: ${n}px; transform: translateY(-${o}px);`},c.a.createElement("span",null),c.a.createElement("div",{className:"pinned-message-border-mark",style:`height: ${r}px; transform: translateY(${i}px);`})))});var It=Object(c.h)(({message:e,count:t,index:a,customTitle:s,className:n,onUnpinMessage:o,onClick:r,onAllPinnedClick:i})=>{const d=Object(me.a)(),b=Ot(e),u=Object(mt.a)(Object(l.E)(e,"pictogram")),m=Object(l.O)(d,e,Boolean(b)),[h,O,j]=Object(ue.a)(),g=Object(c.m)(()=>{j(),o&&o(e.id)},[j,o,e.id]);return c.a.createElement("div",{className:Object(ne.a)("HeaderPinnedMessage-wrapper",n)},t>1&&c.a.createElement(fe.a,{round:!0,size:"smaller",color:"translucent",className:"pin-list-button",ariaLabel:d("EventLogFilterPinnedMessages"),onClick:i},c.a.createElement("i",{className:"icon-pin-list"})),o&&c.a.createElement(fe.a,{round:!0,size:"smaller",color:"translucent",ariaLabel:d("UnpinMessageAlertTitle"),className:"unpin-button",onClick:O},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(jt.a,{isOpen:h,onClose:j,text:"Would you like to unpin this message?",confirmLabel:"Unpin",confirmHandler:g}),c.a.createElement("div",{className:"HeaderPinnedMessage",onClick:r,dir:d.isRtl?"rtl":void 0},c.a.createElement(pt,{count:t,index:a}),b&&function(e,t){const{width:a,height:s}=Object(bt.m)();return c.a.createElement("img",{src:t||e,width:a,height:s,alt:""})}(b,u),c.a.createElement("div",{className:"message-text"},c.a.createElement("div",{className:"title",dir:"auto"},s||`${d("PinnedMessage")} ${a>0?"#"+(t-a):""}`),c.a.createElement("p",{dir:"auto"},Object(ut.a)(m))),c.a.createElement(gt.a,null)))}),vt=a(57),yt=a(181);a(221);var Ct=Object(s.h)((e,{message:t})=>({sender:Object(r.vb)(e,t)}),(e,t)=>Object(h.l)(t,["focusMessage","closeAudioPlayer"]))(({message:e,className:t,noUi:a,sender:s,focusMessage:n,closeAudioPlayer:o})=>{const r=Object(me.a)(),i=s?Object(l.X)(r,s):void 0,d=vt.c(Object(l.E)(e,"inline")),{playPause:b,isPlaying:u}=Object(yt.a)(Object(l.C)(e),Object(l.q)(e),d,void 0,void 0,!0),h=Object(c.m)(()=>{n({chatId:e.chatId,messageId:e.id})},[n,e.chatId,e.id]),O=Object(c.m)(()=>{u&&b(),o()},[o,u,b]);if(a)return;const j=Object(l.t)(e);return c.a.createElement("div",{className:Object(ne.a)("AudioPlayer",t),dir:r.isRtl?"rtl":void 0},c.a.createElement(fe.a,{round:!0,ripple:!m.l,color:"translucent",size:"smaller",className:Object(ne.a)("toggle-play",u?"pause":"play"),onClick:b,ariaLabel:u?"Pause audio":"Play audio"},c.a.createElement("i",{className:"icon-play"}),c.a.createElement("i",{className:"icon-pause"})),c.a.createElement("div",{className:"AudioPlayer-content",onClick:h},j?function(e){const{title:t,performer:a,fileName:s}=e;return c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"title",dir:"auto"},Object(ut.a)(t||s)),a&&c.a.createElement("div",{className:"subtitle",dir:"auto"},Object(ut.a)(a)))}(j):function(e,t){return c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"title",dir:"auto"},t&&Object(ut.a)(t)),c.a.createElement("div",{className:"subtitle",dir:"auto"},e))}(r("AttachAudio"),i),c.a.createElement(gt.a,null)),c.a.createElement(fe.a,{round:!0,className:"player-close",color:"translucent",size:"smaller",onClick:O,ariaLabel:"Close player"},c.a.createElement("i",{className:"icon-close"})))});a(222);var wt=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const{isLeftColumnShown:n,lastSyncTime:c,shouldSkipHistoryAnimations:o}=e,{byId:i}=e.chats,l=Object(r.g)(e,t),{typingStatus:d}=l||{},{chatId:u,messageId:m}=e.audioPlayer,h=u&&m?Object(r.l)(e,u,m):void 0;let O;if("pinned"===s){const a=Object(r.kb)(e,t);O=a&&a.length}else if("scheduled"===s){const a=Object(r.qb)(e,t);O=a&&a.length}else if("thread"===s&&a!==b.MAIN_THREAD_ID){const s=Object(r.Fb)(e,t,a);s&&(O=s.messagesCount)}const j={typingStatus:d,isLeftColumnShown:n,isRightColumnShown:Object(r.W)(e),isSelectModeActive:Object(r.S)(e),audioMessage:h,chat:l,chatsById:i,messagesCount:O,isChatWithSelf:Object(r.P)(e,t),isChatWithBot:l&&Object(r.O)(e,l),lastSyncTime:c,notifySettings:Object(r.fb)(e),notifyExceptions:Object(r.eb)(e),shouldSkipHistoryAnimations:o,currentTransitionKey:Math.max(0,e.messages.messageLists.length-1)},g=Object(r.n)(e,t);if("thread"!==s||!g)return j;if(Object.assign(j,{messagesById:g}),a!==b.MAIN_THREAD_ID){const s=Object(r.Hb)(e,t,a),n=s?Object(r.l)(e,t,s):void 0,c=n?Object(r.K)(e,n):void 0;return{...j,pinnedMessageIds:s,canUnpin:!1,topMessageSender:c}}const f=Object(r.kb)(e,t);if(f&&f.length){const t=g[f[0]],{canUnpin:s}=t&&Object(r.b)(e,t,a)||{};return{...j,pinnedMessageIds:f,canUnpin:s}}return j},(e,t)=>Object(h.l)(t,["openChatWithInfo","pinMessage","focusMessage","openChat","openPreviousChat","loadPinnedMessages","toggleLeftColumn","exitMessageSelectMode"]))(({chatId:e,threadId:t,messageListType:a,isReady:s,pinnedMessageIds:o,messagesById:r,canUnpin:i,topMessageSender:d,typingStatus:u,isSelectModeActive:h,isLeftColumnShown:O,isRightColumnShown:j,audioMessage:g,chat:f,chatsById:p,messagesCount:I,isChatWithSelf:v,isChatWithBot:y,lastSyncTime:C,notifySettings:w,notifyExceptions:E,shouldSkipHistoryAnimations:M,currentTransitionKey:S,openChatWithInfo:k,pinMessage:N,focusMessage:T,openChat:A,openPreviousChat:P,loadPinnedMessages:R,toggleLeftColumn:x,exitMessageSelectMode:L})=>{const B=Object(me.a)(),[D,F]=Object(c.r)(0),U=Array.isArray(o)?o[D]:o,H=r&&U?r[U]:void 0,q=Array.isArray(o)?o.length:o?1:0,G=f&&Object(l.k)(B,f).length,_=d?Object(l.X)(B,d):void 0;Object(c.n)(()=>{t===b.MAIN_THREAD_ID&&C&&s&&R({chatId:e})},[e,R,C,t,s]),Object(c.n)(()=>{F(0)},[o]),Object(nt.a)(e,U,H);const{width:z}=Ze(),$=z<=n.kb,V=m.m&&O,W=Object(c.q)(null),K=Object(c.q)(!0),Q=Object(c.m)(()=>{k({id:e})},[k,e]),J=Object(c.m)(t=>{N({chatId:e,messageId:t,isUnpin:!0})},[N,e]),Y=Object(c.m)(()=>{if(H){T({chatId:H.chatId,threadId:t,messageId:H.id});const e=Object(st.a)(q,D+1);F(e)}},[H,T,t,q,D]),X=Object(c.m)(()=>{A({id:e,threadId:b.MAIN_THREAD_ID,type:"pinned"})},[A,e]),Z=Object(c.m)(e=>{if(m.l){const e=document.getElementById(n.z);e&&e.blur()}t!==b.MAIN_THREAD_ID||"thread"!==a||0!==S?("scheduled"===a&&h&&L(),P()):m.l||V?(e.stopPropagation(),A({id:void 0})):x()},[t,a,S,h,P,V,A,x,L]),ee=Object(c.p)(()=>{if(!$||!p)return;let e=!1;const t=Object.values(p).reduce((t,a)=>{if(Object(l.kb)(a))return t;const s=a.unreadCount||0;return!s||Object(l.Hb)(a,w,E)&&!a.unreadMentionsCount||(e=!0),t+s},0);return t?{isActive:e,totalCount:t}:void 0},[$,p,w,E]),te=z>=n.kb&&zn.ob&&z30),ae=te||z>n.lb&&z0)&&je(V,ee),c.a.createElement("div",{className:"chat-info-wrapper",onClick:Q},Object(l.ob)(e)?c.a.createElement(rt.a,{userId:e,typingStatus:u,withFullInfo:y,withMediaViewer:!0,withUpdatingStatus:!0,noRtl:!0}):c.a.createElement(it.a,{chatId:e,typingStatus:u,noRtl:!0,withMediaViewer:!0,withFullInfo:!0,withUpdatingStatus:!0}))):"thread"===a?c.a.createElement(c.a.Fragment,null,je(),c.a.createElement("h3",null,B("CommentsCount",I))):"pinned"===a?c.a.createElement(c.a.Fragment,null,je(),c.a.createElement("h3",null,B("PinnedMessagesCount",I))):"scheduled"===a?c.a.createElement(c.a.Fragment,null,je(),c.a.createElement("h3",null,v?B("Reminders"):B("messages",I))):void 0}function je(e=!1,t){return c.a.createElement("div",{className:"back-button"},c.a.createElement(fe.a,{round:!0,size:"smaller",color:"translucent",onClick:Z,ariaLabel:e?"Close":"Back"},c.a.createElement("div",{className:Object(ne.a)("animated-close-icon",!e&&"state-back")})),t&&c.a.createElement("div",{className:"unread-count "+(t.isActive?"active":"")},Object(ot.b)(t.totalCount)))}return Object(c.n)(()=>{const e=W.current;if(e)return ae&&he?void(j||te?(K.current&&(e.classList.add("tools-stacked","animated"),K.current=!1),setTimeout(()=>{e.classList.remove("animated")},350)):(e.classList.remove("tools-stacked"),K.current=!0)):(e.classList.remove("tools-stacked","animated"),void(K.current=!0))},[ae,he,te,j]),c.a.createElement("div",{className:"MiddleHeader",ref:W},c.a.createElement(be.a,{name:M?"none":"slide-fade",activeKey:S},Oe),c.a.createElement("div",{className:"header-tools"},ie&&de&&!se&&c.a.createElement(It,{key:e,message:de,count:q,index:D,customTitle:ue,className:le,onUnpinMessage:i?J:void 0,onClick:Y,onAllPinnedClick:X}),se&&re&&c.a.createElement(Ct,{key:Object(l.C)(re),message:re,className:ce}),c.a.createElement(dt,{chatId:e,threadId:t,messageListType:a})))})),Et=a(162),Mt=a(58);function St(e){return"albumId"in e}function kt(e,t){let a,s=[],n={originalDate:e[0].date,datetime:Number(Object(x.j)(1e3*e[0].date)),senderGroups:[s]};const c=[n];return e.forEach((o,r)=>{o.isInAlbum?a?(a.messages.push(o),o.content.text&&(a.mainMessage=o)):a={albumId:o.groupedId,messages:[o],mainMessage:o}:s.push(o);const i=e[r+1];if(!a||i&&i.groupedId&&i.groupedId===a.albumId||(s.push(a),a=void 0),i){const e=Number(Object(x.j)(1e3*i.date));n.datetime!==e?(n={originalDate:i.date,datetime:e,senderGroups:[]},c.push(n),s=[],n.senderGroups.push(s)):(i.id===t||o.senderId!==i.senderId||o.isOutgoing!==i.isOutgoing||Object(l.gb)(o)||Object(l.gb)(i)||o.forwardInfo&&i.forwardInfo&&(o.forwardInfo.senderUserId!==i.forwardInfo.senderUserId||o.forwardInfo.fromChatId!==i.forwardInfo.fromChatId||o.forwardInfo.hiddenUserName!==i.forwardInfo.hiddenUserName)||o.inlineButtons||i.inlineButtons||i.date-o.date>600)&&(s=[],n.senderGroups.push(s))}}),c}function Nt(e){!m.l&&document.activeElement&&document.activeElement.id===n.z&&e.target===e.currentTarget&&e.preventDefault()}function Tt(){const[e,t]=Object(ue.a)(!1),a=(s=1e3,n=!1,Object(c.p)(()=>Object(p.a)(e=>e(),s,n,o),[s,n,o]));var s,n,o;return{isScrolled:e,updateStickyDates:Object(c.m)((e,s)=>{t(),document.body.classList.contains("is-scrolling-messages")||Object(p.b)(()=>{document.body.classList.add("is-scrolling-messages")}),a(()=>{Object(p.b)(()=>{const t=document.querySelector(".stuck");t&&t.classList.remove("stuck");const a=function(e,t){const a=e.querySelectorAll(".sticky-date"),s=e.scrollTop;return Array.from(a).find(e=>{const{offsetTop:a,offsetHeight:n}=e,c=a-s;return-n<=c&&c<=(t?60:10)})}(e,s);a&&a.classList.add("stuck"),document.body.classList.remove("is-scrolling-messages")})})},[t,a])}}var At=a(157),Pt=a(129),Rt=a(109);const xt=m.b?1e3:350,Lt=m.l?300:500;var Bt=a(148),Dt=a(149);function Ft(e){return"number"==typeof e}function Ut(e,t){return e?t?238:175:t?238:100}function Ht(e,t){const a=Object(l.yb)(e),s=Object(l.tb)(e),n=Object(l.H)(e)||Object(l.S)(e),c=Object(l.Q)(e),o=Boolean(Object(l.S)(e)),{width:r,height:i}=n?Object(bt.g)(n,a,s,o,t):Object(bt.i)(c,a,s,t),d=Ut(Boolean(Object(l.P)(e)));let b=1;re+t,t)}function Wt(e,t,a){return ea?a:e}function Kt(e){const t={width:0,height:0};return e.forEach(({dimensions:e,sides:a})=>{a&_t&&(t.width=e.width+e.x),a&zt&&(t.height=e.height+e.y)}),t}function Qt(e,t,a,s){const n=s.messages.map(e=>{const t=Ht(e);return t.width/t.height});const c=function(e){return e.map(e=>e>1.2?"w":e<.8?"n":"q").join("")}(n),o=function(e){return e.reduce((e,t)=>t+e,1)/e.length}(n),r=n.length,i=n.some(e=>e>2),l=Object(bt.j)(e,t,!1,a)-(t?2.5:0)*bt.d;let d;const b={ratios:n,proportions:c,averageRatio:o,maxWidth:l,minWidth:100,maxHeight:l,spacing:2};return d=r>=5||i?function({ratios:e,averageRatio:t,maxWidth:a,minWidth:s,spacing:n,maxHeight:c=4*a/3}){const o=function(e,t){return e.map(e=>t>1.1?Wt(e,1,2.75):Wt(e,.6667,1))}(e,t),r=e.length,i=new Array(r),l=[],d=e=>{const t=[];let s=0;e.forEach(e=>{t.push(((e,t)=>{const s=Vt(o.slice(e,e+t),0);return(a-(t-1)*n)/s})(s,e)),s+=e}),l.push({lineCounts:e,heights:t})};for(let e=1;e!==r;++e){const t=r-e;e<=3&&t<=3&&d([e,t])}for(let e=1;e!==r-1;++e)for(let a=1;a!==r-e;++a){const s=r-e-a;e<=3&&a<=(t<.85?4:3)&&s<=3&&d([e,a,s])}for(let e=1;e!==r-1;++e)for(let t=1;t!==r-e;++t)for(let a=1;a!==r-e-t;++a){const s=r-e-t-a;e<=3&&t<=3&&a<=3&&s<=4&&d([e,t,a,s])}let b,u=0;for(let e=0;e{for(let e=1;e!==o;++e)if(a[e-1]>a[e])return 1.5;return 1})(),m=Math.abs(r-c)*i*d;(!b||m1.4&&t[1]-t[0]<.2?function(e){const{ratios:t,maxWidth:a,spacing:s,maxHeight:n}=e,c=Math.round(Math.min(a/t[0],Math.min(a/t[1],(n-s)/2)));return[{dimensions:{x:0,y:0,width:a,height:c},sides:$t|Gt|_t},{dimensions:{x:0,y:c+s,width:a,height:c},sides:$t|zt|_t}]}(e):"ww"===a||"qq"===a?function(e){const{ratios:t,maxWidth:a,spacing:s,maxHeight:n}=e,c=(a-s)/2,o=Math.round(Math.min(c/t[0],Math.min(c/t[1],n)));return[{dimensions:{x:0,y:0,width:c,height:o},sides:Gt|$t|zt},{dimensions:{x:c+s,y:0,width:c,height:o},sides:Gt|_t|zt}]}(e):function(e){const{ratios:t,minWidth:a,maxWidth:s,spacing:n,maxHeight:c}=e,o=Math.round(1.5*a),r=Math.min(Math.round(Math.max(.4*(s-n),(s-n)/t[0]/(1/t[0]+1/t[1]))),s-n-o),i=s-r-n,l=Math.min(c,Math.round(Math.min(i/t[0],r/t[1])));return[{dimensions:{x:0,y:0,width:i,height:l},sides:Gt|$t|zt},{dimensions:{x:i+n,y:0,width:r,height:l},sides:Gt|_t|zt}]}(e)}(b):3===r?function(e){const{proportions:t}=e;return"n"===t[0]?function(e){const{maxHeight:t,spacing:a,ratios:s,maxWidth:n,minWidth:c}=e,o=t,r=Math.round(Math.min((t-a)/2,s[1]*(n-a)/(s[2]+s[1]))),i=o-r-a,l=Math.max(c,Math.round(Math.min((n-a)/2,Math.min(r*s[2],i*s[1])))),d=Math.min(Math.round(o*s[0]),n-a-l);return[{dimensions:{x:0,y:0,width:d,height:o},sides:Gt|$t|zt},{dimensions:{x:d+a,y:0,width:l,height:i},sides:Gt|_t},{dimensions:{x:d+a,y:i+a,width:l,height:r},sides:zt|_t}]}(e):function(e){const{maxWidth:t,ratios:a,maxHeight:s,spacing:n}=e,c=t,o=Math.round(Math.min(c/a[0],.66*(s-n))),r=(t-n)/2,i=Math.min(s-o-n,Math.round(Math.min(r/a[1],r/a[2])));return[{dimensions:{x:0,y:0,width:c,height:o},sides:$t|Gt|_t},{dimensions:{x:0,y:o+n,width:r,height:i},sides:zt|$t},{dimensions:{x:r+n,y:o+n,width:c-r-n,height:i},sides:zt|_t}]}(e)}(b):function(e){const{proportions:t}=e;return"w"===t[0]?function({maxWidth:e,ratios:t,spacing:a,maxHeight:s,minWidth:n}){const c=e,o=Math.round(Math.min(c/t[0],.66*(s-a))),r=Math.round((e-2*a)/(t[1]+t[2]+t[3])),i=Math.max(n,Math.round(Math.min(.4*(e-2*a),r*t[1]))),l=Math.round(Math.max(Math.max(n,.33*(e-2*a)),r*t[3])),d=c-i-l-2*a,b=Math.min(s-o-a,r);return[{dimensions:{x:0,y:0,width:c,height:o},sides:$t|Gt|_t},{dimensions:{x:0,y:o+a,width:i,height:b},sides:zt|$t},{dimensions:{x:i+a,y:o+a,width:d,height:b},sides:zt},{dimensions:{x:i+a+d+a,y:o+a,width:l,height:b},sides:_t|zt}]}(e):function({maxHeight:e,ratios:t,maxWidth:a,spacing:s,minWidth:n}){const c=e,o=Math.round(Math.min(c*t[0],.6*(a-s))),r=Math.round((e-2*s)/(1/t[1]+1/t[2]+1/t[3])),i=Math.round(r/t[1]),l=Math.round(r/t[2]),d=c-i-l-2*s,b=Math.max(n,Math.min(a-o-s,r));return[{dimensions:{x:0,y:0,width:o,height:c},sides:Gt|$t|zt},{dimensions:{x:o+s,y:0,width:b,height:i},sides:Gt|_t},{dimensions:{x:o+s,y:i+s,width:b,height:l},sides:_t},{dimensions:{x:o+s,y:i+l+2*s,width:b,height:d},sides:zt|_t}]}(e)}(b),{layout:d,containerStyle:Kt(d)}}let Jt;function Yt(e){return Jt||(Jt=document.createElement("span"),Jt.style.font=m.e?'400 12px system-ui, -apple-system, BlinkMacSystemFont, "Roboto", "Apple Color Emoji", "Helvetica Neue", sans-serif':'400 12px "Roboto", -apple-system, "Apple Color Emoji", BlinkMacSystemFont, "Helvetica Neue", sans-serif',Jt.style.whiteSpace="nowrap",Jt.style.position="absolute",Jt.style.left="-999px",Jt.style.opacity=".01",document.body.appendChild(Jt)),Jt.innerHTML=e,Jt.offsetWidth}function Xt(e,t,a,s,n){Object(c.o)(()=>{if(a&&e.current){const t=e.current.closest(".MessageList");Object(Pt.a)(t,e.current,n?"end":"centerOrTop",20,void 0!==s?1e3:void 0,s)}},[e,t,a,s,n])}var Zt=a(114),ea=a(68);var ta=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"ContextMenuContainer",!t);return a?c.a.createElement(a,e):void 0});var aa=Object(c.h)(Object(s.h)((e,{message:t})=>{const{byId:a}=e.users,s=t.senderId,{targetUserIds:n,targetChatId:c}=t.content.action||{},o=t.replyToMessageId,i=o?Object(r.l)(e,t.chatId,o):void 0,d=Object(r.U)(e,t),{direction:b,noHighlight:u}=d&&e.focusedMessage||{},m=Object(r.g)(e,t.chatId);return{usersById:a,sender:m&&(Object(l.mb)(m)||s===t.chatId)?m:s?Object(r.Jb)(e,s):void 0,targetChatId:c,targetUserIds:n,targetMessage:i,isFocused:d,...d&&{focusDirection:b,noFocusHighlight:u}}})(({message:e,observeIntersection:t,isEmbedded:a,appearanceOrder:s=0,isLastInList:n,usersById:o,sender:r,targetUserIds:i,targetMessage:l,targetChatId:d,isFocused:b,focusDirection:u,noFocusHighlight:m})=>{const h=Object(c.q)(null);Object(Rt.c)(h,t),Object(nt.a)(e.chatId,e.replyToMessageId,l),Xt(h,e.chatId,b,u,m);const O=Object(me.a)(),j=s<=0,[g,f]=Object(ue.a)(j);Object(c.n)(()=>{j||setTimeout(f,10*s)},[s,f,j]);const{transitionClassNames:p}=Object(oe.a)(g,void 0,j,!1),I=Object(c.p)(()=>i?i.map(e=>o&&o[e]).filter(Boolean):void 0,[i,o]),v=Object(ea.a)(O,e,r,I,l,d,a?{isEmbedded:!0,asPlain:!0}:void 0),{isContextMenuOpen:y,contextMenuPosition:C,handleBeforeContextMenu:w,handleContextMenu:E,handleContextMenuClose:M,handleContextMenuHide:S}=Object(Bt.a)(h),k=void 0!==C;if(a)return c.a.createElement("span",{className:"embedded-action-message"},Object(ut.a)(v));const N=Object(ne.a)("ActionMessage message-list-item",b&&!m&&"focused",k&&"has-menu-open",n&&"last-in-list",p);return c.a.createElement("div",{ref:h,id:"message"+e.id,className:N,"data-message-id":e.id,onMouseDown:e=>{Nt(e),w(e)},onContextMenu:E},c.a.createElement("span",null,v),C&&c.a.createElement(ta,{isOpen:y,anchor:C,message:e,messageListType:"thread",onClose:M,onCloseAnimationEnd:S}))}));a(223);var sa=({className:e,message:t,sender:a,title:s,customText:n,observeIntersection:o,onClick:r})=>{const i=Object(c.q)(null),d=Object(Rt.b)(i,o),b=Object(mt.a)(t&&Object(l.E)(t,"pictogram"),!d),u=t&&"sticker-reply-thumb"+t.id,m=Ot(t),h=Boolean(t&&Object(l.J)(t)),O=Object(me.a)(),j=a&&Object(l.X)(O,a);return c.a.createElement("div",{ref:i,className:Object(ne.a)("EmbeddedMessage",e),onClick:t?r:void 0},m&&function(e,t,a,s){const{width:n,height:o}=Object(bt.m)();return c.a.createElement("img",{id:e,src:a||t,width:n,height:o,alt:"",className:s?"round":""})}(u,m,b,h),c.a.createElement("div",{className:"message-text"},c.a.createElement("p",{dir:"auto"},t?Object(l.gb)(t)?c.a.createElement(aa,{message:t,isEmbedded:!0}):Object(ut.a)(Object(l.O)(O,t,Boolean(m))):n||" "),c.a.createElement("div",{className:"message-title",dir:"auto"},Object(ut.a)(j||s||" "))))},na=a(163),ca=a(172),oa=a(178);a(227);var ra=Object(c.h)(({message:e,outgoingStatus:t,signature:a,onClick:s})=>{const n=Object(me.a)();return c.a.createElement("span",{className:"MessageMeta",dir:n.isRtl?"rtl":"ltr",onClick:s},Boolean(e.views)&&c.a.createElement(c.a.Fragment,null,c.a.createElement("span",{className:"message-views"},Object(ot.b)(e.views)),c.a.createElement("i",{className:"icon-channelviews"})),a&&c.a.createElement("span",{className:"message-signature"},Object(ut.a)(a)),c.a.createElement("span",{className:"message-time"},e.isEdited&&n("EditedMessage")+" ",Object(x.h)(1e3*e.date)),t&&c.a.createElement(oa.a,{status:t}))}),ia=a(117),la=a(119),da=a(164);a(228);var ba=({message:e,observeIntersection:t,observeIntersectionForPlaying:a,shouldLoop:s,lastSyncTime:o})=>{const r=Object(c.q)(null),[i,d,b]=Object(ue.a)(),u=e.content.sticker,{isAnimated:m,stickerSetId:h}=u,O=h===n.db,j=Object(Rt.b)(r,t),g=Object(Rt.b)(r,a),f=u.isPreloadedGlobally?"sticker"+u.id:Object(l.E)(e,"inline"),p=Ot(e),I=Object(mt.a)(f,!j,Object(l.D)(e,"inline",!0),o),v=Boolean(I),[y,C]=Object(ue.a)(v),w=m?y:v,{shouldRenderFullMedia:E,transitionClassNames:M}=Object(ia.a)(w,"slow"),{width:S,height:k}=Object(bt.n)(u),N=Object(ne.a)("thumbnail",!p&&"empty"),T=Object(ne.a)("Sticker media-inner",O&&"inactive");return c.a.createElement("div",{ref:r,className:T,onClick:O?void 0:d},!w&&c.a.createElement("img",{id:"sticker-thumb-"+e.id,src:p,width:S,height:k,alt:"",className:N}),!m&&E&&c.a.createElement("img",{id:"sticker-"+e.id,src:I,width:S,height:k,alt:"",className:Object(ne.a)("full-media",M)}),m&&v&&c.a.createElement(la.a,{key:f,className:Object(ne.a)("full-media",M),id:f,animationData:I,size:S,play:g,noLoop:!s,onLoad:C}),c.a.createElement(da.a,{isOpen:i,fromSticker:u,onClose:b}))},ua=a(133),ma=a(123),ha=a(165);function Oa(e,t){return Object(ha.a)(Object(l.F)(e),Boolean(t),m.l&&!m.c)}var ja=a(29);const ga=Promise.resolve("rgba(255,255,255,1)");function fa(e,t,a,s){return s?ga:async function(e,t){const a=new Image;a.src=e,a.width||await new Promise(e=>{a.onload=e});const s=document.createElement("canvas"),n=s.getContext("2d");s.width=a.width,s.height=a.height,n.drawImage(a,0,0,a.width,a.height);const c=t?a.width-1:0,o=a.height-1;return`rgba(${Array.from(n.getImageData(c,o,1,1).data).join(",")})`}(e,t)}var pa=a(124);var Ia=({id:e,message:t,observeIntersection:a,noAvatars:s,shouldAutoLoad:n,isInSelectMode:o,isSelected:r,uploadProgress:i,size:d="inline",dimensions:b,nonInteractive:u,shouldAffectAppendix:m,onClick:h,onCancelUpload:O})=>{const j=Object(c.q)(null),g=(Object(l.H)(t)||Object(l.S)(t)).blobUrl,f=Object(Rt.b)(j,a),[p,I]=Object(c.r)(n),v=p&&f,{mediaData:y,downloadProgress:C}=Object(ma.a)(Object(l.E)(t,d),!v),w=g||y,E=Oa(t,w),{isUploading:M,isTransferring:S,transferProgress:k}=Object(l.r)(t,i||C,v&&!w),N=!1===Object(ja.a)(p),{shouldRender:T,transitionClassNames:A}=Object(oe.a)(S,void 0,N,"slow"),{shouldRenderThumb:P,shouldRenderFullMedia:R,transitionClassNames:x}=Object(ia.a)(w,"slow"),L=Object(c.m)(()=>{M?O&&O(t):w?h&&h(t.id):I(e=>!e)},[w,M,t,O,h]),B=Object(l.yb)(t);Object(c.o)(()=>{if(!m)return;const e=j.current.closest(".message-content");w?fa(w,B,0,r).then(t=>{e.style.setProperty("--appendix-bg",t),e.setAttribute("data-has-custom-appendix","")}):e.classList.add("has-appendix-thumb")},[w,B,m,o,r]);const{width:D,height:F,isSmall:U}=b||Ht(t,s),H=Object(ne.a)("media-inner",!M&&!u&&"interactive",U&&"small-image",D===F&&"square-image"),q=b?`width: ${D}px; height: ${F}px; left: ${b.x}px; top: ${b.y}px;`:"";return c.a.createElement("div",{id:e,ref:j,className:H,style:q,onClick:M?void 0:L},P&&c.a.createElement("canvas",{ref:E,className:"thumbnail",style:`width: ${D}px; height: ${F}px`}),R&&c.a.createElement("img",{src:w,className:"full-media "+x,width:D,height:F,alt:""}),T&&c.a.createElement("div",{className:"media-loading "+A},c.a.createElement(pa.a,{progress:k,onClick:M?L:void 0})),!w&&!p&&c.a.createElement("i",{className:"icon-download"}),S&&c.a.createElement("span",{className:"message-upload-progress"},Math.round(100*k),"%"))},va=a(140),ya=a(139);function Ca(e,t){const a=Object(c.q)();a.current=t;const s=Object(c.m)(()=>{e.current&&e.current.pause()},[e]),n=Object(c.m)(()=>{e.current&&a.current&&Object(ya.a)(e.current)},[e]);Object(se.c)(s,n)}var wa=a(150),Ea=(e,t=!1)=>{const a=Object(c.q)(!1),s=Object(c.q)(!1),n=Object(c.m)(()=>{s.current=!0,t&&e.current&&(a.current||(a.current=!e.current.paused),e.current.pause())},[t,e]),o=Object(c.m)(()=>{t&&e.current&&a.current&&document.body.contains(e.current)&&Object(ya.a)(e.current),a.current=!1,s.current=!1},[t,e]),r=Object(c.m)(()=>{Object(p.b)(o)},[o]);document.hasFocus()||n(),Object(re.a)(n,r)};function Ma(){return(Ma=Object.assign||function(e){for(var t=1;t{const m=Object(c.q)(null),h=Object(c.q)(null),O=Object(l.Q)(t)||Object(l.T)(t),j=O.blobUrl,g=Object(Rt.b)(m,a),[f,p]=Object(c.r)(n),I=Boolean(f&&g&&i),[v,y]=Object(c.r)(o),C=Object(mt.a)(Object(l.E)(t,"pictogram"),!(g&&i),Object(l.D)(t,"pictogram"),i),{mediaData:w,downloadProgress:E}=Object(ma.a)(Object(l.E)(t,"inline"),!I,Object(l.D)(t,"inline"),i),M=j||w,S=Boolean(g&&M),k=Oa(t,C),{isBuffered:N,bufferingHandlers:T}=Object(va.a)(!n),{isUploading:A,isTransferring:P,transferProgress:R}=Object(l.r)(t,r||E,I&&!N),L=!1===Object(ja.a)(f),{shouldRender:B,transitionClassNames:D}=Object(oe.a)(P,void 0,L),{transitionClassNames:F}=Object(ia.a)(M,"slow"),[U,H]=Object(c.r)(0),q=Object(c.m)(e=>{H(Math.max(0,e.currentTarget.currentTime-1))},[]),G=h.current&&h.current.duration||O.duration||0,_=Object(l.yb)(t),z=Object(l.tb)(t),{width:$,height:V}=d||Object(bt.i)(O,_,z,s);Ca(h,Boolean(S&&o)),Ea(h,v),Object(wa.a)(h,[S]);const W=Object(c.m)(()=>{A?u&&u(t):M?M&&!v?(y(!0),h.current.play()):b&&b(t.id):p(e=>!e)},[A,M,v,b,u,t]),K=Object(ne.a)("media-inner dark",!A&&"interactive"),Q=Object(ne.a)("full-media",F),J=d?`width: ${$}px; height: ${V}px; left: ${d.x}px; top: ${d.y}px;`:"";return c.a.createElement("div",{ref:m,id:e,className:K,style:J,onClick:A?void 0:W},!C&&c.a.createElement("canvas",{ref:k,className:"thumbnail",style:`width: ${$}px; height: ${V}px;`}),C&&c.a.createElement("img",{src:C,className:"thumbnail",style:`width: ${$}px; height: ${V}px;`,alt:""}),S&&c.a.createElement("video",Ma({ref:h,className:Q,width:$,height:V,autoPlay:v,muted:!0,loop:!0,playsInline:!0},T,{onTimeUpdate:q}),c.a.createElement("source",{src:M})),f&&!v&&!B&&c.a.createElement("i",{className:"icon-large-play"}),B&&c.a.createElement("div",{className:"media-loading "+D},c.a.createElement(pa.a,{progress:R,onClick:A?W:void 0})),!f&&c.a.createElement("i",{className:"icon-download"}),P?c.a.createElement("span",{className:"message-upload-progress"},"..."):c.a.createElement("div",{className:"message-media-duration"},O.isGif?"GIF":Object(x.e)(Math.max(G-U,0))))},ka=a(23);a(230);var Na=Object(s.h)((e,{contact:t})=>({user:Object(r.Jb)(e,t.userId)}),(e,t)=>Object(h.l)(t,["openUserInfo"]))(({contact:e,user:t,openUserInfo:a})=>{const{firstName:s,lastName:n,phoneNumber:o,userId:r}=e,i=Object(c.m)(()=>{a({id:r})},[a,r]);return c.a.createElement("div",{className:Object(ne.a)("Contact",Boolean(r)&&"interactive"),onClick:r?i:void 0},c.a.createElement(Zt.a,{size:"large",user:t,text:s||n}),c.a.createElement("div",{className:"contact-info"},c.a.createElement("div",{className:"contact-name"},s," ",n),c.a.createElement("div",{className:"contact-phone"},Object(ka.c)(o))))}),Ta=a(48);var Aa=Object(c.h)(({id:e,options:t,selected:a=[],disabled:s,round:n,loadingOptions:o,onChange:r})=>{const[i,l]=Object(c.r)([]),d=Object(c.m)(e=>{const{value:t,checked:a}=e.currentTarget;let s;s=a?[...i,t]:i.filter(e=>e!==t),l(s),r(s)},[r,i]);return c.a.createElement("div",{id:e,className:"radio-group"},t.map(e=>c.a.createElement(Ta.a,{label:e.label,subLabel:e.subLabel,value:e.value,checked:-1!==a.indexOf(e.value),disabled:s,round:n,isLoading:o?-1!==o.indexOf(e.value):void 0,onChange:d})))}),Pa=a(125),Ra=a(186);a(233);function xa(e,t){return t>0?(e/t*100).toFixed():0}var La=({answer:e,voteResults:t,totalVoters:a,maxVotersCount:s,correctResults:n,shouldAnimate:o})=>{const r=t&&t.find(t=>t.option===e.option),i=0===n.length||-1!==n.indexOf(e.option),l=n.length>0&&i||r&&r.isChosen,d=r?xa(r.votersCount,a||0):0,[b,u]=Object(c.r)(o?0:d),m=Object(c.q)(null),h=r?xa(r.votersCount,s||0):0,O=b{o&&u(d)},[o,d]),Object(c.n)(()=>{const e=m.current;if(e&&o){const t=e.firstElementChild,a=O?"":"stroke-dasharray: 100% 200%; stroke-dashoffset: -44";t?t.setAttribute("style",a):e.innerHTML=`\n \n \n `}},[O,o]),!t||!r)return;const j=`width: ${h}%; transform:scaleX(${O?0:1})`;return c.a.createElement("div",{className:"PollOption",dir:"ltr"},c.a.createElement("div",{className:"poll-option-share "+("100"===d?"limit-width":"")},d,"%",l&&c.a.createElement("span",{className:Object(ne.a)("poll-option-chosen",!i&&"wrong",o&&"animate")},c.a.createElement("i",{className:i?"icon-check":"icon-close"}))),c.a.createElement("div",{className:"poll-option-right"},c.a.createElement("div",{className:"poll-option-text",dir:"auto"},Object(ut.a)(e.text)),c.a.createElement("div",{className:Object(ne.a)("poll-option-answer",l&&!i&&"wrong")},c.a.createElement("div",{className:"poll-option-corner",ref:m}),c.a.createElement("div",{className:"poll-option-line",style:j}))))};a(234);var Ba=Object(c.h)(Object(s.h)((e,{poll:t})=>{const{recentVoterIds:a}=t.results,{serverTimeOffset:s,users:{byId:n}}=e;return a&&0!==a.length?{recentVoterIds:a,usersById:n,serverTimeOffset:s}:{}},(e,t)=>Object(h.l)(t,["loadMessage","openPollResults"]))(({message:e,poll:t,recentVoterIds:a,usersById:s,loadMessage:n,onSendVote:o,openPollResults:r,serverTimeOffset:i})=>{const{id:l,chatId:d}=e,{summary:b,results:u}=t,[m,h]=Object(c.r)(!1),[O,j]=Object(c.r)([]),[g,f]=Object(c.r)(!1),[p,I]=Object(c.r)(!1),[v,y]=Object(c.r)(!b.closed&&b.closeDate&&b.closeDate>0?Math.min(b.closeDate-Math.floor(Date.now()/1e3)+i,b.closePeriod):0),C=Object(c.q)(null),{results:w,totalVoters:E}=u,M=w&&w.some(e=>e.isChosen),S=!b.closed&&!M,k=!S&&b.isPublic&&Number(u.totalVoters)>0,N=S&&b.multipleChoice,T=w?Math.max(...w.map(e=>e.votersCount)):E,A=w?w.reduce((e,t)=>(t.isCorrect&&e.push(t.option),e),[]):[],P=b.answers.map(e=>({label:e.text,value:e.option,hidden:Boolean(b.quiz&&b.closePeriod&&v<=0)}));Object(c.n)(()=>{m&&t.results.results&&t.results.results.some(e=>e.isChosen)&&h(!1)},[m,t.results.results]),Object(c.n)(()=>{v>0&&setTimeout(()=>y(v-1),1e3);const e=C.current;if(e){const t=12*Math.PI,a=e.lastElementChild,s=e.firstElementChild;if(v<=5&&e.classList.add("hurry-up"),a&&s){const e=(b.closePeriod-v)/b.closePeriod*t;s.textContent=Object(x.e)(v),a.firstElementChild.setAttribute("stroke-dashoffset","-"+e)}else e.innerHTML=`\n ${Object(x.e)(v)}\n \n \n `}},[v,b.closePeriod]),Object(c.n)(()=>{b.quiz&&(v<=0||M&&!b.closed)&&n({chatId:d,messageId:l})},[d,v,M,n,l,b.closed,b.quiz]),Object(c.n)(()=>{let e;return b.quiz&&!b.closed&&b.closePeriod&&b.closePeriod>0&&(e=window.setTimeout(()=>{n({chatId:d,messageId:l})},1e3*b.closePeriod)),()=>{e&&window.clearTimeout(e)}},[S,d,n,l,b.closePeriod,b.closed,b.quiz]);const R=Object(c.p)(()=>a?a.reduce((e,t)=>{const a=s[t];return a&&e.push(a),e},[]):[],[s,a]),L=Object(c.m)(e=>{j([e]),h(!0),I(!0),o([e])},[o]),B=Object(c.m)(e=>{j(e)},[]),D=Object(c.m)(()=>{h(!0),I(!0),o(O)},[o,O]),F=Object(c.m)(()=>{r({chatId:d,messageId:l})},[d,l,r]),U=Object(c.m)(()=>{f(!0)},[]),H=Object(c.m)(()=>{f(!1),I(!1)},[]);Object(c.n)(()=>{if(p&&M&&b.quiz&&u.results&&t.results.solution){u.results.find(e=>e.isChosen&&e.isCorrect)||f(!0)}},[M,p,u.results,b.quiz,t.results.solution]);const q=Object(me.a)();return c.a.createElement("div",{className:"Poll",dir:q.isRtl?"auto":"ltr"},g&&t.results.solution&&c.a.createElement(Ra.a,{message:Object(Dt.b)(t.results.solution,t.results.solutionEntities),duration:5e3,onDismiss:H,containerId:"#middle-column-portals"}),c.a.createElement("div",{className:"poll-question"},Object(ut.a)(b.question)),c.a.createElement("div",{className:"poll-type"},q(function(e){if(void 0===e.isPublic)return" ";if(e.quiz)return e.isPublic?"QuizPoll":"AnonymousQuizPoll";if(e.closed)return"FinalResults";return e.isPublic?"PublicPoll":"AnonymousPoll"}(b)),R.length>0&&c.a.createElement("div",{className:"poll-recent-voters"},R.map(e=>c.a.createElement(Zt.a,{size:"micro",user:e}))),v>0&&S&&c.a.createElement("div",{ref:C,className:"poll-countdown"}),b.quiz&&t.results.solution&&!S&&c.a.createElement(fe.a,{round:!0,size:"tiny",color:"translucent",className:"poll-quiz-help",disabled:g,onClick:U,ariaLabel:"Show Solution"},c.a.createElement("i",{className:"icon-lamp"}))),S&&c.a.createElement("div",{className:"poll-answers"},N?c.a.createElement(Aa,{options:P,onChange:B,disabled:e.isScheduled||m,loadingOptions:m?O:void 0,round:!0}):c.a.createElement(Pa.a,{name:"poll-"+l,options:P,onChange:L,disabled:e.isScheduled||m,loadingOption:m?O[0]:void 0})),!S&&c.a.createElement("div",{className:"poll-results"},b.answers.map((function(e){return c.a.createElement(La,{key:e.option,shouldAnimate:p,answer:e,voteResults:w,totalVoters:E,maxVotersCount:T,correctResults:A})}))),!k&&!N&&c.a.createElement("div",{className:"poll-voters-count"},function(e,t,a){if(!a)return e(t?"Chat.Quiz.TotalVotesEmpty":"Chat.Poll.TotalVotesResultEmpty");return e(t?"Answer":"Vote",a,"i")}(q,b.quiz,u.totalVoters)),N&&c.a.createElement(fe.a,{isText:!0,disabled:0===O.length,size:"tiny",onClick:D},q("PollSubmitVotes")),k&&c.a.createElement(fe.a,{isText:!0,size:"tiny",onClick:F},q("PollViewResults")))})),Da=a(41),Fa=a(59);a(235);var Ua=Object(c.h)(({message:e,observeIntersection:t,noAvatars:a,shouldAutoLoad:s,shouldAutoPlay:n,inPreview:o,lastSyncTime:r,onMediaClick:i,onCancelMediaTransfer:d})=>{const b=Object(l.R)(e);let u=!1;if(b&&b.photo&&!b.video){const{width:t,height:a}=Ht(e);u=t===a}const m=Object(c.m)(()=>{i()},[i]);if(!b)return;const{siteName:h,url:O,displayUrl:j,title:g,description:f,photo:p,video:I}=b,v=(p||I)&&i&&!u,y=Object(Da.a)(f,170),C=Object(ne.a)("WebPage",u&&"with-square-photo",!p&&!I&&!o&&"without-media",I&&"with-video");return c.a.createElement("div",{className:C,"data-initial":(h||j)[0],dir:"auto"},p&&!I&&c.a.createElement(Ia,{message:e,observeIntersection:t,noAvatars:a,shouldAutoLoad:s,size:u?"pictogram":"inline",nonInteractive:!v,onClick:v?m:void 0,onCancelUpload:d}),c.a.createElement("div",{className:"WebPage-text"},c.a.createElement(Fa.a,{className:"site-name",url:O,text:h||j}),!o&&g&&c.a.createElement("p",{className:"site-title"},Object(ut.a)(g)),y&&c.a.createElement("p",{className:"site-description"},Object(ut.a)(y,["emoji","br"]))),!o&&I&&c.a.createElement(Sa,{message:e,observeIntersection:t,noAvatars:a,shouldAutoLoad:s,shouldAutoPlay:n,lastSyncTime:r,onClick:v?m:void 0,onCancelUpload:d}))});a(236);var Ha=Object(c.h)(({message:e})=>{const t=Object(l.B)(e),{title:a,text:s,description:n,photoUrl:o}=t;return c.a.createElement("div",{className:"Invoice"},a&&c.a.createElement("p",{className:"title"},Object(ut.a)(a)),s&&c.a.createElement("p",null,Object(ut.a)(s,["emoji","br"])),c.a.createElement("div",{className:"description "+(o?"has-image":"")},o&&c.a.createElement("img",{className:"invoice-image",src:o,alt:""}),n&&c.a.createElement("p",{className:"description-text"},Object(ut.a)(n,["emoji","br"]))))});function qa(e){return Object(c.h)(Object(s.h)((e,t)=>{const{message:a}=t;return{isInSelectMode:Object(r.S)(e),isSelected:Object(r.V)(e,a.id)}},(e,t)=>Object(h.l)(t,["toggleMessageSelection"]))(t=>{const{isInSelectMode:a,isSelected:s,message:n,toggleMessageSelection:o,dimensions:r}=t,i=Object(c.m)(e=>{e.stopPropagation(),o({messageId:n.id,withShift:e&&e.shiftKey})},[o,n]),l=Object(c.p)(()=>({...t,isInSelectMode:a,isSelected:s,dimensions:{...t.dimensions,x:0,y:0},onClick:a?void 0:t.onClick}),[t,a,s]);return c.a.createElement("div",{className:Object(ne.a)("album-item-select-wrapper",s&&"is-selected"),style:r?`left: ${r.x}px; top: ${r.y}px;`:"",onClick:a?i:void 0},a&&c.a.createElement("div",{className:"message-select-control"},s&&c.a.createElement("i",{className:"icon-select"})),c.a.createElement(e,l))}))}a(237);const Ga=qa(Ia),_a=qa(Sa);var za=Object(s.h)(e=>({uploadsById:e.fileUploads.byMessageLocalId}),(e,t)=>Object(h.l)(t,["cancelSendingMessage"]))(({album:e,observeIntersection:t,shouldAutoLoad:a,shouldAutoPlay:s,hasCustomAppendix:n,lastSyncTime:o,isOwn:r,albumLayout:i,onMediaClick:d,uploadsById:b,cancelSendingMessage:u})=>{const m=e.messages.length,h=Object(c.m)(e=>{u({chatId:e.chatId,messageId:e.id})},[u]);const{width:O,height:j}=i.containerStyle;return c.a.createElement("div",{className:"Album",style:`width: ${O}px; height: ${j}px;`},e.messages.map((function(e,u){const{photo:O,video:j}=Object(l.v)(e),g=b[e.previousLocalId||e.id],f=g?g.progress:void 0,{dimensions:p,sides:I}=i.layout[u];if(O){const s=n&&(r?u===m-1:Boolean(I&$t&&I&zt));return c.a.createElement(Ga,{id:"album-media-"+e.id,message:e,observeIntersection:t,shouldAutoLoad:a,shouldAffectAppendix:s,uploadProgress:f,dimensions:p,onClick:d,onCancelUpload:h})}if(j)return c.a.createElement(_a,{id:"album-media-"+e.id,message:e,observeIntersection:t,shouldAutoLoad:a,shouldAutoPlay:s,uploadProgress:f,lastSyncTime:o,dimensions:p,onClick:d,onCancelUpload:h})})))});a(238);function $a(){return($a=Object.assign||function(e){for(var t=1;t{const o=Object(c.q)(null),r=Object(c.q)(null),i=Object(c.q)(null),d=e.content.video,b=Object(Rt.b)(o,t),[u,m]=Object(c.r)(a&&s),h=Boolean(u&&b&&n),{mediaData:O,downloadProgress:j}=Object(ma.a)(Object(l.E)(e,"inline"),!h,Object(l.D)(e,"inline"),n),g=Oa(e,O),{isBuffered:f,bufferingHandlers:I}=Object(va.a)(),v=u&&!f,y=!1===Object(ja.a)(u),{shouldRender:C,transitionClassNames:w}=Object(oe.a)(v||!f,void 0,y),{shouldRenderThumb:E,transitionClassNames:M}=Object(ia.a)(O,"slow"),[S,k]=Object(c.r)(!1),[N,T]=Object(c.r)(0);Object(c.n)(()=>{if(!S)return;const e=188*Math.PI,t=e-N*e,a=i.current,s=r.current,n=s.firstElementChild;n?n.firstElementChild.setAttribute("stroke-dashoffset",t.toString()):s.innerHTML=`\n \n `,T(a.currentTime/a.duration)},[S,N]);const A=Boolean(O&&b),P=()=>{k(!1),T(0),Object(ya.a)(i.current),Object(p.b)(()=>{r.current.innerHTML=""})},R=(L=P,()=>{Va&&Va(),Va=L});var L;Object(c.n)(()=>{i.current&&(A?Object(ya.a)(i.current):i.current.pause())},[A]),Ca(i,A),Ea(i,Boolean(O)),Object(wa.a)(i,[O]);const B=Object(c.m)(()=>{if(!O)return void m(e=>!e);const e=i.current;S?e.paused?Object(ya.a)(e):e.pause():(R(),e.pause(),e.currentTime=0,Object(ya.a)(e),k(!0))},[R,S,O]),D=Object(c.m)(e=>{const t=e.currentTarget;T(t.currentTime/t.duration)},[]),F=Object(ne.a)("full-media",M);return c.a.createElement("div",{ref:o,className:"RoundVideo media-inner",onClick:B},(E||O)&&c.a.createElement("div",{className:"thumbnail-wrapper"},c.a.createElement("canvas",{ref:g,className:"thumbnail",style:`width: ${bt.e}px; height: ${bt.e}px`})),O&&c.a.createElement("div",{className:"video-wrapper"},c.a.createElement("video",$a({ref:i,className:F,width:bt.e,height:bt.e,autoPlay:!0,muted:!S,loop:!S,playsInline:!0,onEnded:S?P:void 0},I,{onTimeUpdate:S?D:void 0}),c.a.createElement("source",{src:O}))),c.a.createElement("div",{className:"progress",ref:r}),C&&c.a.createElement("div",{className:"media-loading "+w},c.a.createElement(pa.a,{progress:j})),!O&&!u&&c.a.createElement("i",{className:"icon-large-play"}),c.a.createElement("div",{className:"message-media-duration"},S?Object(x.e)(i.current.currentTime):Object(x.e)(d.duration),(!S||i.current.paused)&&c.a.createElement("i",{className:"icon-muted-chat"})))};a(239);var Ka=({message:e,onClick:t})=>c.a.createElement("div",{className:"InlineButtons"},e.inlineButtons.map(e=>c.a.createElement("div",{className:"row"},e.map(e=>c.a.createElement(fe.a,{size:"tiny",ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>t({button:e})},Object(ut.a)(e.text),"url"===e.type&&!e.value.match(n.ub)&&c.a.createElement("i",{className:"icon-arrow-right"}))))));a(240);var Qa=Object(c.h)(Object(s.h)((e,{message:t})=>{const{threadId:a,chatId:s}=t.threadInfo,n=Object(r.Fb)(e,s,a)||t.threadInfo,c=Object(r.Gb)(e,s,a),{byId:o}=e.users,{byId:i}=e.chats;return{threadInfo:n,usersById:o,chatsById:i,shouldRequestThreadUpdate:!!c&&!n.topMessageId}},(e,t)=>Object(h.l)(t,["openChat","requestThreadInfoUpdate"]))(({disabled:e,threadInfo:t,usersById:a,chatsById:s,shouldRequestThreadUpdate:n,openChat:o,requestThreadInfoUpdate:r})=>{const i=Object(me.a)(),{threadId:d,chatId:b,messagesCount:u,lastMessageId:m,lastReadInboxMessageId:h,recentReplierIds:O}=t,j=Object(c.m)(()=>{o({id:b,threadId:d})},[o,b,d]);if(Object(c.n)(()=>{n&&r({chatId:b,threadId:d})},[b,r,n,d]),void 0===u)return;const g=O&&O.map(e=>Object(l.ob)(e)?a[e]:s[e]).filter(Boolean);const f=Boolean(h&&m&&h0&&c.a.createElement("div",{className:"recent-repliers",dir:i.isRtl?"rtl":"ltr"},g.map(e=>c.a.createElement(Zt.a,{key:e.id,size:"small",user:Object(l.ob)(e.id)?e:void 0,chat:Object(l.ob)(e.id)?void 0:e}))),c.a.createElement("div",{className:"label",dir:"auto"},u?i("Comments",u,"i"):i("LeaveAComment")),c.a.createElement("i",{className:"icon-next"}))}));a(241);function Ja(e){const t=Xa(e.currentTarget);t&&t.setAttribute("data-is-document-group-hover","")}function Ya(e){const t=Xa(e.currentTarget);t&&t.removeAttribute("data-is-document-group-hover")}function Xa(e){let t=e;do{t=t.nextElementSibling}while(t&&!t.classList.contains("last-in-document-group"));return t}var Za=Object(c.h)(Object(s.h)((e,t)=>{const{focusedMessage:a,forwardMessages:s,lastSyncTime:n}=e,{message:c,album:o,withSenderName:i,withAvatar:d,threadId:b,messageListType:u}=t,{id:m,chatId:h,viaBotId:O,replyToMessageId:j,isOutgoing:g}=c,f=Object(r.g)(e,h),p=Object(r.P)(e,h),I=f&&Object(l.mb)(f),v=f&&f.username,y=!p&&Object(l.hb)(c),C=i||d||y?Object(r.vb)(e,c):void 0,w=Object(r.K)(e,c),E=O?Object(r.Jb)(e,O):void 0,M=b?Object(r.Hb)(e,h,b):void 0,S=c.id===M,k=j===M,N=j&&!k?Object(r.l)(e,h,j):void 0,T=N&&Object(r.vb)(e,N),A=Object(r.Ib)(e,c),P="thread"===u&&(o?o.messages.some(t=>Object(r.U)(e,t)):Object(r.U)(e,c)),{direction:R,noHighlight:x}=P&&a||{},L=s.messageIds&&s.messageIds.includes(m),{query:B}=Object(r.B)(e)||{},D=Object(l.M)(c);let F;return F=o&&o.messages?o.messages.every(({id:t})=>Object(r.V)(e,t)):Object(r.V)(e,m),{theme:Object(r.Db)(e),chatUsername:v,forceSenderName:y,sender:C,originSender:w,botSender:E,shouldHideReply:k,isThreadTop:S,replyMessage:N,replyMessageSender:T,isFocused:P,isForwarding:L,isChatWithSelf:p,isChannel:I,lastSyncTime:n,highlight:B,isSingleEmoji:Boolean(D),animatedEmoji:D?Object(r.c)(e,D):void 0,isInSelectMode:Object(r.S)(e),isSelected:F,isGroupSelected:!!c.groupedId&&!c.isInAlbum&&Object(r.Q)(e,h,c.groupedId),threadId:b,isPinnedList:"pinned"===u,shouldAutoLoadMedia:f?Object(r.wb)(e,c,f,C):void 0,shouldAutoPlayMedia:Object(r.xb)(e,c),shouldLoopStickers:Object(r.yb)(e),...g&&{outgoingStatus:Object(r.gb)(e,c,"scheduled"===u)},..."number"==typeof A&&{uploadProgress:A},...P&&{focusDirection:R,noFocusHighlight:x}}},(e,t)=>Object(h.l)(t,["focusMessage","openMediaViewer","openAudioPlayer","cancelSendingMessage","openUserInfo","openChat","markMessagesRead","sendPollVote","toggleMessageSelection","setReplyingToId","openForwardMenu","clickInlineButton","disableContextMenuHint","showNotification"]))(({message:e,chatUsername:t,observeIntersectionForBottom:a,observeIntersectionForMedia:s,observeIntersectionForAnimatedStickers:n,album:o,noAvatars:r,withAvatar:i,withSenderName:d,noComments:h,appearanceOrder:O,isFirstInGroup:j,isLastInGroup:g,isFirstInDocumentGroup:f,isLastInDocumentGroup:p,isLastInList:I,theme:v,forceSenderName:y,sender:C,originSender:w,botSender:E,isThreadTop:M,shouldHideReply:S,replyMessage:k,replyMessageSender:N,outgoingStatus:T,uploadProgress:A,isFocused:P,focusDirection:R,noFocusHighlight:x,isForwarding:L,isChatWithSelf:B,isChannel:D,lastSyncTime:F,highlight:U,animatedEmoji:H,isInSelectMode:q,isSelected:G,isGroupSelected:_,threadId:z,messageListType:$,isPinnedList:V,shouldAutoLoadMedia:W,shouldAutoPlayMedia:K,shouldLoopStickers:Q,focusMessage:J,openMediaViewer:Y,openAudioPlayer:X,openUserInfo:Z,openChat:ee,cancelSendingMessage:te,markMessagesRead:ae,sendPollVote:se,toggleMessageSelection:ce,setReplyingToId:re,openForwardMenu:ie,clickInlineButton:le,disableContextMenuHint:de,showNotification:be})=>{const he=Object(c.q)(null),Oe=Object(c.q)(null),je=Object(c.q)(null),ge=Object(me.a)();Object(Rt.c)(Oe,a);const{isContextMenuOpen:pe,contextMenuPosition:Ie,handleBeforeContextMenu:ve,handleContextMenu:ye,handleContextMenuClose:Ce,handleContextMenuHide:we}=Object(Bt.a)(he,m.n&&q,!0,m.b);Object(c.n)(()=>{pe&&de()},[pe,de]);const Ee=O<=0,[Me,Se]=Object(ue.a)(Ee);Object(c.n)(()=>{Ee||setTimeout(Se,10*O)},[O,Se,Ee]);const{transitionClassNames:ke}=Object(oe.a)(Me,void 0,Ee,!1),{chatId:Ne,id:Te,threadInfo:Ae}=e,Pe=Object(l.xb)(e),Re=Object(l.yb)(e),xe="scheduled"===$||e.isScheduled,Le=Object(l.zb)(e)&&!S,Be=Boolean(Ae)&&"thread"===$,{forwardInfo:De,viaBotId:Fe}=e,Ue=De&&!B&&!De.isLinkedChannelPost,He=!!e.groupedId&&!e.isInAlbum,qe=Boolean(o)&&o.messages.length>1,{text:Ge,photo:_e,video:ze,audio:$e,voice:Ve,document:We,sticker:Ke,contact:Qe,poll:Je,webPage:Ye,invoice:Ze}=Object(l.v)(e),et=Object(l.x)(e),tt=Object(Dt.a)(e,U,Ft(et)),at=void 0!==Ie,st=D&&e.adminTitle||De&&!Ue&&De.adminTitle||void 0,ct=Object(c.p)(()=>st?Yt(st):void 0,[st]),ot=!(at||q||L)&&(!He||p),rt=ot&&D&&!xe,it=Boolean(ot&&(De&&(De.isChannelPost||B&&!Re)&&De.fromMessageId||V)),lt=!De||!B&&C?C:w,dt=De?w:C,mt=Object(ne.a)("Message message-list-item",j&&"first-in-group",g&&"last-in-group",f&&"first-in-document-group",p&&"last-in-document-group",I&&"last-in-list",Re&&"own",Boolean(e.views)&&"has-views",e.isEdited&&"was-edited",Le&&"has-reply",at&&"has-menu-open",P&&!x&&"focused",L&&"is-forwarding",e.isDeleting&&"is-deleting",He&&"is-in-document-group",qe&&"is-album",e.hasUnreadMention&&"has-unread-mention",G&&"is-selected",q&&"is-in-selection-mode",M&&"is-thread-top",Boolean(e.inlineButtons)&&"has-inline-buttons",ke),ht=function(e,{hasReply:t,customShape:a,isLastInGroup:s,asForwarded:n,hasThread:c,forceSenderName:o,hasComments:r,hasActionButton:i}={}){const{text:d,photo:b,video:u,audio:m,voice:h,document:O,poll:j,webPage:g,contact:f}=Object(l.v)(e),p=["message-content"],I=b||u,v=I&&!d,y=Boolean(e.viaBotId);return Ft(a)?p.push("emoji-only emoji-only-"+a):d&&p.push("text"),i&&p.push("has-action-button"),a&&(p.push("custom-shape"),u&&u.isRound&&p.push("round"),r&&p.push("has-comments")),b||u?p.push("media"):m?p.push("audio"):h?p.push("voice"):O?p.push("document"):f?p.push("contact"):j?p.push("poll"):g&&(p.push("web-page"),(g.photo||g.video)&&p.push("media")),n&&!a&&p.push("is-forwarded"),t&&p.push("is-reply"),c&&p.push("has-replies"),y&&p.push("is-via-bot"),o&&p.push("force-sender-name"),a||(p.push("has-shadow"),I&&r&&p.push("has-background"),(t||n||!v||y||o)&&p.push("has-solid-background"),!s||!b&&v||p.push("has-appendix")),p.join(" ")}(e,{hasReply:Le,customShape:et,isLastInGroup:g,asForwarded:Ue,hasThread:Be,forceSenderName:y,hasComments:e.threadInfo&&e.threadInfo.messagesCount>0,hasActionButton:rt||it}),Ot=e.threadInfo&&(!He||p)&&"thread"===$&&!h,jt=ht.includes("has-appendix");Object(nt.a)(Ne,Le?e.replyToMessageId:void 0,k,e.id),Xt(he,Ne,P,R,x),Object(c.o)(()=>{je.current&&(je.current.innerHTML=Re?'':'')},[Re,jt]);const gt=Object(c.m)(t=>{t.stopPropagation(),ce({messageId:Te,groupedId:e.groupedId})},[Te,e.groupedId,ce]),ft=Object(c.m)(e=>{if(Pe)return;const t=qe&&o&&o.messages?{messageId:Te,childMessageIds:o.messages.map(({id:e})=>e),withShift:e&&e.shiftKey}:{messageId:Te,withShift:e&&e.shiftKey};ce(t)},[Pe,qe,o,Te,ce]),pt=Object(c.m)(()=>{re({messageId:Te})},[re,Te]),It=Object(c.m)(e=>{e.stopPropagation()},[]),vt=Object(c.m)(()=>{lt&&(Object(l.ob)(lt.id)?Z({id:lt.id}):ee({id:lt.id}))},[lt,Z,ee]),yt=Object(c.m)(()=>{dt?Object(l.ob)(dt.id)?Z({id:dt.id}):ee({id:dt.id}):be({message:ge("HidAccount")})},[dt,be,ge,Z,ee]),Ct=Object(c.m)(()=>{E&&Z({id:E.id})},[E,Z]),wt=Object(c.m)(()=>{J({chatId:Ne,threadId:z,messageId:e.replyToMessageId,replyMessageId:Te})},[J,Ne,z,e.replyToMessageId,Te]),Et=Object(c.m)(()=>{Y({chatId:Ne,threadId:z,messageId:Te,origin:xe?u.h.ScheduledInline:u.h.Inline})},[Ne,z,Te,Y,xe]),Mt=Object(c.m)(()=>{X({chatId:Ne,messageId:Te})},[Ne,Te,X]),St=Object(c.m)(e=>{Y({chatId:Ne,threadId:z,messageId:e,origin:xe?u.h.ScheduledAlbum:u.h.Album})},[Ne,z,Y,xe]),kt=Object(c.m)(e=>{const t=e.target;(t.classList.contains("text-content")||t.classList.contains("Message"))&&(m.b&&Xe.a.getIsKeyboardVisible()?setTimeout(()=>{ye(e)},350):ye(e))},[ye]),Tt=Object(c.m)(e=>{m.b?ft(e):ye(e)},[ye,ft]),At=Object(c.m)(()=>{ae({messageIds:[Te]})},[Te,ae]),Pt=Object(c.m)(()=>{te({chatId:Ne,messageId:Te})},[te,Ne,Te]),xt=Object(c.m)(e=>{se({chatId:Ne,messageId:Te,options:e})},[Ne,Te,se]),Lt=Object(c.m)(()=>{ie({fromChatId:Ne,groupedId:e.groupedId})},[ie,Ne,e.groupedId]),qt=Object(c.m)(()=>{if(o&&o.messages){const e=o.messages.map(({id:e})=>e);ie({fromChatId:Ne,messageIds:e})}else ie({fromChatId:Ne,messageIds:[Te]})},[o,ie,Ne,Te]),Gt=Object(c.m)(()=>{J({chatId:Ne,threadId:b.MAIN_THREAD_ID,messageId:Te})},[J,Ne,Te]),_t=Object(c.m)(()=>{J(He?{chatId:De.fromChatId,groupedId:e.groupedId,groupedChatId:Ne}:{chatId:De.fromChatId,messageId:De.fromMessageId})},[J,De,e,Ne,He]);let zt,$t="",Vt=!1;const Wt=Object(c.p)(()=>qe?Qt(Re,Boolean(Ue),Boolean(r),o):void 0,[qe,Re,Ue,r,o]),Kt=Ue?28:0;if(qe||!_e&&!ze)Wt&&(zt=Math.max(Ut(Boolean(Ge),Ot),Wt.containerStyle.width),zt-Wt.containerStyle.width>18&&(Vt=!0));else{let t;_e?t=Ht(e,r).width:ze&&(t=ze.isRound?bt.e:Ht(e,r).width),t&&(zt=Math.max(Ut(Boolean(Ge),Ot),t),zt-t>18&&(Vt=!0))}return zt&&($t=`width: ${zt+Kt}px`),c.a.createElement("div",{ref:he,id:"message"+Te,className:mt,style:ct?`--meta-safe-author-width: ${ct}px`:void 0,"data-message-id":Te,onClick:q?ft:m.b?kt:void 0,onDoubleClick:q?void 0:pt,onMouseDown:q?void 0:e=>{Nt(e),Pe||ve(e)},onContextMenu:q||Pe?void 0:Tt,onMouseEnter:He&&!p?Ja:void 0,onMouseLeave:He&&!p?Ya:void 0},c.a.createElement("div",{ref:Oe,className:"bottom-marker","data-message-id":Te,"data-last-message-id":o?o.messages[o.messages.length-1].id:void 0,"data-has-unread-mention":e.hasUnreadMention}),!Pe&&!He&&c.a.createElement("div",{className:"message-select-control"},G&&c.a.createElement("i",{className:"icon-select"})),!Pe&&p&&c.a.createElement("div",{className:Object(ne.a)("message-select-control group-select",_&&"is-selected"),onClick:gt},_&&c.a.createElement("i",{className:"icon-select"})),i&&function(){const e=lt&&Object(l.ob)(lt.id),t=lt&&e?lt:void 0,a=lt&&!e?lt:void 0,s=!lt&&De?De.hiddenUserName:void 0;return c.a.createElement(Zt.a,{size:"small",user:t,chat:a,text:s,lastSyncTime:F,onClick:t||a?vt:void 0})}(),c.a.createElement("div",{className:Object(ne.a)("message-content-wrapper",ht.includes("text")&&"can-select-text"),onClick:q&&He?ft:void 0},c.a.createElement("div",{className:ht,style:$t,dir:"auto"},Ue&&!et&&(!He||f)&&c.a.createElement("div",{className:"message-title"},ge("ForwardedMessage")),function(){const t=Object(ne.a)("content-inner",Ue&&!et&&"forwarded-message",Le&&"reply-message",Vt&&"no-media-corners"),a=g&&!tt&&!Ue&&!Be,i=!Ye&&!H&&tt,b=Object(ne.a)("text-content",i&&"with-meta",T&&"with-outgoing-icon");return c.a.createElement("div",{className:t,onDoubleClick:It,dir:"auto"},function(){if(et&&!Fe||!(d&&!_e&&!ze||Ue||Fe||y)||He&&!f)return;let t,a;!dt||et&&Fe?De&&De.hiddenUserName&&(t=De.hiddenUserName):(t=Object(l.X)(ge,dt),Ue||(a="color-"+Object(l.Z)(dt)));return c.a.createElement("div",{className:"message-title",dir:"ltr"},t?c.a.createElement("span",{className:Object(ne.a)("interactive",a),onClick:yt,dir:"auto"},Object(ut.a)(t)):E?void 0:" ",E&&c.a.createElement(c.a.Fragment,null,c.a.createElement("span",{className:"via"},ge("ViaBot")),c.a.createElement("span",{className:"interactive",onClick:Ct},Object(ut.a)("@"+E.username))),De&&De.isLinkedChannelPost?c.a.createElement("span",{className:"admin-title",dir:"auto"},ge("DiscussChannel")):e.adminTitle&&!D?c.a.createElement("span",{className:"admin-title",dir:"auto"},e.adminTitle):void 0)}(),Le&&c.a.createElement(sa,{message:k,sender:N,observeIntersection:s,onClick:wt}),Ke&&c.a.createElement(ba,{message:e,observeIntersection:s,observeIntersectionForPlaying:n,shouldLoop:Q,lastSyncTime:F}),H&&c.a.createElement(ua.a,{isInline:!0,sticker:H,observeIntersection:s,lastSyncTime:F,forceLoadPreview:Pe}),qe&&c.a.createElement(za,{album:o,albumLayout:Wt,observeIntersection:s,shouldAutoLoad:W,shouldAutoPlay:K,isOwn:Re,hasCustomAppendix:a,lastSyncTime:F,onMediaClick:St}),!qe&&_e&&c.a.createElement(Ia,{message:e,observeIntersection:s,noAvatars:r,shouldAutoLoad:W,uploadProgress:A,shouldAffectAppendix:a,onClick:Et,onCancelUpload:Pt}),!qe&&ze&&ze.isRound&&c.a.createElement(Wa,{message:e,observeIntersection:s,shouldAutoLoad:W,shouldAutoPlay:K,lastSyncTime:F}),!qe&&ze&&!ze.isRound&&c.a.createElement(Sa,{message:e,observeIntersection:s,noAvatars:r,shouldAutoLoad:W,shouldAutoPlay:K,uploadProgress:A,lastSyncTime:F,onClick:Et,onCancelUpload:Pt}),($e||Ve)&&c.a.createElement(ca.a,{theme:v,message:e,uploadProgress:A,lastSyncTime:F,isSelectable:He,isSelected:G,onPlay:Mt,onReadMedia:!Ve||Re&&!B?void 0:At,onCancelUpload:Pt}),We&&c.a.createElement(na.a,{message:e,observeIntersection:s,uploadProgress:A,isSelectable:He,isSelected:G,onMediaClick:Et,onCancelUpload:Pt}),Qe&&c.a.createElement(Na,{contact:Qe}),Je&&c.a.createElement(Ba,{message:e,poll:Je,onSendVote:xt}),!H&&tt&&c.a.createElement("p",{className:b,dir:"auto"},tt,i&&c.a.createElement(ra,{message:e,outgoingStatus:T,signature:st,onClick:ft})),Ye&&c.a.createElement(Ua,{message:e,observeIntersection:s,noAvatars:r,shouldAutoLoad:W,shouldAutoPlay:K,lastSyncTime:F,onMediaClick:Et,onCancelMediaTransfer:Pt}),Ze&&c.a.createElement(Ha,{message:e}))}(),(!He||p)&&!(!Ye&&!H&&tt)&&c.a.createElement(ra,{message:e,outgoingStatus:T,signature:st,onClick:ft}),rt?c.a.createElement(fe.a,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:ge("lng_context_forward_msg"),onClick:p?Lt:qt},c.a.createElement("i",{className:"icon-share-filled"})):it?c.a.createElement(fe.a,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:"Focus message",onClick:V?Gt:_t},c.a.createElement("i",{className:"icon-arrow-right"})):void 0,Ot&&c.a.createElement(Qa,{message:e,disabled:h}),jt&&c.a.createElement("div",{className:"svg-appendix",ref:je})),e.inlineButtons&&c.a.createElement(Ka,{message:e,onClick:le})),Ie&&c.a.createElement(ta,{isOpen:pe,anchor:Ie,message:e,album:o,chatUsername:t,messageListType:$,onClose:Ce,onCloseAnimationEnd:we}))}));var es=Object(c.h)(({messageIds:e,messageGroups:t,isViewportNewest:a,isUnread:o,withUsers:r,noAvatars:i,containerRef:d,anchorIdRef:b,memoFirstUnreadIdRef:m,threadId:O,type:j,threadTopMessageId:g,hasLinkedChat:f,isSchedule:I,noAppearanceAnimation:v,onFabToggle:y,onNotchToggle:C,openHistoryCalendar:w})=>{const{observeIntersectionForMedia:E,observeIntersectionForReading:M,observeIntersectionForAnimatedStickers:S}=function(e,t,a){const{markMessageListRead:n,markMessagesRead:c}=Object(s.d)(),{observe:o}=Object(Rt.a)({rootRef:t,throttleMs:xt,margin:Lt}),{observe:r,freeze:i,unfreeze:l}=Object(Rt.a)({rootRef:t},t=>{if("thread"!==e)return;let s=0;const o=[];t.forEach(e=>{const{isIntersecting:t,target:a}=e;if(!t)return;const{dataset:n}=a,c=Number(n.lastMessageId||n.messageId);c>s&&(s=c),n.hasUnreadMention&&o.push(c)}),a.current&&s>=a.current&&n({maxId:s}),o.length&&c({messageIds:o})});Object(re.a)(i,l);const{observe:d}=Object(Rt.a)({rootRef:t,throttleMs:xt});return{observeIntersectionForMedia:o,observeIntersectionForReading:r,observeIntersectionForAnimatedStickers:d}}(j,d,m),{backwardsTriggerRef:k,forwardsTriggerRef:N,fabTriggerRef:T}=function(e,t,a,o,r,i,l){const{loadViewportMessages:d}=Object(s.d)(),[b,m]=Object(c.p)(()=>"thread"===e?[Object(p.a)(()=>d({direction:u.e.Backwards}),1e3,!0,!1),Object(p.a)(()=>d({direction:u.e.Forwards}),1e3,!0,!1)]:[],[d,a]),h=Object(c.q)(null),O=Object(c.q)(null),j=Object(c.q)(null),g=Object(c.m)(()=>{if(!a||!a.length)return i(!1),void l(!1);if(!o)return i(!0),void l(!0);const{offsetHeight:e,scrollHeight:s,scrollTop:n}=t.current,c=s-n-e,d=c<=0;i(r?!d:!(c<=50)),l(!d)},[a,o,t,i,r,l]),{observe:f}=Object(Rt.a)({rootRef:t,margin:n.fb},e=>{if(!m||!b)return;const a=e.find(({isIntersecting:e})=>e);if(!a)return;const{target:s}=a;"backwards-trigger"===s.className?(Object(At.a)(t.current),b()):"forwards-trigger"===s.className&&(Object(At.a)(t.current),m())});Object(Rt.c)(h,f),Object(Rt.c)(O,f);const{observe:I,freeze:v,unfreeze:y}=Object(Rt.a)({rootRef:t,margin:50},g);Object(Rt.c)(j,I);const{observe:C,freeze:w,unfreeze:E}=Object(Rt.a)({rootRef:t},g);return Object(Rt.c)(j,C),Object(le.a)(()=>{v(),w(),setTimeout(()=>{E(),y()},100)},[a]),{backwardsTriggerRef:h,forwardsTriggerRef:O,fabTriggerRef:j}}(j,d,e,a,o,y,C),A=Object(me.a)(),P=c.a.createElement("div",{className:Object(ne.a)("unread-divider","local-action-message"),key:"unread-messages"},c.a.createElement("span",null,A("UnreadMessages"))),R=v?0:t.reduce((e,t)=>e+Object(h.h)(t.senderGroups).length,0);let L=0;const B=t.map((e,t,a)=>{const s=e.senderGroups.map((e,s,n)=>{if(1===e.length&&!St(e[0])&&Object(l.gb)(e[0])){const o=e[0],r=s===n.length-1&&t===a.length-1;return Object(h.e)([o.id===m.current&&P,c.a.createElement(aa,{key:o.id,message:o,observeIntersection:M,appearanceOrder:R-++L,isLastInList:r})])}let o;return Object(h.h)(e.map((d,u)=>{const p=St(d)?d.mainMessage:d,I=St(d)?d:void 0,v=Object(l.yb)(p),y=St(d),C=e[u+1];p.previousLocalId&&b.current==="message"+p.previousLocalId&&(b.current="message"+p.id);const w=!y&&p.groupedId?p.groupedId:void 0,k=C&&!St(C)?C.groupedId:void 0,N={isFirstInGroup:0===u,isLastInGroup:u===e.length-1,isFirstInDocumentGroup:Boolean(w&&w!==o),isLastInDocumentGroup:Boolean(w&&w!==k),isLastInList:u===e.length-1&&s===n.length-1&&t===a.length-1};o=w;const T=Object(l.G)(p),x="scheduled"!==j?T:`${p.date}_${T}`;return Object(h.e)([p.id===m.current?P:void 0,c.a.createElement(Za,{key:x,message:p,observeIntersectionForBottom:M,observeIntersectionForMedia:E,observeIntersectionForAnimatedStickers:S,album:I,noAvatars:i,withAvatar:N.isLastInGroup&&r&&!v&&!(p.id===g),withSenderName:N.isFirstInGroup&&r&&!v,threadId:O,messageListType:j,noComments:!1===f,appearanceOrder:R-++L,isFirstInGroup:N.isFirstInGroup,isLastInGroup:N.isLastInGroup,isFirstInDocumentGroup:N.isFirstInDocumentGroup,isLastInDocumentGroup:N.isLastInDocumentGroup,isLastInList:N.isLastInList}),p.id===g&&c.a.createElement("div",{className:"local-action-message",key:"discussion-started"},c.a.createElement("span",null,A("DiscussionStarted")))])}))});return c.a.createElement("div",{className:"message-date-group",key:e.datetime,onMouseDown:Nt,teactFastList:!0},c.a.createElement("div",{className:Object(ne.a)("sticky-date",!I&&"interactive"),key:"date-header",onMouseDown:Nt,onClick:I?void 0:()=>w({selectedAt:e.datetime})},c.a.createElement("span",{dir:"auto"},I&&e.originalDate===n.xb&&A("MessageScheduledUntilOnline"),I&&e.originalDate!==n.xb&&A("MessageScheduledOn",Object(x.c)(A,e.datetime,void 0,!0)),!I&&Object(x.c)(A,e.datetime))),Object(h.h)(s))});return c.a.createElement("div",{className:"messages-container",teactFastList:!0},c.a.createElement("div",{ref:k,key:"backwards-trigger",className:"backwards-trigger"}),Object(h.h)(B),c.a.createElement("div",{ref:N,key:"forwards-trigger",className:"forwards-trigger"}),c.a.createElement("div",{ref:T,key:"fab-trigger",className:"fab-trigger"}))});a(242);const ts=Object(p.a)(e=>e(),200,!1);var as=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,type:s})=>{const n=Object(r.g)(e,t);if(!n)return{};const c=Object(r.y)(e,t,a,s),o="scheduled"===s?Object(r.sb)(e,t):Object(r.n)(e,t),i=Object(r.Hb)(e,t,a);if(a!==b.MAIN_THREAD_ID&&!(o&&i&&o[i]))return{};const{isRestricted:d,restrictionReason:u,lastMessage:m}=n,h=Object(r.I)(e,t),O=h?!e.focusedMessage.noHighlight:void 0,j=a===b.MAIN_THREAD_ID&&!c&&!n.unreadCount&&!h&&m&&!m.groupedId;let g;if(Object(r.L)(e,t)){const a=Object(r.h)(e,t);g=a.fullInfo?a.fullInfo.botDescription||"NoMessages":"Updating bot info..."}return{isChatLoaded:!0,isRestricted:d,restrictionReason:u,isChannelChat:Object(l.mb)(n),isChatWithSelf:Object(r.P)(e,t),messageIds:c,messagesById:o,firstUnreadId:Object(r.H)(e,t,a),isViewportNewest:"thread"!==s||Object(r.Y)(e,t,a),threadFirstMessageId:Object(r.G)(e,t,a),focusingId:h,hasFocusHighlight:O,isSelectModeActive:Object(r.S)(e),botDescription:g,threadTopMessageId:i,hasLinkedChat:n.fullInfo&&"linkedChatId"in n.fullInfo?Boolean(n.fullInfo.linkedChatId):void 0,...j&&{lastMessage:m}}},(e,t)=>Object(h.l)(t,["loadViewportMessages","setScrollOffset","openHistoryCalendar"]))(({chatId:e,threadId:t,type:a,hasTools:o,onFabToggle:i,onNotchToggle:d,isChatLoaded:b,isChannelChat:m,canPost:O,isReady:j,isChatWithSelf:g,messageIds:f,messagesById:I,firstUnreadId:v,isViewportNewest:y,threadFirstMessageId:C,isRestricted:w,restrictionReason:E,focusingId:M,hasFocusHighlight:S,isSelectModeActive:k,loadViewportMessages:N,setScrollOffset:T,lastMessage:A,botDescription:P,threadTopMessageId:R,hasLinkedChat:x,openHistoryCalendar:L})=>{const B=Object(c.q)(null),D=Object(c.q)("thread"===a&&Object(r.tb)(Object(s.e)(),e,t)||0),F=Object(c.q)(),U=Object(c.q)(),H=Object(c.q)(),q=Object(c.q)(),G=Object(c.q)(),_=Object(c.q)(),z=Object(c.q)(!1),$=Object(c.q)(Boolean(A)),[V,W]=Object(c.r)(),K=Boolean(f);Object(le.a)(()=>{K&&Object(p.e)(()=>{$.current=!1})},[K]),Object(le.a)(()=>{G.current=v,q.current||(q.current=v)},[v]),Object(le.a)(()=>{_.current=M},[M]);const Q=Object(c.p)(()=>{if(!f||!I)return;const e=!R||f[0]&&C!==f[0]?f:[R,...f];if(!e.length)return;const t=e.map(e=>I[e]).filter(Boolean);return kt(Object(h.k)(t,["date","id"]),q.current)},[f,I,C,R]),J=Object(c.p)(()=>{if("thread"===a)return Object(p.a)(()=>N({direction:u.e.Around}),1e3,!0,!1)},[N,f]),{isScrolled:Y,updateStickyDates:X}=Tt(),Z=Object(c.m)(()=>{if(z.current)return void(z.current=!1);const s=B.current;_.current||X(s,o),ts(()=>{Object(p.b)(()=>{s.parentElement&&(D.current=s.scrollHeight-s.scrollTop,"thread"===a&&T({chatId:e,threadId:t,scrollOffset:D.current}))})})},[X,o,a,T,e,t]);Object(c.n)(()=>{if(!("ResizeObserver"in window))return;const e=new ResizeObserver(([e])=>{e.target.offsetParent&&W(e.contentRect.height)});return e.observe(B.current),()=>{e.disconnect()}},[]);const{height:ee}=Ze();Object(c.n)(()=>{j&&(B.current.dataset.normalHeight=String(B.current.offsetHeight))},[ee,j]),Object(c.n)(()=>{if(!J||!b||w||M)return;const e=B.current;(!f||f.length{if(!f||!H.current||!j)return;const e=H.current.filter(e=>f.includes(Number(e.dataset.messageId))),t=e[1]||e[0];t&&(F.current=t.id,U.current=t.getBoundingClientRect().top)},[f,y,V,o,j]),Object(Et.a)(([e,t,a])=>{const s=B.current;if(H.current=Array.from(s.querySelectorAll(".message-list-item")),!s.offsetParent)return;const c=y&&f&&f.length{s.parentElement&&s.parentElement.classList.remove("force-messages-scroll")},1e3));const{scrollTop:r,scrollHeight:i,offsetHeight:l}=s,d=D.current,b=H.current[H.current.length-1],u=b?b.offsetHeight:0,m=y&&t&&d-(a||l)-u<=100;let h;const O=f&&e&&f[0]!==e[0],j=f&&e&&f[f.length-1]!==e[e.length-1],g=f&&_.current===f[f.length-1];if(m&&j&&!O&&!g&&(b&&Object(p.b)(()=>{Object(Pt.a)(s,b,"end",20,void 0,void 0,void 0,!0)}),h=i-l,D.current=Math.max(i-h,l),!c))return;const I=void 0!==a&&a!==V,v=F.current&&s.querySelector("#"+F.current),C=!v&&q.current&&s.querySelector(".unread-divider");if(m&&I){if(Object(Pt.b)())return;h=i-l}else if(v){h=r+(v.getBoundingClientRect().top-(U.current||0))}else h=C?Math.min(C.offsetTop-(o?60:10),i-d):i-d;Object(At.a)(s,h),_.current||(z.current=!0,Object(p.b)(()=>{z.current=!1})),D.current=Math.max(i-h,l)},[f,y,V,o]),Object(Mt.a)(([e])=>{void 0!==e&&Object(se.d)(200+n.c)},[k]);const te=Object(me.a)(),ae=Boolean(e&&Object(l.ob)(e)),ce=Boolean(!ae&&!m||g),oe=Boolean(!ce||m),re=Object(ne.a)("MessageList custom-scroll",oe&&"no-avatars",!O&&"no-composer","pinned"===a&&"type-pinned",S&&"has-focus-highlight",k&&"select-mode-active",Y&&"scrolled",!j&&"is-animating");return c.a.createElement("div",{ref:B,className:re,onScroll:Z,onMouseDown:Nt},w?c.a.createElement("div",{className:"empty"},c.a.createElement("span",null,E?E.text:"This is a private "+(m?"channel":"chat"))):P?c.a.createElement("div",{className:"empty rich"},c.a.createElement("span",null,Object(ut.a)(te(P),["br","emoji","links"]))):f&&!Q?c.a.createElement("div",{className:"empty"},c.a.createElement("span",null,te("NoMessages"))):f&&Q||A?c.a.createElement(es,{messageIds:f||[A.id],messageGroups:Q||kt([A]),isViewportNewest:Boolean(y),isUnread:Boolean(v),withUsers:ce,noAvatars:oe,containerRef:B,anchorIdRef:F,memoFirstUnreadIdRef:q,threadId:t,type:a,threadTopMessageId:R,hasLinkedChat:x,isSchedule:!!Q&&"scheduled"===a,noAppearanceAnimation:!Q||!$.current,onFabToggle:i,onNotchToggle:d,openHistoryCalendar:L}):c.a.createElement(Re.a,{color:"white"}))}));a(243);var ss=Object(c.h)(Object(s.h)(e=>{const t=Object(r.z)(e);if(!t)return{};const{chatId:a,threadId:s,type:n}=t,c=Object(r.g)(e,a);return{messageListType:n,unreadCount:c&&s===b.MAIN_THREAD_ID&&"thread"===n?c.unreadCount:void 0}},(e,t)=>Object(h.l)(t,["focusNextReply"]))(({isShown:e,canPost:t,messageListType:a,unreadCount:s,focusNextReply:n})=>{const o=Object(me.a)(),r=Object(c.q)(null),i=Object(c.m)(()=>{if(e)if("thread"===a)n();else{const e=r.current.parentElement.querySelector(".MessageList"),t=e.querySelectorAll(".message-list-item"),a=t[t.length-1];if(!a)return;Object(Pt.a)(e,a,"end",20)}},[e,a,n]),l=Object(ne.a)("ScrollDownButton",e&&"revealed",!t&&"no-composer");return c.a.createElement("div",{ref:r,className:l},c.a.createElement("div",{className:"ScrollDownButton-inner"},c.a.createElement(fe.a,{color:"secondary",round:!0,onClick:i,ariaLabel:o("AccDescrPageDown")},c.a.createElement("i",{className:"icon-arrow-down"})),Boolean(s)&&c.a.createElement("div",{className:"unread-count"},Object(ot.b)(s))))})),ns=a(134),cs=a(141);async function os(e,t,a,s){const n=URL.createObjectURL(t),{type:c,size:o}=t;let r,i;if(c.startsWith("image/"))if(a){const a=await Object(Ye.g)(n),{width:o,height:i}=a;if(o>1280||i>1280||"image/jpeg"!==c){const c=await function(e){return new Promise(t=>{const a=document.createElement("canvas"),s=a.getContext("2d");let{width:n,height:c}=e;(n>1280||c>1280)&&(n>=c?(c*=1280/n,n=1280):(n*=1280/c,c=1280)),a.width=n,a.height=c,s.drawImage(e,0,0,e.width,e.height,0,0,n,c),a.toBlob(t,"image/jpeg",100)})}(a);return c?(URL.revokeObjectURL(n),os(e,c,!0,s)):os(e,t,!1,s)}r={width:o,height:i}}else i=n;else if(c.startsWith("video/")){if(o<10485760){const{videoWidth:e,videoHeight:t,duration:a}=await Object(Ye.h)(n);r={width:e,height:t,duration:a}}i=await Object(Ye.c)(n)}return{blobUrl:n,filename:e,mimeType:c,size:o,quick:r,previewBlobUrl:i,...s}}var rs=a(187);let is;function ls(e){is.focus(),e.focus()}m.e&&(is=document.createElement("input"),is.classList.add("for-ios-autocapitalization-fix"),document.body.appendChild(is));var ds=a.p+"c0155344d336103c2b6a0b28cc510750.js";const bs={encoderPath:ds,reuseWorker:!0},us={type:"audio/ogg"};let ms,hs,Os;async function js(){return ms||(ms=a.e(10).then(a.t.bind(null,328,7)),hs=(await ms).default,Os=new hs(bs)),ms}async function gs(e){await async function(){await js(),await Os.start()}();const t=Date.now();let a;const s=[],n=[];Os.ondataavailable=e=>{s.push(e)};const c=function(e,t){const a=e.sourceNode,s=a.context.createAnalyser();s.fftSize=64,a.connect(s);const n=s.frequencyBinCount,c=new Uint8Array(n);let o=!1;return function e(){if(o)return;s.getByteFrequencyData(c);const a=c.reduce((e,t)=>e+t,0),r=a/n/255;t(r<.1?0:r),requestAnimationFrame(e)}(),()=>{o=!0}}(Os,t=>{n.push(255*t),e(t)});return{stop:()=>new Promise((e,o)=>{Os.onstop=()=>{e({blob:new Blob(s,us),duration:Math.round(((a||Date.now())-t)/1e3),waveform:n})},Os.onerror=o;const r=Math.max(0,t+1e3-Date.now());setTimeout(()=>{Os.stop(),c()},r)}),pause:()=>{const e=Math.max(0,t+1e3-Date.now());setTimeout(()=>{Os.pause(),a=Date.now(),c()},e)}}}const fs=["image/png","image/jpeg","image/gif"];function ps(e){const{text:t,entities:a}=e||{};if(!t)return"";const s=Object(Dt.b)(t,a,void 0,void 0,!0);return Array.isArray(s)?s.join(""):s}let Is,vs;var ys=a(65);var Cs=a(188),ws=a(196);const Es=document.createElement("div"),Ms=/^@([a-z0-9_]{1,32})[\u00A0\u0020]+(.*)/i,Ss=/^@([a-z0-9_]{1,32})[\u00A0\u0020]+\n{2,}/i;function ks(e,t,a,n){const[o,r,i]=Object(ue.a)(),l=function(e){return Es.innerHTML=e.replace(/
/g,"\n"),Es.innerText}(a),{queryInlineBot:d,resetInlineBot:b}=Object(s.d)(),{username:u,query:m,canShowHelp:h}=function(e){const t=e.match(Ms);if(!t)return{username:"",query:"",canShowHelp:!1};return{username:t[1],query:t[2],canShowHelp:""===t[2]&&!e.match(Ss)}}(l),O=u.toLowerCase(),j=Object(ja.a)(m),g=Object(ja.a)(u),f=n&&n[O],{id:p,switchPm:I,offset:v,results:y,isGallery:C,help:w}=f||{};Object(c.n)(()=>{j!==m&&i()},[j,m,i]),Object(c.n)(()=>{e&&O&&t&&d({chatId:t,username:O,query:m})},[m,e,d,t,O]);const E=Object(c.m)(()=>{d({chatId:t,username:O,query:m,offset:v})},[v,t,m,d,O]);return Object(c.n)(()=>{e&&p&&(I||y&&y.length)?r():i()},[p,e,r,y,I,i]),g!==u&&b({username:g}),{isOpen:o,closeTooltip:i,loadMore:E,username:u,id:p,isGallery:C,switchPm:I,results:y,help:h&&w?`@${u} ${w}`:void 0}}var Ns=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"DeleteMessageModal",!t);return a?c.a.createElement(a,e):void 0});function Ts(){return(Ts=Object.assign||function(e){for(var t=1;t{const a=Object(c.q)(!1),s=Object(c.m)(()=>{if(a.current=!0,Ps)return Ps=!1,void e();As&&(clearTimeout(As),As=void 0),As=window.setTimeout(()=>{a.current&&e()},200)},[e]),n=Object(c.m)(()=>{a.current=!1},[]);return c.a.createElement(fe.a,Ts({},t,{onMouseEnter:m.n?void 0:s,onMouseLeave:m.n?void 0:n,onClick:m.n?e:void 0}))});var xs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"AttachMenu",!t);return a?c.a.createElement(a,e):void 0});var Ls=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"SymbolMenu",!t);return a?c.a.createElement(a,e):void 0});var Bs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"InlineBotTooltip",!t);return a?c.a.createElement(a,e):void 0});var Ds=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"MentionTooltip",!t);return a?c.a.createElement(a,e):void 0});var Fs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"CustomSendMenu",!t);return a?c.a.createElement(a,e):void 0});var Us=e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"StickerTooltip",!t);return a?c.a.createElement(a,e):void 0},Hs=a(189);var qs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"BotKeyboardMenu",!t);return a?c.a.createElement(a,e):void 0}),Gs=a(190),_s=a(122);a(245);var zs=Object(c.h)(Object(s.h)(e=>{const{chatId:t,threadId:a,type:s}=Object(r.z)(e)||{};if(!t||!a||!s)return{};const{currentUserId:n,forwardMessages:{fromChatId:c,toChatId:o,messageIds:i}}=e,d=Object(r.ob)(e,t,a),b="scheduled"===s?Object(r.F)(e,t):Object(r.D)(e,t,a),u=e.settings.byKey.animationLevel>=1,m=o===t;let h,O;if(d?h=Object(r.l)(e,t,d):b?h=Object(r.E)(e,t,a,s):m&&1===i.length&&(h=Object(r.l)(e,c,i[0])),d&&h){const{forwardInfo:a}=h,s=t===n;a&&(a.isChannelPost||s)&&(O=Object(r.K)(e,h)),O||(O=Object(r.vb)(e,h))}else m&&(O=Object(l.ob)(c)?Object(r.Jb)(e,c):Object(r.g)(e,c));return{replyingToId:d,editingId:b,message:h,sender:O,shouldAnimate:u,forwardedMessagesCount:m?i.length:void 0}},(e,t)=>Object(h.l)(t,["setReplyingToId","setEditingId","focusMessage","exitForwardMode"]))(({replyingToId:e,editingId:t,message:a,sender:s,shouldAnimate:n,forwardedMessagesCount:o,setReplyingToId:r,setEditingId:i,focusMessage:l,exitForwardMode:d})=>{const b=Boolean((e||t)&&a||s&&o),u=Object(_s.a)([o],o?300:void 0),{shouldRender:m,transitionClassNames:h}=Object(oe.a)(u&&b,void 0,!n,void 0,!n),O=Object(c.m)(()=>{e?r({messageId:void 0}):t?i({messageId:void 0}):o&&d()},[e,t,o,r,i,d]);Object(c.n)(()=>b?Object(de.a)(O):void 0,[b,O]);const j=Object(c.m)(()=>{l({chatId:a.chatId,messageId:a.id})},[l,a]),g=Object(ne.a)("ComposerEmbeddedMessage",h),f=o&&o>1?o+" forwarded messages":void 0;if(m)return c.a.createElement("div",{className:g},c.a.createElement("div",null,c.a.createElement(fe.a,{round:!0,color:"translucent",ariaLabel:"Cancel replying",onClick:O},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(sa,{className:"inside-input",message:a,sender:s,customText:f,title:t?"Edit Message":void 0,onClick:j})))}));var $s=Object(c.h)(e=>{const{attachments:t}=e,a=Object(Pe.a)(Ae.a.Extra,"AttachmentModal",!t.length);return a?c.a.createElement(a,e):void 0});var Vs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"PollModal",!t);return a?c.a.createElement(a,e):void 0});var Ws=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"DropArea",!t);return a?c.a.createElement(a,e):void 0});a(246);const Ks=new RegExp(n.rb,"i");var Qs=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a})=>{const s=Object(r.db)(e,t,a);return{webPagePreview:e.webPagePreview,noWebPage:s}},(e,t)=>Object(h.l)(t,["loadWebPagePreview","clearWebPagePreview","toggleMessageWebPage"]))(({chatId:e,threadId:t,messageText:a,disabled:s,webPagePreview:n,noWebPage:o,loadWebPagePreview:r,clearWebPagePreview:i,toggleMessageWebPage:l})=>{const d=Object(c.p)(()=>{const{text:e,entities:t}=Object(cs.a)(a),s=t&&t.find(({type:e})=>e===b.ApiMessageEntityTypes.TextUrl);if(s)return s.url;const n=e.match(Ks);return n?n[0]:void 0},[a]);Object(c.n)(()=>{d?r({text:d}):(i(),l({chatId:e,threadId:t}))},[e,l,i,d,r,t]),Object(le.a)(()=>{i(),l({chatId:e,threadId:t})},[e]);const u=Boolean(n&&a.length&&!o&&!s),{shouldRender:m,transitionClassNames:h}=Object(oe.a)(u),O=Object(ct.a)(n);if(!m||!O)return;const{photo:j,...g}=O,f={content:{webPage:g}};return c.a.createElement("div",{className:Object(ne.a)("WebPagePreview",h)},c.a.createElement("div",null,c.a.createElement(fe.a,{round:!0,color:"translucent",ariaLabel:"Clear Webpage Preview",onClick:()=>{l({chatId:e,threadId:t,noWebPage:!0})}},c.a.createElement("i",{className:"icon-close"})),c.a.createElement(Ua,{message:f,inPreview:!0})))})),Js=a(127);var Ys=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"CalendarModal",!t);return a?c.a.createElement(a,e):void 0});var Xs=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"PaymentModal",!t);return a?c.a.createElement(a,e):void 0});var Zs,en=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"ReceiptModal",!t);return a?c.a.createElement(a,e):void 0});a(247);!function(e){e.Send="send",e.Record="record",e.Edit="edit"}(Zs||(Zs={}));var tn=Object(c.h)(Object(s.h)((e,{chatId:t,threadId:a,messageListType:s})=>{const c=Object(r.g)(e,t),o=c&&Object(r.p)(e,c),i=c?Object(r.O)(e,c):void 0,d=Object(r.P)(e,t),u=i&&Object(r.cb)(e,t),m=Object(r.qb)(e,t),{language:h}=e.settings.byKey,O=e.emojiKeywords[n.j],j=h!==n.j?e.emojiKeywords[h]:void 0;return{editingMessage:Object(r.E)(e,t,a,s),connectionState:e.connectionState,draft:Object(r.C)(e,t,a),chat:c,isChatWithBot:i,isChatWithSelf:d,canScheduleUntilOnline:!d&&!i&&c&&o&&Object(l.ob)(t)&&o.status&&Boolean(o.status.wasOnline),isRightColumnShown:Object(r.W)(e),isSelectModeActive:Object(r.S)(e),withScheduledButton:a===b.MAIN_THREAD_ID&&"thread"===s&&Boolean(m&&m.length),shouldSchedule:"scheduled"===s,botKeyboardMessageId:u?u.id:void 0,isForwarding:t===e.forwardMessages.toChatId,isPollModalOpen:e.isPollModalOpen,stickersForEmoji:e.stickers.forEmoji.stickers,groupChatMembers:c&&c.fullInfo&&c.fullInfo.members,topInlineBotIds:e.topInlineBots&&e.topInlineBots.userIds,currentUserId:e.currentUserId,usersById:e.users.byId,lastSyncTime:e.lastSyncTime,contentToBeScheduled:e.messages.contentToBeScheduled,isPaymentModalOpen:e.payment.isPaymentModalOpen,isReceiptModalOpen:Boolean(e.payment.receipt),shouldSuggestStickers:e.settings.byKey.shouldSuggestStickers,recentEmojis:e.recentEmojis,baseEmojiKeywords:O?O.keywords:void 0,emojiKeywords:j?j.keywords:void 0,serverTimeOffset:e.serverTimeOffset,inlineBots:e.inlineBots.byUsername,isInlineBotLoading:e.inlineBots.isLoading}},(e,t)=>Object(h.l)(t,["sendMessage","editMessage","saveDraft","clearDraft","showDialog","setStickerSearchQuery","setGifSearchQuery","forwardMessages","openPollModal","closePollModal","closePaymentModal","clearReceipt","loadScheduledHistory","openChat","addRecentEmoji","sendInlineBotResult"]))(({dropAreaState:e,shouldSchedule:t,canScheduleUntilOnline:a,isReady:o,onDropHide:r,editingMessage:i,chatId:d,threadId:u,messageListType:h,draft:O,chat:j,connectionState:g,isChatWithBot:f,isChatWithSelf:I,isRightColumnShown:v,isSelectModeActive:y,isForwarding:C,isPollModalOpen:w,isPaymentModalOpen:E,isReceiptModalOpen:M,botKeyboardMessageId:S,withScheduledButton:k,stickersForEmoji:N,groupChatMembers:T,topInlineBotIds:A,currentUserId:P,usersById:R,lastSyncTime:L,contentToBeScheduled:B,shouldSuggestStickers:D,baseEmojiKeywords:F,emojiKeywords:U,serverTimeOffset:H,recentEmojis:q,inlineBots:G,isInlineBotLoading:_,sendMessage:z,editMessage:$,saveDraft:V,clearDraft:W,showDialog:K,setStickerSearchQuery:Q,setGifSearchQuery:J,forwardMessages:Y,openPollModal:X,closePollModal:Z,loadScheduledHistory:ee,closePaymentModal:te,openChat:ae,clearReceipt:se,addRecentEmoji:ce,sendInlineBotResult:oe})=>{const le=Object(me.a)(),be=Object(c.q)(null),[he,Oe]=Object(c.r)(""),je=Object(c.q)(),ge=Object(ja.a)(e),[pe,Ie,ve]=Object(ue.a)(),[ye,Ce]=Object(c.r)(),{width:Ee}=Xe.a.get(),Me=Object(c.q)(he);Object(c.n)(()=>{Me.current=he},[he]),Object(c.n)(()=>{je.current=void 0},[d]),Object(c.n)(()=>{d&&L&&u===b.MAIN_THREAD_ID&&o&&ee()},[o,d,ee,L,u]),Object(c.o)(()=>{be.current&&(be.current.innerHTML='')},[]),Object(c.n)(()=>{B&&(Ce(B),Ie())},[B,Ie]);const[Se,ke]=Object(c.r)([]),[Ne,Te,Ae]=Object(ue.a)(),[Pe,Re,xe]=Object(ue.a)(),[Le,Be,De]=Object(ue.a)(),[Fe,Ue,He]=Object(ue.a)(),[qe,Ge]=Object(ue.a)(),[_e,ze,$e]=Object(ue.a)(),{startRecordingVoice:Ve,stopRecordingVoice:We,pauseRecordingVoice:Ke,activeVoiceRecording:Je,currentRecordTime:Ye,recordButtonRef:Ze,startRecordTimeRef:et}=(()=>{const e=Object(c.q)(null),[t,a]=Object(c.r)(),s=Object(c.q)(),[n,o]=Object(c.r)();Object(c.n)(()=>{m.e&&m.o&&js()},[]);const r=Object(c.m)(async()=>{try{const{stop:t,pause:n}=await gs(t=>{e.current&&(s.current&&Date.now()%4==0&&(e.current.style.boxShadow=`0 0 0 ${50*(t||0)}px rgba(0,0,0,.15)`),o(Date.now()))});s.current=Date.now(),o(Date.now()),a({stop:t,pause:n})}catch(e){console.error(e)}},[]),i=Object(c.m)(()=>{if(t){e.current&&(e.current.style.boxShadow="none");try{return t.pause()}catch(e){return void console.error(e)}}},[t]),l=Object(c.m)(()=>{if(t){a(void 0),s.current=void 0,o(void 0),e.current&&(e.current.style.boxShadow="none");try{return t.stop()}catch(e){return void console.error(e)}}},[t]);return Object(c.n)(()=>t?Object(de.a)(l):void 0,[t,l]),{startRecordingVoice:r,pauseRecordingVoice:i,stopRecordingVoice:l,activeVoiceRecording:t,currentRecordTime:n,recordButtonRef:e,startRecordTimeRef:s}})(),tt=i?Zs.Edit:!m.o||Je||he&&!Se.length||C?Zs.Send:Zs.Record,at=!t,{isMentionTooltipOpen:st,mentionFilter:nt,closeMentionTooltip:ct,insertMention:ot,mentionFilteredUsers:rt}=Object(ws.a)(!Se.length,he,Oe,void 0,T,A,P,R),{isOpen:it,id:lt,isGallery:dt,switchPm:bt,results:mt,closeTooltip:ht,help:Ot,loadMore:jt}=ks(Boolean(!Se.length&&L),d,he,G),{isContextMenuOpen:gt,handleContextMenu:ft,handleContextMenuClose:pt,handleContextMenuHide:It}=Object(Bt.a)(Ze,!(tt===Zs.Send&&at)),vt=Object(c.p)(()=>Object(l.b)(j,f),[j,f]),yt=j&&Object(l.jb)(j),Ct=Object(l.j)(j),{isStickerTooltipOpen:wt,closeStickerTooltip:Et}=function(e,t,a,n=!1){const{loadStickersForEmoji:o,clearStickersForEmoji:r}=Object(s.d)(),i=m.d&&1===Object(ys.a)(t)||!m.d&&Boolean(t.match(/^]*?>$/g)),l=Boolean(a)&&i;return Object(c.n)(()=>{n||(e&&i?o({emoji:t}):!l&&i||r())},[t,i,r,o,e,n]),{isStickerTooltipOpen:l,closeStickerTooltip:r}}(Boolean(D&&vt.canSendStickers&&!Se.length),he,N,!o),{isEmojiTooltipOpen:Mt,closeEmojiTooltip:St,filteredEmojis:kt,insertEmoji:Nt}=Object(Cs.a)(Boolean(D&&vt.canSendStickers&&!Se.length),he,q,void 0,Oe,F,U,!o),Tt=Object(c.m)((e,t=n.z)=>{const a=window.getSelection(),s=document.getElementById(t),c=Object(ut.a)(e,["escape_html","emoji_html","br_html"]).join("").replace(/\u200b+/g,"​");if(a.rangeCount){const e=a.getRangeAt(0);if(Object(rs.a)(e,t))return function(e){const t=window.getSelection();if(t&&t.getRangeAt&&t.rangeCount){const a=t.getRangeAt(0);a.deleteContents();const s=a.createContextualFragment(e),n=s.lastChild;a.insertNode(s),n?(a.setStartAfter(n),a.setEndAfter(n)):a.collapse(!1),t.removeAllRanges(),t.addRange(a)}}(c),void s.dispatchEvent(new Event("input",{bubbles:!0}))}Oe(`${Me.current}${c}`),requestAnimationFrame(()=>{Object(ns.a)(s)})},[]),At=Object(c.m)(()=>{const e=window.getSelection();if(e.rangeCount){const t=e.getRangeAt(0);if(Object(rs.a)(t,n.z))return void document.execCommand("delete",!1)}Oe(function(e){const t=document.createElement("div");t.contentEditable="true",t.style.position="absolute",t.style.left="-10000px",t.style.top="-10000px",t.innerHTML=e,document.body.appendChild(t);let a=t.lastChild;if(a.lastChild)for(;a.lastChild;)a=a.lastChild;const s=a.textContent.length,n=document.createRange(),c=window.getSelection();n.setStart(a,s),n.setEnd(a,s),c.removeAllRanges(),c.addRange(n),document.execCommand("delete",!1);const o=t.innerHTML;return document.body.removeChild(t),o}(Me.current))},[]),Pt=Object(c.m)((e=!1)=>{e||Oe(""),ke([]),Et(),ve(),Ce(void 0),ct(),St(),m.l?setTimeout(()=>De(),350):De()},[Et,ve,ct,St,De]),Rt=Object(ja.a)(d);Object(c.n)(()=>{Rt&&d!==Rt&&(We(),Pt())},[d,Rt,Pt,We]);const xt=((e,t,a,s,o,r)=>{Object(c.n)(()=>{a?(t(ps(a.content.text)),requestAnimationFrame(()=>{const e=document.getElementById(n.z);Object(ns.a)(e,!0)})):t("")},[a,t]);return Object(c.m)(()=>{const{text:t,entities:n}=Object(cs.a)(e.current);a&&(t||Object(l.fb)(a)?(r({messageId:a.id,text:t,entities:n}),s()):o())},[r,a,e,o,s])})(Me,Oe,i,Pt,Ue,$);((e,t,a,s,o,r,i,l,d)=>{const b=Object(c.m)((e,t)=>{o.current.length&&!i?l({chatId:e,threadId:t,draft:Object(cs.a)(o.current)}):d({chatId:e,threadId:t})},[d,i,o,l]),u=Object(c.p)(()=>Object(p.a)(e=>e(),n.y,!1),[t]),h=Object(ja.a)(t),O=Object(ja.a)(a);Object(c.n)(()=>(Is=t,vs=a,()=>{Is=void 0,vs=void 0,b(t,a)}),[t,a,b]),Object(c.n)(()=>{t===h&&a===O||e&&(r(ps(e)),m.n||requestAnimationFrame(()=>{const e=document.getElementById(n.z);Object(ns.a)(e,!0)}))},[t,a,e,r,b,h,O]);const j=Object(ja.a)(s);Object(c.n)(()=>{t&&a&&h===t&&O===a&&j!==s&&(s.length?u(()=>{Is===t&&vs===a&&b(t,a)}):b(t,a))},[t,s,h,j,O,u,a,b]);const g=Object(c.m)(()=>{t&&a&&b(t,a)},[t,a,b]);Object(re.a)(g),ie(g)})(O,d,u,he,Me,Oe,i,V,W),((e,t,a)=>{Object(c.n)(()=>{async function s(s){if(!s.clipboardData)return;const c=document.activeElement;if(c&&![n.z,n.A].includes(c.id))return;const{items:o}=s.clipboardData,r=Array.from(o).find(e=>fs.includes(e.type)),i=r&&r.getAsFile(),l=s.clipboardData.getData("text").substring(0,4096);if(i||l){if(s.preventDefault(),i&&!a){const e=await os(i.name,i,!0);t(t=>[...t,e])}l&&e(l,c?c.id:void 0)}}return document.addEventListener("paste",s,!1),()=>{document.removeEventListener("paste",s,!1)}},[e,a,t])})(Tt,ke,i);const Lt=Object(c.m)(async(e,t)=>{ke(await Promise.all(e.map(e=>os(e.name,e,t))))},[]),Dt=Object(c.m)(async(e,t)=>{ke([...Se,...await Promise.all(e.map(e=>os(e.name,e,t)))])},[Se]),Ft=Object(c.m)(()=>{ke([])},[]),Ut=Object(c.m)(async(e=!1,t)=>{if("connectionStateReady"!==g)return;let a=Se;if(Je){const e=await We();if(e){const{blob:t,duration:s,waveform:n}=e;a=[await os("wonderful-voice-message.ogg",t,!1,{voice:{duration:s,waveform:n}})]}}const{text:s,entities:c}=Object(cs.a)(Me.current);if(!a.length&&!s&&!C)return;if(a.length&&s&&s.length>1024){const e=s.length-1024;return void K({data:{message:"CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS",textParams:{"{EXTRA_CHARS_COUNT}":e,"{PLURAL_S}":e>1?"s":""},hasErrorKey:!0}})}const o=document.getElementById(n.z);if(a.length||s){if(Ct&&!yt){const e=Math.floor(Date.now()/1e3)+H,t=je.current&&Math.floor(e-je.current),a=Ct.nextSendDate&&Ct.nextSendDate>e;if(t&&t{Pt()})},[g,Se,Je,C,H,W,d,Pt,We,K,Ct,yt,z,Y,le]),Ht=Object(c.m)((e,a=!1)=>{e={...e,isPreloadedGlobally:!0},t?(Ce({sticker:e}),Ie()):(z({sticker:e}),requestAnimationFrame(()=>{Pt(a)}))},[t,Ie,z,Pt]),qt=Object(c.m)(e=>{t?(Ce({gif:e}),Ie()):(z({gif:e}),requestAnimationFrame(()=>{Pt(!0)}))},[t,Ie,z,Pt]),Gt=Object(c.m)(e=>{if("connectionStateReady"!==g)return;oe({id:e.id,queryId:e.queryId});const t=document.getElementById(n.z);m.e&&t===document.activeElement&&ls(t),W({chatId:d,localOnly:!0}),requestAnimationFrame(()=>{Pt()})},[d,W,g,Pt,oe]),_t=Object(c.m)(e=>{t?(Ce({poll:e}),Z(),Ie()):(z({poll:e}),Z())},[Z,Ie,z,t]),zt=Object(c.m)(()=>{t?(Ce({isSilent:!0}),Ie()):Ut(!0)},[Ut,Ie,t]),$t=Object(c.m)((e,t=!1)=>{const{isSilent:a,...s}=ye||{},n=Math.round(Math.max(e.getTime(),Date.now()+6e4)/1e3)+(t?0:H);ye&&0!==Object.keys(s).length?(z({...ye,scheduledAt:n}),requestAnimationFrame(()=>{Pt()})):Ut(!!a,n),ve()},[ve,Ut,Pt,ye,z,H]),Vt=Object(c.m)(()=>{$t(new Date(1e3*n.xb),!0)},[$t]),Wt=Object(c.m)(()=>{ve(),Ce(void 0)},[ve]),Kt=Object(c.m)(e=>{"stickers"===e?(Q({query:""}),J({query:void 0})):(J({query:""}),Q({query:void 0}))},[Q,J]),Qt=Object(c.m)(()=>{const e=document.getElementById(n.z);m.l&&e===document.activeElement?(e.blur(),setTimeout(()=>{Be()},100)):Be()},[Be]),Jt=Object(c.m)(()=>{ae({id:d,threadId:u,type:"scheduled"})},[ae,d,u]);Object(c.n)(()=>{v&&m.l&&De()},[v,De]),Object(c.n)(()=>{o&&(y?ze():setTimeout(()=>{$e()},200))},[y,$e,ze,o]);const Yt=Object(c.m)(()=>{switch(tt){case Zs.Send:t?(Je&&Ke(),Ie()):(Ut(),requestAnimationFrame(()=>{Pt()}));break;case Zs.Record:Ve();break;case Zs.Edit:xt()}},[tt,Pt,t,Ve,xt,Je,Ie,Ke,Ut]),Xt=tt===Zs.Record&&!vt.canAttachMedia,Zt=Object(ja.a)(i,!0),ea=i||Zt,ta=new Date;ta.setSeconds(0),ta.setMilliseconds(0);const aa=new Date;aa.setFullYear(aa.getFullYear()+1);let sa="SendMessage";switch(tt){case Zs.Edit:sa="Save edited message";break;case Zs.Record:sa=Xt?"Conversation.DefaultRestrictedMedia":"AccDescrVoiceMessage"}const na=Object(ne.a)("Composer",!y&&"shown",_e&&"hover-disabled"),ca=Object(ne.a)("mobile-symbol-menu-button",!o&&"not-ready",qe?Le&&"menu-opened":Le&&"is-loading"),oa=tt===Zs.Edit?xt:t?Ie:Ut;return c.a.createElement("div",{className:na},vt.canAttachMedia&&o&&c.a.createElement(Js.a,{containerId:"#middle-column-portals"},c.a.createElement(Ws,{isOpen:e!==Qe.a.None,withQuick:[e,ge].includes(Qe.a.QuickFile),onHide:r,onFileSelect:Lt})),c.a.createElement($s,{attachments:Se,caption:Se.length?he:"",groupChatMembers:T,currentUserId:P,usersById:R,recentEmojis:q,isReady:o,onCaptionUpdate:Oe,baseEmojiKeywords:F,emojiKeywords:U,addRecentEmoji:ce,onSend:t?Ie:Ut,onFileAppend:Dt,onClear:Ft}),c.a.createElement(Vs,{isOpen:Boolean(w),onClear:Z,onSend:_t}),c.a.createElement(Xs,{isOpen:Boolean(E),onClose:te}),c.a.createElement(en,{isOpen:Boolean(M),onClose:se}),ea&&c.a.createElement(Ns,{isOpen:Fe,isSchedule:"scheduled"===h,onClose:He,message:ea}),c.a.createElement(Ds,{isOpen:st,filter:nt,onClose:ct,onInsertUserName:ot,filteredUsers:rt,usersById:R}),c.a.createElement(Bs,{isOpen:it,botId:lt,allowedAttachmentOptions:vt,isGallery:dt,inlineBotResults:mt,switchPm:bt,onSelectResult:Gt,loadMore:jt,onClose:ht}),c.a.createElement("div",{id:"message-compose"},c.a.createElement("div",{className:"svg-appendix",ref:be}),c.a.createElement(zs,null),c.a.createElement(Qs,{chatId:d,threadId:u,messageText:Se.length?"":he,disabled:!vt.canAttachEmbedLinks}),c.a.createElement("div",{className:"message-input-wrapper"},m.l?c.a.createElement(fe.a,{className:ca,round:!0,color:"translucent",onClick:Le?De:Qt,ariaLabel:"Choose emoji, sticker or GIF"},c.a.createElement("i",{className:"icon-smile"}),c.a.createElement("i",{className:"icon-keyboard"}),Le&&!qe&&c.a.createElement(we.a,{color:"gray"})):c.a.createElement(Rs,{className:""+(Le?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:Be,ariaLabel:"Choose emoji, sticker or GIF"},c.a.createElement("i",{className:"icon-smile"})),c.a.createElement(Gs.a,{id:"message-input-text",html:Se.length?"":he,placeholder:Je&&Ee<=600?"":le("Message"),forcedPlaceholder:Ot,shouldSetFocus:Le,shouldSuppressFocus:m.l&&Le,shouldSuppressTextFormatter:Mt||st||it,onUpdate:Oe,onSend:oa,onSuppressedFocus:De}),_&&Boolean(lt)&&c.a.createElement(we.a,{color:"gray"}),k&&c.a.createElement(fe.a,{round:!0,faded:!0,className:"scheduled-button",color:"translucent",onClick:Jt,ariaLabel:"Open scheduled messages"},c.a.createElement("i",{className:"icon-schedule"})),S&&!Je&&!i&&c.a.createElement(Rs,{className:""+(Ne?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:Te,ariaLabel:"Open bot command keyboard"},c.a.createElement("i",{className:"icon-bot-command"})),!Je&&!i&&c.a.createElement(Rs,{className:""+(Pe?"activated":""),round:!0,faded:!0,color:"translucent",onActivate:Re,ariaLabel:"Add an attachment"},c.a.createElement("i",{className:"icon-attach"})),Je&&Ye&&c.a.createElement("span",{className:"recording-state"},Object(x.i)(Ye-et.current)),c.a.createElement(Us,{isOpen:wt,onStickerSelect:Ht}),c.a.createElement(Hs.a,{isOpen:Mt,emojis:kt,onClose:St,onEmojiSelect:Nt,addRecentEmoji:ce}),c.a.createElement(xs,{isOpen:Pe,allowedAttachmentOptions:vt,onFileSelect:Lt,onPollCreate:X,onClose:xe}),S&&c.a.createElement(qs,{messageId:S,isOpen:Ne,onClose:Ae}),c.a.createElement(Ls,{isOpen:Le,allowedAttachmentOptions:vt,onLoad:Ge,onClose:De,onEmojiSelect:Tt,onStickerSelect:Ht,onGifSelect:qt,onRemoveSymbol:At,onSearchOpen:Kt,addRecentEmoji:ce}))),Je&&c.a.createElement(fe.a,{round:!0,color:"danger",className:"cancel",onClick:We,ariaLabel:"Cancel voice recording"},c.a.createElement("i",{className:"icon-delete"})),c.a.createElement(fe.a,{ref:Ze,round:!0,color:"secondary",className:Object(ne.a)(tt,!o&&"not-ready",Je&&"recording"),disabled:Xt,ariaLabel:le(sa),onClick:Yt,onContextMenu:tt===Zs.Send&&at?ft:void 0},c.a.createElement("i",{className:"icon-send"}),c.a.createElement("i",{className:"icon-microphone-alt"}),c.a.createElement("i",{className:"icon-check"})),at&&c.a.createElement(Fs,{isOpen:gt,onSilentSend:I?void 0:zt,onScheduleSend:t?void 0:Ie,onClose:pt,onCloseAnimationEnd:It}),c.a.createElement(Ys,{isOpen:pe,withTimePicker:!0,selectedAt:ta.getTime(),maxAt:Object(x.k)(aa),isFutureMode:!0,secondButtonLabel:a?"Send When Online":void 0,onClose:Wt,onSubmit:$t,onSecondButtonClick:a?Vt:void 0}))}));var an=Object(c.h)(e=>{const{isActive:t}=e,a=Object(Pe.a)(Ae.a.Extra,"MobileSearch",!t,!0);return a?c.a.createElement(a,e):void 0});var sn=Object(c.h)(e=>{const{isActive:t}=e,a=Object(Pe.a)(Ae.a.Extra,"MessageSelectToolbar",!t);return a?c.a.createElement(a,e):void 0});var nn=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"UnpinAllMessagesModal",!t);return a?c.a.createElement(a,e):void 0});a(248);const cn=m.l?450+n.c:void 0;function on(e){return"file"===e.kind&&e.type&&n.n.has(e.type)}var rn=Object(c.h)(Object(s.h)(e=>{const t=Object(r.Db)(e),{isBlurred:a,background:s,backgroundColor:n,patternColor:c}=e.settings.themes[t]||{},{messageLists:o}=e.messages,i=Object(r.z)(e),{isLeftColumnShown:d,chats:{listIds:u}}=e,h={theme:t,customBackground:s,backgroundColor:n,patternColor:c,isLeftColumnShown:d,isRightColumnShown:Object(r.W)(e),isBackgroundBlurred:a,isMobileSearchActive:Boolean(m.l&&Object(r.B)(e)),isSelectModeActive:Object(r.S)(e),animationLevel:e.settings.byKey.animationLevel,currentTransitionKey:Math.max(0,e.messages.messageLists.length-1)};if(!i||!u.active)return h;const{chatId:O,threadId:j,type:g}=i,f=Object(r.g)(e,O),p=Object(r.kb)(e,O),{chatId:I,messageId:v}=e.audioPlayer,y=f&&Object(l.d)(f,j),C=Object(r.L)(e,O),w="pinned"===g,E="scheduled"===g;return{...h,chatId:O,threadId:j,messageListType:g,isPrivate:Object(l.ob)(O),canPost:!w&&(!f||y)&&!C,isPinnedMessageList:w,isScheduledMessageList:E,currentUserBannedRights:f&&f.currentUserBannedRights,defaultBannedRights:f&&f.defaultBannedRights,hasPinnedOrAudioMessage:j!==b.MAIN_THREAD_ID||Boolean(p&&p.length)||Boolean(I&&v),pinnedMessagesCount:p?p.length:0,shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations,messageLists:o}},(e,t)=>Object(h.l)(t,["openChat","unpinAllMessages","loadUser","closeLocalTextSearch","exitMessageSelectMode"]))(({chatId:e,threadId:t,messageListType:a,isPrivate:s,isPinnedMessageList:o,messageLists:r,canPost:i,currentUserBannedRights:d,defaultBannedRights:b,hasPinnedOrAudioMessage:u,pinnedMessagesCount:h,customBackground:O,theme:j,backgroundColor:g,patternColor:f,isLeftColumnShown:p,isRightColumnShown:I,isBackgroundBlurred:v,isMobileSearchActive:y,isSelectModeActive:C,animationLevel:w,shouldSkipHistoryAnimations:E,currentTransitionKey:M,openChat:S,unpinAllMessages:k,loadUser:N,closeLocalTextSearch:T,exitMessageSelectMode:A})=>{const{width:P}=Ze(),R=Object(me.a)(),[x,L]=Object(c.r)(Qe.a.None),[B,D]=Object(c.r)(),[F,U]=Object(c.r)(),[H,q]=Object(c.r)(!1),[G,_]=Object(c.r)(!m.l||w===n.f),z=u&&(Pn.lb&&P=n.kb&&Pe?Object(de.a)(()=>{S({id:void 0})}):void 0,[e,S]),Object(c.n)(()=>{L(Qe.a.None),D(void 0),U(void 0)},[e]),Object(c.n)(()=>{w===n.f&&_(!0)},[w]);Object(c.n)(()=>{s&&N({userId:e})},[e,s,N]);const Y=Object(c.m)(e=>{if(m.n)return;const{items:t}=e.dataTransfer||{},a=t&&Array.from(t).filter(e=>"text/uri-list"!==e.type).every(on);L(a?Qe.a.QuickFile:Qe.a.Document)},[]),X=Object(c.m)(()=>{L(Qe.a.None)},[]),Z=Object(c.m)(()=>{q(!0)},[]),ee=Object(c.m)(()=>{q(!1)},[]),te=Object(c.m)(()=>{k({chatId:e}),ee(),S({id:e})},[k,S,ee,e]),ae=Object(c.m)(()=>{S({id:e})},[S,e]),se=((e,t)=>{const[a,s]=Object(c.r)(t);return Object(c.n)(()=>{t&&(t.startsWith("#")?s(t):Je.c(n.o,e,Je.a.Blob).then(e=>{const t=URL.createObjectURL(e);Object(Ye.g)(t).then(()=>{s(`url(${t})`)})}))},[t,e]),t?a:void 0})(j,O),ce=Object(ne.a)(Q&&"has-header-tools",O&&"custom-bg-image",g&&"custom-bg-color",O&&v&&"blurred",m.q?"mask-image-disabled":"mask-image-enabled"),oe=Object(ne.a)("messaging-disabled",!C&&"shown"),re=Object(l.L)(R,d,b),{composerHiddenScale:ie,toolbarHiddenScale:le,composerTranslateX:ue,toolbarTranslateX:he,unpinHiddenScale:je,toolbarForUnpinHiddenScale:ge}=Object(c.p)(()=>tt(P,K),[K,P]),pe=Object(ne.a)("middle-column-footer",!K&&"no-composer",K&&F&&!C&&"with-notch");return Object(Oe.a)($&&V,()=>{S({id:void 0},!0)},void 0,void 0,void 0,r?r.map(at):[]),Object(Oe.a)(y,T),Object(Oe.a)(C,A),c.a.createElement("div",{id:"MiddleColumn",className:ce,onTransitionEnd:t=>{"transform"===t.propertyName&&t.target===t.currentTarget&&_(Boolean(e))},style:`\n --composer-hidden-scale: ${ie};\n --toolbar-hidden-scale: ${le};\n --unpin-hidden-scale: ${je};\n --toolbar-unpin-hidden-scale: ${ge};\n --composer-translate-x: ${ue}px;\n --toolbar-translate-x: ${he}px;\n --pattern-color: ${f};\n --theme-background-color:\n ${g||("dark"===j?n.p:n.R)};\n `,onClick:m.m&&p?ae:void 0},c.a.createElement("div",{id:"middle-column-bg",style:se?"--custom-background: "+se:void 0}),c.a.createElement("div",{id:"middle-column-portals"}),$&&V&&c.a.createElement(c.a.Fragment,null,c.a.createElement("div",{className:"messages-layout",onDragEnter:K?Y:void 0},c.a.createElement(wt,{chatId:$,threadId:V,messageListType:W,isReady:G}),c.a.createElement(be.a,{name:E?"none":w===n.e?"slide":"fade",activeKey:M,shouldCleanup:!0},()=>c.a.createElement(c.a.Fragment,null,c.a.createElement(as,{key:`${$}-${V}-${W}`,chatId:$,threadId:V,type:W,canPost:K,hasTools:Q,onFabToggle:D,onNotchToggle:U,isReady:G}),c.a.createElement("div",{className:pe},K&&c.a.createElement(tn,{chatId:$,threadId:V,messageListType:W,dropAreaState:x,onDropHide:X,isReady:G}),o&&c.a.createElement("div",{className:"unpin-button-container",dir:R.isRtl?"rtl":void 0},c.a.createElement(fe.a,{size:"tiny",fluid:!0,color:"secondary",className:"unpin-all-button",onClick:Z},c.a.createElement("i",{className:"icon-unpin"}),c.a.createElement("span",null,R("Chat.Pinned.UnpinAll",h,"i")))),!o&&!K&&re&&c.a.createElement("div",{className:oe},c.a.createElement("div",{className:"messaging-disabled-inner"},c.a.createElement("span",null,re))),c.a.createElement(sn,{messageListType:W,isActive:C,canPost:K})))),c.a.createElement(ss,{isShown:J,canPost:K})),m.l&&c.a.createElement(an,{isActive:Boolean(y)})),e&&c.a.createElement(nn,{isOpen:H,chatId:e,pinnedMessagesCount:h,onClose:ee,onUnpin:te}))}));a(249);const ln=Object(p.a)(e=>e(),200,!1);var dn;!function(e){e[e.Profile=0]="Profile",e[e.MemberList=1]="MemberList",e[e.SharedMedia=2]="SharedMedia",e[e.Search=3]="Search",e[e.Management=4]="Management",e[e.ManageInitial=5]="ManageInitial",e[e.ManageChannelSubscribers=6]="ManageChannelSubscribers",e[e.ManageChatAdministrators=7]="ManageChatAdministrators",e[e.ManageChatPrivacyType=8]="ManageChatPrivacyType",e[e.ManageDiscussion=9]="ManageDiscussion",e[e.ManageGroupPermissions=10]="ManageGroupPermissions",e[e.ManageGroupRemovedUsers=11]="ManageGroupRemovedUsers",e[e.ManageGroupUserPermissionsCreate=12]="ManageGroupUserPermissionsCreate",e[e.ManageGroupUserPermissions=13]="ManageGroupUserPermissions",e[e.ManageGroupRecentActions=14]="ManageGroupRecentActions",e[e.ManageGroupAdminRights=15]="ManageGroupAdminRights",e[e.ManageGroupMembers=16]="ManageGroupMembers",e[e.StickerSearch=17]="StickerSearch",e[e.GifSearch=18]="GifSearch",e[e.PollResults=19]="PollResults",e[e.AddingMembers=20]="AddingMembers"}(dn||(dn={}));var bn=Object(c.h)(Object(s.h)((e,{chatId:t,isProfile:a,isManagement:s})=>{const{query:n}=Object(r.B)(e)||{},{query:c}=Object(r.A)(e)||{},{query:o}=Object(r.t)(e)||{},i=t?Object(r.g)(e,t):void 0,d=i&&Object(l.mb)(i);return{canManage:Boolean(!s&&a&&i&&!Object(r.P)(e,i.id)&&(Object(l.ob)(i.id)||(Object(l.jb)(i)||i.isCreator)&&!i.isNotJoined)),isChannel:d,messageSearchQuery:n,stickerSearchQuery:c,gifSearchQuery:o}},(e,t)=>Object(h.l)(t,["setLocalTextSearchQuery","setStickerSearchQuery","setGifSearchQuery","searchTextMessagesLocal","toggleManagement","openHistoryCalendar"]))(({isColumnOpen:e,isProfile:t,isSearch:a,isManagement:s,isStickerSearch:n,isGifSearch:o,isPollResults:r,isAddingChatMembers:i,profileState:l,managementScreen:d,canManage:b,isChannel:h,onClose:O,messageSearchQuery:j,stickerSearchQuery:g,gifSearchQuery:f,setLocalTextSearchQuery:p,setStickerSearchQuery:I,setGifSearchQuery:v,searchTextMessagesLocal:y,toggleManagement:C,openHistoryCalendar:w,shouldSkipAnimation:E})=>{var M;const S=Object(c.q)(null),k=Object(c.m)(e=>{p({query:e}),e.length&&ln(y)},[y,p]),N=Object(c.m)(e=>{I({query:e})},[I]),T=Object(c.m)(e=>{v({query:e})},[v]),[A,P]=Object(c.r)(!e);Object(c.n)(()=>{setTimeout(()=>{P(!e)},300)},[e]);const R=Object(me.a)(),L=t?l===u.l.Profile?dn.Profile:l===u.l.SharedMedia?dn.SharedMedia:l===u.l.MemberList?dn.MemberList:-1:a?dn.Search:r?dn.PollResults:n?dn.StickerSearch:o?dn.GifSearch:i?dn.AddingMembers:s?d===u.g.Initial?dn.ManageInitial:d===u.g.ChatPrivacyType?dn.ManageChatPrivacyType:d===u.g.Discussion?dn.ManageDiscussion:d===u.g.ChannelSubscribers?dn.ManageChannelSubscribers:d===u.g.GroupPermissions?dn.ManageGroupPermissions:d===u.g.ChatAdministrators?dn.ManageChatAdministrators:d===u.g.GroupRemovedUsers?dn.ManageGroupRemovedUsers:d===u.g.GroupUserPermissionsCreate?dn.ManageGroupUserPermissionsCreate:d===u.g.GroupUserPermissions?dn.ManageGroupUserPermissions:d===u.g.GroupRecentActions?dn.ManageGroupRecentActions:d===u.g.ChatAdminRights?dn.ManageGroupAdminRights:d===u.g.GroupMembers?dn.ManageGroupMembers:void 0:void 0,B=null!==(M=Object(ct.a)(L,!0))&&void 0!==M?M:-1;function D(){if(-1!==B)switch(B){case dn.PollResults:return c.a.createElement("h3",null,R("PollResults"));case dn.Search:return c.a.createElement(c.a.Fragment,null,c.a.createElement(pe.a,{parentContainerClassName:"RightSearch",value:j,onChange:k}),c.a.createElement(fe.a,{round:!0,size:"smaller",color:"translucent",onClick:()=>w({selectedAt:Object(x.k)(Date.now())}),ariaLabel:"Search messages by date"},c.a.createElement("i",{className:"icon-calendar"})));case dn.AddingMembers:return c.a.createElement("h3",null,R("GroupAddMembers"));case dn.ManageInitial:return c.a.createElement("h3",null,R("Edit"));case dn.ManageChatPrivacyType:return c.a.createElement("h3",null,R(h?"ChannelTypeHeader":"GroupTypeHeader"));case dn.ManageDiscussion:return c.a.createElement("h3",null,R("Discussion"));case dn.ManageChatAdministrators:return c.a.createElement("h3",null,R("ChannelAdministrators"));case dn.ManageGroupRecentActions:return c.a.createElement("h3",null,R("Group.Info.AdminLog"));case dn.ManageGroupAdminRights:return c.a.createElement("h3",null,R("EditAdminRights"));case dn.ManageGroupPermissions:return c.a.createElement("h3",null,R("ChannelPermissions"));case dn.ManageGroupRemovedUsers:return c.a.createElement("h3",null,R("ChannelBlockedUsers"));case dn.ManageGroupUserPermissionsCreate:return c.a.createElement("h3",null,R("ChannelAddException"));case dn.ManageGroupUserPermissions:return c.a.createElement("h3",null,R("UserRestrictions"));case dn.StickerSearch:return c.a.createElement(pe.a,{value:g,placeholder:R("SearchStickersHint"),onChange:N});case dn.GifSearch:return c.a.createElement(pe.a,{value:f,placeholder:R("SearchGifsTitle"),onChange:T});case dn.SharedMedia:return c.a.createElement("h3",null,R("SharedMedia"));case dn.ManageChannelSubscribers:return c.a.createElement("h3",null,R("ChannelSubscribers"));case dn.MemberList:case dn.ManageGroupMembers:return c.a.createElement("h3",null,R("GroupMembers"));default:return c.a.createElement(c.a.Fragment,null,c.a.createElement("h3",null,"Profile"),c.a.createElement("section",{className:"tools"},b&&c.a.createElement(fe.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:R("Edit"),onClick:C},c.a.createElement("i",{className:"icon-edit"}))))}}const F=m.l||L===dn.SharedMedia||L===dn.MemberList||L===dn.AddingMembers||s,U=Object(ne.a)("animated-close-icon",(A||E)&&"no-transition");return Object(c.n)(()=>{S.current.classList.toggle("state-back",F)},[F]),c.a.createElement("div",{className:"RightHeader"},c.a.createElement(fe.a,{className:"close-button",round:!0,color:"translucent",size:"smaller",onClick:O,ariaLabel:R(F?"Common.Back":"Common.Close")},c.a.createElement("div",{ref:S,className:U})),c.a.createElement(be.a,{name:A||E?"none":"slide-fade",activeKey:B},D))})),un=a(131);function mn(e,t,a,s,o,r,i,d,b,u,m,h=0){const O="members"!==s&&o?o:s,j=Object(c.p)(()=>{if(r&&i)return Object(l.Jb)(r.map(({userId:e})=>e),i,void 0,h)},[r,h,i]),[g,f,p]=function(e,t,a,s){const[c,o]=Object(un.a)(a?t:void 0,s,void 0,n.cb),r=!c||!s||c[0]===s[0];return[c,o,!r]}(0,t,m,j),[I,v,y]=hn("media",O,a,m,d,b),[C,w,E]=hn("documents",O,a,m,d,b),[M,S,k]=hn("links",O,a,m,d,b),[N,T,A]=hn("audio",O,a,m,d,b);let P,R,x=!1;switch(O){case"members":P=g,R=f,x=p;break;case"media":P=I,R=v,x=y;break;case"documents":P=C,R=w,x=E;break;case"links":P=M,R=S,x=k;break;case"audio":P=N,R=T,x=A}return[O,P,R,x]}function hn(e,t,a,s,o,r){const i=Object(c.q)();Object(le.a)(()=>{t===e&&o&&r&&(i.current=Object(l.w)(o,r,e).reverse())},[o,r,t,e]);const[d,b]=Object(un.a)(s?a:void 0,i.current,void 0,"media"===e?n.Ab:n.ib);return[d,b,!(!d||!i.current||d[0]===i.current[0])]}const On=Object(p.h)(e=>e(),250,!1);let jn=!1;var gn=a(115),fn=a(108);var pn=a(137),In=a(197);a(250);var vn=Object(c.h)(({chat:e,user:t,photo:a,isFirstPhoto:s,isSavedMessages:n,lastSyncTime:o,onClick:r})=>{const i=Object(me.a)(),d=t&&Object(l.sb)(t);function u(s="big",c){if(a&&!c)return`photo${a.id}?size=c`;let o;return n||d||(t?o=Object(l.e)(t,s):e&&(o=Object(l.e)(e,s))),o}const m=u(),h=Object(mt.a)(m,!1,b.ApiMediaFormat.BlobUrl,o),O=Object(mt.a)(!h&&s?u("normal",!0):void 0,!1,b.ApiMediaFormat.BlobUrl,o),j=Object(In.a)(!h&&a&&a.thumbnail&&a.thumbnail.dataUri),g=h||O||j,f=Object(ja.a)(g);let p="";if(n)p=c.a.createElement("i",{className:"icon-avatar-saved-messages"});else if(d)p=c.a.createElement("i",{className:"icon-avatar-deleted-account"});else if(g)p=c.a.createElement("img",{src:g,className:"avatar-media",alt:"",decoding:"async"});else if(!g&&t){const e=Object(l.bb)(t);p=e?Object(ot.c)(e,2):void 0}else if(!g&&e){const t=Object(l.k)(i,e);p=t&&Object(ot.c)(t,Object(l.ob)(e.id)?2:1)}else p=c.a.createElement("div",{className:"spinner-wrapper"},c.a.createElement(we.a,{color:"white"}));const I=Object(ne.a)("ProfilePhoto","color-bg-"+Object(l.Z)(t||e),n&&"saved-messages",d&&"deleted-account",!n&&!g&&"no-photo");return c.a.createElement("div",{className:I,onClick:g?r:void 0},f&&g&&f!==g&&c.a.createElement("img",{src:f,className:"prev-avatar-media",alt:"",decoding:"async"}),"string"==typeof p?Object(ut.a)(p,["hq_emoji"]):p)});a(251);var yn=Object(c.h)(Object(s.h)((e,{userId:t,forceShowSelf:a})=>{const{lastSyncTime:s,serverTimeOffset:n}=e,c=Object(r.Jb)(e,t),o=Object(r.g)(e,t),i=!a&&c&&c.isSelf,{animationLevel:l}=e.settings.byKey;return{lastSyncTime:s,user:c,chat:o,isSavedMessages:i,animationLevel:l,serverTimeOffset:n}},(e,t)=>Object(h.l)(t,["loadFullUser","openMediaViewer"]))(({user:e,chat:t,isSavedMessages:a,lastSyncTime:s,animationLevel:n,loadFullUser:o,openMediaViewer:r,serverTimeOffset:i})=>{const{id:d}=e||{},{id:h}=t||{},O=e?Object(l.bb)(e):t?t.title:"",j=(e?e.photos:t?t.photos:void 0)||[],g=n>=1?"slide":"none",[f,p]=Object(c.r)(0),I=a||j.length<=1||0===f,v=a||j.length<=1||f===j.length-1;Object(c.n)(()=>{f>j.length&&p(Math.max(0,j.length-1))},[f,j.length]);const y=Object(me.a)();Object(c.n)(()=>{s&&d&&o({userId:d})},[d,o,s]),function(e,t,a){Object(c.n)(()=>{t.slice(a,a+4).forEach(e=>{vt.c(`photo${e.id}?size=c`)||vt.b(`photo${e.id}?size=c`,b.ApiMediaFormat.BlobUrl)})},[a,t])}(0,j,f);const C=Object(c.m)(()=>{r({avatarOwnerId:d||h,profilePhotoIndex:f,origin:u.h.ProfileAvatar})},[r,d,h,f]),w=Object(c.m)(()=>{I||p(f-1)},[f,I]),E=Object(c.m)(()=>{v||p(f+1)},[f,v]);if(Object(c.n)(()=>{const e=document.querySelector(".photo-wrapper");if(e)return Object(Me.b)(e,{onSwipe:m.n?(e,t)=>{t===Me.a.Right?w():t===Me.a.Left&&E()}:void 0})},[E,w]),!e&&!t)return;function M(){const s=!a&&j&&j.length>0?j[f]:void 0;return c.a.createElement(vn,{key:f,user:e,chat:t,photo:s,isSavedMessages:a,isFirstPhoto:I,onClick:C})}const S=e&&e.isVerified||t&&t.isVerified;return c.a.createElement("div",{className:"ProfileInfo",dir:y.isRtl?"rtl":void 0},c.a.createElement("div",{className:"photo-wrapper"},function(){if(!(a||!j||j.length<=1))return c.a.createElement("div",{className:"photo-dashes"},j.map((e,t)=>c.a.createElement("span",{className:"photo-dash "+(t===f?"current":"")})))}(),c.a.createElement(be.a,{activeKey:f,name:g,className:"profile-slide-container"},M),!I&&c.a.createElement("button",{type:"button",className:"navigation prev","aria-label":y("AccDescrPrevious"),onClick:w}),!v&&c.a.createElement("button",{type:"button",className:"navigation next","aria-label":y("Next"),onClick:E})),c.a.createElement("div",{className:"info",dir:y.isRtl?"rtl":"auto"},a?c.a.createElement("div",{className:"title"},c.a.createElement("h3",{dir:"auto"},y("SavedMessages"))):c.a.createElement("div",{className:"title"},c.a.createElement("h3",{dir:"auto"},O&&Object(ut.a)(O)),S&&c.a.createElement(pn.a,null)),!a&&(e?c.a.createElement("div",{className:"status "+(Object(l.Cb)(e)?"online":"")},c.a.createElement("span",{className:"user-status",dir:"auto"},Object(l.cb)(y,e,i))):c.a.createElement("span",{className:"status",dir:"auto"},Object(l.mb)(t)?y("Subscribers",t.membersCount,"i"):y("Members",t.membersCount,"i")))))})),Cn=a(168);var wn=Object(c.h)(Object(s.h)((e,{chatOrUserId:t})=>{const{lastSyncTime:a}=e,s=t?Object(r.g)(e,t):void 0,n=Object(l.ob)(t)?Object(r.Jb)(e,t):void 0,c=s&&Object(l.Hb)(s,Object(r.fb)(e),Object(r.eb)(e));return{lastSyncTime:a,chat:s,user:n,canInviteUsers:s&&!n&&(!Object(l.mb)(s)&&!Object(l.Db)(s,"inviteUsers")||Object(l.p)(s,"inviteUsers")),isMuted:c}},(e,t)=>Object(h.l)(t,["loadFullUser","updateChatMutedState","showNotification"]))(({lastSyncTime:e,user:t,chat:a,forceShowSelf:s,canInviteUsers:n,isMuted:o,loadFullUser:r,showNotification:i,updateChatMutedState:d})=>{const{id:b,fullInfo:u,username:m,phoneNumber:h,isSelf:O}=t||{},{id:j}=a||{},g=Object(me.a)();Object(c.n)(()=>{e&&b&&r({userId:b})},[r,b,e]);const f=Object(c.m)(()=>{d({chatId:j,isMuted:!o})},[j,o,d]);if(!a||a.isRestricted||O&&!s)return;function p(e,t){Object(Cn.c)(e),i({message:t+" was copied"})}const I=h&&Object(ka.c)(h),v=Object(l.g)(a),y=u&&u.bio||Object(l.f)(a);return c.a.createElement("div",{className:"ChatExtra"},I&&!!I.length&&c.a.createElement(fn.a,{icon:"phone",multiline:!0,narrow:!0,ripple:!0,onClick:()=>p(I,g("Phone"))},c.a.createElement("span",{className:"title",dir:"auto"},I),c.a.createElement("span",{className:"subtitle"},g("Phone"))),m&&c.a.createElement(fn.a,{icon:"mention",multiline:!0,narrow:!0,ripple:!0,onClick:()=>p("@"+m,g("Username"))},c.a.createElement("span",{className:"title",dir:"auto"},Object(ut.a)(m)),c.a.createElement("span",{className:"subtitle"},g("Username"))),y&&!!y.length&&c.a.createElement(fn.a,{icon:"info",multiline:!0,narrow:!0,isStatic:!0},c.a.createElement("span",{className:"title",dir:"auto"},Object(ut.a)(y,["br","links","emoji"])),c.a.createElement("span",{className:"subtitle"},g(b?"UserBio":"Info"))),(n||!m)&&v&&c.a.createElement(fn.a,{icon:"mention",multiline:!0,narrow:!0,ripple:!0,onClick:()=>p(v,g("SetUrlPlaceholder"))},c.a.createElement("div",{className:"title"},v),c.a.createElement("span",{className:"subtitle"},g("SetUrlPlaceholder"))),c.a.createElement(fn.a,{icon:"unmute",ripple:!0,onClick:f},c.a.createElement("span",null,g("Notifications")),c.a.createElement(ve,{id:"group-notifications",label:b?"Toggle User Notifications":"Toggle Chat Notifications",checked:!o,inactive:!0})))})),En=a(169),Mn=a(191),Sn=a(121),kn=a(116),Nn=a(112);var Tn=Object(c.h)(Object(s.h)((e,{userId:t})=>{const a=Object(r.s)(e),s=t&&Object(r.Jb)(e,t);return{chat:a,contactName:s?Object(l.ab)(s):void 0}},(e,t)=>Object(h.l)(t,["deleteChatMember"]))(({isOpen:e,chat:t,userId:a,contactName:s,onClose:n,deleteChatMember:o})=>{const r=Object(me.a)(),i=Object(c.m)(()=>{o({chatId:t.id,userId:a}),n()},[t,o,n,a]);if(t&&a)return c.a.createElement(Nn.a,{isOpen:e,onClose:n,onEnter:i,className:"delete",title:r("GroupRemoved.Remove")},c.a.createElement("p",null,Object(ut.a)(r("PeerInfo.Confirm.RemovePeer",s))),c.a.createElement(fe.a,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:i},r("lng_box_remove")),c.a.createElement(fe.a,{className:"confirm-dialog-button",isText:!0,onClick:n},r("Cancel")))}));a(256);const An=[{type:"media",title:"SharedMediaTab2"},{type:"documents",title:"SharedFilesTab2"},{type:"links",title:"SharedLinksTab2"},{type:"audio",title:"SharedMusicTab2"}];function Pn(e){return[`.shared-media-transition > div:only-child > .${e}-list > .scroll-item`,`.shared-media-transition > div.active > .${e}-list > .scroll-item`].join(", ")}var Rn=Object(c.h)(Object(s.h)((e,{chatId:t,userId:a})=>{const s=Object(r.g)(e,t),n=Object(r.n)(e,a||t),{currentType:c,resultsByType:o}=Object(r.w)(e)||{},{foundIds:i}=o&&c&&o[c]||{},{byId:d}=e.users,b=s&&Object(l.nb)(s),u=s&&Object(l.mb)(s),m=b||u&&Object(l.jb)(s),h=s&&s.fullInfo&&s.fullInfo.members,O=m&&s&&s.fullInfo&&!s.fullInfo.canViewMembers,j=m&&s&&(Object(l.p)(s,"inviteUsers")||s.isCreator),g=m&&s&&(Object(l.p)(s,"banUsers")||s.isCreator);let f;return a?f=a:Object(l.ob)(t)&&(f=t),{theme:Object(r.Db)(e),isChannel:u,resolvedUserId:f,chatMessages:n,foundIds:i,mediaSearchType:c,hasMembersTab:m,areMembersHidden:O,canAddMembers:j,canDeleteMembers:g,currentUserId:e.currentUserId,isRightColumnShown:Object(r.W)(e),isRestricted:s&&s.isRestricted,lastSyncTime:e.lastSyncTime,serverTimeOffset:e.serverTimeOffset,...m&&h&&{members:h,usersById:d}}},(e,t)=>Object(h.l)(t,["setLocalMediaSearchType","loadMoreMembers","searchMediaMessagesLocal","openMediaViewer","openAudioPlayer","openUserInfo","focusMessage","loadProfilePhotos","setNewChatMembersDialogState"]))(({chatId:e,profileState:t,onProfileStateChange:a,theme:s,isChannel:o,resolvedUserId:r,currentUserId:i,chatMessages:l,foundIds:d,mediaSearchType:h,hasMembersTab:O,areMembersHidden:j,canAddMembers:g,canDeleteMembers:f,members:p,usersById:I,isRightColumnShown:v,isRestricted:y,lastSyncTime:C,setLocalMediaSearchType:w,loadMoreMembers:E,searchMediaMessagesLocal:M,openMediaViewer:S,openAudioPlayer:k,openUserInfo:N,focusMessage:T,loadProfilePhotos:A,setNewChatMembersDialogState:P,serverTimeOffset:R})=>{const x=Object(c.q)(null),L=Object(c.q)(null),B=Object(me.a)(),[D,F]=Object(c.r)(0),[U,H]=Object(c.r)(),q=Object(c.p)(()=>[...O?[{type:"members",title:o?"ChannelSubscribers":"GroupMembers"}]:[],...An],[O,o]),G=q[D].type,[_,z,$,V]=mn(0,E,M,G,h,p,I,l,d,0,C,R),W=q.findIndex(({type:e})=>e===_),{handleScroll:K}=function(e,t,a,s){Object(Mt.a)(([a])=>{if(a&&a!==t){const a=e.current,n=a.querySelector(".TabList");a.scrollTop{jn=!1},350))}},[t,s]),Object(Mt.a)(([t])=>{if(a!==u.l.Profile||a===t)return;const n=e.current;if(!n)return;const c=n.querySelector(".TabList");!c||c.offsetTop>n.scrollTop||(jn=!0,Object(Pt.a)(n,n.firstElementChild,"start",void 0,2*n.offsetHeight),setTimeout(()=>{jn=!1},350),s(a))},[a]);const n=Object(c.m)(()=>{const a=e.current;if(!a)return;const n=a.querySelector(".TabList");if(!n)return;let c=u.l.Profile;a.scrollTop>=n.offsetTop&&(c="members"===t?u.l.MemberList:u.l.SharedMedia),s(c)},[e,s,t]);return Object(c.n)(()=>{jn||n()},[n,t]),{handleScroll:Object(c.m)(()=>{jn||On(n)},[n])}}(x,G,t,a),{applyTransitionFix:Q,releaseTransitionFix:J}=function(e,t=".Transition.shared-media-transition"){return Object(c.n)(()=>{function a(){const a=e.current,s=a.querySelector(t),n=a.querySelector(".TabList");s&&n&&(s.style.minHeight=a.offsetHeight-n.offsetHeight+"px")}return a(),window.addEventListener("resize",a,!1),()=>{window.removeEventListener("resize",a,!1)}},[e,t]),{applyTransitionFix:Object(c.m)(()=>{const t=e.current;if("hidden"!==t.style.overflowY){const e=t.offsetWidth-t.clientWidth;t.style.overflowY="hidden",t.style.marginRight=e+"px"}},[e]),releaseTransitionFix:Object(c.m)(()=>{const t=e.current;t.style.overflowY="scroll",t.style.marginRight="0"},[e])}}(x),[Y,X]=(()=>{const[e,t]=Object(c.r)(!1);return[e,Object(c.m)(()=>{t(e=>!e)},[])]})(),Z=Object(c.m)(()=>{J(),X()},[J,X]),ee=Object(c.m)(()=>{P(u.i.InProgress)},[P]);Object(c.n)(()=>{w({mediaType:G})},[w,G]);const te=r||e;Object(c.n)(()=>{C&&A({profileId:te})},[A,te,C]);const ae=Object(c.m)(e=>{S({chatId:te,threadId:b.MAIN_THREAD_ID,messageId:e,origin:u.h.SharedMedia})},[te,S]),se=Object(c.m)(e=>{k({chatId:te,messageId:e})},[te,k]),ne=Object(c.m)(e=>{N({id:e})},[N]),ce=Object(c.m)(e=>{T({chatId:te,messageId:e})},[te,T]),oe=Object(c.m)(()=>{H(void 0)},[]);let re;Object(c.n)(()=>{if(L.current&&m.n)return Object(Me.b)(L.current,{onSwipe:(e,t)=>{t===Me.a.Left?F(Math.min(D+1,q.length-1)):t===Me.a.Right&&F(Math.max(0,D-1))}})},[D,q.length]);const ie="members"===_||!O&&"media"===_;ie?re=v?0:1e3:z||(re=n.Bb);const le=Object(_s.a)([e,_],re);function de(e){return e!==i&&f?[{title:B("lng_context_remove_from_group"),icon:"stop",handler:()=>{H(e)}}]:void 0}function ue(){if(!z||!le||!l){const e=ie&&z&&!le;return c.a.createElement("div",{className:"content empty-list"},!e&&c.a.createElement(we.a,null))}if(!z.length){let e;switch(_){case"members":e=j?"You have no access to group members list.":"No members found";break;case"documents":e=B("lng_media_file_empty_search");break;case"links":e=B("lng_media_link_empty_search");break;case"audio":e=B("lng_media_song_empty_search");break;default:e=B("SharedMedia.EmptyTitle")}return c.a.createElement("div",{className:"content empty-list"},c.a.createElement(Sn.a,{text:e}))}return c.a.createElement("div",{className:`content ${_}-list`,dir:B.isRtl&&"media"===_?"rtl":void 0,teactFastList:!0},"media"===_?z.map(e=>l[e]&&c.a.createElement(En.a,{key:e,message:l[e],onClick:ae})):"documents"===_?z.map(e=>l[e]&&c.a.createElement(na.a,{key:e,message:l[e],withDate:!0,smaller:!0,className:"scroll-item",onDateClick:ce})):"links"===_?z.map(e=>l[e]&&c.a.createElement(Mn.a,{key:e,message:l[e],onMessageClick:ce})):"audio"===_?z.map(e=>l[e]&&c.a.createElement(ca.a,{key:e,theme:s,message:l[e],target:"sharedMedia",date:l[e].date,lastSyncTime:C,className:"scroll-item",onPlay:se,onDateClick:ce})):"members"===_?z.map((e,t)=>c.a.createElement(fn.a,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>ne(e),contextActions:de(e)},c.a.createElement(rt.a,{userId:e,forceShowSelf:!0}))):void 0)}return c.a.createElement(gn.a,{ref:x,className:"Profile custom-scroll",itemSelector:Pn(_),items:le?z:void 0,cacheBuster:Y,sensitiveArea:n.qb,preloadBackwards:le?"members"===_?n.cb:n.Ab:0,noScrollRestoreOnTop:!0,noFastList:!0,onLoadMore:$,onScroll:K},!V&&function(e,t){return c.a.createElement("div",{className:"profile-info"},c.a.createElement(yn,{userId:t||e,forceShowSelf:t!==e}),c.a.createElement(wn,{chatOrUserId:t||e,forceShowSelf:t!==e}))}(e,r),!y&&c.a.createElement("div",{className:"shared-media"},c.a.createElement(be.a,{ref:L,name:B.isRtl?"slide-reversed":"slide",activeKey:W,renderCount:q.length,shouldRestoreHeight:!0,className:"shared-media-transition",onStart:Q,onStop:Z},ue),c.a.createElement(ke.a,{big:!0,activeTab:D,tabs:q,onSwitchTab:F})),g&&c.a.createElement(kn.a,{isShown:"members"===_,onClick:ee,ariaLabel:B("lng_channel_add_users")},c.a.createElement("i",{className:"icon-add-user-filled"})),f&&c.a.createElement(Tn,{isOpen:Boolean(U),userId:U,onClose:oe}))}));var xn=Object(c.h)(e=>{const t=Object(Pe.a)(Ae.a.Extra,"RightSearch");return t?c.a.createElement(t,e):c.a.createElement(Re.a,null)});var Ln=Object(c.h)(e=>{const t=Object(Pe.a)(Ae.a.Extra,"Management");return t?c.a.createElement(t,e):c.a.createElement(Re.a,null)});var Bn=Object(c.h)(()=>{const e=Object(Pe.a)(Ae.a.Extra,"StickerSearch");return e?c.a.createElement(e,null):c.a.createElement(Re.a,null)});var Dn=Object(c.h)(()=>{const e=Object(Pe.a)(Ae.a.Extra,"GifSearch");return e?c.a.createElement(e,null):c.a.createElement(Re.a,null)});var Fn=Object(c.h)(()=>{const e=Object(Pe.a)(Ae.a.Extra,"PollResults");return e?c.a.createElement(e,null):c.a.createElement(Re.a,null)}),Un=a(170);a(257);var Hn=Object(c.h)(Object(s.h)((e,{chatId:t})=>{const a=Object(r.g)(e,t),{userIds:s}=e.contactList||{},{byId:n}=e.users,{byId:c}=e.chats,{currentUserId:o,newChatMembersProgress:i,connectionState:d}=e,b=a&&Object(l.mb)(a),{query:m,fetchingStatus:h,globalUserIds:O,localUserIds:j}=e.userSearch;return{isChannel:b,members:a&&a.fullInfo?a.fullInfo.members:void 0,currentUserId:o,usersById:n,chatsById:c,localContactIds:s,searchQuery:m,isSearching:h,isLoading:i===u.i.Loading,globalUserIds:O,localUserIds:j,connectionState:d}},(e,t)=>Object(h.l)(t,["loadContactList","setUserSearchQuery"]))(({isChannel:e,connectionState:t,members:a,onNextStep:s,currentUserId:n,usersById:o,chatsById:r,localContactIds:i,isLoading:d,searchQuery:b,isSearching:u,localUserIds:m,globalUserIds:O,setUserSearchQuery:j,onClose:g,isActive:f,loadContactList:p})=>{const I=Object(me.a)(),[v,y]=Object(c.r)([]),C=Object(ja.a)(v)===v;Object(c.n)(()=>{f&&"connectionStateReady"===t&&p()},[t,f,p]),Object(Oe.a)(f,g);const w=Object(c.p)(()=>a?a.map(e=>e.userId):[],[a]),E=Object(c.m)(e=>{j({query:e})},[j]),M=Object(c.p)(()=>{const t=i?Object(l.Ib)(i.filter(e=>e!==n),r):[];if(!b)return t.filter(e=>!w.includes(e));const a=t.filter(e=>{const t=o[e];if(!t)return!1;const a=Object(l.bb)(t);return a&&Object(A.a)(a,b)});return Object(l.Ib)(Object(h.o)([...a,...m||[],...O||[]]).filter(t=>{const a=o[t];return!w.includes(t)&&(!a||!Object(l.Bb)(a)||!e&&a.canBeInvitedToGroup)}),r)},[i,r,b,m,O,n,o,w,e]),S=Object(c.m)(()=>{v.length&&(j({query:""}),s(v))},[v,j,s]);return c.a.createElement("div",{className:"AddChatMembers"},c.a.createElement("div",{className:"AddChatMembers-inner"},c.a.createElement(Un.a,{itemIds:M,selectedIds:v,filterValue:b,filterPlaceholder:I("lng_channel_add_users"),searchInputId:"new-members-picker-search",isLoading:u,onSelectedIdsChange:y,onFilterChange:E,noScrollRestore:C}),c.a.createElement(kn.a,{isShown:Boolean(v.length),disabled:d,ariaLabel:I("lng_channel_add_users"),onClick:S},d?c.a.createElement(we.a,{color:"white"}):c.a.createElement("i",{className:"icon-arrow-right"}))))}));a(258);const qn=Object.keys(u.m).length/2,Gn=Object.keys(u.g).length/2;function _n(){const e=document.querySelector(".RightHeader .SearchInput input");e&&e.blur()}var zn=Object(c.h)(Object(s.h)(e=>{const{chatId:t,threadId:a}=Object(r.z)(e)||{},s=Object(r.d)(e);return{contentKey:Object(r.pb)(e),chatId:t,threadId:a,currentProfileUserId:e.users.selectedId,isChatSelected:Boolean(t&&s),shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations}},(e,t)=>Object(h.l)(t,["openUserInfo","toggleChatInfo","toggleManagement","closeLocalTextSearch","setStickerSearchQuery","setGifSearchQuery","closePollResults","addChatMembers","setNewChatMembersDialogState"]))(({contentKey:e,chatId:t,threadId:a,currentProfileUserId:s,isChatSelected:o,toggleChatInfo:r,toggleManagement:i,openUserInfo:l,closeLocalTextSearch:d,setStickerSearchQuery:b,setGifSearchQuery:m,closePollResults:h,addChatMembers:O,setNewChatMembersDialogState:j,shouldSkipHistoryAnimations:g})=>{var f;const{width:p}=Ze(),[I,v]=Object(c.r)(u.l.Profile),[y,C]=Object(c.r)(u.g.Initial),[w,E]=Object(c.r)(),[M,S]=Object(c.r)(),k=I!==u.l.Profile,N=void 0!==e,T=e===u.m.ChatInfo||e===u.m.UserInfo,A=e===u.m.Search,P=e===u.m.Management,R=e===u.m.StickerSearch,x=e===u.m.GifSearch,L=e===u.m.PollResults,B=e===u.m.AddingMembers,D=p<=n.lb,[F,U]=Object(c.r)(!N),H=null!==(f=Object(ct.a)(e,!0,!o))&&void 0!==f?f:-1,q=Object(c.m)((t=!0)=>{switch(e){case u.m.AddingMembers:j(u.i.Closed);break;case u.m.ChatInfo:if(k&&t){v(u.l.Profile);break}r(void 0,!0);break;case u.m.UserInfo:if(k&&t){v(u.l.Profile);break}l({id:void 0},!0);break;case u.m.Management:switch(y){case u.g.Initial:i();break;case u.g.ChatPrivacyType:case u.g.Discussion:case u.g.GroupPermissions:case u.g.GroupType:case u.g.ChatAdministrators:case u.g.ChannelSubscribers:case u.g.GroupMembers:C(u.g.Initial);break;case u.g.GroupUserPermissionsCreate:case u.g.GroupRemovedUsers:case u.g.GroupUserPermissions:C(u.g.GroupPermissions),E(void 0),S(void 0);break;case u.g.ChatAdminRights:case u.g.GroupRecentActions:C(u.g.ChatAdministrators)}break;case u.m.Search:_n(),d();break;case u.m.StickerSearch:_n(),b({query:void 0});break;case u.m.GifSearch:_n(),m({query:void 0});break;case u.m.PollResults:h()}},[e,k,r,l,h,j,y,i,d,b,m]),G=Object(c.m)((e,t)=>{E(e),S(t)},[]),_=Object(c.m)(e=>{O({chatId:t,memberIds:e})},[O,t]);function z(e){if(-1!==H)switch(H){case u.m.AddingMembers:return c.a.createElement(Hn,{chatId:t,onNextStep:_,isActive:N&&e,onClose:q});case u.m.ChatInfo:case u.m.UserInfo:return c.a.createElement(Rn,{key:s||t,chatId:t,userId:s,profileState:I,onProfileStateChange:v});case u.m.Search:return c.a.createElement(xn,{chatId:t,threadId:a,onClose:q,isActive:N&&e});case u.m.Management:return c.a.createElement(Ln,{chatId:t,currentScreen:y,isPromotedByCurrentUser:M,selectedChatMemberId:w,onScreenSelect:C,onChatMemberSelect:G,isActive:N&&e,onClose:q});case u.m.StickerSearch:return c.a.createElement(Bn,{onClose:q,isActive:N&&e});case u.m.GifSearch:return c.a.createElement(Dn,{onClose:q,isActive:N&&e});case u.m.PollResults:return c.a.createElement(Fn,{onClose:q,isActive:N&&e})}}return Object(c.n)(()=>N?Object(de.a)(q):void 0,[N,q]),Object(c.n)(()=>{setTimeout(()=>{U(!N)},300)},[N]),Object(c.n)(()=>{N&&D&&q()},[D]),Object(Et.a)(([a,s])=>{(a===u.m.ChatInfo&&e===u.m.UserInfo||a===u.m.UserInfo&&e===u.m.ChatInfo||s!==t)&&(v(u.l.Profile),C(u.g.Initial))},[e,t]),Object(Oe.a)(o&&(e===u.m.ChatInfo||e===u.m.UserInfo||e===u.m.Management||e===u.m.AddingMembers),()=>q(!1),r),c.a.createElement("div",{id:"RightColumn-wrapper",className:o?void 0:"is-hidden"},D&&c.a.createElement("div",{className:"overlay-backdrop",onClick:q}),c.a.createElement("div",{id:"RightColumn"},c.a.createElement(bn,{chatId:t,isColumnOpen:N,isProfile:T,isSearch:A,isManagement:P,isStickerSearch:R,isGifSearch:x,isPollResults:L,isAddingChatMembers:B,profileState:I,managementScreen:y,onClose:q,shouldSkipAnimation:F||g}),c.a.createElement(be.a,{name:F||g?"none":"zoom-fade",renderCount:qn+Gn,activeKey:P?qn+y:H,shouldCleanup:!0,cleanupExceptionKey:u.m.ChatInfo},z)))}));var $n=Object(c.h)(({isOpen:e})=>{const t=Object(Pe.a)(Ae.a.Extra,"MediaViewer",!e);return t?c.a.createElement(t,null):void 0});var Vn=Object(c.h)(({isOpen:e})=>{const t=Object(Pe.a)(Ae.a.Extra,"Notifications",!e);return t?c.a.createElement(t,null):void 0});var Wn=Object(c.h)(({isOpen:e})=>{const t=Object(Pe.a)(Ae.a.Extra,"Dialogs",!e);return t?c.a.createElement(t,null):void 0});var Kn=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"ForwardPicker",!t);return a?c.a.createElement(a,e):void 0});var Qn=Object(c.h)(e=>{const{url:t}=e,a=Object(Pe.a)(Ae.a.Extra,"SafeLinkModal",!t);return a?c.a.createElement(a,e):void 0});var Jn=Object(c.h)(e=>{const{isOpen:t}=e,a=Object(Pe.a)(Ae.a.Extra,"HistoryCalendar",!t);return a?c.a.createElement(a,e):void 0});a(259);let Yn,Xn=!1;function Zn(e){document.querySelectorAll('link[rel="icon"]').forEach(t=>{e?t.href.includes("favicon-unread")||(t.href=t.href.replace("favicon","favicon-unread")):t.href=t.href.replace("favicon-unread","favicon")})}function ec(e){document.title!==e&&(document.title=e)}var tc=Object(c.h)(Object(s.h)(e=>{const{chatId:t,messageId:a}=e.audioPlayer,s=t&&a?Object(r.l)(e,t,a):void 0;return{animationLevel:e.settings.byKey.animationLevel,lastSyncTime:e.lastSyncTime,isLeftColumnShown:e.isLeftColumnShown,isRightColumnShown:Object(r.W)(e),isMediaViewerOpen:Object(r.T)(e),isForwardModalOpen:Object(r.R)(e),hasNotifications:Boolean(e.notifications.length),hasDialogs:Boolean(e.dialogs.length),audioMessage:s,safeLinkModalUrl:e.safeLinkModalUrl,isHistoryCalendarOpen:Boolean(e.historyCalendarSelectedAt),shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations,language:e.settings.byKey.language}},(e,t)=>Object(h.l)(t,["loadAnimatedEmojis","loadNotificationSettings","loadNotificationExceptions","updateIsOnline","loadTopInlineBots","loadEmojiKeywords"]))(({lastSyncTime:e,isLeftColumnShown:t,isRightColumnShown:a,isMediaViewerOpen:o,isForwardModalOpen:i,animationLevel:l,hasNotifications:d,hasDialogs:b,audioMessage:u,safeLinkModalUrl:m,isHistoryCalendarOpen:h,shouldSkipHistoryAnimations:O,language:j,loadAnimatedEmojis:g,loadNotificationSettings:f,loadNotificationExceptions:I,updateIsOnline:v,loadTopInlineBots:y,loadEmojiKeywords:C})=>{n.r&&!Xn&&(Xn=!0,console.log(">>> RENDER MAIN")),Object(c.n)(()=>{e&&(v(!0),g(),f(),I(),y(),C({language:n.j}),j!==n.j&&C({language:j}))},[e,g,I,f,v,y,C,j]);const{transitionClassNames:w}=Object(oe.a)(!t,void 0,!0,void 0,O),{transitionClassNames:E}=Object(oe.a)(a,void 0,!0,void 0,O),M=Object(ne.a)(w.replace(/([\w-]+)/g,"middle-column-$1"),E.replace(/([\w-]+)/g,"right-column-$1"),O&&"history-animation-disabled");Object(le.a)(([e])=>{if(void 0===e||0===l)return;const t=Object(se.d)();Object(ce.b)(document.getElementById("MiddleColumn"),t)},[t]),Object(le.a)(([e])=>{if(void 0===e||0===l)return;Object(p.b)(()=>{document.body.classList.add("animating-right-column")});const t=Object(se.d)();Object(ce.b)(document.getElementById("RightColumn"),()=>{t(),Object(p.b)(()=>{document.body.classList.remove("animating-right-column")})})},[a]);const S=Object(c.m)(()=>{v(!1);const e=Object(r.r)(Object(s.e)());let t=0;clearInterval(Yn),Yn=window.setInterval(()=>{if(document.title.includes(n.L))Zn(!1);else{if(t%2==0){const t=Object(r.r)(Object(s.e)())-e;t>0&&(ec(`${t} notification${t>1?"s":""}`),Zn(!0))}else ec(n.pb),Zn(!1);t++}},1e3)},[v]),k=Object(c.m)(()=>{v(!0),clearInterval(Yn),Yn=void 0,document.title.includes(n.L)||ec(n.pb),Zn(!1)},[v]);function N(e){e.preventDefault(),e.stopPropagation()}return Object(re.a)(S,k),ie(S),c.a.createElement("div",{id:"Main",className:M,onDrop:N,onDragOver:N},c.a.createElement(Ke,null),c.a.createElement(rn,null),c.a.createElement(zn,null),c.a.createElement($n,{isOpen:o}),c.a.createElement(Kn,{isOpen:i}),c.a.createElement(Vn,{isOpen:d}),c.a.createElement(Wn,{isOpen:b}),u&&c.a.createElement(Ct,{key:u.id,message:u,noUi:!0}),c.a.createElement(Qn,{url:m}),c.a.createElement(Jn,{isOpen:h}))}));n.r&&console.log(">>> FINISH LOAD MAIN BUNDLE"),Object(s.e)().connectionState||Object(s.d)().initApi()},203:function(e,t,a){},204:function(e,t,a){},205:function(e,t,a){},216:function(e,t,a){},217:function(e,t,a){},218:function(e,t,a){},221:function(e,t,a){},222:function(e,t,a){},223:function(e,t,a){},227:function(e,t,a){},228:function(e,t,a){},230:function(e,t,a){},233:function(e,t,a){},234:function(e,t,a){},235:function(e,t,a){},236:function(e,t,a){},237:function(e,t,a){},238:function(e,t,a){},239:function(e,t,a){},240:function(e,t,a){},241:function(e,t,a){},242:function(e,t,a){},243:function(e,t,a){},245:function(e,t,a){},246:function(e,t,a){},247:function(e,t,a){},248:function(e,t,a){},249:function(e,t,a){},250:function(e,t,a){},251:function(e,t,a){},256:function(e,t,a){},257:function(e,t,a){},258:function(e,t,a){},259:function(e,t,a){}}]); -//# sourceMappingURL=4.f46a6915735f9deb48a8.js.map \ No newline at end of file diff --git a/dist/4.f46a6915735f9deb48a8.js.map b/dist/4.f46a6915735f9deb48a8.js.map deleted file mode 100644 index acf0301ae..000000000 --- a/dist/4.f46a6915735f9deb48a8.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/modules/actions/ui/localSearch.ts","webpack:///./src/modules/actions/ui/chats.ts","webpack:///./src/modules/actions/ui/messages.ts","webpack:///./src/modules/actions/ui/globalSearch.ts","webpack:///./src/modules/actions/ui/stickerSearch.ts","webpack:///./src/modules/actions/ui/users.ts","webpack:///./src/modules/actions/ui/misc.ts","webpack:///./src/modules/actions/ui/payments.ts","webpack:///./src/modules/actions/api/chats.ts","webpack:///./src/modules/actions/api/messages.ts","webpack:///./src/modules/actions/api/symbols.ts","webpack:///./src/modules/actions/api/globalSearch.ts","webpack:///./src/modules/actions/api/sync.ts","webpack:///./src/modules/actions/api/localSearch.ts","webpack:///./src/modules/actions/api/management.ts","webpack:///./src/modules/actions/api/users.ts","webpack:///./src/modules/reducers/bots.ts","webpack:///./src/modules/actions/api/bots.ts","webpack:///./src/modules/actions/api/twoFaSettings.ts","webpack:///./src/modules/actions/api/payments.ts","webpack:///./src/util/requestQuery.ts","webpack:///./src/modules/actions/apiUpdaters/chats.ts","webpack:///./src/modules/actions/apiUpdaters/messages.ts","webpack:///./src/modules/actions/apiUpdaters/users.ts","webpack:///./src/modules/actions/apiUpdaters/symbols.ts","webpack:///./src/modules/actions/apiUpdaters/misc.ts","webpack:///./src/modules/actions/apiUpdaters/settings.ts","webpack:///./src/modules/actions/apiUpdaters/twoFaSettings.ts","webpack:///./src/hooks/useBeforeUnload.ts","webpack:///./src/components/ui/Switcher.tsx","webpack:///./src/components/left/main/LeftMainHeader.tsx","webpack:///./src/components/left/ConnectionState.tsx","webpack:///./src/hooks/useThrottledMemo.ts","webpack:///./src/hooks/useThrottle.ts","webpack:///./src/components/left/main/ChatFolders.tsx","webpack:///./src/components/left/search/LeftSearch.async.tsx","webpack:///./src/components/left/main/ContactList.async.tsx","webpack:///./src/components/left/NewChatButton.tsx","webpack:///./src/components/left/main/LeftMain.tsx","webpack:///./src/hooks/useBrowserOnline.ts","webpack:///./src/components/left/settings/Settings.async.tsx","webpack:///./src/components/left/newChat/NewChat.async.tsx","webpack:///./src/components/left/ArchivedChats.async.tsx","webpack:///./src/components/left/LeftColumn.tsx","webpack:///./src/hooks/useWindowSize.ts","webpack:///./src/components/middle/helpers/calculateMiddleFooterTransforms.ts","webpack:///./src/util/routing.ts","webpack:///./src/components/middle/HeaderMenuContainer.async.tsx","webpack:///./src/components/middle/HeaderActions.tsx","webpack:///./src/hooks/useWebpThumbnail.ts","webpack:///./src/components/middle/PinnedMessageNavigation.tsx","webpack:///./src/components/middle/HeaderPinnedMessage.tsx","webpack:///./src/components/middle/AudioPlayer.tsx","webpack:///./src/components/middle/MiddleHeader.tsx","webpack:///./src/components/middle/helpers/groupMessages.ts","webpack:///./src/components/middle/helpers/preventMessageInputBlur.ts","webpack:///./src/components/middle/hooks/useStickyDates.ts","webpack:///./src/hooks/useDebounce.ts","webpack:///./src/components/middle/hooks/useMessageObservers.ts","webpack:///./src/components/middle/message/helpers/buildContentClassName.ts","webpack:///./src/components/middle/message/helpers/mediaDimensions.ts","webpack:///./src/components/middle/message/helpers/calculateAlbumLayout.ts","webpack:///./src/components/middle/message/helpers/calculateAuthorWidth.ts","webpack:///./src/components/middle/message/hooks/useFocusMessage.ts","webpack:///./src/components/middle/message/ContextMenuContainer.async.tsx","webpack:///./src/components/middle/ActionMessage.tsx","webpack:///./src/components/common/EmbeddedMessage.tsx","webpack:///./src/components/middle/message/MessageMeta.tsx","webpack:///./src/components/middle/message/Sticker.tsx","webpack:///./src/components/middle/message/hooks/useBlurredMediaThumbRef.ts","webpack:///./src/components/middle/message/helpers/getCustomAppendixBg.ts","webpack:///./src/components/middle/message/Photo.tsx","webpack:///./src/hooks/useHeavyAnimationCheckForVideo.ts","webpack:///./src/components/middle/message/hooks/usePauseOnInactive.ts","webpack:///./src/components/middle/message/Video.tsx","webpack:///./src/components/middle/message/Contact.tsx","webpack:///./src/components/ui/CheckboxGroup.tsx","webpack:///./src/components/middle/message/PollOption.tsx","webpack:///./src/components/middle/message/Poll.tsx","webpack:///./src/components/middle/message/WebPage.tsx","webpack:///./src/components/middle/message/Invoice.tsx","webpack:///./src/components/middle/message/hocs/withSelectControl.tsx","webpack:///./src/components/middle/message/Album.tsx","webpack:///./src/components/middle/message/RoundVideo.tsx","webpack:///./src/components/middle/message/InlineButtons.tsx","webpack:///./src/components/middle/message/CommentButton.tsx","webpack:///./src/components/middle/message/Message.tsx","webpack:///./src/components/middle/MessageListContent.tsx","webpack:///./src/components/middle/hooks/useScrollHooks.ts","webpack:///./src/components/middle/MessageList.tsx","webpack:///./src/components/middle/ScrollDownButton.tsx","webpack:///./src/components/middle/composer/helpers/buildAttachment.ts","webpack:///./src/components/middle/composer/helpers/applyIosAutoCapitalizationFix.ts","webpack:///./node_modules/opus-recorder/dist/encoderWorker.min.js","webpack:///./src/util/voiceRecording.ts","webpack:///./src/components/middle/composer/hooks/useClipboardPaste.ts","webpack:///./src/components/middle/composer/helpers/getMessageTextAsHtml.ts","webpack:///./src/components/middle/composer/hooks/useDraft.ts","webpack:///./src/components/middle/composer/hooks/useInlineBotTooltip.ts","webpack:///./src/components/common/DeleteMessageModal.async.tsx","webpack:///./src/components/ui/ResponsiveHoverButton.tsx","webpack:///./src/components/middle/composer/AttachMenu.async.tsx","webpack:///./src/components/middle/composer/SymbolMenu.async.tsx","webpack:///./src/components/middle/composer/InlineBotTooltip.async.tsx","webpack:///./src/components/middle/composer/MentionTooltip.async.tsx","webpack:///./src/components/middle/composer/CustomSendMenu.async.tsx","webpack:///./src/components/middle/composer/StickerTooltip.async.tsx","webpack:///./src/components/middle/composer/BotKeyboardMenu.async.tsx","webpack:///./src/components/middle/composer/ComposerEmbeddedMessage.tsx","webpack:///./src/components/middle/composer/AttachmentModal.async.tsx","webpack:///./src/components/middle/composer/PollModal.async.tsx","webpack:///./src/components/middle/composer/DropArea.async.tsx","webpack:///./src/components/middle/composer/WebPagePreview.tsx","webpack:///./src/components/common/CalendarModal.async.tsx","webpack:///./src/components/payment/PaymentModal.async.tsx","webpack:///./src/components/payment/ReceiptModal.async.tsx","webpack:///./src/components/middle/composer/Composer.tsx","webpack:///./src/components/middle/composer/hooks/useVoiceRecording.ts","webpack:///./src/components/middle/composer/hooks/useStickerTooltip.ts","webpack:///./src/util/insertHtmlInSelection.ts","webpack:///./src/util/deleteLastCharacterOutsideSelection.ts","webpack:///./src/components/middle/composer/hooks/useEditing.ts","webpack:///./src/components/middle/MobileSearch.async.tsx","webpack:///./src/components/middle/MessageSelectToolbar.async.tsx","webpack:///./src/components/common/UnpinAllMessagesModal.async.tsx","webpack:///./src/components/middle/MiddleColumn.tsx","webpack:///./src/hooks/useCustomBackground.ts","webpack:///./src/components/right/RightHeader.tsx","webpack:///./src/components/right/hooks/useProfileViewportIds.ts","webpack:///./src/components/right/hooks/useProfileState.ts","webpack:///./src/components/right/ProfilePhoto.tsx","webpack:///./src/components/right/ProfileInfo.tsx","webpack:///./src/components/right/hooks/usePhotosPreload.ts","webpack:///./src/components/right/ChatExtra.tsx","webpack:///./src/components/right/DeleteMemberModal.tsx","webpack:///./src/components/right/Profile.tsx","webpack:///./src/components/right/hooks/useTransitionFixes.ts","webpack:///./src/hooks/useCacheBuster.ts","webpack:///./src/components/right/RightSearch.async.tsx","webpack:///./src/components/right/management/Management.async.tsx","webpack:///./src/components/right/StickerSearch.async.tsx","webpack:///./src/components/right/GifSearch.async.tsx","webpack:///./src/components/right/PollResults.async.tsx","webpack:///./src/components/right/AddChatMembers.tsx","webpack:///./src/components/right/RightColumn.tsx","webpack:///./src/components/mediaViewer/MediaViewer.async.tsx","webpack:///./src/components/main/Notifications.async.tsx","webpack:///./src/components/main/Dialogs.async.tsx","webpack:///./src/components/main/ForwardPicker.async.tsx","webpack:///./src/components/main/SafeLinkModal.async.tsx","webpack:///./src/components/main/HistoryCalendar.async.tsx","webpack:///./src/components/main/Main.tsx","webpack:///./src/bundles/main.ts"],"names":["closeLocalTextSearch","global","chatId","threadId","selectCurrentMessageList","updateLocalTextSearch","replaceLocalTextSearchResults","undefined","addReducer","actions","payload","query","chatThreadKey","buildChatThreadKey","currentQuery","localTextSearch","byChatThreadKey","MEMO_EMPTY_ARRAY","mediaType","updateLocalMediaSearchType","id","type","shouldReplaceHistory","currentMessageList","replaceThreadParam","exitMessageSelectMode","messages","contentToBeScheduled","forwardMessages","toChatId","setGlobal","updateCurrentMessageList","isChatInfoShown","openChat","chatCreation","newChatMembersProgress","targetIndexDelta","orderedIds","position","indexOf","nextId","FOCUS_NO_HIGHLIGHT_DURATION","FAST_SMOOTH_MAX_DURATION","ANIMATION_END_DELAY","blurTimeout","scrollOffset","messageId","paramName","chatMessages","selectChatMessages","viewportIds","selectViewportIds","lastOwnEditableMessageId","findLast","Boolean","selectAllowedMessageActions","canEdit","replyingToId","selectReplyingToId","selectIsViewportNewest","chatMessageKeys","Object","keys","newIndex","toString","length","Number","MAIN_THREAD_ID","chat","selectChat","lastMessage","threadInfo","selectThreadInfo","lastMessageId","setReplyingToId","focusMessage","avatarOwnerId","profilePhotoIndex","origin","mediaViewer","audioPlayer","selectIsRightColumnShown","pollResults","voters","window","setTimeout","newGlobal","getGlobal","noHighlight","replyStack","selectReplyStack","pop","focusLastMessage","messageListType","groupedId","groupedChatId","replyMessageId","ids","selectForwardedMessageIdsByGroupId","shouldSwitchChat","clearTimeout","updateFocusedMessage","updateFocusDirection","FocusDirection","Static","includes","direction","Down","Up","loadViewportMessages","fromChatId","messageIds","groupedMessageIds","selectMessageIdsByGroupId","isModalShown","closeMediaViewer","selectedMessages","openForwardMenu","selectCurrentChat","enterMessageSelectMode","childMessageIds","withShift","toggleMessageSelection","shouldShowContextMenuHint","disableContextMenuHint","showNotification","message","IS_TOUCH_ENV","isPollModalOpen","globalSearch","updateGlobalSearch","globalResults","localResults","resultsByType","fetchingStatus","chats","recentlyFoundChatIds","newRecentIds","filter","unshift","content","updateGlobalSearchContent","stickers","search","resultIds","gifs","offsetId","results","updateSelectedUserId","updateUserSearch","globalUserIds","localUserIds","management","byChatId","isActive","IS_SINGLE_COLUMN_LAYOUT","IS_TABLET_COLUMN_LAYOUT","isLeftColumnShown","messageLists","action","emoji","recentEmojis","newEmojis","e","sticker","recent","hash","newStickers","s","notification","newNotifications","notifications","existingNotificationIndex","findIndex","n","splice","push","data","hasErrorKey","getReadableErrorText","newDialogs","dialogs","existingErrorIndex","err","url","safeLinkModalUrl","selectedAt","historyCalendarSelectedAt","payment","isPaymentModalOpen","clearPayment","closeInvoice","runThrottledForLoadChats","throttle","cb","runThrottledForLoadTopChats","runDebouncedForLoadFullChat","debounce","async","loadChats","listType","offsetDate","result","callApi","limit","CHAT_LIST_LOAD_SLICE","archived","withPinned","orderedPinnedIds","serverTimeOffset","chatIds","shift","addUsers","buildCollectionByKey","users","updateChats","updateChatListIds","updateChatListSecondaryInfo","draftsById","map","forEach","replyingToById","isFullyLoaded","loadFullChat","fullInfo","updateChat","openChatByUsername","username","channelPostId","localChat","selectChatByUsername","isMin","previousChat","preloadedChatIds","i","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","pause","byId","listIds","active","currentChatId","pinnedChats","otherChats","prepareChatList","chatToPreload","find","currentUserId","hasUnreadMark","toggleChatUnread","isChatSummaryOnly","requestChatUpdate","user","selectUser","selectThreadTopMessageId","requestThreadInfoUpdate","selectSupportChat","langCode","usernamePostfix","LOCALIZED_TIPS","toUpperCase","TIPS_USERNAME","oldestChat","selectIsChatPinned","sort","chat1","chat2","date","force","isMuted","title","about","photo","memberIds","progress","ChatCreationProgress","InProgress","createdChannel","channelId","accessHash","Complete","Error","getDispatch","createChannel","userId","activeChat","activeChannel","createdChat","createGroupChat","folderId","folder","selectChatFolder","shouldBePinned","pinnedChatIds","includedChatIds","newPinnedIds","pinnedId","newIncludedChatIds","folderUpdate","selectChatListType","isPinned","ARCHIVED_FOLDER_ID","isChatArchived","chatFolders","loadChatFolders","recommendedChatFolders","recommended","loadRecommendedChatFolders","emoticon","maxId","recommendedId","description","newFolder","createChatFolder","Math","max","apply","deleteChatFolder","unreadCount","match","RE_TME_INVITE_LINK","exec","RE_TME_LINK","chatOrChannelPostId","isEnabled","isChatBasicGroup","bannedRights","chatAfterUpdate","members","kickedMembers","isBanned","viewMessages","isUnblocked","m","adminRights","customTitle","adminMembers","isDismissed","updateManagementProgress","ManagementProgress","Promise","all","groups","addedById","reduce","group","addChats","forDiscussionIds","channel","fullChat","isPreHistoryHidden","linkedChatId","activeChatFolder","offset","setNewChatMembersDialogState","NewChatMembersProgress","Loading","Closed","uploadProgressCallbacks","Map","runThrottledForMarkRead","isOutlying","isBudgetPreload","addOffset","LoadMoreDirection","Backwards","Around","round","MESSAGE_LIST_SLICE","Forwards","selectThreadOriginChat","threadInfos","addChatMessagesById","updateOutlyingIds","updateListedIds","updateThreadInfos","listedIds","selectListedIds","outlyingIds","selectOutlyingIds","areSortedArraysIntersecting","historyIds","newViewportIds","getViewportSlice","safeReplaceViewportIds","sourceIds","index","findClosestIndex","indexForDirection","from","to","slice","areSomeLocal","areAllLocal","sendMessage","params","localId","progressCallback","attachment","messageLocalId","has","set","fileUploads","byMessageLocalId","replyingTo","IS_IOS","rafPromise","delete","isRestricted","resolve","loadWithBudget","selectFocusedMessageId","selectRealLastReadId","replyOriginForId","MESSAGE_DELETED","replyMessage","selectChatMessage","updateChatMessage","replyToMessageId","loadMessage","scheduledAt","clearWebPagePreview","value","noWebPage","selectNoWebPage","isSingle","attachments","isGrouped","restParams","text","entities","commonParams","groupedAttachments","split","MAX_MEDIA_FILES_FOR_ALBUM","firstAttachment","restAttachments","Date","now","selectEditingMessage","setEditingId","get","previousLocalId","cancelApiProgress","apiUpdate","draft","replyToMsgId","draftDate","localOnly","selectDraft","isUnpin","isOneSide","isSilent","unpinAllMessages","shouldDeleteForAll","editingId","selectEditingId","selectEditingScheduledId","reason","peer","webPagePreview","loadWebPagePreview","options","option","shouldResetVoters","v","a","offsets","nextOffset","loadPollOptionResults","fromChat","toChat","b","scheduledMessages","historyHash","replaceScheduledMessages","loadScheduledHistory","selectScheduledMessage","loadPinnedMessages","searchThrottled","searchGifs","updateGifSearch","added","addedStickers","updateStickerSets","sets","loadStickerSets","setIds","addedSetIds","loadStickers","stickerSetId","recentStickers","loadRecentStickers","favorite","favoriteStickers","loadFavoriteStickers","featured","featuredStickers","loadFeaturedStickers","stickerSetAccessHash","stickerSet","selectStickerSet","packs","updateStickerSet","currentEmoji","forEmoji","rebuildStickersForEmoji","replaceAnimatedEmojis","loadAnimatedEmojis","saved","savedGifs","loadSavedGifs","unfave","unfaveSticker","installedDate","language","currentEmojiKeywords","emojiKeywords","isLoading","fromVersion","version","keywords","setsById","searchWords","searchStickers","updateStickersForEmoji","loadStickersForEmoji","searchMessagesGlobal","offsetRate","maxDate","minDate","localResult","chatOrUser","GLOBAL_SEARCH_SLICE","totalCount","nextOffsetId","nextRate","currentSearchQuery","selectCurrentGlobalSearchQuery","updateGlobalSearchFetchingStatus","addMessages","updateGlobalSearchResults","loadAndReplaceArchivedChats","updateUsers","replaceChatListIds","loadAndUpdateUsers","userIds","contactIds","contactList","updatedUsers","loadTopMessages","lastReadInboxMessageId","localChats","localUsers","globalChats","globalUsers","searchChats","timestampPlusDay","foundIds","currentSearch","selectCurrentTextSearch","topMessageId","MESSAGE_SEARCH_SLICE","newFoundIds","updateLocalTextSearchResults","searchTextMessages","peerId","selectCurrentMediaSearchPeerId","selectCurrentMediaSearch","currentType","currentResults","SHARED_MEDIA_SLICE","updateLocalMediaSearchResults","searchSharedMedia","timestamp","searchMessagesByDate","updateManagement","isUsernameAvailable","afterSyncCallback","DEBUG","console","log","savedUsers","savedPrivateChatIds","savedChats","selectedChat","isChatPrivate","selectedChatUser","replaceChats","loadAndReplaceChats","areMessagesLoaded","currentThreadId","draftsByChatId","acc","newCurrentChatId","currentMessageListInfo","threadsById","originChannelId","currentMessageListInfoOrigin","resultOrigin","byIdOrigin","listedIdsOrigin","Array","prototype","concat","replaceUsers","audioChatId","audioMessageId","closeAudioPlayer","loadAndReplaceMessages","lastSyncTime","sync","afterSync","runDebouncedForFetchFullUser","runThrottledForSearch","replaceInlineBotSettings","inlineBotSettings","inlineBots","byUsername","replaceInlineBotsIsLoading","topPeers","lastRequestedAt","usersHash","loadTopUsers","getCompareString","lastName","firstName","collator","Intl","Collator","sortedUsers","compare","isSelf","loadContactList","updateChatMutedState","phone","phoneNumber","updateUser","updateContact","deleteUser","profileId","isPrivate","photos","userSearch","updateUserSearchFetchingStatus","searchUsers","runDebouncedForSearch","sendBotCommand","command","button","openTelegramLink","toggleSafeLinkModal","alert","isError","showDialog","answerCallbackButton","openPollModal","getReceipt","receiptMessageId","getPaymentForm","setInvoiceMessageInfo","openPaymentModal","bot","selectChatBot","removeBlockedContact","topInlineBots","newHash","inlineBotData","inlineBot","switchPm","canLoadMore","shouldReplaceSettings","newInlineBotData","currentIds","Set","newResults","help","isGallery","searchInlineBot","queryId","resultId","replaceSettings","hasPassword","updateTwoFaSettings","hint","currentPassword","onSuccess","error","isSuccess","password","email","waitingEmailCodeLength","code","requestInfo","saveInfo","selectPaymentMessageId","shouldSave","shippingOptions","setRequestInfoId","updateShippingOptions","setPaymentStep","PaymentStep","Shipping","PaymentInfo","validateRequestedInfo","setPaymentForm","step","invoice","shippingAddressRequested","nameRequested","phoneRequested","emailRequested","ShippingInfo","setReceipt","receipt","publishableKey","selectProviderPublishableKey","credentials","k","join","buildQueryString","cardNumber","expiryMonth","expiryYear","cvv","zip","country","response","fetch","method","headers","Authorization","json","getStripeError","setStripeCardInfo","Checkout","sendStipeCredentials","shippingOptionId","saveCredentials","requestInfoId","selectPaymentRequestId","stripeCredentials","selectStripeCredentials","requestedInfoId","sendPaymentForm","save","runThrottledForUpdateAppBadge","update","noTopChatsRequest","selectIsChatListed","loadTopChats","newProfilePhoto","selectCountNotMutedUnread","updateAppBadge","isNotJoined","listId","typingStatus","senderId","isFromScheduled","isActiveChat","hasUnreadMention","unreadMentionsCount","showNewMessageNotification","messageUpdate","selectCommonBoxChatId","targetChat","newOrderedPinnedIds","MAX_ACTIVE_PINNED_CHATS","updateChatListType","chatFoldersById","newChatFoldersById","pick","newOrderedIds","orderedId","folders","replacedMembers","addedMember","deletedMemberId","shouldUpdate","some","deleteIndex","isOwner","isAdmin","membersCount","formattedText","updateWithLocalMedia","isScheduled","currentMessage","video","document","getMessageContent","blobUrl","thumbnail","isPreloadedGlobally","previewBlobUrl","updateScheduledMessage","updateListedAndViewportIds","firstMessageId","selectThreadByMessage","isUnreadChatNotLoaded","isMessageLocal","addViewportId","messagesCount","firstUnreadId","selectFirstUnreadId","updateChatLastMessage","currentLastMessage","findLastMessage","isDeleting","deleteMessages","newLastMessage","threadIdsToUpdate","deleteChatMessages","unique","chatsIdsToUpdate","commonBoxChatId","updateThreadInfo","newMessage","isMessageInCurrentMessageList","isOutgoing","scheduledIds","selectScheduledIds","selectScheduledMessages","deleteChatScheduledMessages","thread","markMessageListRead","currentPinnedIds","selectPinnedIds","newTheadInfo","messagesById","deleteScheduledMessages","pollId","pollUpdate","selectChatMessageByPollId","poll","updatedPoll","updatedResults","isChosen","chosenAnswers","chosenAnswer","chosenAnswerIndex","recentVoterIds","totalVoters","newRecentVoterIds","newTotalVoters","targetOption","targetOptionIndex","updatedOption","votersCount","flushStatusUpdatesThrottled","pendingStatusUpdates","statusUpdate","status","targetUser","isBlocked","addBlockedContact","settings","privacy","key","rules","updateNotifySettings","peerType","shouldShowPreviews","addNotifyException","twoFaSettings","useBeforeUnload","callback","useEffect","onBeforeUnload","memo","name","label","checked","disabled","inactive","noAnimation","onChange","onCheck","handleChange","useCallback","currentTarget","className","buildClassName","ANIMATION_LEVEL_OPTIONS","withGlobal","searchQuery","chatsById","animationLevel","byKey","globalSearchChatId","searchDate","theme","selectTheme","contactsFilter","onSearchQuery","onSelectSettings","onSelectContacts","onSelectArchived","setGlobalSearchChatId","onReset","shouldSkipTransition","openTipsChat","setGlobalSearchDate","setSettingOption","lang","useLang","hasMenu","LeftColumnContent","ChatList","clearedDateSearchParam","clearedChatSearchParam","selectedSearchDate","useMemo","formatDateToString","archivedUnreadChatsCount","values","total","withOtherVersions","location","hostname","MainButton","onTrigger","isOpen","Button","ripple","size","color","onClick","ariaLabel","handleSearchFocus","handleSelectSaved","handleDarkModeToggle","stopPropagation","newTheme","shouldUseSystemTheme","switchTheme","ANIMATION_LEVEL_MAX","handleAnimationLevelChange","newLevel","_","body","classList","toggle","isSearchFocused","GlobalSearch","Contacts","searchInputPlaceholder","DropdownMenu","trigger","footer","APP_NAME","APP_VERSION","MenuItem","icon","toLowerCase","href","FEEDBACK_URL","localStorage","setItem","JSON","stringify","disableHistoryBack","SearchInput","inputId","parentContainerClassName","focused","placeholder","autoComplete","canClose","onFocus","PickerSelectedItem","isMinimized","clickArg","chatOrUserId","dir","isRtl","Spinner","resolverFn","ms","dependencies","runThrottled","noFirst","useThrottle","setValue","useState","isFrozen","freeze","unfreeze","useFlag","useHeavyAnimationCheck","useOnChange","usersById","orderedFolderIds","notifySettings","selectNotifySettings","notifyExceptions","selectNotifyExceptions","setActiveChatFolder","transitionRef","useRef","displayedFolders","folderCountersById","useThrottledMemo","counters","unreadDialogsCount","hasActiveDialogs","getFolderUnreadDialogs","badgeCount","isBadgeActive","folderTabs","handleSwitchTab","current","captureEvents","onSwipe","SwipeDirection","Left","min","Right","isNotInAllTabRef","captureEscKeyListener","useHistoryBack","handleKeyDown","ctrlKey","shiftKey","startsWith","digit","preventDefault","addEventListener","removeEventListener","shouldRender","shouldRenderPlaceholder","transitionClassNames","useShowTransition","renderCurrentTab","activeFolder","folderType","noChatsText","TabList","tabs","activeTab","onSwitchTab","Transition","ref","activeKey","renderCount","props","LeftSearch","useModuleLoader","Bundles","Extra","ContactList","closeTimeout","isShown","onNewPrivateChat","onNewChannel","onNewGroup","isMenuOpen","setIsMenuOpen","fabClassName","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","tabIndex","Menu","positionX","positionY","autoClose","onClose","TRANSITION_RENDER_COUNT","onContentChange","connectionState","isNewChatButtonShown","setIsNewChatButtonShown","isConnecting","isOnline","setIsOnline","navigator","onLine","useBrowserOnline","isMouseInside","handleSelectSettings","Settings","handleSelectContacts","handleSelectNewChannel","NewChannelStep1","handleSelectNewGroup","NewGroupStep1","handleSelectArchived","Archived","autoCloseTimeout","shouldRenderUpdateButton","updateButtonClassNames","handleUpdateClick","isAppOutdated","markIsAppOutdated","timeout","reload","useAppOutdatedCheck","ShowTransition","isCustom","shouldCleanup","cleanupExceptionKey","fluid","pill","NewChat","ContentType","ArchivedChats","RENDER_COUNT","shouldSkipHistoryAnimations","setGlobalSearchQuery","resetChatCreation","loadPasswordInfo","clearTwoFaError","setContent","settingsScreen","setSettingsScreen","SettingsScreens","Main","setContactsFilter","lastResetTime","setLastResetTime","contentType","NewChannelStep2","NewChannel","NewGroupStep2","NewGroup","handleReset","forceReturnToChatList","pickerSearchInput","getElementById","blur","EditProfile","Folders","General","Notifications","Privacy","Language","GeneralChatBackground","GeneralChatBackgroundColor","PrivacyPhoneNumber","PrivacyLastSeen","PrivacyProfilePhoto","PrivacyForwarding","PrivacyGroupChats","PrivacyActiveSessions","PrivacyBlockedUsers","TwoFaDisabled","TwoFaEnabled","TwoFaCongratulations","PrivacyPhoneNumberAllowedContacts","PrivacyPhoneNumberDeniedContacts","PrivacyLastSeenAllowedContacts","PrivacyLastSeenDeniedContacts","PrivacyProfilePhotoAllowedContacts","PrivacyProfilePhotoDeniedContacts","PrivacyForwardingAllowedContacts","PrivacyForwardingDeniedContacts","PrivacyGroupChatsAllowedContacts","PrivacyGroupChatsDeniedContacts","TwoFaNewPassword","TwoFaNewPasswordConfirm","TwoFaNewPasswordHint","TwoFaNewPasswordEmail","TwoFaNewPasswordEmailCode","TwoFaChangePasswordCurrent","TwoFaTurnOff","TwoFaRecoveryEmailCurrentPassword","TwoFaChangePasswordNew","TwoFaChangePasswordConfirm","TwoFaChangePasswordHint","TwoFaRecoveryEmail","TwoFaRecoveryEmailCode","FoldersCreateFolder","FoldersEditFolder","handleSearchQuery","handleSettingsScreenSelect","screen","LAYERS_ANIMATION_NAME","currentScreen","onScreenSelect","isChannel","setSize","windowSize","handleResize","calculateMiddleFooterTransforms","windowWidth","canPost","sidePadding","MOBILE_SCREEN_MAX_WIDTH","messageListWidth","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","leftColumnWidth","rightColumnWidth","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","getMessageListWidth","sendButtonWidth","composerWidth","toolbarWidth","composerHiddenScale","toolbarHiddenScale","composerTranslateX","toolbarTranslateX","unpinHiddenScale","toolbarForUnpinHiddenScale","createMessageHash","messageList","HeaderMenuContainer","isChatChannel","noMenu","isChatWithSelf","selectIsChatWithSelf","isMainThread","isDiscussionThread","isRightColumnShown","canRestartBot","selectIsUserBlocked","canStartBot","selectIsChatBotNotStarted","canSubscribe","isChatSuperGroup","canSearch","canMute","canSelect","selectIsInSelectMode","canLeave","joinChannel","openLocalTextSearch","restartBot","menuButtonRef","menuPosition","setMenuPosition","handleHeaderMenuOpen","rect","getBoundingClientRect","x","right","y","bottom","handleHeaderMenuClose","handleHeaderMenuHide","handleSubscribeClick","handleStartBot","handleRestartBot","handleSearchClick","querySelector","focus","searchInput","anchor","onSubscribeChannel","onSearchClick","onCloseAnimationEnd","useWebpThumbnail","getMessageMediaThumbDataUri","shouldDecodeThumbnail","isWebpSupported","thumbnailDecoded","setThumbnailDecoded","EMPTY_IMAGE_DATA_URI","useLayoutEffect","webpToPngBase64","then","catch","drawRect","width","height","radius","count","containerRef","markupParams","reverseIndex","barHeight","getBarHeight","markHeight","getMarkHeight","trackHeight","getTrackHeight","clipPathId","clipPath","d","getClipPath","markTranslateY","getMarkTranslateY","trackTranslateY","getTrackTranslateY","calculateMarkup","firstChild","firstElementChild","currentElement","style","transform","svg","div","defs","innerHTML","onUnpinMessage","onAllPinnedClick","mediaThumbnail","mediaBlobUrl","useMedia","getMessageMediaHash","getMessageSummaryText","isUnpinDialogOpen","openUnpinDialog","closeUnpinDialog","handleUnpinMessage","ConfirmDialog","confirmLabel","confirmHandler","thumbDataUri","getPictogramDimensions","src","alt","renderPictogram","renderText","RippleEffect","sender","selectSender","noUi","senderName","getSenderTitle","mediaData","mediaLoader","playPause","isPlaying","useAudioPlayer","getMessageKey","getMediaDuration","handleClick","handleClose","audio","getMessageAudio","performer","fileName","renderAudio","subtitle","renderVoice","audioMessage","pinnedIds","state","isSelectModeActive","isChatWithBot","selectIsChatWithBot","currentTransitionKey","assign","pinnedMessageId","topMessageSender","selectForwardedSender","pinnedMessageIds","canUnpin","firstPinnedMessage","isReady","openChatWithInfo","pinMessage","openPreviousChat","toggleLeftColumn","pinnedMessageIndex","setPinnedMessageIndex","isArray","pinnedMessage","pinnedMessagesCount","chatTitleLength","getChatTitle","topMessageTitle","useEnsureMessage","useWindowSize","isLeftColumnHideable","shouldShowCloseButton","componentRef","shouldAnimateTools","handleHeaderClick","handlePinnedMessageClick","cycleRestrict","handleAllPinnedClick","handleBackClick","messageInput","EDITABLE_INPUT_ID","currentChat","selectIsChatMuted","canToolsCollideWithChatInfo","SAFE_SCREEN_WIDTH_FOR_CHAT_INFO","shouldUseStackedToolsClass","SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","shouldRenderAudioPlayer","audioPlayerClassNames","renderingAudioMessage","useCurrentOrPrev","shouldRenderPinnedMessage","pinnedMessageClassNames","renderingPinnedMessage","renderingPinnedMessageTitle","canRevealTools","renderInfo","renderBackButton","PrivateChatInfo","withFullInfo","withMediaViewer","withUpdatingStatus","noRtl","GroupChatInfo","asClose","unreadCountInfo","formatIntegerCompact","componentEl","add","remove","isAlbum","messageOrAlbum","groupMessages","currentAlbum","currentSenderGroup","currentDateGroup","originalDate","datetime","getDayStart","senderGroups","dateGroups","isInAlbum","mainMessage","albumId","nextMessage","nextMessageDayStartsAt","isActionMessage","forwardInfo","senderUserId","hiddenUserName","inlineButtons","preventMessageInputBlur","activeElement","target","useStickyDates","isScrolled","markIsScrolled","runDebounced","shouldRunFirst","shouldRunLast","updateStickyDates","container","hasTools","contains","fastRaf","currentStuck","stuckDateEl","allElements","querySelectorAll","containerTop","scrollTop","el","offsetTop","offsetHeight","top","findStuckDate","INTERSECTION_THROTTLE_FOR_MEDIA","IS_ANDROID","INTERSECTION_MARGIN_FOR_MEDIA","isEmojiOnlyMessage","customShape","getMinMediaWidth","hasText","hasCommentButton","calculateMediaDimensions","noAvatars","isOwn","isOwnMessage","isForwarded","isForwardedMessage","getMessagePhoto","getMessageWebPagePhoto","getMessageVideo","isWebPagePhoto","calculateInlineImageDimensions","calculateVideoDimensions","minMediaWidth","getMessageText","stretchFactor","finalWidth","finalHeight","isSmall","AlbumRectPart","accumulate","list","initValue","accumulator","item","clamp","num","low","high","calculateContainerSize","layout","styles","dimensions","sides","calculateAlbumLayout","album","ratios","proportions","ratio","getProportions","averageRatio","getAverageRatio","albumCount","forceCalc","maxWidth","getAvailableWidth","REM","minWidth","maxHeight","spacing","originalRatios","cropRatios","attempts","pushAttempt","lineCounts","heights","currentCount","attemptCount","sum","multiHeight","first","second","third","fourth","optimalAttempt","optimalDiff","lineCount","totalHeight","bad1","bad2","line","diff","abs","optimalCounts","optimalHeights","rowCount","row","colCount","lineHeight","col","layoutWithComplexLayouter","layoutTwoTopBottom","layoutTwoLeftRightEqual","minimalWidth","secondWidth","firstWidth","layoutTwoLeftRight","layoutTwo","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutThree","w","h0","h","w0","w2","w1","h1","layoutFourTopAndOther","h2","layoutFourLeftAndOther","layoutFour","containerStyle","element","calculateAuthorWidth","createElement","font","whiteSpace","left","opacity","appendChild","offsetWidth","useFocusMessage","elementRef","isFocused","focusDirection","noFocusHighlight","messagesContainer","closest","fastSmoothScroll","ContextMenuContainer","targetUserIds","targetChatId","targetMessageId","targetMessage","selectIsMessageFocused","focusedMessage","observeIntersection","isEmbedded","appearanceOrder","isLastInList","useOnIntersect","noAppearanceAnimation","markShown","targetUsers","renderActionMessageText","asPlain","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","isContextMenuShown","data-message-id","onMouseDown","onContextMenu","EmbeddedMessage","customText","isIntersecting","useIsIntersecting","pictogramId","isRoundVideo","getMessageRoundVideo","senderTitle","outgoingStatus","signature","views","isEdited","formatTime","MessageOutgoingStatus","Sticker","observeIntersectionForPlaying","shouldLoop","isModalOpen","openModal","closeModal","isAnimated","isMemojiSticker","MEMOJI_STICKER_ID","shouldLoad","shouldPlay","mediaHash","getMessageMediaFormat","isMediaLoaded","isAnimationLoaded","markAnimationLoaded","isMediaReady","shouldRenderFullMedia","useTransitionForMedia","getStickerDimensions","thumbClassName","stickerClassName","AnimatedSticker","animationData","play","noLoop","onLoad","fromSticker","useBlurredMediaThumbRef","fullMediaData","useCanvasBlur","IS_CANVAS_FILTER_SUPPORTED","SELECTED_APPENDIX_BACKGROUND","getCustomAppendixBg","inSelectMode","isSelected","img","Image","onload","canvas","ctx","getContext","drawImage","getImageData","getAppendixColorFromImage","Photo","shouldAutoLoad","isInSelectMode","uploadProgress","nonInteractive","shouldAffectAppendix","onCancelUpload","localBlobUrl","isDownloadAllowed","setIsDownloadAllowed","shouldDownload","downloadProgress","useMediaWithDownloadProgress","thumbRef","isUploading","isTransferring","transferProgress","getMediaTransferState","wasDownloadDisabled","usePrevious","shouldRenderSpinner","spinnerClassNames","shouldRenderThumb","isAllowed","contentEl","appendixBg","setProperty","setAttribute","ProgressSpinner","useHeavyAnimationCheckForVideo","playerRef","shouldPlayRef","safePlay","isPlayAllowed","wasPlaying","freezePlaying","paused","unfreezePlaying","unfreezePlayingOnRaf","hasFocus","useBackgroundMode","Video","shouldAutoPlay","videoRef","getMessageWebPageVideo","setIsPlayAllowed","isInline","isBuffered","bufferingHandlers","useBuffering","playProgress","setPlayProgress","handleTimeUpdate","currentTime","duration","usePauseOnInactive","useVideoCleanup","videoClassName","autoPlay","muted","loop","playsInline","onTimeUpdate","isGif","formatMediaDuration","contact","openUserInfo","Avatar","formatPhoneNumberWithCode","selected","loadingOptions","setValues","event","newValues","Checkbox","subLabel","getPercentage","toFixed","PollOption","answer","voteResults","maxVotersCount","correctResults","shouldAnimate","r","correctAnswer","showIcon","answerPercent","finalPercent","setFinalPercent","lineRef","lineWidth","isAnimationDoesNotStart","lineEl","svgEl","lineStyle","onSendVote","openPollResults","summary","isSubmitting","setIsSubmitting","chosenOptions","setChosenOptions","isSolutionShown","setIsSolutionShown","wasSubmitted","setWasSubmitted","closePeriod","setClosePeriod","closed","closeDate","floor","countdownRef","hasVoted","canVote","canViewResult","isPublic","isMultiple","multipleChoice","answers","isCorrect","hidden","quiz","countdownEl","circumference","PI","lastElementChild","timerEl","strokeDashOffset","textContent","timer","recentVoters","handleRadioChange","handleCheckboxChange","handleVoteClick","handleViewResultsClick","handleSolutionShow","handleSolutionHide","solution","Notification","renderTextWithEntities","solutionEntities","onDismiss","containerId","question","getPollTypeString","RadioGroup","loadingOption","isQuiz","getReadableVotersCount","isText","inPreview","onMediaClick","onCancelMediaTransfer","webPage","getMessageWebPage","isSquarePhoto","handleMediaClick","siteName","displayUrl","isMediaInteractive","truncatedDescription","trimText","data-initial","SafeLink","getMessageInvoice","photoUrl","withSelectControl","WrappedComponent","ownProps","selectIsMessageSelected","handleMessageSelect","newProps","PhotoWithSelect","VideoWithSelect","uploadsById","hasCustomAppendix","albumLayout","cancelSendingMessage","mediaCount","handleCancelUpload","containerWidth","containerHeight","fileUpload","currentOnRelease","RoundVideo","playingProgressRef","shouldSpinnerRender","isActivated","setIsActivated","setProgress","playerEl","playingProgressEl","stopPlaying","capturePlaying","onRelease","ROUND_VIDEO_DIMENSIONS","onEnded","InlineButtons","shouldRequestThreadUpdate","recentReplierIds","recentRepliers","hasUnread","data-cnt","handleDocumentGroupMouseEnter","lastGroupElement","getLastElementInDocumentGroup","handleDocumentGroupMouseLeave","removeAttribute","nextElementSibling","withSenderName","withAvatar","viaBotId","chatUsername","forceSenderName","isAnonymousOwnMessage","originSender","botSender","threadTopMessageId","isThreadTop","shouldHideReply","replyMessageSender","selectUploadProgress","isForwarding","highlight","singleEmoji","getMessageSingleEmoji","every","isSingleEmoji","animatedEmoji","selectAnimatedEmoji","isGroupSelected","selectIsDocumentGroupSelected","isPinnedList","shouldAutoLoadMedia","selectShouldAutoLoadMedia","shouldAutoPlayMedia","selectShouldAutoPlayMedia","shouldLoopStickers","selectShouldLoopStickers","selectOutgoingStatus","observeIntersectionForBottom","observeIntersectionForMedia","observeIntersectionForAnimatedStickers","noComments","isFirstInGroup","isLastInGroup","isFirstInDocumentGroup","isLastInDocumentGroup","openMediaViewer","openAudioPlayer","markMessagesRead","sendPollVote","clickInlineButton","bottomMarkerRef","appendixRef","isLocal","hasReply","isReplyMessage","hasThread","asForwarded","isLinkedChannelPost","isInDocumentGroup","voice","getMessageCustomShape","textParts","renderMessageText","adminTitle","metaSafeAuthorWidth","canShowActionButton","canForward","canFocus","isChannelPost","fromMessageId","avatarPeer","senderPeer","containerClassName","contentClassName","hasComments","hasActionButton","classNames","isMedia","isMediaWithNoText","isViaBot","isRound","buildContentClassName","withCommentButton","withAppendix","handleGroupDocumentMessagesSelect","handleContainerDoubleClick","handleContentDoubleClick","handleAvatarClick","handleSenderClick","handleViaBotClick","handleReplyClick","MediaViewerOrigin","ScheduledInline","Inline","handleAudioPlay","handleAlbumMediaClick","albumMessageId","ScheduledAlbum","Album","getIsKeyboardVisible","handleReadMedia","handleVoteSend","handleGroupForward","handleForward","handleFocus","handleFocusForwarded","calculatedWidth","noMediaCorners","extraPadding","onDoubleClick","data-last-message-id","data-has-unread-mention","isAvatarPeerUser","avatarUser","avatarChat","hiddenName","renderAvatar","shouldInlineMeta","textContentClass","senderColor","getUserColorKey","renderSenderName","AnimatedEmoji","forceLoadPreview","Audio","isSelectable","onPlay","onReadMedia","Document","renderContent","messageGroups","isViewportNewest","isUnread","withUsers","anchorIdRef","memoFirstUnreadIdRef","hasLinkedChat","isSchedule","onFabToggle","onNotchToggle","openHistoryCalendar","observeIntersectionForReading","observe","useIntersectionObserver","rootRef","throttleMs","margin","freezeForReading","unfreezeForReading","entries","mentionIds","entry","dataset","useMessageObservers","backwardsTriggerRef","forwardsTriggerRef","fabTriggerRef","loadMoreBackwards","loadMoreForwards","toggleScrollTools","scrollHeight","scrollBottom","isAtBottom","MESSAGE_LIST_SENSITIVE_AREA","triggerEntry","resetScroll","observeIntersectionForFab","freezeForFab","unfreezeForFab","observeIntersectionForNotch","freezeForNotch","unfreezeForNotch","useScrollHooks","unreadDivider","messageCountToAnimate","messageGroup","flatten","appearanceIndex","dateGroup","dateGroupIndex","dateGroupsArray","senderGroup","senderGroupIndex","senderGroupsArray","compact","currentDocumentGroupId","messageIndex","isMessageAlbum","documentGroupId","nextDocumentGroupId","originalId","getMessageOriginalId","teactFastList","SCHEDULED_WHEN_ONLINE","formatHumanDate","runDebouncedForScroll","selectCurrentMessageIds","restrictionReason","focusingId","hasFocusHighlight","withLastMessageWhenPreloading","botDescription","chatBot","isChatLoaded","isChannelChat","threadFirstMessageId","selectFirstMessageId","setScrollOffset","scrollOffsetRef","selectScrollOffset","anchorTopRef","listItemElementsRef","memoUnreadDividerBeforeIdRef","memoFocusingIdRef","isScrollTopJustUpdatedRef","shouldAnimateAppearanceRef","setContainerHeight","onTickEnd","listedMessages","orderBy","loadMoreAround","handleScroll","parentElement","observer","ResizeObserver","offsetParent","contentRect","disconnect","windowHeight","normalHeight","String","clientHeight","preservedItemElements","useLayoutEffectWithPrevDeps","prevMessageIds","prevIsViewportNewest","prevContainerHeight","shouldForceScroll","lastItemElement","lastItemHeight","newScrollTop","hasFirstMessageChanged","hasLastMessageChanged","isAlreadyFocusing","isResized","isAnimatingScroll","useEffectWithPrevDeps","prevIsSelectModeActive","dispatchHeavyAnimationEvent","onScroll","focusNextReply","messageElements","lastMessageElement","buildAttachment","filename","blob","isQuick","URL","createObjectURL","mimeType","quick","preloadImage","newBlob","toBlob","squeezeImage","revokeObjectURL","videoWidth","videoHeight","preloadVideo","createPosterForVideo","resetInput","applyIosAutoCapitalizationFix","inputEl","POLYFILL_OPTIONS","encoderPath","reuseWorker","BLOB_PARAMS","opusRecorderPromise","OpusRecorder","mediaRecorder","init","default","start","analyzerCallback","startMediaRecorder","startedAt","pausedAt","chunks","waveform","ondataavailable","typedArray","releaseAnalyzer","recorder","source","sourceNode","analyser","context","createAnalyser","fftSize","connect","dataLength","frequencyBinCount","dataArray","Uint8Array","isDestroyed","tick","getByteFrequencyData","volume","requestAnimationFrame","subscribeToAnalyzer","stop","reject","onstop","Blob","onerror","delayStop","CLIPBOARD_ACCEPTED_TYPES","getMessageTextAsHtml","tempEl","INLINE_BOT_QUERY_REGEXP","HAS_NEW_LINE","useInlineBotTooltip","html","markIsOpen","unmarkIsOpen","replace","innerText","getPlainText","queryInlineBot","resetInlineBot","canShowHelp","parseStartWithUsernameString","usernameLowered","prevQuery","prevUsername","botId","loadMore","closeTooltip","DeleteMessageModal","openTimeout","isFirstTimeActivation","onActivate","buttonProps","AttachMenu","SymbolMenu","InlineBotTooltip","MentionTooltip","CustomSend","StickerTooltipAsync","StickerTooltip","BotKeyboardMenu","forwardMessageIds","forwardedMessagesCount","exitForwardMode","canAnimate","useAsyncRendering","clearEmbedded","handleMessageClick","AttachmentModal","PollModal","DropArea","RE_LINK","RegExp","RE_LINK_TEMPLATE","messageText","toggleMessageWebPage","link","parseMessageInput","linkEntity","ApiMessageEntityTypes","TextUrl","textMatch","renderingWebPage","webPageWithoutPhoto","messageStub","CalendarModal","PaymentModal","MainButtonState","ReceiptModal","chatUser","selectChatUser","messageWithActualBotKeyboard","selectNewestMessageWithBotKeyboardButtons","baseEmojiKeywords","BASE_EMOJI_KEYWORD_LANG","editingMessage","canScheduleUntilOnline","wasOnline","withScheduledButton","shouldSchedule","botKeyboardMessageId","stickersForEmoji","groupChatMembers","topInlineBotIds","isReceiptModalOpen","shouldSuggestStickers","isInlineBotLoading","dropAreaState","onDropHide","editMessage","saveDraft","clearDraft","setStickerSearchQuery","setGifSearchQuery","closePollModal","closePaymentModal","clearReceipt","addRecentEmoji","sendInlineBotResult","setHtml","lastMessageSendTimeSeconds","prevDropAreaState","isCalendarOpen","openCalendar","closeCalendar","scheduledMessageArgs","setScheduledMessageArgs","htmlRef","setAttachments","isBotKeyboardOpen","openBotKeyboard","closeBotKeyboard","isAttachMenuOpen","openAttachMenu","closeAttachMenu","isSymbolMenuOpen","openSymbolMenu","closeSymbolMenu","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isSymbolMenuLoaded","onSymbolMenuLoadingComplete","isHoverDisabled","disableHover","enableHover","startRecordingVoice","stopRecordingVoice","pauseRecordingVoice","activeVoiceRecording","currentRecordTime","recordButtonRef","mainButtonRef","startRecordTimeRef","setActiveVoiceRecording","setCurrentRecordTime","IS_VOICE_RECORDING_SUPPORTED","voiceRecording","tickVolume","boxShadow","useVoiceRecording","mainButtonState","Edit","Send","Record","canShowCustomSendMenu","isMentionTooltipOpen","mentionFilter","closeMentionTooltip","insertMention","mentionFilteredUsers","useMentionTooltip","isInlineBotTooltipOpen","inlineBotId","isInlineBotTooltipGallery","inlineBotSwitchPm","inlineBotResults","closeInlineBotTooltip","inlineBotHelp","loadMoreForInlineBot","isCustomSendMenuOpen","allowedAttachmentOptions","getAllowedAttachmentOptions","isChatAdmin","slowMode","getChatSlowModeOptions","isStickerTooltipOpen","closeStickerTooltip","isDisabled","clearStickersForEmoji","IS_EMOJI_SUPPORTED","parseEmojiOnlyString","hasStickers","useStickerTooltip","canSendStickers","isEmojiTooltipOpen","closeEmojiTooltip","filteredEmojis","insertEmoji","useEmojiTooltip","insertTextAndUpdateCursor","selection","getSelection","newHtml","rangeCount","selectionRange","getRangeAt","isSelectionInsideInput","range","deleteContents","fragment","createContextualFragment","lastInsertedNode","lastChild","insertNode","setStartAfter","setEndAfter","collapse","removeAllRanges","addRange","insertHtmlInSelection","dispatchEvent","Event","bubbles","focusEditableElement","removeSymbol","execCommand","tempInput","contentEditable","textLength","createRange","setStart","setEnd","removeChild","deleteLastCharacterOutsideSelection","resetComposer","shouldPreserveInput","prevChatId","handleEditComplete","editedMessage","hasMessageMedia","useEditing","updateDraft","draftChatId","draftThreadId","runDebouncedForSaveDraft","DRAFT_DEBOUNCE","prevThreadId","prevHtml","handleBlur","useDraft","handlePaste","clipboardData","input","EDITABLE_INPUT_MODAL_ID","items","media","file","getAsFile","pastedText","getData","substring","useClipboardPaste","handleFileSelect","files","handleAppendFiles","handleClearAttachment","handleSend","currentAttachments","record","extraLength","textParams","nowSeconds","secondsSinceLastMessage","nextSendDateNotReached","nextSendDate","seconds","secondsRemaining","isSlowMode","handleStickerSelect","handleGifSelect","gif","handleInlineBotSelect","inlineResult","handlePollSend","handleSilentSend","handleMessageSchedule","isWhenOnline","restArgs","getTime","handleMessageScheduleUntilOnline","handleCloseCalendar","handleSearchOpen","handleSymbolMenuOpen","handleAllScheduledClick","mainButtonHandler","areVoiceMessagesNotAllowed","canAttachMedia","prevEditedMessage","renderedEditedMessage","scheduledDefaultDate","setSeconds","setMilliseconds","scheduledMaxDate","setFullYear","getFullYear","sendButtonAriaLabel","symbolMenuButtonClassName","onSend","Portal","DropAreaState","None","withQuick","QuickFile","onHide","onFileSelect","caption","onCaptionUpdate","onFileAppend","onClear","onInsertUserName","filteredUsers","onSelectResult","canAttachEmbedLinks","faded","MessageInput","forcedPlaceholder","shouldSetFocus","shouldSuppressFocus","shouldSuppressTextFormatter","onUpdate","onSuppressedFocus","formatVoiceRecordDuration","onStickerSelect","emojis","onEmojiSelect","onPollCreate","onGifSelect","onRemoveSymbol","onSearchOpen","onSilentSend","onScheduleSend","withTimePicker","maxAt","getDayStartAt","isFutureMode","secondButtonLabel","onSubmit","onSecondButtonClick","MobileSearch","MessageSelectToolbar","UnpinAllMessagesModal","CLOSE_ANIMATION_DURATION","canBeQuicklyUploaded","kind","CONTENT_TYPES_FOR_QUICK_UPLOAD","isBlurred","isBackgroundBlurred","background","customBackground","backgroundColor","patternColor","themes","isMobileSearchActive","getCanPostInChat","isBotNotStarted","isPinnedMessageList","isScheduledMessageList","currentUserBannedRights","defaultBannedRights","hasPinnedOrAudioMessage","loadUser","setDropAreaState","isFabShown","setIsFabShown","isNotchShown","setIsNotchShown","isUnpinModalOpen","setIsUnpinModalOpen","setIsReady","ANIMATION_LEVEL_MIN","renderingChatId","usePrevDuringAnimation","renderingThreadId","renderingMessageListType","renderingCanPost","renderingHasTools","renderingIsFabShown","handleDragEnter","dataTransfer","shouldDrawQuick","handleHideDropArea","handleOpenUnpinModal","closeUnpinModal","handleUnpinAllMessages","handleTabletFocus","customBackgroundValue","settingValue","cacheApi","CUSTOM_BG_CACHE_NAME","useCustomBackground","MASK_IMAGE_DISABLED","messagingDisabledClassName","messageSendingRestrictionReason","getMessageSendingRestrictionReason","footerClassName","onTransitionEnd","propertyName","DARK_THEME_BG_COLOR","LIGHT_THEME_BG_COLOR","onDragEnter","onUnpin","HeaderContent","isProfile","isManagement","messageSearchQuery","stickerSearchQuery","selectCurrentStickerSearch","gifSearchQuery","selectCurrentGifSearch","canManage","isCreator","isColumnOpen","isSearch","isStickerSearch","isGifSearch","isPollResults","isAddingChatMembers","profileState","managementScreen","setLocalTextSearchQuery","searchTextMessagesLocal","toggleManagement","shouldSkipAnimation","backButtonRef","handleMessageSearchQueryChange","handleStickerSearchQueryChange","handleGifSearchQueryChange","setShouldSkipTransition","contentKey","ProfileState","Profile","SharedMedia","MemberList","Search","PollResults","StickerSearch","GifSearch","AddingMembers","ManagementScreens","Initial","ManageInitial","ChatPrivacyType","ManageChatPrivacyType","Discussion","ManageDiscussion","ChannelSubscribers","ManageChannelSubscribers","GroupPermissions","ManageGroupPermissions","ChatAdministrators","ManageChatAdministrators","GroupRemovedUsers","ManageGroupRemovedUsers","GroupUserPermissionsCreate","ManageGroupUserPermissionsCreate","GroupUserPermissions","ManageGroupUserPermissions","GroupRecentActions","ManageGroupRecentActions","ChatAdminRights","ManageGroupAdminRights","GroupMembers","ManageGroupMembers","renderingContentKey","renderHeaderContent","isBackButton","buttonClassName","useProfileViewportIds","loadMoreMembers","searchMessages","tabType","mediaSearchType","resultType","sortUserIds","memberViewportIds","getMoreMembers","noProfileInfoForMembers","currentResultType","handleLoadMore","getMore","useInfiniteScroll","MEMBERS_SLICE","isOnTop","useInfiniteScrollForMembers","mediaViewportIds","getMoreMedia","noProfileInfoForMedia","useInfiniteScrollForSharedMedia","documentViewportIds","getMoreDocuments","noProfileInfoForDocuments","linkViewportIds","getMoreLinks","noProfileInfoForLinks","audioViewportIds","getMoreAudio","noProfileInfoForAudio","noProfileInfo","forSharedMediaType","messageIdsRef","getMessageContentIds","reverse","runThrottledForScroll","isScrollingProgrammatically","isFirstPhoto","isSavedMessages","isDeleted","isDeletedUser","getMediaHash","forceAvatar","getChatAvatarHash","imageHash","ApiMediaFormat","BlobUrl","avatarThumbnailData","useBlurSync","dataUri","imageSrc","prevImageSrc","decoding","userFullName","getUserFullName","getFirstLetters","fullClassName","forceShowSelf","loadFullUser","fullName","slideAnimation","currentPhotoIndex","setCurrentPhotoIndex","isFirst","isLast","profile","currentIndex","usePhotosPreload","handleProfilePhotoClick","ProfileAvatar","selectPreviousMedia","selectNextMedia","renderPhoto","isVerifiedIconShown","isVerified","renderPhotoTabs","aria-label","VerifiedIcon","isUserOnline","getUserStatus","canInviteUsers","isUserRightBanned","getHasAdminRight","handleNotificationChange","copy","entity","copyTextToClipboard","formattedNumber","getChatLink","bio","getChatDescription","ListItem","multiline","narrow","isStatic","contactName","getUserFirstOrLastName","deleteChatMember","handleDeleteChatMember","Modal","onEnter","TABS","buildInfiniteScrollItemSelector","isGroup","isChatGroup","hasMembersTab","areMembersHidden","canViewMembers","canAddMembers","canDeleteMembers","resolvedUserId","onProfileStateChange","setLocalMediaSearchType","searchMediaMessagesLocal","loadProfilePhotos","setActiveTab","deletingUserId","setDeletingUserId","prevTabType","tabsEl","prevProfileState","tabListEl","determineProfileState","useProfileState","applyTransitionFix","releaseTransitionFix","transitionElSelector","setMinHeight","transitionEl","minHeight","overflowY","scrollBarWidth","clientWidth","marginRight","useTransitionFixes","cacheBuster","resetCacheBuster","setCacheBuster","useCacheBuster","handleTransitionStop","handleNewMemberDialogOpen","handleSelectMedia","handlePlayAudio","handleMemberClick","handleMessageFocus","handleDeleteMembersModalClose","renderingDelay","isFirstTab","SLIDE_TRANSITION_DURATION","canRenderContents","getMemberContextAction","handler","renderSharedMedia","noSpinner","NothingFound","Media","withDate","smaller","onDateClick","WebLink","onMessageClick","teactOrderKey","contextActions","InfiniteScroll","itemSelector","sensitiveArea","PROFILE_SENSITIVE_AREA","preloadBackwards","noScrollRestoreOnTop","noFastList","onLoadMore","renderProfileInfo","shouldRestoreHeight","onStart","onStop","big","FloatingActionButton","RightSearch","Management","localContactIds","isSearching","onNextStep","setUserSearchQuery","selectedMemberIds","setSelectedMemberIds","noPickerScrollRestore","member","handleFilterChange","displayedIds","sortChatIds","foundContactIds","contactId","isUserBot","canBeInvitedToGroup","handleNextStep","Picker","itemIds","selectedIds","filterValue","filterPlaceholder","searchInputId","onSelectedIdsChange","onFilterChange","noScrollRestore","MAIN_SCREENS_COUNT","RightColumnContent","MANAGEMENT_SCREENS_COUNT","blurSearchInput","areActiveChatsLoaded","selectAreActiveChatsLoaded","selectRightColumnContentKey","currentProfileUserId","selectedId","isChatSelected","toggleChatInfo","closePollResults","addChatMembers","setProfileState","setManagementScreen","selectedChatMemberId","setSelectedChatMemberId","isPromotedByCurrentUser","setIsPromotedByCurrentUser","isScrolledDown","ChatInfo","UserInfo","isOverlaying","close","shouldScrollUp","GroupType","handleSelectChatMember","memberId","isPromoted","handleAppendingChatMembers","onChatMemberSelect","prevContentKey","MediaViewer","Dialogs","ForwardPicker","SafeLinkModal","HistoryCalendar","notificationInterval","DEBUG_isLogged","updateIcon","asUnread","updatePageTitle","nextTitle","isMediaViewerOpen","selectIsMediaViewerOpen","isForwardModalOpen","selectIsForwardModalOpen","hasNotifications","hasDialogs","isHistoryCalendarOpen","loadNotificationSettings","loadNotificationExceptions","updateIsOnline","loadTopInlineBots","loadEmojiKeywords","middleColumnTransitionClassNames","rightColumnTransitionClassNames","prevIsLeftColumnShown","dispatchHeavyAnimationEnd","waitForTransitionEnd","prevIsRightColumnShown","initialUnread","clearInterval","setInterval","INACTIVE_MARKER","newUnread","PAGE_TITLE","stopEvent","onDrop","onDragOver","initApi"],"mappings":"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","file":"4.f46a6915735f9deb48a8.js","sourcesContent":["import { addReducer } from '../../../lib/teact/teactn';\n\nimport {\n updateLocalTextSearch,\n replaceLocalTextSearchResults,\n updateLocalMediaSearchType,\n} from '../../reducers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { selectCurrentMessageList } from '../../selectors';\nimport { buildChatThreadKey } from '../../helpers';\nimport { GlobalState } from '../../../global/types';\n\naddReducer('openLocalTextSearch', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n return updateLocalTextSearch(global, chatId, threadId, true);\n});\n\naddReducer('closeLocalTextSearch', closeLocalTextSearch);\n\naddReducer('setLocalTextSearchQuery', (global, actions, payload) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const { query } = payload!;\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const { query: currentQuery } = global.localTextSearch.byChatThreadKey[chatThreadKey] || {};\n\n if (query !== currentQuery) {\n global = replaceLocalTextSearchResults(global, chatId, threadId, MEMO_EMPTY_ARRAY);\n }\n\n global = updateLocalTextSearch(global, chatId, threadId, true, query);\n\n return global;\n});\n\naddReducer('setLocalMediaSearchType', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return undefined;\n }\n\n const { mediaType } = payload!;\n return updateLocalMediaSearchType(global, chatId, mediaType);\n});\n\nexport function closeLocalTextSearch(global: GlobalState): GlobalState {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return global;\n }\n\n global = updateLocalTextSearch(global, chatId, threadId, false);\n global = replaceLocalTextSearchResults(global, chatId, threadId, undefined);\n return global;\n}\n","import { addReducer, setGlobal } from '../../../lib/teact/teactn';\n\nimport {\n exitMessageSelectMode, replaceThreadParam, updateCurrentMessageList,\n} from '../../reducers';\nimport { selectCurrentMessageList } from '../../selectors';\nimport { closeLocalTextSearch } from './localSearch';\n\naddReducer('openChat', (global, actions, payload) => {\n const {\n id, threadId = -1, type = 'thread', shouldReplaceHistory = false,\n } = payload!;\n\n const currentMessageList = selectCurrentMessageList(global);\n\n if (!currentMessageList\n || (\n currentMessageList.chatId !== id\n || currentMessageList.threadId !== threadId\n || currentMessageList.type !== type\n )) {\n global = replaceThreadParam(global, id, threadId, 'replyStack', []);\n global = exitMessageSelectMode(global);\n global = closeLocalTextSearch(global);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n contentToBeScheduled: undefined,\n },\n ...(id !== global.forwardMessages.toChatId && {\n forwardMessages: {},\n }),\n };\n\n setGlobal(global);\n }\n\n return updateCurrentMessageList(global, id, threadId, type, shouldReplaceHistory);\n});\n\naddReducer('openPreviousChat', (global) => {\n return updateCurrentMessageList(global, undefined);\n});\n\naddReducer('openChatWithInfo', (global, actions, payload) => {\n setGlobal({\n ...global,\n isChatInfoShown: true,\n });\n\n actions.openChat(payload);\n});\n\naddReducer('resetChatCreation', (global) => {\n return {\n ...global,\n chatCreation: undefined,\n };\n});\n\naddReducer('setNewChatMembersDialogState', (global, actions, payload) => {\n return {\n ...global,\n newChatMembersProgress: payload,\n };\n});\n\naddReducer('openNextChat', (global, actions, payload) => {\n const { targetIndexDelta, orderedIds } = payload;\n\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n actions.openChat({ id: orderedIds[0] });\n return;\n }\n\n const position = orderedIds.indexOf(chatId);\n\n if (position === -1) {\n return;\n }\n const nextId = orderedIds[position + targetIndexDelta];\n\n actions.openChat({ id: nextId, shouldReplaceHistory: true });\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { MAIN_THREAD_ID } from '../../../api/types';\nimport { FocusDirection } from '../../../types';\n\nimport { ANIMATION_END_DELAY, FAST_SMOOTH_MAX_DURATION } from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport {\n enterMessageSelectMode,\n toggleMessageSelection,\n exitMessageSelectMode,\n replaceThreadParam,\n updateFocusDirection,\n updateFocusedMessage,\n} from '../../reducers';\nimport {\n selectCurrentChat,\n selectViewportIds,\n selectIsRightColumnShown,\n selectCurrentMessageList,\n selectChat,\n selectThreadInfo,\n selectChatMessages,\n selectAllowedMessageActions,\n selectMessageIdsByGroupId,\n selectForwardedMessageIdsByGroupId,\n selectIsViewportNewest,\n selectReplyingToId,\n selectReplyStack,\n} from '../../selectors';\nimport { findLast } from '../../../util/iteratees';\n\nconst FOCUS_DURATION = 1500;\nconst FOCUS_NO_HIGHLIGHT_DURATION = FAST_SMOOTH_MAX_DURATION + ANIMATION_END_DELAY;\nconst POLL_RESULT_OPEN_DELAY_MS = 450;\n\nlet blurTimeout: number | undefined;\n\naddReducer('setScrollOffset', (global, actions, payload) => {\n const { chatId, threadId, scrollOffset } = payload!;\n\n return replaceThreadParam(global, chatId, threadId, 'scrollOffset', scrollOffset);\n});\n\naddReducer('setReplyingToId', (global, actions, payload) => {\n const { messageId } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n const { chatId, threadId } = currentMessageList;\n\n return replaceThreadParam(global, chatId, threadId, 'replyingToId', messageId);\n});\n\naddReducer('setEditingId', (global, actions, payload) => {\n const { messageId } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type } = currentMessageList;\n const paramName = type === 'scheduled' ? 'editingScheduledId' : 'editingId';\n\n return replaceThreadParam(global, chatId, threadId, paramName, messageId);\n});\n\naddReducer('editLastMessage', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!chatMessages || !viewportIds) {\n return undefined;\n }\n\n const lastOwnEditableMessageId = findLast(viewportIds, (id) => {\n return Boolean(chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId).canEdit);\n });\n\n if (!lastOwnEditableMessageId) {\n return undefined;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'editingId', lastOwnEditableMessageId);\n});\n\naddReducer('replyToNextMessage', (global, actions, payload) => {\n const { targetIndexDelta } = payload;\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!chatMessages || !viewportIds) {\n return;\n }\n\n const replyingToId = selectReplyingToId(global, chatId, threadId);\n const isLatest = selectIsViewportNewest(global, chatId, threadId);\n\n let messageId: number | undefined;\n\n if (!isLatest || !replyingToId) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n\n messageId = chat && chat.lastMessage ? chat.lastMessage.id : undefined;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n messageId = threadInfo ? threadInfo.lastMessageId : undefined;\n }\n } else {\n const chatMessageKeys = Object.keys(chatMessages);\n const indexOfCurrent = chatMessageKeys.indexOf(replyingToId.toString());\n const newIndex = indexOfCurrent + targetIndexDelta;\n messageId = newIndex <= chatMessageKeys.length + 1 && newIndex >= 0\n ? Number(chatMessageKeys[newIndex])\n : undefined;\n }\n actions.setReplyingToId({ messageId });\n actions.focusMessage({\n chatId, threadId, messageId,\n });\n});\n\naddReducer('openMediaViewer', (global, actions, payload) => {\n const {\n chatId, threadId, messageId, avatarOwnerId, profilePhotoIndex, origin,\n } = payload!;\n\n return {\n ...global,\n mediaViewer: {\n chatId,\n threadId,\n messageId,\n avatarOwnerId,\n profilePhotoIndex,\n origin,\n },\n forwardMessages: {},\n };\n});\n\naddReducer('closeMediaViewer', (global) => {\n return {\n ...global,\n mediaViewer: {},\n };\n});\n\naddReducer('openAudioPlayer', (global, actions, payload) => {\n const {\n chatId, threadId, messageId,\n } = payload!;\n\n return {\n ...global,\n audioPlayer: {\n chatId,\n threadId,\n messageId,\n },\n };\n});\n\naddReducer('closeAudioPlayer', (global) => {\n return {\n ...global,\n audioPlayer: {},\n };\n});\n\naddReducer('openPollResults', (global, actions, payload) => {\n const { chatId, messageId } = payload!;\n\n const shouldOpenInstantly = selectIsRightColumnShown(global);\n\n if (!shouldOpenInstantly) {\n window.setTimeout(() => {\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n pollResults: {\n chatId,\n messageId,\n voters: {},\n },\n });\n }, POLL_RESULT_OPEN_DELAY_MS);\n } else if (chatId !== global.pollResults.chatId || messageId !== global.pollResults.messageId) {\n setGlobal({\n ...global,\n pollResults: {\n chatId,\n messageId,\n voters: {},\n },\n });\n }\n});\n\naddReducer('closePollResults', (global) => {\n setGlobal({\n ...global,\n pollResults: {},\n });\n});\n\naddReducer('focusLastMessage', (global, actions) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId } = currentMessageList;\n\n let lastMessageId: number | undefined;\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n\n lastMessageId = chat && chat.lastMessage ? chat.lastMessage.id : undefined;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n lastMessageId = threadInfo ? threadInfo.lastMessageId : undefined;\n }\n\n if (!lastMessageId) {\n return;\n }\n\n actions.focusMessage({\n chatId, threadId, messageId: lastMessageId, noHighlight: true,\n });\n});\n\naddReducer('focusNextReply', (global, actions) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId } = currentMessageList;\n\n const replyStack = selectReplyStack(global, chatId, threadId);\n\n if (!replyStack || replyStack.length === 0) {\n actions.focusLastMessage();\n } else {\n const messageId = replyStack.pop();\n\n global = replaceThreadParam(global, chatId, threadId, 'replyStack', [...replyStack]);\n\n setGlobal(global);\n\n actions.focusMessage({\n chatId,\n threadId,\n messageId,\n });\n }\n\n return undefined;\n});\n\naddReducer('focusMessage', (global, actions, payload) => {\n const {\n chatId, threadId = MAIN_THREAD_ID, messageListType = 'thread', noHighlight, groupedId, groupedChatId,\n replyMessageId,\n } = payload!;\n\n let { messageId } = payload!;\n\n if (groupedId !== undefined) {\n const ids = selectForwardedMessageIdsByGroupId(global, groupedChatId, groupedId);\n if (ids && ids.length) {\n ([messageId] = ids);\n }\n }\n\n const currentMessageList = selectCurrentMessageList(global);\n const shouldSwitchChat = !currentMessageList || (\n chatId !== currentMessageList.chatId\n || threadId !== currentMessageList.threadId\n || messageListType !== currentMessageList.type\n );\n\n if (blurTimeout) {\n clearTimeout(blurTimeout);\n blurTimeout = undefined;\n }\n blurTimeout = window.setTimeout(() => {\n let newGlobal = getGlobal();\n newGlobal = updateFocusedMessage(newGlobal);\n newGlobal = updateFocusDirection(newGlobal);\n setGlobal(newGlobal);\n }, noHighlight ? FOCUS_NO_HIGHLIGHT_DURATION : FOCUS_DURATION);\n\n global = updateFocusedMessage(global, chatId, messageId, noHighlight);\n global = updateFocusDirection(global, undefined);\n\n if (replyMessageId) {\n const replyStack = selectReplyStack(global, chatId, threadId) || [];\n global = replaceThreadParam(global, chatId, threadId, 'replyStack', [...replyStack, replyMessageId]);\n }\n\n if (shouldSwitchChat) {\n global = updateFocusDirection(global, FocusDirection.Static);\n }\n\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (viewportIds && viewportIds.includes(messageId)) {\n setGlobal(global);\n actions.openChat({ id: chatId, threadId });\n return undefined;\n }\n\n if (shouldSwitchChat) {\n global = replaceThreadParam(global, chatId, threadId, 'viewportIds', undefined);\n }\n\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', undefined);\n\n if (viewportIds && !shouldSwitchChat) {\n const direction = messageId > viewportIds[0] ? FocusDirection.Down : FocusDirection.Up;\n global = updateFocusDirection(global, direction);\n }\n\n setGlobal(global);\n\n actions.openChat({ id: chatId, threadId });\n actions.loadViewportMessages();\n return undefined;\n});\n\naddReducer('openForwardMenu', (global, actions, payload) => {\n const { fromChatId, messageIds, groupedId } = payload!;\n let groupedMessageIds;\n if (groupedId) {\n groupedMessageIds = selectMessageIdsByGroupId(global, fromChatId, groupedId);\n }\n return {\n ...global,\n forwardMessages: {\n fromChatId,\n messageIds: groupedMessageIds || messageIds,\n isModalShown: true,\n },\n };\n});\n\naddReducer('exitForwardMode', (global) => {\n setGlobal({\n ...global,\n forwardMessages: {},\n });\n});\n\naddReducer('setForwardChatId', (global, actions, payload) => {\n const { id } = payload!;\n\n setGlobal({\n ...global,\n forwardMessages: {\n ...global.forwardMessages,\n toChatId: id,\n isModalShown: false,\n },\n });\n\n actions.openChat({ id });\n actions.closeMediaViewer();\n actions.exitMessageSelectMode();\n});\n\naddReducer('openForwardMenuForSelectedMessages', (global, actions) => {\n if (!global.selectedMessages) {\n return;\n }\n\n const { chatId: fromChatId, messageIds } = global.selectedMessages;\n\n actions.openForwardMenu({ fromChatId, messageIds });\n});\n\naddReducer('enterMessageSelectMode', (global, actions, payload) => {\n const { messageId } = payload || {};\n const openChat = selectCurrentChat(global);\n if (!openChat) {\n return global;\n }\n\n return enterMessageSelectMode(global, openChat.id, messageId);\n});\n\naddReducer('toggleMessageSelection', (global, actions, payload) => {\n const {\n messageId,\n groupedId,\n childMessageIds,\n withShift,\n } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n\n global = toggleMessageSelection(\n global, chatId, threadId, messageListType, messageId, groupedId, childMessageIds, withShift,\n );\n\n setGlobal(global);\n\n if (global.shouldShowContextMenuHint) {\n actions.disableContextMenuHint();\n actions.showNotification({\n // eslint-disable-next-line max-len\n message: `To **edit** or **reply**, close this menu. Then ${IS_TOUCH_ENV ? 'long tap' : 'right click'} on a message.`,\n });\n }\n});\n\naddReducer('disableContextMenuHint', (global) => {\n if (!global.shouldShowContextMenuHint) {\n return undefined;\n }\n\n return {\n ...global,\n shouldShowContextMenuHint: false,\n };\n});\n\naddReducer('exitMessageSelectMode', exitMessageSelectMode);\n\naddReducer('openPollModal', (global) => {\n return {\n ...global,\n isPollModalOpen: true,\n };\n});\n\naddReducer('closePollModal', (global) => {\n return {\n ...global,\n isPollModalOpen: false,\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { updateGlobalSearch, updateGlobalSearchContent } from '../../reducers';\n\nconst MAX_RECENTLY_FOUND_IDS = 10;\n\naddReducer('setGlobalSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n const { chatId } = global.globalSearch;\n\n return updateGlobalSearch(global, {\n globalResults: {},\n localResults: {},\n resultsByType: undefined,\n ...(query ? { fetchingStatus: { chats: !chatId, messages: true } } : { fetchingStatus: undefined }),\n query,\n });\n});\n\naddReducer('addRecentlyFoundChatId', (global, actions, payload) => {\n const { id } = payload!;\n const { recentlyFoundChatIds } = global.globalSearch;\n\n if (!recentlyFoundChatIds) {\n return updateGlobalSearch(global, { recentlyFoundChatIds: [id] });\n }\n\n const newRecentIds = recentlyFoundChatIds.filter((chatId) => chatId !== id);\n newRecentIds.unshift(id);\n if (newRecentIds.length > MAX_RECENTLY_FOUND_IDS) {\n newRecentIds.pop();\n }\n\n return updateGlobalSearch(global, { recentlyFoundChatIds: newRecentIds });\n});\n\naddReducer('clearRecentlyFoundChats', (global) => {\n return updateGlobalSearch(global, { recentlyFoundChatIds: undefined });\n});\n\naddReducer('setGlobalSearchContent', (global, actions, payload) => {\n const { content } = payload!;\n\n return updateGlobalSearchContent(global, content);\n});\n\naddReducer('setGlobalSearchChatId', (global, actions, payload) => {\n const { id } = payload!;\n\n return updateGlobalSearch(global, { chatId: id, query: undefined, resultsByType: undefined });\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\naddReducer('setStickerSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n search: {\n query,\n resultIds: undefined,\n },\n },\n };\n});\n\naddReducer('setGifSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return {\n ...global,\n gifs: {\n ...global.gifs,\n search: {\n query,\n offsetId: undefined,\n results: undefined,\n },\n },\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { updateSelectedUserId, updateUserSearch } from '../../reducers';\n\naddReducer('openUserInfo', (global, actions, payload) => {\n const { id } = payload!;\n\n actions.openChat({ id });\n});\n\nconst clearSelectedUserId = (global: GlobalState) => updateSelectedUserId(global, undefined);\n\naddReducer('openChat', clearSelectedUserId);\n\naddReducer('setUserSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return updateUserSearch(global, {\n globalUserIds: undefined,\n localUserIds: undefined,\n fetchingStatus: Boolean(query),\n query,\n });\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TABLET_COLUMN_LAYOUT } from '../../../util/environment';\nimport getReadableErrorText from '../../../util/getReadableErrorText';\nimport { selectCurrentMessageList } from '../../selectors';\nimport { ApiError } from '../../../api/types';\n\nconst MAX_STORED_EMOJIS = 18; // Represents two rows of recent emojis\n\naddReducer('toggleChatInfo', (global) => {\n return {\n ...global,\n isChatInfoShown: !global.isChatInfoShown,\n };\n});\n\naddReducer('toggleManagement', (global): GlobalState | undefined => {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n return undefined;\n }\n\n return {\n ...global,\n management: {\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...global.management.byChatId[chatId],\n isActive: !(global.management.byChatId[chatId] || {}).isActive,\n },\n },\n },\n };\n});\n\naddReducer('closeManagement', (global): GlobalState | undefined => {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n return undefined;\n }\n\n return {\n ...global,\n management: {\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...global.management.byChatId[chatId],\n isActive: false,\n },\n },\n },\n };\n});\n\naddReducer('openChat', (global) => {\n if (!IS_SINGLE_COLUMN_LAYOUT && !IS_TABLET_COLUMN_LAYOUT) {\n return undefined;\n }\n\n return {\n ...global,\n isLeftColumnShown: global.messages.messageLists.length === 0,\n };\n});\n\naddReducer('toggleLeftColumn', (global) => {\n return {\n ...global,\n isLeftColumnShown: !global.isLeftColumnShown,\n };\n});\n\naddReducer('addRecentEmoji', (global, action, payload) => {\n const { emoji } = payload!;\n const { recentEmojis } = global;\n if (!recentEmojis) {\n return {\n ...global,\n recentEmojis: [emoji],\n };\n }\n\n const newEmojis = recentEmojis.filter((e) => e !== emoji);\n newEmojis.unshift(emoji);\n if (newEmojis.length > MAX_STORED_EMOJIS) {\n newEmojis.pop();\n }\n\n return {\n ...global,\n recentEmojis: newEmojis,\n };\n});\n\naddReducer('addRecentSticker', (global, action, payload) => {\n const { sticker } = payload!;\n const { recent } = global.stickers;\n if (!recent) {\n return {\n ...global,\n stickers: {\n ...global.stickers,\n recent: {\n hash: 0,\n stickers: [sticker],\n },\n },\n };\n }\n\n const newStickers = recent.stickers.filter((s) => s.id !== sticker.id);\n newStickers.unshift(sticker);\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n recent: {\n ...recent,\n stickers: newStickers,\n },\n },\n };\n});\n\naddReducer('showNotification', (global, actions, payload) => {\n const notification = payload!;\n\n const newNotifications = [...global.notifications];\n const existingNotificationIndex = newNotifications.findIndex((n) => n.message === notification.message);\n if (existingNotificationIndex !== -1) {\n newNotifications.splice(existingNotificationIndex, 1);\n }\n\n newNotifications.push(notification);\n\n return {\n ...global,\n notifications: newNotifications,\n };\n});\n\naddReducer('dismissNotification', (global) => {\n const newNotifications = [...global.notifications];\n\n newNotifications.pop();\n\n return {\n ...global,\n notifications: newNotifications,\n };\n});\n\naddReducer('showDialog', (global, actions, payload) => {\n const { data } = payload!;\n\n // Filter out errors that we don't want to show to the user\n if ('message' in data && data.hasErrorKey && !getReadableErrorText(data)) {\n return global;\n }\n\n const newDialogs = [...global.dialogs];\n if ('message' in data) {\n const existingErrorIndex = newDialogs.findIndex((err) => (err as ApiError).message === data.message);\n if (existingErrorIndex !== -1) {\n newDialogs.splice(existingErrorIndex, 1);\n }\n }\n\n newDialogs.push(data);\n\n return {\n ...global,\n dialogs: newDialogs,\n };\n});\n\naddReducer('dismissDialog', (global) => {\n const newDialogs = [...global.dialogs];\n\n newDialogs.pop();\n\n return {\n ...global,\n dialogs: newDialogs,\n };\n});\n\naddReducer('toggleSafeLinkModal', (global, actions, payload) => {\n const { url: safeLinkModalUrl } = payload;\n\n return {\n ...global,\n safeLinkModalUrl,\n };\n});\n\naddReducer('openHistoryCalendar', (global, actions, payload) => {\n const { selectedAt } = payload;\n\n return {\n ...global,\n historyCalendarSelectedAt: selectedAt,\n };\n});\n\naddReducer('closeHistoryCalendar', (global) => {\n return {\n ...global,\n historyCalendarSelectedAt: undefined,\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\nimport {\n clearPayment, closeInvoice,\n} from '../../reducers';\n\naddReducer('openPaymentModal', (global, actions, payload) => {\n const { messageId } = payload;\n return {\n ...global,\n payment: {\n ...global.payment,\n messageId,\n isPaymentModalOpen: true,\n },\n };\n});\n\naddReducer('closePaymentModal', (global) => {\n const newGlobal = clearPayment(global);\n return closeInvoice(newGlobal);\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiUser, ApiChatFolder, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { NewChatMembersProgress, ChatCreationProgress, ManagementProgress } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport {\n ARCHIVED_FOLDER_ID,\n TOP_CHAT_MESSAGES_PRELOAD_LIMIT,\n CHAT_LIST_LOAD_SLICE,\n RE_TME_INVITE_LINK,\n RE_TME_LINK,\n TIPS_USERNAME,\n LOCALIZED_TIPS,\n} from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n addChats,\n addUsers,\n replaceThreadParam,\n updateChatListIds,\n updateChats,\n updateChat,\n updateChatListSecondaryInfo,\n updateManagementProgress,\n} from '../../reducers';\nimport {\n selectChat,\n selectCurrentChat,\n selectUser,\n selectChatListType,\n selectIsChatPinned,\n selectChatFolder,\n selectSupportChat,\n selectChatByUsername,\n selectThreadTopMessageId,\n selectCurrentMessageList,\n} from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { debounce, pause, throttle } from '../../../util/schedulers';\nimport {\n isChatSummaryOnly, isChatArchived, prepareChatList, isChatBasicGroup,\n} from '../../helpers';\n\nconst TOP_CHATS_PRELOAD_PAUSE = 100;\n// We expect this ID does not exist\nconst TMP_CHAT_ID = -1;\n\nconst runThrottledForLoadChats = throttle((cb) => cb(), 1000, true);\nconst runThrottledForLoadTopChats = throttle((cb) => cb(), 3000, true);\nconst runDebouncedForLoadFullChat = debounce((cb) => cb(), 500, false, true);\n\naddReducer('preloadTopChatMessages', (global, actions) => {\n (async () => {\n const preloadedChatIds: number[] = [];\n\n for (let i = 0; i < TOP_CHAT_MESSAGES_PRELOAD_LIMIT; i++) {\n await pause(TOP_CHATS_PRELOAD_PAUSE);\n\n const {\n byId,\n listIds: { active: listIds },\n orderedPinnedIds: { active: orderedPinnedIds },\n } = getGlobal().chats;\n if (!listIds) {\n return;\n }\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const { pinnedChats, otherChats } = prepareChatList(byId, listIds, orderedPinnedIds);\n const topChats = [...pinnedChats, ...otherChats];\n const chatToPreload = topChats.find(({ id }) => id !== currentChatId && !preloadedChatIds.includes(id));\n if (!chatToPreload) {\n return;\n }\n\n preloadedChatIds.push(chatToPreload.id);\n\n actions.loadViewportMessages({ chatId: chatToPreload.id, threadId: MAIN_THREAD_ID });\n }\n })();\n});\n\naddReducer('openChat', (global, actions, payload) => {\n const { id, threadId } = payload!;\n const { currentUserId } = global;\n const chat = selectChat(global, id);\n\n if (chat && chat.hasUnreadMark) {\n actions.toggleChatUnread({ id });\n }\n\n if (!chat) {\n if (id === currentUserId) {\n void callApi('fetchChat', { type: 'self' });\n } else {\n const user = selectUser(global, id);\n if (user) {\n void callApi('fetchChat', { type: 'user', user });\n }\n }\n } else if (isChatSummaryOnly(chat) && !chat.isMin) {\n actions.requestChatUpdate({ chatId: id });\n }\n\n if (threadId !== MAIN_THREAD_ID) {\n const topMessageId = selectThreadTopMessageId(global, id, threadId);\n if (!topMessageId) {\n actions.requestThreadInfoUpdate({ chatId: id, threadId });\n }\n }\n});\n\naddReducer('openSupportChat', (global, actions) => {\n const chat = selectSupportChat(global);\n\n actions.openChat({ id: chat ? chat.id : TMP_CHAT_ID });\n\n if (chat) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchChat', { type: 'support' });\n if (result) {\n actions.openChat({ id: result.chatId });\n }\n })();\n});\n\naddReducer('openTipsChat', (global, actions, payload) => {\n const { langCode } = payload;\n\n const usernamePostfix = langCode === 'pt-br'\n ? 'BR'\n : LOCALIZED_TIPS.includes(langCode) ? (langCode as string).toUpperCase() : '';\n\n actions.openChatByUsername({ username: `${TIPS_USERNAME}${usernamePostfix}` });\n});\n\naddReducer('loadMoreChats', (global, actions, payload) => {\n const { listType = 'active' } = payload!;\n const listIds = global.chats.listIds[listType as ('active' | 'archived')];\n const isFullyLoaded = global.chats.isFullyLoaded[listType as ('active' | 'archived')];\n\n if (isFullyLoaded) {\n return;\n }\n\n const oldestChat = listIds\n ? listIds\n .map((id) => global.chats.byId[id])\n .filter((chat) => Boolean(chat && chat.lastMessage) && !selectIsChatPinned(global, chat.id))\n .sort((chat1, chat2) => (chat1.lastMessage!.date - chat2.lastMessage!.date))[0]\n : undefined;\n\n if (oldestChat) {\n runThrottledForLoadChats(() => loadChats(listType, oldestChat.id, oldestChat.lastMessage!.date));\n } else {\n runThrottledForLoadChats(() => loadChats(listType));\n }\n});\n\naddReducer('loadFullChat', (global, actions, payload) => {\n const { chatId, force } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n if (force) {\n loadFullChat(chat);\n } else {\n runDebouncedForLoadFullChat(() => loadFullChat(chat));\n }\n});\n\naddReducer('loadTopChats', () => {\n runThrottledForLoadTopChats(() => loadChats('active'));\n});\n\naddReducer('requestChatUpdate', (global, actions, payload) => {\n const { serverTimeOffset } = global;\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('requestChatUpdate', {\n chat,\n serverTimeOffset,\n });\n});\n\naddReducer('updateChatMutedState', (global, actions, payload) => {\n const { serverTimeOffset } = global;\n const { chatId, isMuted } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n setGlobal(updateChat(global, chatId, { isMuted }));\n void callApi('updateChatMutedState', { chat, isMuted, serverTimeOffset });\n});\n\naddReducer('createChannel', (global, actions, payload) => {\n const {\n title, about, photo, memberIds,\n } = payload!;\n\n const members = (memberIds as number[])\n .map((id: number) => selectUser(global, id))\n .filter(Boolean as any);\n\n void createChannel(title, members, about, photo);\n});\n\naddReducer('joinChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n void callApi('joinChannel', { channelId, accessHash });\n }\n});\n\naddReducer('deleteChatUser', (global, actions, payload) => {\n (async () => {\n const { chatId, userId } : {chatId: number; userId: number} = payload!;\n const chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n if (!chat || !user) {\n return;\n }\n await callApi('deleteChatUser', { chat, user });\n\n const activeChat = selectCurrentMessageList(global);\n if (activeChat && activeChat.chatId === chatId && global.currentUserId === userId) {\n actions.openChat({ id: undefined });\n }\n })();\n});\n\naddReducer('deleteChat', (global, actions, payload) => {\n (async () => {\n const { chatId } : {chatId: number } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n await callApi('deleteChat', { chatId: chat.id });\n\n const activeChat = selectCurrentMessageList(global);\n if (activeChat && activeChat.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n })();\n});\n\naddReducer('leaveChannel', (global, actions, payload) => {\n (async () => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n await callApi('leaveChannel', { channelId, accessHash });\n }\n\n const activeChannel = selectCurrentMessageList(global);\n if (activeChannel && activeChannel.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n })();\n});\n\naddReducer('deleteChannel', (global, actions, payload) => {\n (async () => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n await callApi('deleteChannel', { channelId, accessHash });\n }\n\n const activeChannel = selectCurrentMessageList(global);\n if (activeChannel && activeChannel.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n })();\n});\n\naddReducer('createGroupChat', (global, actions, payload) => {\n const { title, memberIds, photo } = payload!;\n const members = (memberIds as number[])\n .map((id: number) => selectUser(global, id))\n .filter(Boolean as any);\n\n void createGroupChat(title, members, photo);\n});\n\naddReducer('toggleChatPinned', (global, actions, payload) => {\n const { id, folderId } = payload!;\n const chat = selectChat(global, id);\n if (!chat) {\n return;\n }\n\n if (folderId) {\n const folder = selectChatFolder(global, folderId);\n if (folder) {\n const shouldBePinned = !selectIsChatPinned(global, id, folderId);\n\n const { pinnedChatIds, includedChatIds } = folder;\n const newPinnedIds = shouldBePinned\n ? [id, ...(pinnedChatIds || [])]\n : (pinnedChatIds || []).filter((pinnedId) => pinnedId !== id);\n\n // With both Pin and Unpin we need to re-add a user to the included group\n const newIncludedChatIds = [id, ...includedChatIds];\n\n void callApi('editChatFolder', {\n id: folderId,\n folderUpdate: {\n ...folder,\n pinnedChatIds: newPinnedIds,\n includedChatIds: newIncludedChatIds,\n },\n });\n }\n } else {\n const listType = selectChatListType(global, id);\n const isPinned = selectIsChatPinned(global, id, listType === 'archived' ? ARCHIVED_FOLDER_ID : undefined);\n void callApi('toggleChatPinned', { chat, shouldBePinned: !isPinned });\n }\n});\n\naddReducer('toggleChatArchived', (global, actions, payload) => {\n const { id } = payload!;\n const chat = selectChat(global, id);\n if (chat) {\n void callApi('toggleChatArchived', {\n chat,\n folderId: isChatArchived(chat) ? 0 : ARCHIVED_FOLDER_ID,\n });\n }\n});\n\naddReducer('loadChatFolders', () => {\n void loadChatFolders();\n});\n\naddReducer('loadRecommendedChatFolders', () => {\n void loadRecommendedChatFolders();\n});\n\naddReducer('editChatFolder', (global, actions, payload) => {\n const { id, folderUpdate } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void callApi('editChatFolder', {\n id,\n folderUpdate: {\n id,\n emoticon: folder.emoticon,\n pinnedChatIds: folder.pinnedChatIds,\n ...folderUpdate,\n },\n });\n }\n});\n\naddReducer('addChatFolder', (global, actions, payload) => {\n const { folder } = payload!;\n const { orderedIds } = global.chatFolders;\n const maxId = orderedIds && orderedIds.length ? Math.max.apply(Math.max, orderedIds) : ARCHIVED_FOLDER_ID;\n\n void createChatFolder(folder, maxId);\n});\n\naddReducer('deleteChatFolder', (global, actions, payload) => {\n const { id } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void deleteChatFolder(id);\n }\n});\n\naddReducer('toggleChatUnread', (global, actions, payload) => {\n const { id } = payload!;\n const { serverTimeOffset } = global;\n const chat = selectChat(global, id);\n if (chat) {\n if (chat.unreadCount) {\n void callApi('markMessageListRead', { serverTimeOffset, chat, threadId: MAIN_THREAD_ID });\n } else {\n void callApi('toggleDialogUnread', {\n chat,\n hasUnreadMark: !chat.hasUnreadMark,\n });\n }\n }\n});\n\naddReducer('openTelegramLink', (global, actions, payload) => {\n const { url } = payload!;\n let match = RE_TME_INVITE_LINK.exec(url);\n\n if (match) {\n const hash = match[1];\n\n (async () => {\n const result = await callApi('openChatByInvite', hash);\n if (!result) {\n return;\n }\n\n actions.openChat({ id: result.chatId });\n })();\n } else {\n match = RE_TME_LINK.exec(url)!;\n\n const username = match[1];\n const chatOrChannelPostId = match[2] ? Number(match[2]) : undefined;\n const messageId = match[3] ? Number(match[3]) : undefined;\n\n // Open message in private chat\n if (username === 'c' && chatOrChannelPostId && messageId) {\n actions.focusMessage({ chatId: -chatOrChannelPostId, messageId });\n } else {\n void openChatByUsername(actions, username, chatOrChannelPostId);\n }\n }\n});\n\naddReducer('acceptInviteConfirmation', (global, actions, payload) => {\n const { hash } = payload!;\n (async () => {\n const result = await callApi('importChatInvite', { hash });\n if (!result) {\n return;\n }\n\n actions.openChat({ id: result.id });\n })();\n});\n\naddReducer('openChatByUsername', (global, actions, payload) => {\n const { username } = payload!;\n\n void openChatByUsername(actions, username);\n});\n\naddReducer('togglePreHistoryHidden', (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n let chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n void callApi('togglePreHistoryHidden', { chat, isEnabled });\n })();\n});\n\naddReducer('updateChatDefaultBannedRights', (global, actions, payload) => {\n const { chatId, bannedRights } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('updateChatDefaultBannedRights', { chat, bannedRights });\n});\n\naddReducer('updateChatMemberBannedRights', (global, actions, payload) => {\n const { chatId, userId, bannedRights } = payload!;\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatMemberBannedRights', { chat, user, bannedRights });\n\n const newGlobal = getGlobal();\n const chatAfterUpdate = selectChat(newGlobal, chatId);\n\n if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) {\n return;\n }\n\n const { members, kickedMembers } = chatAfterUpdate.fullInfo;\n\n const isBanned = !!bannedRights.viewMessages;\n const isUnblocked = !Object.keys(bannedRights).length;\n\n setGlobal(updateChat(newGlobal, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(members && isBanned && {\n members: members.filter((m) => m.userId !== userId),\n }),\n ...(members && !isBanned && {\n members: members.map((m) => (\n m.userId === userId\n ? { ...m, bannedRights }\n : m\n )),\n }),\n ...(isUnblocked && kickedMembers && {\n kickedMembers: kickedMembers.filter((m) => m.userId !== userId),\n }),\n },\n }));\n })();\n});\n\naddReducer('updateChatAdmin', (global, actions, payload) => {\n const {\n chatId, userId, adminRights, customTitle,\n } = payload!;\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatAdmin', {\n chat, user, adminRights, customTitle,\n });\n\n const newGlobal = getGlobal();\n const chatAfterUpdate = selectChat(newGlobal, chatId);\n\n if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) {\n return;\n }\n\n const { adminMembers } = chatAfterUpdate.fullInfo;\n\n const isDismissed = !Object.keys(adminRights).length;\n\n setGlobal(updateChat(newGlobal, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(adminMembers && isDismissed && {\n adminMembers: adminMembers.filter((m) => m.userId !== userId),\n }),\n ...(adminMembers && !isDismissed && {\n adminMembers: adminMembers.map((m) => (\n m.userId === userId\n ? { ...m, adminRights, customTitle }\n : m\n )),\n }),\n },\n }));\n })();\n});\n\naddReducer('updateChat', (global, actions, payload) => {\n const {\n chatId, title, about, photo,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n (async () => {\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress));\n\n await Promise.all([\n chat.title !== title\n ? callApi('updateChatTitle', chat, title)\n : undefined,\n chat.fullInfo && chat.fullInfo.about !== about\n ? callApi('updateChatAbout', chat, about)\n : undefined,\n photo\n ? callApi('editChatPhoto', { chatId, accessHash: chat.accessHash, photo })\n : undefined,\n ]);\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.Complete));\n })();\n});\n\naddReducer('toggleSignatures', (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('toggleSignatures', { chat, isEnabled });\n});\n\naddReducer('loadGroupsForDiscussion', () => {\n (async () => {\n const groups = await callApi('fetchGroupsForDiscussion');\n if (!groups) {\n return;\n }\n\n const addedById = groups.reduce((result, group) => {\n if (group) {\n result[group.id] = group;\n }\n\n return result;\n }, {} as Record);\n\n const global = addChats(getGlobal(), addedById);\n setGlobal({\n ...global,\n chats: {\n ...global.chats,\n forDiscussionIds: Object.keys(addedById).map(Number),\n },\n });\n })();\n});\n\naddReducer('linkDiscussionGroup', (global, actions, payload) => {\n const { channelId, chatId } = payload!;\n\n const channel = selectChat(global, channelId);\n let chat = selectChat(global, chatId);\n if (!channel || !chat) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n let { fullInfo } = chat;\n if (!fullInfo) {\n const fullChat = await callApi('fetchFullChat', chat);\n if (!fullChat) {\n return;\n }\n\n fullInfo = fullChat.fullInfo;\n }\n\n if (fullInfo.isPreHistoryHidden) {\n await callApi('togglePreHistoryHidden', { chat, isEnabled: false });\n }\n\n void callApi('setDiscussionGroup', { channel, chat });\n })();\n});\n\naddReducer('unlinkDiscussionGroup', (global, actions, payload) => {\n const { channelId } = payload!;\n\n const channel = selectChat(global, channelId);\n if (!channel) {\n return;\n }\n\n let chat: ApiChat | undefined;\n if (channel.fullInfo && channel.fullInfo.linkedChatId) {\n chat = selectChat(global, channel.fullInfo.linkedChatId);\n }\n\n (async () => {\n await callApi('setDiscussionGroup', { channel });\n if (chat) {\n loadFullChat(chat);\n }\n })();\n});\n\n\naddReducer('setActiveChatFolder', (global, actions, payload) => {\n return {\n ...global,\n chatFolders: {\n ...global.chatFolders,\n activeChatFolder: payload,\n },\n };\n});\n\naddReducer('loadMoreMembers', (global) => {\n (async () => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n if (!chat || isChatBasicGroup(chat)) {\n return;\n }\n\n const offset = (chat.fullInfo && chat.fullInfo.members && chat.fullInfo.members.length) || undefined;\n const result = await callApi('fetchMembers', chat.id, chat.accessHash!, 'recent', offset);\n if (!result) {\n return;\n }\n\n const { members, users } = result;\n if (!members || !members.length) {\n return;\n }\n\n global = getGlobal();\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateChat(global, chat.id, {\n fullInfo: {\n ...chat.fullInfo,\n members: [\n ...((chat.fullInfo || {}).members || []),\n ...(members || []),\n ],\n },\n });\n setGlobal(global);\n })();\n});\n\naddReducer('addChatMembers', (global, actions, payload) => {\n const { chatId, memberIds } = payload;\n const chat = selectChat(global, chatId);\n const users = (memberIds as number[]).map((userId) => selectUser(global, userId)).filter(Boolean as any);\n\n if (!chat || !users.length) {\n return;\n }\n\n actions.setNewChatMembersDialogState(NewChatMembersProgress.Loading);\n (async () => {\n await callApi('addChatMembers', chat, users);\n actions.setNewChatMembersDialogState(NewChatMembersProgress.Closed);\n loadFullChat(chat);\n })();\n});\n\naddReducer('deleteChatMember', (global, actions, payload) => {\n const { chatId, userId } = payload;\n const chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n await callApi('deleteChatMember', chat, user);\n loadFullChat(chat);\n })();\n});\n\nasync function loadChats(listType: 'active' | 'archived', offsetId?: number, offsetDate?: number) {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n offsetDate,\n archived: listType === 'archived',\n withPinned: getGlobal().chats.orderedPinnedIds[listType] === undefined,\n serverTimeOffset: getGlobal().serverTimeOffset,\n });\n\n if (!result) {\n return;\n }\n\n const { chatIds } = result;\n\n if (chatIds.length > 0 && chatIds[0] === offsetId) {\n chatIds.shift();\n }\n\n let global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = updateChatListIds(global, listType, chatIds);\n global = updateChatListSecondaryInfo(global, listType, result);\n\n Object.keys(result.draftsById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId],\n );\n });\n\n Object.keys(result.replyingToById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId],\n );\n });\n\n\n if (chatIds.length === 0 && !global.chats.isFullyLoaded[listType]) {\n global = {\n ...global,\n chats: {\n ...global.chats,\n isFullyLoaded: {\n ...global.chats.isFullyLoaded,\n [listType]: true,\n },\n },\n };\n }\n\n setGlobal(global);\n}\n\nasync function loadFullChat(chat: ApiChat) {\n const result = await callApi('fetchFullChat', chat);\n if (!result) {\n return;\n }\n\n const { users, fullInfo } = result;\n\n let global = getGlobal();\n if (users) {\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n }\n global = updateChat(global, chat.id, { fullInfo });\n\n setGlobal(global);\n}\n\nasync function createChannel(title: string, users: ApiUser[], about?: string, photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n const createdChannel = await callApi('createChannel', { title, about, users });\n if (!createdChannel) {\n return;\n }\n\n const { id: channelId, accessHash } = createdChannel;\n\n let global = getGlobal();\n global = updateChat(global, channelId, createdChannel);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChannel ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getDispatch().openChat({ id: channelId });\n\n if (channelId && accessHash && photo) {\n await callApi('editChatPhoto', { chatId: channelId, accessHash, photo });\n }\n}\n\nasync function createGroupChat(title: string, users: ApiUser[], photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n const createdChat = await callApi('createGroupChat', { title, users });\n if (!createdChat) {\n return;\n }\n\n const { id: chatId } = createdChat;\n\n let global = getGlobal();\n global = updateChat(global, chatId, createdChat);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChat ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getDispatch().openChat({ id: chatId });\n\n if (chatId && photo) {\n await callApi('editChatPhoto', { chatId, photo });\n }\n}\n\nasync function loadChatFolders() {\n const chatFolders = await callApi('fetchChatFolders');\n\n if (chatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n ...chatFolders,\n },\n });\n }\n}\n\nasync function loadRecommendedChatFolders() {\n const recommendedChatFolders = await callApi('fetchRecommendedChatFolders');\n\n if (recommendedChatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommendedChatFolders,\n },\n });\n }\n}\n\nasync function createChatFolder(folder: ApiChatFolder, maxId: number) {\n // Clear fields from recommended folders\n const { id: recommendedId, description, ...newFolder } = folder;\n\n await callApi('editChatFolder', {\n id: maxId + 1,\n folderUpdate: {\n id: maxId + 1,\n ...newFolder,\n },\n });\n\n if (!description) {\n return;\n }\n\n const global = getGlobal();\n const { recommended } = global.chatFolders;\n\n if (recommended) {\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommended.filter(({ id }) => id !== recommendedId),\n },\n });\n }\n}\n\nasync function deleteChatFolder(id: number) {\n await callApi('deleteChatFolder', id);\n}\n\nasync function openChatByUsername(\n actions: GlobalActions,\n username: string,\n channelPostId?: number,\n) {\n const global = getGlobal();\n const localChat = selectChatByUsername(global, username);\n if (localChat && !localChat.isMin) {\n if (channelPostId) {\n actions.focusMessage({ chatId: localChat.id, messageId: channelPostId });\n } else {\n actions.openChat({ id: localChat.id });\n }\n return;\n }\n\n const previousChat = selectCurrentChat(global);\n // Open temporary empty chat to make the click response feel faster\n actions.openChat({ id: TMP_CHAT_ID });\n\n const chat = await callApi('getChatByUsername', username);\n if (!chat) {\n if (previousChat) {\n actions.openChat({ id: previousChat.id });\n }\n\n actions.showNotification({ message: 'User does not exist' });\n\n return;\n }\n\n setGlobal(updateChat(getGlobal(), chat.id, chat));\n\n if (channelPostId) {\n actions.focusMessage({ chatId: chat.id, messageId: channelPostId });\n } else {\n actions.openChat({ id: chat.id });\n }\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiAttachment,\n ApiChat,\n ApiMessage,\n ApiMessageEntity,\n ApiNewPoll,\n ApiOnProgress,\n ApiSticker,\n ApiVideo,\n MAIN_THREAD_ID,\n MESSAGE_DELETED,\n} from '../../../api/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { MAX_MEDIA_FILES_FOR_ALBUM, MESSAGE_LIST_SLICE } from '../../../config';\nimport { callApi, cancelApiProgress } from '../../../api/gramjs';\nimport { areSortedArraysIntersecting, buildCollectionByKey, split } from '../../../util/iteratees';\nimport {\n addUsers,\n addChatMessagesById,\n replaceThreadParam,\n safeReplaceViewportIds,\n updateChatMessage,\n addChats,\n updateListedIds,\n updateOutlyingIds,\n replaceScheduledMessages,\n updateThreadInfos,\n updateChat,\n} from '../../reducers';\nimport {\n selectChat,\n selectChatMessage,\n selectCurrentMessageList,\n selectFocusedMessageId,\n selectCurrentChat,\n selectListedIds,\n selectOutlyingIds,\n selectViewportIds,\n selectRealLastReadId,\n selectReplyingToId,\n selectEditingId,\n selectDraft,\n selectThreadOriginChat,\n selectThreadTopMessageId,\n selectEditingScheduledId,\n selectEditingMessage,\n selectScheduledMessage,\n selectNoWebPage,\n} from '../../selectors';\nimport { rafPromise, throttle } from '../../../util/schedulers';\nimport { IS_IOS } from '../../../util/environment';\n\nconst uploadProgressCallbacks = new Map();\n\nconst runThrottledForMarkRead = throttle((cb) => cb(), 1000, true);\n\naddReducer('loadViewportMessages', (global, actions, payload) => {\n const {\n direction = LoadMoreDirection.Around,\n isBudgetPreload = false,\n } = payload || {};\n\n let { chatId, threadId } = payload || {};\n\n if (!chatId) {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n chatId = currentMessageList.chatId;\n threadId = currentMessageList.threadId;\n }\n\n const chat = selectChat(global, chatId);\n // TODO Revise if `chat.isRestricted` check is needed\n if (!chat || chat.isRestricted) {\n return undefined;\n }\n\n const viewportIds = selectViewportIds(global, chatId, threadId);\n const listedIds = selectListedIds(global, chatId, threadId);\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n\n if (!viewportIds || !viewportIds.length || direction === LoadMoreDirection.Around) {\n const offsetId = selectFocusedMessageId(global, chatId) || selectRealLastReadId(global, chatId, threadId);\n const isOutlying = Boolean(offsetId && listedIds && !listedIds.includes(offsetId));\n const historyIds = (isOutlying ? outlyingIds : listedIds) || [];\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(historyIds, offsetId, LoadMoreDirection.Around);\n\n if (areSomeLocal && newViewportIds.length >= MESSAGE_LIST_SLICE) {\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds);\n }\n\n if (!areAllLocal) {\n void loadViewportMessages(chat, threadId, offsetId, LoadMoreDirection.Around, isOutlying, isBudgetPreload);\n }\n } else {\n const offsetId = direction === LoadMoreDirection.Backwards ? viewportIds[0] : viewportIds[viewportIds.length - 1];\n const isOutlying = Boolean(outlyingIds);\n const historyIds = (isOutlying ? outlyingIds : listedIds)!;\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(historyIds, offsetId, direction);\n\n if (areSomeLocal) {\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds);\n }\n\n void loadWithBudget(actions, areAllLocal, isOutlying, isBudgetPreload, chat, threadId, direction, offsetId);\n\n if (isBudgetPreload) {\n return undefined;\n }\n }\n\n return global;\n});\n\nasync function loadWithBudget(\n actions: GlobalActions,\n areAllLocal: boolean, isOutlying: boolean, isBudgetPreload: boolean,\n chat: ApiChat, threadId: number, direction: LoadMoreDirection, offsetId?: number,\n) {\n if (!areAllLocal) {\n await loadViewportMessages(\n chat, threadId, offsetId, direction, isOutlying, isBudgetPreload,\n );\n }\n\n if (!isBudgetPreload) {\n // Let reducer return and update global\n await Promise.resolve();\n actions.loadViewportMessages({\n chatId: chat.id, threadId, direction, isBudgetPreload: true,\n });\n }\n}\n\naddReducer('loadMessage', (global, actions, payload) => {\n const { chatId, messageId, replyOriginForId } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void loadMessage(chat, messageId, replyOriginForId);\n});\n\naddReducer('sendMessage', (global, actions, payload) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type } = currentMessageList;\n\n if (type === 'scheduled' && !payload.scheduledAt) {\n return {\n ...global,\n messages: {\n ...global.messages,\n contentToBeScheduled: payload,\n },\n };\n }\n\n const chat = selectChat(global, chatId)!;\n\n actions.setReplyingToId({ messageId: undefined });\n actions.clearWebPagePreview({ chatId, threadId, value: false });\n\n const params = {\n ...payload,\n chat,\n replyingTo: selectReplyingToId(global, chatId, threadId),\n noWebPage: selectNoWebPage(global, chatId, threadId),\n };\n\n const isSingle = !payload.attachments || payload.attachments.length <= 1;\n const isGrouped = !isSingle && payload.attachments && payload.attachments.length > 1;\n\n if (isSingle) {\n const { attachments, ...restParams } = params;\n sendMessage({\n ...restParams,\n attachment: attachments ? attachments[0] : undefined,\n });\n } else if (isGrouped) {\n const {\n text, entities, attachments, ...commonParams\n } = params;\n const groupedAttachments = split(attachments, MAX_MEDIA_FILES_FOR_ALBUM);\n for (let i = 0; i < groupedAttachments.length; i++) {\n const [firstAttachment, ...restAttachments] = groupedAttachments[i];\n const groupedId = `${Date.now()}${i}`;\n\n sendMessage({\n ...commonParams,\n text: i === 0 ? text : undefined,\n entities: i === 0 ? entities : undefined,\n attachment: firstAttachment,\n groupedId: restAttachments.length > 0 ? groupedId : undefined,\n });\n\n restAttachments.forEach((attachment: ApiAttachment) => {\n sendMessage({\n ...commonParams,\n attachment,\n groupedId,\n });\n });\n }\n } else {\n const {\n text, entities, attachments, replyingTo, ...commonParams\n } = params;\n\n if (text) {\n sendMessage({\n ...commonParams,\n text,\n entities,\n replyingTo,\n });\n }\n\n attachments.forEach((attachment: ApiAttachment) => {\n sendMessage({\n ...commonParams,\n attachment,\n });\n });\n }\n\n return undefined;\n});\n\naddReducer('editMessage', (global, actions, payload) => {\n const { serverTimeOffset } = global;\n const { text, entities } = payload!;\n\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n const message = selectEditingMessage(global, chatId, threadId, messageListType);\n if (!chat || !message) {\n return;\n }\n\n void callApi('editMessage', {\n chat, message, text, entities, noWebPage: selectNoWebPage(global, chatId, threadId), serverTimeOffset,\n });\n\n actions.setEditingId({ messageId: undefined });\n});\n\naddReducer('cancelSendingMessage', (global, actions, payload) => {\n const { chatId, messageId } = payload!;\n const message = selectChatMessage(global, chatId, messageId);\n const progressCallback = message && uploadProgressCallbacks.get(message.previousLocalId || message.id);\n if (progressCallback) {\n cancelApiProgress(progressCallback);\n }\n\n actions.apiUpdate({\n '@type': 'deleteMessages',\n ids: [messageId],\n chatId,\n });\n});\n\naddReducer('saveDraft', (global, actions, payload) => {\n const { chatId, threadId, draft } = payload!;\n if (!draft) {\n return undefined;\n }\n\n const { text, entities } = draft;\n const chat = selectChat(global, chatId)!;\n\n if (threadId === MAIN_THREAD_ID) {\n void callApi('saveDraft', {\n chat,\n text,\n entities,\n replyToMsgId: selectReplyingToId(global, chatId, threadId),\n });\n }\n\n global = replaceThreadParam(global, chatId, threadId, 'draft', draft);\n global = updateChat(global, chatId, { draftDate: Math.round(Date.now() / 1000) });\n\n return global;\n});\n\naddReducer('clearDraft', (global, actions, payload) => {\n const { chatId, threadId, localOnly } = payload!;\n if (!selectDraft(global, chatId, threadId)) {\n return undefined;\n }\n\n const chat = selectChat(global, chatId)!;\n\n if (!localOnly && threadId === MAIN_THREAD_ID) {\n void callApi('clearDraft', chat);\n }\n\n global = replaceThreadParam(global, chatId, threadId, 'draft', undefined);\n global = updateChat(global, chatId, { draftDate: undefined });\n\n return global;\n});\n\naddReducer('toggleMessageWebPage', (global, actions, payload) => {\n const { chatId, threadId, noWebPage } = payload!;\n\n return replaceThreadParam(global, chatId, threadId, 'noWebPage', noWebPage);\n});\n\naddReducer('pinMessage', (global, actions, payload) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const {\n messageId, isUnpin, isOneSide, isSilent,\n } = payload!;\n\n void callApi('pinMessage', {\n chat, messageId, isUnpin, isOneSide, isSilent,\n });\n});\n\naddReducer('unpinAllMessages', (global, actions, payload) => {\n const chat = selectChat(global, payload.chatId);\n if (!chat) {\n return;\n }\n\n void unpinAllMessages(chat);\n});\n\nasync function unpinAllMessages(chat: ApiChat) {\n await callApi('unpinAllMessages', { chat });\n let global = getGlobal();\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'pinnedIds', []);\n setGlobal(global);\n}\n\naddReducer('deleteMessages', (global, actions, payload) => {\n const { messageIds, shouldDeleteForAll } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n const { chatId, threadId } = currentMessageList;\n const chat = selectChat(global, chatId)!;\n\n void callApi('deleteMessages', { chat, messageIds, shouldDeleteForAll });\n\n const editingId = selectEditingId(global, chatId, threadId);\n if (messageIds.includes(editingId)) {\n actions.setEditingId({ messageId: undefined });\n }\n});\n\naddReducer('deleteScheduledMessages', (global, actions, payload) => {\n const { messageIds } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId } = currentMessageList;\n const chat = selectChat(global, chatId)!;\n\n void callApi('deleteScheduledMessages', { chat, messageIds });\n\n const editingId = selectEditingScheduledId(global, chatId);\n if (messageIds.includes(editingId)) {\n actions.setEditingId({ messageId: undefined });\n }\n});\n\naddReducer('deleteHistory', (global, actions, payload) => {\n (async () => {\n const { chatId, shouldDeleteForAll } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const maxId = chat.lastMessage && chat.lastMessage.id;\n\n await callApi('deleteHistory', { chat, shouldDeleteForAll, maxId });\n\n const activeChat = selectCurrentMessageList(global);\n if (activeChat && activeChat.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n })();\n});\n\naddReducer('reportMessages', (global, actions, payload) => {\n (async () => {\n const {\n messageIds, reason, description,\n } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId } = currentMessageList;\n const chat = selectChat(global, chatId)!;\n\n const result = await callApi('reportMessages', {\n peer: chat, messageIds, reason, description,\n });\n\n actions.showNotification({\n message: result\n ? 'Thank you! Your report will be reviewed by our team.'\n : 'Error occured while submiting report. Please, try again later.',\n });\n })();\n});\n\naddReducer('markMessageListRead', (global, actions, payload) => {\n const { serverTimeOffset } = global;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId } = currentMessageList;\n const chat = selectThreadOriginChat(global, chatId, threadId);\n if (!chat) {\n return;\n }\n\n const { maxId } = payload!;\n\n runThrottledForMarkRead(() => {\n void callApi('markMessageListRead', {\n serverTimeOffset, chat, threadId, maxId,\n });\n });\n});\n\naddReducer('markMessagesRead', (global, actions, payload) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const { messageIds } = payload!;\n\n void callApi('markMessagesRead', { chat, messageIds });\n});\n\naddReducer('loadWebPagePreview', (global, actions, payload) => {\n const { text } = payload!;\n void loadWebPagePreview(text);\n});\n\naddReducer('clearWebPagePreview', (global) => {\n if (!global.webPagePreview) {\n return undefined;\n }\n\n return {\n ...global,\n webPagePreview: undefined,\n };\n});\n\naddReducer('sendPollVote', (global, actions, payload) => {\n const { chatId, messageId, options } = payload!;\n const chat = selectChat(global, chatId);\n\n if (chat) {\n void callApi('sendPollVote', { chat, messageId, options });\n }\n});\n\naddReducer('loadPollOptionResults', (global, actions, payload) => {\n const {\n chat, messageId, option, offset, limit, shouldResetVoters,\n } = payload!;\n\n void loadPollOptionResults(chat, messageId, option, offset, limit, shouldResetVoters);\n});\n\naddReducer('forwardMessages', (global) => {\n const { fromChatId, messageIds, toChatId } = global.forwardMessages;\n const fromChat = fromChatId ? selectChat(global, fromChatId) : undefined;\n const toChat = toChatId ? selectChat(global, toChatId) : undefined;\n const messages = fromChatId && messageIds\n ? messageIds\n .sort((a, b) => a - b)\n .map((id) => selectChatMessage(global, fromChatId, id)).filter(Boolean as any)\n : undefined;\n\n if (fromChat && toChat && messages && messages.length) {\n void forwardMessages(fromChat, toChat, messages);\n }\n});\n\naddReducer('loadScheduledHistory', (global) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const { hash } = global.scheduledMessages.byChatId[chat.id] || {};\n\n void loadScheduledHistory(chat, hash);\n});\n\naddReducer('sendScheduledMessages', (global, actions, payload) => {\n const {\n chatId, id,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('sendScheduledMessages', {\n chat,\n ids: [id],\n });\n});\n\naddReducer('rescheduleMessage', (global, actions, payload) => {\n const {\n chatId, messageId, scheduledAt,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n const message = chat && selectScheduledMessage(global, chat.id, messageId);\n if (!chat || !message) {\n return;\n }\n\n void callApi('rescheduleMessage', {\n chat,\n message,\n scheduledAt,\n });\n});\n\naddReducer('requestThreadInfoUpdate', (global, actions, payload) => {\n const { chatId, threadId } = payload;\n const chat = selectThreadOriginChat(global, chatId, threadId);\n if (!chat) {\n return;\n }\n\n void callApi('requestThreadInfoUpdate', { chat, threadId });\n});\n\nasync function loadWebPagePreview(message: string) {\n const webPagePreview = await callApi('fetchWebPagePreview', { message });\n\n setGlobal({\n ...getGlobal(),\n webPagePreview,\n });\n}\n\nasync function loadViewportMessages(\n chat: ApiChat,\n threadId: number,\n offsetId: number | undefined,\n direction: LoadMoreDirection,\n isOutlying = false,\n isBudgetPreload = false,\n) {\n const chatId = chat.id;\n\n let addOffset: number | undefined;\n switch (direction) {\n case LoadMoreDirection.Backwards:\n addOffset = undefined;\n break;\n case LoadMoreDirection.Around:\n addOffset = -(Math.round(MESSAGE_LIST_SLICE / 2) + 1);\n break;\n case LoadMoreDirection.Forwards:\n addOffset = -(MESSAGE_LIST_SLICE + 1);\n break;\n }\n\n const result = await callApi('fetchMessages', {\n chat: selectThreadOriginChat(getGlobal(), chatId, threadId)!,\n offsetId,\n addOffset,\n limit: MESSAGE_LIST_SLICE,\n threadId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, chats, threadInfos,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n global = addChatMessagesById(global, chatId, byId);\n global = isOutlying\n ? updateOutlyingIds(global, chatId, threadId, ids)\n : updateListedIds(global, chatId, threadId, ids);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n global = updateThreadInfos(global, chatId, threadInfos);\n\n let listedIds = selectListedIds(global, chatId, threadId);\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n\n if (isOutlying && listedIds && outlyingIds) {\n if (areSortedArraysIntersecting(listedIds, outlyingIds)) {\n global = updateListedIds(global, chatId, threadId, outlyingIds);\n listedIds = selectListedIds(global, chatId, threadId);\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', undefined);\n isOutlying = false;\n }\n }\n\n if (!isBudgetPreload) {\n const historyIds = isOutlying ? outlyingIds! : listedIds!;\n const { newViewportIds } = getViewportSlice(historyIds, offsetId, direction);\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds!);\n }\n\n setGlobal(global);\n}\n\nasync function loadMessage(chat: ApiChat, messageId: number, replyOriginForId: number) {\n const result = await callApi('fetchMessage', { chat, messageId });\n if (!result) {\n return;\n }\n\n if (result === MESSAGE_DELETED) {\n if (replyOriginForId) {\n let global = getGlobal();\n const replyMessage = selectChatMessage(global, chat.id, replyOriginForId);\n global = updateChatMessage(global, chat.id, replyOriginForId, {\n ...replyMessage,\n replyToMessageId: undefined,\n });\n setGlobal(global);\n }\n\n return;\n }\n\n let global = getGlobal();\n global = updateChatMessage(global, chat.id, messageId, result.message);\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n setGlobal(global);\n}\n\nfunction findClosestIndex(sourceIds: number[], offsetId: number) {\n if (offsetId < sourceIds[0]) {\n return 0;\n }\n\n if (offsetId > sourceIds[sourceIds.length - 1]) {\n return sourceIds.length - 1;\n }\n\n return sourceIds.findIndex((id, i) => (\n id === offsetId\n || (id < offsetId && sourceIds[i + 1] > offsetId)\n ));\n}\n\nfunction getViewportSlice(\n sourceIds: number[],\n offsetId: number | undefined,\n direction: LoadMoreDirection,\n) {\n const { length } = sourceIds;\n const index = offsetId ? findClosestIndex(sourceIds, offsetId) : -1;\n const isBackwards = direction === LoadMoreDirection.Backwards;\n const indexForDirection = isBackwards ? index : (index + 1) || length;\n const from = indexForDirection - MESSAGE_LIST_SLICE;\n const to = indexForDirection + MESSAGE_LIST_SLICE - 1;\n const newViewportIds = sourceIds.slice(Math.max(0, from), to + 1);\n\n let areSomeLocal;\n let areAllLocal;\n switch (direction) {\n case LoadMoreDirection.Backwards:\n areSomeLocal = indexForDirection > 0;\n areAllLocal = from >= 0;\n break;\n case LoadMoreDirection.Forwards:\n areSomeLocal = indexForDirection < length;\n areAllLocal = to <= length - 1;\n break;\n case LoadMoreDirection.Around:\n default:\n areSomeLocal = newViewportIds.length > 0;\n areAllLocal = newViewportIds.length === MESSAGE_LIST_SLICE;\n break;\n }\n\n return { newViewportIds, areSomeLocal, areAllLocal };\n}\n\nasync function sendMessage(params: {\n chat: ApiChat;\n text: string;\n entities: ApiMessageEntity[];\n replyingTo: number;\n attachment: ApiAttachment;\n sticker: ApiSticker;\n gif: ApiVideo;\n poll: ApiNewPoll;\n serverTimeOffset?: number;\n}) {\n let localId: number | undefined;\n const progressCallback = params.attachment ? (progress: number, messageLocalId: number) => {\n if (!uploadProgressCallbacks.has(messageLocalId)) {\n localId = messageLocalId;\n uploadProgressCallbacks.set(messageLocalId, progressCallback!);\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n fileUploads: {\n byMessageLocalId: {\n ...global.fileUploads.byMessageLocalId,\n [messageLocalId]: { progress },\n },\n },\n });\n } : undefined;\n\n // @optimization\n if (params.replyingTo || IS_IOS) {\n await rafPromise();\n }\n\n const global = getGlobal();\n params.serverTimeOffset = global.serverTimeOffset;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n const { threadId } = currentMessageList;\n\n if (!params.replyingTo && threadId !== MAIN_THREAD_ID) {\n params.replyingTo = selectThreadTopMessageId(global, params.chat.id, threadId)!;\n }\n\n await callApi('sendMessage', params, progressCallback);\n\n if (progressCallback && localId) {\n uploadProgressCallbacks.delete(localId);\n }\n}\n\nfunction forwardMessages(\n fromChat: ApiChat,\n toChat: ApiChat,\n messages: ApiMessage[],\n) {\n callApi('forwardMessages', {\n fromChat,\n toChat,\n messages,\n serverTimeOffset: getGlobal().serverTimeOffset,\n });\n\n setGlobal({\n ...getGlobal(),\n forwardMessages: {},\n });\n}\n\nasync function loadPollOptionResults(\n chat: ApiChat,\n messageId: number,\n option: string,\n offset?: string,\n limit?: number,\n shouldResetVoters?: boolean,\n) {\n const result = await callApi('loadPollOptionResults', {\n chat, messageId, option, offset, limit,\n });\n\n if (!result) {\n return;\n }\n\n const isUnique = (v: number, i: number, a: number[]) => a.indexOf(v) === i;\n let global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n const { voters } = global.pollResults;\n\n setGlobal({\n ...global,\n pollResults: {\n ...global.pollResults,\n voters: {\n ...voters,\n [option]: [\n ...(!shouldResetVoters && voters && voters[option] ? voters[option] : []),\n ...(result && result.users.map((user) => user.id)),\n ].filter(isUnique),\n },\n offsets: {\n ...(global.pollResults.offsets ? global.pollResults.offsets : {}),\n [option]: result.nextOffset || '',\n },\n },\n });\n}\n\naddReducer('loadPinnedMessages', (global, actions, payload) => {\n const { chatId } = payload;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void loadPinnedMessages(chat);\n});\n\nasync function loadPinnedMessages(chat: ApiChat) {\n const result = await callApi('fetchPinnedMessages', { chat });\n if (!result) {\n return;\n }\n\n const { messages, chats, users } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number).sort((a, b) => b - a);\n\n let global = getGlobal();\n global = addChatMessagesById(global, chat.id, byId);\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'pinnedIds', ids);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n setGlobal(global);\n}\n\nasync function loadScheduledHistory(chat: ApiChat, historyHash?: number) {\n const result = await callApi('fetchScheduledHistory', { chat, hash: historyHash });\n if (!result) {\n return;\n }\n\n const { hash, messages } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number).sort((a, b) => b - a);\n\n let global = getGlobal();\n global = replaceScheduledMessages(global, chat.id, byId, hash);\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'scheduledIds', ids);\n setGlobal(global);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/types';\nimport { LangCode } from '../../../types';\nimport { callApi } from '../../../api/gramjs';\nimport { pause, throttle } from '../../../util/schedulers';\nimport {\n updateStickerSets,\n updateStickerSet,\n replaceAnimatedEmojis,\n updateGifSearch,\n updateStickersForEmoji,\n rebuildStickersForEmoji,\n} from '../../reducers';\nimport searchWords from '../../../util/searchWords';\nimport { selectStickerSet } from '../../selectors';\n\nconst ADDED_SETS_THROTTLE = 500;\nconst ADDED_SETS_THROTTLE_CHUNK = 50;\n\nconst searchThrottled = throttle((cb) => cb(), 500, false);\n\naddReducer('loadStickerSets', (global) => {\n const { hash } = global.stickers.added || {};\n void loadStickerSets(hash);\n});\n\naddReducer('loadAddedStickers', (global, actions) => {\n const { setIds: addedSetIds } = global.stickers.added;\n if (!addedSetIds || !addedSetIds.length) {\n return;\n }\n\n (async () => {\n for (let i = 0; i < addedSetIds.length; i++) {\n actions.loadStickers({ stickerSetId: addedSetIds[i] });\n\n if (i % ADDED_SETS_THROTTLE_CHUNK === 0 && i > 0) {\n await pause(ADDED_SETS_THROTTLE);\n }\n }\n })();\n});\n\naddReducer('loadRecentStickers', (global) => {\n const { hash } = global.stickers.recent || {};\n void loadRecentStickers(hash);\n});\n\naddReducer('loadFavoriteStickers', (global) => {\n const { hash } = global.stickers.favorite || {};\n void loadFavoriteStickers(hash);\n});\n\naddReducer('loadFeaturedStickers', (global) => {\n const { hash } = global.stickers.featured || {};\n void loadFeaturedStickers(hash);\n});\n\naddReducer('loadStickers', (global, actions, payload) => {\n const { stickerSetId } = payload!;\n let { stickerSetAccessHash } = payload!;\n\n if (!stickerSetAccessHash) {\n const stickerSet = selectStickerSet(global, stickerSetId);\n if (!stickerSet) {\n return;\n }\n\n stickerSetAccessHash = stickerSet.accessHash;\n }\n\n void loadStickers(stickerSetId, stickerSetAccessHash);\n});\n\naddReducer('loadAnimatedEmojis', () => {\n void loadAnimatedEmojis();\n});\n\naddReducer('loadSavedGifs', (global) => {\n const { hash } = global.gifs.saved;\n void loadSavedGifs(hash);\n});\n\naddReducer('faveSticker', (global, actions, payload) => {\n const { sticker } = payload!;\n\n if (sticker) {\n void callApi('faveSticker', { sticker });\n }\n});\n\naddReducer('unfaveSticker', (global, actions, payload) => {\n const { sticker } = payload!;\n\n if (sticker) {\n void unfaveSticker(sticker);\n }\n});\n\naddReducer('toggleStickerSet', (global, actions, payload) => {\n const { stickerSetId } = payload!;\n const stickerSet = selectStickerSet(global, stickerSetId);\n if (!stickerSet) {\n return;\n }\n\n const { accessHash, installedDate } = stickerSet;\n\n void callApi(!installedDate ? 'installStickerSet' : 'uninstallStickerSet', { stickerSetId, accessHash });\n});\n\naddReducer('loadEmojiKeywords', (global, actions, payload: { language: LangCode }) => {\n const { language } = payload;\n\n let currentEmojiKeywords = global.emojiKeywords[language];\n if (currentEmojiKeywords && currentEmojiKeywords.isLoading) {\n return;\n }\n\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n ...currentEmojiKeywords,\n isLoading: true,\n },\n },\n });\n\n (async () => {\n const emojiKeywords = await callApi('fetchEmojiKeywords', {\n language,\n fromVersion: currentEmojiKeywords ? currentEmojiKeywords.version : 0,\n });\n\n global = getGlobal();\n currentEmojiKeywords = global.emojiKeywords[language];\n\n if (!emojiKeywords) {\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n ...currentEmojiKeywords,\n isLoading: false,\n },\n },\n });\n\n return;\n }\n\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n isLoading: false,\n version: emojiKeywords.version,\n keywords: {\n ...(currentEmojiKeywords && currentEmojiKeywords.keywords),\n ...emojiKeywords.keywords,\n },\n },\n },\n });\n })();\n});\n\nasync function loadStickerSets(hash = 0) {\n const addedStickers = await callApi('fetchStickerSets', { hash });\n if (!addedStickers) {\n return;\n }\n\n setGlobal(updateStickerSets(\n getGlobal(),\n 'added',\n addedStickers.hash,\n addedStickers.sets,\n ));\n}\n\nasync function loadRecentStickers(hash = 0) {\n const recentStickers = await callApi('fetchRecentStickers', { hash });\n if (!recentStickers) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n recent: recentStickers,\n },\n });\n}\n\nasync function loadFavoriteStickers(hash = 0) {\n const favoriteStickers = await callApi('fetchFavoriteStickers', { hash });\n if (!favoriteStickers) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n favorite: favoriteStickers,\n },\n });\n}\n\nasync function loadFeaturedStickers(hash = 0) {\n const featuredStickers = await callApi('fetchFeaturedStickers', { hash });\n if (!featuredStickers) {\n return;\n }\n\n setGlobal(updateStickerSets(\n getGlobal(),\n 'featured',\n featuredStickers.hash,\n featuredStickers.sets,\n ));\n}\n\nasync function loadStickers(stickerSetId: string, accessHash: string) {\n const stickerSet = await callApi('fetchStickers', { stickerSetId, accessHash });\n if (!stickerSet) {\n return;\n }\n\n const { set, stickers, packs } = stickerSet;\n\n let global = getGlobal();\n\n global = updateStickerSet(global, set.id, { ...set, stickers, packs });\n\n const currentEmoji = global.stickers.forEmoji.emoji;\n if (currentEmoji && packs[currentEmoji]) {\n global = rebuildStickersForEmoji(global);\n }\n\n setGlobal(global);\n}\n\nasync function loadAnimatedEmojis() {\n const stickerSet = await callApi('fetchAnimatedEmojis');\n if (!stickerSet) {\n return;\n }\n\n const { set, stickers } = stickerSet;\n\n setGlobal(replaceAnimatedEmojis(getGlobal(), { ...set, stickers }));\n}\n\nfunction unfaveSticker(sticker: ApiSticker) {\n const global = getGlobal();\n\n // Remove sticker preemptively to get instant feedback when user removes sticker\n // from favorites while in Sticker Picker\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n favorite: {\n ...global.stickers.favorite,\n stickers: global.stickers.favorite.stickers.filter(({ id }) => id !== sticker.id),\n },\n },\n });\n\n void callApi('faveSticker', { sticker, unfave: true });\n}\n\naddReducer('setStickerSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (query) {\n void searchThrottled(() => {\n searchStickers(query);\n });\n }\n});\n\naddReducer('setGifSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (typeof query === 'string') {\n void searchThrottled(() => {\n searchGifs(query);\n });\n }\n});\n\naddReducer('searchMoreGifs', (global) => {\n const { query, offset } = global.gifs.search;\n\n if (typeof query === 'string') {\n void searchThrottled(() => {\n searchGifs(query, offset);\n });\n }\n});\n\naddReducer('loadStickersForEmoji', (global, actions, payload) => {\n const { emoji } = payload!;\n const { hash } = global.stickers.forEmoji;\n\n void searchThrottled(() => {\n loadStickersForEmoji(emoji, hash);\n });\n});\n\naddReducer('clearStickersForEmoji', (global) => {\n return {\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {},\n },\n };\n});\n\nasync function searchStickers(query: string, hash = 0) {\n const result = await callApi('searchStickers', { query, hash });\n\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n const { setsById, added } = global.stickers;\n\n const resultIds = result.sets.map(({ id }) => id);\n\n if (added.setIds) {\n added.setIds.forEach((id) => {\n if (!resultIds.includes(id)) {\n const { title } = setsById[id] || {};\n if (title && searchWords(title, query)) {\n resultIds.unshift(id);\n }\n }\n });\n }\n\n setGlobal(updateStickerSets(\n global,\n 'search',\n result.hash,\n result.sets,\n resultIds,\n ));\n}\n\nasync function searchGifs(query: string, offset?: string) {\n const result = await callApi('searchGifs', { query, offset });\n if (!result) {\n return;\n }\n\n setGlobal(updateGifSearch(getGlobal(), !offset, result.gifs, result.nextOffset));\n}\n\nasync function loadSavedGifs(hash = 0) {\n const savedGifs = await callApi('fetchSavedGifs', { hash });\n if (!savedGifs) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n gifs: {\n ...global.gifs,\n saved: savedGifs,\n },\n });\n}\n\nasync function loadStickersForEmoji(emoji: string, hash = 0) {\n let global = getGlobal();\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {\n ...global.stickers.forEmoji,\n emoji,\n },\n },\n });\n\n const result = await callApi('fetchStickersForEmoji', { emoji, hash });\n\n global = getGlobal();\n\n if (!result || global.stickers.forEmoji.emoji !== emoji) {\n return;\n }\n\n global = updateStickersForEmoji(global, emoji, result.stickers, result.hash);\n\n setGlobal(global);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { callApi } from '../../../api/gramjs';\nimport { ApiChat, ApiGlobalMessageSearchType } from '../../../api/types';\n\nimport {\n addChats,\n addMessages,\n addUsers,\n updateGlobalSearch,\n updateGlobalSearchFetchingStatus,\n updateGlobalSearchResults,\n} from '../../reducers';\nimport { throttle } from '../../../util/schedulers';\nimport { selectChat, selectCurrentGlobalSearchQuery } from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { GLOBAL_SEARCH_SLICE } from '../../../config';\nimport { timestampPlusDay } from '../../../util/dateFormat';\n\nconst searchThrottled = throttle((cb) => cb(), 500, false);\n\naddReducer('setGlobalSearchQuery', (global, actions, payload) => {\n const { chatId } = global.globalSearch;\n const { query } = payload!;\n\n if (query && !chatId) {\n void searchThrottled(() => {\n searchChats(query);\n });\n }\n});\n\naddReducer('setGlobalSearchDate', (global, actions, payload) => {\n const { date } = payload!;\n const maxDate = date ? timestampPlusDay(date) : date;\n const newGlobal = updateGlobalSearch(global, {\n date,\n query: '',\n resultsByType: {\n ...global.globalSearch.resultsByType,\n text: {\n totalCount: undefined,\n foundIds: [],\n nextOffsetId: 0,\n },\n },\n });\n setGlobal(newGlobal);\n const { chatId } = global.globalSearch;\n const chat = chatId ? selectChat(global, chatId) : undefined;\n searchMessagesGlobal('', 'text', undefined, chat, maxDate, date);\n});\n\naddReducer('searchMessagesGlobal', (global, actions, payload) => {\n const {\n query, resultsByType, chatId, date,\n } = global.globalSearch;\n const maxDate = date ? timestampPlusDay(date) : date;\n const { type } = payload;\n const { nextOffsetId } = (resultsByType && resultsByType[type as ApiGlobalMessageSearchType]) || {};\n\n const chat = chatId ? selectChat(global, chatId) : undefined;\n\n searchMessagesGlobal(query, type, nextOffsetId, chat, maxDate, date);\n});\n\nasync function searchChats(query: string) {\n const result = await callApi('searchChats', { query });\n\n let global = getGlobal();\n const currentSearchQuery = selectCurrentGlobalSearchQuery(global);\n if (!result || !currentSearchQuery || (query !== currentSearchQuery)) {\n setGlobal(updateGlobalSearchFetchingStatus(global, { chats: false }));\n return;\n }\n\n const {\n localChats, localUsers, globalChats, globalUsers,\n } = result;\n\n if (localChats.length || globalChats.length) {\n global = addChats(global, buildCollectionByKey([...localChats, ...globalChats], 'id'));\n }\n\n if (localUsers.length || globalUsers.length) {\n global = addUsers(global, buildCollectionByKey([...localUsers, ...globalUsers], 'id'));\n }\n\n global = updateGlobalSearchFetchingStatus(global, { chats: false });\n global = updateGlobalSearch(global, {\n localResults: {\n chatIds: localChats.map(({ id }) => id),\n userIds: localUsers.map(({ id }) => id),\n },\n globalResults: {\n ...global.globalSearch.globalResults,\n chatIds: globalUsers.map(({ id }) => id),\n userIds: globalChats.map(({ id }) => id),\n },\n });\n\n setGlobal(global);\n}\n\nasync function searchMessagesGlobal(\n query = '', type: ApiGlobalMessageSearchType, offsetRate?: number, chat?: ApiChat, maxDate?: number, minDate?: number,\n) {\n let result;\n\n if (chat) {\n const localResult = await callApi('searchMessagesLocal', {\n chatOrUser: chat,\n query,\n type,\n limit: GLOBAL_SEARCH_SLICE,\n offsetId: offsetRate,\n minDate,\n maxDate,\n });\n\n if (localResult) {\n const {\n messages, users, totalCount, nextOffsetId,\n } = localResult;\n\n result = {\n messages,\n users,\n chats: [],\n totalCount,\n nextRate: nextOffsetId,\n };\n }\n } else {\n result = await callApi('searchMessagesGlobal', {\n query,\n offsetRate,\n limit: GLOBAL_SEARCH_SLICE,\n type,\n maxDate,\n minDate,\n });\n }\n\n let global = getGlobal();\n const currentSearchQuery = selectCurrentGlobalSearchQuery(global);\n if (!result || (query !== '' && query !== currentSearchQuery)) {\n setGlobal(updateGlobalSearchFetchingStatus(global, { messages: false }));\n return;\n }\n\n const {\n messages, users, chats, totalCount, nextRate,\n } = result;\n\n if (chats.length) {\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n }\n\n if (users.length) {\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n if (messages.length) {\n global = addMessages(global, messages);\n }\n\n global = updateGlobalSearchResults(\n global,\n messages,\n totalCount,\n type,\n nextRate,\n );\n\n setGlobal(global);\n}\n","import {\n addReducer, getGlobal, setGlobal, getDispatch,\n} from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiFormattedText, ApiUser, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport {\n CHAT_LIST_LOAD_SLICE, DEBUG, MESSAGE_LIST_SLICE,\n} from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport {\n replaceChatListIds,\n replaceChats,\n replaceUsers,\n updateUsers,\n updateChats,\n updateChatListSecondaryInfo,\n updateThreadInfos,\n replaceThreadParam,\n} from '../../reducers';\nimport {\n selectUser, selectChat, selectCurrentMessageList, selectDraft, selectChatMessage, selectThreadInfo,\n} from '../../selectors';\nimport { isChatPrivate } from '../../helpers';\n\naddReducer('sync', (global, actions) => {\n void sync(actions.afterSync);\n});\n\naddReducer('afterSync', (global, actions) => {\n void afterSync(actions);\n});\n\nasync function sync(afterSyncCallback: () => void) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START SYNC');\n }\n\n await callApi('fetchCurrentUser');\n\n // This fetches only active chats and clears archived chats, which will be fetched in `afterSync`\n const savedUsers = await loadAndReplaceChats();\n await loadAndReplaceMessages(savedUsers);\n\n setGlobal({\n ...getGlobal(),\n lastSyncTime: Date.now(),\n });\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH SYNC');\n }\n\n afterSyncCallback();\n}\n\nasync function afterSync(actions: GlobalActions) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START AFTER-SYNC');\n }\n\n actions.loadFavoriteStickers();\n\n await Promise.all([\n loadAndUpdateUsers(),\n loadAndReplaceArchivedChats(),\n ]);\n\n await callApi('fetchCurrentUser');\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH AFTER-SYNC');\n }\n}\n\nasync function loadAndReplaceChats() {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n withPinned: true,\n serverTimeOffset: getGlobal().serverTimeOffset,\n });\n if (!result) {\n return undefined;\n }\n\n let global = getGlobal();\n\n const { recentlyFoundChatIds } = global.globalSearch;\n const { userIds: contactIds } = global.contactList || {};\n const { currentUserId } = global;\n\n const savedPrivateChatIds = [\n ...(recentlyFoundChatIds || []),\n ...(contactIds || []),\n ...(currentUserId ? [currentUserId] : []),\n ];\n\n const savedUsers = savedPrivateChatIds\n .map((id) => selectUser(global, id))\n .filter(Boolean as any);\n\n const savedChats = savedPrivateChatIds\n .map((id) => selectChat(global, id))\n .filter(Boolean as any);\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n if (currentChatId) {\n const selectedChat = selectChat(global, currentChatId);\n if (selectedChat && !savedPrivateChatIds.includes(currentChatId)) {\n savedChats.push(selectedChat);\n }\n\n if (isChatPrivate(currentChatId)) {\n const selectedChatUser = selectUser(global, currentChatId);\n if (selectedChatUser && !savedPrivateChatIds.includes(currentChatId)) {\n savedUsers.push(selectedChatUser);\n }\n }\n }\n\n savedUsers.push(...result.users);\n savedChats.push(...result.chats);\n\n global = replaceChats(global, buildCollectionByKey(savedChats, 'id'));\n global = replaceChatListIds(global, 'active', result.chatIds);\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n },\n };\n\n global = updateChatListSecondaryInfo(global, 'active', result);\n\n Object.keys(result.draftsById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId]);\n });\n\n Object.keys(result.replyingToById).map(Number).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId],\n );\n });\n\n setGlobal(global);\n\n if (currentChatId && !global.chats.byId[currentChatId]) {\n getDispatch().openChat({ id: undefined });\n }\n\n return savedUsers;\n}\n\nasync function loadAndReplaceArchivedChats() {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n archived: true,\n withPinned: true,\n serverTimeOffset: getGlobal().serverTimeOffset,\n });\n\n if (!result) {\n return;\n }\n\n let global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(result.users, 'id'));\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = replaceChatListIds(global, 'archived', result.chatIds);\n global = updateChatListSecondaryInfo(global, 'archived', result);\n setGlobal(global);\n}\n\nasync function loadAndReplaceMessages(savedUsers?: ApiUser[]) {\n let areMessagesLoaded = false;\n let users = savedUsers || [];\n\n let global = getGlobal();\n const { chatId: currentChatId, threadId: currentThreadId } = selectCurrentMessageList(global) || {};\n\n // Memoize drafts\n const draftChatIds = Object.keys(global.messages.byChatId).map(Number);\n const draftsByChatId = draftChatIds.reduce>((acc, chatId) => {\n const draft = selectDraft(global, chatId, MAIN_THREAD_ID);\n return draft ? { ...acc, [chatId]: draft } : acc;\n }, {});\n\n if (currentChatId) {\n const result = await loadTopMessages(global.chats.byId[currentChatId]);\n global = getGlobal();\n const { chatId: newCurrentChatId } = selectCurrentMessageList(global) || {};\n const threadInfo = currentThreadId && selectThreadInfo(global, currentChatId, currentThreadId);\n\n if (result && newCurrentChatId === currentChatId) {\n const currentMessageListInfo = global.messages.byChatId[currentChatId];\n const byId = buildCollectionByKey(result.messages, 'id');\n const listedIds = Object.keys(byId).map(Number);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n [currentChatId]: {\n byId,\n threadsById: {\n [MAIN_THREAD_ID]: {\n ...(currentMessageListInfo && currentMessageListInfo.threadsById[MAIN_THREAD_ID]),\n listedIds,\n viewportIds: listedIds,\n outlyingIds: undefined,\n },\n },\n },\n },\n },\n };\n\n if (currentThreadId && threadInfo && threadInfo.originChannelId) {\n const { originChannelId } = threadInfo;\n const currentMessageListInfoOrigin = global.messages.byChatId[originChannelId];\n const resultOrigin = await loadTopMessages(global.chats.byId[originChannelId]);\n if (resultOrigin) {\n const byIdOrigin = buildCollectionByKey(resultOrigin.messages, 'id');\n const listedIdsOrigin = Object.keys(byIdOrigin)\n .map(Number);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n ...global.messages.byChatId,\n [threadInfo.originChannelId]: {\n byId: byIdOrigin,\n threadsById: {\n [MAIN_THREAD_ID]: {\n ...(currentMessageListInfoOrigin && currentMessageListInfoOrigin.threadsById[MAIN_THREAD_ID]),\n listedIds: listedIdsOrigin,\n viewportIds: listedIdsOrigin,\n outlyingIds: undefined,\n },\n },\n },\n [currentChatId]: {\n ...global.messages.byChatId[currentChatId],\n threadsById: {\n ...global.messages.byChatId[currentChatId].threadsById,\n [currentThreadId]: {\n ...(currentMessageListInfo && currentMessageListInfo.threadsById[currentThreadId]),\n outlyingIds: undefined,\n },\n },\n },\n },\n },\n };\n }\n }\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = updateThreadInfos(global, currentChatId, result.threadInfos);\n\n areMessagesLoaded = true;\n users = Array.prototype.concat(users, result.users);\n }\n }\n\n if (!areMessagesLoaded) {\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {},\n },\n };\n }\n\n // Restore drafts\n Object.keys(draftsByChatId).map(Number).forEach((chatId) => {\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', draftsByChatId[chatId]);\n });\n\n if (savedUsers) {\n global = replaceUsers(global, buildCollectionByKey(users, 'id'));\n } else if (users) {\n // If `fetchChats` has failed for some reason, we don't have saved chats, thus we can not replace\n global = updateUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n setGlobal(global);\n\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n if (audioChatId && audioMessageId && !selectChatMessage(global, audioChatId, audioMessageId)) {\n getDispatch().closeAudioPlayer();\n }\n}\n\nasync function loadAndUpdateUsers() {\n let global = getGlobal();\n const { recentlyFoundChatIds } = global.globalSearch;\n const { userIds: contactIds } = global.contactList || {};\n if (\n (!contactIds || !contactIds.length)\n && (!recentlyFoundChatIds || !recentlyFoundChatIds.length)\n ) {\n return;\n }\n\n const users = [\n ...(recentlyFoundChatIds || []),\n ...(contactIds || []),\n ].map((id) => selectUser(global, id)).filter(Boolean as any);\n\n const updatedUsers = await callApi('fetchUsers', { users });\n if (!updatedUsers) {\n return;\n }\n\n global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(updatedUsers, 'id'));\n setGlobal(global);\n}\n\nfunction loadTopMessages(chat: ApiChat) {\n return callApi('fetchMessages', {\n chat,\n threadId: MAIN_THREAD_ID,\n offsetId: chat.lastReadInboxMessageId,\n addOffset: -(Math.round(MESSAGE_LIST_SLICE / 2) + 1),\n limit: MESSAGE_LIST_SLICE,\n });\n}\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser, MAIN_THREAD_ID } from '../../../api/types';\n\nimport { MESSAGE_SEARCH_SLICE, SHARED_MEDIA_SLICE } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n selectCurrentTextSearch,\n selectCurrentMediaSearchPeerId,\n selectCurrentMediaSearch, selectCurrentMessageList, selectChat, selectThreadInfo,\n} from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport {\n addChatMessagesById,\n addUsers,\n updateLocalMediaSearchResults,\n updateLocalTextSearchResults,\n} from '../../reducers';\nimport { SharedMediaType } from '../../../types';\n\naddReducer('searchTextMessagesLocal', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const currentSearch = selectCurrentTextSearch(global);\n if (!chat || !currentSearch || !threadId) {\n return;\n }\n\n const { query, results } = currentSearch;\n const offsetId = results ? results.nextOffsetId : undefined;\n\n let topMessageId: number | undefined;\n if (threadId !== MAIN_THREAD_ID) {\n const threadInfo = selectThreadInfo(global, chatId!, threadId);\n topMessageId = threadInfo ? threadInfo.topMessageId : undefined;\n }\n\n void searchTextMessages(chat, threadId, topMessageId, query, offsetId);\n});\n\naddReducer('searchMediaMessagesLocal', (global) => {\n const peerId = selectCurrentMediaSearchPeerId(global);\n const chatOrUser = peerId\n ? global.users.byId[peerId] || global.chats.byId[peerId]\n : undefined;\n const currentSearch = selectCurrentMediaSearch(global);\n\n if (!chatOrUser || !currentSearch) {\n return;\n }\n\n const { currentType: type, resultsByType } = currentSearch;\n const currentResults = type && resultsByType && resultsByType[type];\n const offsetId = currentResults ? currentResults.nextOffsetId : undefined;\n\n if (!type) {\n return;\n }\n\n void searchSharedMedia(chatOrUser, type, offsetId);\n});\n\naddReducer('searchMessagesByDate', (global, actions, payload) => {\n const { timestamp } = payload!;\n\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return;\n }\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void searchMessagesByDate(chat, timestamp);\n});\n\nasync function searchTextMessages(\n chatOrUser: ApiChat,\n threadId: number,\n topMessageId?: number,\n query?: string,\n offsetId?: number,\n) {\n const result = await callApi('searchMessagesLocal', {\n chatOrUser,\n type: 'text',\n query,\n topMessageId,\n limit: MESSAGE_SEARCH_SLICE,\n offsetId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, totalCount, nextOffsetId,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const newFoundIds = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n const currentSearch = selectCurrentTextSearch(global);\n if (!currentSearch || (query && query !== currentSearch.query)) {\n return;\n }\n\n global = addChatMessagesById(global, chatOrUser.id, byId);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateLocalTextSearchResults(global, chatOrUser.id, threadId, newFoundIds, totalCount, nextOffsetId);\n setGlobal(global);\n}\n\nasync function searchSharedMedia(\n chatOrUser: ApiChat | ApiUser,\n type: SharedMediaType,\n offsetId?: number,\n) {\n const result = await callApi('searchMessagesLocal', {\n chatOrUser,\n type,\n limit: SHARED_MEDIA_SLICE,\n offsetId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, totalCount, nextOffsetId,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const newFoundIds = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n const currentSearch = selectCurrentMediaSearch(global);\n if (!currentSearch) {\n return;\n }\n\n global = addChatMessagesById(global, chatOrUser.id, byId);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateLocalMediaSearchResults(global, chatOrUser.id, type, newFoundIds, totalCount, nextOffsetId);\n setGlobal(global);\n}\n\n/**\n * @param timestamp start of target date in seconds\n */\nasync function searchMessagesByDate(chat: ApiChat, timestamp: number) {\n const messageId = await callApi('findFirstMessageIdAfterDate', {\n chat,\n timestamp,\n });\n\n if (!messageId) {\n return;\n }\n\n getDispatch().focusMessage({\n chatId: chat.id,\n messageId,\n });\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementProgress } from '../../../types';\nimport { callApi } from '../../../api/gramjs';\nimport { updateManagement, updateManagementProgress } from '../../reducers';\nimport { selectChat, selectCurrentMessageList } from '../../selectors';\nimport { isChatBasicGroup } from '../../helpers';\n\naddReducer('checkPublicLink', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return;\n }\n\n // No need to check the username if already in progress\n if (global.management.progress === ManagementProgress.InProgress) {\n return;\n }\n\n const { username } = payload!;\n\n (async () => {\n global = updateManagementProgress(global, ManagementProgress.InProgress);\n global = updateManagement(global, chatId, { isUsernameAvailable: undefined });\n setGlobal(global);\n\n const isUsernameAvailable = await callApi('checkChatUsername', { username })!;\n\n global = getGlobal();\n global = updateManagementProgress(\n global, isUsernameAvailable ? ManagementProgress.Complete : ManagementProgress.Error,\n );\n global = updateManagement(global, chatId, { isUsernameAvailable });\n setGlobal(global);\n })();\n});\n\naddReducer('updatePublicLink', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n let chat = chatId && selectChat(global, chatId);\n if (!chatId || !chat) {\n return;\n }\n\n const { username } = payload!;\n\n (async () => {\n global = updateManagementProgress(global, ManagementProgress.InProgress);\n setGlobal(global);\n\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n const result = await callApi('setChatUsername', { chat, username });\n\n global = getGlobal();\n global = updateManagementProgress(global, result ? ManagementProgress.Complete : ManagementProgress.Error);\n global = updateManagement(global, chatId, { isUsernameAvailable: undefined });\n setGlobal(global);\n })();\n});\n\naddReducer('updatePrivateLink', (global) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId && selectChat(global, chatId);\n if (!chatId || !chat) {\n return;\n }\n\n callApi('updatePrivateLink', { chat });\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { debounce, throttle } from '../../../util/schedulers';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { isChatPrivate } from '../../helpers';\nimport { callApi } from '../../../api/gramjs';\nimport { selectChat, selectUser } from '../../selectors';\nimport {\n addChats, addUsers, updateChat, updateManagementProgress, updateUser, updateUsers,\n updateUserSearch, updateUserSearchFetchingStatus,\n} from '../../reducers';\n\nconst runDebouncedForFetchFullUser = debounce((cb) => cb(), 500, false, true);\nconst TOP_PEERS_REQUEST_COOLDOWN = 60; // 1 min\nconst runThrottledForSearch = throttle((cb) => cb(), 500, false);\n\naddReducer('loadFullUser', (global, actions, payload) => {\n const { userId } = payload!;\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n const { id, accessHash } = user;\n\n runDebouncedForFetchFullUser(() => callApi('fetchFullUser', { id, accessHash }));\n});\n\naddReducer('loadUser', (global, actions, payload) => {\n const { userId } = payload!;\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n (async () => {\n const updatedUsers = await callApi('fetchUsers', { users: [user] });\n if (!updatedUsers) {\n return;\n }\n\n global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(updatedUsers, 'id'));\n setGlobal(global);\n })();\n});\n\naddReducer('loadTopUsers', (global) => {\n const {\n serverTimeOffset,\n topPeers: {\n hash, lastRequestedAt,\n },\n } = global;\n\n if (!lastRequestedAt || Date.now() / 1000 + serverTimeOffset - lastRequestedAt > TOP_PEERS_REQUEST_COOLDOWN) {\n void loadTopUsers(hash);\n }\n});\n\naddReducer('loadContactList', (global) => {\n const { hash } = global.contactList || {};\n void loadContactList(hash);\n});\n\naddReducer('loadCurrentUser', () => {\n void callApi('fetchCurrentUser');\n});\n\naddReducer('updateContact', (global, actions, payload) => {\n const {\n userId, isMuted, firstName, lastName,\n } = payload!;\n\n void updateContact(userId, isMuted, firstName, lastName);\n});\n\naddReducer('deleteUser', (global, actions, payload) => {\n const { userId } = payload!;\n\n void deleteUser(userId);\n});\n\nasync function loadTopUsers(usersHash?: number) {\n const result = await callApi('fetchTopUsers', { hash: usersHash });\n if (!result) {\n return;\n }\n\n const { hash, ids, users } = result;\n\n let global = getGlobal();\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = {\n ...global,\n topPeers: {\n ...global.topPeers,\n hash,\n userIds: ids,\n lastRequestedAt: Date.now() / 1000 + global.serverTimeOffset,\n },\n };\n setGlobal(global);\n}\n\nasync function loadContactList(hash?: number) {\n const contactList = await callApi('fetchContactList', { hash });\n if (!contactList) {\n return;\n }\n\n let global = addUsers(getGlobal(), buildCollectionByKey(contactList.users, 'id'));\n global = addChats(global, buildCollectionByKey(contactList.chats, 'id'));\n\n // Sort contact list by Last Name (or First Name), with latin names being placed first\n const getCompareString = (user: ApiUser) => (user.lastName || user.firstName || '');\n const collator = new Intl.Collator('en-US');\n\n const sortedUsers = contactList.users.sort((a, b) => (\n collator.compare(getCompareString(a), getCompareString(b))\n )).filter((user) => !user.isSelf);\n\n setGlobal({\n ...global,\n contactList: {\n hash: contactList.hash,\n userIds: sortedUsers.map((user) => user.id),\n },\n });\n}\n\nasync function updateContact(\n userId: number,\n isMuted: boolean,\n firstName: string,\n lastName?: string,\n) {\n const global = getGlobal();\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n getDispatch().updateChatMutedState({ chatId: userId, isMuted });\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress));\n\n const result = await callApi('updateContact', { phone: user.phoneNumber, firstName, lastName });\n\n if (result) {\n setGlobal(updateUser(\n getGlobal(),\n user.id,\n {\n firstName,\n lastName,\n },\n ));\n }\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.Complete));\n}\n\nasync function deleteUser(userId: number) {\n const global = getGlobal();\n const user = selectUser(global, userId);\n\n if (!user) {\n return;\n }\n\n const { id, accessHash } = user;\n\n await callApi('deleteUser', { id, accessHash });\n}\n\naddReducer('loadProfilePhotos', (global, actions, payload) => {\n const { profileId } = payload!;\n const isPrivate = isChatPrivate(profileId);\n const user = isPrivate ? selectUser(global, profileId) : undefined;\n const chat = !isPrivate ? selectChat(global, profileId) : undefined;\n\n (async () => {\n const result = await callApi('fetchProfilePhotos', user, chat);\n if (!result || !result.photos) {\n return;\n }\n\n let newGlobal = getGlobal();\n if (isPrivate) {\n newGlobal = updateUser(newGlobal, profileId, { photos: result.photos });\n } else {\n newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users!, 'id'));\n newGlobal = updateChat(newGlobal, profileId, { photos: result.photos });\n }\n\n setGlobal(newGlobal);\n })();\n});\n\n\naddReducer('setUserSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (!query) return;\n\n void runThrottledForSearch(() => {\n searchUsers(query);\n });\n});\n\nasync function searchUsers(query: string) {\n const result = await callApi('searchChats', { query });\n\n let global = getGlobal();\n const currentSearchQuery = global.userSearch.query;\n\n if (!result || !currentSearchQuery || (query !== currentSearchQuery)) {\n setGlobal(updateUserSearchFetchingStatus(global, false));\n return;\n }\n\n const { localUsers, globalUsers } = result;\n\n let localUserIds;\n let globalUserIds;\n if (localUsers.length) {\n global = addUsers(global, buildCollectionByKey(localUsers, 'id'));\n localUserIds = localUsers.map(({ id }) => id);\n }\n if (globalUsers.length) {\n global = addUsers(global, buildCollectionByKey(globalUsers, 'id'));\n globalUserIds = globalUsers.map(({ id }) => id);\n }\n\n global = updateUserSearchFetchingStatus(global, false);\n global = updateUserSearch(global, { localUserIds, globalUserIds });\n\n setGlobal(global);\n}\n","import { GlobalState } from '../../global/types';\nimport { InlineBotSettings } from '../../types';\n\n\nexport function replaceInlineBotSettings(\n global: GlobalState, username: string, inlineBotSettings: InlineBotSettings | false,\n): GlobalState {\n return {\n ...global,\n inlineBots: {\n ...global.inlineBots,\n byUsername: {\n ...global.inlineBots.byUsername,\n [username]: inlineBotSettings,\n },\n },\n };\n}\n\nexport function replaceInlineBotsIsLoading(global: GlobalState, isLoading: boolean): GlobalState {\n return {\n ...global,\n inlineBots: {\n ...global.inlineBots,\n isLoading,\n },\n };\n}\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../api/types';\nimport { InlineBotSettings } from '../../../types';\n\nimport { RE_TME_INVITE_LINK, RE_TME_LINK } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n selectChat, selectChatBot, selectChatMessage, selectCurrentChat, selectCurrentMessageList,\n selectReplyingToId, selectUser,\n} from '../../selectors';\nimport { addChats, addUsers, removeBlockedContact } from '../../reducers';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { debounce } from '../../../util/schedulers';\nimport { replaceInlineBotSettings, replaceInlineBotsIsLoading } from '../../reducers/bots';\n\nconst TOP_PEERS_REQUEST_COOLDOWN = 60000; // 1 min\nconst runDebouncedForSearch = debounce((cb) => cb(), 500, false);\n\naddReducer('clickInlineButton', (global, actions, payload) => {\n const { button } = payload;\n\n switch (button.type) {\n case 'command':\n actions.sendBotCommand({ command: button.value });\n break;\n case 'url':\n if (button.value.match(RE_TME_INVITE_LINK) || button.value.match(RE_TME_LINK)) {\n actions.openTelegramLink({ url: button.value });\n } else {\n actions.toggleSafeLinkModal({ url: button.value });\n }\n break;\n case 'callback': {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n void answerCallbackButton(chat, button.messageId, button.value);\n break;\n }\n case 'requestPoll':\n actions.openPollModal();\n break;\n case 'buy': {\n const chat = selectCurrentChat(global);\n const { messageId, value } = button;\n if (!chat) {\n return;\n }\n\n if (value) {\n actions.getReceipt({ receiptMessageId: value, chatId: chat.id, messageId });\n } else {\n actions.getPaymentForm({ messageId });\n actions.setInvoiceMessageInfo(selectChatMessage(global, chat.id, messageId));\n actions.openPaymentModal({ messageId });\n }\n break;\n }\n }\n});\n\naddReducer('sendBotCommand', (global, actions, payload) => {\n const { command, chatId } = payload;\n const { currentUserId } = global;\n const chat = chatId ? selectChat(global, chatId) : selectCurrentChat(global);\n if (!currentUserId || !chat) {\n return;\n }\n\n void sendBotCommand(chat, currentUserId, command);\n});\n\naddReducer('restartBot', (global, actions, payload) => {\n const { chatId } = payload;\n const { currentUserId } = global;\n const chat = selectCurrentChat(global);\n const bot = currentUserId && selectChatBot(global, chatId);\n if (!currentUserId || !chat || !bot) {\n return;\n }\n\n (async () => {\n const result = await callApi('unblockContact', bot.id, bot.accessHash);\n if (!result) {\n return;\n }\n\n setGlobal(removeBlockedContact(getGlobal(), bot.id));\n void sendBotCommand(chat, currentUserId, '/start');\n })();\n});\n\naddReducer('loadTopInlineBots', (global) => {\n const { serverTimeOffset } = global;\n const { hash, lastRequestedAt } = global.topInlineBots;\n\n if (lastRequestedAt && Date.now() + serverTimeOffset - lastRequestedAt < TOP_PEERS_REQUEST_COOLDOWN) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchTopInlineBots', { hash });\n if (!result) {\n return;\n }\n\n const { hash: newHash, ids, users } = result;\n\n let newGlobal = getGlobal();\n newGlobal = addUsers(newGlobal, buildCollectionByKey(users, 'id'));\n newGlobal = {\n ...newGlobal,\n topInlineBots: {\n ...newGlobal.topInlineBots,\n hash: newHash,\n userIds: ids,\n lastRequestedAt: Date.now(),\n },\n };\n setGlobal(newGlobal);\n })();\n});\n\naddReducer('queryInlineBot', ((global, actions, payload) => {\n const {\n chatId, username, query, offset,\n } = payload;\n\n (async () => {\n let inlineBotData = global.inlineBots.byUsername[username];\n\n if (inlineBotData === false) {\n return;\n }\n\n if (inlineBotData === undefined) {\n const { user: inlineBot, chat } = await callApi('fetchInlineBot', { username }) || {};\n global = getGlobal();\n if (!inlineBot || !chat) {\n setGlobal(replaceInlineBotSettings(global, username, false));\n return;\n }\n\n global = addUsers(global, { [inlineBot.id]: inlineBot });\n global = addChats(global, { [chat.id]: chat });\n inlineBotData = {\n id: inlineBot.id,\n query: '',\n offset: '',\n switchPm: undefined,\n canLoadMore: true,\n results: [],\n };\n\n global = replaceInlineBotSettings(global, username, inlineBotData);\n setGlobal(global);\n }\n\n if (query === inlineBotData.query && !inlineBotData.canLoadMore) {\n return;\n }\n\n void runDebouncedForSearch(() => {\n searchInlineBot({\n username,\n inlineBotData: inlineBotData as InlineBotSettings,\n chatId,\n query,\n offset,\n });\n });\n })();\n}));\n\naddReducer('sendInlineBotResult', (global, actions, payload) => {\n const { id, queryId } = payload;\n const currentMessageList = selectCurrentMessageList(global);\n\n if (!currentMessageList || !id) {\n return;\n }\n\n const { chatId, threadId } = currentMessageList;\n\n const chat = selectChat(global, chatId)!;\n\n actions.setReplyingToId({ messageId: undefined });\n actions.clearWebPagePreview({ chatId, threadId, value: false });\n\n void callApi('sendInlineBotResult', {\n chat,\n resultId: id,\n queryId,\n replyingTo: selectReplyingToId(global, chatId, threadId),\n });\n});\n\naddReducer('resetInlineBot', ((global, actions, payload) => {\n const { username } = payload;\n\n let inlineBotData = global.inlineBots.byUsername[username];\n\n if (!inlineBotData) {\n return;\n }\n\n inlineBotData = {\n id: inlineBotData.id,\n query: '',\n offset: '',\n switchPm: undefined,\n canLoadMore: true,\n results: [],\n };\n\n setGlobal(replaceInlineBotSettings(global, username, inlineBotData));\n}));\n\nasync function searchInlineBot({\n username,\n inlineBotData,\n chatId,\n query,\n offset,\n} : {\n username: string;\n inlineBotData: InlineBotSettings;\n chatId: number;\n query: string;\n offset?: string;\n}) {\n let global = getGlobal();\n const bot = selectUser(global, inlineBotData.id);\n const chat = selectChat(global, chatId);\n if (!bot || !chat) {\n return;\n }\n\n const shouldReplaceSettings = inlineBotData.query !== query;\n global = replaceInlineBotsIsLoading(global, true);\n global = replaceInlineBotSettings(global, username, {\n ...inlineBotData,\n query,\n ...(shouldReplaceSettings && { offset: undefined, results: [] }),\n });\n setGlobal(global);\n\n const result = await callApi('fetchInlineBotResults', {\n bot,\n chat,\n query,\n offset: shouldReplaceSettings ? undefined : offset,\n });\n\n const newInlineBotData = global.inlineBots.byUsername[username];\n global = replaceInlineBotsIsLoading(getGlobal(), false);\n if (!result || !newInlineBotData || query !== newInlineBotData.query) {\n setGlobal(global);\n return;\n }\n\n const currentIds = new Set((newInlineBotData.results || []).map((data) => data.id));\n const newResults = result.results.filter((data) => !currentIds.has(data.id));\n\n global = replaceInlineBotSettings(global, username, {\n ...newInlineBotData,\n help: result.help,\n ...(newResults.length && { isGallery: result.isGallery }),\n ...(result.switchPm && { switchPm: result.switchPm }),\n canLoadMore: result.results.length > 0 && Boolean(result.nextOffset),\n results: newInlineBotData.offset === '' || newInlineBotData.offset === result.nextOffset\n ? result.results\n : (newInlineBotData.results || []).concat(newResults),\n offset: newResults.length ? result.nextOffset : '',\n });\n\n setGlobal(global);\n}\n\nasync function sendBotCommand(chat: ApiChat, currentUserId: number, command: string) {\n await callApi('sendMessage', {\n chat,\n text: command,\n });\n}\n\nasync function answerCallbackButton(chat: ApiChat, messageId: number, data: string) {\n const result = await callApi('answerCallbackButton', {\n chatId: chat.id,\n accessHash: chat.accessHash,\n messageId,\n data,\n });\n\n if (!result || !result.message) {\n return;\n }\n\n const { message, alert: isError } = result;\n\n if (isError) {\n getDispatch().showDialog({ data: { message } });\n } else {\n getDispatch().showNotification({ message });\n }\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { callApi } from '../../../api/gramjs';\nimport { replaceSettings, updateTwoFaSettings } from '../../reducers';\n\naddReducer('loadPasswordInfo', () => {\n (async () => {\n const result = await callApi('getPasswordInfo');\n if (!result) {\n return;\n }\n\n let global = getGlobal();\n global = replaceSettings(global, { hasPassword: result.hasPassword });\n global = updateTwoFaSettings(global, { hint: result.hint });\n setGlobal(global);\n })();\n});\n\naddReducer('checkPassword', (global, actions, payload) => {\n const { currentPassword, onSuccess } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('checkPassword', currentPassword);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('clearPassword', (global, actions, payload) => {\n const { currentPassword, onSuccess } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('clearPassword', currentPassword);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('updatePassword', (global, actions, payload) => {\n const {\n currentPassword, password, hint, email, onSuccess,\n } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('updatePassword', currentPassword, password, hint, email);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('updateRecoveryEmail', (global, actions, payload) => {\n const {\n currentPassword, email, onSuccess,\n } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('updateRecoveryEmail', currentPassword, email);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false, waitingEmailCodeLength: undefined }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('provideTwoFaEmailCode', (global, actions, payload) => {\n const { code } = payload;\n\n void callApi('provideRecoveryEmailCode', code);\n});\n\naddReducer('clearTwoFaError', (global) => {\n return updateTwoFaSettings(global, { error: undefined });\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { PaymentStep } from '../../../types/index';\nimport { callApi } from '../../../api/gramjs';\nimport {\n selectPaymentMessageId,\n selectPaymentRequestId,\n selectProviderPublishableKey,\n selectStripeCredentials,\n selectChatMessage,\n} from '../../selectors';\n\nimport { getStripeError } from '../../helpers/payments';\nimport { buildQueryString } from '../../../util/requestQuery';\n\nimport {\n updateShippingOptions,\n setPaymentStep,\n setRequestInfoId,\n setPaymentForm,\n setStripeCardInfo,\n setInvoiceMessageInfo,\n setReceipt,\n clearPayment,\n closeInvoice,\n} from '../../reducers';\n\naddReducer('validateRequestedInfo', (global, actions, payload) => {\n const { requestInfo, saveInfo } = payload;\n const messageId = selectPaymentMessageId(global);\n if (!messageId) {\n return;\n }\n validateRequestedInfo(messageId, requestInfo, saveInfo);\n});\n\nasync function validateRequestedInfo(messageId: number, requestInfo: any, shouldSave?: true) {\n const result = await callApi('validateRequestedInfo', { messageId, requestInfo, shouldSave });\n if (!result) {\n return;\n }\n const { id, shippingOptions } = result;\n if (!id) {\n return;\n }\n let global = setRequestInfoId(getGlobal(), id);\n if (shippingOptions) {\n global = updateShippingOptions(global, shippingOptions);\n global = setPaymentStep(global, PaymentStep.Shipping);\n } else {\n global = setPaymentStep(global, PaymentStep.PaymentInfo);\n }\n setGlobal(global);\n}\n\naddReducer('getPaymentForm', (global, actions, payload) => {\n const { messageId } = payload;\n if (!messageId) {\n return;\n }\n getPaymentForm(messageId);\n});\n\n\nasync function getPaymentForm(messageId: number) {\n const result = await callApi('getPaymentForm', { messageId });\n if (!result) {\n return;\n }\n let global = setPaymentForm(getGlobal(), result);\n let step = PaymentStep.PaymentInfo;\n if (global.payment.invoice\n && (global.payment.invoice.shippingAddressRequested\n || global.payment.invoice.nameRequested\n || global.payment.invoice.phoneRequested\n || global.payment.invoice.emailRequested)) {\n step = PaymentStep.ShippingInfo;\n }\n global = setPaymentStep(global, step);\n setGlobal(global);\n}\n\naddReducer('getReceipt', (global, actions, payload) => {\n const { receiptMessageId, chatId, messageId } = payload;\n if (!messageId || !receiptMessageId || !chatId) {\n return;\n }\n getReceipt(messageId, receiptMessageId, chatId);\n});\n\nasync function getReceipt(messageId: number, receiptMessageId: number, chatId: number) {\n const result = await callApi('getReceipt', receiptMessageId);\n if (!result) {\n return;\n }\n let global = getGlobal();\n const message = selectChatMessage(global, chatId, messageId);\n global = setReceipt(global, result, message);\n setGlobal(global);\n}\n\naddReducer('clearPaymentError', (global) => {\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n error: undefined,\n },\n });\n});\n\naddReducer('clearReceipt', (global) => {\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n receipt: undefined,\n },\n });\n});\n\naddReducer('sendCredentialsInfo', (global, actions, payload) => {\n const publishableKey = selectProviderPublishableKey(global);\n if (!publishableKey) {\n return;\n }\n const { credentials } = payload;\n const { data } = credentials;\n sendStipeCredentials(data, publishableKey);\n});\n\naddReducer('sendPaymentForm', (global, actions, payload) => {\n const { shippingOptionId, saveCredentials } = payload;\n const messageId = selectPaymentMessageId(global);\n const requestInfoId = selectPaymentRequestId(global);\n const publishableKey = selectProviderPublishableKey(global);\n const stripeCredentials = selectStripeCredentials(global);\n if (!messageId || !publishableKey) {\n return;\n }\n sendPaymentForm(messageId, {\n save: saveCredentials,\n data: stripeCredentials,\n }, requestInfoId, shippingOptionId);\n});\n\nasync function sendStipeCredentials(data: {\n cardNumber: string;\n cardholder?: string;\n expiryMonth: string;\n expiryYear: string;\n cvv: string;\n country: string;\n zip: string;\n},\npublishableKey: string) {\n const query = buildQueryString({\n 'card[number]': data.cardNumber,\n 'card[exp_month]': data.expiryMonth,\n 'card[exp_year]': data.expiryYear,\n 'card[cvc]': data.cvv,\n 'card[address_zip]': data.zip,\n 'card[address_country]': data.country,\n });\n\n const response = await fetch(`https://api.stripe.com/v1/tokens${query}`, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: `Bearer ${publishableKey}`,\n },\n });\n const result = await response.json();\n if (result.error) {\n const error = getStripeError(result.error);\n const global = getGlobal();\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n error: {\n ...error,\n },\n },\n });\n return;\n }\n let global = setStripeCardInfo(getGlobal(), {\n type: result.type,\n id: result.id,\n });\n global = setPaymentStep(global, PaymentStep.Checkout);\n setGlobal(global);\n}\n\nasync function sendPaymentForm(\n messageId: number,\n credentials: any,\n requestedInfoId?: string,\n shippingOptionId?: string,\n) {\n const result = await callApi('sendPaymentForm', {\n messageId, credentials, requestedInfoId, shippingOptionId,\n });\n if (result) {\n const global = clearPayment(getGlobal());\n setGlobal(closeInvoice(global));\n }\n}\n\naddReducer('setPaymentStep', (global, actions, payload = {}) => {\n return setPaymentStep(global, payload.step || PaymentStep.ShippingInfo);\n});\n\naddReducer('setInvoiceMessageInfo', (global, actions, payload) => {\n return setInvoiceMessageInfo(global, payload);\n});\n","export function buildQueryString(data: Record) {\n const query = Object.keys(data).map((k) => `${k}=${data[k]}`).join('&');\n return query.length > 0 ? `?${query}` : '';\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate, MAIN_THREAD_ID } from '../../../api/types';\n\nimport { ARCHIVED_FOLDER_ID, MAX_ACTIVE_PINNED_CHATS } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { showNewMessageNotification } from '../../../util/notifications';\nimport { updateAppBadge } from '../../../util/appBadge';\nimport {\n updateChat,\n replaceChatListIds,\n updateChatListIds,\n updateChatListType,\n replaceThreadParam,\n} from '../../reducers';\nimport {\n selectChat,\n selectCommonBoxChatId,\n selectIsChatListed,\n selectChatListType,\n selectCurrentMessageList,\n selectCountNotMutedUnread,\n} from '../../selectors';\nimport { throttle } from '../../../util/schedulers';\n\nconst TYPING_STATUS_CLEAR_DELAY = 6000; // 6 seconds\n\n// Enough to animate and mark as read in Message List\nconst CURRENT_CHAT_UNREAD_DELAY = 1000;\nconst runThrottledForUpdateAppBadge = throttle((cb) => cb(), CURRENT_CHAT_UNREAD_DELAY, true);\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updateChat': {\n if (!update.noTopChatsRequest && !selectIsChatListed(global, update.id)) {\n // Chat can appear in dialogs list.\n actions.loadTopChats();\n }\n\n const newGlobal = updateChat(global, update.id, update.chat, update.newProfilePhoto);\n setGlobal(newGlobal);\n\n const unreadCount = selectCountNotMutedUnread(newGlobal);\n runThrottledForUpdateAppBadge(() => updateAppBadge(unreadCount));\n break;\n }\n\n case 'updateChatJoin': {\n const listType = selectChatListType(global, update.id);\n if (!listType) {\n break;\n }\n\n global = updateChatListIds(global, listType, [update.id]);\n global = updateChat(global, update.id, { isNotJoined: false });\n setGlobal(global);\n\n const chat = selectChat(global, update.id);\n if (chat) {\n actions.requestChatUpdate({ chatId: chat.id });\n }\n break;\n }\n\n case 'updateChatLeave': {\n const listType = selectChatListType(global, update.id);\n if (!listType) {\n break;\n }\n\n const { [listType]: listIds } = global.chats.listIds;\n\n if (listIds) {\n global = replaceChatListIds(global, listType, listIds.filter((listId) => listId !== update.id));\n }\n\n global = updateChat(global, update.id, { isNotJoined: true });\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatInbox': {\n setGlobal(updateChat(global, update.id, update.chat));\n\n break;\n }\n\n case 'updateChatTypingStatus': {\n const { id, typingStatus } = update;\n setGlobal(updateChat(global, id, { typingStatus }));\n\n setTimeout(() => {\n const newGlobal = getGlobal();\n const chat = selectChat(newGlobal, id);\n if (chat && typingStatus && chat.typingStatus && chat.typingStatus.timestamp === typingStatus.timestamp) {\n setGlobal(updateChat(newGlobal, id, { typingStatus: undefined }));\n }\n }, TYPING_STATUS_CLEAR_DELAY);\n\n break;\n }\n\n case 'newMessage': {\n const { message } = update;\n const { chatId: currentChatId, threadId, type: messageListType } = selectCurrentMessageList(global) || {};\n\n if (message.senderId === global.currentUserId && !message.isFromScheduled) {\n return;\n }\n\n const chat = selectChat(global, update.chatId);\n if (!chat) {\n return;\n }\n\n const isActiveChat = (\n messageListType === 'thread'\n && threadId === MAIN_THREAD_ID\n && update.chatId === currentChatId\n );\n\n if (isActiveChat) {\n setTimeout(() => {\n actions.requestChatUpdate({ chatId: update.chatId });\n }, CURRENT_CHAT_UNREAD_DELAY);\n } else {\n setGlobal(updateChat(global, update.chatId, {\n unreadCount: chat.unreadCount ? chat.unreadCount + 1 : 1,\n ...(update.message.hasUnreadMention && {\n unreadMentionsCount: chat.unreadMentionsCount ? chat.unreadMentionsCount + 1 : 1,\n }),\n }));\n }\n\n const unreadCount = selectCountNotMutedUnread(getGlobal());\n updateAppBadge(unreadCount);\n showNewMessageNotification({ chat, message, isActiveChat });\n\n break;\n }\n\n case 'updateCommonBoxMessages':\n case 'updateChannelMessages': {\n const { ids, messageUpdate } = update;\n if (messageUpdate.hasUnreadMention !== false) {\n return;\n }\n\n ids.forEach((id) => {\n const chatId = 'channelId' in update ? update.channelId : selectCommonBoxChatId(global, id);\n const chat = selectChat(global, chatId);\n if (chat && chat.unreadMentionsCount) {\n global = updateChat(global, chatId, {\n unreadMentionsCount: chat.unreadMentionsCount - 1,\n });\n }\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatFullInfo': {\n const { fullInfo } = update;\n const targetChat = global.chats.byId[update.id];\n if (!targetChat) {\n return;\n }\n\n setGlobal(updateChat(global, update.id, {\n fullInfo: {\n ...targetChat.fullInfo,\n ...fullInfo,\n },\n }));\n\n break;\n }\n\n case 'updatePinnedChatIds': {\n const { ids, folderId } = update;\n\n const listType = folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [listType]: ids.length ? ids : undefined,\n },\n },\n };\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatPinned': {\n const { id, isPinned } = update;\n const listType = selectChatListType(global, id);\n if (listType) {\n const { [listType]: orderedPinnedIds } = global.chats.orderedPinnedIds;\n\n let newOrderedPinnedIds = orderedPinnedIds || [];\n if (!isPinned) {\n newOrderedPinnedIds = newOrderedPinnedIds.filter((pinnedId) => pinnedId !== id);\n } else if (!newOrderedPinnedIds.includes(id)) {\n // When moving pinned chats to archive, active ordered pinned ids don't get updated\n // (to preserve chat pinned state when it returns from archive)\n // If user already has max pinned chats, we should check for orderedIds\n // that don't point to listed chats\n if (listType === 'active' && newOrderedPinnedIds.length >= MAX_ACTIVE_PINNED_CHATS) {\n const listIds = global.chats.listIds.active;\n newOrderedPinnedIds = newOrderedPinnedIds.filter((pinnedId) => listIds && listIds.includes(pinnedId));\n }\n\n newOrderedPinnedIds = [id, ...newOrderedPinnedIds];\n }\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [listType]: newOrderedPinnedIds.length ? newOrderedPinnedIds : undefined,\n },\n },\n };\n }\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatListType': {\n const { id, folderId } = update;\n\n setGlobal(updateChatListType(global, id, folderId));\n\n break;\n }\n\n case 'updateChatFolder': {\n const { id, folder } = update;\n const { byId: chatFoldersById, orderedIds } = global.chatFolders;\n\n const newChatFoldersById = folder\n ? { ...chatFoldersById, [id]: folder }\n : pick(\n chatFoldersById,\n Object.keys(chatFoldersById).map(Number).filter((folderId) => folderId !== id),\n );\n\n const newOrderedIds = folder\n ? orderedIds && orderedIds.includes(id) ? orderedIds : [...(orderedIds || []), id]\n : orderedIds ? orderedIds.filter((orderedId) => orderedId !== id) : undefined;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n byId: newChatFoldersById,\n orderedIds: newOrderedIds,\n },\n });\n\n break;\n }\n\n case 'updateChatFoldersOrder': {\n const { orderedIds } = update;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n orderedIds,\n },\n });\n\n break;\n }\n\n case 'updateRecommendedChatFolders': {\n const { folders } = update;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: folders,\n },\n });\n\n break;\n }\n\n case 'updateChatMembers': {\n const targetChat = global.chats.byId[update.id];\n const { replacedMembers, addedMember, deletedMemberId } = update;\n if (!targetChat) {\n return;\n }\n\n let shouldUpdate = false;\n let members = targetChat.fullInfo && targetChat.fullInfo.members\n ? [...targetChat.fullInfo.members]\n : [];\n\n if (replacedMembers) {\n members = replacedMembers;\n shouldUpdate = true;\n } else if (addedMember) {\n if (\n !members.length\n || !members.some((m) => m.userId === addedMember.userId)\n ) {\n members.push(addedMember);\n shouldUpdate = true;\n }\n } else if (members.length && deletedMemberId) {\n const deleteIndex = members.findIndex((m) => m.userId === deletedMemberId);\n if (deleteIndex > -1) {\n members.slice(deleteIndex, 1);\n shouldUpdate = true;\n }\n }\n\n if (shouldUpdate) {\n const adminMembers = members.filter(({ isOwner, isAdmin }) => isOwner || isAdmin);\n // TODO Kicked members?\n\n setGlobal(updateChat(global, update.id, {\n membersCount: members.length,\n fullInfo: {\n ...targetChat.fullInfo,\n members,\n adminMembers,\n },\n }));\n }\n\n break;\n }\n\n case 'deleteProfilePhotos': {\n const { chatId, ids } = update;\n const chat = global.chats.byId[chatId];\n\n if (chat && chat.photos) {\n setGlobal(updateChat(global, chatId, {\n photos: chat.photos.filter((photo) => !ids.includes(photo.id)),\n }));\n }\n break;\n }\n\n case 'draftMessage': {\n const {\n chatId, formattedText, date, replyingToId,\n } = update;\n const chat = global.chats.byId[chatId];\n\n if (chat) {\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', formattedText);\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'replyingToId', replyingToId);\n global = updateChat(global, chatId, { draftDate: date });\n\n setGlobal(global);\n }\n break;\n }\n\n case 'showInvite': {\n const { data } = update;\n\n actions.showDialog({ data });\n break;\n }\n }\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiUpdate, ApiMessage, ApiPollResult, ApiThreadInfo, MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { unique } from '../../../util/iteratees';\nimport {\n updateChat,\n deleteChatMessages,\n updateChatMessage,\n updateListedIds,\n addViewportId,\n updateThreadInfo,\n replaceThreadParam,\n updateScheduledMessage,\n deleteChatScheduledMessages,\n} from '../../reducers';\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport {\n selectChatMessage,\n selectChatMessages,\n selectIsViewportNewest,\n selectListedIds,\n selectChatMessageByPollId,\n selectCommonBoxChatId,\n selectIsChatListed,\n selectThreadInfo,\n selectThreadByMessage,\n selectPinnedIds,\n selectScheduledMessage,\n selectScheduledMessages,\n isMessageInCurrentMessageList,\n selectScheduledIds,\n selectCurrentMessageList,\n selectViewportIds,\n selectFirstUnreadId,\n selectChat,\n} from '../../selectors';\nimport { getMessageContent, isChatPrivate, isMessageLocal } from '../../helpers';\n\nconst ANIMATION_DELAY = 350;\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'newMessage': {\n const { chatId, id, message } = update;\n global = updateWithLocalMedia(global, chatId, id, message);\n global = updateListedAndViewportIds(global, message as ApiMessage);\n\n if (message.threadInfo) {\n global = updateThreadInfo(\n global,\n message.threadInfo.chatId,\n message.threadInfo.threadId,\n message.threadInfo,\n );\n }\n\n setGlobal(global);\n\n const newMessage = selectChatMessage(global, chatId, id)!;\n\n if (isMessageInCurrentMessageList(global, chatId, message as ApiMessage)) {\n if (message.isOutgoing && !(message.content && message.content.action)) {\n const currentMessageList = selectCurrentMessageList(global);\n if (currentMessageList) {\n // We do not use `actions.focusLastMessage` as it may be set with a delay (see below)\n actions.focusMessage({\n chatId,\n threadId: currentMessageList.threadId,\n messageId: message.id,\n noHighlight: true,\n });\n }\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message as ApiMessage) || {};\n if (threadInfo) {\n actions.requestThreadInfoUpdate({ chatId, threadId: threadInfo.threadId });\n }\n\n // @perf Wait until scroll animation finishes or simply rely on delivery status update (which is itself delayed)\n if (!isMessageLocal(message as ApiMessage)) {\n setTimeout(() => {\n setGlobal(updateChatLastMessage(getGlobal(), chatId, newMessage));\n }, ANIMATION_DELAY);\n }\n } else {\n setGlobal(updateChatLastMessage(getGlobal(), chatId, newMessage));\n }\n\n // Edge case: New message in an old (not loaded) chat.\n if (!selectIsChatListed(global, chatId)) {\n actions.loadTopChats();\n }\n\n break;\n }\n\n case 'newScheduledMessage': {\n const { chatId, id, message } = update;\n\n global = updateWithLocalMedia(global, chatId, id, message, true);\n\n const scheduledIds = selectScheduledIds(global, chatId) || [];\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', unique([...scheduledIds, id]));\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessage': {\n const { chatId, id, message } = update;\n\n const currentMessage = selectChatMessage(global, chatId, id);\n if (!currentMessage) {\n return;\n }\n\n global = updateWithLocalMedia(global, chatId, id, message);\n\n const newMessage = selectChatMessage(global, chatId, id)!;\n if (message.threadInfo) {\n global = updateThreadInfo(\n global,\n message.threadInfo.chatId,\n message.threadInfo.threadId,\n message.threadInfo,\n );\n }\n global = updateChatLastMessage(global, chatId, newMessage);\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateScheduledMessage': {\n const { chatId, id, message } = update;\n\n const currentMessage = selectScheduledMessage(global, chatId, id);\n if (!currentMessage) {\n return;\n }\n\n global = updateWithLocalMedia(global, chatId, id, message, true);\n const ids = Object.keys(selectScheduledMessages(global, chatId) || {}).map(Number).sort((a, b) => b - a);\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', ids);\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessageSendSucceeded': {\n const { chatId, localId, message } = update;\n\n global = updateListedAndViewportIds(global, message as ApiMessage);\n\n const currentMessage = selectChatMessage(global, chatId, localId);\n\n global = deleteChatMessages(global, chatId, [localId]);\n\n // Edge case for \"Send When Online\"\n if (message.isScheduled) {\n global = deleteChatScheduledMessages(global, chatId, [localId]);\n }\n\n global = updateChatMessage(global, chatId, message.id, {\n ...currentMessage,\n ...message,\n previousLocalId: localId,\n });\n\n const newMessage = selectChatMessage(global, chatId, message.id)!;\n global = updateChatLastMessage(global, chatId, newMessage);\n\n const thread = selectThreadByMessage(global, chatId, message);\n // For some reason Telegram requires to manually mark outgoing thread messages read\n // For some reason Telegram requires to manually mark outgoing thread messages read\n if (thread && thread.threadInfo) {\n actions.markMessageListRead({ maxId: message.id });\n\n global = replaceThreadParam(global, chatId, thread.threadInfo.threadId, 'threadInfo', {\n ...thread.threadInfo,\n lastMessageId: message.id,\n lastReadInboxMessageId: message.id,\n });\n }\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateScheduledMessageSendSucceeded': {\n const { chatId, localId, message } = update;\n const scheduledIds = selectScheduledIds(global, chatId) || [];\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', [...scheduledIds, message.id]);\n\n const currentMessage = selectScheduledMessage(global, chatId, localId);\n\n global = deleteChatScheduledMessages(global, chatId, [localId]);\n global = updateScheduledMessage(global, chatId, message.id, {\n ...currentMessage,\n ...message,\n previousLocalId: localId,\n });\n\n setGlobal(global);\n break;\n }\n\n case 'updatePinnedIds': {\n const { chatId, isPinned, messageIds } = update;\n\n const currentPinnedIds = selectPinnedIds(global, chatId) || [];\n const newPinnedIds = isPinned\n ? [...currentPinnedIds, ...messageIds].sort((a, b) => b - a)\n : currentPinnedIds.filter((id) => !messageIds.includes(id));\n\n setGlobal(replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds', newPinnedIds));\n\n break;\n }\n\n case 'updateThreadInfo': {\n const {\n chatId, threadId, threadInfo, firstMessageId,\n } = update;\n\n const currentThreadInfo = selectThreadInfo(global, chatId, threadId);\n const newTheadInfo = {\n ...currentThreadInfo,\n ...threadInfo,\n };\n\n if (!newTheadInfo.threadId) {\n return;\n }\n\n global = updateThreadInfo(global, chatId, threadId, newTheadInfo as ApiThreadInfo);\n\n if (firstMessageId) {\n global = replaceThreadParam(global, chatId, threadId, 'firstMessageId', firstMessageId);\n }\n\n setGlobal(global);\n\n break;\n }\n\n case 'resetMessages': {\n const { id: chatId } = update;\n const messagesById = selectChatMessages(global, chatId);\n\n if (messagesById && !isChatPrivate(chatId)) {\n global = deleteChatMessages(global, chatId, Object.keys(messagesById).map(Number));\n setGlobal(global);\n actions.loadFullChat({ chatId, force: true });\n }\n\n break;\n }\n\n case 'deleteMessages': {\n const { ids, chatId } = update;\n\n deleteMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'deleteScheduledMessages': {\n const { ids, chatId } = update;\n\n deleteScheduledMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'deleteHistory': {\n const { chatId } = update;\n const chatMessages = global.messages.byChatId[chatId];\n if (chatMessages) {\n const ids = Object.keys(chatMessages.byId).map(Number);\n deleteMessages(chatId, ids, actions, global);\n } else {\n actions.requestChatUpdate({ chatId });\n }\n\n break;\n }\n\n case 'updateCommonBoxMessages': {\n const { ids, messageUpdate } = update;\n\n ids.forEach((id) => {\n const chatId = selectCommonBoxChatId(global, id);\n if (chatId) {\n global = updateChatMessage(global, chatId, id, messageUpdate);\n }\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChannelMessages': {\n const { channelId, ids, messageUpdate } = update;\n\n ids.forEach((id) => {\n global = updateChatMessage(global, channelId, id, messageUpdate);\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessagePoll': {\n const { pollId, pollUpdate } = update;\n\n const message = selectChatMessageByPollId(global, pollId);\n\n if (message && message.content.poll) {\n const updatedPoll = { ...message.content.poll, ...pollUpdate };\n\n // Workaround for poll update bug: `chosen` option gets reset when someone votes after current user\n const { results: updatedResults } = updatedPoll.results || {};\n if (updatedResults && !updatedResults.some(((result) => result.isChosen))) {\n const { results } = message.content.poll.results;\n const chosenAnswers = results && results.filter((result) => result.isChosen);\n if (chosenAnswers) {\n chosenAnswers.forEach((chosenAnswer) => {\n const chosenAnswerIndex = updatedResults.findIndex((result) => result.option === chosenAnswer.option);\n if (chosenAnswerIndex >= 0) {\n updatedPoll.results.results![chosenAnswerIndex].isChosen = true;\n }\n });\n }\n }\n\n setGlobal(updateChatMessage(\n global,\n message.chatId,\n message.id,\n {\n content: {\n ...message.content,\n poll: updatedPoll,\n },\n },\n ));\n }\n break;\n }\n\n case 'updateMessagePollVote': {\n const { pollId, userId, options } = update;\n const message = selectChatMessageByPollId(global, pollId);\n if (!message || !message.content.poll || !message.content.poll.results) {\n break;\n }\n\n const { poll } = message.content;\n\n const { recentVoterIds, totalVoters, results } = poll.results;\n const newRecentVoterIds = recentVoterIds ? [...recentVoterIds] : [];\n const newTotalVoters = totalVoters ? totalVoters + 1 : 1;\n const newResults = results ? [...results] : [];\n\n newRecentVoterIds.push(userId);\n\n options.forEach((option) => {\n const targetOption = newResults.find((result) => result.option === option);\n const targetOptionIndex = newResults.findIndex((result) => result.option === option);\n const updatedOption: ApiPollResult = targetOption ? { ...targetOption } : { option, votersCount: 0 };\n\n updatedOption.votersCount += 1;\n if (userId === global.currentUserId) {\n updatedOption.isChosen = true;\n }\n\n if (targetOptionIndex) {\n newResults[targetOptionIndex] = updatedOption;\n } else {\n newResults.push(updatedOption);\n }\n });\n\n setGlobal(updateChatMessage(\n global,\n message.chatId,\n message.id,\n {\n content: {\n ...message.content,\n poll: {\n ...poll,\n results: {\n ...poll.results,\n recentVoterIds: newRecentVoterIds,\n totalVoters: newTotalVoters,\n results: newResults,\n },\n },\n },\n },\n ));\n\n break;\n }\n }\n});\n\nfunction updateWithLocalMedia(\n global: GlobalState, chatId: number, id: number, message: Partial, isScheduled = false,\n) {\n // Preserve locally uploaded media.\n const currentMessage = isScheduled\n ? selectScheduledMessage(global, chatId, id)\n : selectChatMessage(global, chatId, id);\n if (currentMessage && message.content) {\n const {\n photo, video, sticker, document,\n } = getMessageContent(currentMessage);\n if (photo && message.content.photo) {\n message.content.photo.blobUrl = photo.blobUrl;\n message.content.photo.thumbnail = photo.thumbnail;\n } else if (video && message.content.video) {\n message.content.video.blobUrl = video.blobUrl;\n } else if (sticker && message.content.sticker) {\n message.content.sticker.isPreloadedGlobally = sticker.isPreloadedGlobally;\n } else if (document && message.content.document) {\n message.content.document.previewBlobUrl = document.previewBlobUrl;\n }\n }\n\n return isScheduled\n ? updateScheduledMessage(global, chatId, id, message)\n : updateChatMessage(global, chatId, id, message);\n}\n\nfunction updateListedAndViewportIds(global: GlobalState, message: ApiMessage) {\n const { id, chatId } = message;\n\n const { threadInfo, firstMessageId } = selectThreadByMessage(global, chatId, message) || {};\n\n const chat = selectChat(global, chatId);\n const isUnreadChatNotLoaded = chat && chat.unreadCount && !selectListedIds(global, chatId, MAIN_THREAD_ID);\n\n if (threadInfo) {\n if (firstMessageId || !isMessageLocal(message)) {\n global = updateListedIds(global, chatId, threadInfo.threadId, [id]);\n\n if (selectIsViewportNewest(global, chatId, threadInfo.threadId)) {\n global = addViewportId(global, chatId, threadInfo.threadId, id);\n\n if (!firstMessageId) {\n global = replaceThreadParam(global, chatId, threadInfo.threadId, 'firstMessageId', message.id);\n }\n }\n }\n\n global = replaceThreadParam(global, chatId, threadInfo.threadId, 'threadInfo', {\n ...threadInfo,\n lastMessageId: message.id,\n messagesCount: threadInfo.messagesCount + 1,\n });\n }\n\n if (isUnreadChatNotLoaded) {\n return global;\n }\n\n global = updateListedIds(global, chatId, MAIN_THREAD_ID, [id]);\n\n if (selectIsViewportNewest(global, chatId, MAIN_THREAD_ID)) {\n // Always keep the first unread message in the viewport list\n const firstUnreadId = selectFirstUnreadId(global, chatId, MAIN_THREAD_ID);\n const newGlobal = addViewportId(global, chatId, MAIN_THREAD_ID, id);\n const newViewportIds = selectViewportIds(newGlobal, chatId, MAIN_THREAD_ID);\n\n if (!firstUnreadId || newViewportIds!.includes(firstUnreadId)) {\n global = newGlobal;\n }\n }\n\n return global;\n}\n\nfunction updateChatLastMessage(\n global: GlobalState,\n chatId: number,\n message: ApiMessage,\n force = false,\n) {\n const { chats } = global;\n const currentLastMessage = chats.byId[chatId] && chats.byId[chatId].lastMessage;\n\n if (currentLastMessage && !force) {\n const isSameOrNewer = (\n currentLastMessage.id === message.id || currentLastMessage.id === message.previousLocalId\n ) || message.id > currentLastMessage.id;\n\n if (!isSameOrNewer) {\n return global;\n }\n }\n\n return updateChat(global, chatId, { lastMessage: message });\n}\n\nfunction findLastMessage(global: GlobalState, chatId: number) {\n const byId = selectChatMessages(global, chatId);\n const listedIds = selectListedIds(global, chatId, MAIN_THREAD_ID);\n\n if (!byId || !listedIds) {\n return undefined;\n }\n\n let i = listedIds.length;\n while (i--) {\n const message = byId[listedIds[i]];\n if (!message.isDeleting) {\n return message;\n }\n }\n\n return undefined;\n}\n\nfunction deleteMessages(chatId: number | undefined, ids: number[], actions: GlobalActions, global: GlobalState) {\n // Channel update\n\n if (chatId) {\n ids.forEach((id) => {\n global = updateChatMessage(global, chatId, id, {\n isDeleting: true,\n });\n\n const newLastMessage = findLastMessage(global, chatId);\n if (newLastMessage) {\n global = updateChatLastMessage(global, chatId, newLastMessage, true);\n }\n });\n\n setGlobal(global);\n\n actions.requestChatUpdate({ chatId });\n\n const threadIdsToUpdate: number[] = [];\n\n ids.forEach((id) => {\n const message = selectChatMessage(global, chatId, id);\n if (!message) {\n return;\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n if (threadInfo) {\n threadIdsToUpdate.push(threadInfo.threadId);\n }\n });\n\n setTimeout(() => {\n setGlobal(deleteChatMessages(getGlobal(), chatId, ids));\n\n unique(threadIdsToUpdate).forEach((threadId) => {\n actions.requestThreadInfoUpdate({ chatId, threadId });\n });\n }, ANIMATION_DELAY);\n\n return;\n }\n\n // Common box update\n\n const chatsIdsToUpdate: number[] = [];\n\n ids.forEach((id) => {\n const commonBoxChatId = selectCommonBoxChatId(global, id);\n if (commonBoxChatId) {\n chatsIdsToUpdate.push(commonBoxChatId);\n\n global = updateChatMessage(global, commonBoxChatId, id, {\n isDeleting: true,\n });\n\n const newLastMessage = findLastMessage(global, commonBoxChatId);\n if (newLastMessage) {\n global = updateChatLastMessage(global, commonBoxChatId, newLastMessage, true);\n }\n\n setTimeout(() => {\n setGlobal(deleteChatMessages(getGlobal(), commonBoxChatId, [id]));\n }, ANIMATION_DELAY);\n }\n });\n\n setGlobal(global);\n\n unique(chatsIdsToUpdate).forEach((id) => {\n actions.requestChatUpdate({ chatId: id });\n });\n}\n\nfunction deleteScheduledMessages(\n chatId: number | undefined, ids: number[], actions: GlobalActions, global: GlobalState,\n) {\n if (!chatId) {\n return;\n }\n\n ids.forEach((id) => {\n global = updateScheduledMessage(global, chatId, id, {\n isDeleting: true,\n });\n });\n\n setGlobal(global);\n\n setTimeout(() => {\n global = deleteChatScheduledMessages(getGlobal(), chatId, ids);\n const scheduledMessages = selectScheduledMessages(global, chatId);\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'scheduledIds', Object.keys(scheduledMessages || {}).map(Number),\n );\n setGlobal(global);\n }, ANIMATION_DELAY);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate, ApiUserStatus } from '../../../api/types';\n\nimport { deleteUser, updateUser } from '../../reducers';\nimport { throttle } from '../../../util/schedulers';\n\nconst STATUS_UPDATE_THROTTLE = 3000;\n\nconst flushStatusUpdatesThrottled = throttle(flushStatusUpdates, STATUS_UPDATE_THROTTLE, true);\n\nlet pendingStatusUpdates: [number, ApiUserStatus][] = [];\n\nfunction scheduleStatusUpdate(userId: number, statusUpdate: ApiUserStatus) {\n pendingStatusUpdates.push([userId, statusUpdate]);\n flushStatusUpdatesThrottled();\n}\n\nfunction flushStatusUpdates() {\n let global = getGlobal();\n pendingStatusUpdates.forEach(([userId, statusUpdate]) => {\n global = updateUser(global, userId, {\n status: statusUpdate,\n });\n });\n setGlobal(global);\n\n pendingStatusUpdates = [];\n}\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'deleteUser': {\n return deleteUser(global, update.id);\n }\n\n case 'updateUser': {\n return updateUser(global, update.id, update.user);\n }\n\n case 'updateUserStatus': {\n // Status updates come very often so we throttle them\n scheduleStatusUpdate(update.userId, update.status);\n return undefined;\n }\n\n case 'updateUserFullInfo': {\n const { id, fullInfo } = update;\n const targetUser = global.users.byId[id];\n if (!targetUser) {\n return undefined;\n }\n\n return updateUser(global, id, {\n fullInfo: {\n ...targetUser.fullInfo,\n ...fullInfo,\n },\n });\n }\n }\n\n return undefined;\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\n\nimport { updateStickerSet } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updateStickerSet': {\n return updateStickerSet(global, update.id, update.stickerSet);\n }\n }\n\n return undefined;\n});\n","import {\n addReducer, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { ApiPrivacyKey } from '../../../types';\n\nimport { addBlockedContact, removeBlockedContact } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updatePeerBlocked':\n if (update.isBlocked) {\n return addBlockedContact(getGlobal(), update.id);\n } else {\n return removeBlockedContact(getGlobal(), update.id);\n }\n\n case 'updateResetContactList':\n setGlobal({\n ...getGlobal(),\n contactList: {\n hash: 0,\n userIds: [],\n },\n });\n break;\n\n case 'updateFavoriteStickers':\n actions.loadFavoriteStickers();\n break;\n\n case 'updatePrivacy':\n global.settings.privacy[update.key as ApiPrivacyKey] = update.rules;\n break;\n }\n\n return undefined;\n});\n","import { addReducer, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { GlobalState } from '../../../global/types';\nimport { addNotifyException, updateChat, updateNotifySettings } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate): GlobalState | undefined => {\n switch (update['@type']) {\n case 'updateNotifySettings': {\n return updateNotifySettings(global, update.peerType, update.isSilent, update.shouldShowPreviews);\n }\n\n case 'updateNotifyExceptions': {\n const {\n chatId, isMuted, isSilent, shouldShowPreviews,\n } = update;\n const chat = global.chats.byId[chatId];\n\n if (chat) {\n global = updateChat(global, chatId, { isMuted });\n }\n\n setGlobal(addNotifyException(global, chatId, { isMuted, isSilent, shouldShowPreviews }));\n break;\n }\n }\n\n return undefined;\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { GlobalState } from '../../../global/types';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate): GlobalState | undefined => {\n switch (update['@type']) {\n case 'updateTwoFaStateWaitCode': {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n isLoading: false,\n waitingEmailCodeLength: update.length,\n },\n };\n }\n\n case 'updateTwoFaError': {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n error: update.message,\n },\n };\n }\n }\n\n return undefined;\n});\n","import { useEffect } from '../lib/teact/teact';\n\nimport { onBeforeUnload } from '../util/schedulers';\n\nexport default function useBeforeUnload(callback: AnyToVoidFunction) {\n useEffect(() => {\n return onBeforeUnload(callback);\n }, [callback]);\n}\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Switcher.scss';\n\ntype OwnProps = {\n id?: string;\n name?: string;\n value?: string;\n label: string;\n checked?: boolean;\n disabled?: boolean;\n inactive?: boolean;\n noAnimation?: boolean;\n onChange?: (e: ChangeEvent) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Switcher: FC = ({\n id,\n name,\n value,\n label,\n checked = false,\n disabled,\n inactive,\n noAnimation,\n onChange,\n onCheck,\n}) => {\n const handleChange = useCallback((e: ChangeEvent) => {\n if (onChange) {\n onChange(e);\n }\n\n if (onCheck) {\n onCheck(e.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const className = buildClassName(\n 'Switcher',\n disabled && 'disabled',\n inactive && 'inactive',\n noAnimation && 'no-animation',\n );\n\n return (\n \n );\n};\n\nexport default memo(Switcher);\n","import React, {\n FC, useCallback, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { LeftColumnContent, ISettings } from '../../../types';\nimport { ApiChat } from '../../../api/types';\n\nimport {\n ANIMATION_LEVEL_MAX, APP_NAME, APP_VERSION, FEEDBACK_URL,\n} from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport { pick } from '../../../util/iteratees';\nimport { isChatArchived } from '../../../modules/helpers';\nimport { formatDateToString } from '../../../util/dateFormat';\nimport { selectTheme } from '../../../modules/selectors';\nimport switchTheme from '../../../util/switchTheme';\nimport useLang from '../../../hooks/useLang';\nimport { disableHistoryBack } from '../../../hooks/useHistoryBack';\n\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\nimport Button from '../../ui/Button';\nimport SearchInput from '../../ui/SearchInput';\nimport PickerSelectedItem from '../../common/PickerSelectedItem';\nimport Switcher from '../../ui/Switcher';\n\nimport './LeftMainHeader.scss';\n\ntype OwnProps = {\n content: LeftColumnContent;\n contactsFilter: string;\n shouldSkipTransition?: boolean;\n onSearchQuery: (query: string) => void;\n onSelectSettings: () => void;\n onSelectContacts: () => void;\n onSelectArchived: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n searchQuery?: string;\n isLoading: boolean;\n currentUserId?: number;\n globalSearchChatId?: number;\n searchDate?: number;\n theme: ISettings['theme'];\n animationLevel: 0 | 1 | 2;\n chatsById?: Record;\n};\n\ntype DispatchProps = Pick;\n\nconst ANIMATION_LEVEL_OPTIONS = [0, 1, 2];\n\nconst PRODUCTION_HOSTNAME = 'web.telegram.org';\nconst LEGACY_VERSION_URL = 'https://web.telegram.org/?legacy=1';\nconst WEBK_VERSION_URL = 'https://web.telegram.org/k/';\nconst PERMANENT_VERSION_KEY = 'kz_version';\n\nconst LeftMainHeader: FC = ({\n content,\n contactsFilter,\n onSearchQuery,\n onSelectSettings,\n onSelectContacts,\n onSelectArchived,\n setGlobalSearchChatId,\n onReset,\n searchQuery,\n isLoading,\n shouldSkipTransition,\n currentUserId,\n globalSearchChatId,\n searchDate,\n theme,\n animationLevel,\n chatsById,\n openChat,\n openTipsChat,\n setGlobalSearchDate,\n setSettingOption,\n}) => {\n const lang = useLang();\n const hasMenu = content === LeftColumnContent.ChatList;\n const clearedDateSearchParam = { date: undefined };\n const clearedChatSearchParam = { id: undefined };\n const selectedSearchDate = useMemo(() => {\n return searchDate\n ? formatDateToString(new Date(searchDate * 1000))\n : undefined;\n }, [searchDate]);\n const archivedUnreadChatsCount = useMemo(() => {\n if (!hasMenu || !chatsById) {\n return 0;\n }\n\n return Object.values(chatsById).reduce((total, chat) => {\n if (!isChatArchived(chat)) {\n return total;\n }\n\n return chat.unreadCount ? total + 1 : total;\n }, 0);\n }, [hasMenu, chatsById]);\n\n const withOtherVersions = window.location.hostname === PRODUCTION_HOSTNAME;\n\n const MainButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n onReset()}\n ariaLabel={hasMenu ? lang('AccDescrOpenMenu2') : 'Return to chat list'}\n >\n
\n \n );\n }, [hasMenu, lang, onReset, shouldSkipTransition]);\n\n const handleSearchFocus = useCallback(() => {\n if (!searchQuery) {\n onSearchQuery('');\n }\n }, [searchQuery, onSearchQuery]);\n\n const handleSelectSaved = useCallback(() => {\n openChat({ id: currentUserId, shouldReplaceHistory: true });\n }, [currentUserId, openChat]);\n\n const handleDarkModeToggle = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n const newTheme = theme === 'light' ? 'dark' : 'light';\n\n setSettingOption({ theme: newTheme });\n setSettingOption({ shouldUseSystemTheme: false });\n switchTheme(newTheme, animationLevel === ANIMATION_LEVEL_MAX);\n }, [animationLevel, setSettingOption, theme]);\n\n const handleAnimationLevelChange = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n\n const newLevel = animationLevel === 0 ? 2 : 0;\n ANIMATION_LEVEL_OPTIONS.forEach((_, i) => {\n document.body.classList.toggle(`animation-level-${i}`, newLevel === i);\n });\n\n setSettingOption({ animationLevel: newLevel });\n }, [animationLevel, setSettingOption]);\n\n const handleSwitchToWebK = () => {\n localStorage.setItem(PERMANENT_VERSION_KEY, JSON.stringify('K'));\n disableHistoryBack();\n };\n\n const handleOpenTipsChat = () => {\n openTipsChat({ langCode: lang.code });\n };\n\n const isSearchFocused = (\n Boolean(globalSearchChatId)\n || content === LeftColumnContent.GlobalSearch\n || content === LeftColumnContent.Contacts\n );\n\n const searchInputPlaceholder = content === LeftColumnContent.Contacts\n ? lang('SearchFriends')\n : lang('Search');\n\n return (\n
\n
\n \n \n {lang('SavedMessages')}\n \n \n {lang('ArchivedChats')}\n {archivedUnreadChatsCount > 0 && (\n
{archivedUnreadChatsCount}
\n )}\n \n \n {lang('Contacts')}\n \n \n {lang('Settings')}\n \n \n {lang('lng_menu_night_mode')}\n \n \n \n {lang('Appearance.Animations').toLowerCase()}\n 0}\n />\n \n \n {lang('TelegramFeatures')}\n \n \n Report Bug\n \n {withOtherVersions && (\n <>\n \n Switch to K Version\n \n \n Switch to Old Version\n \n \n )}\n \n \n {selectedSearchDate && (\n \n )}\n {globalSearchChatId && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n query: searchQuery, fetchingStatus, chatId, date,\n } = global.globalSearch;\n const { currentUserId } = global;\n const { byId: chatsById } = global.chats;\n const { animationLevel } = global.settings.byKey;\n\n return {\n searchQuery,\n isLoading: fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false,\n currentUserId,\n chatsById,\n globalSearchChatId: chatId,\n searchDate: date,\n theme: selectTheme(global),\n animationLevel,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'openTipsChat',\n 'setGlobalSearchDate',\n 'setGlobalSearchChatId',\n 'setSettingOption',\n ]),\n)(LeftMainHeader));\n","import React, { memo, FC } from '../../lib/teact/teact';\n\nimport { GlobalState } from '../../global/types';\n\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\n\nimport './ConnectionState.scss';\n\ntype StateProps = Pick;\n\nconst ConnectionState: FC = () => {\n const lang = useLang();\n\n return (\n
\n \n
{lang('WaitingForNetwork')}
\n
\n );\n};\n\nexport default memo(ConnectionState);\n","import { useState } from '../lib/teact/teact';\n\nimport useThrottle from './useThrottle';\nimport useOnChange from './useOnChange';\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\nimport useFlag from './useFlag';\n\nexport default (resolverFn: () => R, ms: number, dependencies: D) => {\n const runThrottled = useThrottle(ms, true);\n const [value, setValue] = useState();\n const [isFrozen, freeze, unfreeze] = useFlag();\n\n useHeavyAnimationCheck(freeze, unfreeze);\n\n useOnChange(() => {\n if (isFrozen) {\n return;\n }\n\n runThrottled(() => {\n setValue(resolverFn());\n });\n }, dependencies.concat([isFrozen]));\n\n return value;\n};\n","import { useMemo } from '../lib/teact/teact';\n\nimport { throttle } from '../util/schedulers';\n\nexport default (ms: number, noFirst = false) => {\n return useMemo(() => {\n return throttle((cb) => cb(), ms, !noFirst);\n }, [ms, noFirst]);\n};\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatFolder, ApiUser } from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\nimport { NotifyException, NotifySettings } from '../../../types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { buildCollectionByKey, pick } from '../../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../../util/captureEvents';\nimport { getFolderUnreadDialogs } from '../../../modules/helpers';\nimport { selectNotifyExceptions, selectNotifySettings } from '../../../modules/selectors';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport useThrottledMemo from '../../../hooks/useThrottledMemo';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\n\nimport Transition from '../../ui/Transition';\nimport TabList from '../../ui/TabList';\nimport ChatList from './ChatList';\n\ntype StateProps = {\n chatsById: Record;\n usersById: Record;\n chatFoldersById: Record;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n orderedFolderIds?: number[];\n activeChatFolder: number;\n currentUserId?: number;\n lastSyncTime?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst INFO_THROTTLE = 3000;\nconst SAVED_MESSAGES_HOTKEY = '0';\n\nconst ChatFolders: FC = ({\n chatsById,\n usersById,\n chatFoldersById,\n notifySettings,\n notifyExceptions,\n orderedFolderIds,\n activeChatFolder,\n currentUserId,\n lastSyncTime,\n loadChatFolders,\n setActiveChatFolder,\n openChat,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const transitionRef = useRef(null);\n\n const lang = useLang();\n\n useEffect(() => {\n if (lastSyncTime) {\n loadChatFolders();\n }\n }, [lastSyncTime, loadChatFolders]);\n\n const displayedFolders = useMemo(() => {\n return orderedFolderIds\n ? orderedFolderIds.map((id) => chatFoldersById[id] || {}).filter(Boolean)\n : undefined;\n }, [chatFoldersById, orderedFolderIds]);\n\n const folderCountersById = useThrottledMemo(() => {\n if (!displayedFolders || !displayedFolders.length) {\n return undefined;\n }\n\n const chatIds = Object.keys(chatsById).map(Number);\n const counters = displayedFolders.map((folder) => {\n const {\n unreadDialogsCount, hasActiveDialogs,\n } = getFolderUnreadDialogs(chatsById, usersById, folder, chatIds, notifySettings, notifyExceptions) || {};\n\n return {\n id: folder.id,\n badgeCount: unreadDialogsCount,\n isBadgeActive: hasActiveDialogs,\n };\n });\n\n return buildCollectionByKey(counters, 'id');\n }, INFO_THROTTLE, [displayedFolders, chatsById, usersById, notifySettings, notifyExceptions]);\n\n const folderTabs = useMemo(() => {\n if (!displayedFolders || !displayedFolders.length) {\n return undefined;\n }\n\n return [\n { title: lang.code === 'en' ? 'All' : lang('FilterAllChats') },\n ...displayedFolders.map((folder) => ({\n title: folder.title,\n ...(folderCountersById && folderCountersById[folder.id]),\n })),\n ];\n }, [displayedFolders, folderCountersById, lang]);\n\n const handleSwitchTab = useCallback((index: number) => {\n setActiveChatFolder(index);\n }, [setActiveChatFolder]);\n\n // Prevent `activeTab` pointing at non-existing folder after update\n useEffect(() => {\n if (!folderTabs || !folderTabs.length) {\n return;\n }\n\n if (activeChatFolder >= folderTabs.length) {\n setActiveChatFolder(0);\n }\n }, [activeChatFolder, folderTabs, setActiveChatFolder]);\n\n useEffect(() => {\n if (!transitionRef.current || !IS_TOUCH_ENV || !folderTabs || !folderTabs.length) {\n return undefined;\n }\n\n return captureEvents(transitionRef.current, {\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n setActiveChatFolder(Math.min(activeChatFolder + 1, folderTabs.length - 1));\n } else if (direction === SwipeDirection.Right) {\n setActiveChatFolder(Math.max(0, activeChatFolder - 1));\n }\n }),\n });\n }, [activeChatFolder, folderTabs, setActiveChatFolder]);\n\n const isNotInAllTabRef = useRef();\n isNotInAllTabRef.current = activeChatFolder !== 0;\n useEffect(() => (isNotInAllTabRef.current ? captureEscKeyListener(() => {\n if (isNotInAllTabRef.current) {\n setActiveChatFolder(0);\n }\n }) : undefined), [activeChatFolder, setActiveChatFolder]);\n\n useHistoryBack(activeChatFolder !== 0, () => setActiveChatFolder(0));\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.ctrlKey && e.shiftKey && e.code.startsWith('Digit') && folderTabs) {\n const [, digit] = e.code.match(/Digit(\\d)/) || [];\n if (!digit) return;\n\n if (digit === SAVED_MESSAGES_HOTKEY) {\n openChat({ id: currentUserId, shouldReplaceHistory: true });\n return;\n }\n\n const folder = Number(digit) - 1;\n if (folder > folderTabs.length - 1) return;\n\n setActiveChatFolder(folder);\n e.preventDefault();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, true);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, true);\n };\n });\n\n const {\n shouldRender: shouldRenderPlaceholder, transitionClassNames,\n } = useShowTransition(!orderedFolderIds, undefined, true);\n\n function renderCurrentTab(isActive: boolean) {\n const activeFolder = Object.values(chatFoldersById)\n .find(({ title }) => title === folderTabs![activeChatFolder].title);\n\n if (!activeFolder || activeChatFolder === 0) {\n return ;\n }\n\n return (\n \n );\n }\n\n return (\n
\n {folderTabs && folderTabs.length ? (\n \n ) : shouldRenderPlaceholder ? (\n
\n ) : undefined}\n \n {renderCurrentTab}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: { byId: chatsById },\n users: { byId: usersById },\n chatFolders: {\n byId: chatFoldersById,\n orderedIds: orderedFolderIds,\n activeChatFolder,\n },\n currentUserId,\n lastSyncTime,\n } = global;\n\n return {\n chatsById,\n usersById,\n chatFoldersById,\n orderedFolderIds,\n lastSyncTime,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n activeChatFolder,\n currentUserId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadChatFolders',\n 'setActiveChatFolder',\n 'openChat',\n ]),\n)(ChatFolders));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\nimport { OwnProps } from './LeftSearch';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst LeftSearchAsync: FC = (props) => {\n const LeftSearch = useModuleLoader(Bundles.Extra, 'LeftSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return LeftSearch ? : ;\n};\n\nexport default memo(LeftSearchAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\nimport { OwnProps } from './ContactList';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst ContactListAsync: FC = (props) => {\n const ContactList = useModuleLoader(Bundles.Extra, 'ContactList');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ContactList ? : ;\n};\n\nexport default memo(ContactListAsync);\n","import React, {\n FC, useCallback, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport Menu from '../ui/Menu';\nimport MenuItem from '../ui/MenuItem';\n\nimport './NewChatButton.scss';\n\nconst MENU_CLOSE_DELAY_MS = 750;\nlet closeTimeout: number | undefined;\n\ntype OwnProps = {\n isShown: boolean;\n onNewPrivateChat: () => void;\n onNewChannel: () => void;\n onNewGroup: () => void;\n};\n\nconst NewChatButton: FC = ({\n isShown,\n onNewPrivateChat,\n onNewChannel,\n onNewGroup,\n}) => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n useEffect(() => {\n if (!isShown) {\n setIsMenuOpen(false);\n }\n }, [isShown]);\n\n const lang = useLang();\n\n const fabClassName = buildClassName(\n 'NewChatButton',\n isShown && 'revealed',\n isMenuOpen && 'menu-is-open',\n );\n\n const toggleIsMenuOpen = () => {\n setIsMenuOpen(!isMenuOpen);\n };\n\n const handleClose = () => {\n setIsMenuOpen(false);\n };\n\n const handleMouseEnter = useCallback(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n setIsMenuOpen(false);\n }, MENU_CLOSE_DELAY_MS);\n }, []);\n\n return (\n \n \n \n \n \n \n {lang('NewChannel')}\n {lang('NewGroup')}\n {lang('NewMessageTitle')}\n \n
\n );\n};\n\nexport default memo(NewChatButton);\n","import React, {\n FC, useState, useRef, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport { LeftColumnContent } from '../../../types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport useBrowserOnline from '../../../hooks/useBrowserOnline';\nimport useFlag from '../../../hooks/useFlag';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useLang from '../../../hooks/useLang';\n\nimport Transition from '../../ui/Transition';\nimport LeftMainHeader from './LeftMainHeader';\nimport ConnectionState from '../ConnectionState';\nimport ChatFolders from './ChatFolders';\nimport LeftSearch from '../search/LeftSearch.async';\nimport ContactList from './ContactList.async';\nimport NewChatButton from '../NewChatButton';\nimport ShowTransition from '../../ui/ShowTransition';\nimport Button from '../../ui/Button';\n\nimport './LeftMain.scss';\n\ntype OwnProps = {\n content: LeftColumnContent;\n searchQuery?: string;\n searchDate?: number;\n contactsFilter: string;\n shouldSkipTransition?: boolean;\n onSearchQuery: (query: string) => void;\n onContentChange: (content: LeftColumnContent) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick;\n\nconst TRANSITION_RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\nconst BUTTON_CLOSE_DELAY_MS = 250;\nconst APP_OUTDATED_TIMEOUT = 3 * 24 * 60 * 60 * 1000; // 3 days\n\nlet closeTimeout: number | undefined;\n\nconst LeftMain: FC = ({\n content,\n searchQuery,\n searchDate,\n contactsFilter,\n shouldSkipTransition,\n onSearchQuery,\n onContentChange,\n onReset,\n connectionState,\n}) => {\n const [isNewChatButtonShown, setIsNewChatButtonShown] = useState(IS_TOUCH_ENV);\n\n const isBrowserOnline = useBrowserOnline();\n const isConnecting = !isBrowserOnline || connectionState === 'connectionStateConnecting';\n\n const isMouseInside = useRef(false);\n\n const handleSelectSettings = useCallback(() => {\n onContentChange(LeftColumnContent.Settings);\n }, [onContentChange]);\n\n const handleSelectContacts = useCallback(() => {\n onContentChange(LeftColumnContent.Contacts);\n }, [onContentChange]);\n\n const handleSelectNewChannel = useCallback(() => {\n onContentChange(LeftColumnContent.NewChannelStep1);\n }, [onContentChange]);\n\n const handleSelectNewGroup = useCallback(() => {\n onContentChange(LeftColumnContent.NewGroupStep1);\n }, [onContentChange]);\n\n const handleSelectArchived = useCallback(() => {\n onContentChange(LeftColumnContent.Archived);\n }, [onContentChange]);\n\n const handleMouseEnter = useCallback(() => {\n if (content !== LeftColumnContent.ChatList) {\n return;\n }\n isMouseInside.current = true;\n setIsNewChatButtonShown(true);\n }, [content]);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n setIsNewChatButtonShown(false);\n }\n }, BUTTON_CLOSE_DELAY_MS);\n }, []);\n\n useEffect(() => {\n let autoCloseTimeout: number | undefined;\n if (content !== LeftColumnContent.ChatList) {\n autoCloseTimeout = window.setTimeout(() => {\n setIsNewChatButtonShown(false);\n }, BUTTON_CLOSE_DELAY_MS);\n } else if (isMouseInside.current || IS_TOUCH_ENV) {\n setIsNewChatButtonShown(true);\n }\n\n return () => {\n if (autoCloseTimeout) {\n clearTimeout(autoCloseTimeout);\n autoCloseTimeout = undefined;\n }\n };\n }, [content]);\n\n const [shouldRenderUpdateButton, updateButtonClassNames, handleUpdateClick] = useAppOutdatedCheck();\n\n const lang = useLang();\n\n return (\n \n \n \n {() => }\n \n \n {(isActive) => {\n switch (content) {\n case LeftColumnContent.ChatList:\n return ;\n case LeftColumnContent.GlobalSearch:\n return (\n \n );\n case LeftColumnContent.Contacts:\n return ;\n default:\n return undefined;\n }\n }}\n \n {shouldRenderUpdateButton && (\n \n {lang('lng_update_telegram')}\n \n )}\n \n
\n );\n};\n\nfunction useAppOutdatedCheck() {\n const [isAppOutdated, markIsAppOutdated] = useFlag(false);\n\n useEffect(() => {\n const timeout = window.setTimeout(markIsAppOutdated, APP_OUTDATED_TIMEOUT);\n\n return () => {\n clearTimeout(timeout);\n };\n }, [markIsAppOutdated]);\n\n const { shouldRender, transitionClassNames } = useShowTransition(isAppOutdated);\n\n const handleUpdateClick = () => {\n window.location.reload();\n };\n\n return [shouldRender, transitionClassNames, handleUpdateClick] as const;\n}\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['connectionState']),\n)(LeftMain);\n","import { useEffect, useState } from '../lib/teact/teact';\n\nexport default function useBrowserOnline() {\n const [isOnline, setIsOnline] = useState(window.navigator.onLine);\n\n useEffect(() => {\n function handleChange() {\n setIsOnline(window.navigator.onLine);\n }\n\n window.addEventListener('online', handleChange);\n window.addEventListener('offline', handleChange);\n\n return () => {\n window.removeEventListener('offline', handleChange);\n window.removeEventListener('online', handleChange);\n };\n }, []);\n\n return isOnline;\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './Settings';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst SettingsAsync: FC = (props) => {\n const Settings = useModuleLoader(Bundles.Extra, 'Settings');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Settings ? : ;\n};\n\nexport default memo(SettingsAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './NewChat';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst NewChatAsync: FC = (props) => {\n const NewChat = useModuleLoader(Bundles.Extra, 'NewChat');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return NewChat ? : ;\n};\n\nexport default memo(NewChatAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './ArchivedChats';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst ArchivedChatsAsync: FC = (props) => {\n const ArchivedChats = useModuleLoader(Bundles.Extra, 'ArchivedChats');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ArchivedChats ? : ;\n};\n\nexport default memo(ArchivedChatsAsync);\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { LeftColumnContent, SettingsScreens } from '../../types';\n\nimport { LAYERS_ANIMATION_NAME } from '../../util/environment';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\n\nimport Transition from '../ui/Transition';\nimport LeftMain from './main/LeftMain';\nimport Settings from './settings/Settings.async';\nimport NewChat from './newChat/NewChat.async';\nimport ArchivedChats from './ArchivedChats.async';\n\nimport './LeftColumn.scss';\n\ntype StateProps = {\n searchQuery?: string;\n searchDate?: number;\n activeChatFolder: number;\n shouldSkipHistoryAnimations?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nenum ContentType {\n Main,\n // eslint-disable-next-line no-shadow\n Settings,\n Archived,\n // eslint-disable-next-line no-shadow\n NewGroup,\n // eslint-disable-next-line no-shadow\n NewChannel\n}\n\nconst RENDER_COUNT = Object.keys(ContentType).length / 2;\nconst RESET_TRANSITION_DELAY_MS = 250;\n\nconst LeftColumn: FC = ({\n searchQuery,\n searchDate,\n activeChatFolder,\n shouldSkipHistoryAnimations,\n setGlobalSearchQuery,\n setGlobalSearchChatId,\n resetChatCreation,\n setGlobalSearchDate,\n loadPasswordInfo,\n clearTwoFaError,\n}) => {\n const [content, setContent] = useState(LeftColumnContent.ChatList);\n const [settingsScreen, setSettingsScreen] = useState(SettingsScreens.Main);\n const [contactsFilter, setContactsFilter] = useState('');\n\n // Used to reset child components in background.\n const [lastResetTime, setLastResetTime] = useState(0);\n\n let contentType: ContentType = ContentType.Main;\n switch (content) {\n case LeftColumnContent.Archived:\n contentType = ContentType.Archived;\n break;\n case LeftColumnContent.Settings:\n contentType = ContentType.Settings;\n break;\n case LeftColumnContent.NewChannelStep1:\n case LeftColumnContent.NewChannelStep2:\n contentType = ContentType.NewChannel;\n break;\n case LeftColumnContent.NewGroupStep1:\n case LeftColumnContent.NewGroupStep2:\n contentType = ContentType.NewGroup;\n break;\n }\n\n const handleReset = useCallback((forceReturnToChatList?: boolean) => {\n if (content === LeftColumnContent.NewGroupStep2\n && !forceReturnToChatList\n ) {\n setContent(LeftColumnContent.NewGroupStep1);\n return;\n }\n\n if (content === LeftColumnContent.NewChannelStep2\n && !forceReturnToChatList\n ) {\n setContent(LeftColumnContent.NewChannelStep1);\n return;\n }\n\n if (content === LeftColumnContent.NewGroupStep1) {\n const pickerSearchInput = document.getElementById('new-group-picker-search');\n if (pickerSearchInput) {\n pickerSearchInput.blur();\n }\n }\n\n if (content === LeftColumnContent.Settings) {\n switch (settingsScreen) {\n case SettingsScreens.EditProfile:\n case SettingsScreens.Folders:\n case SettingsScreens.General:\n case SettingsScreens.Notifications:\n case SettingsScreens.Privacy:\n case SettingsScreens.Language:\n setSettingsScreen(SettingsScreens.Main);\n return;\n\n case SettingsScreens.GeneralChatBackground:\n setSettingsScreen(SettingsScreens.General);\n return;\n case SettingsScreens.GeneralChatBackgroundColor:\n setSettingsScreen(SettingsScreens.GeneralChatBackground);\n return;\n\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyGroupChats:\n case SettingsScreens.PrivacyActiveSessions:\n case SettingsScreens.PrivacyBlockedUsers:\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaEnabled:\n case SettingsScreens.TwoFaCongratulations:\n setSettingsScreen(SettingsScreens.Privacy);\n return;\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyPhoneNumber);\n return;\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyLastSeen);\n return;\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyProfilePhoto);\n return;\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyForwarding);\n return;\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyGroupChats);\n return;\n case SettingsScreens.TwoFaNewPassword:\n setSettingsScreen(SettingsScreens.TwoFaDisabled);\n return;\n case SettingsScreens.TwoFaNewPasswordConfirm:\n setSettingsScreen(SettingsScreens.TwoFaNewPassword);\n return;\n case SettingsScreens.TwoFaNewPasswordHint:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordConfirm);\n return;\n case SettingsScreens.TwoFaNewPasswordEmail:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordHint);\n return;\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordEmail);\n return;\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n setSettingsScreen(SettingsScreens.TwoFaEnabled);\n return;\n case SettingsScreens.TwoFaChangePasswordNew:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordCurrent);\n return;\n case SettingsScreens.TwoFaChangePasswordConfirm:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordNew);\n return;\n case SettingsScreens.TwoFaChangePasswordHint:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordConfirm);\n return;\n case SettingsScreens.TwoFaRecoveryEmail:\n setSettingsScreen(SettingsScreens.TwoFaRecoveryEmailCurrentPassword);\n return;\n case SettingsScreens.TwoFaRecoveryEmailCode:\n setSettingsScreen(SettingsScreens.TwoFaRecoveryEmail);\n return;\n\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n setSettingsScreen(SettingsScreens.Folders);\n return;\n default:\n break;\n }\n }\n\n if (content === LeftColumnContent.ChatList && activeChatFolder === 0) {\n setContent(LeftColumnContent.GlobalSearch);\n return;\n }\n\n setContent(LeftColumnContent.ChatList);\n setContactsFilter('');\n setGlobalSearchQuery({ query: '' });\n setGlobalSearchDate({ date: undefined });\n setGlobalSearchChatId({ id: undefined });\n resetChatCreation();\n setTimeout(() => {\n setLastResetTime(Date.now());\n }, RESET_TRANSITION_DELAY_MS);\n }, [\n content, activeChatFolder, settingsScreen, setGlobalSearchQuery, setGlobalSearchDate, setGlobalSearchChatId,\n resetChatCreation,\n ]);\n\n const handleSearchQuery = useCallback((query: string) => {\n if (content === LeftColumnContent.Contacts) {\n setContactsFilter(query);\n return;\n }\n\n setContent(LeftColumnContent.GlobalSearch);\n\n if (query !== searchQuery) {\n setGlobalSearchQuery({ query });\n }\n }, [content, searchQuery, setGlobalSearchQuery]);\n\n useEffect(\n () => (content !== LeftColumnContent.ChatList || activeChatFolder === 0\n ? captureEscKeyListener(() => handleReset())\n : undefined),\n [activeChatFolder, content, handleReset],\n );\n\n useEffect(() => {\n clearTwoFaError();\n\n if (settingsScreen === SettingsScreens.Privacy) {\n loadPasswordInfo();\n }\n }, [clearTwoFaError, loadPasswordInfo, settingsScreen]);\n\n const handleSettingsScreenSelect = (screen: SettingsScreens) => {\n setContent(LeftColumnContent.Settings);\n setSettingsScreen(screen);\n };\n\n return (\n \n {(isActive) => {\n switch (contentType) {\n case ContentType.Archived:\n return (\n \n );\n case ContentType.Settings:\n return (\n \n );\n case ContentType.NewChannel:\n return (\n \n );\n case ContentType.NewGroup:\n return (\n \n );\n default:\n return (\n \n );\n }\n }}\n \n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n globalSearch: {\n query,\n date,\n },\n chatFolders: {\n activeChatFolder,\n },\n shouldSkipHistoryAnimations,\n } = global;\n return {\n searchQuery: query, searchDate: date, activeChatFolder, shouldSkipHistoryAnimations,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setGlobalSearchQuery', 'setGlobalSearchChatId', 'resetChatCreation', 'setGlobalSearchDate',\n 'loadPasswordInfo', 'clearTwoFaError',\n ]),\n)(LeftColumn));\n","import { useEffect, useState } from '../lib/teact/teact';\n\nimport { throttle } from '../util/schedulers';\nimport windowSize from '../util/windowSize';\nimport { ApiDimensions } from '../api/types';\n\nconst THROTTLE = 250;\n\nexport default () => {\n const [size, setSize] = useState(windowSize.get());\n\n useEffect(() => {\n const handleResize = throttle(() => {\n setSize(windowSize.get());\n }, THROTTLE, false);\n\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, []);\n\n return size;\n};\n","import {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n} from '../../../config';\n\nconst REM = 16; // px\nconst MAX_TOOLBAR_WIDTH = 32 * REM;\nconst MAX_MESSAGES_LIST_WIDTH = 45.5 * REM;\nconst SIDE_COLUMN_MAX_WIDTH = 26.5 * REM;\nconst MIN_LEFT_COLUMN_WIDTH = 18 * REM;\nconst UNPIN_BUTTON_WIDTH = 16.125 * REM;\n\nexport default function calculateMiddleFooterTransforms(windowWidth: number, canPost?: boolean) {\n const sidePadding = windowWidth <= MOBILE_SCREEN_MAX_WIDTH\n ? REM\n : 2 * REM;\n const messageListWidth = getMessageListWidth(windowWidth);\n const sendButtonWidth = windowWidth <= MOBILE_SCREEN_MAX_WIDTH\n ? 3.375 * REM\n : 4 * REM;\n\n const composerWidth = canPost\n ? messageListWidth - sidePadding - sendButtonWidth\n : messageListWidth - sidePadding;\n const toolbarWidth = windowWidth > MOBILE_SCREEN_MAX_WIDTH\n ? Math.min(messageListWidth - sidePadding, MAX_TOOLBAR_WIDTH)\n : messageListWidth - sidePadding;\n\n const composerHiddenScale = toolbarWidth / composerWidth;\n const toolbarHiddenScale = composerWidth / toolbarWidth;\n const unpinHiddenScale = toolbarWidth / UNPIN_BUTTON_WIDTH;\n const toolbarForUnpinHiddenScale = UNPIN_BUTTON_WIDTH / toolbarWidth;\n\n const composerTranslateX = canPost\n ? (sendButtonWidth / 2) * toolbarHiddenScale\n : 0;\n\n const toolbarTranslateX = canPost\n ? (sendButtonWidth / 2) * -1 * composerHiddenScale\n : 0;\n\n return {\n composerHiddenScale,\n toolbarHiddenScale,\n composerTranslateX,\n toolbarTranslateX,\n unpinHiddenScale,\n toolbarForUnpinHiddenScale,\n };\n}\n\nfunction getMessageListWidth(windowWidth: number) {\n if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN) {\n const leftColumnWidth = Math.min(\n Math.max(windowWidth * 0.25, MIN_LEFT_COLUMN_WIDTH),\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n const rightColumnWidth = Math.min(\n windowWidth * 0.25,\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n return Math.min(\n windowWidth - leftColumnWidth - rightColumnWidth,\n MAX_MESSAGES_LIST_WIDTH,\n );\n }\n\n if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN) {\n const leftColumnWidth = Math.min(\n Math.max(windowWidth * 0.4, MIN_LEFT_COLUMN_WIDTH),\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n return Math.min(\n windowWidth - leftColumnWidth,\n MAX_MESSAGES_LIST_WIDTH,\n );\n }\n\n if (windowWidth > MAX_MESSAGES_LIST_WIDTH) {\n return MAX_MESSAGES_LIST_WIDTH;\n }\n\n return windowWidth;\n}\n","import { MessageList, MessageListType } from '../global/types';\nimport { MAIN_THREAD_ID } from '../api/types';\n\nexport const createMessageHash = (messageList: MessageList): string => (\n messageList.chatId.toString()\n + (messageList.type !== 'thread' ? `_${messageList.type}`\n : (messageList.threadId !== -1 ? `_${messageList.threadId}` : ''))\n);\n\nexport const parseMessageHash = (value: string): MessageList => {\n const [chatId, typeOrThreadId] = value.split('_');\n const isType = ['thread', 'pinned', 'scheduled'].includes(typeOrThreadId);\n\n return {\n chatId: Number(chatId),\n type: !!typeOrThreadId && isType ? (typeOrThreadId as MessageListType) : 'thread',\n threadId: !!typeOrThreadId && !isType ? Number(typeOrThreadId) : MAIN_THREAD_ID,\n };\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './HeaderMenuContainer';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst HeaderMenuContainerAsync: FC = (props) => {\n const { isOpen } = props;\n const HeaderMenuContainer = useModuleLoader(Bundles.Extra, 'HeaderMenuContainer', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return HeaderMenuContainer ? : undefined;\n};\n\nexport default memo(HeaderMenuContainerAsync);\n","import React, {\n FC,\n memo,\n useRef,\n useCallback,\n useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { MAIN_THREAD_ID } from '../../api/types';\nimport { IAnchorPosition } from '../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { pick } from '../../util/iteratees';\nimport { isChatChannel, isChatSuperGroup } from '../../modules/helpers';\nimport {\n selectChat,\n selectChatBot,\n selectIsUserBlocked,\n selectIsChatBotNotStarted,\n selectIsChatWithSelf,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n} from '../../modules/selectors';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport HeaderMenuContainer from './HeaderMenuContainer.async';\n\ninterface OwnProps {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n}\n\ninterface StateProps {\n noMenu?: boolean;\n isChannel?: boolean;\n isRightColumnShown?: boolean;\n canStartBot?: boolean;\n canRestartBot?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canMute?: boolean;\n canSelect?: boolean;\n canLeave?: boolean;\n}\n\ntype DispatchProps = Pick;\n\n// Chrome breaks layout when focusing input during transition\nconst SEARCH_FOCUS_DELAY_MS = 400;\n\nconst HeaderActions: FC = ({\n chatId,\n threadId,\n noMenu,\n isChannel,\n canStartBot,\n canRestartBot,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n isRightColumnShown,\n joinChannel,\n sendBotCommand,\n openLocalTextSearch,\n restartBot,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuButtonRef = useRef(null);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [menuPosition, setMenuPosition] = useState(undefined);\n\n const handleHeaderMenuOpen = useCallback(() => {\n setIsMenuOpen(true);\n const rect = menuButtonRef.current!.getBoundingClientRect();\n setMenuPosition({ x: rect.right, y: rect.bottom });\n }, []);\n\n const handleHeaderMenuClose = useCallback(() => {\n setIsMenuOpen(false);\n }, []);\n\n const handleHeaderMenuHide = useCallback(() => {\n setMenuPosition(undefined);\n }, []);\n\n const handleSubscribeClick = useCallback(() => {\n joinChannel({ chatId });\n }, [joinChannel, chatId]);\n\n const handleStartBot = useCallback(() => {\n sendBotCommand({ command: '/start' });\n }, [sendBotCommand]);\n\n const handleRestartBot = useCallback(() => {\n restartBot({ chatId });\n }, [chatId, restartBot]);\n\n const handleSearchClick = useCallback(() => {\n openLocalTextSearch();\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n // iOS requires synchronous focus on user event.\n const searchInput = document.querySelector('#MobileSearch input')!;\n searchInput.focus();\n } else {\n setTimeout(() => {\n const searchInput = document.querySelector('.RightHeader .SearchInput input');\n if (searchInput) {\n searchInput.focus();\n }\n }, SEARCH_FOCUS_DELAY_MS);\n }\n }, [openLocalTextSearch]);\n\n const lang = useLang();\n\n return (\n
\n {!IS_SINGLE_COLUMN_LAYOUT && canSubscribe && (\n \n {lang(isChannel ? 'Subscribe' : 'Join Group')}\n \n )}\n {!IS_SINGLE_COLUMN_LAYOUT && canStartBot && (\n \n {lang('BotStart')}\n \n )}\n {!IS_SINGLE_COLUMN_LAYOUT && canRestartBot && (\n \n {lang('BotRestart')}\n \n )}\n {!IS_SINGLE_COLUMN_LAYOUT && canSearch && (\n \n \n \n )}\n {(IS_SINGLE_COLUMN_LAYOUT || !canSubscribe) && (\n \n \n \n )}\n {menuPosition && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const chat = selectChat(global, chatId);\n const isChannel = Boolean(chat && isChatChannel(chat));\n\n if (chat && chat.isRestricted) {\n return {\n noMenu: true,\n };\n }\n\n const bot = selectChatBot(global, chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const isMainThread = messageListType === 'thread' && threadId === MAIN_THREAD_ID;\n const isDiscussionThread = messageListType === 'thread' && threadId !== MAIN_THREAD_ID;\n const isRightColumnShown = selectIsRightColumnShown(global);\n\n const canRestartBot = Boolean(bot && selectIsUserBlocked(global, bot.id));\n const canStartBot = !canRestartBot && Boolean(selectIsChatBotNotStarted(global, chatId));\n const canSubscribe = Boolean(\n isMainThread && chat && (isChannel || isChatSuperGroup(chat)) && chat.isNotJoined,\n );\n const canSearch = isMainThread || isDiscussionThread;\n const canMute = isMainThread && !isChatWithSelf && !canSubscribe;\n const canSelect = !selectIsInSelectMode(global);\n const canLeave = isMainThread && !canSubscribe;\n\n const noMenu = !(\n (IS_SINGLE_COLUMN_LAYOUT && canSubscribe)\n || (IS_SINGLE_COLUMN_LAYOUT && canSearch)\n || canMute\n || canSelect\n || canLeave\n );\n\n return {\n noMenu,\n isChannel,\n isRightColumnShown,\n canStartBot,\n canRestartBot,\n canSubscribe,\n canSearch,\n canMute,\n canSelect,\n canLeave,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'joinChannel', 'sendBotCommand', 'openLocalTextSearch', 'restartBot',\n ]),\n)(HeaderActions));\n","import { useLayoutEffect, useState } from '../lib/teact/teact';\n\nimport { ApiMessage } from '../api/types';\n\nimport { DEBUG } from '../config';\nimport { isWebpSupported } from '../util/environment';\nimport { EMPTY_IMAGE_DATA_URI, webpToPngBase64 } from '../util/webpToPng';\nimport { getMessageMediaThumbDataUri } from '../modules/helpers';\n\nexport default function useWebpThumbnail(message?: ApiMessage) {\n const thumbnail = message && getMessageMediaThumbDataUri(message);\n const { sticker } = (message && message.content) || {};\n const shouldDecodeThumbnail = thumbnail && sticker && !isWebpSupported() && thumbnail.includes('image/webp');\n const [thumbnailDecoded, setThumbnailDecoded] = useState(EMPTY_IMAGE_DATA_URI);\n const messageId = message && message.id;\n\n useLayoutEffect(() => {\n if (!shouldDecodeThumbnail) {\n return;\n }\n\n webpToPngBase64(`b64-${messageId}`, thumbnail!)\n .then(setThumbnailDecoded)\n .catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n });\n }, [messageId, shouldDecodeThumbnail, thumbnail]);\n\n return shouldDecodeThumbnail ? thumbnailDecoded : thumbnail;\n}\n","import React, {\n FC,\n useRef,\n useEffect,\n useMemo,\n memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n count: number;\n index: number;\n};\n\nconst BORDER_MASK_LEVEL = 4;\n\nconst PinnedMessageNavigation: FC = ({\n count, index,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const markupParams = useMemo(() => {\n return calculateMarkup(count, index);\n }, [count, index]);\n\n useEffect(() => {\n if (!containerRef.current) {\n return;\n }\n\n const {\n trackHeight,\n trackTranslateY,\n markHeight,\n markTranslateY,\n clipPathId,\n clipPath,\n } = markupParams;\n\n const firstChild = containerRef.current.firstElementChild;\n if (containerRef && containerRef.current) {\n const currentElement = containerRef.current;\n const { style } = currentElement;\n style.height = `${trackHeight}px`;\n style.transform = `translateY(-${trackTranslateY}px)`;\n style.clipPath = `url(\"#${clipPathId}\")`;\n const svg = currentElement.querySelector('svg');\n const div = currentElement.querySelector('div');\n const defs = currentElement.querySelector('defs');\n if (!svg) {\n if (firstChild) {\n firstChild.innerHTML = ` ${clipPath} `;\n }\n }\n if (defs) {\n defs.innerHTML = clipPath;\n }\n if (div) {\n div.style.height = `${markHeight}px`;\n div.style.transform = `translateY(${markTranslateY}px)`;\n }\n }\n }, [markupParams]);\n\n if (count === 1) {\n return (\n
\n \n
\n );\n }\n\n const {\n trackHeight, trackTranslateY, markHeight, markTranslateY, clipPathId,\n } = markupParams;\n\n return (\n
BORDER_MASK_LEVEL && 'pinned-message-border-mask')}>\n \n \n \n
\n \n );\n};\n\nfunction calculateMarkup(count: number, index: number) {\n const reverseIndex = count - index - 1;\n const barHeight = getBarHeight(count);\n const markHeight = getMarkHeight(count, reverseIndex);\n const trackHeight = getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath${count}`;\n const clipPath = getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = getMarkTranslateY(reverseIndex, barHeight, count);\n const trackTranslateY = getTrackTranslateY(reverseIndex, count, barHeight, trackHeight);\n return {\n markHeight,\n clipPath,\n markTranslateY,\n trackTranslateY,\n trackHeight,\n clipPathId,\n };\n}\n\nfunction getBarHeight(count: number): number {\n let barHeight = 8;\n if (count === 1) {\n barHeight = 36;\n } else if (count === 2) {\n barHeight = 17;\n } else if (count === 3) {\n barHeight = 11;\n } else if (count === 4) {\n barHeight = 7.5;\n } else if (count > 3) {\n barHeight = 7.5;\n }\n\n return barHeight;\n}\n\nfunction getMarkHeight(count: number, index: number) {\n let barHeight = 36;\n if (count === 1) {\n barHeight = 36;\n } else if (count === 2) {\n barHeight = 17;\n } else if (count === 3) {\n barHeight = index === 1 ? 12 : 11;\n } else if (count === 4) {\n barHeight = 7.5;\n } else if (count > 3) {\n barHeight = 7.5;\n }\n\n return barHeight;\n}\n\nfunction getTrackHeight(count: number, barHeight: number) {\n return count <= 3 ? 36 : barHeight * count + 2 * (count - 1);\n}\n\nfunction getClipPath(id: string, barHeight: number, count: number) {\n const radius = 1;\n\n let d = '';\n if (count === 3) {\n d = drawRect(0, 0, 2, barHeight, radius)\n + drawRect(0, 12, 2, barHeight + 1, radius)\n + drawRect(0, 25, 2, barHeight, radius);\n } else {\n for (let i = 0; i < count; i++) {\n d += drawRect(0, (barHeight + 2) * i, 2, barHeight, radius);\n }\n }\n\n return (\n `\n \n `\n );\n}\n\nfunction drawRect(x: number, y: number, width: number, height: number, radius: number) {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,\n ${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n}\n\nfunction getMarkTranslateY(index: number, barHeight: number, count: number) {\n if (count === 1) {\n return 0;\n } else if (count === 2) {\n return index === 0 ? 0 : barHeight + 2;\n }\n\n if (count === 3) {\n if (index === 0) {\n return 0;\n } else if (index === 1) {\n return 12;\n }\n\n return 25;\n } else {\n return (barHeight + 2) * index;\n }\n}\n\nfunction getTrackTranslateY(index: number, count: number, barHeight: number, trackHeight: number) {\n if (count <= 4) {\n return 0;\n }\n\n if (index <= 1) {\n return 0;\n } else if (index >= count - 2) {\n return trackHeight - 36;\n }\n\n return (barHeight + 4) / 2 + (index - 2) * (barHeight + 2);\n}\n\nexport default memo(PinnedMessageNavigation);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { getPictogramDimensions } from '../common/helpers/mediaDimensions';\nimport { getMessageMediaHash, getMessageSummaryText } from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useMedia from '../../hooks/useMedia';\nimport useWebpThumbnail from '../../hooks/useWebpThumbnail';\n\nimport ConfirmDialog from '../ui/ConfirmDialog';\nimport Button from '../ui/Button';\nimport RippleEffect from '../ui/RippleEffect';\nimport buildClassName from '../../util/buildClassName';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport PinnedMessageNavigation from './PinnedMessageNavigation';\n\ntype OwnProps = {\n message: ApiMessage;\n index: number;\n count: number;\n customTitle?: string;\n className?: string;\n onUnpinMessage?: (id: number) => void;\n onClick?: () => void;\n onAllPinnedClick?: () => void;\n};\n\nconst HeaderPinnedMessage: FC = ({\n message, count, index, customTitle, className, onUnpinMessage, onClick, onAllPinnedClick,\n}) => {\n const lang = useLang();\n const mediaThumbnail = useWebpThumbnail(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram'));\n\n const text = getMessageSummaryText(lang, message, Boolean(mediaThumbnail));\n const [isUnpinDialogOpen, openUnpinDialog, closeUnpinDialog] = useFlag();\n\n const handleUnpinMessage = useCallback(() => {\n closeUnpinDialog();\n\n if (onUnpinMessage) {\n onUnpinMessage(message.id);\n }\n }, [closeUnpinDialog, onUnpinMessage, message.id]);\n\n return (\n
\n {count > 1 && (\n \n \n \n )}\n {onUnpinMessage && (\n \n \n \n )}\n \n
\n \n {mediaThumbnail && renderPictogram(mediaThumbnail, mediaBlobUrl)}\n
\n
\n {customTitle || `${lang('PinnedMessage')} ${index > 0 ? `#${count - index}` : ''}`}\n
\n

{renderText(text)}

\n
\n\n \n
\n
\n );\n};\n\nfunction renderPictogram(thumbDataUri: string, blobUrl?: string) {\n const { width, height } = getPictogramDimensions();\n\n return (\n \"\"\n );\n}\n\nexport default memo(HeaderPinnedMessage);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiAudio, ApiChat, ApiMessage, ApiUser,\n} from '../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport * as mediaLoader from '../../util/mediaLoader';\nimport {\n getMediaDuration, getMessageAudio, getMessageKey, getMessageMediaHash, getSenderTitle,\n} from '../../modules/helpers';\nimport { selectSender } from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport renderText from '../common/helpers/renderText';\nimport useAudioPlayer from '../../hooks/useAudioPlayer';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport RippleEffect from '../ui/RippleEffect';\nimport Button from '../ui/Button';\n\nimport './AudioPlayer.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n className?: string;\n noUi?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiChat | ApiUser;\n};\n\ntype DispatchProps = Pick;\n\nconst AudioPlayer: FC = ({\n message, className, noUi, sender, focusMessage, closeAudioPlayer,\n}) => {\n const lang = useLang();\n\n const senderName = sender ? getSenderTitle(lang, sender) : undefined;\n const mediaData = mediaLoader.getFromMemory(getMessageMediaHash(message, 'inline')!) as (string | undefined);\n const { playPause, isPlaying } = useAudioPlayer(\n getMessageKey(message), getMediaDuration(message)!, mediaData, undefined, undefined, true,\n );\n\n const handleClick = useCallback(() => {\n focusMessage({ chatId: message.chatId, messageId: message.id });\n }, [focusMessage, message.chatId, message.id]);\n\n const handleClose = useCallback(() => {\n if (isPlaying) {\n playPause();\n }\n closeAudioPlayer();\n }, [closeAudioPlayer, isPlaying, playPause]);\n\n if (noUi) {\n return undefined;\n }\n\n const audio = getMessageAudio(message);\n\n return (\n
\n \n \n \n \n\n
\n {audio ? renderAudio(audio) : renderVoice(lang('AttachAudio'), senderName)}\n \n
\n\n \n \n \n
\n );\n};\n\nfunction renderAudio(audio: ApiAudio) {\n const { title, performer, fileName } = audio;\n\n return (\n <>\n
{renderText(title || fileName)}
\n {performer && (\n
{renderText(performer)}
\n )}\n \n );\n}\n\nfunction renderVoice(subtitle: string, senderName?: string) {\n return (\n <>\n
{senderName && renderText(senderName)}
\n
{subtitle}
\n \n );\n}\n\nexport default withGlobal(\n (global, { message }): StateProps => {\n const sender = selectSender(global, message);\n\n return { sender };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['focusMessage', 'closeAudioPlayer']),\n)(AudioPlayer);\n","import React, {\n FC, useCallback, useMemo, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport cycleRestrict from '../../util/cycleRestrict';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport {\n ApiMessage,\n ApiChat,\n ApiTypingStatus,\n MAIN_THREAD_ID, ApiUser,\n} from '../../api/types';\nimport { NotifyException, NotifySettings } from '../../types';\n\nimport {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n EDITABLE_INPUT_ID,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_CHAT_INFO,\n} from '../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TABLET_COLUMN_LAYOUT } from '../../util/environment';\nimport {\n isChatPrivate,\n isChatArchived,\n getMessageKey,\n getChatTitle,\n getSenderTitle,\n selectIsChatMuted,\n} from '../../modules/helpers';\nimport {\n selectChat,\n selectChatMessage,\n selectAllowedMessageActions,\n selectIsRightColumnShown,\n selectThreadTopMessageId,\n selectThreadInfo,\n selectChatMessages,\n selectPinnedIds,\n selectIsChatWithSelf,\n selectForwardedSender,\n selectScheduledIds,\n selectIsInSelectMode,\n selectIsChatWithBot,\n selectNotifySettings,\n selectNotifyExceptions,\n} from '../../modules/selectors';\nimport useEnsureMessage from '../../hooks/useEnsureMessage';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\nimport { pick } from '../../util/iteratees';\nimport { formatIntegerCompact } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport GroupChatInfo from '../common/GroupChatInfo';\nimport Transition from '../ui/Transition';\nimport Button from '../ui/Button';\nimport HeaderActions from './HeaderActions';\nimport HeaderPinnedMessage from './HeaderPinnedMessage';\nimport AudioPlayer from './AudioPlayer';\n\nimport './MiddleHeader.scss';\n\nconst ANIMATION_DURATION = 350;\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n isReady?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n pinnedMessageIds?: number[] | number;\n messagesById?: Record;\n canUnpin?: boolean;\n topMessageSender?: ApiChat | ApiUser;\n typingStatus?: ApiTypingStatus;\n isSelectModeActive?: boolean;\n isLeftColumnShown?: boolean;\n isRightColumnShown?: boolean;\n audioMessage?: ApiMessage;\n chatsById?: Record;\n messagesCount?: number;\n isChatWithSelf?: boolean;\n isChatWithBot?: boolean;\n lastSyncTime?: number;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n shouldSkipHistoryAnimations?: boolean;\n currentTransitionKey: number;\n};\n\ntype DispatchProps = Pick;\n\nconst MiddleHeader: FC = ({\n chatId,\n threadId,\n messageListType,\n isReady,\n pinnedMessageIds,\n messagesById,\n canUnpin,\n topMessageSender,\n typingStatus,\n isSelectModeActive,\n isLeftColumnShown,\n isRightColumnShown,\n audioMessage,\n chat,\n chatsById,\n messagesCount,\n isChatWithSelf,\n isChatWithBot,\n lastSyncTime,\n notifySettings,\n notifyExceptions,\n shouldSkipHistoryAnimations,\n currentTransitionKey,\n openChatWithInfo,\n pinMessage,\n focusMessage,\n openChat,\n openPreviousChat,\n loadPinnedMessages,\n toggleLeftColumn,\n exitMessageSelectMode,\n}) => {\n const lang = useLang();\n\n const [pinnedMessageIndex, setPinnedMessageIndex] = useState(0);\n const pinnedMessageId = Array.isArray(pinnedMessageIds) ? pinnedMessageIds[pinnedMessageIndex] : pinnedMessageIds;\n const pinnedMessage = messagesById && pinnedMessageId ? messagesById[pinnedMessageId] : undefined;\n const pinnedMessagesCount = Array.isArray(pinnedMessageIds) ? pinnedMessageIds.length : (pinnedMessageIds ? 1 : 0);\n const chatTitleLength = chat && getChatTitle(lang, chat).length;\n const topMessageTitle = topMessageSender ? getSenderTitle(lang, topMessageSender) : undefined;\n\n useEffect(() => {\n if (threadId === MAIN_THREAD_ID && lastSyncTime && isReady) {\n loadPinnedMessages({ chatId });\n }\n }, [chatId, loadPinnedMessages, lastSyncTime, threadId, isReady]);\n\n // Reset pinned index when switching chats and pinning/unpinning\n useEffect(() => {\n setPinnedMessageIndex(0);\n }, [pinnedMessageIds]);\n\n useEnsureMessage(chatId, pinnedMessageId, pinnedMessage);\n\n const { width: windowWidth } = useWindowSize();\n\n const isLeftColumnHideable = windowWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN;\n const shouldShowCloseButton = IS_TABLET_COLUMN_LAYOUT && isLeftColumnShown;\n\n // eslint-disable-next-line no-null/no-null\n const componentRef = useRef(null);\n const shouldAnimateTools = useRef(true);\n\n const handleHeaderClick = useCallback(() => {\n openChatWithInfo({ id: chatId });\n }, [openChatWithInfo, chatId]);\n\n const handleUnpinMessage = useCallback((messageId: number) => {\n pinMessage({ chatId, messageId, isUnpin: true });\n }, [pinMessage, chatId]);\n\n const handlePinnedMessageClick = useCallback((): void => {\n if (pinnedMessage) {\n focusMessage({ chatId: pinnedMessage.chatId, threadId, messageId: pinnedMessage.id });\n\n const newIndex = cycleRestrict(pinnedMessagesCount, pinnedMessageIndex + 1);\n setPinnedMessageIndex(newIndex);\n }\n }, [pinnedMessage, focusMessage, threadId, pinnedMessagesCount, pinnedMessageIndex]);\n\n const handleAllPinnedClick = useCallback(() => {\n openChat({ id: chatId, threadId: MAIN_THREAD_ID, type: 'pinned' });\n }, [openChat, chatId]);\n\n const handleBackClick = useCallback((e: React.MouseEvent) => {\n if (IS_SINGLE_COLUMN_LAYOUT) {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID);\n if (messageInput) {\n messageInput.blur();\n }\n }\n\n if (threadId === MAIN_THREAD_ID && messageListType === 'thread' && currentTransitionKey === 0) {\n if (IS_SINGLE_COLUMN_LAYOUT || shouldShowCloseButton) {\n e.stopPropagation(); // Stop propagation to prevent chat re-opening on tablets\n openChat({ id: undefined });\n } else {\n toggleLeftColumn();\n }\n\n return;\n }\n\n if (messageListType === 'scheduled' && isSelectModeActive) {\n exitMessageSelectMode();\n }\n\n openPreviousChat();\n }, [\n threadId, messageListType, currentTransitionKey, isSelectModeActive, openPreviousChat, shouldShowCloseButton,\n openChat, toggleLeftColumn, exitMessageSelectMode,\n ]);\n\n const unreadCount = useMemo(() => {\n if (!isLeftColumnHideable || !chatsById) {\n return undefined;\n }\n\n let isActive = false;\n\n const totalCount = Object.values(chatsById).reduce((total, currentChat) => {\n if (isChatArchived(currentChat)) {\n return total;\n }\n\n const count = currentChat.unreadCount || 0;\n if (\n count && (!selectIsChatMuted(currentChat, notifySettings, notifyExceptions) || currentChat.unreadMentionsCount)\n ) {\n isActive = true;\n }\n\n return total + count;\n }, 0);\n\n if (!totalCount) {\n return undefined;\n }\n\n return {\n isActive,\n totalCount,\n };\n }, [isLeftColumnHideable, chatsById, notifySettings, notifyExceptions]);\n\n const canToolsCollideWithChatInfo = (\n windowWidth >= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_CHAT_INFO\n ) || (\n windowWidth > MOBILE_SCREEN_MAX_WIDTH\n && windowWidth < MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && (!chatTitleLength || chatTitleLength > 30)\n );\n const shouldUseStackedToolsClass = canToolsCollideWithChatInfo || (\n windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n );\n\n const {\n shouldRender: shouldRenderAudioPlayer,\n transitionClassNames: audioPlayerClassNames,\n } = useShowTransition(Boolean(audioMessage));\n\n const renderingAudioMessage = useCurrentOrPrev(audioMessage);\n\n const {\n shouldRender: shouldRenderPinnedMessage,\n transitionClassNames: pinnedMessageClassNames,\n } = useShowTransition(pinnedMessage && !shouldRenderAudioPlayer);\n\n const renderingPinnedMessage = useCurrentOrPrev(pinnedMessage);\n const renderingPinnedMessageTitle = useCurrentOrPrev(topMessageTitle);\n\n const canRevealTools = (shouldRenderPinnedMessage && renderingPinnedMessage)\n || (shouldRenderAudioPlayer && renderingAudioMessage);\n\n // Logic for transition to and from custom display of AudioPlayer/PinnedMessage on smaller screens\n useEffect(() => {\n const componentEl = componentRef.current;\n if (!componentEl) {\n return;\n }\n\n if (!shouldUseStackedToolsClass || !canRevealTools) {\n componentEl.classList.remove('tools-stacked', 'animated');\n shouldAnimateTools.current = true;\n return;\n }\n\n if (isRightColumnShown || canToolsCollideWithChatInfo) {\n if (shouldAnimateTools.current) {\n componentEl.classList.add('tools-stacked', 'animated');\n shouldAnimateTools.current = false;\n }\n\n // Remove animation class to prevent it messing up the show transitions\n setTimeout(() => {\n componentEl.classList.remove('animated');\n }, ANIMATION_DURATION);\n } else {\n componentEl.classList.remove('tools-stacked');\n shouldAnimateTools.current = true;\n }\n }, [shouldUseStackedToolsClass, canRevealTools, canToolsCollideWithChatInfo, isRightColumnShown]);\n\n function renderInfo() {\n return (\n messageListType === 'thread' && threadId === MAIN_THREAD_ID ? (\n renderMainThreadInfo()\n ) : messageListType === 'thread' ? (\n <>\n {renderBackButton()}\n

\n {lang('CommentsCount', messagesCount)}\n

\n \n ) : messageListType === 'pinned' ? (\n <>\n {renderBackButton()}\n

\n {lang('PinnedMessagesCount', messagesCount)}\n

\n \n ) : messageListType === 'scheduled' ? (\n <>\n {renderBackButton()}\n

\n {isChatWithSelf ? lang('Reminders') : lang('messages', messagesCount)}\n

\n \n ) : undefined\n );\n }\n\n function renderMainThreadInfo() {\n return (\n <>\n {(isLeftColumnHideable || currentTransitionKey > 0) && renderBackButton(shouldShowCloseButton, unreadCount)}\n
\n {isChatPrivate(chatId) ? (\n \n ) : (\n \n )}\n
\n \n );\n }\n\n function renderBackButton(asClose = false, unreadCountInfo?: typeof unreadCount) {\n return (\n
\n \n
\n \n {unreadCountInfo && (\n
\n {formatIntegerCompact(unreadCountInfo.totalCount)}\n
\n )}\n
\n );\n }\n\n return (\n
\n \n {renderInfo}\n \n\n
\n {shouldRenderPinnedMessage && renderingPinnedMessage && !shouldRenderAudioPlayer && (\n \n )}\n {shouldRenderAudioPlayer && renderingAudioMessage && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const { isLeftColumnShown, lastSyncTime, shouldSkipHistoryAnimations } = global;\n const { byId: chatsById } = global.chats;\n const chat = selectChat(global, chatId);\n\n const { typingStatus } = chat || {};\n\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n const audioMessage = audioChatId && audioMessageId\n ? selectChatMessage(global, audioChatId, audioMessageId)\n : undefined;\n\n let messagesCount: number | undefined;\n if (messageListType === 'pinned') {\n const pinnedIds = selectPinnedIds(global, chatId);\n messagesCount = pinnedIds && pinnedIds.length;\n } else if (messageListType === 'scheduled') {\n const scheduledIds = selectScheduledIds(global, chatId);\n messagesCount = scheduledIds && scheduledIds.length;\n } else if (messageListType === 'thread' && threadId !== MAIN_THREAD_ID) {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (threadInfo) {\n messagesCount = threadInfo.messagesCount;\n }\n }\n\n const state: StateProps = {\n typingStatus,\n isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isSelectModeActive: selectIsInSelectMode(global),\n audioMessage,\n chat,\n chatsById,\n messagesCount,\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n isChatWithBot: chat && selectIsChatWithBot(global, chat),\n lastSyncTime,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n shouldSkipHistoryAnimations,\n currentTransitionKey: Math.max(0, global.messages.messageLists.length - 1),\n };\n\n const messagesById = selectChatMessages(global, chatId);\n if (messageListType !== 'thread' || !messagesById) {\n return state;\n }\n\n Object.assign(state, { messagesById });\n\n if (threadId !== MAIN_THREAD_ID) {\n const pinnedMessageId = selectThreadTopMessageId(global, chatId, threadId);\n const message = pinnedMessageId ? selectChatMessage(global, chatId, pinnedMessageId) : undefined;\n const topMessageSender = message ? selectForwardedSender(global, message) : undefined;\n\n return {\n ...state,\n pinnedMessageIds: pinnedMessageId,\n canUnpin: false,\n topMessageSender,\n };\n }\n\n const pinnedMessageIds = selectPinnedIds(global, chatId);\n if (pinnedMessageIds && pinnedMessageIds.length) {\n const firstPinnedMessage = messagesById[pinnedMessageIds[0]];\n const {\n canUnpin,\n } = (firstPinnedMessage && selectAllowedMessageActions(global, firstPinnedMessage, threadId)) || {};\n\n return {\n ...state,\n pinnedMessageIds,\n canUnpin,\n };\n }\n\n return state;\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChatWithInfo',\n 'pinMessage',\n 'focusMessage',\n 'openChat',\n 'openPreviousChat',\n 'loadPinnedMessages',\n 'toggleLeftColumn',\n 'exitMessageSelectMode',\n ]),\n)(MiddleHeader));\n","import { ApiMessage } from '../../../api/types';\nimport { IAlbum } from '../../../types';\n\nimport { getDayStart } from '../../../util/dateFormat';\nimport { isActionMessage } from '../../../modules/helpers';\n\ntype SenderGroup = (ApiMessage | IAlbum)[];\n\nconst GROUP_INTERVAL_SECONDS = 600; // 10 minutes\n\nexport type MessageDateGroup = {\n originalDate: number;\n datetime: number;\n senderGroups: SenderGroup[];\n};\n\nexport function isAlbum(messageOrAlbum: ApiMessage | IAlbum): messageOrAlbum is IAlbum {\n return 'albumId' in messageOrAlbum;\n}\n\nexport function groupMessages(messages: ApiMessage[], firstUnreadId?: number) {\n let currentSenderGroup: SenderGroup = [];\n let currentDateGroup = {\n originalDate: messages[0].date,\n datetime: Number(getDayStart(messages[0].date * 1000)),\n senderGroups: [currentSenderGroup],\n };\n let currentAlbum: IAlbum | undefined;\n\n const dateGroups: MessageDateGroup[] = [currentDateGroup];\n\n messages.forEach((message, index) => {\n if (message.isInAlbum) {\n if (!currentAlbum) {\n currentAlbum = {\n albumId: message.groupedId!,\n messages: [message],\n mainMessage: message,\n };\n } else {\n currentAlbum.messages.push(message);\n if (message.content.text) {\n currentAlbum.mainMessage = message;\n }\n }\n } else {\n currentSenderGroup.push(message);\n }\n\n const nextMessage = messages[index + 1];\n\n if (\n currentAlbum\n && (!nextMessage || !nextMessage.groupedId || nextMessage.groupedId !== currentAlbum.albumId)\n ) {\n currentSenderGroup.push(currentAlbum);\n currentAlbum = undefined;\n }\n if (nextMessage) {\n const nextMessageDayStartsAt = Number(getDayStart(nextMessage.date * 1000));\n if (currentDateGroup.datetime !== nextMessageDayStartsAt) {\n currentDateGroup = {\n originalDate: nextMessage.date,\n datetime: nextMessageDayStartsAt,\n senderGroups: [],\n };\n dateGroups.push(currentDateGroup);\n\n currentSenderGroup = [];\n currentDateGroup.senderGroups.push(currentSenderGroup);\n } else if (\n nextMessage.id === firstUnreadId\n || message.senderId !== nextMessage.senderId\n || message.isOutgoing !== nextMessage.isOutgoing\n || isActionMessage(message)\n || isActionMessage(nextMessage)\n || (\n message.forwardInfo && nextMessage.forwardInfo\n && (\n message.forwardInfo.senderUserId !== nextMessage.forwardInfo.senderUserId\n || message.forwardInfo.fromChatId !== nextMessage.forwardInfo.fromChatId\n || message.forwardInfo.hiddenUserName !== nextMessage.forwardInfo.hiddenUserName\n )\n )\n || message.inlineButtons\n || nextMessage.inlineButtons\n || (nextMessage.date - message.date) > GROUP_INTERVAL_SECONDS\n ) {\n currentSenderGroup = [];\n currentDateGroup.senderGroups.push(currentSenderGroup);\n }\n }\n });\n\n return dateGroups;\n}\n","import React from '../../../lib/teact/teact';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\n\nexport function preventMessageInputBlur(e: React.MouseEvent) {\n if (\n IS_SINGLE_COLUMN_LAYOUT\n || !document.activeElement\n || document.activeElement.id !== EDITABLE_INPUT_ID\n || e.target !== e.currentTarget\n ) {\n return;\n }\n\n e.preventDefault();\n}\n","import { useCallback } from '../../../lib/teact/teact';\n\nimport { fastRaf } from '../../../util/schedulers';\nimport useDebounce from '../../../hooks/useDebounce';\nimport useFlag from '../../../hooks/useFlag';\n\nconst DEBOUNCE = 1000;\nconst STICKY_TOP = 10;\nconst STICKY_TOP_WITH_TOOLS = 60;\n\nexport default function useStickyDates() {\n // For some reason we can not synchronously hide a sticky element (from `useLayoutEffect`) when chat opens\n // so we will add `position: sticky` only after first scroll. There would be no animation on the first show though.\n const [isScrolled, markIsScrolled] = useFlag(false);\n\n const runDebounced = useDebounce(DEBOUNCE, false);\n\n const updateStickyDates = useCallback((container: HTMLDivElement, hasTools?: boolean) => {\n markIsScrolled();\n\n if (!document.body.classList.contains('is-scrolling-messages')) {\n fastRaf(() => {\n document.body.classList.add('is-scrolling-messages');\n });\n }\n\n runDebounced(() => {\n fastRaf(() => {\n const currentStuck = document.querySelector('.stuck');\n if (currentStuck) {\n currentStuck.classList.remove('stuck');\n }\n\n const stuckDateEl = findStuckDate(container, hasTools);\n if (stuckDateEl) {\n stuckDateEl.classList.add('stuck');\n }\n\n document.body.classList.remove('is-scrolling-messages');\n });\n });\n }, [markIsScrolled, runDebounced]);\n\n return {\n isScrolled,\n updateStickyDates,\n };\n}\n\nfunction findStuckDate(container: HTMLElement, hasTools?: boolean) {\n const allElements = container.querySelectorAll('.sticky-date');\n const containerTop = container.scrollTop;\n\n return Array.from(allElements).find((el) => {\n const { offsetTop, offsetHeight } = el;\n const top = offsetTop - containerTop;\n return -offsetHeight <= top && top <= (hasTools ? STICKY_TOP_WITH_TOOLS : STICKY_TOP);\n });\n}\n","import { useMemo } from '../lib/teact/teact';\n\nimport { debounce } from '../util/schedulers';\n\nexport default function useDebounce(ms: number, shouldRunFirst?: boolean, shouldRunLast?: boolean) {\n return useMemo(() => {\n return debounce((cb) => cb(), ms, shouldRunFirst, shouldRunLast);\n }, [ms, shouldRunFirst, shouldRunLast]);\n}\n","import { RefObject } from 'react';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nimport { MessageListType } from '../../../global/types';\n\nimport { IS_ANDROID, IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useBackgroundMode from '../../../hooks/useBackgroundMode';\n\nconst INTERSECTION_THROTTLE_FOR_MEDIA = IS_ANDROID ? 1000 : 350;\nconst INTERSECTION_MARGIN_FOR_MEDIA = IS_SINGLE_COLUMN_LAYOUT ? 300 : 500;\n\nexport default function useMessageObservers(\n type: MessageListType,\n containerRef: RefObject,\n memoFirstUnreadIdRef: { current: number | undefined },\n) {\n const { markMessageListRead, markMessagesRead } = getDispatch();\n\n const {\n observe: observeIntersectionForMedia,\n } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA,\n margin: INTERSECTION_MARGIN_FOR_MEDIA,\n });\n\n const {\n observe: observeIntersectionForReading, freeze: freezeForReading, unfreeze: unfreezeForReading,\n } = useIntersectionObserver({\n rootRef: containerRef,\n }, (entries) => {\n if (type !== 'thread') {\n return;\n }\n\n let maxId = 0;\n const mentionIds: number[] = [];\n\n entries.forEach((entry) => {\n const { isIntersecting, target } = entry;\n\n if (!isIntersecting) {\n return;\n }\n\n const { dataset } = target as HTMLDivElement;\n\n const messageId = Number(dataset.lastMessageId || dataset.messageId);\n if (messageId > maxId) {\n maxId = messageId;\n }\n\n if (dataset.hasUnreadMention) {\n mentionIds.push(messageId);\n }\n });\n\n if (memoFirstUnreadIdRef.current && maxId >= memoFirstUnreadIdRef.current) {\n markMessageListRead({ maxId });\n }\n\n if (mentionIds.length) {\n markMessagesRead({ messageIds: mentionIds });\n }\n });\n\n useBackgroundMode(freezeForReading, unfreezeForReading);\n\n const { observe: observeIntersectionForAnimatedStickers } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA,\n });\n\n return {\n observeIntersectionForMedia,\n observeIntersectionForReading,\n observeIntersectionForAnimatedStickers,\n };\n}\n","import { ApiMessage } from '../../../../api/types';\n\nimport { getMessageContent } from '../../../../modules/helpers';\n\nexport function isEmojiOnlyMessage(customShape?: boolean | number) {\n return typeof customShape === 'number';\n}\n\nexport function buildContentClassName(\n message: ApiMessage,\n {\n hasReply,\n customShape,\n isLastInGroup,\n asForwarded,\n hasThread,\n forceSenderName,\n hasComments,\n hasActionButton,\n }: {\n hasReply?: boolean;\n customShape?: boolean | number;\n isLastInGroup?: boolean;\n asForwarded?: boolean;\n hasThread?: boolean;\n forceSenderName?: boolean;\n hasComments?: boolean;\n hasActionButton?: boolean;\n } = {},\n) {\n const {\n text, photo, video, audio, voice, document, poll, webPage, contact,\n } = getMessageContent(message);\n\n const classNames = ['message-content'];\n const isMedia = photo || video;\n const isMediaWithNoText = isMedia && !text;\n const isViaBot = Boolean(message.viaBotId);\n\n if (isEmojiOnlyMessage(customShape)) {\n classNames.push(`emoji-only emoji-only-${customShape}`);\n } else if (text) {\n classNames.push('text');\n }\n\n if (hasActionButton) {\n classNames.push('has-action-button');\n }\n\n if (customShape) {\n classNames.push('custom-shape');\n if (video && video.isRound) {\n classNames.push('round');\n }\n\n if (hasComments) {\n classNames.push('has-comments');\n }\n }\n if (photo || video) {\n classNames.push('media');\n } else if (audio) {\n classNames.push('audio');\n } else if (voice) {\n classNames.push('voice');\n } else if (document) {\n classNames.push('document');\n } else if (contact) {\n classNames.push('contact');\n } else if (poll) {\n classNames.push('poll');\n } else if (webPage) {\n classNames.push('web-page');\n\n if (webPage.photo || webPage.video) {\n classNames.push('media');\n }\n }\n\n if (asForwarded && !customShape) {\n classNames.push('is-forwarded');\n }\n\n if (hasReply) {\n classNames.push('is-reply');\n }\n\n if (hasThread) {\n classNames.push('has-replies');\n }\n\n if (isViaBot) {\n classNames.push('is-via-bot');\n }\n\n if (forceSenderName) {\n classNames.push('force-sender-name');\n }\n\n if (!customShape) {\n classNames.push('has-shadow');\n\n if (isMedia && hasComments) {\n classNames.push('has-background');\n }\n\n if (hasReply || asForwarded || !isMediaWithNoText || isViaBot || forceSenderName) {\n classNames.push('has-solid-background');\n }\n\n if (isLastInGroup && (photo || !isMediaWithNoText)) {\n classNames.push('has-appendix');\n }\n }\n\n return classNames.join(' ');\n}\n","import { ApiMessage } from '../../../../api/types';\nimport { calculateInlineImageDimensions, calculateVideoDimensions } from '../../../common/helpers/mediaDimensions';\nimport {\n getMessageText,\n getMessagePhoto,\n getMessageWebPagePhoto,\n isForwardedMessage,\n isOwnMessage,\n getMessageVideo,\n} from '../../../../modules/helpers';\n\nconst MIN_MEDIA_WIDTH = 100;\nconst MIN_MEDIA_WIDTH_WITH_COMMENTS = 238;\nconst MIN_MEDIA_WIDTH_WITH_TEXT = 175;\nconst MIN_MEDIA_WIDTH_WITH_TEXT_AND_COMMENTS = 238;\nconst MIN_MEDIA_HEIGHT = 90;\nconst SMALL_IMAGE_THRESHOLD = 12;\n\nexport function getMinMediaWidth(hasText?: boolean, hasCommentButton?: boolean) {\n return hasText\n ? (hasCommentButton ? MIN_MEDIA_WIDTH_WITH_TEXT_AND_COMMENTS : MIN_MEDIA_WIDTH_WITH_TEXT)\n : (hasCommentButton ? MIN_MEDIA_WIDTH_WITH_COMMENTS : MIN_MEDIA_WIDTH);\n}\n\nexport function calculateMediaDimensions(message: ApiMessage, noAvatars?: boolean) {\n const isOwn = isOwnMessage(message);\n const isForwarded = isForwardedMessage(message);\n const photo = getMessagePhoto(message) || getMessageWebPagePhoto(message);\n const video = getMessageVideo(message);\n\n const isWebPagePhoto = Boolean(getMessageWebPagePhoto(message));\n const { width, height } = photo\n ? calculateInlineImageDimensions(photo, isOwn, isForwarded, isWebPagePhoto, noAvatars)\n : calculateVideoDimensions(video!, isOwn, isForwarded, noAvatars);\n\n const hasText = Boolean(getMessageText(message));\n const minMediaWidth = getMinMediaWidth(hasText);\n\n let stretchFactor = 1;\n if (width < minMediaWidth && minMediaWidth - width < SMALL_IMAGE_THRESHOLD) {\n stretchFactor = minMediaWidth / width;\n }\n if (height * stretchFactor < MIN_MEDIA_HEIGHT && MIN_MEDIA_HEIGHT - height * stretchFactor < SMALL_IMAGE_THRESHOLD) {\n stretchFactor = MIN_MEDIA_HEIGHT / height;\n }\n\n const finalWidth = Math.round(width * stretchFactor);\n const finalHeight = Math.round(height * stretchFactor);\n\n return {\n width: finalWidth,\n height: finalHeight,\n isSmall: finalWidth < minMediaWidth || finalHeight < MIN_MEDIA_HEIGHT,\n };\n}\n","/* eslint-disable no-bitwise */\n// Based on\n// https://github.com/telegramdesktop/tdesktop/blob/dev/Telegram/SourceFiles/ui/grouped_layout.cpp\n// https://github.com/overtake/TelegramSwift/blob/master/Telegram-Mac/GroupedLayout.swift#L83\n\nimport { IAlbum } from '../../../../types';\nimport { ApiMessage, ApiDimensions } from '../../../../api/types';\n\nimport { getAvailableWidth, REM } from '../../../common/helpers/mediaDimensions';\nimport { calculateMediaDimensions } from './mediaDimensions';\n\nexport const AlbumRectPart = {\n None: 0,\n Top: 1,\n Right: 2,\n Bottom: 4,\n Left: 8,\n};\n\ntype IAttempt = {\n lineCounts: number[];\n heights: number[];\n};\nexport type IMediaDimensions = {\n width: number;\n height: number;\n x: number;\n y: number;\n};\ntype IMediaLayout = {\n dimensions: IMediaDimensions;\n sides: number;\n};\ntype ILayoutParams = {\n ratios: number[];\n proportions: string;\n averageRatio: number;\n maxWidth: number;\n minWidth: number;\n maxHeight: number;\n spacing: number;\n};\nexport type IAlbumLayout = {\n layout: IMediaLayout[];\n containerStyle: ApiDimensions;\n};\n\nfunction getRatios(messages: ApiMessage[]) {\n return messages.map(\n (message) => {\n const dimensions = calculateMediaDimensions(message) as ApiDimensions;\n\n return dimensions.width / dimensions.height;\n },\n );\n}\n\nfunction getProportions(ratios: number[]) {\n return ratios.map((ratio) => (ratio > 1.2 ? 'w' : (ratio < 0.8 ? 'n' : 'q'))).join('');\n}\n\nfunction getAverageRatio(ratios: number[]) {\n return ratios.reduce((result, ratio) => ratio + result, 1) / ratios.length;\n}\n\nfunction accumulate(list: number[], initValue: number) {\n return list.reduce((accumulator, item) => accumulator + item, initValue);\n}\n\nfunction clamp(num: number, low: number, high: number) {\n return num < low ? low : (num > high ? high : num);\n}\n\nfunction cropRatios(ratios: number[], averageRatio: number) {\n return ratios.map((ratio) => (averageRatio > 1.1 ? clamp(ratio, 1, 2.75) : clamp(ratio, 0.6667, 1)));\n}\n\nfunction calculateContainerSize(layout: IMediaLayout[]) {\n const styles: ApiDimensions = { width: 0, height: 0 };\n layout.forEach(({\n dimensions,\n sides,\n }) => {\n if (sides & AlbumRectPart.Right) {\n styles.width = dimensions.width + dimensions.x;\n }\n if (sides & AlbumRectPart.Bottom) {\n styles.height = dimensions.height + dimensions.y;\n }\n });\n\n return styles;\n}\n\nexport function calculateAlbumLayout(\n isOwn: boolean,\n isForwarded: boolean,\n noAvatars: boolean,\n album: IAlbum,\n): IAlbumLayout {\n const spacing = 2;\n const ratios = getRatios(album.messages);\n const proportions = getProportions(ratios);\n const averageRatio = getAverageRatio(ratios);\n const albumCount = ratios.length;\n const forceCalc = ratios.some((ratio) => ratio > 2);\n const maxWidth = getAvailableWidth(isOwn, isForwarded, false, noAvatars) - (isForwarded ? 2.5 : 0) * REM;\n const maxHeight = maxWidth;\n\n let layout;\n\n const params = {\n ratios,\n proportions,\n averageRatio,\n maxWidth,\n minWidth: 100,\n maxHeight,\n spacing,\n };\n\n if (albumCount >= 5 || forceCalc) {\n layout = layoutWithComplexLayouter(params);\n } else if (albumCount === 2) {\n layout = layoutTwo(params);\n } else if (albumCount === 3) {\n layout = layoutThree(params);\n } else {\n layout = layoutFour(params);\n }\n\n return {\n layout,\n containerStyle: calculateContainerSize(layout),\n };\n}\n\nfunction layoutWithComplexLayouter({\n ratios: originalRatios,\n averageRatio,\n maxWidth,\n minWidth,\n spacing,\n maxHeight = (4 * maxWidth) / 3,\n}: ILayoutParams) {\n const ratios = cropRatios(originalRatios, averageRatio);\n const count = originalRatios.length;\n const result = new Array(count);\n const attempts: IAttempt[] = [];\n\n const multiHeight = (offset: number, attemptCount: number) => {\n const attemptRatios = ratios.slice(offset, offset + attemptCount);\n const sum = accumulate(attemptRatios, 0);\n\n return (maxWidth - (attemptCount - 1) * spacing) / sum;\n };\n\n const pushAttempt = (lineCounts: number[]) => {\n const heights: number[] = [];\n let offset = 0;\n lineCounts.forEach((currentCount) => {\n heights.push(multiHeight(offset, currentCount));\n offset += currentCount;\n });\n\n attempts.push({\n lineCounts,\n heights,\n });\n };\n\n for (let first = 1; first !== count; ++first) {\n const second = count - first;\n if (first <= 3 && second <= 3) {\n pushAttempt([first, second]);\n }\n }\n\n for (let first = 1; first !== count - 1; ++first) {\n for (let second = 1; second !== count - first; ++second) {\n const third = count - first - second;\n if (first <= 3 && second <= (averageRatio < 0.85 ? 4 : 3) && third <= 3) {\n pushAttempt([first, second, third]);\n }\n }\n }\n\n for (let first = 1; first !== count - 1; ++first) {\n for (let second = 1; second !== count - first; ++second) {\n for (let third = 1; third !== count - first - second; ++third) {\n const fourth = count - first - second - third;\n if (first <= 3 && second <= 3 && third <= 3 && fourth <= 4) {\n pushAttempt([first, second, third, fourth]);\n }\n }\n }\n }\n\n let optimalAttempt: IAttempt | undefined;\n let optimalDiff = 0;\n for (let i = 0; i < attempts.length; i++) {\n const {\n heights,\n lineCounts,\n } = attempts[i];\n const lineCount = lineCounts.length;\n const totalHeight = accumulate(heights, 0) + spacing * (lineCount - 1);\n const minLineHeight = Math.min(...heights);\n const bad1 = minLineHeight < minWidth ? 1.5 : 1;\n const bad2 = (() => {\n for (let line = 1; line !== lineCount; ++line) {\n if (lineCounts[line - 1] > lineCounts[line]) {\n return 1.5;\n }\n }\n\n return 1;\n })();\n const diff = Math.abs(totalHeight - maxHeight) * bad1 * bad2;\n\n if (!optimalAttempt || diff < optimalDiff) {\n optimalAttempt = attempts[i];\n optimalDiff = diff;\n }\n }\n\n const optimalCounts = optimalAttempt!.lineCounts;\n const optimalHeights = optimalAttempt!.heights;\n const rowCount = optimalCounts.length;\n let index = 0;\n let y = 0;\n for (let row = 0; row !== rowCount; ++row) {\n const colCount = optimalCounts[row];\n const lineHeight = optimalHeights[row];\n const height = Math.round(lineHeight);\n let x = 0;\n\n for (let col = 0; col !== colCount; ++col) {\n const sides = AlbumRectPart.None\n | (row === 0 ? AlbumRectPart.Top : AlbumRectPart.None)\n | (row === rowCount - 1 ? AlbumRectPart.Bottom : AlbumRectPart.None)\n | (col === 0 ? AlbumRectPart.Left : AlbumRectPart.None)\n | (col === colCount - 1 ? AlbumRectPart.Right : AlbumRectPart.None);\n const ratio = ratios[index];\n const width = col === colCount - 1 ? maxWidth - x : Math.round(ratio * lineHeight);\n result[index] = {\n dimensions: {\n x,\n y,\n width,\n height,\n },\n sides,\n };\n x += width + spacing;\n ++index;\n }\n y += height + spacing;\n }\n\n return result;\n}\n\n\nfunction layoutTwo(params: ILayoutParams) {\n const {\n ratios,\n proportions,\n averageRatio,\n } = params;\n return proportions === 'ww' && averageRatio > 1.4 && ratios[1] - ratios[0] < 0.2\n ? layoutTwoTopBottom(params)\n : proportions === 'ww' || proportions === 'qq'\n ? layoutTwoLeftRightEqual(params)\n : layoutTwoLeftRight(params);\n}\n\nfunction layoutTwoTopBottom(params: ILayoutParams) {\n const {\n ratios,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const height = Math.round(Math.min(maxWidth / ratios[0], Math.min(maxWidth / ratios[1], (maxHeight - spacing) / 2)));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: maxWidth,\n height,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: height + spacing,\n width: maxWidth,\n height,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutTwoLeftRightEqual(params: ILayoutParams) {\n const {\n ratios,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const width = (maxWidth - spacing) / 2;\n const height = Math.round(Math.min(width / ratios[0], Math.min(width / ratios[1], maxHeight)));\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: width + spacing,\n y: 0,\n width,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutTwoLeftRight(params: ILayoutParams) {\n const {\n ratios,\n minWidth,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const minimalWidth = Math.round(1.5 * minWidth);\n const secondWidth = Math.min(\n Math.round(\n Math.max(\n 0.4 * (maxWidth - spacing),\n (maxWidth - spacing) / ratios[0] / (1 / ratios[0] + 1 / ratios[1]),\n ),\n ),\n maxWidth - spacing - minimalWidth,\n );\n const firstWidth = maxWidth - secondWidth - spacing;\n const height = Math.min(maxHeight, Math.round(Math.min(firstWidth / ratios[0], secondWidth / ratios[1])));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: firstWidth,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: firstWidth + spacing,\n y: 0,\n width: secondWidth,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutThree(params: ILayoutParams) {\n const { proportions } = params;\n\n return proportions[0] === 'n'\n ? layoutThreeLeftAndOther(params)\n : layoutThreeTopAndOther(params);\n}\n\nfunction layoutThreeLeftAndOther(params: ILayoutParams) {\n const {\n maxHeight,\n spacing,\n ratios,\n maxWidth,\n minWidth,\n } = params;\n const firstHeight = maxHeight;\n const thirdHeight = Math.round(\n Math.min(\n (maxHeight - spacing) / 2,\n (ratios[1] * (maxWidth - spacing)) / (ratios[2] + ratios[1]),\n ),\n );\n const secondHeight = firstHeight - thirdHeight - spacing;\n const rightWidth = Math.max(\n minWidth,\n Math.round(\n Math.min(\n (maxWidth - spacing) / 2,\n Math.min(\n thirdHeight * ratios[2],\n secondHeight * ratios[1],\n ),\n ),\n ),\n );\n const leftWidth = Math.min(Math.round(firstHeight * ratios[0]), maxWidth - spacing - rightWidth);\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: leftWidth,\n height: firstHeight,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: leftWidth + spacing,\n y: 0,\n width: rightWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: leftWidth + spacing,\n y: secondHeight + spacing,\n width: rightWidth,\n height: thirdHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutThreeTopAndOther(params: ILayoutParams) {\n const {\n maxWidth,\n ratios,\n maxHeight,\n spacing,\n } = params;\n const firstWidth = maxWidth;\n const firstHeight = Math.round(Math.min(firstWidth / ratios[0], 0.66 * (maxHeight - spacing)));\n const secondWidth = (maxWidth - spacing) / 2;\n const secondHeight = Math.min(\n maxHeight - firstHeight - spacing,\n Math.round(Math.min(\n secondWidth / ratios[1],\n secondWidth / ratios[2],\n )),\n );\n const thirdWidth = firstWidth - secondWidth - spacing;\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: firstWidth,\n height: firstHeight,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: firstHeight + spacing,\n width: secondWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Left,\n }, {\n dimensions: {\n x: secondWidth + spacing,\n y: firstHeight + spacing,\n width: thirdWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutFour(params: ILayoutParams) {\n const { proportions } = params;\n\n return proportions[0] === 'w'\n ? layoutFourTopAndOther(params)\n : layoutFourLeftAndOther(params);\n}\n\nfunction layoutFourTopAndOther({\n maxWidth,\n ratios,\n spacing,\n maxHeight,\n minWidth,\n}: ILayoutParams) {\n const w = maxWidth;\n const h0 = Math.round(Math.min(w / ratios[0], 0.66 * (maxHeight - spacing)));\n const h = Math.round((maxWidth - 2 * spacing) / (ratios[1] + ratios[2] + ratios[3]));\n const w0 = Math.max(minWidth, Math.round(Math.min(0.4 * (maxWidth - 2 * spacing), h * ratios[1])));\n const w2 = Math.round(Math.max(Math.max(minWidth, 0.33 * (maxWidth - 2 * spacing)), h * ratios[3]));\n const w1 = w - w0 - w2 - 2 * spacing;\n const h1 = Math.min(maxHeight - h0 - spacing, h);\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: w,\n height: h0,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: h0 + spacing,\n width: w0,\n height: h1,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Left,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + spacing,\n width: w1,\n height: h1,\n },\n sides: AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: w0 + spacing + w1 + spacing,\n y: h0 + spacing,\n width: w2,\n height: h1,\n },\n sides: AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutFourLeftAndOther({\n maxHeight,\n ratios,\n maxWidth,\n spacing,\n minWidth,\n}: ILayoutParams) {\n const h = maxHeight;\n const w0 = Math.round(Math.min(h * ratios[0], 0.6 * (maxWidth - spacing)));\n const w = Math.round((maxHeight - 2 * spacing) / (1 / ratios[1] + 1 / ratios[2] + 1 / ratios[3]));\n const h0 = Math.round(w / ratios[1]);\n const h1 = Math.round(w / ratios[2]);\n const h2 = h - h0 - h1 - 2 * spacing;\n const w1 = Math.max(minWidth, Math.min(maxWidth - w0 - spacing, w));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: w0,\n height: h,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: 0,\n width: w1,\n height: h0,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + spacing,\n width: w1,\n height: h1,\n },\n sides: AlbumRectPart.Right,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + h1 + 2 * spacing,\n width: w1,\n height: h2,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n","import { IS_IOS } from '../../../../util/environment';\n\nlet element: HTMLSpanElement | undefined;\n\nexport default function calculateAuthorWidth(text: string) {\n if (!element) {\n element = document.createElement('span');\n // eslint-disable-next-line max-len\n element.style.font = IS_IOS\n // eslint-disable-next-line max-len\n ? '400 12px system-ui, -apple-system, BlinkMacSystemFont, \"Roboto\", \"Apple Color Emoji\", \"Helvetica Neue\", sans-serif'\n : '400 12px \"Roboto\", -apple-system, \"Apple Color Emoji\", BlinkMacSystemFont, \"Helvetica Neue\", sans-serif';\n element.style.whiteSpace = 'nowrap';\n element.style.position = 'absolute';\n element.style.left = '-999px';\n element.style.opacity = '.01';\n document.body.appendChild(element);\n }\n\n element.innerHTML = text;\n\n return element.offsetWidth;\n}\n","import { FocusDirection } from '../../../../types';\n\nimport { useLayoutEffect } from '../../../../lib/teact/teact';\nimport fastSmoothScroll from '../../../../util/fastSmoothScroll';\n\n// This is used when the viewport was replaced.\nconst RELOCATED_FOCUS_OFFSET = 1000;\nconst FOCUS_MARGIN = 20;\n\nexport default function useFocusMessage(\n elementRef: { current: HTMLDivElement | null },\n chatId: number,\n isFocused?: boolean,\n focusDirection?: FocusDirection,\n noFocusHighlight?: boolean,\n) {\n useLayoutEffect(() => {\n if (isFocused && elementRef.current) {\n const messagesContainer = elementRef.current.closest('.MessageList')!;\n\n fastSmoothScroll(\n messagesContainer,\n elementRef.current,\n // `noFocusHighlight` always called from “scroll-to-bottom” buttons\n noFocusHighlight ? 'end' : 'centerOrTop',\n FOCUS_MARGIN,\n focusDirection !== undefined ? RELOCATED_FOCUS_OFFSET : undefined,\n focusDirection,\n );\n }\n }, [elementRef, chatId, isFocused, focusDirection, noFocusHighlight]);\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './ContextMenuContainer';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst ContextMenuContainerAsync: FC = (props) => {\n const { isOpen } = props;\n const ContextMenuContainer = useModuleLoader(Bundles.Extra, 'ContextMenuContainer', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ContextMenuContainer ? : undefined;\n};\n\nexport default memo(ContextMenuContainerAsync);\n","import React, {\n FC, memo, useEffect, useMemo, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiMessage, ApiChat } from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport {\n selectUser,\n selectChatMessage,\n selectIsMessageFocused,\n selectChat,\n} from '../../modules/selectors';\nimport { isChatChannel } from '../../modules/helpers';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\nimport { renderActionMessageText } from '../common/helpers/renderActionMessageText';\nimport useEnsureMessage from '../../hooks/useEnsureMessage';\nimport useContextMenuHandlers from '../../hooks/useContextMenuHandlers';\nimport { ObserveFn, useOnIntersect } from '../../hooks/useIntersectionObserver';\nimport useFocusMessage from './message/hooks/useFocusMessage';\nimport useLang from '../../hooks/useLang';\n\nimport ContextMenuContainer from './message/ContextMenuContainer.async';\nimport useFlag from '../../hooks/useFlag';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport { preventMessageInputBlur } from './helpers/preventMessageInputBlur';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n isEmbedded?: boolean;\n appearanceOrder?: number;\n isLastInList?: boolean;\n};\n\ntype StateProps = {\n usersById: Record;\n sender?: ApiUser | ApiChat;\n targetUserIds?: number[];\n targetMessage?: ApiMessage;\n targetChatId?: number;\n isFocused: boolean;\n focusDirection?: FocusDirection;\n noFocusHighlight?: boolean;\n};\n\nconst APPEARANCE_DELAY = 10;\n\nconst ActionMessage: FC = ({\n message,\n observeIntersection,\n isEmbedded,\n appearanceOrder = 0,\n isLastInList,\n usersById,\n sender,\n targetUserIds,\n targetMessage,\n targetChatId,\n isFocused,\n focusDirection,\n noFocusHighlight,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n useEnsureMessage(message.chatId, message.replyToMessageId, targetMessage);\n useFocusMessage(ref, message.chatId, isFocused, focusDirection, noFocusHighlight);\n\n const lang = useLang();\n\n const noAppearanceAnimation = appearanceOrder <= 0;\n const [isShown, markShown] = useFlag(noAppearanceAnimation);\n useEffect(() => {\n if (noAppearanceAnimation) {\n return;\n }\n\n setTimeout(markShown, appearanceOrder * APPEARANCE_DELAY);\n }, [appearanceOrder, markShown, noAppearanceAnimation]);\n const { transitionClassNames } = useShowTransition(isShown, undefined, noAppearanceAnimation, false);\n\n const targetUsers = useMemo(() => {\n return targetUserIds\n ? targetUserIds.map((userId) => usersById && usersById[userId]).filter(Boolean as any)\n : undefined;\n }, [targetUserIds, usersById]);\n\n const content = renderActionMessageText(\n lang,\n message,\n sender,\n targetUsers,\n targetMessage,\n targetChatId,\n isEmbedded ? { isEmbedded: true, asPlain: true } : undefined,\n );\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(ref);\n const isContextMenuShown = contextMenuPosition !== undefined;\n\n const handleMouseDown = (e: React.MouseEvent) => {\n preventMessageInputBlur(e);\n handleBeforeContextMenu(e);\n };\n\n if (isEmbedded) {\n return {renderText(content as string)};\n }\n\n const className = buildClassName(\n 'ActionMessage message-list-item',\n isFocused && !noFocusHighlight && 'focused',\n isContextMenuShown && 'has-menu-open',\n isLastInList && 'last-in-list',\n transitionClassNames,\n );\n\n return (\n \n {content}\n {contextMenuPosition && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { message }): StateProps => {\n const { byId: usersById } = global.users;\n const userId = message.senderId;\n const { targetUserIds, targetChatId } = message.content.action || {};\n const targetMessageId = message.replyToMessageId;\n const targetMessage = targetMessageId\n ? selectChatMessage(global, message.chatId, targetMessageId)\n : undefined;\n\n const isFocused = selectIsMessageFocused(global, message);\n const { direction: focusDirection, noHighlight: noFocusHighlight } = (isFocused && global.focusedMessage) || {};\n\n const chat = selectChat(global, message.chatId);\n const sender = chat && (isChatChannel(chat) || userId === message.chatId)\n ? chat\n : userId ? selectUser(global, userId) : undefined;\n\n return {\n usersById,\n sender,\n targetChatId,\n targetUserIds,\n targetMessage,\n isFocused,\n ...(isFocused && { focusDirection, noFocusHighlight }),\n };\n },\n)(ActionMessage));\n","import React, { FC, useRef } from '../../lib/teact/teact';\n\nimport { ApiUser, ApiMessage, ApiChat } from '../../api/types';\n\nimport {\n getMessageMediaHash,\n isActionMessage,\n getMessageSummaryText,\n getSenderTitle,\n getMessageRoundVideo,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { getPictogramDimensions } from './helpers/mediaDimensions';\nimport buildClassName from '../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useWebpThumbnail from '../../hooks/useWebpThumbnail';\nimport useLang from '../../hooks/useLang';\n\nimport ActionMessage from '../middle/ActionMessage';\n\nimport './EmbeddedMessage.scss';\n\ntype OwnProps = {\n observeIntersection?: ObserveFn;\n className?: string;\n message?: ApiMessage;\n sender?: ApiUser | ApiChat;\n title?: string;\n customText?: string;\n onClick: NoneToVoidFunction;\n};\n\nconst NBSP = '\\u00A0';\n\nconst EmbeddedMessage: FC = ({\n className,\n message,\n sender,\n title,\n customText,\n observeIntersection,\n onClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaBlobUrl = useMedia(message && getMessageMediaHash(message, 'pictogram'), !isIntersecting);\n const pictogramId = message && `sticker-reply-thumb${message.id}`;\n const mediaThumbnail = useWebpThumbnail(message);\n const isRoundVideo = Boolean(message && getMessageRoundVideo(message));\n\n const lang = useLang();\n\n const senderTitle = sender && getSenderTitle(lang, sender);\n\n return (\n \n {mediaThumbnail && renderPictogram(pictogramId, mediaThumbnail, mediaBlobUrl, isRoundVideo)}\n
\n

\n {!message ? (\n customText || NBSP\n ) : isActionMessage(message) ? (\n \n ) : (\n renderText(getMessageSummaryText(lang, message, Boolean(mediaThumbnail)))\n )}\n

\n
{renderText(senderTitle || title || NBSP)}
\n
\n \n );\n};\n\nfunction renderPictogram(\n id: string | undefined,\n thumbDataUri: string,\n blobUrl?: string,\n isRoundVideo?: boolean,\n) {\n const { width, height } = getPictogramDimensions();\n\n return (\n \n );\n}\n\nexport default EmbeddedMessage;\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiMessage, ApiMessageOutgoingStatus } from '../../../api/types';\n\nimport { formatTime } from '../../../util/dateFormat';\nimport { formatIntegerCompact } from '../../../util/textFormat';\n\nimport MessageOutgoingStatus from '../../common/MessageOutgoingStatus';\nimport renderText from '../../common/helpers/renderText';\nimport useLang from '../../../hooks/useLang';\n\nimport './MessageMeta.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n outgoingStatus?: ApiMessageOutgoingStatus;\n signature?: string;\n onClick: () => void;\n};\n\nconst MessageMeta: FC = ({\n message, outgoingStatus, signature, onClick,\n}) => {\n const lang = useLang();\n\n return (\n \n {Boolean(message.views) && (\n <>\n \n {formatIntegerCompact(message.views!)}\n \n \n \n )}\n {signature && (\n {renderText(signature)}\n )}\n \n {message.isEdited && `${lang('EditedMessage')} `}\n {formatTime(message.date * 1000)}\n \n {outgoingStatus && (\n \n )}\n \n );\n};\n\nexport default memo(MessageMeta);\n","import React, { FC, useRef } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { MEMOJI_STICKER_ID } from '../../../config';\nimport { getStickerDimensions } from '../../common/helpers/mediaDimensions';\nimport { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport buildClassName from '../../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useFlag from '../../../hooks/useFlag';\nimport useWebpThumbnail from '../../../hooks/useWebpThumbnail';\n\nimport AnimatedSticker from '../../common/AnimatedSticker';\nimport StickerSetModal from '../../common/StickerSetModal.async';\n\nimport './Sticker.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection: ObserveFn;\n observeIntersectionForPlaying: ObserveFn;\n shouldLoop?: boolean;\n lastSyncTime?: number;\n};\n\nconst Sticker: FC = ({\n message, observeIntersection, observeIntersectionForPlaying, shouldLoop, lastSyncTime,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isModalOpen, openModal, closeModal] = useFlag();\n\n const sticker = message.content.sticker!;\n const { isAnimated, stickerSetId } = sticker;\n const isMemojiSticker = stickerSetId === MEMOJI_STICKER_ID;\n\n const shouldLoad = useIsIntersecting(ref, observeIntersection);\n const shouldPlay = useIsIntersecting(ref, observeIntersectionForPlaying);\n\n const mediaHash = sticker.isPreloadedGlobally ? `sticker${sticker.id}` : getMessageMediaHash(message, 'inline')!;\n const thumbDataUri = useWebpThumbnail(message);\n const mediaData = useMedia(\n mediaHash,\n !shouldLoad,\n getMessageMediaFormat(message, 'inline', true),\n lastSyncTime,\n );\n\n const isMediaLoaded = Boolean(mediaData);\n const [isAnimationLoaded, markAnimationLoaded] = useFlag(isMediaLoaded);\n const isMediaReady = isAnimated ? isAnimationLoaded : isMediaLoaded;\n const { shouldRenderFullMedia, transitionClassNames } = useTransitionForMedia(isMediaReady, 'slow');\n\n const { width, height } = getStickerDimensions(sticker);\n const thumbClassName = buildClassName('thumbnail', !thumbDataUri && 'empty');\n\n const stickerClassName = buildClassName(\n 'Sticker media-inner',\n isMemojiSticker && 'inactive',\n );\n\n return (\n
\n {!isMediaReady && (\n \n )}\n {!isAnimated && shouldRenderFullMedia && (\n \n )}\n {isAnimated && isMediaLoaded && (\n \n )}\n \n
\n );\n};\n\nexport default Sticker;\n","import { ApiMessage } from '../../../../api/types';\n\nimport { IS_CANVAS_FILTER_SUPPORTED, IS_SINGLE_COLUMN_LAYOUT } from '../../../../util/environment';\nimport { getMessageMediaThumbDataUri } from '../../../../modules/helpers';\nimport useCanvasBlur from '../../../../hooks/useCanvasBlur';\n\nexport default function useBlurredMediaThumbRef(message: ApiMessage, fullMediaData?: string) {\n return useCanvasBlur(\n getMessageMediaThumbDataUri(message),\n Boolean(fullMediaData),\n IS_SINGLE_COLUMN_LAYOUT && !IS_CANVAS_FILTER_SUPPORTED,\n );\n}\n","const SELECTED_APPENDIX_BACKGROUND = Promise.resolve('rgba(255,255,255,1)');\n\nexport default function getCustomAppendixBg(src: string, isOwn: boolean, inSelectMode?: boolean, isSelected?: boolean) {\n return isSelected ? SELECTED_APPENDIX_BACKGROUND : getAppendixColorFromImage(src, isOwn);\n}\n\nasync function getAppendixColorFromImage(src: string, isOwn: boolean) {\n const img = new Image();\n img.src = src;\n\n if (!img.width) {\n await new Promise((resolve) => {\n img.onload = resolve;\n });\n }\n\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n\n canvas.width = img.width;\n canvas.height = img.height;\n\n ctx.drawImage(img, 0, 0, img.width, img.height);\n\n const x = isOwn ? img.width - 1 : 0;\n const y = img.height - 1;\n\n const pixel = Array.from(ctx.getImageData(x, y, 1, 1).data);\n return `rgba(${pixel.join(',')})`;\n}\n","import React, {\n FC, useCallback, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IMediaDimensions } from './helpers/calculateAlbumLayout';\n\nimport {\n getMessagePhoto,\n getMessageWebPagePhoto,\n getMessageMediaHash,\n getMediaTransferState,\n isOwnMessage,\n} from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\nimport usePrevious from '../../../hooks/usePrevious';\nimport buildClassName from '../../../util/buildClassName';\nimport getCustomAppendixBg from './helpers/getCustomAppendixBg';\nimport { calculateMediaDimensions } from './helpers/mediaDimensions';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nexport type OwnProps = {\n id?: string;\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n noAvatars?: boolean;\n shouldAutoLoad?: boolean;\n isInSelectMode?: boolean;\n isSelected?: boolean;\n uploadProgress?: number;\n size?: 'inline' | 'pictogram';\n shouldAffectAppendix?: boolean;\n dimensions?: IMediaDimensions & { isSmall?: boolean };\n nonInteractive?: boolean;\n onClick?: (id: number) => void;\n onCancelUpload?: (message: ApiMessage) => void;\n};\n\nconst CUSTOM_APPENDIX_ATTRIBUTE = 'data-has-custom-appendix';\n\nconst Photo: FC = ({\n id,\n message,\n observeIntersection,\n noAvatars,\n shouldAutoLoad,\n isInSelectMode,\n isSelected,\n uploadProgress,\n size = 'inline',\n dimensions,\n nonInteractive,\n shouldAffectAppendix,\n onClick,\n onCancelUpload,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const photo = (getMessagePhoto(message) || getMessageWebPagePhoto(message))!;\n const localBlobUrl = photo.blobUrl;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad);\n const shouldDownload = isDownloadAllowed && isIntersecting;\n const {\n mediaData, downloadProgress,\n } = useMediaWithDownloadProgress(getMessageMediaHash(message, size), !shouldDownload);\n const fullMediaData = localBlobUrl || mediaData;\n const thumbRef = useBlurredMediaThumbRef(message, fullMediaData);\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, shouldDownload && !fullMediaData);\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasDownloadDisabled, 'slow');\n const {\n shouldRenderThumb, shouldRenderFullMedia, transitionClassNames,\n } = useTransitionForMedia(fullMediaData, 'slow');\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (!fullMediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n } else if (onClick) {\n onClick(message.id);\n }\n }, [fullMediaData, isUploading, message, onCancelUpload, onClick]);\n\n const isOwn = isOwnMessage(message);\n useLayoutEffect(() => {\n if (!shouldAffectAppendix) {\n return;\n }\n\n const contentEl = ref.current!.closest('.message-content')!;\n\n if (fullMediaData) {\n getCustomAppendixBg(fullMediaData, isOwn, isInSelectMode, isSelected).then((appendixBg) => {\n contentEl.style.setProperty('--appendix-bg', appendixBg);\n contentEl.setAttribute(CUSTOM_APPENDIX_ATTRIBUTE, '');\n });\n } else {\n contentEl.classList.add('has-appendix-thumb');\n }\n }, [fullMediaData, isOwn, shouldAffectAppendix, isInSelectMode, isSelected]);\n\n const { width, height, isSmall } = dimensions || calculateMediaDimensions(message, noAvatars);\n\n const className = buildClassName(\n 'media-inner',\n !isUploading && !nonInteractive && 'interactive',\n isSmall && 'small-image',\n width === height && 'square-image',\n );\n\n const style = dimensions\n ? `width: ${width}px; height: ${height}px; left: ${dimensions.x}px; top: ${dimensions.y}px;`\n : '';\n\n return (\n \n {shouldRenderThumb && (\n \n )}\n {shouldRenderFullMedia && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n {!fullMediaData && !isDownloadAllowed && (\n \n )}\n {isTransferring && (\n {Math.round(transferProgress * 100)}%\n )}\n \n );\n};\n\nexport default Photo;\n","import { RefObject } from 'react';\nimport { useCallback, useRef } from '../lib/teact/teact';\n\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\nimport safePlay from '../util/safePlay';\n\nexport default function useHeavyAnimationCheckForVideo(playerRef: RefObject, shouldPlay: boolean) {\n const shouldPlayRef = useRef();\n shouldPlayRef.current = shouldPlay;\n\n const pause = useCallback(() => {\n if (playerRef.current) {\n playerRef.current.pause();\n }\n }, [playerRef]);\n\n const play = useCallback(() => {\n if (playerRef.current && shouldPlayRef.current) {\n safePlay(playerRef.current);\n }\n }, [playerRef]);\n\n useHeavyAnimationCheck(pause, play);\n}\n","import { useCallback, useRef } from '../../../../lib/teact/teact';\nimport { fastRaf } from '../../../../util/schedulers';\nimport useBackgroundMode from '../../../../hooks/useBackgroundMode';\nimport safePlay from '../../../../util/safePlay';\n\nexport default (playerRef: { current: HTMLVideoElement | null }, isPlayAllowed = false) => {\n const wasPlaying = useRef(false);\n const isFrozen = useRef(false);\n\n const freezePlaying = useCallback(() => {\n isFrozen.current = true;\n\n if (!isPlayAllowed || !playerRef.current) {\n return;\n }\n\n if (!wasPlaying.current) {\n wasPlaying.current = !playerRef.current.paused;\n }\n\n playerRef.current.pause();\n }, [isPlayAllowed, playerRef]);\n\n const unfreezePlaying = useCallback(() => {\n // At this point HTMLVideoElement can be unmounted from the DOM\n if (isPlayAllowed && playerRef.current && wasPlaying.current && document.body.contains(playerRef.current)) {\n safePlay(playerRef.current);\n }\n\n wasPlaying.current = false;\n isFrozen.current = false;\n }, [isPlayAllowed, playerRef]);\n\n const unfreezePlayingOnRaf = useCallback(() => {\n fastRaf(unfreezePlaying);\n }, [unfreezePlaying]);\n\n if (!document.hasFocus()) {\n freezePlaying();\n }\n\n useBackgroundMode(freezePlaying, unfreezePlayingOnRaf);\n};\n","import React, {\n FC, useCallback, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { IMediaDimensions } from './helpers/calculateAlbumLayout';\n\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport { calculateVideoDimensions } from '../../common/helpers/mediaDimensions';\nimport {\n getMediaTransferState,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageVideo,\n getMessageWebPageVideo,\n isForwardedMessage,\n isOwnMessage,\n} from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useMedia from '../../../hooks/useMedia';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBuffering from '../../../hooks/useBuffering';\nimport useHeavyAnimationCheckForVideo from '../../../hooks/useHeavyAnimationCheckForVideo';\nimport useVideoCleanup from '../../../hooks/useVideoCleanup';\nimport usePauseOnInactive from './hooks/usePauseOnInactive';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nexport type OwnProps = {\n id?: string;\n message: ApiMessage;\n observeIntersection: ObserveFn;\n noAvatars?: boolean;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n uploadProgress?: number;\n dimensions?: IMediaDimensions;\n lastSyncTime?: number;\n onClick?: (id: number) => void;\n onCancelUpload?: (message: ApiMessage) => void;\n};\n\nconst Video: FC = ({\n id,\n message,\n observeIntersection,\n noAvatars,\n shouldAutoLoad,\n shouldAutoPlay,\n uploadProgress,\n lastSyncTime,\n dimensions,\n onClick,\n onCancelUpload,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n\n const video = (getMessageVideo(message) || getMessageWebPageVideo(message))!;\n const localBlobUrl = video.blobUrl;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad);\n const shouldDownload = Boolean(isDownloadAllowed && isIntersecting && lastSyncTime);\n const [isPlayAllowed, setIsPlayAllowed] = useState(shouldAutoPlay);\n\n const previewBlobUrl = useMedia(\n getMessageMediaHash(message, 'pictogram'),\n !(isIntersecting && lastSyncTime),\n getMessageMediaFormat(message, 'pictogram'),\n lastSyncTime,\n );\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n const fullMediaData = localBlobUrl || mediaData;\n const isInline = Boolean(isIntersecting && fullMediaData);\n // Thumbnail is always rendered so we can only disable blur if we have preview\n const thumbRef = useBlurredMediaThumbRef(message, previewBlobUrl);\n\n const { isBuffered, bufferingHandlers } = useBuffering(!shouldAutoLoad);\n const { isUploading, isTransferring, transferProgress } = getMediaTransferState(\n message,\n uploadProgress || downloadProgress,\n shouldDownload && !isBuffered,\n );\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasDownloadDisabled);\n const { transitionClassNames } = useTransitionForMedia(fullMediaData, 'slow');\n\n const [playProgress, setPlayProgress] = useState(0);\n const handleTimeUpdate = useCallback((e: React.SyntheticEvent) => {\n setPlayProgress(Math.max(0, e.currentTarget.currentTime - 1));\n }, []);\n\n const duration = (videoRef.current && videoRef.current.duration) || video.duration || 0;\n\n const isOwn = isOwnMessage(message);\n const isForwarded = isForwardedMessage(message);\n const { width, height } = dimensions || calculateVideoDimensions(video, isOwn, isForwarded, noAvatars);\n\n useHeavyAnimationCheckForVideo(videoRef, Boolean(isInline && shouldAutoPlay));\n usePauseOnInactive(videoRef, isPlayAllowed);\n useVideoCleanup(videoRef, [isInline]);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (!fullMediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n } else if (fullMediaData && !isPlayAllowed) {\n setIsPlayAllowed(true);\n videoRef.current!.play();\n } else if (onClick) {\n onClick(message.id);\n }\n }, [isUploading, fullMediaData, isPlayAllowed, onClick, onCancelUpload, message]);\n\n const className = buildClassName('media-inner dark', !isUploading && 'interactive');\n const videoClassName = buildClassName('full-media', transitionClassNames);\n\n const style = dimensions\n ? `width: ${width}px; height: ${height}px; left: ${dimensions.x}px; top: ${dimensions.y}px;`\n : '';\n\n return (\n \n {!previewBlobUrl && (\n \n )}\n {previewBlobUrl && (\n \n )}\n {isInline && (\n \n \n \n )}\n {(isDownloadAllowed && !isPlayAllowed && !shouldRenderSpinner) && (\n \n )}\n {shouldRenderSpinner && (\n
\n \n
\n )}\n {!isDownloadAllowed && (\n \n )}\n {isTransferring ? (\n ...\n ) : (\n
\n {video.isGif ? 'GIF' : formatMediaDuration(Math.max(duration - playProgress, 0))}\n
\n )}\n \n );\n};\n\nexport default Video;\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiUser, ApiContact } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\n\nimport Avatar from '../../common/Avatar';\n\nimport './Contact.scss';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\n\ntype OwnProps = {\n contact: ApiContact;\n};\n\ntype StateProps = {\n user?: ApiUser;\n};\n\ntype DispatchProps = Pick;\n\nconst Contact: FC = ({\n contact, user, openUserInfo,\n}) => {\n const {\n firstName,\n lastName,\n phoneNumber,\n userId,\n } = contact;\n\n const handleClick = useCallback(() => {\n openUserInfo({ id: userId });\n }, [openUserInfo, userId]);\n\n return (\n \n \n
\n
{firstName} {lastName}
\n
{formatPhoneNumberWithCode(phoneNumber)}
\n
\n \n );\n};\n\nexport default withGlobal(\n (global, { contact }): StateProps => {\n return {\n user: selectUser(global, contact.userId),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n ]),\n)(Contact);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, memo, useState,\n} from '../../lib/teact/teact';\n\nimport Checkbox from './Checkbox';\n\ntype IRadioOption = {\n label: string;\n subLabel?: string;\n value: string;\n};\n\ntype OwnProps = {\n id?: string;\n options: IRadioOption[];\n selected?: string[];\n disabled?: boolean;\n round?: boolean;\n loadingOptions?: string[];\n onChange: (value: string[]) => void;\n};\n\nconst CheckboxGroup: FC = ({\n id,\n options,\n selected = [],\n disabled,\n round,\n loadingOptions,\n onChange,\n}) => {\n const [values, setValues] = useState([]);\n\n const handleChange = useCallback((event: ChangeEvent) => {\n const { value, checked } = event.currentTarget;\n let newValues: string[];\n if (checked) {\n newValues = [...values, value];\n } else {\n newValues = values.filter((v) => v !== value);\n }\n\n setValues(newValues);\n onChange(newValues);\n }, [onChange, values]);\n\n return (\n
\n {options.map((option) => (\n \n ))}\n
\n );\n};\n\nexport default memo(CheckboxGroup);\n","import React, {\n FC, useState, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiPollAnswer, ApiPollResult } from '../../../api/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport renderText from '../../common/helpers/renderText';\n\nimport './PollOption.scss';\n\ntype OwnProps = {\n answer: ApiPollAnswer;\n voteResults?: ApiPollResult[];\n totalVoters?: number;\n maxVotersCount?: number;\n correctResults: string[];\n shouldAnimate: boolean;\n};\n\nconst PollOption: FC = ({\n answer,\n voteResults,\n totalVoters,\n maxVotersCount,\n correctResults,\n shouldAnimate,\n}) => {\n const result = voteResults && voteResults.find((r) => r.option === answer.option);\n const correctAnswer = correctResults.length === 0 || correctResults.indexOf(answer.option) !== -1;\n const showIcon = (correctResults.length > 0 && correctAnswer) || (result && result.isChosen);\n const answerPercent = result ? getPercentage(result.votersCount, totalVoters || 0) : 0;\n const [finalPercent, setFinalPercent] = useState(shouldAnimate ? 0 : answerPercent);\n // eslint-disable-next-line no-null/no-null\n const lineRef = useRef(null);\n const lineWidth = result ? getPercentage(result.votersCount, maxVotersCount || 0) : 0;\n const isAnimationDoesNotStart = finalPercent < answerPercent;\n\n useEffect(() => {\n if (shouldAnimate) {\n setFinalPercent(answerPercent);\n }\n }, [shouldAnimate, answerPercent]);\n\n useEffect(() => {\n const lineEl = lineRef.current;\n\n if (lineEl && shouldAnimate) {\n const svgEl = lineEl.firstElementChild;\n\n const style = isAnimationDoesNotStart ? '' : 'stroke-dasharray: 100% 200%; stroke-dashoffset: -44';\n if (!svgEl) {\n lineEl.innerHTML = `\n \n \n `;\n } else {\n svgEl.setAttribute('style', style);\n }\n }\n }, [isAnimationDoesNotStart, shouldAnimate]);\n\n if (!voteResults || !result) {\n return undefined;\n }\n\n const lineStyle = `width: ${lineWidth}%; transform:scaleX(${isAnimationDoesNotStart ? 0 : 1})`;\n\n return (\n
\n
\n {answerPercent}%\n {showIcon && (\n \n \n \n )}\n
\n
\n
\n {renderText(answer.text)}\n
\n
\n
\n \n
\n
\n
\n );\n};\n\nfunction getPercentage(value: number, total: number) {\n return total > 0 ? ((value / total) * 100).toFixed() : 0;\n}\n\nexport default PollOption;\n","import React, {\n FC,\n useCallback,\n useEffect,\n useState,\n memo,\n useMemo,\n useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiMessage, ApiPoll, ApiUser, ApiPollAnswer,\n} from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport renderText from '../../common/helpers/renderText';\nimport { renderTextWithEntities } from '../../common/helpers/renderMessageText';\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport useLang, { LangFn } from '../../../hooks/useLang';\n\nimport CheckboxGroup from '../../ui/CheckboxGroup';\nimport RadioGroup from '../../ui/RadioGroup';\nimport Avatar from '../../common/Avatar';\nimport Button from '../../ui/Button';\nimport Notification from '../../ui/Notification';\nimport PollOption from './PollOption';\n\nimport './Poll.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n poll: ApiPoll;\n onSendVote: (options: string[]) => void;\n};\n\ntype StateProps = {\n recentVoterIds?: number[];\n usersById: Record;\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst SOLUTION_CONTAINER_ID = '#middle-column-portals';\nconst SOLUTION_DURATION = 5000;\nconst NBSP = '\\u00A0';\n\nconst Poll: FC = ({\n message,\n poll,\n recentVoterIds,\n usersById,\n loadMessage,\n onSendVote,\n openPollResults,\n serverTimeOffset,\n}) => {\n const { id: messageId, chatId } = message;\n const { summary, results } = poll;\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [chosenOptions, setChosenOptions] = useState([]);\n const [isSolutionShown, setIsSolutionShown] = useState(false);\n const [wasSubmitted, setWasSubmitted] = useState(false);\n const [closePeriod, setClosePeriod] = useState(\n !summary.closed && summary.closeDate && summary.closeDate > 0\n ? Math.min(summary.closeDate - Math.floor(Date.now() / 1000) + serverTimeOffset, summary.closePeriod!)\n : 0,\n );\n // eslint-disable-next-line no-null/no-null\n const countdownRef = useRef(null);\n const { results: voteResults, totalVoters } = results;\n const hasVoted = voteResults && voteResults.some((r) => r.isChosen);\n const canVote = !summary.closed && !hasVoted;\n const canViewResult = !canVote && summary.isPublic && Number(results.totalVoters) > 0;\n const isMultiple = canVote && summary.multipleChoice;\n const maxVotersCount = voteResults ? Math.max(...voteResults.map((r) => r.votersCount)) : totalVoters;\n const correctResults = voteResults ? voteResults.reduce((answers: string[], r) => {\n if (r.isCorrect) {\n answers.push(r.option);\n }\n\n return answers;\n }, []) : [];\n const answers = summary.answers.map((a) => ({\n label: a.text,\n value: a.option,\n hidden: Boolean(summary.quiz && summary.closePeriod && closePeriod <= 0),\n }));\n\n useEffect(() => {\n if (\n isSubmitting\n && poll.results.results\n && poll.results.results.some((result) => result.isChosen)\n ) {\n setIsSubmitting(false);\n }\n }, [isSubmitting, poll.results.results]);\n\n useEffect(() => {\n if (closePeriod > 0) {\n setTimeout(() => setClosePeriod(closePeriod - 1), 1000);\n }\n\n const countdownEl = countdownRef.current;\n\n if (countdownEl) {\n const circumference = 6 * 2 * Math.PI;\n const svgEl = countdownEl.lastElementChild;\n const timerEl = countdownEl.firstElementChild;\n if (closePeriod <= 5) {\n countdownEl.classList.add('hurry-up');\n }\n\n if (!svgEl || !timerEl) {\n countdownEl.innerHTML = `\n ${formatMediaDuration(closePeriod)}\n \n \n `;\n } else {\n const strokeDashOffset = ((summary.closePeriod! - closePeriod) / summary.closePeriod!) * circumference;\n timerEl.textContent = formatMediaDuration(closePeriod);\n (svgEl.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', `-${strokeDashOffset}`);\n }\n }\n }, [closePeriod, summary.closePeriod]);\n\n useEffect(() => {\n if (summary.quiz && (closePeriod <= 0 || (hasVoted && !summary.closed))) {\n loadMessage({ chatId, messageId });\n }\n }, [chatId, closePeriod, hasVoted, loadMessage, messageId, summary.closed, summary.quiz]);\n\n // If the client time is not synchronized, the poll must be updated after the closePeriod time has expired.\n useEffect(() => {\n let timer: number | undefined;\n\n if (summary.quiz && !summary.closed && summary.closePeriod && summary.closePeriod > 0) {\n timer = window.setTimeout(() => {\n loadMessage({ chatId, messageId });\n }, summary.closePeriod * 1000);\n }\n\n return () => {\n if (timer) {\n window.clearTimeout(timer);\n }\n };\n }, [canVote, chatId, loadMessage, messageId, summary.closePeriod, summary.closed, summary.quiz]);\n\n const recentVoters = useMemo(() => {\n return recentVoterIds ? recentVoterIds.reduce((result: ApiUser[], id) => {\n const user = usersById[id];\n if (user) {\n result.push(user);\n }\n\n return result;\n }, []) : [];\n }, [usersById, recentVoterIds]);\n\n const handleRadioChange = useCallback(\n (option: string) => {\n setChosenOptions([option]);\n setIsSubmitting(true);\n setWasSubmitted(true);\n onSendVote([option]);\n }, [onSendVote],\n );\n\n const handleCheckboxChange = useCallback(\n (options: string[]) => {\n setChosenOptions(options);\n }, [],\n );\n\n const handleVoteClick = useCallback(\n () => {\n setIsSubmitting(true);\n setWasSubmitted(true);\n onSendVote(chosenOptions);\n }, [onSendVote, chosenOptions],\n );\n\n const handleViewResultsClick = useCallback(\n () => {\n openPollResults({ chatId, messageId });\n }, [chatId, messageId, openPollResults],\n );\n\n const handleSolutionShow = useCallback(() => {\n setIsSolutionShown(true);\n }, []);\n\n const handleSolutionHide = useCallback(() => {\n setIsSolutionShown(false);\n setWasSubmitted(false);\n }, []);\n\n // Show the solution to quiz if the answer was incorrect\n useEffect(() => {\n if (wasSubmitted && hasVoted && summary.quiz && results.results && poll.results.solution) {\n const correctResult = results.results.find((r) => r.isChosen && r.isCorrect);\n if (!correctResult) {\n setIsSolutionShown(true);\n }\n }\n }, [hasVoted, wasSubmitted, results.results, summary.quiz, poll.results.solution]);\n\n const lang = useLang();\n\n function renderResultOption(answer: ApiPollAnswer) {\n return (\n \n );\n }\n\n function renderRecentVoters() {\n return (\n recentVoters.length > 0 && (\n
\n {recentVoters.map((user) => (\n \n ))}\n
\n )\n );\n }\n\n function renderSolution() {\n return (\n isSolutionShown && poll.results.solution && (\n \n )\n );\n }\n\n return (\n
\n {renderSolution()}\n
{renderText(summary.question)}
\n
\n {lang(getPollTypeString(summary))}\n {renderRecentVoters()}\n {closePeriod > 0 && canVote &&
}\n {summary.quiz && poll.results.solution && !canVote && (\n \n \n \n )}\n
\n {canVote && (\n
\n {isMultiple\n ? (\n \n )\n : (\n \n )}\n
\n )}\n {!canVote && (\n
\n {summary.answers.map(renderResultOption)}\n
\n )}\n {!canViewResult && !isMultiple && (\n
{getReadableVotersCount(lang, summary.quiz, results.totalVoters)}
\n )}\n {isMultiple && (\n \n {lang('PollSubmitVotes')}\n \n )}\n {canViewResult && (\n \n {lang('PollViewResults')}\n \n )}\n
\n );\n};\n\nfunction getPollTypeString(summary: ApiPoll['summary']) {\n // When we just created the poll, some properties don't exist.\n if (typeof summary.isPublic === 'undefined') {\n return NBSP;\n }\n\n if (summary.quiz) {\n return summary.isPublic ? 'QuizPoll' : 'AnonymousQuizPoll';\n }\n\n if (summary.closed) {\n return 'FinalResults';\n }\n\n return summary.isPublic ? 'PublicPoll' : 'AnonymousPoll';\n}\n\nfunction getReadableVotersCount(lang: LangFn, isQuiz: true | undefined, count?: number) {\n if (!count) {\n return lang(isQuiz ? 'Chat.Quiz.TotalVotesEmpty' : 'Chat.Poll.TotalVotesResultEmpty');\n }\n\n return lang(isQuiz ? 'Answer' : 'Vote', count, 'i');\n}\n\nexport default memo(withGlobal(\n (global, { poll }) => {\n const { recentVoterIds } = poll.results;\n const { serverTimeOffset, users: { byId: usersById } } = global;\n if (!recentVoterIds || recentVoterIds.length === 0) {\n return {};\n }\n\n return {\n recentVoterIds,\n usersById,\n serverTimeOffset,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadMessage', 'openPollResults']),\n)(Poll));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\n\nimport { getMessageWebPage } from '../../../modules/helpers';\nimport { calculateMediaDimensions } from './helpers/mediaDimensions';\nimport renderText from '../../common/helpers/renderText';\nimport trimText from '../../../util/trimText';\nimport buildClassName from '../../../util/buildClassName';\n\nimport SafeLink from '../../common/SafeLink';\nimport Photo from './Photo';\nimport Video from './Video';\n\nimport './WebPage.scss';\n\nconst MAX_TEXT_LENGTH = 170; // symbols\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n noAvatars?: boolean;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n inPreview?: boolean;\n lastSyncTime?: number;\n onMediaClick?: () => void;\n onCancelMediaTransfer?: () => void;\n};\n\nconst WebPage: FC = ({\n message,\n observeIntersection,\n noAvatars,\n shouldAutoLoad,\n shouldAutoPlay,\n inPreview,\n lastSyncTime,\n onMediaClick,\n onCancelMediaTransfer,\n}) => {\n const webPage = getMessageWebPage(message);\n\n let isSquarePhoto = false;\n if (webPage && webPage.photo && !webPage.video) {\n const { width, height } = calculateMediaDimensions(message);\n isSquarePhoto = width === height;\n }\n\n const handleMediaClick = useCallback(() => {\n onMediaClick!();\n }, [onMediaClick]);\n\n if (!webPage) {\n return undefined;\n }\n\n const {\n siteName,\n url,\n displayUrl,\n title,\n description,\n photo,\n video,\n } = webPage;\n const isMediaInteractive = (photo || video) && onMediaClick && !isSquarePhoto;\n const truncatedDescription = trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebPage',\n isSquarePhoto && 'with-square-photo',\n !photo && !video && !inPreview && 'without-media',\n video && 'with-video',\n );\n\n return (\n \n {photo && !video && (\n \n )}\n
\n \n {!inPreview && title && (\n

{renderText(title)}

\n )}\n {truncatedDescription && (\n

{renderText(truncatedDescription, ['emoji', 'br'])}

\n )}\n
\n {!inPreview && video && (\n \n )}\n
\n );\n};\n\nexport default memo(WebPage);\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { getMessageInvoice } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\n\nimport './Invoice.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n};\n\nconst Invoice: FC = ({\n message,\n}) => {\n const invoice = getMessageInvoice(message);\n\n const {\n title,\n text,\n description,\n photoUrl,\n } = invoice!;\n\n return (\n \n {title && (\n

{renderText(title)}

\n )}\n {text && (\n

{renderText(text, ['emoji', 'br'])}

\n )}\n
\n {photoUrl && (\n \n )}\n {description && (\n

{renderText(description, ['emoji', 'br'])}

\n )}\n
\n
\n );\n};\n\nexport default memo(Invoice);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC,\n useCallback,\n useMemo,\n memo,\n} from '../../../../lib/teact/teact';\nimport { withGlobal } from '../../../../lib/teact/teactn';\n\nimport { OwnProps as PhotoProps } from '../Photo';\nimport { OwnProps as VideoProps } from '../Video';\n\nimport buildClassName from '../../../../util/buildClassName';\nimport { GlobalActions } from '../../../../global/types';\nimport {\n selectIsInSelectMode,\n selectIsMessageSelected,\n} from '../../../../modules/selectors';\n\nimport { pick } from '../../../../util/iteratees';\n\ntype OwnProps = PhotoProps & VideoProps;\n\ntype StateProps = {\n isInSelectMode?: boolean;\n isSelected?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nexport default function withSelectControl(WrappedComponent: FC) {\n const ComponentWithSelectControl: FC = (props) => {\n const {\n isInSelectMode,\n isSelected,\n message,\n toggleMessageSelection,\n dimensions,\n } = props;\n\n const handleMessageSelect = useCallback((e: ReactMouseEvent) => {\n e.stopPropagation();\n toggleMessageSelection({ messageId: message.id, withShift: e && e.shiftKey });\n }, [toggleMessageSelection, message]);\n\n const newProps = useMemo(() => {\n return {\n ...props,\n isInSelectMode,\n isSelected,\n dimensions: {\n ...props.dimensions,\n x: 0,\n y: 0,\n },\n onClick: isInSelectMode ? undefined : props.onClick,\n };\n }, [props, isInSelectMode, isSelected]);\n\n return (\n \n {isInSelectMode && (\n
\n {isSelected && (\n \n )}\n
\n )}\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n \n \n );\n };\n\n return memo(withGlobal(\n (global, ownProps) => {\n const { message } = ownProps;\n return {\n isInSelectMode: selectIsInSelectMode(global),\n isSelected: selectIsMessageSelected(global, message.id),\n };\n },\n (setGlobal, actions) => pick(actions, [\n 'toggleMessageSelection',\n ]),\n )(ComponentWithSelectControl));\n}\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\n\nimport { GlobalActions, GlobalState } from '../../../global/types';\nimport { ApiMessage } from '../../../api/types';\nimport { IAlbum } from '../../../types';\nimport { AlbumRectPart, IAlbumLayout } from './helpers/calculateAlbumLayout';\n\nimport { getMessageContent } from '../../../modules/helpers';\nimport { withGlobal } from '../../../lib/teact/teactn';\nimport { pick } from '../../../util/iteratees';\nimport withSelectControl from './hocs/withSelectControl';\nimport { ObserveFn } from '../../../hooks/useIntersectionObserver';\n\nimport Photo from './Photo';\nimport Video from './Video';\n\nimport './Album.scss';\n\nconst PhotoWithSelect = withSelectControl(Photo);\nconst VideoWithSelect = withSelectControl(Video);\n\ntype OwnProps = {\n album: IAlbum;\n observeIntersection: ObserveFn;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n hasCustomAppendix?: boolean;\n lastSyncTime?: number;\n isOwn: boolean;\n albumLayout: IAlbumLayout;\n onMediaClick: (messageId: number) => void;\n};\n\ntype StateProps = {\n uploadsById: GlobalState['fileUploads']['byMessageLocalId'];\n};\n\ntype DispatchProps = Pick;\n\nconst Album: FC = ({\n album,\n observeIntersection,\n shouldAutoLoad,\n shouldAutoPlay,\n hasCustomAppendix,\n lastSyncTime,\n isOwn,\n albumLayout,\n onMediaClick,\n uploadsById,\n cancelSendingMessage,\n}) => {\n const mediaCount = album.messages.length;\n\n const handleCancelUpload = useCallback((message: ApiMessage) => {\n cancelSendingMessage({ chatId: message.chatId, messageId: message.id });\n }, [cancelSendingMessage]);\n\n function renderAlbumMessage(message: ApiMessage, index: number) {\n const { photo, video } = getMessageContent(message);\n const fileUpload = uploadsById[message.previousLocalId || message.id];\n const uploadProgress = fileUpload ? fileUpload.progress : undefined;\n const { dimensions, sides } = albumLayout.layout[index];\n\n if (photo) {\n const shouldAffectAppendix = hasCustomAppendix && (\n // eslint-disable-next-line no-bitwise\n isOwn ? index === mediaCount - 1 : Boolean(sides & AlbumRectPart.Left && sides & AlbumRectPart.Bottom)\n );\n\n return (\n \n );\n } else if (video) {\n return (\n \n );\n }\n\n return undefined;\n }\n\n const { width: containerWidth, height: containerHeight } = albumLayout.containerStyle;\n\n return (\n \n {album.messages.map(renderAlbumMessage)}\n \n );\n};\n\nexport default withGlobal(\n (global): StateProps => {\n return {\n uploadsById: global.fileUploads.byMessageLocalId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'cancelSendingMessage',\n ]),\n)(Album);\n","import React, {\n FC,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { ROUND_VIDEO_DIMENSIONS } from '../../common/helpers/mediaDimensions';\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithDownloadProgress from '../../../hooks/useMediaWithDownloadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useTransitionForMedia from '../../../hooks/useTransitionForMedia';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBuffering from '../../../hooks/useBuffering';\nimport buildClassName from '../../../util/buildClassName';\nimport useHeavyAnimationCheckForVideo from '../../../hooks/useHeavyAnimationCheckForVideo';\nimport useVideoCleanup from '../../../hooks/useVideoCleanup';\nimport usePauseOnInactive from './hooks/usePauseOnInactive';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\nimport safePlay from '../../../util/safePlay';\nimport { fastRaf } from '../../../util/schedulers';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nimport './RoundVideo.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection: ObserveFn;\n shouldAutoLoad?: boolean;\n shouldAutoPlay?: boolean;\n lastSyncTime?: number;\n};\n\nlet currentOnRelease: NoneToVoidFunction;\n\nfunction createCapture(onRelease: NoneToVoidFunction) {\n return () => {\n if (currentOnRelease) {\n currentOnRelease();\n }\n\n currentOnRelease = onRelease;\n };\n}\n\nconst RoundVideo: FC = ({\n message,\n observeIntersection,\n shouldAutoLoad,\n shouldAutoPlay,\n lastSyncTime,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const playingProgressRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const playerRef = useRef(null);\n\n const video = message.content.video!;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isDownloadAllowed, setIsDownloadAllowed] = useState(shouldAutoLoad && shouldAutoPlay);\n const shouldDownload = Boolean(isDownloadAllowed && isIntersecting && lastSyncTime);\n const { mediaData, downloadProgress } = useMediaWithDownloadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldDownload,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n const thumbRef = useBlurredMediaThumbRef(message, mediaData);\n\n const { isBuffered, bufferingHandlers } = useBuffering();\n const isTransferring = isDownloadAllowed && !isBuffered;\n const wasDownloadDisabled = usePrevious(isDownloadAllowed) === false;\n const {\n shouldRender: shouldSpinnerRender,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring || !isBuffered, undefined, wasDownloadDisabled);\n const { shouldRenderThumb, transitionClassNames } = useTransitionForMedia(mediaData, 'slow');\n\n const [isActivated, setIsActivated] = useState(false);\n const [progress, setProgress] = useState(0);\n\n useEffect(() => {\n if (!isActivated) {\n return;\n }\n\n const circumference = 94 * 2 * Math.PI;\n const strokeDashOffset = circumference - progress * circumference;\n\n const playerEl = playerRef.current!;\n const playingProgressEl = playingProgressRef.current!;\n const svgEl = playingProgressEl.firstElementChild;\n\n if (!svgEl) {\n playingProgressEl.innerHTML = `\n \n `;\n } else {\n (svgEl.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', strokeDashOffset.toString());\n }\n\n setProgress(playerEl.currentTime / playerEl.duration);\n }, [isActivated, progress]);\n\n const shouldPlay = Boolean(mediaData && isIntersecting);\n\n const stopPlaying = () => {\n setIsActivated(false);\n setProgress(0);\n safePlay(playerRef.current!);\n\n fastRaf(() => {\n playingProgressRef.current!.innerHTML = '';\n });\n };\n\n const capturePlaying = createCapture(stopPlaying);\n\n useEffect(() => {\n if (!playerRef.current) {\n return;\n }\n\n if (shouldPlay) {\n safePlay(playerRef.current);\n } else {\n playerRef.current.pause();\n }\n }, [shouldPlay]);\n\n useHeavyAnimationCheckForVideo(playerRef, shouldPlay);\n usePauseOnInactive(playerRef, Boolean(mediaData));\n useVideoCleanup(playerRef, [mediaData]);\n\n const handleClick = useCallback(() => {\n if (!mediaData) {\n setIsDownloadAllowed((isAllowed) => !isAllowed);\n\n return;\n }\n\n const playerEl = playerRef.current!;\n if (isActivated) {\n if (playerEl.paused) {\n safePlay(playerEl);\n } else {\n playerEl.pause();\n }\n } else {\n capturePlaying();\n // Pause is a workaround for iOS Safari – otherwise it stops video after several frames\n playerEl.pause();\n playerEl.currentTime = 0;\n safePlay(playerEl);\n\n setIsActivated(true);\n }\n }, [capturePlaying, isActivated, mediaData]);\n\n const handleTimeUpdate = useCallback((e: React.UIEvent) => {\n const playerEl = e.currentTarget;\n\n setProgress(playerEl.currentTime / playerEl.duration);\n }, []);\n\n const videoClassName = buildClassName('full-media', transitionClassNames);\n\n return (\n \n {(shouldRenderThumb || mediaData) && (\n
\n \n
\n )}\n {mediaData && (\n
\n {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n \n \n \n
\n )}\n
\n {shouldSpinnerRender && (\n
\n \n
\n )}\n {!mediaData && !isDownloadAllowed && (\n \n )}\n
\n {isActivated ? formatMediaDuration(playerRef.current!.currentTime) : formatMediaDuration(video.duration)}\n {(!isActivated || playerRef.current!.paused) && }\n
\n
\n );\n};\n\nexport default RoundVideo;\n","import React, { FC } from '../../../lib/teact/teact';\n\nimport { ApiKeyboardButton, ApiMessage } from '../../../api/types';\n\nimport { RE_TME_LINK } from '../../../config';\nimport renderText from '../../common/helpers/renderText';\n\nimport Button from '../../ui/Button';\n\nimport './InlineButtons.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n onClick: ({ button }: { button: ApiKeyboardButton }) => void;\n};\n\nconst InlineButtons: FC = ({ message, onClick }) => {\n return (\n
\n {message.inlineButtons!.map((row) => (\n
\n {row.map((button) => (\n onClick({ button })}\n >\n {renderText(button.text)}\n {button.type === 'url' && !button.value!.match(RE_TME_LINK) && }\n \n ))}\n
\n ))}\n
\n );\n};\n\nexport default InlineButtons;\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiMessage, ApiThreadInfo, ApiUser,\n} from '../../../api/types';\nimport { GlobalActions } from '../../../global/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { isChatPrivate } from '../../../modules/helpers';\nimport { formatIntegerCompact } from '../../../util/textFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport { selectThreadInfo, selectThreadOriginChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\n\nimport Avatar from '../../common/Avatar';\n\nimport './CommentButton.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n disabled?: boolean;\n};\n\ntype StateProps = {\n threadInfo: ApiThreadInfo;\n usersById?: Record;\n chatsById?: Record;\n shouldRequestThreadUpdate: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst CommentButton: FC = ({\n disabled,\n threadInfo,\n usersById,\n chatsById,\n shouldRequestThreadUpdate,\n openChat,\n requestThreadInfoUpdate,\n}) => {\n const lang = useLang();\n const {\n threadId, chatId, messagesCount, lastMessageId, lastReadInboxMessageId, recentReplierIds,\n } = threadInfo;\n\n const handleClick = useCallback(() => {\n openChat({ id: chatId, threadId });\n }, [openChat, chatId, threadId]);\n\n\n useEffect(() => {\n if (shouldRequestThreadUpdate) {\n requestThreadInfoUpdate({ chatId, threadId });\n }\n }, [chatId, requestThreadInfoUpdate, shouldRequestThreadUpdate, threadId]);\n\n if (messagesCount === undefined) {\n return undefined;\n }\n\n const recentRepliers = recentReplierIds && recentReplierIds.map((peerId) => {\n return isChatPrivate(peerId) ? usersById![peerId] : chatsById![peerId];\n }).filter(Boolean);\n\n function renderRecentRepliers() {\n return (\n recentRepliers && recentRepliers.length > 0 && (\n
\n {recentRepliers.map((user) => (\n \n ))}\n
\n )\n );\n }\n\n const hasUnread = Boolean(lastReadInboxMessageId && lastMessageId && lastReadInboxMessageId < lastMessageId);\n\n return (\n \n \n {(!recentRepliers || recentRepliers.length === 0) && }\n {renderRecentRepliers()}\n
\n {messagesCount ? lang('Comments', messagesCount, 'i') : lang('LeaveAComment')}\n
\n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { message }) => {\n const { threadId, chatId } = message.threadInfo!;\n\n const threadInfo = selectThreadInfo(global, chatId, threadId) || message.threadInfo!;\n const chat = selectThreadOriginChat(global, chatId, threadId);\n const { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n\n return {\n threadInfo,\n usersById,\n chatsById,\n shouldRequestThreadUpdate: !!chat && !threadInfo.topMessageId,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat',\n 'requestThreadInfoUpdate',\n ]),\n)(CommentButton));\n","import React, {\n FC,\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../../global/types';\nimport {\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n ApiChat,\n ApiSticker,\n MAIN_THREAD_ID,\n} from '../../../api/types';\nimport {\n FocusDirection, IAlbum, ISettings, MediaViewerOrigin,\n} from '../../../types';\n\nimport { IS_ANDROID, IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport {\n selectChat,\n selectChatMessage,\n selectUploadProgress,\n selectIsChatWithSelf,\n selectOutgoingStatus,\n selectUser,\n selectIsMessageFocused,\n selectCurrentTextSearch,\n selectAnimatedEmoji,\n selectIsInSelectMode,\n selectIsMessageSelected,\n selectIsDocumentGroupSelected,\n selectSender,\n selectForwardedSender,\n selectThreadTopMessageId,\n selectShouldAutoLoadMedia,\n selectShouldAutoPlayMedia,\n selectShouldLoopStickers,\n selectTheme,\n} from '../../../modules/selectors';\nimport {\n getMessageContent,\n isOwnMessage,\n isReplyMessage,\n isAnonymousOwnMessage,\n isMessageLocal,\n isChatPrivate,\n getMessageCustomShape,\n isChatChannel,\n getMessageSingleEmoji,\n getSenderTitle,\n getUserColorKey,\n} from '../../../modules/helpers';\nimport buildClassName from '../../../util/buildClassName';\nimport windowSize from '../../../util/windowSize';\nimport useEnsureMessage from '../../../hooks/useEnsureMessage';\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport { renderMessageText } from '../../common/helpers/renderMessageText';\nimport { ROUND_VIDEO_DIMENSIONS } from '../../common/helpers/mediaDimensions';\nimport { buildContentClassName, isEmojiOnlyMessage } from './helpers/buildContentClassName';\nimport { getMinMediaWidth, calculateMediaDimensions } from './helpers/mediaDimensions';\nimport { calculateAlbumLayout } from './helpers/calculateAlbumLayout';\nimport { preventMessageInputBlur } from '../helpers/preventMessageInputBlur';\nimport renderText from '../../common/helpers/renderText';\nimport calculateAuthorWidth from './helpers/calculateAuthorWidth';\nimport { ObserveFn, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport useFocusMessage from './hooks/useFocusMessage';\nimport useLang from '../../../hooks/useLang';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\n\nimport Button from '../../ui/Button';\nimport Avatar from '../../common/Avatar';\nimport EmbeddedMessage from '../../common/EmbeddedMessage';\nimport Document from '../../common/Document';\nimport Audio from '../../common/Audio';\nimport MessageMeta from './MessageMeta';\nimport ContextMenuContainer from './ContextMenuContainer.async';\nimport Sticker from './Sticker';\nimport AnimatedEmoji from '../../common/AnimatedEmoji';\nimport Photo from './Photo';\nimport Video from './Video';\nimport Contact from './Contact';\nimport Poll from './Poll';\nimport WebPage from './WebPage';\nimport Invoice from './Invoice';\nimport Album from './Album';\nimport RoundVideo from './RoundVideo';\nimport InlineButtons from './InlineButtons';\nimport CommentButton from './CommentButton';\n\nimport './Message.scss';\n\ntype MessagePositionProperties = {\n isFirstInGroup: boolean;\n isLastInGroup: boolean;\n isFirstInDocumentGroup: boolean;\n isLastInDocumentGroup: boolean;\n isLastInList: boolean;\n};\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersectionForBottom: ObserveFn;\n observeIntersectionForMedia: ObserveFn;\n observeIntersectionForAnimatedStickers: ObserveFn;\n album?: IAlbum;\n noAvatars?: boolean;\n withAvatar?: boolean;\n withSenderName?: boolean;\n threadId: number;\n messageListType: MessageListType;\n noComments: boolean;\n appearanceOrder: number;\n} & MessagePositionProperties;\n\ntype StateProps = {\n theme: ISettings['theme'];\n forceSenderName?: boolean;\n chatUsername?: string;\n sender?: ApiUser | ApiChat;\n originSender?: ApiUser | ApiChat;\n botSender?: ApiUser;\n isThreadTop?: boolean;\n shouldHideReply?: boolean;\n replyMessage?: ApiMessage;\n replyMessageSender?: ApiUser | ApiChat;\n outgoingStatus?: ApiMessageOutgoingStatus;\n uploadProgress?: number;\n isFocused?: boolean;\n focusDirection?: FocusDirection;\n noFocusHighlight?: boolean;\n isForwarding?: boolean;\n isChatWithSelf?: boolean;\n isChannel?: boolean;\n lastSyncTime?: number;\n highlight?: string;\n isSingleEmoji?: boolean;\n animatedEmoji?: ApiSticker;\n isInSelectMode?: boolean;\n isSelected?: boolean;\n isGroupSelected?: boolean;\n threadId?: number;\n isPinnedList?: boolean;\n shouldAutoLoadMedia?: boolean;\n shouldAutoPlayMedia?: boolean;\n shouldLoopStickers?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst NBSP = '\\u00A0';\nconst GROUP_MESSAGE_HOVER_ATTRIBUTE = 'data-is-document-group-hover';\n// eslint-disable-next-line max-len\nconst APPENDIX_OWN = '';\n// eslint-disable-next-line max-len\nconst APPENDIX_NOT_OWN = '';\nconst APPEARANCE_DELAY = 10;\nconst NO_MEDIA_CORNERS_THRESHOLD = 18;\nconst ANDROID_KEYBOARD_HIDE_DELAY_MS = 350;\n\nconst Message: FC = ({\n message,\n chatUsername,\n observeIntersectionForBottom,\n observeIntersectionForMedia,\n observeIntersectionForAnimatedStickers,\n album,\n noAvatars,\n withAvatar,\n withSenderName,\n noComments,\n appearanceOrder,\n isFirstInGroup,\n isLastInGroup,\n isFirstInDocumentGroup,\n isLastInDocumentGroup,\n isLastInList,\n theme,\n forceSenderName,\n sender,\n originSender,\n botSender,\n isThreadTop,\n shouldHideReply,\n replyMessage,\n replyMessageSender,\n outgoingStatus,\n uploadProgress,\n isFocused,\n focusDirection,\n noFocusHighlight,\n isForwarding,\n isChatWithSelf,\n isChannel,\n lastSyncTime,\n highlight,\n animatedEmoji,\n isInSelectMode,\n isSelected,\n isGroupSelected,\n threadId,\n messageListType,\n isPinnedList,\n shouldAutoLoadMedia,\n shouldAutoPlayMedia,\n shouldLoopStickers,\n focusMessage,\n openMediaViewer,\n openAudioPlayer,\n openUserInfo,\n openChat,\n cancelSendingMessage,\n markMessagesRead,\n sendPollVote,\n toggleMessageSelection,\n setReplyingToId,\n openForwardMenu,\n clickInlineButton,\n disableContextMenuHint,\n showNotification,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const bottomMarkerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const appendixRef = useRef(null);\n const lang = useLang();\n\n\n useOnIntersect(bottomMarkerRef, observeIntersectionForBottom);\n\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu: onContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(ref, IS_TOUCH_ENV && isInSelectMode, true, IS_ANDROID);\n\n useEffect(() => {\n if (isContextMenuOpen) {\n disableContextMenuHint();\n }\n }, [isContextMenuOpen, disableContextMenuHint]);\n\n const noAppearanceAnimation = appearanceOrder <= 0;\n const [isShown, markShown] = useFlag(noAppearanceAnimation);\n useEffect(() => {\n if (noAppearanceAnimation) {\n return;\n }\n\n setTimeout(markShown, appearanceOrder * APPEARANCE_DELAY);\n }, [appearanceOrder, markShown, noAppearanceAnimation]);\n const { transitionClassNames } = useShowTransition(isShown, undefined, noAppearanceAnimation, false);\n\n const { chatId, id: messageId, threadInfo } = message;\n\n const isLocal = isMessageLocal(message);\n const isOwn = isOwnMessage(message);\n const isScheduled = messageListType === 'scheduled' || message.isScheduled;\n const hasReply = isReplyMessage(message) && !shouldHideReply;\n const hasThread = Boolean(threadInfo) && messageListType === 'thread';\n const { forwardInfo, viaBotId } = message;\n const asForwarded = forwardInfo && !isChatWithSelf && !forwardInfo.isLinkedChannelPost;\n const isInDocumentGroup = !!message.groupedId && !message.isInAlbum;\n const isAlbum = Boolean(album) && album!.messages.length > 1;\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, webPage, invoice,\n } = getMessageContent(message);\n const customShape = getMessageCustomShape(message);\n const textParts = renderMessageText(message, highlight, isEmojiOnlyMessage(customShape));\n const isContextMenuShown = contextMenuPosition !== undefined;\n const signature = (\n (isChannel && message.adminTitle) || (forwardInfo && !asForwarded && forwardInfo.adminTitle) || undefined\n );\n const metaSafeAuthorWidth = useMemo(() => {\n return signature ? calculateAuthorWidth(signature) : undefined;\n }, [signature]);\n const canShowActionButton = (\n !(isContextMenuShown || isInSelectMode || isForwarding)\n && (!isInDocumentGroup || isLastInDocumentGroup)\n );\n const canForward = canShowActionButton && isChannel && !isScheduled;\n const canFocus = Boolean(canShowActionButton && (\n (forwardInfo && (forwardInfo.isChannelPost || (isChatWithSelf && !isOwn)) && forwardInfo.fromMessageId)\n || isPinnedList\n ));\n const avatarPeer = forwardInfo && (isChatWithSelf || !sender) ? originSender : sender;\n const senderPeer = forwardInfo ? originSender : sender;\n\n const containerClassName = buildClassName(\n 'Message message-list-item',\n isFirstInGroup && 'first-in-group',\n isLastInGroup && 'last-in-group',\n isFirstInDocumentGroup && 'first-in-document-group',\n isLastInDocumentGroup && 'last-in-document-group',\n isLastInList && 'last-in-list',\n isOwn && 'own',\n Boolean(message.views) && 'has-views',\n message.isEdited && 'was-edited',\n hasReply && 'has-reply',\n isContextMenuShown && 'has-menu-open',\n isFocused && !noFocusHighlight && 'focused',\n isForwarding && 'is-forwarding',\n message.isDeleting && 'is-deleting',\n isInDocumentGroup && 'is-in-document-group',\n isAlbum && 'is-album',\n message.hasUnreadMention && 'has-unread-mention',\n isSelected && 'is-selected',\n isInSelectMode && 'is-in-selection-mode',\n isThreadTop && 'is-thread-top',\n Boolean(message.inlineButtons) && 'has-inline-buttons',\n transitionClassNames,\n );\n const contentClassName = buildContentClassName(message, {\n hasReply,\n customShape,\n isLastInGroup,\n asForwarded,\n hasThread,\n forceSenderName,\n hasComments: message.threadInfo && message.threadInfo.messagesCount > 0,\n hasActionButton: canForward || canFocus,\n });\n const withCommentButton = message.threadInfo && (!isInDocumentGroup || isLastInDocumentGroup)\n && messageListType === 'thread' && !noComments;\n const withAppendix = contentClassName.includes('has-appendix');\n\n useEnsureMessage(chatId, hasReply ? message.replyToMessageId : undefined, replyMessage, message.id);\n useFocusMessage(ref, chatId, isFocused, focusDirection, noFocusHighlight);\n useLayoutEffect(() => {\n if (!appendixRef.current) {\n return;\n }\n\n appendixRef.current.innerHTML = isOwn ? APPENDIX_OWN : APPENDIX_NOT_OWN;\n }, [isOwn, withAppendix]);\n\n const handleGroupDocumentMessagesSelect = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n\n toggleMessageSelection({\n messageId,\n groupedId: message.groupedId,\n });\n }, [messageId, message.groupedId, toggleMessageSelection]);\n\n const handleMessageSelect = useCallback((e?: React.MouseEvent) => {\n if (isLocal) {\n return;\n }\n\n const params = isAlbum && album && album.messages\n ? {\n messageId,\n childMessageIds: album.messages.map(({ id }) => id),\n withShift: e && e.shiftKey,\n }\n : { messageId, withShift: e && e.shiftKey };\n toggleMessageSelection(params);\n }, [isLocal, isAlbum, album, messageId, toggleMessageSelection]);\n\n const handleContainerDoubleClick = useCallback(() => {\n setReplyingToId({ messageId });\n }, [setReplyingToId, messageId]);\n\n const handleContentDoubleClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n }, []);\n\n const handleMouseDown = (e: React.MouseEvent) => {\n preventMessageInputBlur(e);\n\n if (!isLocal) {\n handleBeforeContextMenu(e);\n }\n };\n\n const handleAvatarClick = useCallback(() => {\n if (!avatarPeer) {\n return;\n }\n\n if (isChatPrivate(avatarPeer.id)) {\n openUserInfo({ id: avatarPeer.id });\n } else {\n openChat({ id: avatarPeer.id });\n }\n }, [avatarPeer, openUserInfo, openChat]);\n\n const handleSenderClick = useCallback(() => {\n if (!senderPeer) {\n showNotification({ message: lang('HidAccount') });\n\n return;\n }\n\n if (isChatPrivate(senderPeer.id)) {\n openUserInfo({ id: senderPeer.id });\n } else {\n openChat({ id: senderPeer.id });\n }\n }, [senderPeer, showNotification, lang, openUserInfo, openChat]);\n\n const handleViaBotClick = useCallback(() => {\n if (!botSender) {\n return;\n }\n\n openUserInfo({ id: botSender.id });\n }, [botSender, openUserInfo]);\n\n const handleReplyClick = useCallback((): void => {\n focusMessage({\n chatId, threadId, messageId: message.replyToMessageId, replyMessageId: messageId,\n });\n }, [focusMessage, chatId, threadId, message.replyToMessageId, messageId]);\n\n const handleMediaClick = useCallback((): void => {\n openMediaViewer({\n chatId, threadId, messageId, origin: isScheduled ? MediaViewerOrigin.ScheduledInline : MediaViewerOrigin.Inline,\n });\n }, [chatId, threadId, messageId, openMediaViewer, isScheduled]);\n\n const handleAudioPlay = useCallback((): void => {\n openAudioPlayer({ chatId, messageId });\n }, [chatId, messageId, openAudioPlayer]);\n\n const handleAlbumMediaClick = useCallback((albumMessageId: number): void => {\n openMediaViewer({\n chatId,\n threadId,\n messageId: albumMessageId,\n origin: isScheduled ? MediaViewerOrigin.ScheduledAlbum : MediaViewerOrigin.Album,\n });\n }, [chatId, threadId, openMediaViewer, isScheduled]);\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n const target = e.target as HTMLDivElement;\n if (!target.classList.contains('text-content') && !target.classList.contains('Message')) {\n return;\n }\n\n if (IS_ANDROID) {\n if (windowSize.getIsKeyboardVisible()) {\n setTimeout(() => { onContextMenu(e); }, ANDROID_KEYBOARD_HIDE_DELAY_MS);\n } else {\n onContextMenu(e);\n }\n } else {\n onContextMenu(e);\n }\n }, [onContextMenu]);\n\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n if (IS_ANDROID) {\n handleMessageSelect(e);\n } else {\n onContextMenu(e);\n }\n }, [onContextMenu, handleMessageSelect]);\n\n const handleReadMedia = useCallback((): void => {\n markMessagesRead({ messageIds: [messageId] });\n }, [messageId, markMessagesRead]);\n\n const handleCancelUpload = useCallback(() => {\n cancelSendingMessage({ chatId, messageId });\n }, [cancelSendingMessage, chatId, messageId]);\n\n const handleVoteSend = useCallback((options: string[]) => {\n sendPollVote({ chatId, messageId, options });\n }, [chatId, messageId, sendPollVote]);\n\n const handleGroupForward = useCallback(() => {\n openForwardMenu({ fromChatId: chatId, groupedId: message.groupedId });\n }, [openForwardMenu, chatId, message.groupedId]);\n\n const handleForward = useCallback(() => {\n if (album && album.messages) {\n const messageIds = album.messages.map(({ id }) => id);\n openForwardMenu({ fromChatId: chatId, messageIds });\n } else {\n openForwardMenu({ fromChatId: chatId, messageIds: [messageId] });\n }\n }, [album, openForwardMenu, chatId, messageId]);\n\n const handleFocus = useCallback(() => {\n focusMessage({\n chatId, threadId: MAIN_THREAD_ID, messageId,\n });\n }, [focusMessage, chatId, messageId]);\n\n const handleFocusForwarded = useCallback(() => {\n if (isInDocumentGroup) {\n focusMessage({\n chatId: forwardInfo!.fromChatId, groupedId: message.groupedId, groupedChatId: chatId,\n });\n return;\n }\n focusMessage({\n chatId: forwardInfo!.fromChatId, messageId: forwardInfo!.fromMessageId,\n });\n }, [focusMessage, forwardInfo, message, chatId, isInDocumentGroup]);\n\n let style = '';\n let calculatedWidth;\n let noMediaCorners = false;\n const albumLayout = useMemo(() => {\n return isAlbum ? calculateAlbumLayout(isOwn, Boolean(asForwarded), Boolean(noAvatars), album!) : undefined;\n }, [isAlbum, isOwn, asForwarded, noAvatars, album]);\n\n const extraPadding = asForwarded ? 28 : 0;\n if (!isAlbum && (photo || video)) {\n let width: number | undefined;\n if (photo) {\n width = calculateMediaDimensions(message, noAvatars).width;\n } else if (video) {\n if (video.isRound) {\n width = ROUND_VIDEO_DIMENSIONS;\n } else {\n width = calculateMediaDimensions(message, noAvatars).width;\n }\n }\n\n if (width) {\n calculatedWidth = Math.max(getMinMediaWidth(Boolean(text), withCommentButton), width);\n if (calculatedWidth - width > NO_MEDIA_CORNERS_THRESHOLD) {\n noMediaCorners = true;\n }\n }\n } else if (albumLayout) {\n calculatedWidth = Math.max(getMinMediaWidth(Boolean(text), withCommentButton), albumLayout.containerStyle.width);\n if (calculatedWidth - albumLayout.containerStyle.width > NO_MEDIA_CORNERS_THRESHOLD) {\n noMediaCorners = true;\n }\n }\n\n if (calculatedWidth) {\n style = `width: ${calculatedWidth + extraPadding}px`;\n }\n\n function renderAvatar() {\n const isAvatarPeerUser = avatarPeer && isChatPrivate(avatarPeer.id);\n const avatarUser = avatarPeer && isAvatarPeerUser ? avatarPeer as ApiUser : undefined;\n const avatarChat = avatarPeer && !isAvatarPeerUser ? avatarPeer as ApiChat : undefined;\n const hiddenName = !avatarPeer && forwardInfo ? forwardInfo.hiddenUserName : undefined;\n\n return (\n \n );\n }\n\n function renderContent() {\n const className = buildClassName(\n 'content-inner',\n asForwarded && !customShape && 'forwarded-message',\n hasReply && 'reply-message',\n noMediaCorners && 'no-media-corners',\n );\n const hasCustomAppendix = isLastInGroup && !textParts && !asForwarded && !hasThread;\n const shouldInlineMeta = !webPage && !animatedEmoji && textParts;\n const textContentClass = buildClassName(\n 'text-content',\n shouldInlineMeta && 'with-meta',\n outgoingStatus && 'with-outgoing-icon',\n );\n\n return (\n
\n {renderSenderName()}\n {hasReply && (\n \n )}\n {sticker && (\n \n )}\n {animatedEmoji && (\n \n )}\n {isAlbum && (\n \n )}\n {!isAlbum && photo && (\n \n )}\n {!isAlbum && video && video.isRound && (\n \n )}\n {!isAlbum && video && !video.isRound && (\n \n )}\n {(audio || voice) && (\n \n )}\n {document && (\n \n )}\n {contact && (\n \n )}\n {poll && (\n \n )}\n {!animatedEmoji && textParts && (\n

\n {textParts}\n {shouldInlineMeta && (\n \n )}\n

\n )}\n {webPage && (\n \n )}\n {invoice && (\n \n )}\n
\n );\n }\n\n function renderSenderName() {\n const shouldRender = !(customShape && !viaBotId) && (\n (withSenderName && !photo && !video) || asForwarded || viaBotId || forceSenderName\n ) && (!isInDocumentGroup || isFirstInDocumentGroup);\n\n if (!shouldRender) {\n return undefined;\n }\n\n let senderTitle;\n let senderColor;\n if (senderPeer && !(customShape && viaBotId)) {\n senderTitle = getSenderTitle(lang, senderPeer);\n\n if (!asForwarded) {\n senderColor = `color-${getUserColorKey(senderPeer)}`;\n }\n } else if (forwardInfo && forwardInfo.hiddenUserName) {\n senderTitle = forwardInfo.hiddenUserName;\n }\n\n return (\n
\n {senderTitle ? (\n \n {renderText(senderTitle)}\n \n ) : !botSender ? (\n NBSP\n ) : undefined}\n {botSender && (\n <>\n {lang('ViaBot')}\n \n {renderText(`@${botSender.username}`)}\n \n \n )}\n {forwardInfo && forwardInfo.isLinkedChannelPost ? (\n {lang('DiscussChannel')}\n ) : message.adminTitle && !isChannel ? (\n {message.adminTitle}\n ) : undefined}\n
\n );\n }\n\n return (\n \n \n {!isLocal && !isInDocumentGroup && (\n
\n {isSelected && }\n
\n )}\n {!isLocal && isLastInDocumentGroup && (\n \n {isGroupSelected && (\n \n )}\n \n )}\n {withAvatar && renderAvatar()}\n \n \n {asForwarded && !customShape && (!isInDocumentGroup || isFirstInDocumentGroup) && (\n
{lang('ForwardedMessage')}
\n )}\n {renderContent()}\n {(!isInDocumentGroup || isLastInDocumentGroup) && !(!webPage && !animatedEmoji && textParts) && (\n \n )}\n {canForward ? (\n \n \n \n ) : canFocus ? (\n \n \n \n ) : undefined}\n {withCommentButton && }\n {withAppendix &&
}\n
\n {message.inlineButtons && (\n \n )}\n \n {contextMenuPosition && (\n \n )}\n \n );\n};\n\nfunction handleDocumentGroupMouseEnter(e: React.MouseEvent) {\n const lastGroupElement = getLastElementInDocumentGroup(e.currentTarget);\n if (lastGroupElement) {\n lastGroupElement.setAttribute(GROUP_MESSAGE_HOVER_ATTRIBUTE, '');\n }\n}\n\nfunction handleDocumentGroupMouseLeave(e: React.MouseEvent) {\n const lastGroupElement = getLastElementInDocumentGroup(e.currentTarget);\n if (lastGroupElement) {\n lastGroupElement.removeAttribute(GROUP_MESSAGE_HOVER_ATTRIBUTE);\n }\n}\n\nfunction getLastElementInDocumentGroup(element: Element) {\n let current: Element | null = element;\n\n do {\n current = current.nextElementSibling;\n } while (current && !current.classList.contains('last-in-document-group'));\n\n return current;\n}\n\nexport default memo(withGlobal(\n (global, ownProps): StateProps => {\n const { focusedMessage, forwardMessages, lastSyncTime } = global;\n const {\n message, album, withSenderName, withAvatar, threadId, messageListType,\n } = ownProps;\n const {\n id, chatId, viaBotId, replyToMessageId, isOutgoing,\n } = message;\n\n const chat = selectChat(global, chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const isChannel = chat && isChatChannel(chat);\n const chatUsername = chat && chat.username;\n\n const forceSenderName = !isChatWithSelf && isAnonymousOwnMessage(message);\n const canShowSender = withSenderName || withAvatar || forceSenderName;\n const sender = canShowSender ? selectSender(global, message) : undefined;\n const originSender = selectForwardedSender(global, message);\n const botSender = viaBotId ? selectUser(global, viaBotId) : undefined;\n\n const threadTopMessageId = threadId ? selectThreadTopMessageId(global, chatId, threadId) : undefined;\n const isThreadTop = message.id === threadTopMessageId;\n\n const shouldHideReply = replyToMessageId === threadTopMessageId;\n const replyMessage = replyToMessageId && !shouldHideReply\n ? selectChatMessage(global, chatId, replyToMessageId)\n : undefined;\n const replyMessageSender = replyMessage && selectSender(global, replyMessage);\n\n const uploadProgress = selectUploadProgress(global, message);\n const isFocused = messageListType === 'thread' && (\n album\n ? album.messages.some((m) => selectIsMessageFocused(global, m))\n : selectIsMessageFocused(global, message)\n );\n\n const { direction: focusDirection, noHighlight: noFocusHighlight } = (isFocused && focusedMessage) || {};\n\n const isForwarding = forwardMessages.messageIds && forwardMessages.messageIds.includes(id);\n\n const { query: highlight } = selectCurrentTextSearch(global) || {};\n\n const singleEmoji = getMessageSingleEmoji(message);\n let isSelected: boolean;\n\n if (album && album.messages) {\n isSelected = album.messages.every(({ id: messageId }) => selectIsMessageSelected(global, messageId));\n } else {\n isSelected = selectIsMessageSelected(global, id);\n }\n\n return {\n theme: selectTheme(global),\n chatUsername,\n forceSenderName,\n sender,\n originSender,\n botSender,\n shouldHideReply,\n isThreadTop,\n replyMessage,\n replyMessageSender,\n isFocused,\n isForwarding,\n isChatWithSelf,\n isChannel,\n lastSyncTime,\n highlight,\n isSingleEmoji: Boolean(singleEmoji),\n animatedEmoji: singleEmoji ? selectAnimatedEmoji(global, singleEmoji) : undefined,\n isInSelectMode: selectIsInSelectMode(global),\n isSelected,\n isGroupSelected: (\n !!message.groupedId && !message.isInAlbum && selectIsDocumentGroupSelected(global, chatId, message.groupedId)\n ),\n threadId,\n isPinnedList: messageListType === 'pinned',\n shouldAutoLoadMedia: chat ? selectShouldAutoLoadMedia(global, message, chat, sender) : undefined,\n shouldAutoPlayMedia: selectShouldAutoPlayMedia(global, message),\n shouldLoopStickers: selectShouldLoopStickers(global),\n ...(isOutgoing && { outgoingStatus: selectOutgoingStatus(global, message, messageListType === 'scheduled') }),\n ...(typeof uploadProgress === 'number' && { uploadProgress }),\n ...(isFocused && { focusDirection, noFocusHighlight }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'focusMessage',\n 'openMediaViewer',\n 'openAudioPlayer',\n 'cancelSendingMessage',\n 'openUserInfo',\n 'openChat',\n 'markMessagesRead',\n 'sendPollVote',\n 'toggleMessageSelection',\n 'setReplyingToId',\n 'openForwardMenu',\n 'clickInlineButton',\n 'disableContextMenuHint',\n 'showNotification',\n ]),\n)(Message));\n","import { RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport { MessageListType } from '../../global/types';\n\nimport { SCHEDULED_WHEN_ONLINE } from '../../config';\nimport buildClassName from '../../util/buildClassName';\nimport { compact, flatten } from '../../util/iteratees';\nimport { formatHumanDate } from '../../util/dateFormat';\nimport { getMessageOriginalId, isActionMessage, isOwnMessage } from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport { isAlbum, MessageDateGroup } from './helpers/groupMessages';\nimport { preventMessageInputBlur } from './helpers/preventMessageInputBlur';\nimport useScrollHooks from './hooks/useScrollHooks';\nimport useMessageObservers from './hooks/useMessageObservers';\n\nimport Message from './message/Message';\nimport ActionMessage from './ActionMessage';\n\ninterface OwnProps {\n messageIds: number[];\n messageGroups: MessageDateGroup[];\n isViewportNewest: boolean;\n isUnread: boolean;\n withUsers: boolean;\n noAvatars: boolean;\n containerRef: RefObject;\n anchorIdRef: { current: string | undefined };\n memoFirstUnreadIdRef: { current: number | undefined };\n threadId: number;\n type: MessageListType;\n threadTopMessageId: number | undefined;\n hasLinkedChat: boolean | undefined;\n isSchedule: boolean;\n noAppearanceAnimation: boolean;\n onFabToggle: AnyToVoidFunction;\n onNotchToggle: AnyToVoidFunction;\n openHistoryCalendar: Function;\n}\n\nconst UNREAD_DIVIDER_CLASS = 'unread-divider';\n\nconst MessageListContent: FC = ({\n messageIds,\n messageGroups,\n isViewportNewest,\n isUnread,\n withUsers,\n noAvatars,\n containerRef,\n anchorIdRef,\n memoFirstUnreadIdRef,\n threadId,\n type,\n threadTopMessageId,\n hasLinkedChat,\n isSchedule,\n noAppearanceAnimation,\n onFabToggle,\n onNotchToggle,\n openHistoryCalendar,\n}) => {\n const {\n observeIntersectionForMedia,\n observeIntersectionForReading,\n observeIntersectionForAnimatedStickers,\n } = useMessageObservers(type, containerRef, memoFirstUnreadIdRef);\n\n const {\n backwardsTriggerRef,\n forwardsTriggerRef,\n fabTriggerRef,\n } = useScrollHooks(\n type,\n containerRef,\n messageIds,\n isViewportNewest,\n isUnread,\n onFabToggle,\n onNotchToggle,\n );\n\n const lang = useLang();\n\n const unreadDivider = (\n
\n {lang('UnreadMessages')}\n
\n );\n\n const messageCountToAnimate = noAppearanceAnimation ? 0 : messageGroups.reduce((acc, messageGroup) => {\n return acc + flatten(messageGroup.senderGroups).length;\n }, 0);\n let appearanceIndex = 0;\n\n const dateGroups = messageGroups.map((\n dateGroup: MessageDateGroup,\n dateGroupIndex: number,\n dateGroupsArray: MessageDateGroup[],\n ) => {\n const senderGroups = dateGroup.senderGroups.map((\n senderGroup,\n senderGroupIndex,\n senderGroupsArray,\n ) => {\n if (senderGroup.length === 1 && !isAlbum(senderGroup[0]) && isActionMessage(senderGroup[0])) {\n const message = senderGroup[0];\n const isLastInList = (\n senderGroupIndex === senderGroupsArray.length - 1\n && dateGroupIndex === dateGroupsArray.length - 1\n );\n\n return compact([\n message.id === memoFirstUnreadIdRef.current && unreadDivider,\n ,\n ]);\n }\n\n let currentDocumentGroupId: string | undefined;\n\n return flatten(senderGroup.map((\n messageOrAlbum,\n messageIndex,\n ) => {\n const message = isAlbum(messageOrAlbum) ? messageOrAlbum.mainMessage : messageOrAlbum;\n const album = isAlbum(messageOrAlbum) ? messageOrAlbum : undefined;\n const isOwn = isOwnMessage(message);\n const isMessageAlbum = isAlbum(messageOrAlbum);\n const nextMessage = senderGroup[messageIndex + 1];\n\n if (message.previousLocalId && anchorIdRef.current === `message${message.previousLocalId}`) {\n anchorIdRef.current = `message${message.id}`;\n }\n\n const documentGroupId = !isMessageAlbum && message.groupedId ? message.groupedId : undefined;\n const nextDocumentGroupId = nextMessage && !isAlbum(nextMessage) ? nextMessage.groupedId : undefined;\n\n const position = {\n isFirstInGroup: messageIndex === 0,\n isLastInGroup: messageIndex === senderGroup.length - 1,\n isFirstInDocumentGroup: Boolean(documentGroupId && documentGroupId !== currentDocumentGroupId),\n isLastInDocumentGroup: Boolean(documentGroupId && documentGroupId !== nextDocumentGroupId),\n isLastInList: (\n messageIndex === senderGroup.length - 1\n && senderGroupIndex === senderGroupsArray.length - 1\n && dateGroupIndex === dateGroupsArray.length - 1\n ),\n };\n\n currentDocumentGroupId = documentGroupId;\n\n const originalId = getMessageOriginalId(message);\n // Scheduled messages can have local IDs in the middle of the list,\n // and keys should be ordered, so we prefix it with a date.\n // However, this may lead to issues if server date is not synchronized with the local one.\n const key = type !== 'scheduled' ? originalId : `${message.date}_${originalId}`;\n\n return compact([\n message.id === memoFirstUnreadIdRef.current ? unreadDivider : undefined,\n ,\n message.id === threadTopMessageId && (\n
\n {lang('DiscussionStarted')}\n
\n ),\n ]);\n }));\n });\n\n return (\n \n openHistoryCalendar({ selectedAt: dateGroup.datetime }) : undefined}\n >\n \n {isSchedule && dateGroup.originalDate === SCHEDULED_WHEN_ONLINE && (\n lang('MessageScheduledUntilOnline')\n )}\n {isSchedule && dateGroup.originalDate !== SCHEDULED_WHEN_ONLINE && (\n lang('MessageScheduledOn', formatHumanDate(lang, dateGroup.datetime, undefined, true))\n )}\n {!isSchedule && formatHumanDate(lang, dateGroup.datetime)}\n \n \n {flatten(senderGroups)}\n \n );\n });\n\n return (\n
\n
\n {flatten(dateGroups)}\n \n \n
\n );\n};\n\nexport default memo(MessageListContent);\n","import { RefObject } from 'react';\nimport { getDispatch } from '../../../lib/teact/teactn';\nimport { useCallback, useMemo, useRef } from '../../../lib/teact/teact';\n\nimport { LoadMoreDirection } from '../../../types';\nimport { MessageListType } from '../../../global/types';\n\nimport { debounce } from '../../../util/schedulers';\nimport { useIntersectionObserver, useOnIntersect } from '../../../hooks/useIntersectionObserver';\nimport { MESSAGE_LIST_SENSITIVE_AREA } from '../../../config';\nimport resetScroll from '../../../util/resetScroll';\nimport useOnChange from '../../../hooks/useOnChange';\n\nconst FAB_THRESHOLD = 50;\nconst TOOLS_FREEZE_TIMEOUT = 100;\n\nexport default function useScrollHooks(\n type: MessageListType,\n containerRef: RefObject,\n messageIds: number[],\n isViewportNewest: boolean,\n isUnread: boolean,\n onFabToggle: AnyToVoidFunction,\n onNotchToggle: AnyToVoidFunction,\n) {\n const { loadViewportMessages } = getDispatch();\n\n const [loadMoreBackwards, loadMoreForwards] = useMemo(\n () => (type === 'thread' ? [\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Backwards }), 1000, true, false),\n debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Forwards }), 1000, true, false),\n ] : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [loadViewportMessages, messageIds],\n );\n\n // eslint-disable-next-line no-null/no-null\n const backwardsTriggerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const forwardsTriggerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const fabTriggerRef = useRef(null);\n\n const toggleScrollTools = useCallback(() => {\n if (!messageIds || !messageIds.length) {\n onFabToggle(false);\n onNotchToggle(false);\n return;\n }\n\n if (!isViewportNewest) {\n onFabToggle(true);\n onNotchToggle(true);\n return;\n }\n\n const { offsetHeight, scrollHeight, scrollTop } = containerRef.current!;\n const scrollBottom = scrollHeight - scrollTop - offsetHeight;\n const isNearBottom = scrollBottom <= FAB_THRESHOLD;\n const isAtBottom = scrollBottom <= 0;\n\n onFabToggle(isUnread ? !isAtBottom : !isNearBottom);\n onNotchToggle(!isAtBottom);\n }, [messageIds, isViewportNewest, containerRef, onFabToggle, isUnread, onNotchToggle]);\n\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({\n rootRef: containerRef,\n margin: MESSAGE_LIST_SENSITIVE_AREA,\n }, (entries) => {\n if (!loadMoreForwards || !loadMoreBackwards) {\n return;\n }\n\n const triggerEntry = entries.find(({ isIntersecting }) => isIntersecting);\n if (!triggerEntry) {\n return;\n }\n\n const { target } = triggerEntry;\n\n if (target.className === 'backwards-trigger') {\n resetScroll(containerRef.current!);\n loadMoreBackwards();\n } else if (target.className === 'forwards-trigger') {\n resetScroll(containerRef.current!);\n loadMoreForwards();\n }\n });\n\n useOnIntersect(backwardsTriggerRef, observeIntersection);\n useOnIntersect(forwardsTriggerRef, observeIntersection);\n\n const {\n observe: observeIntersectionForFab,\n freeze: freezeForFab,\n unfreeze: unfreezeForFab,\n } = useIntersectionObserver({\n rootRef: containerRef,\n margin: FAB_THRESHOLD,\n }, toggleScrollTools);\n\n useOnIntersect(fabTriggerRef, observeIntersectionForFab);\n\n const {\n observe: observeIntersectionForNotch,\n freeze: freezeForNotch,\n unfreeze: unfreezeForNotch,\n } = useIntersectionObserver({\n rootRef: containerRef,\n }, toggleScrollTools);\n\n useOnIntersect(fabTriggerRef, observeIntersectionForNotch);\n\n // Workaround for FAB and notch flickering with tall incoming message\n useOnChange(() => {\n freezeForFab();\n freezeForNotch();\n\n setTimeout(() => {\n unfreezeForNotch();\n unfreezeForFab();\n }, TOOLS_FREEZE_TIMEOUT);\n }, [messageIds]);\n\n return { backwardsTriggerRef, forwardsTriggerRef, fabTriggerRef };\n}\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiRestrictionReason, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { LoadMoreDirection } from '../../types';\n\nimport { ANIMATION_END_DELAY, MESSAGE_LIST_SLICE } from '../../config';\nimport {\n selectChatMessages,\n selectIsViewportNewest,\n selectFirstUnreadId,\n selectFocusedMessageId,\n selectChat,\n selectIsInSelectMode,\n selectIsChatWithSelf,\n selectChatBot,\n selectIsChatBotNotStarted,\n selectScrollOffset,\n selectThreadTopMessageId,\n selectFirstMessageId,\n selectScheduledMessages,\n selectCurrentMessageIds,\n} from '../../modules/selectors';\nimport { isChatChannel, isChatPrivate } from '../../modules/helpers';\nimport { orderBy, pick } from '../../util/iteratees';\nimport { fastRaf, debounce, onTickEnd } from '../../util/schedulers';\nimport useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport buildClassName from '../../util/buildClassName';\nimport { groupMessages } from './helpers/groupMessages';\nimport { preventMessageInputBlur } from './helpers/preventMessageInputBlur';\nimport useOnChange from '../../hooks/useOnChange';\nimport useStickyDates from './hooks/useStickyDates';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport resetScroll from '../../util/resetScroll';\nimport fastSmoothScroll, { isAnimatingScroll } from '../../util/fastSmoothScroll';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport useWindowSize from '../../hooks/useWindowSize';\n\nimport Loading from '../ui/Loading';\nimport MessageListContent from './MessageListContent';\n\nimport './MessageList.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n type: MessageListType;\n canPost: boolean;\n isReady: boolean;\n onFabToggle: (shouldShow: boolean) => void;\n onNotchToggle: (shouldShow: boolean) => void;\n hasTools?: boolean;\n};\n\ntype StateProps = {\n isChatLoaded?: boolean;\n isChannelChat?: boolean;\n isChatWithSelf?: boolean;\n messageIds?: number[];\n messagesById?: Record;\n firstUnreadId?: number;\n isViewportNewest?: boolean;\n isRestricted?: boolean;\n restrictionReason?: ApiRestrictionReason;\n focusingId?: number;\n hasFocusHighlight?: boolean;\n isSelectModeActive?: boolean;\n animationLevel?: number;\n lastMessage?: ApiMessage;\n botDescription?: string;\n threadTopMessageId?: number;\n threadFirstMessageId?: number;\n hasLinkedChat?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst BOTTOM_THRESHOLD = 100;\nconst UNREAD_DIVIDER_TOP = 10;\nconst UNREAD_DIVIDER_TOP_WITH_TOOLS = 60;\nconst SCROLL_DEBOUNCE = 200;\nconst FOCUSING_DURATION = 1000;\nconst BOTTOM_FOCUS_MARGIN = 20;\nconst SELECT_MODE_ANIMATION_DURATION = 200;\nconst UNREAD_DIVIDER_CLASS = 'unread-divider';\n\nconst runDebouncedForScroll = debounce((cb) => cb(), SCROLL_DEBOUNCE, false);\n\nconst MessageList: FC = ({\n chatId,\n threadId,\n type,\n hasTools,\n onFabToggle,\n onNotchToggle,\n isChatLoaded,\n isChannelChat,\n canPost,\n isReady,\n isChatWithSelf,\n messageIds,\n messagesById,\n firstUnreadId,\n isViewportNewest,\n threadFirstMessageId,\n isRestricted,\n restrictionReason,\n focusingId,\n hasFocusHighlight,\n isSelectModeActive,\n loadViewportMessages,\n setScrollOffset,\n lastMessage,\n botDescription,\n threadTopMessageId,\n hasLinkedChat,\n openHistoryCalendar,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n // We update local cached `scrollOffsetRef` when opening chat.\n // Then we update global version every second on scrolling.\n const scrollOffsetRef = useRef((type === 'thread' && selectScrollOffset(getGlobal(), chatId, threadId)) || 0);\n const anchorIdRef = useRef();\n const anchorTopRef = useRef();\n const listItemElementsRef = useRef();\n const memoUnreadDividerBeforeIdRef = useRef();\n // Updated every time (to be used from intersection callback closure)\n const memoFirstUnreadIdRef = useRef();\n const memoFocusingIdRef = useRef();\n const isScrollTopJustUpdatedRef = useRef(false);\n const shouldAnimateAppearanceRef = useRef(Boolean(lastMessage));\n\n const [containerHeight, setContainerHeight] = useState();\n\n const areMessagesLoaded = Boolean(messageIds);\n\n useOnChange(() => {\n // We only need it first time when message list appears\n if (areMessagesLoaded) {\n onTickEnd(() => {\n shouldAnimateAppearanceRef.current = false;\n });\n }\n }, [areMessagesLoaded]);\n\n useOnChange(() => {\n memoFirstUnreadIdRef.current = firstUnreadId;\n\n // Updated only once (to preserve divider even after messages are read)\n if (!memoUnreadDividerBeforeIdRef.current) {\n memoUnreadDividerBeforeIdRef.current = firstUnreadId;\n }\n }, [firstUnreadId]);\n\n useOnChange(() => {\n memoFocusingIdRef.current = focusingId;\n }, [focusingId]);\n\n const messageGroups = useMemo(() => {\n if (!messageIds || !messagesById) {\n return undefined;\n }\n\n const viewportIds = threadTopMessageId && (!messageIds[0] || threadFirstMessageId === messageIds[0])\n ? [threadTopMessageId, ...messageIds]\n : messageIds;\n\n if (!viewportIds.length) {\n return undefined;\n }\n\n const listedMessages = viewportIds.map((id) => messagesById[id]).filter(Boolean);\n return groupMessages(orderBy(listedMessages, ['date', 'id']), memoUnreadDividerBeforeIdRef.current);\n }, [messageIds, messagesById, threadFirstMessageId, threadTopMessageId]);\n\n const loadMoreAround = useMemo(() => {\n if (type !== 'thread') {\n return undefined;\n }\n\n return debounce(() => loadViewportMessages({ direction: LoadMoreDirection.Around }), 1000, true, false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loadViewportMessages, messageIds]);\n\n const { isScrolled, updateStickyDates } = useStickyDates();\n\n const handleScroll = useCallback(() => {\n if (isScrollTopJustUpdatedRef.current) {\n isScrollTopJustUpdatedRef.current = false;\n return;\n }\n\n const container = containerRef.current!;\n\n if (!memoFocusingIdRef.current) {\n updateStickyDates(container, hasTools);\n }\n\n runDebouncedForScroll(() => {\n fastRaf(() => {\n if (!container.parentElement) {\n return;\n }\n\n scrollOffsetRef.current = container.scrollHeight - container.scrollTop;\n\n if (type === 'thread') {\n setScrollOffset({ chatId, threadId, scrollOffset: scrollOffsetRef.current });\n }\n });\n });\n }, [updateStickyDates, hasTools, type, setScrollOffset, chatId, threadId]);\n\n // Container resize observer (caused by Composer reply/webpage panels)\n useEffect(() => {\n if (!('ResizeObserver' in window) || process.env.APP_ENV === 'perf') {\n return undefined;\n }\n\n const observer = new ResizeObserver(([entry]) => {\n // During animation\n if (!(entry.target as HTMLDivElement).offsetParent) {\n return;\n }\n\n setContainerHeight(entry.contentRect.height);\n });\n\n observer.observe(containerRef.current!);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n // Memorize height for scroll animation\n const { height: windowHeight } = useWindowSize();\n\n useEffect(() => {\n if (isReady) {\n containerRef.current!.dataset.normalHeight = String(containerRef.current!.offsetHeight);\n }\n }, [windowHeight, isReady]);\n\n // Initial message loading\n useEffect(() => {\n if (!loadMoreAround || !isChatLoaded || isRestricted || focusingId) {\n return;\n }\n\n const container = containerRef.current!;\n\n if (!messageIds || (\n messageIds.length < MESSAGE_LIST_SLICE / 2\n && (container.firstElementChild as HTMLDivElement).clientHeight <= container.offsetHeight\n )) {\n loadMoreAround();\n }\n }, [isChatLoaded, messageIds, loadMoreAround, focusingId, isRestricted]);\n\n // Remember scroll position before repositioning it\n useOnChange(() => {\n if (!messageIds || !listItemElementsRef.current || !isReady) {\n return;\n }\n\n const preservedItemElements = listItemElementsRef.current\n .filter((element) => messageIds.includes(Number(element.dataset.messageId)));\n\n // We avoid the very first item as it may be a partly-loaded album\n // and also because it may be removed when messages limit is reached\n const anchor = preservedItemElements[1] || preservedItemElements[0];\n if (!anchor) {\n return;\n }\n\n anchorIdRef.current = anchor.id;\n anchorTopRef.current = anchor.getBoundingClientRect().top;\n // This should match deps for `useLayoutEffectWithPrevDeps` below\n }, [messageIds, isViewportNewest, containerHeight, hasTools, isReady]);\n\n // Handles updated message list, takes care of scroll repositioning\n useLayoutEffectWithPrevDeps(([\n prevMessageIds, prevIsViewportNewest, prevContainerHeight,\n ]: [\n typeof messageIds, typeof isViewportNewest, typeof containerHeight\n ]) => {\n const container = containerRef.current!;\n listItemElementsRef.current = Array.from(container.querySelectorAll('.message-list-item'));\n\n // During animation\n if (!container.offsetParent) {\n return;\n }\n\n // Add extra height when few messages to allow smooth scroll animation. Uses assumption that `parentElement`\n // is a Transition slide and its CSS class can not be reset in a declarative way.\n const shouldForceScroll = (\n isViewportNewest\n && (messageIds && messageIds.length < MESSAGE_LIST_SLICE / 2)\n && !container.parentElement!.classList.contains('force-messages-scroll')\n && (container.firstElementChild as HTMLDivElement)!.clientHeight <= container.offsetHeight * 2\n );\n\n if (shouldForceScroll) {\n container.parentElement!.classList.add('force-messages-scroll');\n\n setTimeout(() => {\n if (container.parentElement) {\n container.parentElement.classList.remove('force-messages-scroll');\n }\n }, FOCUSING_DURATION);\n }\n\n const { scrollTop, scrollHeight, offsetHeight } = container;\n const scrollOffset = scrollOffsetRef.current!;\n const lastItemElement = listItemElementsRef.current[listItemElementsRef.current.length - 1];\n\n // If two messages come at once (e.g. via Quiz Bot) then the first message will update `scrollOffset`\n // right away (before animation) which creates inconsistency until the animation completes.\n // To workaround that, we calculate `isAtBottom` with a \"buffer\" of the latest message height (this is approximate).\n const lastItemHeight = lastItemElement ? lastItemElement.offsetHeight : 0;\n const isAtBottom = isViewportNewest && prevIsViewportNewest && (\n scrollOffset - (prevContainerHeight || offsetHeight) - lastItemHeight <= BOTTOM_THRESHOLD\n );\n\n let newScrollTop!: number;\n\n const hasFirstMessageChanged = messageIds && prevMessageIds && messageIds[0] !== prevMessageIds[0];\n const hasLastMessageChanged = (\n messageIds && prevMessageIds && messageIds[messageIds.length - 1] !== prevMessageIds[prevMessageIds.length - 1]\n );\n const isAlreadyFocusing = messageIds && memoFocusingIdRef.current === messageIds[messageIds.length - 1];\n\n if (isAtBottom && hasLastMessageChanged && !hasFirstMessageChanged && !isAlreadyFocusing) {\n if (lastItemElement) {\n fastRaf(() => {\n fastSmoothScroll(\n container,\n lastItemElement,\n 'end',\n BOTTOM_FOCUS_MARGIN,\n undefined,\n undefined,\n undefined,\n true,\n );\n });\n }\n\n newScrollTop = scrollHeight - offsetHeight;\n scrollOffsetRef.current = Math.max(scrollHeight - newScrollTop, offsetHeight);\n\n // Scroll still needs to be restored after container resize\n if (!shouldForceScroll) {\n return;\n }\n }\n\n if (process.env.APP_ENV === 'perf') {\n // eslint-disable-next-line no-console\n console.time('scrollTop');\n }\n\n const isResized = prevContainerHeight !== undefined && prevContainerHeight !== containerHeight;\n const anchor = anchorIdRef.current && container.querySelector(`#${anchorIdRef.current}`);\n const unreadDivider = (\n !anchor\n && memoUnreadDividerBeforeIdRef.current\n && container.querySelector(`.${UNREAD_DIVIDER_CLASS}`)\n );\n\n if (isAtBottom && isResized) {\n if (isAnimatingScroll()) {\n return;\n }\n\n newScrollTop = scrollHeight - offsetHeight;\n } else if (anchor) {\n const newAnchorTop = anchor.getBoundingClientRect().top;\n newScrollTop = scrollTop + (newAnchorTop - (anchorTopRef.current || 0));\n } else if (unreadDivider) {\n newScrollTop = Math.min(\n unreadDivider.offsetTop - (hasTools ? UNREAD_DIVIDER_TOP_WITH_TOOLS : UNREAD_DIVIDER_TOP),\n scrollHeight - scrollOffset,\n );\n } else {\n newScrollTop = scrollHeight - scrollOffset;\n }\n\n resetScroll(container, newScrollTop);\n\n if (!memoFocusingIdRef.current) {\n isScrollTopJustUpdatedRef.current = true;\n fastRaf(() => {\n isScrollTopJustUpdatedRef.current = false;\n });\n }\n\n scrollOffsetRef.current = Math.max(scrollHeight - newScrollTop, offsetHeight);\n\n if (process.env.APP_ENV === 'perf') {\n // eslint-disable-next-line no-console\n console.timeEnd('scrollTop');\n }\n // This should match deps for `useOnChange` above\n }, [messageIds, isViewportNewest, containerHeight, hasTools]);\n\n useEffectWithPrevDeps(([prevIsSelectModeActive]) => {\n if (prevIsSelectModeActive !== undefined) {\n dispatchHeavyAnimationEvent(SELECT_MODE_ANIMATION_DURATION + ANIMATION_END_DELAY);\n }\n }, [isSelectModeActive]);\n\n const lang = useLang();\n\n const isPrivate = Boolean(chatId && isChatPrivate(chatId));\n const withUsers = Boolean((!isPrivate && !isChannelChat) || isChatWithSelf);\n const noAvatars = Boolean(!withUsers || isChannelChat);\n\n const className = buildClassName(\n 'MessageList custom-scroll',\n noAvatars && 'no-avatars',\n !canPost && 'no-composer',\n type === 'pinned' && 'type-pinned',\n hasFocusHighlight && 'has-focus-highlight',\n isSelectModeActive && 'select-mode-active',\n isScrolled && 'scrolled',\n !isReady && 'is-animating',\n );\n\n return (\n \n {isRestricted ? (\n
\n \n {restrictionReason ? restrictionReason.text : `This is a private ${isChannelChat ? 'channel' : 'chat'}`}\n \n
\n ) : botDescription ? (\n
{renderText(lang(botDescription), ['br', 'emoji', 'links'])}
\n ) : messageIds && !messageGroups ? (\n
{lang('NoMessages')}
\n ) : ((messageIds && messageGroups) || lastMessage) ? (\n \n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, type }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return {};\n }\n\n const messageIds = selectCurrentMessageIds(global, chatId, threadId, type);\n const messagesById = type === 'scheduled'\n ? selectScheduledMessages(global, chatId)\n : selectChatMessages(global, chatId);\n const threadTopMessageId = selectThreadTopMessageId(global, chatId, threadId);\n\n if (\n threadId !== MAIN_THREAD_ID\n && !(messagesById && threadTopMessageId && messagesById[threadTopMessageId])\n ) {\n return {};\n }\n\n const { isRestricted, restrictionReason, lastMessage } = chat;\n const focusingId = selectFocusedMessageId(global, chatId);\n const hasFocusHighlight = focusingId ? !global.focusedMessage!.noHighlight : undefined;\n\n const withLastMessageWhenPreloading = (\n threadId === MAIN_THREAD_ID\n && !messageIds && !chat.unreadCount && !focusingId && lastMessage && !lastMessage.groupedId\n );\n\n let botDescription: string | undefined;\n if (selectIsChatBotNotStarted(global, chatId)) {\n const chatBot = selectChatBot(global, chatId)!;\n if (chatBot.fullInfo) {\n botDescription = chatBot.fullInfo.botDescription || 'NoMessages';\n } else {\n botDescription = 'Updating bot info...';\n }\n }\n\n return {\n isChatLoaded: true,\n isRestricted,\n restrictionReason,\n isChannelChat: isChatChannel(chat),\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n messageIds,\n messagesById,\n firstUnreadId: selectFirstUnreadId(global, chatId, threadId),\n isViewportNewest: type !== 'thread' || selectIsViewportNewest(global, chatId, threadId),\n threadFirstMessageId: selectFirstMessageId(global, chatId, threadId),\n focusingId,\n hasFocusHighlight,\n isSelectModeActive: selectIsInSelectMode(global),\n botDescription,\n threadTopMessageId,\n hasLinkedChat: chat.fullInfo && ('linkedChatId' in chat.fullInfo)\n ? Boolean(chat.fullInfo.linkedChatId)\n : undefined,\n ...(withLastMessageWhenPreloading && { lastMessage }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadViewportMessages',\n 'setScrollOffset',\n 'openHistoryCalendar',\n ]),\n)(MessageList));\n","import React, {\n FC, useCallback, memo, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, MessageListType } from '../../global/types';\nimport { MAIN_THREAD_ID } from '../../api/types';\n\nimport { selectChat, selectCurrentMessageList } from '../../modules/selectors';\nimport { formatIntegerCompact } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport { pick } from '../../util/iteratees';\nimport fastSmoothScroll from '../../util/fastSmoothScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\nimport './ScrollDownButton.scss';\n\ntype OwnProps = {\n isShown: boolean;\n canPost?: boolean;\n};\n\ntype StateProps = {\n messageListType?: MessageListType;\n unreadCount?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FOCUS_MARGIN = 20;\n\nconst ScrollDownButton: FC = ({\n isShown,\n canPost,\n messageListType,\n unreadCount,\n focusNextReply,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const elementRef = useRef(null);\n\n const handleClick = useCallback(() => {\n if (!isShown) {\n return;\n }\n\n if (messageListType === 'thread') {\n focusNextReply();\n } else {\n const messagesContainer = elementRef.current!.parentElement!.querySelector('.MessageList')!;\n const messageElements = messagesContainer.querySelectorAll('.message-list-item');\n const lastMessageElement = messageElements[messageElements.length - 1];\n if (!lastMessageElement) {\n return;\n }\n\n fastSmoothScroll(messagesContainer, lastMessageElement, 'end', FOCUS_MARGIN);\n }\n }, [isShown, messageListType, focusNextReply]);\n\n const fabClassName = buildClassName(\n 'ScrollDownButton',\n isShown && 'revealed',\n !canPost && 'no-composer',\n );\n\n return (\n
\n
\n \n \n \n {Boolean(unreadCount) && (\n
{formatIntegerCompact(unreadCount!)}
\n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return {};\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n\n return {\n messageListType,\n unreadCount: chat && threadId === MAIN_THREAD_ID && messageListType === 'thread' ? chat.unreadCount : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['focusNextReply']),\n)(ScrollDownButton));\n","import { ApiAttachment } from '../../../../api/types';\nimport { preloadImage, preloadVideo, createPosterForVideo } from '../../../../util/files';\n\nconst MAX_QUICK_VIDEO_SIZE = 10 * 1024 ** 2; // 10 MB\nconst MAX_QUICK_IMG_SIZE = 1280; // px\n\nexport default async function buildAttachment(\n filename: string, blob: Blob, isQuick: boolean, options?: Partial,\n): Promise {\n const blobUrl = URL.createObjectURL(blob);\n const { type: mimeType, size } = blob;\n let quick;\n let previewBlobUrl;\n\n if (mimeType.startsWith('image/')) {\n if (isQuick) {\n const img = await preloadImage(blobUrl);\n const { width, height } = img;\n\n if (width > MAX_QUICK_IMG_SIZE || height > MAX_QUICK_IMG_SIZE || mimeType !== 'image/jpeg') {\n const newBlob = await squeezeImage(img);\n if (newBlob) {\n URL.revokeObjectURL(blobUrl);\n return buildAttachment(filename, newBlob, true, options);\n } else {\n return buildAttachment(filename, blob, false, options);\n }\n }\n\n quick = { width, height };\n } else {\n previewBlobUrl = blobUrl;\n }\n } else if (mimeType.startsWith('video/')) {\n // Videos < 10 MB are always sent in quick mode (in other clients).\n // Quick mode for videos > 10 MB is not supported until client-side video squeezing is implemented.\n if (size < MAX_QUICK_VIDEO_SIZE) {\n const { videoWidth: width, videoHeight: height, duration } = await preloadVideo(blobUrl);\n quick = { width, height, duration };\n }\n\n previewBlobUrl = await createPosterForVideo(blobUrl);\n }\n\n return {\n blobUrl,\n filename,\n mimeType,\n size,\n quick,\n previewBlobUrl,\n ...options,\n };\n}\n\nfunction squeezeImage(img: HTMLImageElement): Promise {\n return new Promise((resolve) => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n\n let { width, height } = img;\n\n if (width > MAX_QUICK_IMG_SIZE || height > MAX_QUICK_IMG_SIZE) {\n if (width >= height) {\n height *= MAX_QUICK_IMG_SIZE / width;\n width = MAX_QUICK_IMG_SIZE;\n } else {\n width *= MAX_QUICK_IMG_SIZE / height;\n height = MAX_QUICK_IMG_SIZE;\n }\n }\n\n canvas.width = width;\n canvas.height = height;\n\n ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, width, height);\n canvas.toBlob(resolve, 'image/jpeg', 100);\n });\n}\n","import { IS_IOS } from '../../../../util/environment';\n\nlet resetInput: HTMLInputElement;\n\nif (IS_IOS) {\n resetInput = document.createElement('input');\n resetInput.classList.add('for-ios-autocapitalization-fix');\n document.body.appendChild(resetInput);\n}\n\n// https://stackoverflow.com/a/55652503\nexport default function applyIosAutoCapitalizationFix(inputEl: HTMLElement) {\n resetInput.focus();\n inputEl.focus();\n}\n","export default __webpack_public_path__ + \"c0155344d336103c2b6a0b28cc510750.js\";","// @ts-ignore\nimport encoderPath from 'file-loader!opus-recorder/dist/encoderWorker.min';\n\nexport type Result = { blob: Blob; duration: number; waveform: number[] };\n\ninterface OpusRecorder extends Omit {\n new(options: AnyLiteral): OpusRecorder;\n\n start(stream?: MediaStreamAudioSourceNode): void;\n\n sourceNode: MediaStreamAudioSourceNode;\n\n ondataavailable: (typedArray: Uint8Array) => void;\n}\n\nconst MIN_RECORDING_TIME = 1000;\nconst POLYFILL_OPTIONS = { encoderPath, reuseWorker: true };\nconst BLOB_PARAMS = { type: 'audio/ogg' };\nconst FFT_SIZE = 64;\nconst MIN_VOLUME = 0.1;\n\nlet opusRecorderPromise: Promise<{ default: OpusRecorder }>;\nlet OpusRecorder: OpusRecorder;\nlet mediaRecorder: OpusRecorder;\n\nexport async function init() {\n if (!opusRecorderPromise) {\n // @ts-ignore\n opusRecorderPromise = import('opus-recorder');\n OpusRecorder = (await opusRecorderPromise).default;\n mediaRecorder = new OpusRecorder(POLYFILL_OPTIONS);\n }\n\n return opusRecorderPromise;\n}\n\nexport async function start(analyzerCallback: Function) {\n await startMediaRecorder();\n\n const startedAt = Date.now();\n let pausedAt: number;\n const chunks: Uint8Array[] = [];\n const waveform: number[] = [];\n\n mediaRecorder.ondataavailable = (typedArray) => {\n chunks.push(typedArray);\n };\n\n const releaseAnalyzer = subscribeToAnalyzer(mediaRecorder, (volume: number) => {\n waveform.push(volume * 255);\n analyzerCallback(volume);\n });\n\n return {\n stop: () => new Promise((resolve, reject) => {\n mediaRecorder.onstop = () => {\n resolve({\n blob: new Blob(chunks, BLOB_PARAMS),\n duration: Math.round(((pausedAt || Date.now()) - startedAt) / 1000),\n waveform,\n });\n };\n mediaRecorder.onerror = reject;\n\n const delayStop = Math.max(0, startedAt + MIN_RECORDING_TIME - Date.now());\n setTimeout(() => {\n mediaRecorder.stop();\n releaseAnalyzer();\n }, delayStop);\n }),\n pause: () => {\n const delayStop = Math.max(0, startedAt + MIN_RECORDING_TIME - Date.now());\n setTimeout(() => {\n mediaRecorder.pause();\n pausedAt = Date.now();\n releaseAnalyzer();\n }, delayStop);\n },\n };\n}\n\nasync function startMediaRecorder() {\n await init();\n await mediaRecorder.start();\n}\n\nfunction subscribeToAnalyzer(recorder: OpusRecorder, cb: Function) {\n const source = recorder.sourceNode;\n const analyser = source.context.createAnalyser();\n analyser.fftSize = FFT_SIZE;\n source.connect(analyser);\n\n const dataLength = analyser.frequencyBinCount;\n const dataArray = new Uint8Array(dataLength);\n let isDestroyed = false;\n\n function tick() {\n if (isDestroyed) {\n return;\n }\n\n analyser.getByteFrequencyData(dataArray);\n\n const sum = dataArray.reduce((acc, current) => acc + current, 0);\n const mean = (sum / dataLength);\n const volume = mean / 255;\n\n cb(volume < MIN_VOLUME ? 0 : volume);\n\n requestAnimationFrame(tick);\n }\n\n tick();\n\n return () => {\n isDestroyed = true;\n };\n}\n","import { StateHookSetter, useEffect } from '../../../../lib/teact/teact';\nimport { ApiAttachment, ApiMessage } from '../../../../api/types';\n\nimport buildAttachment from '../helpers/buildAttachment';\nimport { EDITABLE_INPUT_ID, EDITABLE_INPUT_MODAL_ID } from '../../../../config';\n\nconst CLIPBOARD_ACCEPTED_TYPES = ['image/png', 'image/jpeg', 'image/gif'];\nconst MAX_MESSAGE_LENGTH = 4096;\n\nexport default (\n insertTextAndUpdateCursor: (text: string, inputId?: string) => void,\n setAttachments: StateHookSetter,\n editedMessage: ApiMessage | undefined,\n) => {\n useEffect(() => {\n async function handlePaste(e: ClipboardEvent) {\n if (!e.clipboardData) {\n return;\n }\n\n const input = document.activeElement;\n if (input && ![EDITABLE_INPUT_ID, EDITABLE_INPUT_MODAL_ID].includes(input.id)) {\n return;\n }\n\n const { items } = e.clipboardData;\n const media = Array.from(items).find((item) => CLIPBOARD_ACCEPTED_TYPES.includes(item.type));\n const file = media && media.getAsFile();\n const pastedText = e.clipboardData.getData('text').substring(0, MAX_MESSAGE_LENGTH);\n\n if (!file && !pastedText) {\n return;\n }\n\n e.preventDefault();\n\n if (file && !editedMessage) {\n const attachment = await buildAttachment(file.name, file, true);\n setAttachments((attachments) => [\n ...attachments,\n attachment,\n ]);\n }\n\n if (pastedText) {\n insertTextAndUpdateCursor(pastedText, input ? input.id : undefined);\n }\n }\n\n document.addEventListener('paste', handlePaste, false);\n\n return () => {\n document.removeEventListener('paste', handlePaste, false);\n };\n }, [insertTextAndUpdateCursor, editedMessage, setAttachments]);\n};\n","import { ApiFormattedText } from '../../../../api/types';\nimport { renderTextWithEntities } from '../../../common/helpers/renderMessageText';\n\nexport default function getMessageTextAsHtml(formattedText?: ApiFormattedText) {\n const { text, entities } = formattedText || {};\n if (!text) {\n return '';\n }\n\n const result = renderTextWithEntities(\n text,\n entities,\n undefined,\n undefined,\n true,\n );\n\n if (Array.isArray(result)) {\n return result.join('');\n }\n\n return result;\n}\n","import { useCallback, useEffect, useMemo } from '../../../../lib/teact/teact';\n\nimport { ApiFormattedText, ApiMessage } from '../../../../api/types';\nimport { GlobalActions } from '../../../../global/types';\n\nimport { DRAFT_DEBOUNCE, EDITABLE_INPUT_ID } from '../../../../config';\nimport usePrevious from '../../../../hooks/usePrevious';\nimport { debounce } from '../../../../util/schedulers';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport parseMessageInput from '../helpers/parseMessageInput';\nimport getMessageTextAsHtml from '../helpers/getMessageTextAsHtml';\nimport useBackgroundMode from '../../../../hooks/useBackgroundMode';\nimport useBeforeUnload from '../../../../hooks/useBeforeUnload';\nimport { IS_TOUCH_ENV } from '../../../../util/environment';\n\n// Used to avoid running debounced callbacks when chat changes.\nlet currentChatId: number | undefined;\nlet currentThreadId: number | undefined;\n\nexport default (\n draft: ApiFormattedText | undefined,\n chatId: number,\n threadId: number,\n html: string,\n htmlRef: { current: string },\n setHtml: (html: string) => void,\n editedMessage: ApiMessage | undefined,\n saveDraft: GlobalActions['saveDraft'],\n clearDraft: GlobalActions['clearDraft'],\n) => {\n const updateDraft = useCallback((draftChatId: number, draftThreadId: number) => {\n if (htmlRef.current.length && !editedMessage) {\n saveDraft({ chatId: draftChatId, threadId: draftThreadId, draft: parseMessageInput(htmlRef.current!) });\n } else {\n clearDraft({ chatId: draftChatId, threadId: draftThreadId });\n }\n }, [clearDraft, editedMessage, htmlRef, saveDraft]);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const runDebouncedForSaveDraft = useMemo(() => debounce((cb) => cb(), DRAFT_DEBOUNCE, false), [chatId]);\n\n const prevChatId = usePrevious(chatId);\n const prevThreadId = usePrevious(threadId);\n\n // Save draft on chat change\n useEffect(() => {\n currentChatId = chatId;\n currentThreadId = threadId;\n\n return () => {\n currentChatId = undefined;\n currentThreadId = undefined;\n\n updateDraft(chatId, threadId);\n };\n }, [chatId, threadId, updateDraft]);\n\n // Restore draft on chat change\n useEffect(() => {\n if (chatId === prevChatId && threadId === prevThreadId) {\n return;\n }\n\n if (!draft) {\n return;\n }\n\n setHtml(getMessageTextAsHtml(draft));\n\n if (!IS_TOUCH_ENV) {\n requestAnimationFrame(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n focusEditableElement(messageInput, true);\n });\n }\n }, [chatId, threadId, draft, setHtml, updateDraft, prevChatId, prevThreadId]);\n\n // Update draft when input changes\n const prevHtml = usePrevious(html);\n useEffect(() => {\n if (!chatId || !threadId || prevChatId !== chatId || prevThreadId !== threadId || prevHtml === html) {\n return;\n }\n\n if (html.length) {\n runDebouncedForSaveDraft(() => {\n if (currentChatId !== chatId || currentThreadId !== threadId) {\n return;\n }\n\n updateDraft(chatId, threadId);\n });\n } else {\n updateDraft(chatId, threadId);\n }\n }, [chatId, html, prevChatId, prevHtml, prevThreadId, runDebouncedForSaveDraft, threadId, updateDraft]);\n\n const handleBlur = useCallback(() => {\n if (chatId && threadId) {\n updateDraft(chatId, threadId);\n }\n }, [chatId, threadId, updateDraft]);\n\n useBackgroundMode(handleBlur);\n useBeforeUnload(handleBlur);\n};\n","import { useCallback, useEffect } from '../../../../lib/teact/teact';\nimport { getDispatch } from '../../../../lib/teact/teactn';\nimport { InlineBotSettings } from '../../../../types';\nimport useFlag from '../../../../hooks/useFlag';\nimport usePrevious from '../../../../hooks/usePrevious';\n\nconst tempEl = document.createElement('div');\nconst INLINE_BOT_QUERY_REGEXP = /^@([a-z0-9_]{1,32})[\\u00A0\\u0020]+(.*)/i;\nconst HAS_NEW_LINE = /^@([a-z0-9_]{1,32})[\\u00A0\\u0020]+\\n{2,}/i;\n\nexport default function useInlineBotTooltip(\n isAllowed: boolean,\n chatId: number,\n html: string,\n inlineBots?: Record,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const text = getPlainText(html);\n const { queryInlineBot, resetInlineBot } = getDispatch();\n const { username, query, canShowHelp } = parseStartWithUsernameString(text);\n const usernameLowered = username.toLowerCase();\n const prevQuery = usePrevious(query);\n const prevUsername = usePrevious(username);\n const inlineBotData = inlineBots && inlineBots[usernameLowered];\n const {\n id: botId,\n switchPm,\n offset,\n results,\n isGallery,\n help,\n } = inlineBotData || {};\n\n useEffect(() => {\n if (prevQuery !== query) {\n unmarkIsOpen();\n }\n }, [prevQuery, query, unmarkIsOpen]);\n\n useEffect(() => {\n if (isAllowed && usernameLowered && chatId) {\n queryInlineBot({ chatId, username: usernameLowered, query });\n }\n }, [query, isAllowed, queryInlineBot, chatId, usernameLowered]);\n\n const loadMore = useCallback(() => {\n queryInlineBot({\n chatId, username: usernameLowered, query, offset,\n });\n }, [offset, chatId, query, queryInlineBot, usernameLowered]);\n\n useEffect(() => {\n if (isAllowed && botId && (switchPm || (results && results.length))) {\n markIsOpen();\n } else {\n unmarkIsOpen();\n }\n }, [botId, isAllowed, markIsOpen, results, switchPm, unmarkIsOpen]);\n\n if (prevUsername !== username) {\n resetInlineBot({ username: prevUsername });\n }\n\n return {\n isOpen,\n closeTooltip: unmarkIsOpen,\n loadMore,\n username,\n id: botId,\n isGallery,\n switchPm,\n results,\n help: canShowHelp && help ? `@${username} ${help}` : undefined,\n };\n}\n\nfunction getPlainText(html: string) {\n tempEl.innerHTML = html.replace(/
/g, '\\n');\n\n return tempEl.innerText;\n}\n\nfunction parseStartWithUsernameString(text: string) {\n const result = text.match(INLINE_BOT_QUERY_REGEXP);\n if (!result) {\n return { username: '', query: '', canShowHelp: false };\n }\n\n return {\n username: result[1],\n query: result[2],\n canShowHelp: result[2] === '' && !text.match(HAS_NEW_LINE),\n };\n}\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './DeleteMessageModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst DeleteMessageModalAsync: FC = (props) => {\n const { isOpen } = props;\n const DeleteMessageModal = useModuleLoader(Bundles.Extra, 'DeleteMessageModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return DeleteMessageModal ? : undefined;\n};\n\nexport default memo(DeleteMessageModalAsync);\n","import React, {\n FC, useRef, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\n\nimport Button, { OwnProps as ButtonProps } from './Button';\n\ntype OwnProps = {\n onActivate: NoneToVoidFunction;\n} & Omit;\n\nconst BUTTON_ACTIVATE_DELAY = 200;\nlet openTimeout: number | undefined;\nlet isFirstTimeActivation = true;\n\nconst ResponsiveHoverButton: FC = ({ onActivate, ...buttonProps }) => {\n const isMouseInside = useRef(false);\n\n const handleMouseEnter = useCallback(() => {\n isMouseInside.current = true;\n\n // This is used to counter additional delay caused by asynchronous module loading\n if (isFirstTimeActivation) {\n isFirstTimeActivation = false;\n onActivate();\n return;\n }\n\n if (openTimeout) {\n clearTimeout(openTimeout);\n openTimeout = undefined;\n }\n openTimeout = window.setTimeout(() => {\n if (isMouseInside.current) {\n onActivate();\n }\n }, BUTTON_ACTIVATE_DELAY);\n }, [onActivate]);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n }, []);\n\n return (\n \n );\n};\n\nexport default memo(ResponsiveHoverButton);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './AttachMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst AttachMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const AttachMenu = useModuleLoader(Bundles.Extra, 'AttachMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return AttachMenu ? : undefined;\n};\n\nexport default memo(AttachMenuAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './SymbolMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst SymbolMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const SymbolMenu = useModuleLoader(Bundles.Extra, 'SymbolMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return SymbolMenu ? : undefined;\n};\n\nexport default memo(SymbolMenuAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './InlineBotTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst InlineBotTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const InlineBotTooltip = useModuleLoader(Bundles.Extra, 'InlineBotTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return InlineBotTooltip ? : undefined;\n};\n\nexport default memo(InlineBotTooltipAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './MentionTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst MentionTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const MentionTooltip = useModuleLoader(Bundles.Extra, 'MentionTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MentionTooltip ? : undefined;\n};\n\nexport default memo(MentionTooltipAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './CustomSendMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst CustomSendMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const CustomSend = useModuleLoader(Bundles.Extra, 'CustomSendMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return CustomSend ? : undefined;\n};\n\nexport default memo(CustomSendMenuAsync);\n","import React, { FC } from '../../../lib/teact/teact';\nimport { OwnProps } from './StickerTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst StickerTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const StickerTooltip = useModuleLoader(Bundles.Extra, 'StickerTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerTooltip ? : undefined;\n};\n\nexport default StickerTooltipAsync;\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './BotKeyboardMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst BotKeyboardMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const BotKeyboardMenu = useModuleLoader(Bundles.Extra, 'BotKeyboardMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return BotKeyboardMenu ? : undefined;\n};\n\nexport default memo(BotKeyboardMenuAsync);\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiMessage, ApiUser } from '../../../api/types';\n\nimport {\n selectChat,\n selectChatMessage,\n selectSender,\n selectForwardedSender,\n selectUser,\n selectCurrentMessageList,\n selectReplyingToId,\n selectEditingId,\n selectEditingScheduledId,\n selectEditingMessage,\n} from '../../../modules/selectors';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport { pick } from '../../../util/iteratees';\nimport useAsyncRendering from '../../right/hooks/useAsyncRendering';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport { isChatPrivate } from '../../../modules/helpers';\n\nimport Button from '../../ui/Button';\nimport EmbeddedMessage from '../../common/EmbeddedMessage';\n\nimport './ComposerEmbeddedMessage.scss';\n\ntype StateProps = {\n replyingToId?: number;\n editingId?: number;\n message?: ApiMessage;\n sender?: ApiUser | ApiChat;\n shouldAnimate?: boolean;\n forwardedMessagesCount?: number;\n};\n\ntype DispatchProps = Pick;\n\nconst FORWARD_RENDERING_DELAY = 300;\n\nconst ComposerEmbeddedMessage: FC = ({\n replyingToId,\n editingId,\n message,\n sender,\n shouldAnimate,\n forwardedMessagesCount,\n setReplyingToId,\n setEditingId,\n focusMessage,\n exitForwardMode,\n}) => {\n const isShown = Boolean(\n ((replyingToId || editingId) && message)\n || (sender && forwardedMessagesCount),\n );\n const canAnimate = useAsyncRendering(\n [forwardedMessagesCount],\n forwardedMessagesCount ? FORWARD_RENDERING_DELAY : undefined,\n );\n\n const {\n shouldRender, transitionClassNames,\n } = useShowTransition(canAnimate && isShown, undefined, !shouldAnimate, undefined, !shouldAnimate);\n\n const clearEmbedded = useCallback(() => {\n if (replyingToId) {\n setReplyingToId({ messageId: undefined });\n } else if (editingId) {\n setEditingId({ messageId: undefined });\n } else if (forwardedMessagesCount) {\n exitForwardMode();\n }\n }, [replyingToId, editingId, forwardedMessagesCount, setReplyingToId, setEditingId, exitForwardMode]);\n\n useEffect(() => (isShown ? captureEscKeyListener(clearEmbedded) : undefined), [isShown, clearEmbedded]);\n\n const handleMessageClick = useCallback((): void => {\n focusMessage({ chatId: message!.chatId, messageId: message!.id });\n }, [focusMessage, message]);\n\n const className = buildClassName('ComposerEmbeddedMessage', transitionClassNames);\n\n const customText = forwardedMessagesCount && forwardedMessagesCount > 1\n ? `${forwardedMessagesCount} forwarded messages`\n : undefined;\n\n if (!shouldRender) {\n return undefined;\n }\n\n return (\n
\n
\n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId, threadId, type: messageListType } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId || !messageListType) {\n return {};\n }\n\n const {\n currentUserId,\n forwardMessages: { fromChatId, toChatId, messageIds: forwardMessageIds },\n } = global;\n\n const replyingToId = selectReplyingToId(global, chatId, threadId);\n const editingId = messageListType === 'scheduled'\n ? selectEditingScheduledId(global, chatId)\n : selectEditingId(global, chatId, threadId);\n const shouldAnimate = global.settings.byKey.animationLevel >= 1;\n const isForwarding = toChatId === chatId;\n\n let message;\n if (replyingToId) {\n message = selectChatMessage(global, chatId, replyingToId);\n } else if (editingId) {\n message = selectEditingMessage(global, chatId, threadId, messageListType);\n } else if (isForwarding && forwardMessageIds!.length === 1) {\n message = selectChatMessage(global, fromChatId!, forwardMessageIds![0]);\n }\n\n let sender: ApiChat | ApiUser | undefined;\n if (replyingToId && message) {\n const { forwardInfo } = message;\n const isChatWithSelf = chatId === currentUserId;\n\n if (forwardInfo && (forwardInfo.isChannelPost || isChatWithSelf)) {\n sender = selectForwardedSender(global, message);\n }\n\n if (!sender) {\n sender = selectSender(global, message);\n }\n } else if (isForwarding) {\n sender = isChatPrivate(fromChatId!) ? selectUser(global, fromChatId!) : selectChat(global, fromChatId!);\n }\n\n return {\n replyingToId,\n editingId,\n message,\n sender,\n shouldAnimate,\n forwardedMessagesCount: isForwarding ? forwardMessageIds!.length : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setReplyingToId',\n 'setEditingId',\n 'focusMessage',\n 'exitForwardMode',\n ]),\n)(ComposerEmbeddedMessage));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './AttachmentModal';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst AttachmentModalAsync: FC = (props) => {\n const { attachments } = props;\n const AttachmentModal = useModuleLoader(Bundles.Extra, 'AttachmentModal', !attachments.length);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return AttachmentModal ? : undefined;\n};\n\nexport default memo(AttachmentModalAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './PollModal';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst PollModalAsync: FC = (props) => {\n const { isOpen } = props;\n const PollModal = useModuleLoader(Bundles.Extra, 'PollModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return PollModal ? : undefined;\n};\n\nexport default memo(PollModalAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './DropArea';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst DropAreaAsync: FC = (props) => {\n const { isOpen } = props;\n const DropArea = useModuleLoader(Bundles.Extra, 'DropArea', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return DropArea ? : undefined;\n};\n\nexport default memo(DropAreaAsync);\nexport { DropAreaState } from './DropArea';\n","import React, {\n FC, memo, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiMessage, ApiMessageEntityTypes, ApiWebPage } from '../../../api/types';\n\nimport { RE_LINK_TEMPLATE } from '../../../config';\nimport { selectNoWebPage } from '../../../modules/selectors';\nimport { pick } from '../../../util/iteratees';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport useOnChange from '../../../hooks/useOnChange';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useCurrentOrPrev from '../../../hooks/useCurrentOrPrev';\nimport buildClassName from '../../../util/buildClassName';\n\nimport WebPage from '../message/WebPage';\nimport Button from '../../ui/Button';\n\nimport './WebPagePreview.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageText: string;\n disabled?: boolean;\n};\n\ntype StateProps = {\n webPagePreview?: ApiWebPage;\n noWebPage?: boolean;\n};\ntype DispatchProps = Pick;\n\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\n\nconst WebPagePreview: FC = ({\n chatId,\n threadId,\n messageText,\n disabled,\n webPagePreview,\n noWebPage,\n loadWebPagePreview,\n clearWebPagePreview,\n toggleMessageWebPage,\n}) => {\n const link = useMemo(() => {\n const { text, entities } = parseMessageInput(messageText);\n\n const linkEntity = entities && entities.find(({ type }) => type === ApiMessageEntityTypes.TextUrl);\n if (linkEntity) {\n return linkEntity.url;\n }\n\n const textMatch = text.match(RE_LINK);\n if (textMatch) {\n return textMatch[0];\n }\n\n return undefined;\n }, [messageText]);\n\n useEffect(() => {\n if (link) {\n loadWebPagePreview({ text: link });\n } else {\n clearWebPagePreview();\n toggleMessageWebPage({ chatId, threadId });\n }\n }, [chatId, toggleMessageWebPage, clearWebPagePreview, link, loadWebPagePreview, threadId]);\n\n useOnChange(() => {\n clearWebPagePreview();\n toggleMessageWebPage({ chatId, threadId });\n }, [chatId]);\n\n const isShown = Boolean(webPagePreview && messageText.length && !noWebPage && !disabled);\n const { shouldRender, transitionClassNames } = useShowTransition(isShown);\n\n const renderingWebPage = useCurrentOrPrev(webPagePreview);\n\n if (!shouldRender || !renderingWebPage) {\n return undefined;\n }\n\n const handleClearWebpagePreview = () => {\n toggleMessageWebPage({ chatId, threadId, noWebPage: true });\n };\n\n // TODO Refactor so `WebPage` can be used without message\n const { photo, ...webPageWithoutPhoto } = renderingWebPage;\n const messageStub = {\n content: {\n webPage: webPageWithoutPhoto,\n },\n } as ApiMessage;\n\n return (\n
\n
\n \n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId }): StateProps => {\n const noWebPage = selectNoWebPage(global, chatId, threadId);\n return {\n webPagePreview: global.webPagePreview,\n noWebPage,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadWebPagePreview', 'clearWebPagePreview', 'toggleMessageWebPage',\n ]),\n)(WebPagePreview));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './CalendarModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst CalendarModalAsync: FC = (props) => {\n const { isOpen } = props;\n const CalendarModal = useModuleLoader(Bundles.Extra, 'CalendarModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return CalendarModal ? : undefined;\n};\n\nexport default memo(CalendarModalAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './PaymentModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst PaymentModalAsync: FC = (props) => {\n const { isOpen } = props;\n const PaymentModal = useModuleLoader(Bundles.Extra, 'PaymentModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return PaymentModal ? : undefined;\n};\n\nexport default memo(PaymentModalAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './ReceiptModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ReceiptModalAsync: FC = (props) => {\n const { isOpen } = props;\n const ReceiptModal = useModuleLoader(Bundles.Extra, 'ReceiptModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ReceiptModal ? : undefined;\n};\n\nexport default memo(ReceiptModalAsync);\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState, MessageListType } from '../../../global/types';\nimport {\n ApiAttachment,\n ApiBotInlineResult,\n ApiBotInlineMediaResult,\n ApiSticker,\n ApiVideo,\n ApiNewPoll,\n ApiMessage,\n ApiFormattedText,\n ApiChat,\n ApiChatMember,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { InlineBotSettings } from '../../../types';\n\nimport { BASE_EMOJI_KEYWORD_LANG, EDITABLE_INPUT_ID, SCHEDULED_WHEN_ONLINE } from '../../../config';\nimport { IS_VOICE_RECORDING_SUPPORTED, IS_SINGLE_COLUMN_LAYOUT, IS_IOS } from '../../../util/environment';\nimport {\n selectChat,\n selectIsChatWithBot,\n selectIsRightColumnShown,\n selectIsInSelectMode,\n selectNewestMessageWithBotKeyboardButtons,\n selectDraft,\n selectScheduledIds,\n selectEditingMessage,\n selectIsChatWithSelf,\n selectChatUser,\n} from '../../../modules/selectors';\nimport {\n getAllowedAttachmentOptions,\n getChatSlowModeOptions,\n isChatPrivate,\n isChatAdmin,\n} from '../../../modules/helpers';\nimport { formatMediaDuration, formatVoiceRecordDuration, getDayStartAt } from '../../../util/dateFormat';\nimport focusEditableElement from '../../../util/focusEditableElement';\nimport parseMessageInput from './helpers/parseMessageInput';\nimport buildAttachment from './helpers/buildAttachment';\nimport renderText from '../../common/helpers/renderText';\nimport insertHtmlInSelection from '../../../util/insertHtmlInSelection';\nimport deleteLastCharacterOutsideSelection from '../../../util/deleteLastCharacterOutsideSelection';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport { isSelectionInsideInput } from './helpers/selection';\nimport applyIosAutoCapitalizationFix from './helpers/applyIosAutoCapitalizationFix';\n\nimport useFlag from '../../../hooks/useFlag';\nimport useVoiceRecording from './hooks/useVoiceRecording';\nimport useClipboardPaste from './hooks/useClipboardPaste';\nimport useDraft from './hooks/useDraft';\nimport useEditing from './hooks/useEditing';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useStickerTooltip from './hooks/useStickerTooltip';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useMentionTooltip from './hooks/useMentionTooltip';\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport useLang from '../../../hooks/useLang';\nimport useInlineBotTooltip from './hooks/useInlineBotTooltip';\nimport windowSize from '../../../util/windowSize';\n\nimport DeleteMessageModal from '../../common/DeleteMessageModal.async';\nimport Button from '../../ui/Button';\nimport ResponsiveHoverButton from '../../ui/ResponsiveHoverButton';\nimport Spinner from '../../ui/Spinner';\nimport AttachMenu from './AttachMenu.async';\nimport SymbolMenu from './SymbolMenu.async';\nimport InlineBotTooltip from './InlineBotTooltip.async';\nimport MentionTooltip from './MentionTooltip.async';\nimport CustomSendMenu from './CustomSendMenu.async';\nimport StickerTooltip from './StickerTooltip.async';\nimport EmojiTooltip from './EmojiTooltip.async';\nimport BotKeyboardMenu from './BotKeyboardMenu.async';\nimport MessageInput from './MessageInput';\nimport ComposerEmbeddedMessage from './ComposerEmbeddedMessage';\nimport AttachmentModal from './AttachmentModal.async';\nimport PollModal from './PollModal.async';\nimport DropArea, { DropAreaState } from './DropArea.async';\nimport WebPagePreview from './WebPagePreview';\nimport Portal from '../../ui/Portal';\nimport CalendarModal from '../../common/CalendarModal.async';\nimport PaymentModal from '../../payment/PaymentModal.async';\nimport ReceiptModal from '../../payment/ReceiptModal.async';\n\nimport './Composer.scss';\n\ntype OwnProps = {\n chatId: number;\n threadId: number;\n messageListType: MessageListType;\n dropAreaState: string;\n isReady: boolean;\n onDropHide: NoneToVoidFunction;\n};\n\ntype StateProps = {\n editingMessage?: ApiMessage;\n chat?: ApiChat;\n draft?: ApiFormattedText;\n isChatWithBot?: boolean;\n isChatWithSelf?: boolean;\n isRightColumnShown?: boolean;\n isSelectModeActive?: boolean;\n isForwarding?: boolean;\n isPollModalOpen?: boolean;\n isPaymentModalOpen?: boolean;\n isReceiptModalOpen?: boolean;\n botKeyboardMessageId?: number;\n withScheduledButton?: boolean;\n shouldSchedule?: boolean;\n canScheduleUntilOnline?: boolean;\n stickersForEmoji?: ApiSticker[];\n groupChatMembers?: ApiChatMember[];\n currentUserId?: number;\n usersById?: Record;\n recentEmojis: string[];\n lastSyncTime?: number;\n contentToBeScheduled?: GlobalState['messages']['contentToBeScheduled'];\n shouldSuggestStickers?: boolean;\n baseEmojiKeywords?: Record;\n emojiKeywords?: Record;\n serverTimeOffset: number;\n topInlineBotIds?: number[];\n isInlineBotLoading: boolean;\n inlineBots?: Record;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nenum MainButtonState {\n Send = 'send',\n Record = 'record',\n Edit = 'edit',\n}\n\nconst VOICE_RECORDING_FILENAME = 'wonderful-voice-message.ogg';\n// When voice recording is active, composer placeholder will hide to prevent overlapping\nconst SCREEN_WIDTH_TO_HIDE_PLACEHOLDER = 600; // px\n\nconst MOBILE_KEYBOARD_HIDE_DELAY_MS = 100;\nconst SELECT_MODE_TRANSITION_MS = 200;\nconst CAPTION_MAX_LENGTH = 1024;\nconst SENDING_ANIMATION_DURATION = 350;\n// eslint-disable-next-line max-len\nconst APPENDIX = '';\n\nconst Composer: FC = ({\n dropAreaState,\n shouldSchedule,\n canScheduleUntilOnline,\n isReady,\n onDropHide,\n editingMessage,\n chatId,\n threadId,\n messageListType,\n draft,\n chat,\n connectionState,\n isChatWithBot,\n isChatWithSelf,\n isRightColumnShown,\n isSelectModeActive,\n isForwarding,\n isPollModalOpen,\n isPaymentModalOpen,\n isReceiptModalOpen,\n botKeyboardMessageId,\n withScheduledButton,\n stickersForEmoji,\n groupChatMembers,\n topInlineBotIds,\n currentUserId,\n usersById,\n lastSyncTime,\n contentToBeScheduled,\n shouldSuggestStickers,\n baseEmojiKeywords,\n emojiKeywords,\n serverTimeOffset,\n recentEmojis,\n inlineBots,\n isInlineBotLoading,\n sendMessage,\n editMessage,\n saveDraft,\n clearDraft,\n showDialog,\n setStickerSearchQuery,\n setGifSearchQuery,\n forwardMessages,\n openPollModal,\n closePollModal,\n loadScheduledHistory,\n closePaymentModal,\n openChat,\n clearReceipt,\n addRecentEmoji,\n sendInlineBotResult,\n}) => {\n const lang = useLang();\n\n // eslint-disable-next-line no-null/no-null\n const appendixRef = useRef(null);\n const [html, setHtml] = useState('');\n const lastMessageSendTimeSeconds = useRef();\n const prevDropAreaState = usePrevious(dropAreaState);\n const [isCalendarOpen, openCalendar, closeCalendar] = useFlag();\n const [\n scheduledMessageArgs, setScheduledMessageArgs,\n ] = useState();\n const { width: windowWidth } = windowSize.get();\n\n // Cache for frequently updated state\n const htmlRef = useRef(html);\n useEffect(() => {\n htmlRef.current = html;\n }, [html]);\n\n useEffect(() => {\n lastMessageSendTimeSeconds.current = undefined;\n }, [chatId]);\n\n useEffect(() => {\n if (chatId && lastSyncTime && threadId === MAIN_THREAD_ID && isReady) {\n loadScheduledHistory();\n }\n }, [isReady, chatId, loadScheduledHistory, lastSyncTime, threadId]);\n\n useLayoutEffect(() => {\n if (!appendixRef.current) return;\n\n appendixRef.current.innerHTML = APPENDIX;\n }, []);\n\n useEffect(() => {\n if (contentToBeScheduled) {\n setScheduledMessageArgs(contentToBeScheduled);\n openCalendar();\n }\n }, [contentToBeScheduled, openCalendar]);\n\n const [attachments, setAttachments] = useState([]);\n\n const [isBotKeyboardOpen, openBotKeyboard, closeBotKeyboard] = useFlag();\n const [isAttachMenuOpen, openAttachMenu, closeAttachMenu] = useFlag();\n const [isSymbolMenuOpen, openSymbolMenu, closeSymbolMenu] = useFlag();\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n const [isSymbolMenuLoaded, onSymbolMenuLoadingComplete] = useFlag();\n const [isHoverDisabled, disableHover, enableHover] = useFlag();\n\n const {\n startRecordingVoice,\n stopRecordingVoice,\n pauseRecordingVoice,\n activeVoiceRecording,\n currentRecordTime,\n recordButtonRef: mainButtonRef,\n startRecordTimeRef,\n } = useVoiceRecording();\n\n const mainButtonState = editingMessage\n ? MainButtonState.Edit\n : !IS_VOICE_RECORDING_SUPPORTED || activeVoiceRecording || (html && !attachments.length) || isForwarding\n ? MainButtonState.Send\n : MainButtonState.Record;\n const canShowCustomSendMenu = !shouldSchedule;\n\n const {\n isMentionTooltipOpen, mentionFilter,\n closeMentionTooltip, insertMention,\n mentionFilteredUsers,\n } = useMentionTooltip(\n !attachments.length,\n html,\n setHtml,\n undefined,\n groupChatMembers,\n topInlineBotIds,\n currentUserId,\n usersById,\n );\n\n const {\n isOpen: isInlineBotTooltipOpen,\n id: inlineBotId,\n isGallery: isInlineBotTooltipGallery,\n switchPm: inlineBotSwitchPm,\n results: inlineBotResults,\n closeTooltip: closeInlineBotTooltip,\n help: inlineBotHelp,\n loadMore: loadMoreForInlineBot,\n } = useInlineBotTooltip(\n Boolean(!attachments.length && lastSyncTime),\n chatId,\n html,\n inlineBots,\n );\n\n const {\n isContextMenuOpen: isCustomSendMenuOpen,\n handleContextMenu,\n handleContextMenuClose,\n handleContextMenuHide,\n } = useContextMenuHandlers(mainButtonRef, !(mainButtonState === MainButtonState.Send && canShowCustomSendMenu));\n\n const allowedAttachmentOptions = useMemo(() => {\n return getAllowedAttachmentOptions(chat, isChatWithBot);\n }, [chat, isChatWithBot]);\n\n const isAdmin = chat && isChatAdmin(chat);\n const slowMode = getChatSlowModeOptions(chat);\n\n const { isStickerTooltipOpen, closeStickerTooltip } = useStickerTooltip(\n Boolean(shouldSuggestStickers && allowedAttachmentOptions.canSendStickers && !attachments.length),\n html,\n stickersForEmoji,\n !isReady,\n );\n const {\n isEmojiTooltipOpen, closeEmojiTooltip, filteredEmojis, insertEmoji,\n } = useEmojiTooltip(\n Boolean(shouldSuggestStickers && allowedAttachmentOptions.canSendStickers && !attachments.length),\n html,\n recentEmojis,\n undefined,\n setHtml,\n baseEmojiKeywords,\n emojiKeywords,\n !isReady,\n );\n\n const insertTextAndUpdateCursor = useCallback((text: string, inputId: string = EDITABLE_INPUT_ID) => {\n const selection = window.getSelection()!;\n const messageInput = document.getElementById(inputId)!;\n const newHtml = renderText(text, ['escape_html', 'emoji_html', 'br_html'])\n .join('')\n .replace(/\\u200b+/g, '\\u200b');\n\n if (selection.rangeCount) {\n const selectionRange = selection.getRangeAt(0);\n if (isSelectionInsideInput(selectionRange, inputId)) {\n insertHtmlInSelection(newHtml);\n messageInput.dispatchEvent(new Event('input', { bubbles: true }));\n return;\n }\n }\n\n setHtml(`${htmlRef.current!}${newHtml}`);\n\n // If selection is outside of input, set cursor at the end of input\n requestAnimationFrame(() => {\n focusEditableElement(messageInput);\n });\n }, []);\n\n const removeSymbol = useCallback(() => {\n const selection = window.getSelection()!;\n\n if (selection.rangeCount) {\n const selectionRange = selection.getRangeAt(0);\n if (isSelectionInsideInput(selectionRange, EDITABLE_INPUT_ID)) {\n document.execCommand('delete', false);\n return;\n }\n }\n\n setHtml(deleteLastCharacterOutsideSelection(htmlRef.current!));\n }, []);\n\n const resetComposer = useCallback((shouldPreserveInput = false) => {\n if (!shouldPreserveInput) {\n setHtml('');\n }\n setAttachments([]);\n closeStickerTooltip();\n closeCalendar();\n setScheduledMessageArgs(undefined);\n closeMentionTooltip();\n closeEmojiTooltip();\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n // @perf\n setTimeout(() => closeSymbolMenu(), SENDING_ANIMATION_DURATION);\n } else {\n closeSymbolMenu();\n }\n }, [closeStickerTooltip, closeCalendar, closeMentionTooltip, closeEmojiTooltip, closeSymbolMenu]);\n\n // Handle chat change\n const prevChatId = usePrevious(chatId);\n useEffect(() => {\n if (!prevChatId || chatId === prevChatId) {\n return;\n }\n\n stopRecordingVoice();\n resetComposer();\n }, [chatId, prevChatId, resetComposer, stopRecordingVoice]);\n\n const handleEditComplete = useEditing(htmlRef, setHtml, editingMessage, resetComposer, openDeleteModal, editMessage);\n useDraft(draft, chatId, threadId, html, htmlRef, setHtml, editingMessage, saveDraft, clearDraft);\n useClipboardPaste(insertTextAndUpdateCursor, setAttachments, editingMessage);\n\n const handleFileSelect = useCallback(async (files: File[], isQuick: boolean) => {\n setAttachments(await Promise.all(files.map((file) => buildAttachment(file.name, file, isQuick))));\n }, []);\n\n const handleAppendFiles = useCallback(async (files: File[], isQuick: boolean) => {\n setAttachments([\n ...attachments,\n ...await Promise.all(files.map((file) => buildAttachment(file.name, file, isQuick))),\n ]);\n }, [attachments]);\n\n const handleClearAttachment = useCallback(() => {\n setAttachments([]);\n }, []);\n\n const handleSend = useCallback(async (isSilent = false, scheduledAt?: number) => {\n if (connectionState !== 'connectionStateReady') {\n return;\n }\n\n let currentAttachments = attachments;\n\n if (activeVoiceRecording) {\n const record = await stopRecordingVoice();\n if (record) {\n const { blob, duration, waveform } = record;\n currentAttachments = [await buildAttachment(\n VOICE_RECORDING_FILENAME,\n blob,\n false,\n { voice: { duration, waveform } },\n )];\n }\n }\n\n const { text, entities } = parseMessageInput(htmlRef.current!);\n if (!currentAttachments.length && !text && !isForwarding) {\n return;\n }\n\n if (currentAttachments.length && text && text.length > CAPTION_MAX_LENGTH) {\n const extraLength = text.length - CAPTION_MAX_LENGTH;\n showDialog({\n data: {\n message: 'CAPTION_TOO_LONG_PLEASE_REMOVE_CHARACTERS',\n textParams: {\n '{EXTRA_CHARS_COUNT}': extraLength,\n '{PLURAL_S}': extraLength > 1 ? 's' : '',\n },\n hasErrorKey: true,\n },\n });\n return;\n }\n\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n\n if (currentAttachments.length || text) {\n if (slowMode && !isAdmin) {\n const nowSeconds = Math.floor(Date.now() / 1000) + serverTimeOffset;\n const secondsSinceLastMessage = lastMessageSendTimeSeconds.current\n && Math.floor(nowSeconds - lastMessageSendTimeSeconds.current);\n const nextSendDateNotReached = slowMode.nextSendDate && slowMode.nextSendDate > nowSeconds;\n\n if (\n (secondsSinceLastMessage && secondsSinceLastMessage < slowMode.seconds)\n || nextSendDateNotReached\n ) {\n const secondsRemaining = nextSendDateNotReached\n ? slowMode.nextSendDate! - nowSeconds\n : slowMode.seconds - secondsSinceLastMessage!;\n showDialog({\n data: {\n message: lang('SlowModeHint', formatMediaDuration(secondsRemaining)),\n isSlowMode: true,\n hasErrorKey: false,\n },\n });\n\n messageInput.blur();\n\n return;\n }\n }\n\n sendMessage({\n text,\n entities,\n attachments: currentAttachments,\n scheduledAt,\n isSilent,\n });\n }\n if (isForwarding) {\n forwardMessages();\n }\n\n lastMessageSendTimeSeconds.current = Math.floor(Date.now() / 1000) + serverTimeOffset;\n\n clearDraft({ chatId, localOnly: true });\n\n if (IS_IOS && messageInput === document.activeElement) {\n applyIosAutoCapitalizationFix(messageInput);\n }\n\n // Wait until message animation starts\n requestAnimationFrame(() => {\n resetComposer();\n });\n }, [\n connectionState, attachments, activeVoiceRecording, isForwarding, serverTimeOffset, clearDraft, chatId,\n resetComposer, stopRecordingVoice, showDialog, slowMode, isAdmin, sendMessage, forwardMessages, lang,\n ]);\n\n const handleStickerSelect = useCallback((sticker: ApiSticker, shouldPreserveInput = false) => {\n sticker = {\n ...sticker,\n isPreloadedGlobally: true,\n };\n\n if (shouldSchedule) {\n setScheduledMessageArgs({ sticker });\n openCalendar();\n } else {\n sendMessage({ sticker });\n requestAnimationFrame(() => {\n resetComposer(shouldPreserveInput);\n });\n }\n }, [shouldSchedule, openCalendar, sendMessage, resetComposer]);\n\n const handleGifSelect = useCallback((gif: ApiVideo) => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ gif });\n openCalendar();\n } else {\n sendMessage({ gif });\n requestAnimationFrame(() => {\n resetComposer(true);\n });\n }\n }, [shouldSchedule, openCalendar, sendMessage, resetComposer]);\n\n const handleInlineBotSelect = useCallback((inlineResult: ApiBotInlineResult | ApiBotInlineMediaResult) => {\n if (connectionState !== 'connectionStateReady') {\n return;\n }\n\n sendInlineBotResult({\n id: inlineResult.id,\n queryId: inlineResult.queryId,\n });\n\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n if (IS_IOS && messageInput === document.activeElement) {\n applyIosAutoCapitalizationFix(messageInput);\n }\n\n clearDraft({ chatId, localOnly: true });\n requestAnimationFrame(() => {\n resetComposer();\n });\n }, [chatId, clearDraft, connectionState, resetComposer, sendInlineBotResult]);\n\n const handlePollSend = useCallback((poll: ApiNewPoll) => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ poll });\n closePollModal();\n openCalendar();\n } else {\n sendMessage({ poll });\n closePollModal();\n }\n }, [closePollModal, openCalendar, sendMessage, shouldSchedule]);\n\n const handleSilentSend = useCallback(() => {\n if (shouldSchedule) {\n setScheduledMessageArgs({ isSilent: true });\n openCalendar();\n } else {\n handleSend(true);\n }\n }, [handleSend, openCalendar, shouldSchedule]);\n\n const handleMessageSchedule = useCallback((date: Date, isWhenOnline = false) => {\n const { isSilent, ...restArgs } = scheduledMessageArgs || {};\n\n // Scheduled time can not be less than 10 seconds in future\n const scheduledAt = Math.round(Math.max(date.getTime(), Date.now() + 60 * 1000) / 1000)\n + (isWhenOnline ? 0 : serverTimeOffset);\n\n if (!scheduledMessageArgs || Object.keys(restArgs).length === 0) {\n handleSend(!!isSilent, scheduledAt);\n } else {\n sendMessage({\n ...scheduledMessageArgs,\n scheduledAt,\n });\n requestAnimationFrame(() => {\n resetComposer();\n });\n }\n closeCalendar();\n }, [closeCalendar, handleSend, resetComposer, scheduledMessageArgs, sendMessage, serverTimeOffset]);\n\n const handleMessageScheduleUntilOnline = useCallback(() => {\n handleMessageSchedule(new Date(SCHEDULED_WHEN_ONLINE * 1000), true);\n }, [handleMessageSchedule]);\n\n const handleCloseCalendar = useCallback(() => {\n closeCalendar();\n setScheduledMessageArgs(undefined);\n }, [closeCalendar]);\n\n const handleSearchOpen = useCallback((type: 'stickers' | 'gifs') => {\n if (type === 'stickers') {\n setStickerSearchQuery({ query: '' });\n setGifSearchQuery({ query: undefined });\n } else {\n setGifSearchQuery({ query: '' });\n setStickerSearchQuery({ query: undefined });\n }\n }, [setStickerSearchQuery, setGifSearchQuery]);\n\n const handleSymbolMenuOpen = useCallback(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n\n if (!IS_SINGLE_COLUMN_LAYOUT || messageInput !== document.activeElement) {\n openSymbolMenu();\n return;\n }\n\n messageInput.blur();\n setTimeout(() => {\n openSymbolMenu();\n }, MOBILE_KEYBOARD_HIDE_DELAY_MS);\n }, [openSymbolMenu]);\n\n const handleAllScheduledClick = useCallback(() => {\n openChat({ id: chatId, threadId, type: 'scheduled' });\n }, [openChat, chatId, threadId]);\n\n useEffect(() => {\n if (isRightColumnShown && IS_SINGLE_COLUMN_LAYOUT) {\n closeSymbolMenu();\n }\n }, [isRightColumnShown, closeSymbolMenu]);\n\n useEffect(() => {\n if (!isReady) return;\n\n if (isSelectModeActive) {\n disableHover();\n } else {\n setTimeout(() => {\n enableHover();\n }, SELECT_MODE_TRANSITION_MS);\n }\n }, [isSelectModeActive, enableHover, disableHover, isReady]);\n\n const mainButtonHandler = useCallback(() => {\n switch (mainButtonState) {\n case MainButtonState.Send:\n if (shouldSchedule) {\n if (activeVoiceRecording) {\n pauseRecordingVoice();\n }\n openCalendar();\n } else {\n handleSend();\n requestAnimationFrame(() => {\n resetComposer();\n });\n }\n break;\n case MainButtonState.Record:\n startRecordingVoice();\n break;\n case MainButtonState.Edit:\n handleEditComplete();\n break;\n default:\n break;\n }\n }, [\n mainButtonState, resetComposer, shouldSchedule, startRecordingVoice, handleEditComplete,\n activeVoiceRecording, openCalendar, pauseRecordingVoice, handleSend,\n ]);\n\n const areVoiceMessagesNotAllowed = mainButtonState === MainButtonState.Record\n && !allowedAttachmentOptions.canAttachMedia;\n\n const prevEditedMessage = usePrevious(editingMessage, true);\n const renderedEditedMessage = editingMessage || prevEditedMessage;\n\n const scheduledDefaultDate = new Date();\n scheduledDefaultDate.setSeconds(0);\n scheduledDefaultDate.setMilliseconds(0);\n\n const scheduledMaxDate = new Date();\n scheduledMaxDate.setFullYear(scheduledMaxDate.getFullYear() + 1);\n\n let sendButtonAriaLabel = 'SendMessage';\n switch (mainButtonState) {\n case MainButtonState.Edit:\n sendButtonAriaLabel = 'Save edited message';\n break;\n case MainButtonState.Record:\n sendButtonAriaLabel = areVoiceMessagesNotAllowed\n ? 'Conversation.DefaultRestrictedMedia'\n : 'AccDescrVoiceMessage';\n }\n\n const className = buildClassName(\n 'Composer',\n !isSelectModeActive && 'shown',\n isHoverDisabled && 'hover-disabled',\n );\n\n const symbolMenuButtonClassName = buildClassName(\n 'mobile-symbol-menu-button',\n !isReady && 'not-ready',\n isSymbolMenuLoaded\n ? (isSymbolMenuOpen && 'menu-opened')\n : (isSymbolMenuOpen && 'is-loading'),\n );\n\n const onSend = mainButtonState === MainButtonState.Edit\n ? handleEditComplete\n : (shouldSchedule ? openCalendar : handleSend);\n\n return (\n
\n {allowedAttachmentOptions.canAttachMedia && isReady && (\n \n \n \n )}\n \n \n \n \n {renderedEditedMessage && (\n \n )}\n \n \n
\n
\n \n \n
\n {IS_SINGLE_COLUMN_LAYOUT ? (\n \n \n \n {isSymbolMenuOpen && !isSymbolMenuLoaded && }\n \n ) : (\n \n \n \n )}\n \n {isInlineBotLoading && Boolean(inlineBotId) && (\n \n )}\n {withScheduledButton && (\n \n \n \n )}\n {botKeyboardMessageId && !activeVoiceRecording && !editingMessage && (\n \n \n \n )}\n {!activeVoiceRecording && !editingMessage && (\n \n \n \n )}\n {activeVoiceRecording && currentRecordTime && (\n \n {formatVoiceRecordDuration(currentRecordTime - startRecordTimeRef.current!)}\n \n )}\n \n \n \n {botKeyboardMessageId && (\n \n )}\n \n
\n
\n {activeVoiceRecording && (\n \n \n \n )}\n \n \n \n \n \n {canShowCustomSendMenu && (\n \n )}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const chat = selectChat(global, chatId);\n const chatUser = chat && selectChatUser(global, chat);\n const isChatWithBot = chat ? selectIsChatWithBot(global, chat) : undefined;\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const messageWithActualBotKeyboard = isChatWithBot && selectNewestMessageWithBotKeyboardButtons(global, chatId);\n const scheduledIds = selectScheduledIds(global, chatId);\n const { language } = global.settings.byKey;\n const baseEmojiKeywords = global.emojiKeywords[BASE_EMOJI_KEYWORD_LANG];\n const emojiKeywords = language !== BASE_EMOJI_KEYWORD_LANG ? global.emojiKeywords[language] : undefined;\n\n return {\n editingMessage: selectEditingMessage(global, chatId, threadId, messageListType),\n connectionState: global.connectionState,\n draft: selectDraft(global, chatId, threadId),\n chat,\n isChatWithBot,\n isChatWithSelf,\n canScheduleUntilOnline: (\n !isChatWithSelf && !isChatWithBot\n && (chat && chatUser && isChatPrivate(chatId) && chatUser.status && Boolean(chatUser.status.wasOnline))\n ),\n isRightColumnShown: selectIsRightColumnShown(global),\n isSelectModeActive: selectIsInSelectMode(global),\n withScheduledButton: (\n threadId === MAIN_THREAD_ID\n && messageListType === 'thread'\n && Boolean(scheduledIds && scheduledIds.length)\n ),\n shouldSchedule: messageListType === 'scheduled',\n botKeyboardMessageId: messageWithActualBotKeyboard ? messageWithActualBotKeyboard.id : undefined,\n isForwarding: chatId === global.forwardMessages.toChatId,\n isPollModalOpen: global.isPollModalOpen,\n stickersForEmoji: global.stickers.forEmoji.stickers,\n groupChatMembers: chat && chat.fullInfo && chat.fullInfo.members,\n topInlineBotIds: global.topInlineBots && global.topInlineBots.userIds,\n currentUserId: global.currentUserId,\n usersById: global.users.byId,\n lastSyncTime: global.lastSyncTime,\n contentToBeScheduled: global.messages.contentToBeScheduled,\n isPaymentModalOpen: global.payment.isPaymentModalOpen,\n isReceiptModalOpen: Boolean(global.payment.receipt),\n shouldSuggestStickers: global.settings.byKey.shouldSuggestStickers,\n recentEmojis: global.recentEmojis,\n baseEmojiKeywords: baseEmojiKeywords ? baseEmojiKeywords.keywords : undefined,\n emojiKeywords: emojiKeywords ? emojiKeywords.keywords : undefined,\n serverTimeOffset: global.serverTimeOffset,\n inlineBots: global.inlineBots.byUsername,\n isInlineBotLoading: global.inlineBots.isLoading,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'sendMessage',\n 'editMessage',\n 'saveDraft',\n 'clearDraft',\n 'showDialog',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'forwardMessages',\n 'openPollModal',\n 'closePollModal',\n 'closePaymentModal',\n 'clearReceipt',\n 'loadScheduledHistory',\n 'openChat',\n 'addRecentEmoji',\n 'sendInlineBotResult',\n ]),\n)(Composer));\n","import {\n useCallback, useEffect, useRef, useState,\n} from '../../../../lib/teact/teact';\n\nimport { IS_IOS, IS_VOICE_RECORDING_SUPPORTED } from '../../../../util/environment';\nimport * as voiceRecording from '../../../../util/voiceRecording';\nimport captureEscKeyListener from '../../../../util/captureEscKeyListener';\n\ntype ActiveVoiceRecording = { stop: () => Promise; pause: NoneToVoidFunction } | undefined;\n\nexport default () => {\n // eslint-disable-next-line no-null/no-null\n const recordButtonRef = useRef(null);\n const [activeVoiceRecording, setActiveVoiceRecording] = useState();\n const startRecordTimeRef = useRef();\n const [currentRecordTime, setCurrentRecordTime] = useState();\n\n useEffect(() => {\n // Preloading worker fixes silent first record on iOS\n if (IS_IOS && IS_VOICE_RECORDING_SUPPORTED) {\n void voiceRecording.init();\n }\n }, []);\n\n const startRecordingVoice = useCallback(async () => {\n try {\n const { stop, pause } = await voiceRecording.start((tickVolume: number) => {\n if (recordButtonRef.current) {\n if (startRecordTimeRef.current && Date.now() % 4 === 0) {\n recordButtonRef.current.style.boxShadow = `0 0 0 ${(tickVolume || 0) * 50}px rgba(0,0,0,.15)`;\n }\n setCurrentRecordTime(Date.now());\n }\n });\n startRecordTimeRef.current = Date.now();\n setCurrentRecordTime(Date.now());\n\n setActiveVoiceRecording({ stop, pause });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }, []);\n\n const pauseRecordingVoice = useCallback(() => {\n if (!activeVoiceRecording) {\n return undefined;\n }\n\n if (recordButtonRef.current) {\n recordButtonRef.current.style.boxShadow = 'none';\n }\n\n try {\n return activeVoiceRecording!.pause();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n return undefined;\n }\n }, [activeVoiceRecording]);\n\n const stopRecordingVoice = useCallback(() => {\n if (!activeVoiceRecording) {\n return undefined;\n }\n\n setActiveVoiceRecording(undefined);\n startRecordTimeRef.current = undefined;\n setCurrentRecordTime(undefined);\n if (recordButtonRef.current) {\n recordButtonRef.current.style.boxShadow = 'none';\n }\n try {\n return activeVoiceRecording!.stop();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n return undefined;\n }\n }, [activeVoiceRecording]);\n\n useEffect(() => {\n return activeVoiceRecording ? captureEscKeyListener(stopRecordingVoice) : undefined;\n }, [activeVoiceRecording, stopRecordingVoice]);\n\n return {\n startRecordingVoice,\n pauseRecordingVoice,\n stopRecordingVoice,\n activeVoiceRecording,\n currentRecordTime,\n recordButtonRef,\n startRecordTimeRef,\n };\n};\n","import { useEffect } from '../../../../lib/teact/teact';\nimport { getDispatch } from '../../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../../api/types';\n\nimport { IS_EMOJI_SUPPORTED } from '../../../../util/environment';\n\nimport parseEmojiOnlyString from '../../../common/helpers/parseEmojiOnlyString';\n\nexport default function useStickerTooltip(\n isAllowed: boolean,\n html: string,\n stickers?: ApiSticker[],\n isDisabled = false,\n) {\n const { loadStickersForEmoji, clearStickersForEmoji } = getDispatch();\n const isSingleEmoji = (\n (IS_EMOJI_SUPPORTED && parseEmojiOnlyString(html) === 1)\n || (!IS_EMOJI_SUPPORTED && Boolean(html.match(/^]*?>$/g)))\n );\n const hasStickers = Boolean(stickers) && isSingleEmoji;\n\n useEffect(() => {\n if (isDisabled) return;\n\n if (isAllowed && isSingleEmoji) {\n loadStickersForEmoji({ emoji: html });\n } else if (hasStickers || !isSingleEmoji) {\n clearStickersForEmoji();\n }\n // We omit `hasStickers` here to prevent re-fetching after manually closing tooltip (via ).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [html, isSingleEmoji, clearStickersForEmoji, loadStickersForEmoji, isAllowed, isDisabled]);\n\n return {\n isStickerTooltipOpen: hasStickers,\n closeStickerTooltip: clearStickersForEmoji,\n };\n}\n","export default function insertHtmlInSelection(html: string) {\n const selection = window.getSelection();\n\n if (selection && selection.getRangeAt && selection.rangeCount) {\n const range = selection.getRangeAt(0);\n range.deleteContents();\n\n const fragment = range.createContextualFragment(html);\n const lastInsertedNode = fragment.lastChild;\n range.insertNode(fragment);\n if (lastInsertedNode) {\n range.setStartAfter(lastInsertedNode);\n range.setEndAfter(lastInsertedNode);\n } else {\n range.collapse(false);\n }\n selection.removeAllRanges();\n selection.addRange(range);\n }\n}\n","export default function deleteLastCharacterOutsideSelection(html: string) {\n const tempInput = document.createElement('div');\n tempInput.contentEditable = 'true';\n tempInput.style.position = 'absolute';\n tempInput.style.left = '-10000px';\n tempInput.style.top = '-10000px';\n tempInput.innerHTML = html;\n document.body.appendChild(tempInput);\n let element = tempInput.lastChild!;\n\n if (element.lastChild) {\n // Selects the last and the deepest child of the element.\n while (element.lastChild) {\n element = element.lastChild;\n }\n }\n\n // Gets length of the element's content.\n const textLength = element.textContent!.length;\n const range = document.createRange();\n const selection = window.getSelection()!;\n\n // Sets selection position to the end of the element.\n range.setStart(element, textLength);\n range.setEnd(element, textLength);\n selection.removeAllRanges();\n selection.addRange(range);\n document.execCommand('delete', false);\n\n const result = tempInput.innerHTML;\n document.body.removeChild(tempInput);\n\n return result;\n}\n","import { useCallback, useEffect } from '../../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../../api/types';\nimport { GlobalActions } from '../../../../global/types';\n\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport parseMessageInput from '../helpers/parseMessageInput';\nimport getMessageTextAsHtml from '../helpers/getMessageTextAsHtml';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport { hasMessageMedia } from '../../../../modules/helpers';\n\nexport default (\n htmlRef: { current: string },\n setHtml: (html: string) => void,\n editedMessage: ApiMessage | undefined,\n resetComposer: () => void,\n openDeleteModal: () => void,\n editMessage: GlobalActions['editMessage'],\n) => {\n // TODO useOnChange\n // Handle editing message\n useEffect(() => {\n if (!editedMessage) {\n setHtml('');\n return;\n }\n\n setHtml(getMessageTextAsHtml(editedMessage.content.text));\n\n requestAnimationFrame(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n focusEditableElement(messageInput, true);\n });\n }, [editedMessage, setHtml]);\n\n const handleEditComplete = useCallback(() => {\n const { text, entities } = parseMessageInput(htmlRef.current!);\n\n if (!editedMessage) {\n return;\n }\n\n if (!text && !hasMessageMedia(editedMessage)) {\n openDeleteModal();\n return;\n }\n\n editMessage({\n messageId: editedMessage.id,\n text,\n entities,\n });\n\n resetComposer();\n }, [editMessage, editedMessage, htmlRef, openDeleteModal, resetComposer]);\n\n return handleEditComplete;\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './MobileSearch';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MobileSearchAsync: FC = (props) => {\n const { isActive } = props;\n const MobileSearch = useModuleLoader(Bundles.Extra, 'MobileSearch', !isActive, true);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MobileSearch ? : undefined;\n};\n\nexport default memo(MobileSearchAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\nimport { OwnProps } from './MessageSelectToolbar';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MessageSelectToolbarAsync: FC = (props) => {\n const { isActive } = props;\n const MessageSelectToolbar = useModuleLoader(Bundles.Extra, 'MessageSelectToolbar', !isActive);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return MessageSelectToolbar ? : undefined;\n};\n\nexport default memo(MessageSelectToolbarAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './UnpinAllMessagesModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst UnpinAllMessagesModalAsync: FC = (props) => {\n const { isOpen } = props;\n const UnpinAllMessagesModal = useModuleLoader(Bundles.Extra, 'UnpinAllMessagesModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return UnpinAllMessagesModal ? : undefined;\n};\n\nexport default memo(UnpinAllMessagesModalAsync);\n","import React, {\n FC, useEffect, useState, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChatBannedRights, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalActions, MessageListType, MessageList as GlobalMessageList } from '../../global/types';\nimport { ThemeKey } from '../../types';\n\nimport {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_CHAT_INFO,\n CONTENT_TYPES_FOR_QUICK_UPLOAD,\n ANIMATION_LEVEL_MAX,\n ANIMATION_END_DELAY,\n DARK_THEME_BG_COLOR,\n LIGHT_THEME_BG_COLOR,\n ANIMATION_LEVEL_MIN,\n} from '../../config';\nimport {\n IS_SINGLE_COLUMN_LAYOUT,\n IS_TABLET_COLUMN_LAYOUT,\n IS_TOUCH_ENV,\n MASK_IMAGE_DISABLED,\n} from '../../util/environment';\nimport { DropAreaState } from './composer/DropArea';\nimport {\n selectChat,\n selectCurrentMessageList,\n selectCurrentTextSearch,\n selectIsChatBotNotStarted,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n selectPinnedIds,\n selectTheme,\n} from '../../modules/selectors';\nimport { getCanPostInChat, getMessageSendingRestrictionReason, isChatPrivate } from '../../modules/helpers';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport useCustomBackground from '../../hooks/useCustomBackground';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport usePrevDuringAnimation from '../../hooks/usePrevDuringAnimation';\nimport calculateMiddleFooterTransforms from './helpers/calculateMiddleFooterTransforms';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport { createMessageHash } from '../../util/routing';\n\nimport Transition from '../ui/Transition';\nimport MiddleHeader from './MiddleHeader';\nimport MessageList from './MessageList';\nimport ScrollDownButton from './ScrollDownButton';\nimport Composer from './composer/Composer';\nimport Button from '../ui/Button';\nimport MobileSearch from './MobileSearch.async';\nimport MessageSelectToolbar from './MessageSelectToolbar.async';\nimport UnpinAllMessagesModal from '../common/UnpinAllMessagesModal.async';\n\nimport './MiddleColumn.scss';\n\ntype StateProps = {\n chatId?: number;\n threadId?: number;\n messageListType?: MessageListType;\n isPrivate?: boolean;\n isPinnedMessageList?: boolean;\n isScheduledMessageList?: boolean;\n canPost?: boolean;\n currentUserBannedRights?: ApiChatBannedRights;\n defaultBannedRights?: ApiChatBannedRights;\n hasPinnedOrAudioMessage?: boolean;\n pinnedMessagesCount?: number;\n theme: ThemeKey;\n customBackground?: string;\n backgroundColor?: string;\n patternColor?: string;\n isLeftColumnShown?: boolean;\n isRightColumnShown?: boolean;\n isBackgroundBlurred?: boolean;\n isMobileSearchActive?: boolean;\n isSelectModeActive?: boolean;\n animationLevel?: number;\n shouldSkipHistoryAnimations?: boolean;\n currentTransitionKey: number;\n messageLists?: GlobalMessageList[];\n};\n\ntype DispatchProps = Pick;\n\nconst CLOSE_ANIMATION_DURATION = IS_SINGLE_COLUMN_LAYOUT ? 450 + ANIMATION_END_DELAY : undefined;\n\nfunction canBeQuicklyUploaded(item: DataTransferItem) {\n return item.kind === 'file' && item.type && CONTENT_TYPES_FOR_QUICK_UPLOAD.has(item.type);\n}\n\nconst MiddleColumn: FC = ({\n chatId,\n threadId,\n messageListType,\n isPrivate,\n isPinnedMessageList,\n messageLists,\n canPost,\n currentUserBannedRights,\n defaultBannedRights,\n hasPinnedOrAudioMessage,\n pinnedMessagesCount,\n customBackground,\n theme,\n backgroundColor,\n patternColor,\n isLeftColumnShown,\n isRightColumnShown,\n isBackgroundBlurred,\n isMobileSearchActive,\n isSelectModeActive,\n animationLevel,\n shouldSkipHistoryAnimations,\n currentTransitionKey,\n openChat,\n unpinAllMessages,\n loadUser,\n closeLocalTextSearch,\n exitMessageSelectMode,\n}) => {\n const { width: windowWidth } = useWindowSize();\n\n const lang = useLang();\n const [dropAreaState, setDropAreaState] = useState(DropAreaState.None);\n const [isFabShown, setIsFabShown] = useState();\n const [isNotchShown, setIsNotchShown] = useState();\n const [isUnpinModalOpen, setIsUnpinModalOpen] = useState(false);\n const [isReady, setIsReady] = useState(!IS_SINGLE_COLUMN_LAYOUT || animationLevel === ANIMATION_LEVEL_MIN);\n\n const hasTools = hasPinnedOrAudioMessage && (\n windowWidth < MOBILE_SCREEN_MAX_WIDTH\n || (\n isRightColumnShown && windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n ) || (\n windowWidth >= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_CHAT_INFO\n )\n );\n\n const renderingChatId = usePrevDuringAnimation(chatId, CLOSE_ANIMATION_DURATION);\n const renderingThreadId = usePrevDuringAnimation(threadId, CLOSE_ANIMATION_DURATION);\n const renderingMessageListType = usePrevDuringAnimation(messageListType, CLOSE_ANIMATION_DURATION);\n const renderingCanPost = usePrevDuringAnimation(canPost, CLOSE_ANIMATION_DURATION);\n const renderingHasTools = usePrevDuringAnimation(hasTools, CLOSE_ANIMATION_DURATION);\n const renderingIsFabShown = usePrevDuringAnimation(isFabShown, CLOSE_ANIMATION_DURATION);\n\n useEffect(() => {\n return chatId\n ? captureEscKeyListener(() => {\n openChat({ id: undefined });\n })\n : undefined;\n }, [chatId, openChat]);\n\n useEffect(() => {\n setDropAreaState(DropAreaState.None);\n setIsFabShown(undefined);\n setIsNotchShown(undefined);\n }, [chatId]);\n\n useEffect(() => {\n if (animationLevel === ANIMATION_LEVEL_MIN) {\n setIsReady(true);\n }\n }, [animationLevel]);\n\n const handleTransitionEnd = (e: React.TransitionEvent) => {\n if (e.propertyName === 'transform' && e.target === e.currentTarget) {\n setIsReady(Boolean(chatId));\n }\n };\n\n useEffect(() => {\n if (isPrivate) {\n loadUser({ userId: chatId });\n }\n }, [chatId, isPrivate, loadUser]);\n\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n const { items } = e.dataTransfer || {};\n const shouldDrawQuick = items && Array.from(items)\n // Filter unnecessary element for drag and drop images in Firefox (https://github.com/Ajaxy/telegram-tt/issues/49)\n // https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Recommended_drag_types#image\n .filter((item) => item.type !== 'text/uri-list')\n .every(canBeQuicklyUploaded);\n\n setDropAreaState(shouldDrawQuick ? DropAreaState.QuickFile : DropAreaState.Document);\n }, []);\n\n const handleHideDropArea = useCallback(() => {\n setDropAreaState(DropAreaState.None);\n }, []);\n\n const handleOpenUnpinModal = useCallback(() => {\n setIsUnpinModalOpen(true);\n }, []);\n\n const closeUnpinModal = useCallback(() => {\n setIsUnpinModalOpen(false);\n }, []);\n\n const handleUnpinAllMessages = useCallback(() => {\n unpinAllMessages({ chatId });\n closeUnpinModal();\n openChat({ id: chatId });\n }, [unpinAllMessages, openChat, closeUnpinModal, chatId]);\n\n const handleTabletFocus = useCallback(() => {\n openChat({ id: chatId });\n }, [openChat, chatId]);\n\n const customBackgroundValue = useCustomBackground(theme, customBackground);\n\n const className = buildClassName(\n renderingHasTools && 'has-header-tools',\n customBackground && 'custom-bg-image',\n backgroundColor && 'custom-bg-color',\n customBackground && isBackgroundBlurred && 'blurred',\n MASK_IMAGE_DISABLED ? 'mask-image-disabled' : 'mask-image-enabled',\n );\n\n const messagingDisabledClassName = buildClassName(\n 'messaging-disabled',\n !isSelectModeActive && 'shown',\n );\n\n\n const messageSendingRestrictionReason = getMessageSendingRestrictionReason(\n lang, currentUserBannedRights, defaultBannedRights,\n );\n\n // CSS Variables calculation doesn't work properly with transforms, so we calculate transform values in JS\n const {\n composerHiddenScale, toolbarHiddenScale,\n composerTranslateX, toolbarTranslateX,\n unpinHiddenScale, toolbarForUnpinHiddenScale,\n } = useMemo(\n () => calculateMiddleFooterTransforms(windowWidth, renderingCanPost),\n [renderingCanPost, windowWidth],\n );\n\n const footerClassName = buildClassName(\n 'middle-column-footer',\n !renderingCanPost && 'no-composer',\n renderingCanPost && isNotchShown && !isSelectModeActive && 'with-notch',\n );\n\n const closeChat = () => {\n openChat({ id: undefined }, true);\n };\n\n useHistoryBack(renderingChatId && renderingThreadId,\n closeChat, undefined, undefined, undefined,\n messageLists ? messageLists.map(createMessageHash) : []);\n\n useHistoryBack(isMobileSearchActive, closeLocalTextSearch);\n useHistoryBack(isSelectModeActive, exitMessageSelectMode);\n\n return (\n \n \n
\n {renderingChatId && renderingThreadId && (\n <>\n
\n \n \n {() => (\n <>\n \n
\n {renderingCanPost && (\n \n )}\n {isPinnedMessageList && (\n
\n \n \n {lang('Chat.Pinned.UnpinAll', pinnedMessagesCount, 'i')}\n \n
\n )}\n {!isPinnedMessageList && !renderingCanPost && messageSendingRestrictionReason && (\n
\n
\n \n {messageSendingRestrictionReason}\n \n
\n
\n )}\n \n
\n \n )}\n \n\n \n
\n {IS_SINGLE_COLUMN_LAYOUT && }\n \n )}\n {chatId && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const theme = selectTheme(global);\n const {\n isBlurred: isBackgroundBlurred, background: customBackground, backgroundColor, patternColor,\n } = global.settings.themes[theme] || {};\n\n const { messageLists } = global.messages;\n const currentMessageList = selectCurrentMessageList(global);\n const { isLeftColumnShown, chats: { listIds } } = global;\n\n const state: StateProps = {\n theme,\n customBackground,\n backgroundColor,\n patternColor,\n isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isBackgroundBlurred,\n isMobileSearchActive: Boolean(IS_SINGLE_COLUMN_LAYOUT && selectCurrentTextSearch(global)),\n isSelectModeActive: selectIsInSelectMode(global),\n animationLevel: global.settings.byKey.animationLevel,\n currentTransitionKey: Math.max(0, global.messages.messageLists.length - 1),\n };\n\n if (!currentMessageList || !listIds.active) {\n return state;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n const pinnedIds = selectPinnedIds(global, chatId);\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n\n const canPost = chat && getCanPostInChat(chat, threadId);\n const isBotNotStarted = selectIsChatBotNotStarted(global, chatId);\n const isPinnedMessageList = messageListType === 'pinned';\n const isScheduledMessageList = messageListType === 'scheduled';\n\n return {\n ...state,\n chatId,\n threadId,\n messageListType,\n isPrivate: isChatPrivate(chatId),\n canPost: !isPinnedMessageList && (!chat || canPost) && !isBotNotStarted,\n isPinnedMessageList,\n isScheduledMessageList,\n currentUserBannedRights: chat && chat.currentUserBannedRights,\n defaultBannedRights: chat && chat.defaultBannedRights,\n hasPinnedOrAudioMessage: (\n threadId !== MAIN_THREAD_ID\n || Boolean(pinnedIds && pinnedIds.length)\n || Boolean(audioChatId && audioMessageId)\n ),\n pinnedMessagesCount: pinnedIds ? pinnedIds.length : 0,\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n messageLists,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openChat', 'unpinAllMessages', 'loadUser', 'closeLocalTextSearch', 'exitMessageSelectMode',\n ]),\n)(MiddleColumn));\n","import { useEffect, useState } from '../lib/teact/teact';\n\nimport { ThemeKey } from '../types';\n\nimport { CUSTOM_BG_CACHE_NAME } from '../config';\nimport * as cacheApi from '../util/cacheApi';\nimport { preloadImage } from '../util/files';\n\nexport default (theme: ThemeKey, settingValue?: string) => {\n const [value, setValue] = useState(settingValue);\n\n useEffect(() => {\n if (!settingValue) {\n return;\n }\n\n if (settingValue.startsWith('#')) {\n setValue(settingValue);\n } else {\n cacheApi.fetch(CUSTOM_BG_CACHE_NAME, theme, cacheApi.Type.Blob)\n .then((blob) => {\n const url = URL.createObjectURL(blob);\n preloadImage(url)\n .then(() => {\n setValue(`url(${url})`);\n });\n });\n }\n }, [settingValue, theme]);\n\n return settingValue ? value : undefined;\n};\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ManagementScreens, ProfileState } from '../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { debounce } from '../../util/schedulers';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\nimport {\n selectChat,\n selectCurrentGifSearch,\n selectCurrentStickerSearch,\n selectCurrentTextSearch,\n selectIsChatWithSelf,\n} from '../../modules/selectors';\nimport { isChatAdmin, isChatChannel, isChatPrivate } from '../../modules/helpers';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\nimport useLang from '../../hooks/useLang';\n\nimport SearchInput from '../ui/SearchInput';\nimport Button from '../ui/Button';\nimport Transition from '../ui/Transition';\nimport './RightHeader.scss';\nimport { getDayStartAt } from '../../util/dateFormat';\n\ntype OwnProps = {\n chatId?: number;\n isColumnOpen?: boolean;\n isProfile?: boolean;\n isSearch?: boolean;\n isManagement?: boolean;\n isStickerSearch?: boolean;\n isGifSearch?: boolean;\n isPollResults?: boolean;\n isAddingChatMembers?: boolean;\n shouldSkipAnimation?: boolean;\n profileState?: ProfileState;\n managementScreen?: ManagementScreens;\n onClose: () => void;\n};\n\ntype StateProps = {\n canManage?: boolean;\n isChannel?: boolean;\n messageSearchQuery?: string;\n stickerSearchQuery?: string;\n gifSearchQuery?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst COLUMN_CLOSE_DELAY_MS = 300;\nconst runDebouncedForSearch = debounce((cb) => cb(), 200, false);\n\nenum HeaderContent {\n Profile,\n MemberList,\n SharedMedia,\n Search,\n Management,\n ManageInitial,\n ManageChannelSubscribers,\n ManageChatAdministrators,\n ManageChatPrivacyType,\n ManageDiscussion,\n ManageGroupPermissions,\n ManageGroupRemovedUsers,\n ManageGroupUserPermissionsCreate,\n ManageGroupUserPermissions,\n ManageGroupRecentActions,\n ManageGroupAdminRights,\n ManageGroupMembers,\n StickerSearch,\n GifSearch,\n PollResults,\n AddingMembers,\n}\n\nconst RightHeader: FC = ({\n isColumnOpen,\n isProfile,\n isSearch,\n isManagement,\n isStickerSearch,\n isGifSearch,\n isPollResults,\n isAddingChatMembers,\n profileState,\n managementScreen,\n canManage,\n isChannel,\n onClose,\n messageSearchQuery,\n stickerSearchQuery,\n gifSearchQuery,\n setLocalTextSearchQuery,\n setStickerSearchQuery,\n setGifSearchQuery,\n searchTextMessagesLocal,\n toggleManagement,\n openHistoryCalendar,\n shouldSkipAnimation,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const backButtonRef = useRef(null);\n\n const handleMessageSearchQueryChange = useCallback((query: string) => {\n setLocalTextSearchQuery({ query });\n\n if (query.length) {\n runDebouncedForSearch(searchTextMessagesLocal);\n }\n }, [searchTextMessagesLocal, setLocalTextSearchQuery]);\n\n const handleStickerSearchQueryChange = useCallback((query: string) => {\n setStickerSearchQuery({ query });\n }, [setStickerSearchQuery]);\n\n const handleGifSearchQueryChange = useCallback((query: string) => {\n setGifSearchQuery({ query });\n }, [setGifSearchQuery]);\n\n const [shouldSkipTransition, setShouldSkipTransition] = useState(!isColumnOpen);\n\n useEffect(() => {\n setTimeout(() => {\n setShouldSkipTransition(!isColumnOpen);\n }, COLUMN_CLOSE_DELAY_MS);\n }, [isColumnOpen]);\n\n const lang = useLang();\n const contentKey = isProfile ? (\n profileState === ProfileState.Profile ? (\n HeaderContent.Profile\n ) : profileState === ProfileState.SharedMedia ? (\n HeaderContent.SharedMedia\n ) : profileState === ProfileState.MemberList ? (\n HeaderContent.MemberList\n ) : -1 // Never reached\n ) : isSearch ? (\n HeaderContent.Search\n ) : isPollResults ? (\n HeaderContent.PollResults\n ) : isStickerSearch ? (\n HeaderContent.StickerSearch\n ) : isGifSearch ? (\n HeaderContent.GifSearch\n ) : isAddingChatMembers ? (\n HeaderContent.AddingMembers\n ) : isManagement ? (\n managementScreen === ManagementScreens.Initial ? (\n HeaderContent.ManageInitial\n ) : managementScreen === ManagementScreens.ChatPrivacyType ? (\n HeaderContent.ManageChatPrivacyType\n ) : managementScreen === ManagementScreens.Discussion ? (\n HeaderContent.ManageDiscussion\n ) : managementScreen === ManagementScreens.ChannelSubscribers ? (\n HeaderContent.ManageChannelSubscribers\n ) : managementScreen === ManagementScreens.GroupPermissions ? (\n HeaderContent.ManageGroupPermissions\n ) : managementScreen === ManagementScreens.ChatAdministrators ? (\n HeaderContent.ManageChatAdministrators\n ) : managementScreen === ManagementScreens.GroupRemovedUsers ? (\n HeaderContent.ManageGroupRemovedUsers\n ) : managementScreen === ManagementScreens.GroupUserPermissionsCreate ? (\n HeaderContent.ManageGroupUserPermissionsCreate\n ) : managementScreen === ManagementScreens.GroupUserPermissions ? (\n HeaderContent.ManageGroupUserPermissions\n ) : managementScreen === ManagementScreens.GroupRecentActions ? (\n HeaderContent.ManageGroupRecentActions\n ) : managementScreen === ManagementScreens.ChatAdminRights ? (\n HeaderContent.ManageGroupAdminRights\n ) : managementScreen === ManagementScreens.GroupMembers ? (\n HeaderContent.ManageGroupMembers\n ) : undefined // Never reached\n ) : undefined; // When column is closed\n\n const renderingContentKey = useCurrentOrPrev(contentKey, true) ?? -1;\n\n function renderHeaderContent() {\n if (renderingContentKey === -1) {\n return undefined;\n }\n\n switch (renderingContentKey) {\n case HeaderContent.PollResults:\n return

{lang('PollResults')}

;\n case HeaderContent.Search:\n return (\n <>\n \n openHistoryCalendar({ selectedAt: getDayStartAt(Date.now()) })}\n ariaLabel=\"Search messages by date\"\n >\n \n \n \n );\n case HeaderContent.AddingMembers:\n return

{lang('GroupAddMembers')}

;\n case HeaderContent.ManageInitial:\n return

{lang('Edit')}

;\n case HeaderContent.ManageChatPrivacyType:\n return

{lang(isChannel ? 'ChannelTypeHeader' : 'GroupTypeHeader')}

;\n case HeaderContent.ManageDiscussion:\n return

{lang('Discussion')}

;\n case HeaderContent.ManageChatAdministrators:\n return

{lang('ChannelAdministrators')}

;\n case HeaderContent.ManageGroupRecentActions:\n return

{lang('Group.Info.AdminLog')}

;\n case HeaderContent.ManageGroupAdminRights:\n return

{lang('EditAdminRights')}

;\n case HeaderContent.ManageGroupPermissions:\n return

{lang('ChannelPermissions')}

;\n case HeaderContent.ManageGroupRemovedUsers:\n return

{lang('ChannelBlockedUsers')}

;\n case HeaderContent.ManageGroupUserPermissionsCreate:\n return

{lang('ChannelAddException')}

;\n case HeaderContent.ManageGroupUserPermissions:\n return

{lang('UserRestrictions')}

;\n case HeaderContent.StickerSearch:\n return (\n \n );\n case HeaderContent.GifSearch:\n return (\n \n );\n case HeaderContent.SharedMedia:\n return

{lang('SharedMedia')}

;\n case HeaderContent.ManageChannelSubscribers:\n return

{lang('ChannelSubscribers')}

;\n case HeaderContent.MemberList:\n case HeaderContent.ManageGroupMembers:\n return

{lang('GroupMembers')}

;\n default:\n return (\n <>\n

Profile

\n
\n {canManage && (\n \n \n \n )}\n
\n \n );\n }\n }\n\n const isBackButton = (\n IS_SINGLE_COLUMN_LAYOUT\n || contentKey === HeaderContent.SharedMedia\n || contentKey === HeaderContent.MemberList\n || contentKey === HeaderContent.AddingMembers\n || isManagement\n );\n\n const buttonClassName = buildClassName(\n 'animated-close-icon',\n (shouldSkipTransition || shouldSkipAnimation) && 'no-transition',\n );\n\n // Add class in the next AF to synchronize with animation with Transition components\n useEffect(() => {\n backButtonRef.current!.classList.toggle('state-back', isBackButton);\n }, [isBackButton]);\n\n return (\n
\n \n
\n \n \n {renderHeaderContent}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, isProfile, isManagement }): StateProps => {\n const { query: messageSearchQuery } = selectCurrentTextSearch(global) || {};\n const { query: stickerSearchQuery } = selectCurrentStickerSearch(global) || {};\n const { query: gifSearchQuery } = selectCurrentGifSearch(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const isChannel = chat && isChatChannel(chat);\n\n const canManage = Boolean(\n !isManagement\n && isProfile\n && chat\n && !selectIsChatWithSelf(global, chat.id)\n // chat.isCreator is for Basic Groups\n && (isChatPrivate(chat.id) || ((isChatAdmin(chat) || chat.isCreator) && !chat.isNotJoined)),\n );\n\n return {\n canManage,\n isChannel,\n messageSearchQuery,\n stickerSearchQuery,\n gifSearchQuery,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalTextSearchQuery',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'searchTextMessagesLocal',\n 'toggleManagement',\n 'openHistoryCalendar',\n ]),\n)(RightHeader));\n","import { useMemo, useRef } from '../../../lib/teact/teact';\n\nimport { ApiChatMember, ApiMessage, ApiUser } from '../../../api/types';\nimport { ProfileTabType, SharedMediaType } from '../../../types';\n\nimport { MEMBERS_SLICE, MESSAGE_SEARCH_SLICE, SHARED_MEDIA_SLICE } from '../../../config';\nimport { getMessageContentIds, sortUserIds } from '../../../modules/helpers';\nimport useOnChange from '../../../hooks/useOnChange';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\n\nexport default function useProfileViewportIds(\n isRightColumnShown: boolean,\n loadMoreMembers: AnyToVoidFunction,\n searchMessages: AnyToVoidFunction,\n tabType: ProfileTabType,\n mediaSearchType?: SharedMediaType,\n groupChatMembers?: ApiChatMember[],\n usersById?: Record,\n chatMessages?: Record,\n foundIds?: number[],\n chatId?: number,\n lastSyncTime?: number,\n serverTimeOffset = 0,\n) {\n const resultType = tabType === 'members' || !mediaSearchType ? tabType : mediaSearchType;\n\n const memberIds = useMemo(() => {\n if (!groupChatMembers || !usersById) {\n return undefined;\n }\n\n return sortUserIds(groupChatMembers.map(({ userId }) => userId), usersById, undefined, serverTimeOffset);\n }, [groupChatMembers, serverTimeOffset, usersById]);\n\n const [memberViewportIds, getMoreMembers, noProfileInfoForMembers] = useInfiniteScrollForMembers(\n resultType, loadMoreMembers, lastSyncTime, memberIds,\n );\n\n const [mediaViewportIds, getMoreMedia, noProfileInfoForMedia] = useInfiniteScrollForSharedMedia(\n 'media', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [documentViewportIds, getMoreDocuments, noProfileInfoForDocuments] = useInfiniteScrollForSharedMedia(\n 'documents', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [linkViewportIds, getMoreLinks, noProfileInfoForLinks] = useInfiniteScrollForSharedMedia(\n 'links', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n const [audioViewportIds, getMoreAudio, noProfileInfoForAudio] = useInfiniteScrollForSharedMedia(\n 'audio', resultType, searchMessages, lastSyncTime, chatMessages, foundIds,\n );\n\n let viewportIds: number[] | undefined;\n let getMore: AnyToVoidFunction | undefined;\n let noProfileInfo = false;\n\n switch (resultType) {\n case 'members':\n viewportIds = memberViewportIds;\n getMore = getMoreMembers;\n noProfileInfo = noProfileInfoForMembers;\n break;\n case 'media':\n viewportIds = mediaViewportIds;\n getMore = getMoreMedia;\n noProfileInfo = noProfileInfoForMedia;\n break;\n case 'documents':\n viewportIds = documentViewportIds;\n getMore = getMoreDocuments;\n noProfileInfo = noProfileInfoForDocuments;\n break;\n case 'links':\n viewportIds = linkViewportIds;\n getMore = getMoreLinks;\n noProfileInfo = noProfileInfoForLinks;\n break;\n case 'audio':\n viewportIds = audioViewportIds;\n getMore = getMoreAudio;\n noProfileInfo = noProfileInfoForAudio;\n break;\n }\n\n return [resultType, viewportIds, getMore, noProfileInfo] as const;\n}\n\nfunction useInfiniteScrollForMembers(\n currentResultType?: ProfileTabType,\n handleLoadMore?: AnyToVoidFunction,\n lastSyncTime?: number,\n memberIds?: number[],\n) {\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? handleLoadMore : undefined,\n memberIds,\n undefined,\n MEMBERS_SLICE,\n );\n\n const isOnTop = !viewportIds || !memberIds || viewportIds[0] === memberIds[0];\n\n return [viewportIds, getMore, !isOnTop] as const;\n}\n\nfunction useInfiniteScrollForSharedMedia(\n forSharedMediaType: SharedMediaType,\n currentResultType?: ProfileTabType,\n handleLoadMore?: AnyToVoidFunction,\n lastSyncTime?: number,\n chatMessages?: Record,\n foundIds?: number[],\n) {\n const messageIdsRef = useRef();\n\n useOnChange(() => {\n if (currentResultType === forSharedMediaType && chatMessages && foundIds) {\n messageIdsRef.current = getMessageContentIds(\n chatMessages,\n foundIds,\n forSharedMediaType,\n ).reverse();\n }\n }, [chatMessages, foundIds, currentResultType, forSharedMediaType]);\n\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? handleLoadMore : undefined,\n messageIdsRef.current,\n undefined,\n forSharedMediaType === 'media' ? SHARED_MEDIA_SLICE : MESSAGE_SEARCH_SLICE,\n );\n\n const isOnTop = !viewportIds || !messageIdsRef.current || viewportIds[0] === messageIdsRef.current[0];\n\n return [viewportIds, getMore, !isOnTop] as const;\n}\n","import { useCallback, useEffect } from '../../../lib/teact/teact';\n\nimport { ProfileState } from '../../../types';\n\nimport fastSmoothScroll from '../../../util/fastSmoothScroll';\nimport { throttle } from '../../../util/schedulers';\nimport useEffectWithPrevDeps from '../../../hooks/useEffectWithPrevDeps';\n\nconst TRANSITION_DURATION = 300;\nconst PROGRAMMATIC_SCROLL_TIMEOUT_MS = 350;\n\nconst runThrottledForScroll = throttle((cb) => cb(), 250, false);\n\nlet isScrollingProgrammatically = false;\n\nexport default function useProfileState(\n containerRef: { current: HTMLDivElement | null },\n tabType: string,\n profileState: ProfileState,\n onProfileStateChange: (state: ProfileState) => void,\n) {\n // Scroll to tabs if needed\n useEffectWithPrevDeps(([prevTabType]) => {\n if (prevTabType && prevTabType !== tabType) {\n const container = containerRef.current!;\n const tabsEl = container.querySelector('.TabList')!;\n if (container.scrollTop < tabsEl.offsetTop) {\n onProfileStateChange(tabType === 'members' ? ProfileState.MemberList : ProfileState.SharedMedia);\n isScrollingProgrammatically = true;\n fastSmoothScroll(container, tabsEl, 'start', undefined, undefined, undefined, TRANSITION_DURATION);\n setTimeout(() => {\n isScrollingProgrammatically = false;\n }, PROGRAMMATIC_SCROLL_TIMEOUT_MS);\n }\n }\n }, [tabType, onProfileStateChange]);\n\n // Scroll to top\n useEffectWithPrevDeps(([prevProfileState]) => {\n if (profileState !== ProfileState.Profile || profileState === prevProfileState) {\n return;\n }\n\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const tabListEl = container.querySelector('.TabList');\n if (!tabListEl || tabListEl.offsetTop > container.scrollTop) {\n return;\n }\n\n isScrollingProgrammatically = true;\n fastSmoothScroll(\n container,\n container.firstElementChild as HTMLElement,\n 'start',\n undefined,\n container.offsetHeight * 2,\n );\n\n setTimeout(() => {\n isScrollingProgrammatically = false;\n }, PROGRAMMATIC_SCROLL_TIMEOUT_MS);\n\n onProfileStateChange(profileState);\n }, [profileState]);\n\n const determineProfileState = useCallback(() => {\n const container = containerRef.current;\n if (!container) {\n return;\n }\n\n const tabListEl = container.querySelector('.TabList');\n if (!tabListEl) {\n return;\n }\n\n let state: ProfileState = ProfileState.Profile;\n if (container.scrollTop >= tabListEl.offsetTop) {\n state = tabType === 'members'\n ? ProfileState.MemberList\n : ProfileState.SharedMedia;\n }\n\n onProfileStateChange(state);\n }, [containerRef, onProfileStateChange, tabType]);\n\n // Determine profile state when switching tabs\n useEffect(() => {\n if (isScrollingProgrammatically) {\n return;\n }\n\n determineProfileState();\n }, [determineProfileState, tabType]);\n\n // Determine profile state when scrolling\n const handleScroll = useCallback(() => {\n if (isScrollingProgrammatically) {\n return;\n }\n\n runThrottledForScroll(determineProfileState);\n }, [determineProfileState]);\n\n return { handleScroll };\n}\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport {\n ApiUser, ApiChat, ApiMediaFormat, ApiPhoto,\n} from '../../api/types';\n\nimport {\n getChatAvatarHash, isDeletedUser, getUserColorKey, getChatTitle, isChatPrivate, getUserFullName,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport buildClassName from '../../util/buildClassName';\nimport { getFirstLetters } from '../../util/textFormat';\nimport useMedia from '../../hooks/useMedia';\nimport useBlurSync from '../../hooks/useBlurSync';\nimport usePrevious from '../../hooks/usePrevious';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\n\nimport './ProfilePhoto.scss';\n\ntype OwnProps = {\n chat?: ApiChat;\n user?: ApiUser;\n isFirstPhoto?: boolean;\n isSavedMessages?: boolean;\n photo?: ApiPhoto;\n lastSyncTime?: number;\n onClick: NoneToVoidFunction;\n};\n\nconst ProfilePhoto: FC = ({\n chat,\n user,\n photo,\n isFirstPhoto,\n isSavedMessages,\n lastSyncTime,\n onClick,\n}) => {\n const lang = useLang();\n const isDeleted = user && isDeletedUser(user);\n\n function getMediaHash(size: 'normal' | 'big' = 'big', forceAvatar?: boolean) {\n if (photo && !forceAvatar) {\n return `photo${photo.id}?size=c`;\n }\n\n let hash: string | undefined;\n if (!isSavedMessages && !isDeleted) {\n if (user) {\n hash = getChatAvatarHash(user, size);\n } else if (chat) {\n hash = getChatAvatarHash(chat, size);\n }\n }\n\n return hash;\n }\n\n const imageHash = getMediaHash();\n const fullMediaData = useMedia(imageHash, false, ApiMediaFormat.BlobUrl, lastSyncTime);\n const avatarThumbnailData = useMedia(\n !fullMediaData && isFirstPhoto ? getMediaHash('normal', true) : undefined,\n false,\n ApiMediaFormat.BlobUrl,\n lastSyncTime,\n );\n const thumbDataUri = useBlurSync(!fullMediaData && photo && photo.thumbnail && photo.thumbnail.dataUri);\n const imageSrc = fullMediaData || avatarThumbnailData || thumbDataUri;\n const prevImageSrc = usePrevious(imageSrc);\n\n let content: string | undefined = '';\n\n if (isSavedMessages) {\n content = ;\n } else if (isDeleted) {\n content = ;\n } else if (imageSrc) {\n content = \"\";\n } else if (!imageSrc && user) {\n const userFullName = getUserFullName(user);\n content = userFullName ? getFirstLetters(userFullName, 2) : undefined;\n } else if (!imageSrc && chat) {\n const title = getChatTitle(lang, chat);\n content = title && getFirstLetters(title, isChatPrivate(chat.id) ? 2 : 1);\n } else {\n content = (\n
\n \n
\n );\n }\n\n const fullClassName = buildClassName(\n 'ProfilePhoto',\n `color-bg-${getUserColorKey(user || chat)}`,\n isSavedMessages && 'saved-messages',\n isDeleted && 'deleted-account',\n (!isSavedMessages && !(imageSrc)) && 'no-photo',\n );\n\n return (\n
\n {prevImageSrc && imageSrc && prevImageSrc !== imageSrc && (\n \"\"\n )}\n {typeof content === 'string' ? renderText(content, ['hq_emoji']) : content}\n
\n );\n};\n\nexport default memo(ProfilePhoto);\n","import React, {\n FC, useEffect, useCallback, memo, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiChat } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { selectChat, selectUser } from '../../modules/selectors';\nimport {\n getUserFullName, getUserStatus, isChatChannel, isUserOnline,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport usePhotosPreload from './hooks/usePhotosPreload';\nimport useLang from '../../hooks/useLang';\n\nimport VerifiedIcon from '../common/VerifiedIcon';\nimport ProfilePhoto from './ProfilePhoto';\nimport Transition from '../ui/Transition';\n\nimport './ProfileInfo.scss';\n\ntype OwnProps = {\n userId: number;\n forceShowSelf?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat?: ApiChat;\n isSavedMessages?: boolean;\n animationLevel: 0 | 1 | 2;\n serverTimeOffset: number;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst PrivateChatInfo: FC = ({\n user,\n chat,\n isSavedMessages,\n lastSyncTime,\n animationLevel,\n loadFullUser,\n openMediaViewer,\n serverTimeOffset,\n}) => {\n const { id: userId } = user || {};\n const { id: chatId } = chat || {};\n const fullName = user ? getUserFullName(user) : (chat ? chat.title : '');\n const photos = (user ? user.photos : (chat ? chat.photos : undefined)) || [];\n const slideAnimation = animationLevel >= 1 ? 'slide' : 'none';\n\n const [currentPhotoIndex, setCurrentPhotoIndex] = useState(0);\n const isFirst = isSavedMessages || photos.length <= 1 || currentPhotoIndex === 0;\n const isLast = isSavedMessages || photos.length <= 1 || currentPhotoIndex === photos.length - 1;\n\n // Deleting the last profile photo may result in an error\n useEffect(() => {\n if (currentPhotoIndex > photos.length) {\n setCurrentPhotoIndex(Math.max(0, photos.length - 1));\n }\n }, [currentPhotoIndex, photos.length]);\n\n const lang = useLang();\n\n useEffect(() => {\n if (lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [userId, loadFullUser, lastSyncTime]);\n\n usePhotosPreload(user || chat, photos, currentPhotoIndex);\n\n const handleProfilePhotoClick = useCallback(() => {\n openMediaViewer({\n avatarOwnerId: userId || chatId,\n profilePhotoIndex: currentPhotoIndex,\n origin: MediaViewerOrigin.ProfileAvatar,\n });\n }, [openMediaViewer, userId, chatId, currentPhotoIndex]);\n\n const selectPreviousMedia = useCallback(() => {\n if (isFirst) {\n return;\n }\n\n setCurrentPhotoIndex(currentPhotoIndex - 1);\n }, [currentPhotoIndex, isFirst]);\n\n const selectNextMedia = useCallback(() => {\n if (isLast) {\n return;\n }\n\n setCurrentPhotoIndex(currentPhotoIndex + 1);\n }, [currentPhotoIndex, isLast]);\n\n // Support for swipe gestures and closing on click\n useEffect(() => {\n const element = document.querySelector('.photo-wrapper');\n if (!element) {\n return undefined;\n }\n\n return captureEvents(element, {\n onSwipe: IS_TOUCH_ENV ? (e, direction) => {\n if (direction === SwipeDirection.Right) {\n selectPreviousMedia();\n } else if (direction === SwipeDirection.Left) {\n selectNextMedia();\n }\n } : undefined,\n });\n }, [selectNextMedia, selectPreviousMedia]);\n\n if (!user && !chat) {\n return undefined;\n }\n\n function renderPhotoTabs() {\n if (isSavedMessages || !photos || photos.length <= 1) {\n return undefined;\n }\n\n return (\n
\n {photos.map((_, i) => (\n \n ))}\n
\n );\n }\n\n function renderPhoto() {\n const photo = !isSavedMessages && photos && photos.length > 0 ? photos[currentPhotoIndex] : undefined;\n\n return (\n \n );\n }\n\n function renderStatus() {\n if (user) {\n return (\n
\n {getUserStatus(lang, user, serverTimeOffset)}\n
\n );\n }\n\n return (\n {\n isChatChannel(chat!)\n ? lang('Subscribers', chat!.membersCount, 'i')\n : lang('Members', chat!.membersCount, 'i')\n }\n \n );\n }\n\n const isVerifiedIconShown = (user && user.isVerified) || (chat && chat.isVerified);\n\n return (\n
\n
\n {renderPhotoTabs()}\n \n {renderPhoto}\n \n\n {!isFirst && (\n \n )}\n {!isLast && (\n \n )}\n
\n\n
\n {isSavedMessages ? (\n
\n

{lang('SavedMessages')}

\n
\n ) : (\n
\n

{fullName && renderText(fullName)}

\n {isVerifiedIconShown && }\n
\n )}\n {!isSavedMessages && renderStatus()}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId, forceShowSelf }): StateProps => {\n const { lastSyncTime, serverTimeOffset } = global;\n const user = selectUser(global, userId);\n const chat = selectChat(global, userId);\n const isSavedMessages = !forceShowSelf && user && user.isSelf;\n const { animationLevel } = global.settings.byKey;\n\n return {\n lastSyncTime, user, chat, isSavedMessages, animationLevel, serverTimeOffset,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadFullUser', 'openMediaViewer']),\n)(PrivateChatInfo));\n","import {\n ApiChat, ApiMediaFormat, ApiPhoto, ApiUser,\n} from '../../../api/types';\nimport { useEffect } from '../../../lib/teact/teact';\nimport * as mediaLoader from '../../../util/mediaLoader';\n\nconst PHOTOS_TO_PRELOAD = 4;\n\nexport default function usePhotosPreload(\n profile: ApiUser | ApiChat | undefined,\n photos: ApiPhoto[],\n currentIndex: number,\n) {\n useEffect(() => {\n photos.slice(currentIndex, currentIndex + PHOTOS_TO_PRELOAD).forEach((photo) => {\n const mediaData = mediaLoader.getFromMemory(`photo${photo.id}?size=c`);\n if (!mediaData) {\n mediaLoader.fetch(`photo${photo.id}?size=c`, ApiMediaFormat.BlobUrl);\n }\n });\n }, [currentIndex, photos]);\n}\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport {\n selectChat, selectNotifyExceptions, selectNotifySettings, selectUser,\n} from '../../modules/selectors';\nimport {\n getChatDescription, getChatLink, getHasAdminRight, isChatChannel, isChatPrivate, isUserRightBanned, selectIsChatMuted,\n} from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport { pick } from '../../util/iteratees';\nimport { copyTextToClipboard } from '../../util/clipboard';\nimport { formatPhoneNumberWithCode } from '../../util/phoneNumber';\nimport useLang from '../../hooks/useLang';\n\nimport ListItem from '../ui/ListItem';\nimport Switcher from '../ui/Switcher';\n\ntype OwnProps = {\n chatOrUserId: number;\n forceShowSelf?: boolean;\n};\n\ntype StateProps = {\n user?: ApiUser;\n chat?: ApiChat;\n canInviteUsers?: boolean;\n isMuted?: boolean;\n} & Pick;\n\ntype DispatchProps = Pick;\n\nconst ChatExtra: FC = ({\n lastSyncTime,\n user,\n chat,\n forceShowSelf,\n canInviteUsers,\n isMuted,\n loadFullUser,\n showNotification,\n updateChatMutedState,\n}) => {\n const {\n id: userId,\n fullInfo,\n username,\n phoneNumber,\n isSelf,\n } = user || {};\n const { id: chatId } = chat || {};\n const lang = useLang();\n\n useEffect(() => {\n if (lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [loadFullUser, userId, lastSyncTime]);\n\n const handleNotificationChange = useCallback(() => {\n updateChatMutedState({ chatId, isMuted: !isMuted });\n }, [chatId, isMuted, updateChatMutedState]);\n\n if (!chat || chat.isRestricted || (isSelf && !forceShowSelf)) {\n return undefined;\n }\n\n function copy(text: string, entity: string) {\n copyTextToClipboard(text);\n showNotification({ message: `${entity} was copied` });\n }\n\n const formattedNumber = phoneNumber && formatPhoneNumberWithCode(phoneNumber);\n const link = getChatLink(chat);\n const description = (fullInfo && fullInfo.bio) || getChatDescription(chat);\n\n return (\n
\n {formattedNumber && !!formattedNumber.length && (\n copy(formattedNumber, lang('Phone'))}>\n {formattedNumber}\n {lang('Phone')}\n \n )}\n {username && (\n copy(`@${username}`, lang('Username'))}\n >\n {renderText(username)}\n {lang('Username')}\n \n )}\n {description && !!description.length && (\n \n \n {renderText(description, ['br', 'links', 'emoji'])}\n \n {lang(userId ? 'UserBio' : 'Info')}\n \n )}\n {(canInviteUsers || !username) && link && (\n copy(link, lang('SetUrlPlaceholder'))}>\n
{link}
\n {lang('SetUrlPlaceholder')}\n
\n )}\n \n {lang('Notifications')}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatOrUserId }): StateProps => {\n const { lastSyncTime } = global;\n\n const chat = chatOrUserId ? selectChat(global, chatOrUserId) : undefined;\n const user = isChatPrivate(chatOrUserId) ? selectUser(global, chatOrUserId) : undefined;\n const isMuted = chat && selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global));\n\n const canInviteUsers = chat && !user && (\n (!isChatChannel(chat) && !isUserRightBanned(chat, 'inviteUsers'))\n || getHasAdminRight(chat, 'inviteUsers')\n );\n\n return {\n lastSyncTime, chat, user, canInviteUsers, isMuted,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadFullUser', 'updateChatMutedState', 'showNotification',\n ]),\n)(ChatExtra));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport { selectCurrentChat, selectUser } from '../../modules/selectors';\nimport { getUserFirstOrLastName } from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n userId?: number;\n onClose: () => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n contactName?: string;\n};\n\ntype DispatchProps = Pick;\n\nconst DeleteMemberModal: FC = ({\n isOpen,\n chat,\n userId,\n contactName,\n onClose,\n deleteChatMember,\n}) => {\n const lang = useLang();\n\n const handleDeleteChatMember = useCallback(() => {\n deleteChatMember({ chatId: chat!.id, userId });\n onClose();\n }, [chat, deleteChatMember, onClose, userId]);\n\n if (!chat || !userId) {\n return undefined;\n }\n\n return (\n \n

{renderText(lang('PeerInfo.Confirm.RemovePeer', contactName))}

\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { userId }): StateProps => {\n const chat = selectCurrentChat(global);\n const user = userId && selectUser(global, userId);\n const contactName = user ? getUserFirstOrLastName(user) : undefined;\n\n return {\n chat,\n contactName,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['deleteChatMember']),\n)(DeleteMemberModal));\n","import React, {\n FC, useCallback, useEffect, useMemo, useRef, useState, memo,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiMessage,\n ApiChatMember,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../api/types';\nimport { GlobalActions } from '../../global/types';\nimport {\n NewChatMembersProgress, ISettings, MediaViewerOrigin, ProfileState, ProfileTabType, SharedMediaType,\n} from '../../types';\n\nimport {\n MEMBERS_SLICE,\n PROFILE_SENSITIVE_AREA,\n SHARED_MEDIA_SLICE,\n SLIDE_TRANSITION_DURATION,\n} from '../../config';\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport {\n getHasAdminRight, isChatAdmin, isChatChannel, isChatGroup, isChatPrivate,\n} from '../../modules/helpers';\nimport {\n selectChatMessages,\n selectChat,\n selectCurrentMediaSearch,\n selectIsRightColumnShown,\n selectTheme,\n} from '../../modules/selectors';\nimport { pick } from '../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../util/captureEvents';\nimport useCacheBuster from '../../hooks/useCacheBuster';\nimport useProfileViewportIds from './hooks/useProfileViewportIds';\nimport useProfileState from './hooks/useProfileState';\nimport useTransitionFixes from './hooks/useTransitionFixes';\nimport useAsyncRendering from './hooks/useAsyncRendering';\nimport useLang from '../../hooks/useLang';\n\nimport Transition from '../ui/Transition';\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport TabList from '../ui/TabList';\nimport Spinner from '../ui/Spinner';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport ProfileInfo from './ProfileInfo';\nimport Document from '../common/Document';\nimport Audio from '../common/Audio';\nimport ChatExtra from './ChatExtra';\nimport Media from '../common/Media';\nimport WebLink from '../common/WebLink';\nimport NothingFound from '../common/NothingFound';\nimport FloatingActionButton from '../ui/FloatingActionButton';\nimport DeleteMemberModal from './DeleteMemberModal';\n\nimport './Profile.scss';\n\ntype OwnProps = {\n chatId: number;\n userId?: number;\n profileState: ProfileState;\n onProfileStateChange: (state: ProfileState) => void;\n};\n\ntype StateProps = {\n theme: ISettings['theme'];\n isChannel?: boolean;\n currentUserId?: number;\n resolvedUserId?: number;\n chatMessages?: Record;\n foundIds?: number[];\n mediaSearchType?: SharedMediaType;\n hasMembersTab?: boolean;\n areMembersHidden?: boolean;\n canAddMembers?: boolean;\n canDeleteMembers?: boolean;\n members?: ApiChatMember[];\n usersById?: Record;\n isRightColumnShown: boolean;\n isRestricted?: boolean;\n lastSyncTime?: number;\n serverTimeOffset: number;\n};\n\ntype DispatchProps = Pick;\n\nconst TABS = [\n { type: 'media', title: 'SharedMediaTab2' },\n { type: 'documents', title: 'SharedFilesTab2' },\n { type: 'links', title: 'SharedLinksTab2' },\n { type: 'audio', title: 'SharedMusicTab2' },\n];\n\nconst HIDDEN_RENDER_DELAY = 1000;\n\nconst Profile: FC = ({\n chatId,\n profileState,\n onProfileStateChange,\n theme,\n isChannel,\n resolvedUserId,\n currentUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasMembersTab,\n areMembersHidden,\n canAddMembers,\n canDeleteMembers,\n members,\n usersById,\n isRightColumnShown,\n isRestricted,\n lastSyncTime,\n setLocalMediaSearchType,\n loadMoreMembers,\n searchMediaMessagesLocal,\n openMediaViewer,\n openAudioPlayer,\n openUserInfo,\n focusMessage,\n loadProfilePhotos,\n setNewChatMembersDialogState,\n serverTimeOffset,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const transitionRef = useRef(null);\n const lang = useLang();\n const [activeTab, setActiveTab] = useState(0);\n const [deletingUserId, setDeletingUserId] = useState();\n\n const tabs = useMemo(() => ([\n ...(hasMembersTab ? [{\n type: 'members', title: isChannel ? 'ChannelSubscribers' : 'GroupMembers',\n }] : []),\n ...TABS,\n ]), [hasMembersTab, isChannel]);\n const tabType = tabs[activeTab].type as ProfileTabType;\n\n const [resultType, viewportIds, getMore, noProfileInfo] = useProfileViewportIds(\n isRightColumnShown, loadMoreMembers, searchMediaMessagesLocal, tabType, mediaSearchType, members,\n usersById, chatMessages, foundIds, chatId, lastSyncTime, serverTimeOffset,\n );\n const activeKey = tabs.findIndex(({ type }) => type === resultType);\n\n const { handleScroll } = useProfileState(containerRef, tabType, profileState, onProfileStateChange);\n\n const { applyTransitionFix, releaseTransitionFix } = useTransitionFixes(containerRef);\n\n const [cacheBuster, resetCacheBuster] = useCacheBuster();\n\n const handleTransitionStop = useCallback(() => {\n releaseTransitionFix();\n resetCacheBuster();\n }, [releaseTransitionFix, resetCacheBuster]);\n\n const handleNewMemberDialogOpen = useCallback(() => {\n setNewChatMembersDialogState(NewChatMembersProgress.InProgress);\n }, [setNewChatMembersDialogState]);\n\n // Update search type when switching tabs\n useEffect(() => {\n setLocalMediaSearchType({ mediaType: tabType });\n }, [setLocalMediaSearchType, tabType]);\n\n const profileId = resolvedUserId || chatId;\n\n useEffect(() => {\n if (lastSyncTime) {\n loadProfilePhotos({ profileId });\n }\n }, [loadProfilePhotos, profileId, lastSyncTime]);\n\n const handleSelectMedia = useCallback((messageId: number) => {\n openMediaViewer({\n chatId: profileId,\n threadId: MAIN_THREAD_ID,\n messageId,\n origin: MediaViewerOrigin.SharedMedia,\n });\n }, [profileId, openMediaViewer]);\n\n const handlePlayAudio = useCallback((messageId: number) => {\n openAudioPlayer({ chatId: profileId, messageId });\n }, [profileId, openAudioPlayer]);\n\n const handleMemberClick = useCallback((id: number) => {\n openUserInfo({ id });\n }, [openUserInfo]);\n\n const handleMessageFocus = useCallback((messageId: number) => {\n focusMessage({ chatId: profileId, messageId });\n }, [profileId, focusMessage]);\n\n const handleDeleteMembersModalClose = useCallback(() => {\n setDeletingUserId(undefined);\n }, []);\n\n useEffect(() => {\n if (!transitionRef.current || !IS_TOUCH_ENV) {\n return undefined;\n }\n\n return captureEvents(transitionRef.current, {\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n setActiveTab(Math.min(activeTab + 1, tabs.length - 1));\n } else if (direction === SwipeDirection.Right) {\n setActiveTab(Math.max(0, activeTab - 1));\n }\n }),\n });\n }, [activeTab, tabs.length]);\n\n let renderingDelay;\n const isFirstTab = resultType === 'members' || (!hasMembersTab && resultType === 'media');\n // @optimization Used to unparallelize rendering of message list and profile media\n if (isFirstTab) {\n renderingDelay = !isRightColumnShown ? HIDDEN_RENDER_DELAY : 0;\n // @optimization Used to delay first render of secondary tabs while animating\n } else if (!viewportIds) {\n renderingDelay = SLIDE_TRANSITION_DURATION;\n }\n const canRenderContents = useAsyncRendering([chatId, resultType], renderingDelay);\n\n function getMemberContextAction(id: number) {\n return id === currentUserId || !canDeleteMembers ? undefined : [{\n title: lang('lng_context_remove_from_group'),\n icon: 'stop',\n handler: () => {\n setDeletingUserId(id);\n },\n }];\n }\n\n function renderSharedMedia() {\n if (!viewportIds || !canRenderContents || !chatMessages) {\n // This is just a single-frame delay, so we do not show spinner\n const noSpinner = isFirstTab && viewportIds && !canRenderContents;\n\n return (\n
\n {!noSpinner && }\n
\n );\n }\n\n if (!viewportIds.length) {\n let text: string;\n\n switch (resultType) {\n case 'members':\n text = areMembersHidden ? 'You have no access to group members list.' : 'No members found';\n break;\n case 'documents':\n text = lang('lng_media_file_empty_search');\n break;\n case 'links':\n text = lang('lng_media_link_empty_search');\n break;\n case 'audio':\n text = lang('lng_media_song_empty_search');\n break;\n default:\n text = lang('SharedMedia.EmptyTitle');\n }\n\n return (\n
\n \n
\n );\n }\n\n return (\n \n {resultType === 'media' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'documents' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'links' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'audio' ? (\n viewportIds!.map((id) => chatMessages[id] && (\n \n ))\n ) : resultType === 'members' ? (\n viewportIds!.map((id, i) => (\n handleMemberClick(id)}\n contextActions={getMemberContextAction(id)}\n >\n \n \n ))\n ) : undefined}\n
\n );\n }\n\n return (\n \n {!noProfileInfo && renderProfileInfo(chatId, resolvedUserId)}\n {!isRestricted && (\n \n \n {renderSharedMedia}\n \n \n\n
\n )}\n\n {canAddMembers && (\n \n \n \n )}\n {canDeleteMembers && (\n \n )}\n \n );\n};\n\nfunction renderProfileInfo(chatId: number, resolvedUserId?: number) {\n return (\n
\n \n \n
\n );\n}\n\nfunction buildInfiniteScrollItemSelector(resultType: string) {\n return [\n // Used on first render\n `.shared-media-transition > div:only-child > .${resultType}-list > .scroll-item`,\n // Used after transition\n `.shared-media-transition > div.active > .${resultType}-list > .scroll-item`,\n ].join(', ');\n}\n\nexport default memo(withGlobal(\n (global, { chatId, userId }): StateProps => {\n const chat = selectChat(global, chatId);\n\n const chatMessages = selectChatMessages(global, userId || chatId);\n const { currentType: mediaSearchType, resultsByType } = selectCurrentMediaSearch(global) || {};\n const { foundIds } = (resultsByType && mediaSearchType && resultsByType[mediaSearchType]) || {};\n\n const { byId: usersById } = global.users;\n\n const isGroup = chat && isChatGroup(chat);\n const isChannel = chat && isChatChannel(chat);\n const hasMembersTab = isGroup || (isChannel && isChatAdmin(chat!));\n const members = chat && chat.fullInfo && chat.fullInfo.members;\n const areMembersHidden = hasMembersTab && chat && chat.fullInfo && !chat.fullInfo.canViewMembers;\n const canAddMembers = hasMembersTab && chat && (getHasAdminRight(chat, 'inviteUsers') || chat.isCreator);\n const canDeleteMembers = hasMembersTab && chat && (getHasAdminRight(chat, 'banUsers') || chat.isCreator);\n\n let resolvedUserId;\n if (userId) {\n resolvedUserId = userId;\n } else if (isChatPrivate(chatId)) {\n resolvedUserId = chatId;\n }\n\n return {\n theme: selectTheme(global),\n isChannel,\n resolvedUserId,\n chatMessages,\n foundIds,\n mediaSearchType,\n hasMembersTab,\n areMembersHidden,\n canAddMembers,\n canDeleteMembers,\n currentUserId: global.currentUserId,\n isRightColumnShown: selectIsRightColumnShown(global),\n isRestricted: chat && chat.isRestricted,\n lastSyncTime: global.lastSyncTime,\n serverTimeOffset: global.serverTimeOffset,\n ...(hasMembersTab && members && {\n members,\n usersById,\n }),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setLocalMediaSearchType',\n 'loadMoreMembers',\n 'searchMediaMessagesLocal',\n 'openMediaViewer',\n 'openAudioPlayer',\n 'openUserInfo',\n 'focusMessage',\n 'loadProfilePhotos',\n 'setNewChatMembersDialogState',\n ]),\n)(Profile));\n","import { useCallback, useEffect } from '../../../lib/teact/teact';\n\nexport default function useTransitionFixes(\n containerRef: { current: HTMLDivElement | null },\n transitionElSelector = '.Transition.shared-media-transition',\n) {\n // Set `min-height` for shared media container to prevent jumping when switching tabs\n useEffect(() => {\n function setMinHeight() {\n const container = containerRef.current!;\n const transitionEl = container.querySelector(transitionElSelector);\n const tabsEl = container.querySelector('.TabList');\n if (transitionEl && tabsEl) {\n transitionEl.style.minHeight = `${container.offsetHeight - tabsEl.offsetHeight}px`;\n }\n }\n\n setMinHeight();\n\n window.addEventListener('resize', setMinHeight, false);\n\n return () => {\n window.removeEventListener('resize', setMinHeight, false);\n };\n }, [containerRef, transitionElSelector]);\n\n // Workaround for scrollable content flickering during animation.\n const applyTransitionFix = useCallback(() => {\n const container = containerRef.current!;\n if (container.style.overflowY !== 'hidden') {\n const scrollBarWidth = container.offsetWidth - container.clientWidth;\n container.style.overflowY = 'hidden';\n container.style.marginRight = `${scrollBarWidth}px`;\n }\n }, [containerRef]);\n\n const releaseTransitionFix = useCallback(() => {\n const container = containerRef.current!;\n container.style.overflowY = 'scroll';\n container.style.marginRight = '0';\n }, [containerRef]);\n\n return { applyTransitionFix, releaseTransitionFix };\n}\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default () => {\n const [cacheBuster, setCacheBuster] = useState(false);\n\n const updateCacheBuster = useCallback(() => {\n setCacheBuster((current) => !current);\n }, []);\n\n return [cacheBuster, updateCacheBuster] as const;\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './RightSearch';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst RightSearchAsync: FC = (props) => {\n const RightSearch = useModuleLoader(Bundles.Extra, 'RightSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return RightSearch ? : ;\n};\n\nexport default memo(RightSearchAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './Management';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nimport Loading from '../../ui/Loading';\n\nconst ManagementAsync: FC = (props) => {\n const Management = useModuleLoader(Bundles.Extra, 'Management');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Management ? : ;\n};\n\nexport default memo(ManagementAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst StickerSearchAsync: FC = () => {\n const StickerSearch = useModuleLoader(Bundles.Extra, 'StickerSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerSearch ? : ;\n};\n\nexport default memo(StickerSearchAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst GifSearchAsync: FC = () => {\n const GifSearch = useModuleLoader(Bundles.Extra, 'GifSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return GifSearch ? : ;\n};\n\nexport default memo(GifSearchAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst PollResultsAsync: FC = () => {\n const PollResults = useModuleLoader(Bundles.Extra, 'PollResults');\n\n return PollResults ? : ;\n};\n\nexport default memo(PollResultsAsync);\n","import React, {\n FC, useCallback, useMemo, memo, useState, useEffect,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ApiChat, ApiChatMember, ApiUpdateConnectionStateType, ApiUser,\n} from '../../api/types';\nimport { NewChatMembersProgress } from '../../types';\n\nimport { pick, unique } from '../../util/iteratees';\nimport { selectChat } from '../../modules/selectors';\nimport searchWords from '../../util/searchWords';\nimport {\n getUserFullName, isChatChannel, isUserBot, sortChatIds,\n} from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport usePrevious from '../../hooks/usePrevious';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Picker from '../common/Picker';\nimport FloatingActionButton from '../ui/FloatingActionButton';\nimport Spinner from '../ui/Spinner';\n\nimport './AddChatMembers.scss';\n\nexport type OwnProps = {\n chatId: number;\n isActive: boolean;\n onNextStep: (memberIds: number[]) => void;\n onClose: NoneToVoidFunction;\n};\n\ntype StateProps = {\n connectionState?: ApiUpdateConnectionStateType;\n isChannel?: boolean;\n members?: ApiChatMember[];\n currentUserId?: number;\n usersById: Record;\n chatsById: Record;\n localContactIds?: number[];\n searchQuery?: string;\n isLoading: boolean;\n isSearching?: boolean;\n localUserIds?: number[];\n globalUserIds?: number[];\n};\n\ntype DispatchProps = Pick;\n\nconst AddChatMembers: FC = ({\n isChannel,\n connectionState,\n members,\n onNextStep,\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n isLoading,\n searchQuery,\n isSearching,\n localUserIds,\n globalUserIds,\n setUserSearchQuery,\n onClose,\n isActive,\n loadContactList,\n}) => {\n const lang = useLang();\n const [selectedMemberIds, setSelectedMemberIds] = useState([]);\n const prevSelectedMemberIds = usePrevious(selectedMemberIds);\n const noPickerScrollRestore = prevSelectedMemberIds === selectedMemberIds;\n\n useEffect(() => {\n if (isActive && connectionState === 'connectionStateReady') {\n loadContactList();\n }\n }, [connectionState, isActive, loadContactList]);\n\n useHistoryBack(isActive, onClose);\n\n const memberIds = useMemo(() => {\n return members ? members.map((member) => member.userId) : [];\n }, [members]);\n\n const handleFilterChange = useCallback((query: string) => {\n setUserSearchQuery({ query });\n }, [setUserSearchQuery]);\n\n const displayedIds = useMemo(() => {\n const contactIds = localContactIds\n ? sortChatIds(localContactIds.filter((id) => id !== currentUserId), chatsById)\n : [];\n\n if (!searchQuery) {\n return contactIds.filter((id) => !memberIds.includes(id));\n }\n\n const foundContactIds = contactIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n const fullName = getUserFullName(user);\n return fullName && searchWords(fullName, searchQuery);\n });\n\n return sortChatIds(\n unique([\n ...foundContactIds,\n ...(localUserIds || []),\n ...(globalUserIds || []),\n ]).filter((contactId) => {\n const user = usersById[contactId];\n\n // The user can be added to the chat if the following conditions are met:\n // the user has not yet been added to the current chat\n // AND (it is not found (user from global search) OR it is not a bot OR it is a bot,\n // but the current chat is not a channel AND the appropriate permission is set).\n return !memberIds.includes(contactId)\n && (!user || !isUserBot(user) || (!isChannel && user.canBeInvitedToGroup));\n }),\n chatsById,\n );\n }, [\n localContactIds, chatsById, searchQuery, localUserIds, globalUserIds,\n currentUserId, usersById, memberIds, isChannel,\n ]);\n\n const handleNextStep = useCallback(() => {\n if (selectedMemberIds.length) {\n setUserSearchQuery({ query: '' });\n onNextStep(selectedMemberIds);\n }\n }, [selectedMemberIds, setUserSearchQuery, onNextStep]);\n\n return (\n
\n
\n \n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n const { userIds: localContactIds } = global.contactList || {};\n const { byId: usersById } = global.users;\n const { byId: chatsById } = global.chats;\n const { currentUserId, newChatMembersProgress, connectionState } = global;\n const isChannel = chat && isChatChannel(chat);\n\n const {\n query: searchQuery,\n fetchingStatus,\n globalUserIds,\n localUserIds,\n } = global.userSearch;\n\n return {\n isChannel,\n members: chat && chat.fullInfo ? chat.fullInfo.members : undefined,\n currentUserId,\n usersById,\n chatsById,\n localContactIds,\n searchQuery,\n isSearching: fetchingStatus,\n isLoading: newChatMembersProgress === NewChatMembersProgress.Loading,\n globalUserIds,\n localUserIds,\n connectionState,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['loadContactList', 'setUserSearchQuery']),\n)(AddChatMembers));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport {\n ManagementScreens, NewChatMembersProgress, ProfileState, RightColumnContent,\n} from '../../types';\n\nimport { MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN } from '../../config';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport { pick } from '../../util/iteratees';\nimport {\n selectAreActiveChatsLoaded,\n selectCurrentMessageList,\n selectRightColumnContentKey,\n} from '../../modules/selectors';\nimport useLayoutEffectWithPrevDeps from '../../hooks/useLayoutEffectWithPrevDeps';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport RightHeader from './RightHeader';\nimport Profile from './Profile';\nimport Transition from '../ui/Transition';\nimport RightSearch from './RightSearch.async';\nimport Management from './management/Management.async';\nimport StickerSearch from './StickerSearch.async';\nimport GifSearch from './GifSearch.async';\nimport PollResults from './PollResults.async';\nimport AddChatMembers from './AddChatMembers';\n\nimport './RightColumn.scss';\n\ntype StateProps = {\n contentKey?: RightColumnContent;\n chatId?: number;\n threadId?: number;\n currentProfileUserId?: number;\n isChatSelected: boolean;\n shouldSkipHistoryAnimations?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst COLUMN_CLOSE_DELAY_MS = 300;\nconst MAIN_SCREENS_COUNT = Object.keys(RightColumnContent).length / 2;\nconst MANAGEMENT_SCREENS_COUNT = Object.keys(ManagementScreens).length / 2;\n\nfunction blurSearchInput() {\n const searchInput = document.querySelector('.RightHeader .SearchInput input') as HTMLInputElement;\n if (searchInput) {\n searchInput.blur();\n }\n}\n\nconst RightColumn: FC = ({\n contentKey,\n chatId,\n threadId,\n currentProfileUserId,\n isChatSelected,\n toggleChatInfo,\n toggleManagement,\n openUserInfo,\n closeLocalTextSearch,\n setStickerSearchQuery,\n setGifSearchQuery,\n closePollResults,\n addChatMembers,\n setNewChatMembersDialogState,\n shouldSkipHistoryAnimations,\n}) => {\n const { width: windowWidth } = useWindowSize();\n const [profileState, setProfileState] = useState(ProfileState.Profile);\n const [managementScreen, setManagementScreen] = useState(ManagementScreens.Initial);\n const [selectedChatMemberId, setSelectedChatMemberId] = useState();\n const [isPromotedByCurrentUser, setIsPromotedByCurrentUser] = useState();\n const isScrolledDown = profileState !== ProfileState.Profile;\n\n const isOpen = contentKey !== undefined;\n const isProfile = contentKey === RightColumnContent.ChatInfo || contentKey === RightColumnContent.UserInfo;\n const isSearch = contentKey === RightColumnContent.Search;\n const isManagement = contentKey === RightColumnContent.Management;\n const isStickerSearch = contentKey === RightColumnContent.StickerSearch;\n const isGifSearch = contentKey === RightColumnContent.GifSearch;\n const isPollResults = contentKey === RightColumnContent.PollResults;\n const isAddingChatMembers = contentKey === RightColumnContent.AddingMembers;\n const isOverlaying = windowWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN;\n\n const [shouldSkipTransition, setShouldSkipTransition] = useState(!isOpen);\n\n const renderingContentKey = useCurrentOrPrev(contentKey, true, !isChatSelected) ?? -1;\n\n const close = useCallback((shouldScrollUp = true) => {\n switch (contentKey) {\n case RightColumnContent.AddingMembers:\n setNewChatMembersDialogState(NewChatMembersProgress.Closed);\n break;\n case RightColumnContent.ChatInfo:\n if (isScrolledDown && shouldScrollUp) {\n setProfileState(ProfileState.Profile);\n break;\n }\n toggleChatInfo(undefined, true);\n break;\n case RightColumnContent.UserInfo:\n if (isScrolledDown && shouldScrollUp) {\n setProfileState(ProfileState.Profile);\n break;\n }\n openUserInfo({ id: undefined }, true);\n break;\n case RightColumnContent.Management: {\n switch (managementScreen) {\n case ManagementScreens.Initial:\n toggleManagement();\n break;\n case ManagementScreens.ChatPrivacyType:\n case ManagementScreens.Discussion:\n case ManagementScreens.GroupPermissions:\n case ManagementScreens.GroupType:\n case ManagementScreens.ChatAdministrators:\n case ManagementScreens.ChannelSubscribers:\n case ManagementScreens.GroupMembers:\n setManagementScreen(ManagementScreens.Initial);\n break;\n case ManagementScreens.GroupUserPermissionsCreate:\n case ManagementScreens.GroupRemovedUsers:\n case ManagementScreens.GroupUserPermissions:\n setManagementScreen(ManagementScreens.GroupPermissions);\n setSelectedChatMemberId(undefined);\n setIsPromotedByCurrentUser(undefined);\n break;\n case ManagementScreens.ChatAdminRights:\n case ManagementScreens.GroupRecentActions:\n setManagementScreen(ManagementScreens.ChatAdministrators);\n break;\n }\n\n break;\n }\n case RightColumnContent.Search: {\n blurSearchInput();\n closeLocalTextSearch();\n break;\n }\n case RightColumnContent.StickerSearch:\n blurSearchInput();\n setStickerSearchQuery({ query: undefined });\n break;\n case RightColumnContent.GifSearch: {\n blurSearchInput();\n setGifSearchQuery({ query: undefined });\n break;\n }\n case RightColumnContent.PollResults:\n closePollResults();\n break;\n }\n }, [\n contentKey, isScrolledDown, toggleChatInfo, openUserInfo, closePollResults, setNewChatMembersDialogState,\n managementScreen, toggleManagement, closeLocalTextSearch, setStickerSearchQuery, setGifSearchQuery,\n ]);\n\n const handleSelectChatMember = useCallback((memberId, isPromoted) => {\n setSelectedChatMemberId(memberId);\n setIsPromotedByCurrentUser(isPromoted);\n }, []);\n\n const handleAppendingChatMembers = useCallback((memberIds: number[]) => {\n addChatMembers({ chatId, memberIds });\n }, [addChatMembers, chatId]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(close) : undefined), [isOpen, close]);\n\n useEffect(() => {\n setTimeout(() => {\n setShouldSkipTransition(!isOpen);\n }, COLUMN_CLOSE_DELAY_MS);\n }, [isOpen]);\n\n // Close Right Column when it transforms into overlayed state on screen resize\n useEffect(() => {\n if (isOpen && isOverlaying) {\n close();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOverlaying]);\n\n // We need to clear profile state and management screen state, when changing chats\n useLayoutEffectWithPrevDeps(([prevContentKey, prevChatId]) => {\n if (\n (prevContentKey === RightColumnContent.ChatInfo && contentKey === RightColumnContent.UserInfo)\n || (prevContentKey === RightColumnContent.UserInfo && contentKey === RightColumnContent.ChatInfo)\n || (prevChatId !== chatId)\n ) {\n setProfileState(ProfileState.Profile);\n setManagementScreen(ManagementScreens.Initial);\n }\n }, [contentKey, chatId]);\n\n\n useHistoryBack(isChatSelected && (contentKey === RightColumnContent.ChatInfo\n || contentKey === RightColumnContent.UserInfo || contentKey === RightColumnContent.Management\n || contentKey === RightColumnContent.AddingMembers),\n () => close(false), toggleChatInfo);\n\n // eslint-disable-next-line consistent-return\n function renderContent(isActive: boolean) {\n if (renderingContentKey === -1) {\n return undefined;\n }\n\n switch (renderingContentKey) {\n case RightColumnContent.AddingMembers:\n return (\n \n );\n case RightColumnContent.ChatInfo:\n case RightColumnContent.UserInfo:\n return (\n \n );\n case RightColumnContent.Search:\n return ;\n case RightColumnContent.Management:\n return (\n \n );\n\n case RightColumnContent.StickerSearch:\n return ;\n case RightColumnContent.GifSearch:\n return ;\n case RightColumnContent.PollResults:\n return ;\n }\n }\n\n return (\n \n {isOverlaying && (\n
\n )}\n
\n \n \n {renderContent}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const areActiveChatsLoaded = selectAreActiveChatsLoaded(global);\n\n return {\n contentKey: selectRightColumnContentKey(global),\n chatId,\n threadId,\n currentProfileUserId: global.users.selectedId,\n isChatSelected: Boolean(chatId && areActiveChatsLoaded),\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'openUserInfo',\n 'toggleChatInfo',\n 'toggleManagement',\n 'closeLocalTextSearch',\n 'setStickerSearchQuery',\n 'setGifSearchQuery',\n 'closePollResults',\n 'addChatMembers',\n 'setNewChatMembersDialogState',\n ]),\n)(RightColumn));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { Bundles } from '../../util/moduleLoader';\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\ninterface OwnProps {\n isOpen: boolean;\n}\n\nconst MediaViewerAsync: FC = ({ isOpen }) => {\n const MediaViewer = useModuleLoader(Bundles.Extra, 'MediaViewer', !isOpen);\n\n return MediaViewer ? : undefined;\n};\n\nexport default memo(MediaViewerAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst NotificationsAsync: FC = ({ isOpen }) => {\n const Notifications = useModuleLoader(Bundles.Extra, 'Notifications', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Notifications ? : undefined;\n};\n\nexport default memo(NotificationsAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst DialogsAsync: FC = ({ isOpen }) => {\n const Dialogs = useModuleLoader(Bundles.Extra, 'Dialogs', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Dialogs ? : undefined;\n};\n\nexport default memo(DialogsAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\nimport { OwnProps } from './ForwardPicker';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ForwardPickerAsync: FC = (props) => {\n const { isOpen } = props;\n const ForwardPicker = useModuleLoader(Bundles.Extra, 'ForwardPicker', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ForwardPicker ? : undefined;\n};\n\nexport default memo(ForwardPickerAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport { OwnProps } from './SafeLinkModal';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst SafeLinkModalAsync: FC = (props) => {\n const { url } = props;\n const SafeLinkModal = useModuleLoader(Bundles.Extra, 'SafeLinkModal', !url);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return SafeLinkModal ? : undefined;\n};\n\nexport default memo(SafeLinkModalAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport { OwnProps } from './HistoryCalendar';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst HistoryCalendarAsync: FC = (props) => {\n const { isOpen } = props;\n const HistoryCalendar = useModuleLoader(Bundles.Extra, 'HistoryCalendar', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return HistoryCalendar ? : undefined;\n};\n\nexport default memo(HistoryCalendarAsync);\n","import React, {\n FC, useEffect, memo, useCallback,\n} from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\nimport { LangCode } from '../../types';\n\nimport '../../modules/actions/all';\nimport {\n BASE_EMOJI_KEYWORD_LANG, DEBUG, INACTIVE_MARKER, PAGE_TITLE,\n} from '../../config';\nimport { pick } from '../../util/iteratees';\nimport {\n selectChatMessage,\n selectCountNotMutedUnread,\n selectIsForwardModalOpen,\n selectIsMediaViewerOpen,\n selectIsRightColumnShown,\n} from '../../modules/selectors';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport buildClassName from '../../util/buildClassName';\nimport { fastRaf } from '../../util/schedulers';\nimport { waitForTransitionEnd } from '../../util/cssAnimationEndListeners';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\nimport useBeforeUnload from '../../hooks/useBeforeUnload';\nimport useOnChange from '../../hooks/useOnChange';\n\nimport LeftColumn from '../left/LeftColumn';\nimport MiddleColumn from '../middle/MiddleColumn';\nimport RightColumn from '../right/RightColumn';\nimport MediaViewer from '../mediaViewer/MediaViewer.async';\nimport AudioPlayer from '../middle/AudioPlayer';\nimport Notifications from './Notifications.async';\nimport Dialogs from './Dialogs.async';\nimport ForwardPicker from './ForwardPicker.async';\nimport SafeLinkModal from './SafeLinkModal.async';\nimport HistoryCalendar from './HistoryCalendar.async';\n\nimport './Main.scss';\n\ntype StateProps = {\n animationLevel: number;\n lastSyncTime?: number;\n isLeftColumnShown: boolean;\n isRightColumnShown: boolean;\n isMediaViewerOpen: boolean;\n isForwardModalOpen: boolean;\n hasNotifications: boolean;\n hasDialogs: boolean;\n audioMessage?: ApiMessage;\n safeLinkModalUrl?: string;\n isHistoryCalendarOpen: boolean;\n shouldSkipHistoryAnimations?: boolean;\n language?: LangCode;\n};\n\ntype DispatchProps = Pick;\n\nconst NOTIFICATION_INTERVAL = 1000;\n\nlet notificationInterval: number | undefined;\n\nlet DEBUG_isLogged = false;\n\nconst Main: FC = ({\n lastSyncTime,\n isLeftColumnShown,\n isRightColumnShown,\n isMediaViewerOpen,\n isForwardModalOpen,\n animationLevel,\n hasNotifications,\n hasDialogs,\n audioMessage,\n safeLinkModalUrl,\n isHistoryCalendarOpen,\n shouldSkipHistoryAnimations,\n language,\n loadAnimatedEmojis,\n loadNotificationSettings,\n loadNotificationExceptions,\n updateIsOnline,\n loadTopInlineBots,\n loadEmojiKeywords,\n}) => {\n if (DEBUG && !DEBUG_isLogged) {\n DEBUG_isLogged = true;\n // eslint-disable-next-line no-console\n console.log('>>> RENDER MAIN');\n }\n\n // Initial API calls\n useEffect(() => {\n if (lastSyncTime) {\n updateIsOnline(true);\n loadAnimatedEmojis();\n loadNotificationSettings();\n loadNotificationExceptions();\n loadTopInlineBots();\n\n loadEmojiKeywords({ language: BASE_EMOJI_KEYWORD_LANG });\n if (language !== BASE_EMOJI_KEYWORD_LANG) {\n loadEmojiKeywords({ language });\n }\n }\n }, [\n lastSyncTime, loadAnimatedEmojis, loadNotificationExceptions, loadNotificationSettings, updateIsOnline,\n loadTopInlineBots, loadEmojiKeywords, language,\n ]);\n\n const {\n transitionClassNames: middleColumnTransitionClassNames,\n } = useShowTransition(!isLeftColumnShown, undefined, true, undefined, shouldSkipHistoryAnimations);\n\n const {\n transitionClassNames: rightColumnTransitionClassNames,\n } = useShowTransition(isRightColumnShown, undefined, true, undefined, shouldSkipHistoryAnimations);\n\n\n const className = buildClassName(\n middleColumnTransitionClassNames.replace(/([\\w-]+)/g, 'middle-column-$1'),\n rightColumnTransitionClassNames.replace(/([\\w-]+)/g, 'right-column-$1'),\n shouldSkipHistoryAnimations && 'history-animation-disabled',\n );\n\n // Dispatch heavy transition event when opening middle column\n useOnChange(([prevIsLeftColumnShown]) => {\n if (prevIsLeftColumnShown === undefined || animationLevel === 0) {\n return;\n }\n\n const dispatchHeavyAnimationEnd = dispatchHeavyAnimationEvent();\n\n waitForTransitionEnd(document.getElementById('MiddleColumn')!, dispatchHeavyAnimationEnd);\n }, [isLeftColumnShown]);\n\n // Dispatch heavy transition event and add body class when opening right column\n useOnChange(([prevIsRightColumnShown]) => {\n if (prevIsRightColumnShown === undefined || animationLevel === 0) {\n return;\n }\n\n fastRaf(() => {\n document.body.classList.add('animating-right-column');\n });\n\n const dispatchHeavyAnimationEnd = dispatchHeavyAnimationEvent();\n\n waitForTransitionEnd(document.getElementById('RightColumn')!, () => {\n dispatchHeavyAnimationEnd();\n\n fastRaf(() => {\n document.body.classList.remove('animating-right-column');\n });\n });\n }, [isRightColumnShown]);\n\n const handleBlur = useCallback(() => {\n updateIsOnline(false);\n\n const initialUnread = selectCountNotMutedUnread(getGlobal());\n let index = 0;\n\n clearInterval(notificationInterval);\n notificationInterval = window.setInterval(() => {\n if (document.title.includes(INACTIVE_MARKER)) {\n updateIcon(false);\n return;\n }\n\n if (index % 2 === 0) {\n const newUnread = selectCountNotMutedUnread(getGlobal()) - initialUnread;\n if (newUnread > 0) {\n updatePageTitle(`${newUnread} notification${newUnread > 1 ? 's' : ''}`);\n updateIcon(true);\n }\n } else {\n updatePageTitle(PAGE_TITLE);\n updateIcon(false);\n }\n\n index++;\n }, NOTIFICATION_INTERVAL);\n }, [updateIsOnline]);\n\n const handleFocus = useCallback(() => {\n updateIsOnline(true);\n\n clearInterval(notificationInterval);\n notificationInterval = undefined;\n\n if (!document.title.includes(INACTIVE_MARKER)) {\n updatePageTitle(PAGE_TITLE);\n }\n\n updateIcon(false);\n }, [updateIsOnline]);\n\n // Online status and browser tab indicators\n useBackgroundMode(handleBlur, handleFocus);\n useBeforeUnload(handleBlur);\n\n function stopEvent(e: React.MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n return (\n
\n \n \n \n \n \n \n \n {audioMessage && }\n \n \n
\n );\n};\n\nfunction updateIcon(asUnread: boolean) {\n document.querySelectorAll('link[rel=\"icon\"]')\n .forEach((link) => {\n if (asUnread) {\n if (!link.href.includes('favicon-unread')) {\n link.href = link.href.replace('favicon', 'favicon-unread');\n }\n } else {\n link.href = link.href.replace('favicon-unread', 'favicon');\n }\n });\n}\n\n// For some reason setting `document.title` to the same value\n// causes increment of Chrome Dev Tools > Performance Monitor > DOM Nodes counter\nfunction updatePageTitle(nextTitle: string) {\n if (document.title !== nextTitle) {\n document.title = nextTitle;\n }\n}\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n const audioMessage = audioChatId && audioMessageId\n ? selectChatMessage(global, audioChatId, audioMessageId)\n : undefined;\n\n return {\n animationLevel: global.settings.byKey.animationLevel,\n lastSyncTime: global.lastSyncTime,\n isLeftColumnShown: global.isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isMediaViewerOpen: selectIsMediaViewerOpen(global),\n isForwardModalOpen: selectIsForwardModalOpen(global),\n hasNotifications: Boolean(global.notifications.length),\n hasDialogs: Boolean(global.dialogs.length),\n audioMessage,\n safeLinkModalUrl: global.safeLinkModalUrl,\n isHistoryCalendarOpen: Boolean(global.historyCalendarSelectedAt),\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n language: global.settings.byKey.language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'loadAnimatedEmojis', 'loadNotificationSettings', 'loadNotificationExceptions', 'updateIsOnline',\n 'loadTopInlineBots', 'loadEmojiKeywords',\n ]),\n)(Main));\n","import { getDispatch, getGlobal } from '../lib/teact/teactn';\n\nimport { DEBUG } from '../config';\n\nexport { default as Main } from '../components/main/Main';\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH LOAD MAIN BUNDLE');\n}\n\nif (!getGlobal().connectionState) {\n getDispatch().initApi();\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/5.3751c0b85336f64c5d01.js.map b/dist/5.3751c0b85336f64c5d01.js.map deleted file mode 100644 index 55a4a1776..000000000 --- a/dist/5.3751c0b85336f64c5d01.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///5.08336f800f048343458f.js"],"names":["window","push","107","module","__webpack_exports__","__webpack_require__","r","d","auth_AuthCode","auth_AuthPassword","auth_AuthRegister","teact","teactn","environment","iteratees","renderText","useHistoryBack","useLang","InputText","Loading","config","animatedAssets","AnimatedSticker","STICKER_SIZE","common_TrackingMonkey","Object","code","codeLength","trackingDirection","isTracking","isBig","idleMonkeyData","setIdleMonkeyData","trackingMonkeyData","setTrackingMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","TRACKING_FRAMES_PER_SYMBOL","then","handleFirstMonkeyLoad","createElement","id","className","size","undefined","animationData","play","onLoad","playSegment","startFrame","length","endFrame","getTrackingFrames","speed","noLoop","global","setGlobal","actions","authPhoneNumber","authIsCodeViaApp","authIsLoading","authError","setAuthCode","returnToAuthPhoneNumber","clearAuthError","lang","inputRef","setCode","setIsTracking","setTrackingDirection","current","focus","onCodeChange","e","currentTarget","target","value","replace","substr","onClick","role","tabIndex","title","ref","label","onInput","error","autoComplete","inputMode","common_PasswordMonkey","PasswordForm","authHint","setAuthPassword","showPassword","setShowPassword","handleChangePasswordVisibility","isVisible","handleSubmit","password","isPasswordVisible","clearError","hint","isLoading","onChangePasswordVisibility","onSubmit","Button","AvatarEditable","signUp","uploadProfilePhoto","isButtonShown","setIsButtonShown","croppedFile","setCroppedFile","firstName","setFirstName","lastName","setLastName","action","method","event","preventDefault","file","onChange","type","ripple","112","captureKeyboardListeners","buildClassName","useHeavyAnimationCheck","useShowTransition","useEffectWithPrevDeps","Portal","isOpen","header","hasCloseButton","noBackdrop","children","onClose","onCloseAnimationEnd","onEnter","shouldSkipHistoryAnimations","shouldRender","transitionClassNames","modalRef","onEsc","element","handleKeyDown","key","stopPropagation","focusableElements","Array","from","querySelectorAll","currentFocusedIndex","findIndex","em","isSameNode","document","activeElement","newFocusedIndex","shiftKey","addEventListener","removeEventListener","trapFocus","forceClose","prevIsOpen","body","classList","toggle","remove","fullClassName","round","color","ariaLabel","119","_lib_teact_teact__WEBPACK_IMPORTED_MODULE_0__","_util_schedulers__WEBPACK_IMPORTED_MODULE_1__","_util_buildClassName__WEBPACK_IMPORTED_MODULE_2__","_hooks_useHeavyAnimationCheck__WEBPACK_IMPORTED_MODULE_3__","_hooks_useBackgroundMode__WEBPACK_IMPORTED_MODULE_4__","lottiePromise","RLottie","async","ensureLottie","bind","default","setTimeout","quality","isLowPriority","animation","setAnimation","container","wasPlaying","isFrozen","playRef","playSegmentRef","exec","newAnimation","setSpeed","destroy","playAnimation","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","style","126","useBackgroundMode","onBlur","onFocus","hasFocus","127","_lib_teact_teact_dom__WEBPACK_IMPORTED_MODULE_1__","containerId","elementRef","querySelector","add","appendChild","render","removeChild","130","getAnimationData","types","mediaLoader","ANIMATED_STICKERS_PATHS","MonkeyIdle","p","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","name","path","location","origin","Lottie","135","files","Modal","cropperResultOptions","format","circle","Croppie","croppiePromise","cropper","ui_CropModal","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","getElementById","offsetWidth","offsetHeight","enableZoom","boundary","width","height","viewport","dataUri","url","err","console","initCropper","Promise","all","ensureCroppie","Boolean","result","croppedImg","disabled","currentAvatarBlobUrl","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","accept","src","alt","URL","revokeObjectURL","createObjectURL","143","exports","151","_config__WEBPACK_IMPORTED_MODULE_1__","_util_environment__WEBPACK_IMPORTED_MODULE_2__","_helpers_animatedAssets__WEBPACK_IMPORTED_MODULE_3__","_AnimatedSticker__WEBPACK_IMPORTED_MODULE_4__","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isPeekShown","setIsPeekShown","152","_util_buildClassName__WEBPACK_IMPORTED_MODULE_3__","_hooks_useLang__WEBPACK_IMPORTED_MODULE_4__","_ui_Button__WEBPACK_IMPORTED_MODULE_5__","FOCUS_DELAY_TIMEOUT_MS","placeholder","submitLabel","onInputChange","setPassword","canSubmit","setCanSubmit","requestAnimationFrame","select","dir","isRtl","153","154","155"],"mappings":"CAACA,OAAqB,aAAIA,OAAqB,cAAK,IAAIC,KAAK,CAAC,CAAC,GAAG,CAE5DC,IACA,SAAUC,EAAQC,EAAqBC,GAE7C,aAEAA,EAAoBC,EAAEF,GAGtBC,EAAoBE,EAAEH,EAAqB,YAAY,WAAa,OAAsBI,KAC1FH,EAAoBE,EAAEH,EAAqB,gBAAgB,WAAa,OAAsBK,KAC9FJ,EAAoBE,EAAEH,EAAqB,gBAAgB,WAAa,OAAsBM,KAG9F,IAAIC,EAAQN,EAAoB,GAG5BO,EAASP,EAAoB,GAG7BQ,EAAcR,EAAoB,GAGlCS,EAAYT,EAAoB,GAGhCU,EAAaV,EAAoB,IAGjCW,EAAiBX,EAAoB,IAGrCY,EAAUZ,EAAoB,IAG9Ba,EAAYb,EAAoB,IAGhCc,EAAUd,EAAoB,IAG9Be,EAASf,EAAoB,GAG7BgB,EAAiBhB,EAAoB,KAGrCiB,EAAkBjB,EAAoB,KAGrBA,EAAoB,KASzC,MAEMkB,EAAeV,EAA6C,EAAIO,EAA0C,GAAIA,EAAmC,GA2D1H,IAAII,EAAyBC,OAAOd,EAAoB,EAA5B,CAzDlC,EACrBe,OACAC,aACAC,oBACAC,aACAC,YAEA,MAAOC,EAAgBC,GAAqBP,OAAOd,EAAwB,EAA/Bc,IACrCQ,EAAoBC,GAAyBT,OAAOd,EAAwB,EAA/Bc,IAC7CU,EAAqBC,GAA0BX,OAAOd,EAAwB,EAA/Bc,EAAkC,GAClFY,EAA6B,IAA8CV,EACjFF,OAAOd,EAAyB,EAAhCc,CAAmC,KAC5BM,GACHN,OAAOJ,EAAgC,EAAvCI,CAA0C,cAAca,KAAKN,IAE9D,CAACD,IACJN,OAAOd,EAAyB,EAAhCc,CAAmC,KAC5BQ,GACHR,OAAOJ,EAAgC,EAAvCI,CAA0C,kBAAkBa,KAAKJ,IAElE,CAACD,IACJ,MAAMM,EAAwBd,OAAOd,EAA2B,EAAlCc,CAAqC,IAAMW,GAAuB,GAAO,IAavG,OAAoBzB,EAAuB,EAAE6B,cAAc,MAAO,CAChEC,GAAI,SACJC,UAAWZ,EAAQ,MAAQ,KACzBK,GAAoCxB,EAAuB,EAAE6B,cAAc,MAAO,CACpFE,UAAW,mBACTX,GAA+BpB,EAAuB,EAAE6B,cAAclB,EAAiC,EAAG,CAC5GmB,GAAI,aACJE,KAAMb,EAAQV,EAAqC,GAAIG,EACvDmB,UAAWb,EAAa,cAAWe,EACnCC,cAAed,EACfe,MAAOjB,EACPkB,OAAQR,IACNN,GAAmCtB,EAAuB,EAAE6B,cAAclB,EAAiC,EAAG,CAChHmB,GAAI,iBACJE,KAAMb,EAAQV,EAAqC,GAAIG,EACvDmB,UAAYb,EAAwB,QAAX,SACzBgB,cAAeZ,EACfe,YAAanB,EA5Bf,WACE,MAAMoB,EAAavB,GAAQA,EAAKwB,OAAS,GAAKtB,EAAoB,EA5BzC,GA4BoES,GAA8BX,EAAKwB,OAAS,GAAK,EACxIC,EAAWzB,EAAKwB,SAAWvB,EA5BV,IADE,GA6BiEU,EAA6BX,EAAKwB,OAE5H,OAAItB,EAAoB,EACf,CAACuB,EAAUF,GAGb,CAACA,EAAYE,GAoBMC,QAAsBR,EAChDS,MAAO,EACPC,QAAQ,OAyGiB,IAAI9C,EAAiBiB,OAAOd,EAAoB,EAA5B,CAA+Bc,OAAOb,EAA2B,EAAlCa,CAAqC8B,GAAU9B,OAAOX,EAAwB,EAA/BW,CAAkC8B,EAAQ,CAAC,kBAAmB,mBAAoB,gBAAiB,cAAe,CAACC,EAAWC,IAAYhC,OAAOX,EAAwB,EAA/BW,CAAkCgC,EAAS,CAAC,cAAe,0BAA2B,mBAA/QhC,CAvF/D,EACfiC,kBACAC,mBACAC,gBACAC,YACAC,cACAC,0BACAC,qBAEA,MAAMC,EAAOxC,OAAOR,EAAyB,EAAhCQ,GAEPyC,EAAWzC,OAAOd,EAAsB,EAA7Bc,CAAgC,OAC1CC,EAAMyC,GAAW1C,OAAOd,EAAwB,EAA/Bc,CAAkC,KACnDI,EAAYuC,GAAiB3C,OAAOd,EAAwB,EAA/Bc,EAAkC,IAC/DG,EAAmByC,GAAwB5C,OAAOd,EAAwB,EAA/Bc,CAAkC,GACpFA,OAAOd,EAAyB,EAAhCc,CAAmC,KAC5BZ,EAAkC,GACrCqD,EAASI,QAAQC,SAElB,IACH9C,OAAOT,EAAgC,EAAvCS,EAA0C,EAAMsC,GAChD,MAAMS,EAAe/C,OAAOd,EAA2B,EAAlCc,CAAqCgD,IACpDZ,GACFG,IAGF,MACEU,cAAeC,GACbF,EACJE,EAAOC,MAAQD,EAAOC,MAAMC,QAAQ,SAAU,IAAIC,OAAO,EA/BzC,GAiCZH,EAAOC,QAAUlD,IAIrByC,EAAQQ,EAAOC,OAEV/C,EAEO8C,EAAOC,MAAM1B,QACvBkB,GAAc,GAFdA,GAAc,GAKZ1C,GAAQA,EAAKwB,OAASyB,EAAOC,MAAM1B,OACrCmB,GAAsB,GAEtBA,EAAqB,GAhDP,IAmDZM,EAAOC,MAAM1B,QACfY,EAAY,CACVpC,KAAMiD,EAAOC,UAGhB,CAACf,EAAWG,EAAgBtC,EAAMG,EAAYiC,IACjD,OAAoBnD,EAAuB,EAAE6B,cAAc,MAAO,CAChEC,GAAI,iBACJC,UAAW,iBACG/B,EAAuB,EAAE6B,cAAc,MAAO,CAC5DE,UAAW,aACG/B,EAAuB,EAAE6B,cAAchB,EAAuB,CAC5EE,KAAMA,EACNC,WAhEgB,EAiEhBE,WAAYA,EACZD,kBAAmBA,IACJjB,EAAuB,EAAE6B,cAAc,KAAM,KAAMkB,EAA8B/C,EAAuB,EAAE6B,cAAc,MAAO,CAC9IE,UAAW,mBACXqC,QAAShB,EACTiB,KAAM,SACNC,SAAU,EACVC,MAAOjB,EAAK,gBACEtD,EAAuB,EAAE6B,cAAc,IAAK,CAC1DE,UAAW,gBACM/B,EAAuB,EAAE6B,cAAc,IAAK,CAC7DE,UAAW,QACVjB,OAAOV,EAA4B,EAAnCU,CAAsCwC,EAAKN,EAAmB,cAAgB,qBAAsB,CAAC,qBAAmChD,EAAuB,EAAE6B,cAActB,EAA2B,EAAG,CAC9MiE,IAAKjB,EACLzB,GAAI,eACJ2C,MAAOnB,EAAK,QACZoB,QAASb,EACTI,MAAOlD,EACP4D,MAAOzB,GAAaI,EAAKJ,GACzB0B,aAAc,gBACdC,UAAW,YACT5B,GAA8BjD,EAAuB,EAAE6B,cAAcrB,EAAyB,EAAG,WAKnGsE,EAAwBpF,EAAoB,KAG5CqF,EAAerF,EAAoB,KA+CV,IAAII,EAAqBgB,OAAOd,EAAoB,EAA5B,CAA+Bc,OAAOb,EAA2B,EAAlCa,CAAqC8B,GAAU9B,OAAOX,EAAwB,EAA/BW,CAAkC8B,EAAQ,CAAC,gBAAiB,YAAa,aAAc,CAACC,EAAWC,IAAYhC,OAAOX,EAAwB,EAA/BW,CAAkCgC,EAAS,CAAC,kBAAmB,mBAA7NhC,CArC/D,EACnBmC,gBACAC,YACA8B,WACAC,kBACA5B,qBAEA,MAAMC,EAAOxC,OAAOR,EAAyB,EAAhCQ,IACNoE,EAAcC,GAAmBrE,OAAOd,EAAwB,EAA/Bc,EAAkC,GACpEsE,EAAiCtE,OAAOd,EAA2B,EAAlCc,CAAqCuE,IAC1EF,EAAgBE,IACf,IACGC,EAAexE,OAAOd,EAA2B,EAAlCc,CAAqCyE,IACxDN,EAAgB,CACdM,cAED,CAACN,IACJ,OAAoBjF,EAAuB,EAAE6B,cAAc,MAAO,CAChEC,GAAI,qBACJC,UAAW,iBACG/B,EAAuB,EAAE6B,cAAc,MAAO,CAC5DE,UAAW,aACG/B,EAAuB,EAAE6B,cAAciD,EAAuC,EAAG,CAC/FU,kBAAmBN,IACJlF,EAAuB,EAAE6B,cAAc,KAAM,KAAMyB,EAAK,0BAAwCtD,EAAuB,EAAE6B,cAAc,IAAK,CAC3JE,UAAW,QACVuB,EAAK,mCAAiDtD,EAAuB,EAAE6B,cAAckD,EAA8B,EAAG,CAC/HU,WAAYpC,EACZsB,MAAOzB,GAAaI,EAAKJ,GACzBwC,KAAMV,EACNW,UAAW1C,EACXuC,kBAAmBN,EACnBU,2BAA4BR,EAC5BS,SAAUP,SAMVQ,EAASpG,EAAoB,IAG7BqG,EAAiBrG,EAAoB,KA0FZ,IAAIK,EAAqBe,OAAOd,EAAoB,EAA5B,CAA+Bc,OAAOb,EAA2B,EAAlCa,CAAqC8B,GAAU9B,OAAOX,EAAwB,EAA/BW,CAAkC8B,EAAQ,CAAC,gBAAiB,cAAe,CAACC,EAAWC,IAAYhC,OAAOX,EAAwB,EAA/BW,CAAkCgC,EAAS,CAAC,SAAU,iBAAkB,uBAA1NhC,CA/E/D,EACnBmC,gBACAC,YACA8C,SACA3C,iBACA4C,yBAEA,MAAM3C,EAAOxC,OAAOR,EAAyB,EAAhCQ,IACNoF,EAAeC,GAAoBrF,OAAOd,EAAwB,EAA/Bc,EAAkC,IACrEsF,EAAaC,GAAkBvF,OAAOd,EAAwB,EAA/Bc,IAC/BwF,EAAWC,GAAgBzF,OAAOd,EAAwB,EAA/Bc,CAAkC,KAC7D0F,EAAUC,GAAe3F,OAAOd,EAAwB,EAA/Bc,CAAkC,IAmClE,OAAoBd,EAAuB,EAAE6B,cAAc,MAAO,CAChEC,GAAI,yBACJC,UAAW,iBACG/B,EAAuB,EAAE6B,cAAc,MAAO,CAC5DE,UAAW,aACG/B,EAAuB,EAAE6B,cAAc,OAAQ,CAC7D6E,OAAQ,GACRC,OAAQ,OACRd,SAtBF,SAAsBe,GACpBA,EAAMC,iBACNb,EAAO,CACLM,YACAE,aAGEJ,GACFH,EAAmB,CACjBa,KAAMV,MAcIpG,EAAuB,EAAE6B,cAAckE,EAAgC,EAAG,CACxFgB,SAAUV,IACKrG,EAAuB,EAAE6B,cAAc,KAAM,KAAMyB,EAAK,aAA2BtD,EAAuB,EAAE6B,cAAc,IAAK,CAC9IE,UAAW,QACVuB,EAAK,wBAAsCtD,EAAuB,EAAE6B,cAActB,EAA2B,EAAG,CACjHuB,GAAI,0BACJ2C,MAAOnB,EAAK,wCACZyD,SAjDF,SAA+BH,GACzB1D,GACFG,IAGF,MAAMW,OACJA,GACE4C,EACJL,EAAavC,EAAOC,OACpBkC,EAAiBnC,EAAOC,MAAM1B,OAAS,IAyCvC0B,MAAOqC,EACP3B,MAAOzB,GAAaI,EAAKJ,GACzB0B,aAAc,eACC5E,EAAuB,EAAE6B,cAActB,EAA2B,EAAG,CACpFuB,GAAI,yBACJ2C,MAAOnB,EAAK,uCACZyD,SA5CF,SAA8BH,GAC5B,MAAM5C,OACJA,GACE4C,EACJH,EAAYzC,EAAOC,QAyCnBA,MAAOuC,EACP5B,aAAc,gBACZsB,GAA8BlG,EAAuB,EAAE6B,cAAciE,EAAwB,EAAG,CAClGkB,KAAM,SACNC,QAAQ,EACRtB,UAAW1C,GACVK,EAAK,gBAWJ4D,IACA,SAAU1H,EAAQC,EAAqBC,GAE7C,aAGA,IAAIM,EAAQN,EAAoB,GAG5ByH,EAA2BzH,EAAoB,IAqCnD,IAAI0H,EAAiB1H,EAAoB,GAGrC2H,EAAyB3H,EAAoB,IAG7C4H,EAAoB5H,EAAoB,IAGxC6H,EAAwB7H,EAAoB,IAG5CY,EAAUZ,EAAoB,IAG9BW,EAAiBX,EAAoB,IAGrCoG,EAASpG,EAAoB,IAG7B8H,EAAS9H,EAAoB,KAGrBA,EAAoB,KA+GYD,EAAuB,EA9F/C,EAClB8E,QACAxC,YACA0F,SACAC,SACAC,iBACAC,aACAC,WACAC,UACAC,sBACAC,UACAC,kCAEA,MAAMC,aACJA,EAAYC,qBACZA,GACErH,OAAOwG,EAAmC,EAA1CxG,CAA6C2G,EAAQM,EAAqBE,OAA6BhG,EAAWgG,GAEhHG,EAAWtH,OAAOd,EAAsB,EAA7Bc,CAAgC,MACjDA,OAAOd,EAAyB,EAAhCc,CAAmC,IAAM2G,EAAS3G,OAAOqG,EAA0C,EAAjDrG,CAAoD,CACpGuH,MAAOP,EACPE,iBACG/F,EAAW,CAACwF,EAAQK,EAASE,IAClClH,OAAOd,EAAyB,EAAhCc,CAAmC,IAAM2G,GAAUW,EAASzE,QAlG9D,SAAmB2E,GACjB,SAASC,EAAczE,GACrB,GAAc,QAAVA,EAAE0E,IACJ,OAGF1E,EAAE+C,iBACF/C,EAAE2E,kBACF,MAAMC,EAAoBC,MAAMC,KAAKN,EAAQO,iBAAiB,6EAE9D,IAAKH,EAAkBnG,OACrB,OAGF,MAAMuG,EAAsBJ,EAAkBK,UAAUC,GAAMA,EAAGC,WAAWC,SAASC,gBACrF,IAAIC,EAAkB,EAElBN,GAAuB,IAEvBM,EADEtF,EAAEuF,SACcP,EAAsB,EAAIA,EAAsB,EAAIJ,EAAkBnG,OAAS,EAE/EuG,EAAsBJ,EAAkBnG,OAAS,EAAIuG,EAAsB,EAAI,GAIrGJ,EAAkBU,GAAiBxF,QAIrC,OADAsF,SAASI,iBAAiB,UAAWf,GAAe,GAC7C,KACLW,SAASK,oBAAoB,UAAWhB,GAAe,IAoEaiB,CAAUpB,EAASzE,cAAW1B,EAAW,CAACwF,IAChH,MAAMgC,WACJA,GACE3I,OAAOT,EAAgC,EAAvCS,CAA0C2G,EAAQK,GAEtDhH,OAAOd,EAAyB,EAAhCc,CAAmC,IAC1B,KACD2G,GACFgC,KAGH,IACH3I,OAAOyG,EAAuC,EAA9CzG,CAAiD,EAAE4I,MACjDR,SAASS,KAAKC,UAAUC,OAAO,kBAAmBpC,IAE9CA,IAAWA,QAAyBxF,IAAfyH,IACvB5I,OAAOuG,EAA4D,EAAnEvG,CAzCqB,KA4ChB,KACLoI,SAASS,KAAKC,UAAUE,OAAO,qBAEhC,CAACrC,IACJ,MAAMnE,EAAOxC,OAAOR,EAAyB,EAAhCQ,GAEb,IAAKoH,EACH,OA2BF,MAAM6B,EAAgBjJ,OAAOsG,EAAgC,EAAvCtG,CAA0C,QAASiB,EAAWoG,EAAsBP,GAAc,wBACxH,OAAoB5H,EAAuB,EAAE6B,cAAc2F,EAAwB,EAAG,KAAmBxH,EAAuB,EAAE6B,cAAc,MAAO,CACrJ2C,IAAK4D,EACLrG,UAAWgI,EACXzF,UAAW,EACXD,KAAM,UACQrE,EAAuB,EAAE6B,cAAc,MAAO,CAC5DE,UAAW,mBACG/B,EAAuB,EAAE6B,cAAc,MAAO,CAC5DE,UAAW,iBACXqC,QAAS0D,IACM9H,EAAuB,EAAE6B,cAAc,MAAO,CAC7DE,UAAW,gBAnCP2F,IAICnD,EAIevE,EAAuB,EAAE6B,cAAc,MAAO,CAChEE,UAAW,gBACV4F,GAA+B3H,EAAuB,EAAE6B,cAAciE,EAAwB,EAAG,CAClGkE,OAAO,EACPC,MAAO,cACPjI,KAAM,UACNkI,UAAW5G,EAAK,SAChBc,QAAS0D,GACK9H,EAAuB,EAAE6B,cAAc,IAAK,CAC1DE,UAAW,gBACK/B,EAAuB,EAAE6B,cAAc,MAAO,CAC9DE,UAAW,eACVwC,SAhBH,GAgC8BvE,EAAuB,EAAE6B,cAAc,MAAO,CAC5EE,UAAW,+BACV8F,SAOCsC,IACA,SAAU3K,EAAQC,EAAqBC,GAE7C,aACqB,IAAI0K,EAAgD1K,EAAoB,GACpE2K,EAAgD3K,EAAoB,IACpE4K,EAAoD5K,EAAoB,GACxE6K,EAA6D7K,EAAoB,IACjF8K,EAAwD9K,EAAoB,KAMrG,IAAI+K,EACAC,EAIJC,eAAeC,IAMb,OALKH,IACHA,EAAgB/K,EAAoBoE,EAAiB,GAAGnC,KAAKjC,EAAoBmL,KAAK,KAAM,MAC5FH,SAAiBD,GAAeK,SAG3BL,EAGTM,WAAWH,EAXe,KA2JGnL,EAAuB,EAAKqB,OAAOsJ,EAA4D,EAApE,CA9IhC,EACtBrI,YACAD,KACAI,gBACAC,OACAE,cACAK,QACAC,SACAX,OACAgJ,UACAC,gBACA7I,aAEA,MAAO8I,EAAWC,GAAgBrK,OAAOsJ,EAAgE,EAAvEtJ,GAE5BsK,EAAYtK,OAAOsJ,EAA8D,EAArEtJ,CAAwE,MACpFuK,EAAavK,OAAOsJ,EAA8D,EAArEtJ,EAAwE,GACrFwK,EAAWxK,OAAOsJ,EAA8D,EAArEtJ,EAAwE,GACnFyK,EAAUzK,OAAOsJ,EAA8D,EAArEtJ,GAChByK,EAAQ5H,QAAUxB,EAClB,MAAMqJ,EAAiB1K,OAAOsJ,EAA8D,EAArEtJ,GACvB0K,EAAe7H,QAAUtB,EACzBvB,OAAOsJ,EAAiE,EAAxEtJ,CAA2E,KACzE,GAAIoK,IAAchJ,EAChB,OAGF,MAAMuJ,EAAO,KACX,IAAKL,EAAUzH,QACb,OAGF,MAAM+H,EAAe,IAAIhB,EAAQ5I,EAAIsJ,EAAUzH,QAASzB,EAAe,CACrES,SACAX,OACAgJ,UACAC,iBACC7I,GAECM,GACFgJ,EAAaC,SAASjJ,GAGxByI,EAAaO,IAGXhB,EACFe,IAEAb,IAAejJ,KAAK,KAClBb,OAAOuJ,EAA+D,EAAtEvJ,CAAyE,KACnEsK,EAAUzH,SACZ8H,SAKP,CAACP,EAAWhJ,EAAeJ,EAAImJ,EAAetI,EAAQP,EAAQ4I,EAAShJ,EAAMU,IAChF5B,OAAOsJ,EAAiE,EAAxEtJ,CAA2E,IAClE,KACDoK,GACFA,EAAUU,WAGb,CAACV,IACJ,MAAMW,EAAgB/K,OAAOsJ,EAAmE,EAA1EtJ,CAA6E,CAACgL,GAAgB,KAC9GZ,IAAcK,EAAQ5H,SAAW6H,EAAe7H,WAC9C6H,EAAe7H,QACjBuH,EAAU7I,YAAYmJ,EAAe7H,SAC5BmI,EACTZ,EAAUa,YAAY,GAEtBb,EAAU/I,SAGb,CAAC+I,IACEc,EAAiBlL,OAAOsJ,EAAmE,EAA1EtJ,CAA6E,KAC7FoK,GAILA,EAAUe,SACT,CAACf,IACEgB,EAAkBpL,OAAOsJ,EAAmE,EAA1EtJ,CAA6E,KACnGwK,EAAS3H,SAAU,EAEduH,IAIAG,EAAW1H,UACd0H,EAAW1H,QAAUuH,EAAUiB,aAGjCH,MACC,CAACd,EAAWc,IACTI,EAAoBtL,OAAOsJ,EAAmE,EAA1EtJ,CAA6E,KACjGuK,EAAW1H,SACbkI,IAGFR,EAAW1H,SAAU,EACrB2H,EAAS3H,SAAU,GAClB,CAACkI,IACEQ,EAAyBvL,OAAOsJ,EAAmE,EAA1EtJ,CAA6E,KAC1GA,OAAOuJ,EAA+D,EAAtEvJ,CAAyEsL,IACxE,CAACA,IACJtL,OAAOsJ,EAAiE,EAAxEtJ,CAA2E,KACpEoK,IAID/I,GAAQE,EACNiJ,EAAS3H,QACX0H,EAAW1H,SAAU,EAErBkI,EAAclJ,GAIZ2I,EAAS3H,QACX0H,EAAW1H,SAAU,EAErBqI,MAGH,CAACd,EAAW/I,EAAME,EAAaM,EAAQkJ,EAAeG,IACzDlL,OAAOyJ,EAA4E,EAAnFzJ,CAAsFoL,EAAiBE,GAIvGtL,OAAO0J,EAAuE,EAA9E1J,CAAiFoL,EAAiBG,GAClG,MAAMtC,EAAgBjJ,OAAOwJ,EAAmE,EAA1ExJ,CAA6E,kBAAmBiB,GAChHuK,EAAQtK,EAAO,UAAUA,gBAAmBA,YAAYC,EAC9D,OAAoBmI,EAA+D,EAAEvI,cAAc,MAAO,CACxG2C,IAAK4G,EACLrJ,UAAWgI,EAEXuC,MAAOA,OAQLC,IACA,SAAU/M,EAAQC,EAAqBC,GAE7C,aAC+BA,EAAoBE,EAAEH,EAAqB,KAAK,WAAa,OAAO+M,KAC9E,IAAIpC,EAAgD1K,EAAoB,GAE7F,SAAS8M,EAAkBC,EAAQC,GACjC5L,OAAOsJ,EAAiE,EAAxEtJ,CAA2E,KACrE2L,IAAWvD,SAASyD,YACtBF,IAGEA,GACFpN,OAAOiK,iBAAiB,OAAQmD,GAG9BC,GACFrN,OAAOiK,iBAAiB,QAASoD,GAG5B,KACDA,GACFrN,OAAOkK,oBAAoB,QAASmD,GAGlCD,GACFpN,OAAOkK,oBAAoB,OAAQkD,KAGtC,CAACA,EAAQC,MAKRE,IACA,SAAUpN,EAAQC,EAAqBC,GAE7C,aACqB,IAAI0K,EAAgD1K,EAAoB,GACpEmN,EAAoDnN,EAAoB,IAgCpED,EAAuB,EA5BrC,EACbqN,cACA/K,YACA8F,eAEA,MAAMkF,EAAajM,OAAOsJ,EAA8D,EAArEtJ,CAAwEoI,SAASrH,cAAc,QAoBlH,OAnBAf,OAAOsJ,EAAuE,EAA9EtJ,CAAiF,KAC/E,MAAMsK,EAAYlC,SAAS8D,cAAcF,GAAe,YAExD,IAAK1B,EACH,OAGF,MAAM9C,EAAUyE,EAAWpJ,QAO3B,OALI5B,GACFuG,EAAQsB,UAAUqD,IAAIlL,GAGxBqJ,EAAU8B,YAAY5E,GACf,KACLuE,EAAmE,EAAEM,YAAOlL,EAAWqG,GACvF8C,EAAUgC,YAAY9E,KAEvB,CAACvG,EAAW+K,IACRD,EAAmE,EAAEM,OAAOtF,EAAUkF,EAAWpJ,WAOpG0J,IACA,SAAU7N,EAAQC,EAAqBC,GAE7C,aAGAA,EAAoBE,EAAEH,EAAqB,KAAK,WAAa,OAAqB6N,KAKlF,IAAIC,EAAQ7N,EAAoB,GAG5B8N,EAAc9N,EAAoB,IAiCtC,MAAM+N,EAA0B,CAC9BC,WA/B2DhO,EAAoBiO,EAAI,gEAgCnFC,eA9B+DlO,EAAoBiO,EAAI,oEA+BvFE,YA7B4DnO,EAAoBiO,EAAI,iEA8BpFG,WA5B2DpO,EAAoBiO,EAAI,gEA6BnFI,WA3B6CrO,EAAoBiO,EAAI,kDA4BrEK,WA1B6CtO,EAAoBiO,EAAI,kDA2BrEM,iBAzBwDvO,EAAoBiO,EAAI,8DA2BlF,SAASL,EAAiBY,GACxB,MAAMC,EAAOV,EAAwBS,GAAMhK,QAAQ7E,OAAO+O,SAASC,OAAQ,IAC3E,OAAOb,EAA2B,EAAE,OAAOW,EAAQZ,EAAsB,eAAEe,UAKvEC,IACA,SAAU/O,EAAQC,EAAqBC,GAE7C,aAGA,IAAIM,EAAQN,EAAoB,GAG5B0H,EAAiB1H,EAAoB,GAGrCe,EAASf,EAAoB,GAG7B8O,EAAQ9O,EAAoB,IAG5BY,EAAUZ,EAAoB,IAG9BoG,EAASpG,EAAoB,IAG7B+O,EAAQ/O,EAAoB,KAG5Bc,EAAUd,EAAoB,IAGlBA,EAAoB,KAYpC,MAAMgP,EAAuB,CAC3B1H,KAAM,OACNgE,QAAS,GACT2D,OAAQ,OACRC,QAAQ,GAEV,IAAIC,EACAC,EAWAC,EAuFyB,IAAIC,EAAgBlO,OAAOd,EAAoB,EAA5B,CAjDpB,EAC1B8G,OACAC,WACAe,cAEA,MAAOmH,EAAgBC,GAAqBpO,OAAOd,EAAwB,EAA/Bc,EAAkC,GAC9EA,OAAOd,EAAyB,EAAhCc,CAAmC,KAC5BgG,IAIAmI,EA/CTtE,eAA2BwE,GACzB,IACE,MAAMC,EAAgBlG,SAASmG,eAAe,eAE9C,IAAKD,EACH,OAGF,MAAME,YACJA,EAAWC,aACXA,GACEH,EACJL,EAAU,IAAIF,EAAQO,EAAe,CACnCI,YAAY,EACZC,SAAU,CACRC,MAAOJ,EACPK,OAAQJ,GAEVK,SAAU,CACRF,MAAOJ,EAAc,GACrBK,OAAQJ,EAAe,GACvBvI,KAAM,YAGV,MAAM6I,QAAgB/O,OAAO0N,EAA6B,EAApC1N,CAAuCqO,SACvDJ,EAAQlE,KAAK,CACjBiF,IAAKD,IAEP,MAAOE,GACHtP,EAAsB,GAExBuP,QAAQrL,MAAMoL,IAqBhBE,CAAYnJ,GA/DhB6D,iBAME,OALKmE,IACHA,EAAiBoB,QAAQC,IAAkB,CAACzQ,EAAoBoE,EAAE,GAAIpE,EAAoBoE,EAAE,KAAKnC,KAAKjC,EAAoBmL,KAAK,KAAM,MACrIgE,SAAiBC,GAAgBhE,SAG5BgE,EAqDHsB,GAAgBzO,KAAK,IAAMuN,GAAkB,MAK9C,CAACpI,EAAMmI,IACV,MAAM3L,EAAOxC,OAAOR,EAAyB,EAAhCQ,GAYb,OAAoBd,EAAuB,EAAE6B,cAAc4M,EAAuB,EAAG,CACnFhH,OAAQ4I,QAAQvJ,GAChBgB,QAASA,EACTvD,MAAO,qBACPxC,UAAW,YACX4F,gBAAgB,GACfsH,EAA8BjP,EAAuB,EAAE6B,cAAc,MAAO,CAC7EC,GAAI,gBACY9B,EAAuB,EAAE6B,cAAcrB,EAAyB,EAAG,MAAoBR,EAAuB,EAAE6B,cAAciE,EAAwB,EAAG,CACzK/D,UAAW,iBACXiI,OAAO,EACPC,MAAO,UACP7F,QAtBFuG,iBACE,IAAKoE,EACH,OAGF,MAAMuB,QAAevB,EAAQuB,OAAO5B,GAC9B6B,EAA+B,iBAAXD,EAAsBA,EAASxP,OAAO0N,EAA0B,EAAjC1N,CAAoCwP,EAAQ,cACrGvJ,EAASwJ,IAgBTrG,UAAW5G,EAAK,cACFtD,EAAuB,EAAE6B,cAAc,IAAK,CAC1DE,UAAW,mBAMMrC,EAAoB,KAsEYD,EAAuB,EAAKqB,OAAOd,EAAoB,EAA5B,CA9D1C,EACpCuE,QAAQ,8BACRiM,WACAC,uBACA1J,eAEA,MAAO2J,EAAcC,GAAmB7P,OAAOd,EAAwB,EAA/Bc,IACjC8P,EAAgBC,GAAqB/P,OAAOd,EAAwB,EAA/Bc,CAAkC2P,GAC9E3P,OAAOd,EAAyB,EAAhCc,CAAmC,KACjC+P,EAAkBJ,IACjB,CAACA,IA4BJ,MAAMK,EAAiBhQ,OAAOsG,EAAgC,EAAvCtG,CAA0C8P,GAAkB,SAAUJ,GAAY,YACzG,OAAoBxQ,EAAuB,EAAE6B,cAAc,MAAO,CAChEE,UAAW,kBACG/B,EAAuB,EAAE6B,cAAc,QAAS,CAC9DE,UAAW+O,EACXzM,KAAM,SACNC,SAAU,EACVC,MAAOA,GACOvE,EAAuB,EAAE6B,cAAc,QAAS,CAC9DmF,KAAM,OACND,SApCF,SAA0BH,GACxB,MAAM5C,EAAS4C,EAAM5C,OAEhBA,GAAWA,EAAOwK,OAAUxK,EAAOwK,MAAM,KAI9CmC,EAAgB3M,EAAOwK,MAAM,IAC7BxK,EAAOC,MAAQ,KA6Bf8M,OAAQ,0BACO/Q,EAAuB,EAAE6B,cAAc,IAAK,CAC3DE,UAAW,oBACT6O,GAA+B5Q,EAAuB,EAAE6B,cAAc,MAAO,CAC/EmP,IAAKJ,EACLK,IAAK,YACWjR,EAAuB,EAAE6B,cAAcmN,EAAc,CACrElI,KAAM4J,EACN5I,QAvBF,WACE6I,OAAgB1O,IAuBhB8E,SAnCF,SAA0BwJ,GACxBI,OAAgB1O,GAChB8E,EAASwJ,GAELK,GACFM,IAAIC,gBAAgBP,GAGtBC,EAAkBK,IAAIE,gBAAgBb,WAmCpCc,IACA,SAAU7R,EAAQ8R,EAAS5R,KAM3B6R,IACA,SAAU/R,EAAQC,EAAqBC,GAE7C,aACqB,IAAI0K,EAAgD1K,EAAoB,GACpE8R,EAAuC9R,EAAoB,GAC3D+R,EAAiD/R,EAAoB,GACrEgS,EAAuDhS,EAAoB,KAC3EiS,EAAgDjS,EAAoB,KAChBA,EAAoB,KAQjG,MACMkS,EAAqB,CAAC,EAAG,IACzBC,EAAsB,CAAC,EAAG,IAC1BC,EAAoB,CAAC,GAAI,GACzBlR,EAAe6Q,EAAgF,EAAID,EAAwE,GAAIA,EAAiE,GA8CzN/R,EAAuB,EAAKqB,OAAOsJ,EAA4D,EAApE,CA5CjC,EACrB5E,oBACArE,YAEA,MAAO4Q,EAAiBC,GAAsBlR,OAAOsJ,EAAgE,EAAvEtJ,IACvCmR,EAAgBC,GAAqBpR,OAAOsJ,EAAgE,EAAvEtJ,IACrCU,EAAqBC,GAA0BX,OAAOsJ,EAAgE,EAAvEtJ,EAA0E,IACzHqR,EAAaC,GAAkBtR,OAAOsJ,EAAgE,EAAvEtJ,EAA0E,GAChHA,OAAOsJ,EAAiE,EAAxEtJ,CAA2E,KACpEiR,EAGHhH,WAAW,IAAMqH,GAAe,GAlBP,KAgBzBtR,OAAO4Q,EAAsE,EAA7E5Q,CAAgF,eAAea,KAAKqQ,IAIrG,CAACD,IACJjR,OAAOsJ,EAAiE,EAAxEtJ,CAA2E,KACpEmR,GACHnR,OAAO4Q,EAAsE,EAA7E5Q,CAAgF,cAAca,KAAKuQ,IAEpG,CAACD,IACJ,MAAMrQ,EAAwBd,OAAOsJ,EAAmE,EAA1EtJ,CAA6E,IAAMW,GAAuB,GAAO,IAC/I,OAAoB2I,EAA+D,EAAEvI,cAAc,MAAO,CACxGC,GAAI,SACJC,UAAWZ,EAAQ,MAAQ,KACzBK,GAAoC4I,EAA+D,EAAEvI,cAAc,MAAO,CAC5HE,UAAW,mBACTgQ,GAAgC3H,EAA+D,EAAEvI,cAAc8P,EAA+D,EAAG,CACnL7P,GAAI,cACJE,KAAMb,EAAQqQ,EAAmE,GAAI5Q,EACrFmB,UAAWoQ,EAAc,SAAW,QACpCjQ,cAAe6P,EACf1P,YAAauP,EACbjP,QAAQ,EACRP,OAAQR,IACNqQ,GAA+B7H,EAA+D,EAAEvI,cAAc8P,EAA+D,EAAG,CAClL7P,GAAI,aACJE,KAAMb,EAAQqQ,EAAmE,GAAI5Q,EACrFmB,UAAWoQ,EAAc,QAAU,SACnCjQ,cAAe+P,EACf5P,YAAamD,EAAoBqM,EAAsBC,EACvDnP,QAAQ,QAQN0P,IACA,SAAU7S,EAAQC,EAAqBC,GAE7C,aACqB,IAAI0K,EAAgD1K,EAAoB,GACpE8R,EAAuC9R,EAAoB,GAC3D+R,EAAiD/R,EAAoB,GACrE4S,EAAoD5S,EAAoB,GACxE6S,EAA8C7S,EAAoB,IAClE8S,EAA0C9S,EAAoB,IAOvF,MAAM+S,EAAyBhB,EAAgF,EAAI,IAAM,IAkG5FhS,EAAuB,EAAKqB,OAAOsJ,EAA4D,EAApE,CAhGnC,EACnBzE,aAAY,EACZH,oBACAb,QACAe,OACAgN,cAAc,WACdC,cAAc,OACdlN,aACAG,6BACAgN,gBACA/M,eAGA,MAAMtC,EAAWzC,OAAOsJ,EAA8D,EAArEtJ,CAAwE,MACnFwC,EAAOxC,OAAOyR,EAA6D,EAApEzR,IACNyE,EAAUsN,GAAe/R,OAAOsJ,EAAgE,EAAvEtJ,CAA0E,KACnGgS,EAAWC,GAAgBjS,OAAOsJ,EAAgE,EAAvEtJ,EAA0E,GAiD5G,OAhDAA,OAAOsJ,EAAiE,EAAxEtJ,CAA2E,KACpE2Q,EAAqE,GACxE1G,WAAW,KACTxH,EAASI,QAAQC,SAChB6O,IAEJ,IACH3R,OAAOsJ,EAAiE,EAAxEtJ,CAA2E,KACrE6D,GACFqO,sBAAsB,KACpBzP,EAASI,QAAQC,QACjBL,EAASI,QAAQsP,YAGpB,CAACtO,IAkCgByF,EAA+D,EAAEvI,cAAc,OAAQ,CACzG6E,OAAQ,GACRb,SAdF,SAAsBe,GACpBA,EAAMC,iBAEFlB,GAIAmN,GACFjN,EAASN,IAOXX,aAAc,OACAwF,EAA+D,EAAEvI,cAAc,MAAO,CACpGE,UAAWjB,OAAOwR,EAAmE,EAA1ExR,CAA6E,6BAA8ByE,GAAY,UAAWZ,GAAS,SACtJuO,IAAK5P,EAAK6P,MAAQ,WAAQlR,GACZmI,EAA+D,EAAEvI,cAAc,QAAS,CACtG2C,IAAKjB,EACLxB,UAAW,eACXiF,KAAMxB,EAAoB,OAAS,WACnC1D,GAAI,mBACJmC,MAAOsB,GAAY,GACnBX,aAAc,mBACdmC,SA9CF,SAA0BjD,GACpBa,GACFc,IAGF,MAAMzB,OACJA,GACEF,EACJ+O,EAAY7O,EAAOC,OACnB8O,EAAa/O,EAAOC,MAAM1B,QAAUiP,EAAmE,IAEnGoB,GACFA,EAAc5O,EAAOC,QAmCvBiP,IAAK,SACU9I,EAA+D,EAAEvI,cAAc,QAAS,KAAM8C,GAASe,GAAQgN,GAA2BtI,EAA+D,EAAEvI,cAAc,MAAO,CAC/OE,UAAW,kBACXqC,QAlCF,WACEwB,GAA4BJ,IAkC5BnB,KAAM,SACNC,SAAU,EACVC,MAAO,8BACO6F,EAA+D,EAAEvI,cAAc,IAAK,CAClGE,UAAWyD,EAAoB,WAAa,sBACxCsN,GAA0B1I,EAA+D,EAAEvI,cAAc2Q,EAAyD,EAAG,CACzKxL,KAAM,SACNC,QAAQ,EACRtB,UAAWA,GACVgN,OAOCS,IACA,SAAU5T,EAAQ8R,EAAS5R,KAM3B2T,IACA,SAAU7T,EAAQ8R,EAAS5R,KAM3B4T,IACA,SAAU9T,EAAQ8R,EAAS5R","file":"5.3751c0b85336f64c5d01.js","sourceRoot":""} \ No newline at end of file diff --git a/dist/5.3751c0b85336f64c5d01.css b/dist/5.64e3757d90b4958d12d9.css similarity index 99% rename from dist/5.3751c0b85336f64c5d01.css rename to dist/5.64e3757d90b4958d12d9.css index 762f70b6b..f5b37752d 100644 --- a/dist/5.3751c0b85336f64c5d01.css +++ b/dist/5.64e3757d90b4958d12d9.css @@ -7,4 +7,4 @@ .AvatarEditable label{margin-left:auto;margin-right:auto;width:7.5rem;height:7.5rem;margin-bottom:2rem;display:flex !important;align-items:center;justify-content:center;background-color:var(--color-primary);border-radius:50%;color:white;font-size:3rem;cursor:pointer;position:relative;overflow:hidden;outline:none !important}.AvatarEditable label input{display:none}.AvatarEditable label img{position:absolute;top:0;left:0;width:100%;height:100%}.AvatarEditable label i{transform:scale(1);transition:transform .15s linear;z-index:var(--z-register-add-avatar)}.Transition>div:not(.active) .AvatarEditable label input,.Transition>div:not(.active) .AvatarEditable label i,.Transition>div:not(.active) .AvatarEditable label::after,body.animating-right-column .AvatarEditable label input,body.animating-right-column .AvatarEditable label i,body.animating-right-column .AvatarEditable label::after{display:none !important}.Transition>div:not(.active) .AvatarEditable label img,body.animating-right-column .AvatarEditable label img{position:static !important}.AvatarEditable label:hover i{transform:scale(1.2)}.AvatarEditable label.filled{background-color:var(--color-background)}.AvatarEditable label.filled::after{content:'';display:block;position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4)}.AvatarEditable label.disabled{pointer-events:none}.AvatarEditable label.disabled i{display:none}.AvatarEditable label.disabled::after{display:none} -/*# sourceMappingURL=5.3751c0b85336f64c5d01.css.map*/ \ No newline at end of file +/*# sourceMappingURL=5.64e3757d90b4958d12d9.css.map*/ \ No newline at end of file diff --git a/dist/5.3751c0b85336f64c5d01.css.map b/dist/5.64e3757d90b4958d12d9.css.map similarity index 99% rename from dist/5.3751c0b85336f64c5d01.css.map rename to dist/5.64e3757d90b4958d12d9.css.map index 0a49f9144..d90f9eee7 100644 --- a/dist/5.3751c0b85336f64c5d01.css.map +++ b/dist/5.64e3757d90b4958d12d9.css.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/components/common/PasswordMonkey.scss","webpack:///./src/components/ui/Modal.scss","webpack:///./src/components/ui/CropModal.scss","webpack:///./src/components/ui/AvatarEditable.scss"],"names":[],"mappings":"AAAA,QAAQ,kBAAkB,cAAc,iBAAiB,kBAAkB,aAAa,cAAc,sBAAsB,kDAAkD,QAAQ,YAAY,aAAa,sBAAsB,YAAY,YAAY,aAAa,yBAAyB,kBAAkB,OAAO,MAAM,WAAW,YAAY,gCAAgC,aAAa,wBAAwB,WAAW,YAAY,qBAAqB;;ACA1c,OAAO,kBAAkB,uBAAuB,4IAA4I,gBAAgB,gCAAgC,gBAAgB,4BAA4B,gBAAgB,4BAA4B,gBAAgB,wBAAwB,eAAe,MAAM,SAAS,OAAO,QAAQ,aAAa,uBAAuB,mBAAmB,uBAAuB,eAAe,MAAM,QAAQ,SAAS,OAAO,WAAW,kCAAkC,4CAA4C,6BAA6B,qBAAqB,kBAAkB,oBAAoB,sBAAsB,WAAW,gBAAgB,kBAAkB,iBAAiB,yCAAyC,iEAAiE,2CAA2C,mCAAmC,gDAAgD,4CAA4C,gBAAgB,0BAA0B,0BAA0B,qBAAqB,yCAAyC,0BAA0B,+BAA+B,6BAA6B,kCAAkC,oDAAoD,oBAAoB,aAAa,mBAAmB,cAAc,oBAAoB,kBAAkB,gBAAgB,cAAc,gBAAgB,uBAAuB,qCAAqC,mBAAmB,+BAA+B,4CAA4C,oDAAoD,mBAAmB,eAAe,WAAW,qBAAqB,iBAAiB,qBAAqB,sBAAsB,eAAe,sBAAsB,WAAW,YAAY,aAAa,gBAAgB,qDAAqD,sBAAsB,kEAAkE,uBAAuB,mBAAmB,uBAAuB,aAAa,qBAAqB,qEAAqE,iBAAiB,8BAA8B,WAAW,YAAY,iBAAiB,iBAAiB,gBAAgB;;ACAn0E,yBAAyB,wBAAwB,gBAAgB,yBAAyB,iBAAiB,kBAAkB,kDAAkD,gBAAgB,2BAA2B,kBAAkB,YAAY,WAAW,iDAAiD,wBAAwB,gBAAgB,cAAc,kBAAkB,gCAAgC,WAAW,cAAc,iBAAiB,qCAAqC,kBAAkB,MAAM,OAAO,kDAAkD,qCAAqC,YAAY,mDAAmD,kEAAkE,gCAAgC,qDAAqD,gCAAgC,8CAA8C,gCAAgC,yDAAyD,gCAAgC,eAAe,mBAAmB,8CAA8C,sCAAsC,+DAA+D,qBAAqB,qDAAqD,gCAAgC,eAAe,mBAAmB,2CAA2C,sCAAsC,2DAA2D,qBAAqB,8CAA8C,gCAAgC,eAAe,mBAAmB,0CAA0C,sCAAsC,oDAAoD;;ACAptD,sBAAsB,iBAAiB,kBAAkB,aAAa,cAAc,mBAAmB,wBAAwB,mBAAmB,uBAAuB,sCAAsC,kBAAkB,YAAY,eAAe,eAAe,kBAAkB,gBAAgB,wBAAwB,4BAA4B,aAAa,0BAA0B,kBAAkB,MAAM,OAAO,WAAW,YAAY,wBAAwB,mBAAmB,iCAAiC,qCAAqC,6UAA6U,wBAAwB,6GAA6G,2BAA2B,8BAA8B,qBAAqB,6BAA6B,yCAAyC,oCAAoC,WAAW,cAAc,kBAAkB,OAAO,MAAM,WAAW,YAAY,iCAAiC,+BAA+B,oBAAoB,iCAAiC,aAAa,sCAAsC","file":"5.3751c0b85336f64c5d01.css","sourcesContent":["#monkey{position:relative;display:block;margin-left:auto;margin-right:auto;width:7.5rem;height:7.5rem;margin-bottom:1.75rem}@media (min-width: 600px) and (min-height: 450px){#monkey{width:10rem;height:10rem;margin-bottom:2.5rem}}#monkey.big{width:10rem;height:10rem}#monkey .AnimatedSticker{position:absolute;left:0;top:0;width:100%;height:100%}#monkey .AnimatedSticker.hidden{display:none}#monkey .monkey-preview{width:100%;height:100%;background-size:100%;background:url(monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg) center}\n",".Modal{position:relative;z-index:var(--z-modal)}.Modal.delete .modal-dialog,.Modal.error .modal-dialog,.Modal.confirm .modal-dialog,.Modal.pin .modal-dialog,.Modal.unpin-all .modal-dialog{max-width:23rem}.Modal.error .modal-content>div{margin-top:1rem}.Modal.narrow .modal-dialog{max-width:20rem}.Modal.report .modal-dialog{max-width:15rem}.Modal .modal-container{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;justify-content:center;align-items:center}.Modal .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:-1;background-color:rgba(0,0,0,0.25)}.Modal.transparent-backdrop .modal-backdrop{background-color:transparent}.Modal .modal-dialog{position:relative;display:inline-flex;flex-direction:column;width:100%;max-width:35rem;min-width:17.5rem;margin:2rem auto;background-color:var(--color-background);box-shadow:0 0.25rem 0.5rem 0.125rem var(--color-default-shadow);border-radius:var(--border-radius-default);transform:translate3d(0, -1rem, 0);transition:transform .2s ease, opacity .2s ease}body.animation-level-0 .Modal .modal-dialog{transition:none;transform:none !important}@media (max-width: 450px){.Modal .modal-dialog{max-width:calc(100vw - 3rem) !important}}.Modal.open .modal-dialog{transform:translate3d(0, 0, 0)}.Modal.closing .modal-dialog{transform:translate3d(0, 1rem, 0)}.Modal .modal-header,.Modal .modal-header-condensed{padding:1rem 1rem 0;display:flex;align-items:center;flex-shrink:0}.Modal .modal-title{font-size:1.25rem;font-weight:500;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis}.Modal .modal-title:not(:only-child){margin:0 1.3125rem}.Modal .modal-header-condensed{padding:.5rem 1.25rem 0 .9375rem !important}.Modal .modal-header-condensed .modal-action-button{font-size:0.875rem;height:2.25rem;width:auto;line-height:1.625rem;margin-left:auto;padding-left:1.25rem;padding-right:1.25rem;min-width:5rem}.Modal .modal-content{width:100%;flex-grow:1;padding:1rem;overflow-y:auto}.Modal .modal-content b,.Modal .modal-content strong{word-break:break-word}.Modal .modal-title,.Modal .modal-content,.Modal .modal-content>p{unicode-bidi:plaintext;text-align:initial}.Modal .dialog-buttons{display:flex;align-items:flex-end}.Modal .dialog-buttons .confirm-dialog-button+.confirm-dialog-button{margin-left:1rem}.Modal .confirm-dialog-button{width:auto;height:auto;margin-left:auto;text-align:right;font-weight:500;white-space:pre-wrap}\n",".CropModal .modal-dialog{width:calc(100% - 2rem);max-width:35rem;height:calc(100% - 1rem);max-height:35rem;position:relative}.CropModal .modal-content,.CropModal #avatar-crop{overflow:hidden}.CropModal .confirm-button{position:absolute;bottom:1rem;right:1rem;box-shadow:0 1px 2px var(--color-default-shadow)}.CropModal #avatar-crop{max-width:25rem;margin:0 auto;position:relative}.CropModal #avatar-crop::before{content:'';display:block;padding-top:100%}.CropModal #avatar-crop .cr-boundary{position:absolute;top:0;left:0;border-radius:var(--border-radius-messages-small)}.CropModal #avatar-crop .cr-viewport{border:none;box-shadow:0 0 2000px 2000px rgba(255,255,255,0.5)}.CropModal #avatar-crop .cr-slider::-webkit-slider-runnable-track{background:var(--color-borders)}.CropModal #avatar-crop .cr-slider::-moz-range-track{background:var(--color-borders)}.CropModal #avatar-crop .cr-slider::-ms-track{background:var(--color-borders)}.CropModal #avatar-crop .cr-slider::-webkit-slider-thumb{background:var(--color-primary);cursor:pointer;transform:scale(1);-webkit-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.CropModal #avatar-crop .cr-slider::-webkit-slider-thumb:hover{transform:scale(1.2)}.CropModal #avatar-crop .cr-slider::-moz-range-thumb{background:var(--color-primary);cursor:pointer;transform:scale(1);-moz-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.CropModal #avatar-crop .cr-slider::-moz-range-thumb:hover{transform:scale(1.2)}.CropModal #avatar-crop .cr-slider::-ms-thumb{background:var(--color-primary);cursor:pointer;transform:scale(1);-ms-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.CropModal #avatar-crop .cr-slider::-ms-thumb:hover{transform:scale(1.2)}\n",".AvatarEditable label{margin-left:auto;margin-right:auto;width:7.5rem;height:7.5rem;margin-bottom:2rem;display:flex !important;align-items:center;justify-content:center;background-color:var(--color-primary);border-radius:50%;color:white;font-size:3rem;cursor:pointer;position:relative;overflow:hidden;outline:none !important}.AvatarEditable label input{display:none}.AvatarEditable label img{position:absolute;top:0;left:0;width:100%;height:100%}.AvatarEditable label i{transform:scale(1);transition:transform .15s linear;z-index:var(--z-register-add-avatar)}.Transition>div:not(.active) .AvatarEditable label input,.Transition>div:not(.active) .AvatarEditable label i,.Transition>div:not(.active) .AvatarEditable label::after,body.animating-right-column .AvatarEditable label input,body.animating-right-column .AvatarEditable label i,body.animating-right-column .AvatarEditable label::after{display:none !important}.Transition>div:not(.active) .AvatarEditable label img,body.animating-right-column .AvatarEditable label img{position:static !important}.AvatarEditable label:hover i{transform:scale(1.2)}.AvatarEditable label.filled{background-color:var(--color-background)}.AvatarEditable label.filled::after{content:'';display:block;position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4)}.AvatarEditable label.disabled{pointer-events:none}.AvatarEditable label.disabled i{display:none}.AvatarEditable label.disabled::after{display:none}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/components/common/PasswordMonkey.scss","webpack:///./src/components/ui/Modal.scss","webpack:///./src/components/ui/CropModal.scss","webpack:///./src/components/ui/AvatarEditable.scss"],"names":[],"mappings":"AAAA,QAAQ,kBAAkB,cAAc,iBAAiB,kBAAkB,aAAa,cAAc,sBAAsB,kDAAkD,QAAQ,YAAY,aAAa,sBAAsB,YAAY,YAAY,aAAa,yBAAyB,kBAAkB,OAAO,MAAM,WAAW,YAAY,gCAAgC,aAAa,wBAAwB,WAAW,YAAY,qBAAqB;;ACA1c,OAAO,kBAAkB,uBAAuB,4IAA4I,gBAAgB,gCAAgC,gBAAgB,4BAA4B,gBAAgB,4BAA4B,gBAAgB,wBAAwB,eAAe,MAAM,SAAS,OAAO,QAAQ,aAAa,uBAAuB,mBAAmB,uBAAuB,eAAe,MAAM,QAAQ,SAAS,OAAO,WAAW,kCAAkC,4CAA4C,6BAA6B,qBAAqB,kBAAkB,oBAAoB,sBAAsB,WAAW,gBAAgB,kBAAkB,iBAAiB,yCAAyC,iEAAiE,2CAA2C,mCAAmC,gDAAgD,4CAA4C,gBAAgB,0BAA0B,0BAA0B,qBAAqB,yCAAyC,0BAA0B,+BAA+B,6BAA6B,kCAAkC,oDAAoD,oBAAoB,aAAa,mBAAmB,cAAc,oBAAoB,kBAAkB,gBAAgB,cAAc,gBAAgB,uBAAuB,qCAAqC,mBAAmB,+BAA+B,4CAA4C,oDAAoD,mBAAmB,eAAe,WAAW,qBAAqB,iBAAiB,qBAAqB,sBAAsB,eAAe,sBAAsB,WAAW,YAAY,aAAa,gBAAgB,qDAAqD,sBAAsB,kEAAkE,uBAAuB,mBAAmB,uBAAuB,aAAa,qBAAqB,qEAAqE,iBAAiB,8BAA8B,WAAW,YAAY,iBAAiB,iBAAiB,gBAAgB;;ACAn0E,yBAAyB,wBAAwB,gBAAgB,yBAAyB,iBAAiB,kBAAkB,kDAAkD,gBAAgB,2BAA2B,kBAAkB,YAAY,WAAW,iDAAiD,wBAAwB,gBAAgB,cAAc,kBAAkB,gCAAgC,WAAW,cAAc,iBAAiB,qCAAqC,kBAAkB,MAAM,OAAO,kDAAkD,qCAAqC,YAAY,mDAAmD,kEAAkE,gCAAgC,qDAAqD,gCAAgC,8CAA8C,gCAAgC,yDAAyD,gCAAgC,eAAe,mBAAmB,8CAA8C,sCAAsC,+DAA+D,qBAAqB,qDAAqD,gCAAgC,eAAe,mBAAmB,2CAA2C,sCAAsC,2DAA2D,qBAAqB,8CAA8C,gCAAgC,eAAe,mBAAmB,0CAA0C,sCAAsC,oDAAoD;;ACAptD,sBAAsB,iBAAiB,kBAAkB,aAAa,cAAc,mBAAmB,wBAAwB,mBAAmB,uBAAuB,sCAAsC,kBAAkB,YAAY,eAAe,eAAe,kBAAkB,gBAAgB,wBAAwB,4BAA4B,aAAa,0BAA0B,kBAAkB,MAAM,OAAO,WAAW,YAAY,wBAAwB,mBAAmB,iCAAiC,qCAAqC,6UAA6U,wBAAwB,6GAA6G,2BAA2B,8BAA8B,qBAAqB,6BAA6B,yCAAyC,oCAAoC,WAAW,cAAc,kBAAkB,OAAO,MAAM,WAAW,YAAY,iCAAiC,+BAA+B,oBAAoB,iCAAiC,aAAa,sCAAsC","file":"5.64e3757d90b4958d12d9.css","sourcesContent":["#monkey{position:relative;display:block;margin-left:auto;margin-right:auto;width:7.5rem;height:7.5rem;margin-bottom:1.75rem}@media (min-width: 600px) and (min-height: 450px){#monkey{width:10rem;height:10rem;margin-bottom:2.5rem}}#monkey.big{width:10rem;height:10rem}#monkey .AnimatedSticker{position:absolute;left:0;top:0;width:100%;height:100%}#monkey .AnimatedSticker.hidden{display:none}#monkey .monkey-preview{width:100%;height:100%;background-size:100%;background:url(monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg) center}\n",".Modal{position:relative;z-index:var(--z-modal)}.Modal.delete .modal-dialog,.Modal.error .modal-dialog,.Modal.confirm .modal-dialog,.Modal.pin .modal-dialog,.Modal.unpin-all .modal-dialog{max-width:23rem}.Modal.error .modal-content>div{margin-top:1rem}.Modal.narrow .modal-dialog{max-width:20rem}.Modal.report .modal-dialog{max-width:15rem}.Modal .modal-container{position:fixed;top:0;bottom:0;left:0;right:0;display:flex;justify-content:center;align-items:center}.Modal .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:-1;background-color:rgba(0,0,0,0.25)}.Modal.transparent-backdrop .modal-backdrop{background-color:transparent}.Modal .modal-dialog{position:relative;display:inline-flex;flex-direction:column;width:100%;max-width:35rem;min-width:17.5rem;margin:2rem auto;background-color:var(--color-background);box-shadow:0 0.25rem 0.5rem 0.125rem var(--color-default-shadow);border-radius:var(--border-radius-default);transform:translate3d(0, -1rem, 0);transition:transform .2s ease, opacity .2s ease}body.animation-level-0 .Modal .modal-dialog{transition:none;transform:none !important}@media (max-width: 450px){.Modal .modal-dialog{max-width:calc(100vw - 3rem) !important}}.Modal.open .modal-dialog{transform:translate3d(0, 0, 0)}.Modal.closing .modal-dialog{transform:translate3d(0, 1rem, 0)}.Modal .modal-header,.Modal .modal-header-condensed{padding:1rem 1rem 0;display:flex;align-items:center;flex-shrink:0}.Modal .modal-title{font-size:1.25rem;font-weight:500;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis}.Modal .modal-title:not(:only-child){margin:0 1.3125rem}.Modal .modal-header-condensed{padding:.5rem 1.25rem 0 .9375rem !important}.Modal .modal-header-condensed .modal-action-button{font-size:0.875rem;height:2.25rem;width:auto;line-height:1.625rem;margin-left:auto;padding-left:1.25rem;padding-right:1.25rem;min-width:5rem}.Modal .modal-content{width:100%;flex-grow:1;padding:1rem;overflow-y:auto}.Modal .modal-content b,.Modal .modal-content strong{word-break:break-word}.Modal .modal-title,.Modal .modal-content,.Modal .modal-content>p{unicode-bidi:plaintext;text-align:initial}.Modal .dialog-buttons{display:flex;align-items:flex-end}.Modal .dialog-buttons .confirm-dialog-button+.confirm-dialog-button{margin-left:1rem}.Modal .confirm-dialog-button{width:auto;height:auto;margin-left:auto;text-align:right;font-weight:500;white-space:pre-wrap}\n",".CropModal .modal-dialog{width:calc(100% - 2rem);max-width:35rem;height:calc(100% - 1rem);max-height:35rem;position:relative}.CropModal .modal-content,.CropModal #avatar-crop{overflow:hidden}.CropModal .confirm-button{position:absolute;bottom:1rem;right:1rem;box-shadow:0 1px 2px var(--color-default-shadow)}.CropModal #avatar-crop{max-width:25rem;margin:0 auto;position:relative}.CropModal #avatar-crop::before{content:'';display:block;padding-top:100%}.CropModal #avatar-crop .cr-boundary{position:absolute;top:0;left:0;border-radius:var(--border-radius-messages-small)}.CropModal #avatar-crop .cr-viewport{border:none;box-shadow:0 0 2000px 2000px rgba(255,255,255,0.5)}.CropModal #avatar-crop .cr-slider::-webkit-slider-runnable-track{background:var(--color-borders)}.CropModal #avatar-crop .cr-slider::-moz-range-track{background:var(--color-borders)}.CropModal #avatar-crop .cr-slider::-ms-track{background:var(--color-borders)}.CropModal #avatar-crop .cr-slider::-webkit-slider-thumb{background:var(--color-primary);cursor:pointer;transform:scale(1);-webkit-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.CropModal #avatar-crop .cr-slider::-webkit-slider-thumb:hover{transform:scale(1.2)}.CropModal #avatar-crop .cr-slider::-moz-range-thumb{background:var(--color-primary);cursor:pointer;transform:scale(1);-moz-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.CropModal #avatar-crop .cr-slider::-moz-range-thumb:hover{transform:scale(1.2)}.CropModal #avatar-crop .cr-slider::-ms-thumb{background:var(--color-primary);cursor:pointer;transform:scale(1);-ms-transition:transform .25s ease-in-out;transition:transform .25s ease-in-out}.CropModal #avatar-crop .cr-slider::-ms-thumb:hover{transform:scale(1.2)}\n",".AvatarEditable label{margin-left:auto;margin-right:auto;width:7.5rem;height:7.5rem;margin-bottom:2rem;display:flex !important;align-items:center;justify-content:center;background-color:var(--color-primary);border-radius:50%;color:white;font-size:3rem;cursor:pointer;position:relative;overflow:hidden;outline:none !important}.AvatarEditable label input{display:none}.AvatarEditable label img{position:absolute;top:0;left:0;width:100%;height:100%}.AvatarEditable label i{transform:scale(1);transition:transform .15s linear;z-index:var(--z-register-add-avatar)}.Transition>div:not(.active) .AvatarEditable label input,.Transition>div:not(.active) .AvatarEditable label i,.Transition>div:not(.active) .AvatarEditable label::after,body.animating-right-column .AvatarEditable label input,body.animating-right-column .AvatarEditable label i,body.animating-right-column .AvatarEditable label::after{display:none !important}.Transition>div:not(.active) .AvatarEditable label img,body.animating-right-column .AvatarEditable label img{position:static !important}.AvatarEditable label:hover i{transform:scale(1.2)}.AvatarEditable label.filled{background-color:var(--color-background)}.AvatarEditable label.filled::after{content:'';display:block;position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4)}.AvatarEditable label.disabled{pointer-events:none}.AvatarEditable label.disabled i{display:none}.AvatarEditable label.disabled::after{display:none}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/5.3751c0b85336f64c5d01.js b/dist/5.64e3757d90b4958d12d9.js similarity index 90% rename from dist/5.3751c0b85336f64c5d01.js rename to dist/5.64e3757d90b4958d12d9.js index c52bec684..098a2c9fd 100644 --- a/dist/5.3751c0b85336f64c5d01.js +++ b/dist/5.64e3757d90b4958d12d9.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{107:function(e,t,a){"use strict";a.r(t),a.d(t,"AuthCode",(function(){return g})),a.d(t,"AuthPassword",(function(){return v})),a.d(t,"AuthRegister",(function(){return w}));var n=a(0),r=a(1),o=a(6),c=a(3),i=a(22),s=a(39),l=a(16),u=a(47),d=a(20),m=a(2),b=a(130),h=a(119);a(143);const p=o.l?m.Db:m.Cb;var f=Object(n.h)(({code:e,codeLength:t,trackingDirection:a,isTracking:r,isBig:o})=>{const[c,i]=Object(n.r)(),[s,l]=Object(n.r)(),[u,d]=Object(n.r)(!1),f=165/t;Object(n.n)(()=>{c||Object(b.a)("MonkeyIdle").then(i)},[c]),Object(n.n)(()=>{s||Object(b.a)("MonkeyTracking").then(l)},[s]);const g=Object(n.m)(()=>d(!0),[]);return n.a.createElement("div",{id:"monkey",className:o?"big":""},!u&&n.a.createElement("div",{className:"monkey-preview"}),c&&n.a.createElement(h.a,{id:"idleMonkey",size:o?m.Ob:p,className:r?"hidden":void 0,animationData:c,play:!r,onLoad:g}),s&&n.a.createElement(h.a,{id:"trackingMonkey",size:o?m.Ob:p,className:r?"shown":"hidden",animationData:s,playSegment:r?function(){const n=e&&e.length>1||a<0?15+f*(e.length-1):0,r=e.length===t?180:15+f*e.length;return a<1?[r,n]:[n,r]}():void 0,speed:2,noLoop:!0}))});var g=Object(n.h)(Object(r.h)(e=>Object(c.l)(e,["authPhoneNumber","authIsCodeViaApp","authIsLoading","authError"]),(e,t)=>Object(c.l)(t,["setAuthCode","returnToAuthPhoneNumber","clearAuthError"]))(({authPhoneNumber:e,authIsCodeViaApp:t,authIsLoading:a,authError:r,setAuthCode:c,returnToAuthPhoneNumber:m,clearAuthError:b})=>{const h=Object(l.a)(),p=Object(n.q)(null),[g,O]=Object(n.r)(""),[j,v]=Object(n.r)(!1),[E,y]=Object(n.r)(1);Object(n.n)(()=>{o.n||p.current.focus()},[]),Object(s.a)(!0,m);const w=Object(n.m)(e=>{r&&b();const{currentTarget:t}=e;t.value=t.value.replace(/[^\d]+/,"").substr(0,5),t.value!==g&&(O(t.value),j?t.value.length||v(!1):v(!0),g&&g.length>t.value.length?y(-1):y(1),5===t.value.length&&c({code:t.value}))},[r,b,g,j,c]);return n.a.createElement("div",{id:"auth-code-form",className:"custom-scroll"},n.a.createElement("div",{className:"auth-form"},n.a.createElement(f,{code:g,codeLength:5,isTracking:j,trackingDirection:E}),n.a.createElement("h2",null,e,n.a.createElement("div",{className:"auth-number-edit",onClick:m,role:"button",tabIndex:0,title:h("WrongNumber")},n.a.createElement("i",{className:"icon-edit"}))),n.a.createElement("p",{className:"note"},Object(i.a)(h(t?"SentAppCode":"Login.JustSentSms"),["simple_markdown"])),n.a.createElement(u.a,{ref:p,id:"sign-in-code",label:h("Code"),onInput:w,value:g,error:r&&h(r),autoComplete:"one-time-code",inputMode:"numeric"}),a&&n.a.createElement(d.a,null)))})),O=a(151),j=a(152);var v=Object(n.h)(Object(r.h)(e=>Object(c.l)(e,["authIsLoading","authError","authHint"]),(e,t)=>Object(c.l)(t,["setAuthPassword","clearAuthError"]))(({authIsLoading:e,authError:t,authHint:a,setAuthPassword:r,clearAuthError:o})=>{const c=Object(l.a)(),[i,s]=Object(n.r)(!1),u=Object(n.m)(e=>{s(e)},[]),d=Object(n.m)(e=>{r({password:e})},[r]);return n.a.createElement("div",{id:"auth-password-form",className:"custom-scroll"},n.a.createElement("div",{className:"auth-form"},n.a.createElement(O.a,{isPasswordVisible:i}),n.a.createElement("h2",null,c("Login.Header.Password")),n.a.createElement("p",{className:"note"},c("Login.EnterPasswordDescription")),n.a.createElement(j.a,{clearError:o,error:t&&c(t),hint:a,isLoading:e,isPasswordVisible:i,onChangePasswordVisibility:u,onSubmit:d})))})),E=a(21),y=a(135);var w=Object(n.h)(Object(r.h)(e=>Object(c.l)(e,["authIsLoading","authError"]),(e,t)=>Object(c.l)(t,["signUp","clearAuthError","uploadProfilePhoto"]))(({authIsLoading:e,authError:t,signUp:a,clearAuthError:r,uploadProfilePhoto:o})=>{const c=Object(l.a)(),[i,s]=Object(n.r)(!1),[d,m]=Object(n.r)(),[b,h]=Object(n.r)(""),[p,f]=Object(n.r)("");return n.a.createElement("div",{id:"auth-registration-form",className:"custom-scroll"},n.a.createElement("div",{className:"auth-form"},n.a.createElement("form",{action:"",method:"post",onSubmit:function(e){e.preventDefault(),a({firstName:b,lastName:p}),d&&o({file:d})}},n.a.createElement(y.a,{onChange:m}),n.a.createElement("h2",null,c("YourName")),n.a.createElement("p",{className:"note"},c("Login.Register.Desc")),n.a.createElement(u.a,{id:"registration-first-name",label:c("Login.Register.FirstName.Placeholder"),onChange:function(e){t&&r();const{target:a}=e;h(a.value),s(a.value.length>0)},value:b,error:t&&c(t),autoComplete:"given-name"}),n.a.createElement(u.a,{id:"registration-last-name",label:c("Login.Register.LastName.Placeholder"),onChange:function(e){const{target:t}=e;f(t.value)},value:p,autoComplete:"family-name"}),i&&n.a.createElement(E.a,{type:"submit",ripple:!0,isLoading:e},c("Next")))))}))},112:function(e,t,a){"use strict";var n=a(0),r=a(56);var o=a(9),c=a(37),i=a(40),s=a(58),l=a(16),u=a(39),d=a(21),m=a(127);a(153);t.a=({title:e,className:t,isOpen:a,header:b,hasCloseButton:h,noBackdrop:p,children:f,onClose:g,onCloseAnimationEnd:O,onEnter:j,shouldSkipHistoryAnimations:v})=>{const{shouldRender:E,transitionClassNames:y}=Object(i.a)(a,O,v,void 0,v),w=Object(n.q)(null);Object(n.n)(()=>a?Object(r.a)({onEsc:g,onEnter:j}):void 0,[a,g,j]),Object(n.n)(()=>a&&w.current?function(e){function t(t){if("Tab"!==t.key)return;t.preventDefault(),t.stopPropagation();const a=Array.from(e.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'));if(!a.length)return;const n=a.findIndex(e=>e.isSameNode(document.activeElement));let r=0;n>=0&&(r=t.shiftKey?n>0?n-1:a.length-1:n{document.removeEventListener("keydown",t,!1)}}(w.current):void 0,[a]);const{forceClose:N}=Object(u.a)(a,g);Object(n.n)(()=>()=>{a&&N()},[]),Object(s.a)(([e])=>(document.body.classList.toggle("has-open-dialog",a),(a||!a&&void 0!==e)&&Object(c.d)(200),()=>{document.body.classList.remove("has-open-dialog")}),[a]);const k=Object(l.a)();if(!E)return;const C=Object(o.a)("Modal",t,y,p&&"transparent-backdrop");return n.a.createElement(m.a,null,n.a.createElement("div",{ref:w,className:C,tabIndex:-1,role:"dialog"},n.a.createElement("div",{className:"modal-container"},n.a.createElement("div",{className:"modal-backdrop",onClick:g}),n.a.createElement("div",{className:"modal-dialog"},b||(e?n.a.createElement("div",{className:"modal-header"},h&&n.a.createElement(d.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:k("Close"),onClick:g},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("div",{className:"modal-title"},e)):void 0),n.a.createElement("div",{className:"modal-content custom-scroll"},f)))))}},119:function(e,t,a){"use strict";var n=a(0),r=a(10),o=a(9),c=a(37),i=a(126);let s,l;async function u(){return s||(s=a.e(7).then(a.bind(null,198)),l=(await s).default),s}setTimeout(u,5e3);t.a=Object(n.h)(({className:e,id:t,animationData:a,play:s,playSegment:d,speed:m,noLoop:b,size:h,quality:p,isLowPriority:f,onLoad:g})=>{const[O,j]=Object(n.r)(),v=Object(n.q)(null),E=Object(n.q)(!1),y=Object(n.q)(!1),w=Object(n.q)();w.current=s;const N=Object(n.q)();N.current=d,Object(n.n)(()=>{if(O||!a)return;const e=()=>{if(!v.current)return;const e=new l(t,v.current,a,{noLoop:b,size:h,quality:p,isLowPriority:f},g);m&&e.setSpeed(m),j(e)};l?e():u().then(()=>{Object(r.b)(()=>{v.current&&e()})})},[O,a,t,f,b,g,p,h,m]),Object(n.n)(()=>()=>{O&&O.destroy()},[O]);const k=Object(n.m)((e=!1)=>{O&&(w.current||N.current)&&(N.current?O.playSegment(N.current):e?O.goToAndPlay(0):O.play())},[O]),C=Object(n.m)(()=>{O&&O.pause()},[O]),L=Object(n.m)(()=>{y.current=!0,O&&(E.current||(E.current=O.isPlaying()),C())},[O,C]),A=Object(n.m)(()=>{E.current&&k(),E.current=!1,y.current=!1},[k]),P=Object(n.m)(()=>{Object(r.b)(A)},[A]);Object(n.n)(()=>{O&&(s||d?y.current?E.current=!0:k(b):y.current?E.current=!1:C())},[O,s,d,b,k,C]),Object(c.c)(L,A),Object(i.a)(L,P);const S=Object(o.a)("AnimatedSticker",e),I=h?`width: ${h}px; height: ${h}px;`:void 0;return n.a.createElement("div",{ref:v,className:S,style:I})})},126:function(e,t,a){"use strict";a.d(t,"a",(function(){return r}));var n=a(0);function r(e,t){Object(n.n)(()=>(e&&!document.hasFocus()&&e(),e&&window.addEventListener("blur",e),t&&window.addEventListener("focus",t),()=>{t&&window.removeEventListener("focus",t),e&&window.removeEventListener("blur",e)}),[e,t])}},127:function(e,t,a){"use strict";var n=a(0),r=a(67);t.a=({containerId:e,className:t,children:a})=>{const o=Object(n.q)(document.createElement("div"));return Object(n.o)(()=>{const a=document.querySelector(e||"#portals");if(!a)return;const n=o.current;return t&&n.classList.add(t),a.appendChild(n),()=>{r.a.render(void 0,n),a.removeChild(n)}},[t,e]),r.a.render(a,o.current)}},130:function(e,t,a){"use strict";a.d(t,"a",(function(){return c}));var n=a(8),r=a(57);const o={MonkeyIdle:a.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs",MonkeyTracking:a.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs",MonkeyClose:a.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs",MonkeyPeek:a.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs",FoldersAll:a.p+"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs",FoldersNew:a.p+"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs",DiscussionGroups:a.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs"};function c(e){const t=o[e].replace(window.location.origin,"");return r.b("file"+t,n.ApiMediaFormat.Lottie)}},135:function(e,t,a){"use strict";var n=a(0),r=a(9),o=a(2),c=a(17),i=a(16),s=a(21),l=a(112),u=a(20);a(154);const d={type:"blob",quality:.8,format:"jpeg",circle:!1};let m,b,h;var p=Object(n.h)(({file:e,onChange:t,onClose:r})=>{const[p,f]=Object(n.r)(!1);Object(n.n)(()=>{e&&(p?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:a,offsetHeight:n}=t;h=new m(t,{enableZoom:!0,boundary:{width:a,height:n},viewport:{width:a-16,height:n-16,type:"circle"}});const r=await Object(c.a)(e);await h.bind({url:r})}catch(e){o.r&&console.error(e)}}(e):async function(){return b||(b=Promise.all([a.e(6),a.e(8)]).then(a.bind(null,327)),m=(await b).default),b}().then(()=>f(!0)))},[e,p]);const g=Object(i.a)();return n.a.createElement(l.a,{isOpen:Boolean(e),onClose:r,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},p?n.a.createElement("div",{id:"avatar-crop"}):n.a.createElement(u.a,null),n.a.createElement(s.a,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!h)return;const e=await h.result(d),a="string"==typeof e?e:Object(c.b)(e,"avatar.jpg");t(a)},ariaLabel:g("CropImage")},n.a.createElement("i",{className:"icon-check"})))});a(155);t.a=Object(n.h)(({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:a,onChange:o})=>{const[c,i]=Object(n.r)(),[s,l]=Object(n.r)(a);Object(n.n)(()=>{l(a)},[a]);const u=Object(r.a)(s&&"filled",t&&"disabled");return n.a.createElement("div",{className:"AvatarEditable"},n.a.createElement("label",{className:u,role:"button",tabIndex:0,title:e},n.a.createElement("input",{type:"file",onChange:function(e){const t=e.target;t&&t.files&&t.files[0]&&(i(t.files[0]),t.value="")},accept:"image/png, image/jpeg"}),n.a.createElement("i",{className:"icon-camera-add"}),s&&n.a.createElement("img",{src:s,alt:"Avatar"})),n.a.createElement(p,{file:c,onClose:function(){i(void 0)},onChange:function(e){i(void 0),o(e),s&&URL.revokeObjectURL(s),l(URL.createObjectURL(e))}}))})},143:function(e,t,a){},151:function(e,t,a){"use strict";var n=a(0),r=a(2),o=a(6),c=a(130),i=a(119);a(143);const s=[0,50],l=[0,20],u=[20,0],d=o.l?r.Db:r.Cb;t.a=Object(n.h)(({isPasswordVisible:e,isBig:t})=>{const[a,o]=Object(n.r)(),[m,b]=Object(n.r)(),[h,p]=Object(n.r)(!1),[f,g]=Object(n.r)(!1);Object(n.n)(()=>{a?setTimeout(()=>g(!0),2e3):Object(c.a)("MonkeyClose").then(o)},[a]),Object(n.n)(()=>{m||Object(c.a)("MonkeyPeek").then(b)},[m]);const O=Object(n.m)(()=>p(!0),[]);return n.a.createElement("div",{id:"monkey",className:t?"big":""},!h&&n.a.createElement("div",{className:"monkey-preview"}),a&&n.a.createElement(i.a,{id:"closeMonkey",size:t?r.Ob:d,className:f?"hidden":"shown",animationData:a,playSegment:s,noLoop:!0,onLoad:O}),m&&n.a.createElement(i.a,{id:"peekMonkey",size:t?r.Ob:d,className:f?"shown":"hidden",animationData:m,playSegment:e?l:u,noLoop:!0}))})},152:function(e,t,a){"use strict";var n=a(0),r=a(2),o=a(6),c=a(9),i=a(16),s=a(21);const l=o.l?550:400;t.a=Object(n.h)(({isLoading:e=!1,isPasswordVisible:t,error:a,hint:u,placeholder:d="Password",submitLabel:m="Next",clearError:b,onChangePasswordVisibility:h,onInputChange:p,onSubmit:f})=>{const g=Object(n.q)(null),O=Object(i.a)(),[j,v]=Object(n.r)(""),[E,y]=Object(n.r)(!1);return Object(n.n)(()=>{o.n||setTimeout(()=>{g.current.focus()},l)},[]),Object(n.n)(()=>{a&&requestAnimationFrame(()=>{g.current.focus(),g.current.select()})},[a]),n.a.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||E&&f(j)},autoComplete:"off"},n.a.createElement("div",{className:Object(c.a)("input-group password-input",j&&"touched",a&&"error"),dir:O.isRtl?"rtl":void 0},n.a.createElement("input",{ref:g,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:j||"",autoComplete:"current-password",onChange:function(e){a&&b();const{target:t}=e;v(t.value),y(t.value.length>=r.jb),p&&p(t.value)},dir:"auto"}),n.a.createElement("label",null,a||u||d),n.a.createElement("div",{className:"toggle-password",onClick:function(){h(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},n.a.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),E&&n.a.createElement(s.a,{type:"submit",ripple:!0,isLoading:e},m))})},153:function(e,t,a){},154:function(e,t,a){},155:function(e,t,a){}}]); -//# sourceMappingURL=5.3751c0b85336f64c5d01.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{107:function(e,t,a){"use strict";a.r(t),a.d(t,"AuthCode",(function(){return g})),a.d(t,"AuthPassword",(function(){return v})),a.d(t,"AuthRegister",(function(){return w}));var n=a(0),r=a(1),o=a(6),c=a(3),i=a(22),s=a(39),l=a(16),u=a(47),d=a(20),m=a(2),b=a(132),h=a(119);a(144);const p=o.l?m.Db:m.Cb;var f=Object(n.h)(({code:e,codeLength:t,trackingDirection:a,isTracking:r,isBig:o})=>{const[c,i]=Object(n.r)(),[s,l]=Object(n.r)(),[u,d]=Object(n.r)(!1),f=165/t;Object(n.n)(()=>{c||Object(b.a)("MonkeyIdle").then(i)},[c]),Object(n.n)(()=>{s||Object(b.a)("MonkeyTracking").then(l)},[s]);const g=Object(n.m)(()=>d(!0),[]);return n.a.createElement("div",{id:"monkey",className:o?"big":""},!u&&n.a.createElement("div",{className:"monkey-preview"}),c&&n.a.createElement(h.a,{id:"idleMonkey",size:o?m.Ob:p,className:r?"hidden":void 0,animationData:c,play:!r,onLoad:g}),s&&n.a.createElement(h.a,{id:"trackingMonkey",size:o?m.Ob:p,className:r?"shown":"hidden",animationData:s,playSegment:r?function(){const n=e&&e.length>1||a<0?15+f*(e.length-1):0,r=e.length===t?180:15+f*e.length;return a<1?[r,n]:[n,r]}():void 0,speed:2,noLoop:!0}))});var g=Object(n.h)(Object(r.h)(e=>Object(c.l)(e,["authPhoneNumber","authIsCodeViaApp","authIsLoading","authError"]),(e,t)=>Object(c.l)(t,["setAuthCode","returnToAuthPhoneNumber","clearAuthError"]))(({authPhoneNumber:e,authIsCodeViaApp:t,authIsLoading:a,authError:r,setAuthCode:c,returnToAuthPhoneNumber:m,clearAuthError:b})=>{const h=Object(l.a)(),p=Object(n.q)(null),[g,O]=Object(n.r)(""),[j,v]=Object(n.r)(!1),[E,y]=Object(n.r)(1);Object(n.n)(()=>{o.n||p.current.focus()},[]),Object(s.a)(!0,m);const w=Object(n.m)(e=>{r&&b();const{currentTarget:t}=e;t.value=t.value.replace(/[^\d]+/,"").substr(0,5),t.value!==g&&(O(t.value),j?t.value.length||v(!1):v(!0),g&&g.length>t.value.length?y(-1):y(1),5===t.value.length&&c({code:t.value}))},[r,b,g,j,c]);return n.a.createElement("div",{id:"auth-code-form",className:"custom-scroll"},n.a.createElement("div",{className:"auth-form"},n.a.createElement(f,{code:g,codeLength:5,isTracking:j,trackingDirection:E}),n.a.createElement("h2",null,e,n.a.createElement("div",{className:"auth-number-edit",onClick:m,role:"button",tabIndex:0,title:h("WrongNumber")},n.a.createElement("i",{className:"icon-edit"}))),n.a.createElement("p",{className:"note"},Object(i.a)(h(t?"SentAppCode":"Login.JustSentSms"),["simple_markdown"])),n.a.createElement(u.a,{ref:p,id:"sign-in-code",label:h("Code"),onInput:w,value:g,error:r&&h(r),autoComplete:"one-time-code",inputMode:"numeric"}),a&&n.a.createElement(d.a,null)))})),O=a(153),j=a(154);var v=Object(n.h)(Object(r.h)(e=>Object(c.l)(e,["authIsLoading","authError","authHint"]),(e,t)=>Object(c.l)(t,["setAuthPassword","clearAuthError"]))(({authIsLoading:e,authError:t,authHint:a,setAuthPassword:r,clearAuthError:o})=>{const c=Object(l.a)(),[i,s]=Object(n.r)(!1),u=Object(n.m)(e=>{s(e)},[]),d=Object(n.m)(e=>{r({password:e})},[r]);return n.a.createElement("div",{id:"auth-password-form",className:"custom-scroll"},n.a.createElement("div",{className:"auth-form"},n.a.createElement(O.a,{isPasswordVisible:i}),n.a.createElement("h2",null,c("Login.Header.Password")),n.a.createElement("p",{className:"note"},c("Login.EnterPasswordDescription")),n.a.createElement(j.a,{clearError:o,error:t&&c(t),hint:a,isLoading:e,isPasswordVisible:i,onChangePasswordVisibility:u,onSubmit:d})))})),E=a(21),y=a(136);var w=Object(n.h)(Object(r.h)(e=>Object(c.l)(e,["authIsLoading","authError"]),(e,t)=>Object(c.l)(t,["signUp","clearAuthError","uploadProfilePhoto"]))(({authIsLoading:e,authError:t,signUp:a,clearAuthError:r,uploadProfilePhoto:o})=>{const c=Object(l.a)(),[i,s]=Object(n.r)(!1),[d,m]=Object(n.r)(),[b,h]=Object(n.r)(""),[p,f]=Object(n.r)("");return n.a.createElement("div",{id:"auth-registration-form",className:"custom-scroll"},n.a.createElement("div",{className:"auth-form"},n.a.createElement("form",{action:"",method:"post",onSubmit:function(e){e.preventDefault(),a({firstName:b,lastName:p}),d&&o({file:d})}},n.a.createElement(y.a,{onChange:m}),n.a.createElement("h2",null,c("YourName")),n.a.createElement("p",{className:"note"},c("Login.Register.Desc")),n.a.createElement(u.a,{id:"registration-first-name",label:c("Login.Register.FirstName.Placeholder"),onChange:function(e){t&&r();const{target:a}=e;h(a.value),s(a.value.length>0)},value:b,error:t&&c(t),autoComplete:"given-name"}),n.a.createElement(u.a,{id:"registration-last-name",label:c("Login.Register.LastName.Placeholder"),onChange:function(e){const{target:t}=e;f(t.value)},value:p,autoComplete:"family-name"}),i&&n.a.createElement(E.a,{type:"submit",ripple:!0,isLoading:e},c("Next")))))}))},112:function(e,t,a){"use strict";var n=a(0),r=a(56);var o=a(9),c=a(37),i=a(40),s=a(58),l=a(16),u=a(39),d=a(21),m=a(128);a(155);t.a=({title:e,className:t,isOpen:a,header:b,hasCloseButton:h,noBackdrop:p,children:f,onClose:g,onCloseAnimationEnd:O,onEnter:j,shouldSkipHistoryAnimations:v})=>{const{shouldRender:E,transitionClassNames:y}=Object(i.a)(a,O,v,void 0,v),w=Object(n.q)(null);Object(n.n)(()=>a?Object(r.a)({onEsc:g,onEnter:j}):void 0,[a,g,j]),Object(n.n)(()=>a&&w.current?function(e){function t(t){if("Tab"!==t.key)return;t.preventDefault(),t.stopPropagation();const a=Array.from(e.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'));if(!a.length)return;const n=a.findIndex(e=>e.isSameNode(document.activeElement));let r=0;n>=0&&(r=t.shiftKey?n>0?n-1:a.length-1:n{document.removeEventListener("keydown",t,!1)}}(w.current):void 0,[a]);const{forceClose:N}=Object(u.a)(a,g);Object(n.n)(()=>()=>{a&&N()},[]),Object(s.a)(([e])=>(document.body.classList.toggle("has-open-dialog",a),(a||!a&&void 0!==e)&&Object(c.d)(200),()=>{document.body.classList.remove("has-open-dialog")}),[a]);const k=Object(l.a)();if(!E)return;const C=Object(o.a)("Modal",t,y,p&&"transparent-backdrop");return n.a.createElement(m.a,null,n.a.createElement("div",{ref:w,className:C,tabIndex:-1,role:"dialog"},n.a.createElement("div",{className:"modal-container"},n.a.createElement("div",{className:"modal-backdrop",onClick:g}),n.a.createElement("div",{className:"modal-dialog"},b||(e?n.a.createElement("div",{className:"modal-header"},h&&n.a.createElement(d.a,{round:!0,color:"translucent",size:"smaller",ariaLabel:k("Close"),onClick:g},n.a.createElement("i",{className:"icon-close"})),n.a.createElement("div",{className:"modal-title"},e)):void 0),n.a.createElement("div",{className:"modal-content custom-scroll"},f)))))}},119:function(e,t,a){"use strict";var n=a(0),r=a(10),o=a(9),c=a(37),i=a(127);let s,l;async function u(){return s||(s=a.e(7).then(a.bind(null,201)),l=(await s).default),s}setTimeout(u,5e3);t.a=Object(n.h)(({className:e,id:t,animationData:a,play:s,playSegment:d,speed:m,noLoop:b,size:h,quality:p,isLowPriority:f,onLoad:g})=>{const[O,j]=Object(n.r)(),v=Object(n.q)(null),E=Object(n.q)(!1),y=Object(n.q)(!1),w=Object(n.q)();w.current=s;const N=Object(n.q)();N.current=d,Object(n.n)(()=>{if(O||!a)return;const e=()=>{if(!v.current)return;const e=new l(t,v.current,a,{noLoop:b,size:h,quality:p,isLowPriority:f},g);m&&e.setSpeed(m),j(e)};l?e():u().then(()=>{Object(r.b)(()=>{v.current&&e()})})},[O,a,t,f,b,g,p,h,m]),Object(n.n)(()=>()=>{O&&O.destroy()},[O]);const k=Object(n.m)((e=!1)=>{O&&(w.current||N.current)&&(N.current?O.playSegment(N.current):e?O.goToAndPlay(0):O.play())},[O]),C=Object(n.m)(()=>{O&&O.pause()},[O]),L=Object(n.m)(()=>{y.current=!0,O&&(E.current||(E.current=O.isPlaying()),C())},[O,C]),A=Object(n.m)(()=>{E.current&&k(),E.current=!1,y.current=!1},[k]),P=Object(n.m)(()=>{Object(r.b)(A)},[A]);Object(n.n)(()=>{O&&(s||d?y.current?E.current=!0:k(b):y.current?E.current=!1:C())},[O,s,d,b,k,C]),Object(c.c)(L,A),Object(i.a)(L,P);const S=Object(o.a)("AnimatedSticker",e),I=h?`width: ${h}px; height: ${h}px;`:void 0;return n.a.createElement("div",{ref:v,className:S,style:I})})},127:function(e,t,a){"use strict";a.d(t,"a",(function(){return r}));var n=a(0);function r(e,t){Object(n.n)(()=>(e&&!document.hasFocus()&&e(),e&&window.addEventListener("blur",e),t&&window.addEventListener("focus",t),()=>{t&&window.removeEventListener("focus",t),e&&window.removeEventListener("blur",e)}),[e,t])}},128:function(e,t,a){"use strict";var n=a(0),r=a(67);t.a=({containerId:e,className:t,children:a})=>{const o=Object(n.q)(document.createElement("div"));return Object(n.o)(()=>{const a=document.querySelector(e||"#portals");if(!a)return;const n=o.current;return t&&n.classList.add(t),a.appendChild(n),()=>{r.a.render(void 0,n),a.removeChild(n)}},[t,e]),r.a.render(a,o.current)}},132:function(e,t,a){"use strict";a.d(t,"a",(function(){return c}));var n=a(8),r=a(57);const o={MonkeyIdle:a.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs",MonkeyTracking:a.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs",MonkeyClose:a.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs",MonkeyPeek:a.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs",FoldersAll:a.p+"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs",FoldersNew:a.p+"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs",DiscussionGroups:a.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs"};function c(e){const t=o[e].replace(window.location.origin,"");return r.b("file"+t,n.ApiMediaFormat.Lottie)}},136:function(e,t,a){"use strict";var n=a(0),r=a(9),o=a(2),c=a(17),i=a(16),s=a(21),l=a(112),u=a(20);a(156);const d={type:"blob",quality:.8,format:"jpeg",circle:!1};let m,b,h;var p=Object(n.h)(({file:e,onChange:t,onClose:r})=>{const[p,f]=Object(n.r)(!1);Object(n.n)(()=>{e&&(p?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:a,offsetHeight:n}=t;h=new m(t,{enableZoom:!0,boundary:{width:a,height:n},viewport:{width:a-16,height:n-16,type:"circle"}});const r=await Object(c.a)(e);await h.bind({url:r})}catch(e){o.r&&console.error(e)}}(e):async function(){return b||(b=Promise.all([a.e(6),a.e(8)]).then(a.bind(null,333)),m=(await b).default),b}().then(()=>f(!0)))},[e,p]);const g=Object(i.a)();return n.a.createElement(l.a,{isOpen:Boolean(e),onClose:r,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},p?n.a.createElement("div",{id:"avatar-crop"}):n.a.createElement(u.a,null),n.a.createElement(s.a,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!h)return;const e=await h.result(d),a="string"==typeof e?e:Object(c.b)(e,"avatar.jpg");t(a)},ariaLabel:g("CropImage")},n.a.createElement("i",{className:"icon-check"})))});a(157);t.a=Object(n.h)(({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:a,onChange:o})=>{const[c,i]=Object(n.r)(),[s,l]=Object(n.r)(a);Object(n.n)(()=>{l(a)},[a]);const u=Object(r.a)(s&&"filled",t&&"disabled");return n.a.createElement("div",{className:"AvatarEditable"},n.a.createElement("label",{className:u,role:"button",tabIndex:0,title:e},n.a.createElement("input",{type:"file",onChange:function(e){const t=e.target;t&&t.files&&t.files[0]&&(i(t.files[0]),t.value="")},accept:"image/png, image/jpeg"}),n.a.createElement("i",{className:"icon-camera-add"}),s&&n.a.createElement("img",{src:s,alt:"Avatar"})),n.a.createElement(p,{file:c,onClose:function(){i(void 0)},onChange:function(e){i(void 0),o(e),s&&URL.revokeObjectURL(s),l(URL.createObjectURL(e))}}))})},144:function(e,t,a){},153:function(e,t,a){"use strict";var n=a(0),r=a(2),o=a(6),c=a(132),i=a(119);a(144);const s=[0,50],l=[0,20],u=[20,0],d=o.l?r.Db:r.Cb;t.a=Object(n.h)(({isPasswordVisible:e,isBig:t})=>{const[a,o]=Object(n.r)(),[m,b]=Object(n.r)(),[h,p]=Object(n.r)(!1),[f,g]=Object(n.r)(!1);Object(n.n)(()=>{a?setTimeout(()=>g(!0),2e3):Object(c.a)("MonkeyClose").then(o)},[a]),Object(n.n)(()=>{m||Object(c.a)("MonkeyPeek").then(b)},[m]);const O=Object(n.m)(()=>p(!0),[]);return n.a.createElement("div",{id:"monkey",className:t?"big":""},!h&&n.a.createElement("div",{className:"monkey-preview"}),a&&n.a.createElement(i.a,{id:"closeMonkey",size:t?r.Ob:d,className:f?"hidden":"shown",animationData:a,playSegment:s,noLoop:!0,onLoad:O}),m&&n.a.createElement(i.a,{id:"peekMonkey",size:t?r.Ob:d,className:f?"shown":"hidden",animationData:m,playSegment:e?l:u,noLoop:!0}))})},154:function(e,t,a){"use strict";var n=a(0),r=a(2),o=a(6),c=a(9),i=a(16),s=a(21);const l=o.l?550:400;t.a=Object(n.h)(({isLoading:e=!1,isPasswordVisible:t,error:a,hint:u,placeholder:d="Password",submitLabel:m="Next",clearError:b,onChangePasswordVisibility:h,onInputChange:p,onSubmit:f})=>{const g=Object(n.q)(null),O=Object(i.a)(),[j,v]=Object(n.r)(""),[E,y]=Object(n.r)(!1);return Object(n.n)(()=>{o.n||setTimeout(()=>{g.current.focus()},l)},[]),Object(n.n)(()=>{a&&requestAnimationFrame(()=>{g.current.focus(),g.current.select()})},[a]),n.a.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||E&&f(j)},autoComplete:"off"},n.a.createElement("div",{className:Object(c.a)("input-group password-input",j&&"touched",a&&"error"),dir:O.isRtl?"rtl":void 0},n.a.createElement("input",{ref:g,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:j||"",autoComplete:"current-password",onChange:function(e){a&&b();const{target:t}=e;v(t.value),y(t.value.length>=r.jb),p&&p(t.value)},dir:"auto"}),n.a.createElement("label",null,a||u||d),n.a.createElement("div",{className:"toggle-password",onClick:function(){h(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},n.a.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),E&&n.a.createElement(s.a,{type:"submit",ripple:!0,isLoading:e},m))})},155:function(e,t,a){},156:function(e,t,a){},157:function(e,t,a){}}]); +//# sourceMappingURL=5.64e3757d90b4958d12d9.js.map \ No newline at end of file diff --git a/dist/5.64e3757d90b4958d12d9.js.map b/dist/5.64e3757d90b4958d12d9.js.map new file mode 100644 index 000000000..8065d93fa --- /dev/null +++ b/dist/5.64e3757d90b4958d12d9.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/common/TrackingMonkey.tsx","webpack:///./src/components/auth/AuthCode.tsx","webpack:///./src/components/auth/AuthPassword.tsx","webpack:///./src/components/auth/AuthRegister.tsx","webpack:///./src/components/ui/Modal.tsx","webpack:///./src/util/trapFocus.ts","webpack:///./src/components/common/AnimatedSticker.tsx","webpack:///./src/hooks/useBackgroundMode.ts","webpack:///./src/components/ui/Portal.ts","webpack:///./src/components/common/helpers/animatedAssets.ts","webpack:///./src/assets/TwoFactorSetupMonkeyIdle.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyTracking.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyClose.tgs","webpack:///./src/assets/TwoFactorSetupMonkeyPeek.tgs","webpack:///./src/assets/FoldersAll.tgs","webpack:///./src/assets/FoldersNew.tgs","webpack:///./src/assets/DiscussionGroupsDucks.tgs","webpack:///./src/components/ui/CropModal.tsx","webpack:///./src/components/ui/AvatarEditable.tsx","webpack:///./src/components/common/PasswordMonkey.tsx","webpack:///./src/components/common/PasswordForm.tsx"],"names":["STICKER_SIZE","IS_SINGLE_COLUMN_LAYOUT","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","memo","code","codeLength","trackingDirection","isTracking","isBig","idleMonkeyData","setIdleMonkeyData","useState","trackingMonkeyData","setTrackingMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","TRACKING_FRAMES_PER_SYMBOL","useEffect","getAnimationData","then","handleFirstMonkeyLoad","useCallback","id","className","AnimatedSticker","size","STICKER_SIZE_TWO_FA","undefined","animationData","play","onLoad","playSegment","startFrame","length","endFrame","getTrackingFrames","speed","noLoop","withGlobal","global","pick","setGlobal","actions","authPhoneNumber","authIsCodeViaApp","authIsLoading","authError","setAuthCode","returnToAuthPhoneNumber","clearAuthError","lang","useLang","inputRef","useRef","setCode","setIsTracking","setTrackingDirection","IS_TOUCH_ENV","current","focus","useHistoryBack","onCodeChange","e","currentTarget","target","value","replace","substr","onClick","role","tabIndex","title","renderText","InputText","ref","label","onInput","error","autoComplete","inputMode","Loading","authHint","setAuthPassword","showPassword","setShowPassword","handleChangePasswordVisibility","isVisible","handleSubmit","password","isPasswordVisible","PasswordForm","clearError","hint","isLoading","onChangePasswordVisibility","onSubmit","signUp","uploadProfilePhoto","isButtonShown","setIsButtonShown","croppedFile","setCroppedFile","firstName","setFirstName","lastName","setLastName","action","method","event","preventDefault","file","AvatarEditable","onChange","Button","type","ripple","Modal","isOpen","header","hasCloseButton","noBackdrop","children","onClose","onCloseAnimationEnd","onEnter","shouldSkipHistoryAnimations","shouldRender","transitionClassNames","useShowTransition","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","key","stopPropagation","focusableElements","Array","from","querySelectorAll","currentFocusedIndex","findIndex","em","isSameNode","document","activeElement","newFocusedIndex","shiftKey","addEventListener","removeEventListener","trapFocus","forceClose","useEffectWithPrevDeps","prevIsOpen","body","classList","toggle","dispatchHeavyAnimationEvent","remove","fullClassName","buildClassName","Portal","round","color","ariaLabel","lottiePromise","RLottie","async","ensureLottie","default","setTimeout","quality","isLowPriority","animation","setAnimation","container","wasPlaying","isFrozen","playRef","playSegmentRef","exec","newAnimation","setSpeed","fastRaf","destroy","playAnimation","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","useHeavyAnimationCheck","useBackgroundMode","style","onBlur","onFocus","hasFocus","window","containerId","elementRef","createElement","useLayoutEffect","querySelector","add","appendChild","TeactDOM","render","removeChild","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","name","path","location","origin","mediaLoader","ApiMediaFormat","Lottie","cropperResultOptions","format","circle","Croppie","croppiePromise","cropper","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","getElementById","offsetWidth","offsetHeight","enableZoom","boundary","width","height","viewport","dataUri","blobToDataUri","bind","url","err","DEBUG","console","initCropper","ensureCroppie","Boolean","result","croppedImg","blobToFile","disabled","currentAvatarBlobUrl","selectedFile","setSelectedFile","croppedBlobUrl","setCroppedBlobUrl","labelClassName","files","accept","src","alt","URL","revokeObjectURL","createObjectURL","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isPeekShown","setIsPeekShown","FOCUS_DELAY_TIMEOUT_MS","placeholder","submitLabel","onInputChange","setPassword","canSubmit","setCanSubmit","requestAnimationFrame","select","dir","isRtl","MIN_PASSWORD_LENGTH"],"mappings":"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","file":"5.64e3757d90b4958d12d9.js","sourcesContent":["import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n code: string;\n codeLength: number;\n trackingDirection: number;\n isTracking: boolean;\n isBig?: boolean;\n};\n\nconst TRACKING_START_FRAME = 15;\nconst TRACKING_END_FRAME = 180;\nconst STICKER_SIZE = IS_SINGLE_COLUMN_LAYOUT ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst TrackingMonkey: FC = ({\n code,\n codeLength,\n trackingDirection,\n isTracking,\n isBig,\n}) => {\n const [idleMonkeyData, setIdleMonkeyData] = useState>();\n const [trackingMonkeyData, setTrackingMonkeyData] = useState>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const TRACKING_FRAMES_PER_SYMBOL = (TRACKING_END_FRAME - TRACKING_START_FRAME) / codeLength;\n\n useEffect(() => {\n if (!idleMonkeyData) {\n getAnimationData('MonkeyIdle').then(setIdleMonkeyData);\n }\n }, [idleMonkeyData]);\n\n useEffect(() => {\n if (!trackingMonkeyData) {\n getAnimationData('MonkeyTracking').then(setTrackingMonkeyData);\n }\n }, [trackingMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n function getTrackingFrames(): [number, number] {\n const startFrame = (code && code.length > 1) || trackingDirection < 0\n ? TRACKING_START_FRAME + TRACKING_FRAMES_PER_SYMBOL * (code.length - 1)\n : 0;\n const endFrame = code.length === codeLength\n ? TRACKING_END_FRAME\n : TRACKING_START_FRAME + TRACKING_FRAMES_PER_SYMBOL * code.length;\n\n if (trackingDirection < 1) {\n return [\n endFrame,\n startFrame,\n ];\n }\n\n return [\n startFrame,\n endFrame,\n ];\n }\n\n return (\n
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {idleMonkeyData && (\n \n )}\n {trackingMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(TrackingMonkey);\n","import { FormEvent } from 'react';\nimport React, {\n FC, useState, useEffect, useCallback, memo, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\nimport { GlobalState, GlobalActions } from '../../global/types';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { pick } from '../../util/iteratees';\nimport renderText from '../common/helpers/renderText';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport useLang from '../../hooks/useLang';\n\nimport InputText from '../ui/InputText';\nimport Loading from '../ui/Loading';\nimport TrackingMonkey from '../common/TrackingMonkey';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst CODE_LENGTH = 5;\n\nconst AuthCode: FC = ({\n authPhoneNumber,\n authIsCodeViaApp,\n authIsLoading,\n authError,\n setAuthCode,\n returnToAuthPhoneNumber,\n clearAuthError,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [code, setCode] = useState('');\n const [isTracking, setIsTracking] = useState(false);\n const [trackingDirection, setTrackingDirection] = useState(1);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n inputRef.current!.focus();\n }\n }, []);\n\n useHistoryBack(true, returnToAuthPhoneNumber);\n\n const onCodeChange = useCallback((e: FormEvent) => {\n if (authError) {\n clearAuthError();\n }\n\n const { currentTarget: target } = e;\n target.value = target.value.replace(/[^\\d]+/, '').substr(0, CODE_LENGTH);\n\n if (target.value === code) {\n return;\n }\n\n setCode(target.value);\n\n if (!isTracking) {\n setIsTracking(true);\n } else if (!target.value.length) {\n setIsTracking(false);\n }\n\n if (code && code.length > target.value.length) {\n setTrackingDirection(-1);\n } else {\n setTrackingDirection(1);\n }\n\n if (target.value.length === CODE_LENGTH) {\n setAuthCode({ code: target.value });\n }\n }, [authError, clearAuthError, code, isTracking, setAuthCode]);\n\n return (\n
\n
\n \n

\n {authPhoneNumber}\n \n \n

\n \n

\n {renderText(lang(authIsCodeViaApp ? 'SentAppCode' : 'Login.JustSentSms'), ['simple_markdown'])}\n

\n \n {authIsLoading && }\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authPhoneNumber', 'authIsCodeViaApp', 'authIsLoading', 'authError']),\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setAuthCode',\n 'returnToAuthPhoneNumber',\n 'clearAuthError',\n ]),\n)(AuthCode));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState, GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport MonkeyPassword from '../common/PasswordMonkey';\nimport PasswordForm from '../common/PasswordForm';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst AuthPassword: FC = ({\n authIsLoading, authError, authHint, setAuthPassword, clearAuthError,\n}) => {\n const lang = useLang();\n const [showPassword, setShowPassword] = useState(false);\n\n const handleChangePasswordVisibility = useCallback((isVisible) => {\n setShowPassword(isVisible);\n }, []);\n\n const handleSubmit = useCallback((password: string) => {\n setAuthPassword({ password });\n }, [setAuthPassword]);\n\n return (\n
\n
\n \n

{lang('Login.Header.Password')}

\n

{lang('Login.EnterPasswordDescription')}

\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authIsLoading', 'authError', 'authHint']),\n (setGlobal, actions): DispatchProps => pick(actions, ['setAuthPassword', 'clearAuthError']),\n)(AuthPassword));\n","import { ChangeEvent } from 'react';\nimport React, { FC, useState, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState, GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport InputText from '../ui/InputText';\nimport AvatarEditable from '../ui/AvatarEditable';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst AuthRegister: FC = ({\n authIsLoading, authError, signUp, clearAuthError, uploadProfilePhoto,\n}) => {\n const lang = useLang();\n const [isButtonShown, setIsButtonShown] = useState(false);\n const [croppedFile, setCroppedFile] = useState();\n const [firstName, setFirstName] = useState('');\n const [lastName, setLastName] = useState('');\n\n function handleFirstNameChange(event: ChangeEvent) {\n if (authError) {\n clearAuthError();\n }\n\n const { target } = event;\n\n setFirstName(target.value);\n setIsButtonShown(target.value.length > 0);\n }\n\n function handleLastNameChange(event: ChangeEvent) {\n const { target } = event;\n\n setLastName(target.value);\n }\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n signUp({ firstName, lastName });\n\n if (croppedFile) {\n uploadProfilePhoto({ file: croppedFile });\n }\n }\n\n return (\n
\n
\n
\n \n

{lang('YourName')}

\n

{lang('Login.Register.Desc')}

\n \n \n {isButtonShown && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authIsLoading', 'authError']),\n (setGlobal, actions): DispatchProps => pick(actions, ['signUp', 'clearAuthError', 'uploadProfilePhoto']),\n)(AuthRegister));\n","import React, {\n FC, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { TextPart } from '../common/helpers/renderMessageText';\n\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport trapFocus from '../../util/trapFocus';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string | TextPart[];\n className?: string;\n isOpen?: boolean;\n header?: any;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n};\n\ntype StateProps = {\n shouldSkipHistoryAnimations?: boolean;\n};\n\nconst Modal: FC = ({\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n shouldSkipHistoryAnimations,\n}) => {\n const {\n shouldRender,\n transitionClassNames,\n } = useShowTransition(\n isOpen, onCloseAnimationEnd, shouldSkipHistoryAnimations, undefined, shouldSkipHistoryAnimations,\n );\n // eslint-disable-next-line no-null/no-null\n const modalRef = useRef(null);\n\n useEffect(() => (isOpen\n ? captureKeyboardListeners({ onEsc: onClose, onEnter })\n : undefined), [isOpen, onClose, onEnter]);\n useEffect(() => (isOpen && modalRef.current ? trapFocus(modalRef.current) : undefined), [isOpen]);\n\n const { forceClose } = useHistoryBack(isOpen, onClose);\n\n // For modals that are closed by unmounting without changing `isOpen` to `false`\n useEffect(() => {\n return () => {\n if (isOpen) {\n forceClose();\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n document.body.classList.toggle('has-open-dialog', isOpen);\n\n if (isOpen || (!isOpen && prevIsOpen !== undefined)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n\n return () => {\n document.body.classList.remove('has-open-dialog');\n };\n }, [isOpen]);\n\n const lang = useLang();\n\n if (!shouldRender) {\n return undefined;\n }\n\n function renderHeader() {\n if (header) {\n return header;\n }\n\n if (!title) {\n return undefined;\n }\n\n return (\n
\n {hasCloseButton && (\n \n \n \n )}\n
{title}
\n
\n );\n }\n\n const fullClassName = buildClassName(\n 'Modal',\n className,\n transitionClassNames,\n noBackdrop && 'transparent-backdrop',\n );\n\n return (\n \n \n
\n
\n
\n {renderHeader()}\n
\n {children}\n
\n
\n
\n
\n
\n );\n};\n\nexport default Modal;\n","export default function trapFocus(element: HTMLElement) {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const focusableElements = Array.from(\n element.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\n ) as HTMLElement[];\n if (!focusableElements.length) {\n return;\n }\n\n const currentFocusedIndex = focusableElements.findIndex((em) => em.isSameNode(document.activeElement));\n let newFocusedIndex = 0;\n if (currentFocusedIndex >= 0) {\n if (e.shiftKey) {\n newFocusedIndex = currentFocusedIndex > 0\n ? currentFocusedIndex - 1\n : focusableElements.length - 1;\n } else {\n newFocusedIndex = currentFocusedIndex < focusableElements.length - 1\n ? currentFocusedIndex + 1\n : 0;\n }\n }\n\n focusableElements[newFocusedIndex].focus();\n }\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n}\n","import React, {\n FC, useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport useHeavyAnimationCheck from '../../hooks/useHeavyAnimationCheck';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\ntype OwnProps = {\n className?: string;\n id: string;\n animationData: AnyLiteral;\n play?: boolean | string;\n playSegment?: [number, number];\n speed?: number;\n noLoop?: boolean;\n size: number;\n quality?: number;\n isLowPriority?: boolean;\n onLoad?: NoneToVoidFunction;\n};\n\ntype RLottieClass = typeof import('../../lib/rlottie/RLottie').default;\ntype RLottieInstance = import('../../lib/rlottie/RLottie').default;\nlet lottiePromise: Promise;\nlet RLottie: RLottieClass;\n\n// Time supposed for judges to measure \"Transferred Size\" in Dev Tools\nconst LOTTIE_LOAD_DELAY = 5000;\n\nasync function ensureLottie() {\n if (!lottiePromise) {\n lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise;\n RLottie = (await lottiePromise as any).default;\n }\n\n return lottiePromise;\n}\n\nsetTimeout(ensureLottie, LOTTIE_LOAD_DELAY);\n\nconst AnimatedSticker: FC = ({\n className,\n id,\n animationData,\n play,\n playSegment,\n speed,\n noLoop,\n size,\n quality,\n isLowPriority,\n onLoad,\n}) => {\n const [animation, setAnimation] = useState();\n // eslint-disable-next-line no-null/no-null\n const container = useRef(null);\n const wasPlaying = useRef(false);\n const isFrozen = useRef(false);\n\n const playRef = useRef();\n playRef.current = play;\n const playSegmentRef = useRef<[number, number]>();\n playSegmentRef.current = playSegment;\n\n useEffect(() => {\n if (animation || !animationData) {\n return;\n }\n\n const exec = () => {\n if (!container.current) {\n return;\n }\n\n const newAnimation = new RLottie(\n id,\n container.current,\n animationData,\n {\n noLoop,\n size,\n quality,\n isLowPriority,\n },\n onLoad,\n );\n\n if (speed) {\n newAnimation.setSpeed(speed);\n }\n\n setAnimation(newAnimation);\n };\n\n if (RLottie) {\n exec();\n } else {\n ensureLottie().then(() => {\n fastRaf(() => {\n if (container.current) {\n exec();\n }\n });\n });\n }\n }, [animation, animationData, id, isLowPriority, noLoop, onLoad, quality, size, speed]);\n\n useEffect(() => {\n return () => {\n if (animation) {\n animation.destroy();\n }\n };\n }, [animation]);\n\n const playAnimation = useCallback((shouldRestart = false) => {\n if (animation && (playRef.current || playSegmentRef.current)) {\n if (playSegmentRef.current) {\n animation.playSegment(playSegmentRef.current);\n } else if (shouldRestart) {\n animation.goToAndPlay(0);\n } else {\n animation.play();\n }\n }\n }, [animation]);\n\n const pauseAnimation = useCallback(() => {\n if (!animation) {\n return;\n }\n\n animation.pause();\n }, [animation]);\n\n const freezeAnimation = useCallback(() => {\n isFrozen.current = true;\n\n if (!animation) {\n return;\n }\n\n if (!wasPlaying.current) {\n wasPlaying.current = animation.isPlaying();\n }\n\n pauseAnimation();\n }, [animation, pauseAnimation]);\n\n const unfreezeAnimation = useCallback(() => {\n if (wasPlaying.current) {\n playAnimation();\n }\n\n wasPlaying.current = false;\n isFrozen.current = false;\n }, [playAnimation]);\n\n const unfreezeAnimationOnRaf = useCallback(() => {\n fastRaf(unfreezeAnimation);\n }, [unfreezeAnimation]);\n\n useEffect(() => {\n if (!animation) {\n return;\n }\n\n if (play || playSegment) {\n if (isFrozen.current) {\n wasPlaying.current = true;\n } else {\n playAnimation(noLoop);\n }\n } else {\n // eslint-disable-next-line no-lonely-if\n if (isFrozen.current) {\n wasPlaying.current = false;\n } else {\n pauseAnimation();\n }\n }\n }, [animation, play, playSegment, noLoop, playAnimation, pauseAnimation]);\n\n useHeavyAnimationCheck(freezeAnimation, unfreezeAnimation);\n // Pausing frame may not happen in background\n // so we need to make sure it happens right after focusing,\n // then we can play again.\n useBackgroundMode(freezeAnimation, unfreezeAnimationOnRaf);\n\n const fullClassName = buildClassName('AnimatedSticker', className);\n\n const style = size ? `width: ${size}px; height: ${size}px;` : undefined;\n\n return (\n \n );\n};\n\nexport default memo(AnimatedSticker);\n","import { useEffect } from '../lib/teact/teact';\n\nexport default function useBackgroundMode(\n onBlur?: AnyToVoidFunction,\n onFocus?: AnyToVoidFunction,\n) {\n useEffect(() => {\n if (onBlur && !document.hasFocus()) {\n onBlur();\n }\n\n if (onBlur) {\n window.addEventListener('blur', onBlur);\n }\n\n if (onFocus) {\n window.addEventListener('focus', onFocus);\n }\n\n return () => {\n if (onFocus) {\n window.removeEventListener('focus', onFocus);\n }\n\n if (onBlur) {\n window.removeEventListener('blur', onBlur);\n }\n };\n }, [onBlur, onFocus]);\n}\n","import { FC, useRef, useLayoutEffect } from '../../lib/teact/teact';\nimport TeactDOM from '../../lib/teact/teact-dom';\n\ntype OwnProps = {\n containerId?: string;\n className?: string;\n children: any;\n};\n\nconst Portal: FC = ({ containerId, className, children }) => {\n const elementRef = useRef(document.createElement('div'));\n\n useLayoutEffect(() => {\n const container = document.querySelector(containerId || '#portals');\n if (!container) {\n return undefined;\n }\n\n const element = elementRef.current;\n if (className) {\n element.classList.add(className);\n }\n\n container.appendChild(element);\n\n return () => {\n TeactDOM.render(undefined, element);\n container.removeChild(element);\n };\n }, [className, containerId]);\n\n return TeactDOM.render(children, elementRef.current);\n};\n\nexport default Portal;\n","import { ApiMediaFormat } from '../../../api/types';\n\nimport * as mediaLoader from '../../../util/mediaLoader';\n\n// @ts-ignore\nimport MonkeyIdle from '../../../assets/TwoFactorSetupMonkeyIdle.tgs';\n// @ts-ignore\nimport MonkeyTracking from '../../../assets/TwoFactorSetupMonkeyTracking.tgs';\n// @ts-ignore\nimport MonkeyClose from '../../../assets/TwoFactorSetupMonkeyClose.tgs';\n// @ts-ignore\nimport MonkeyPeek from '../../../assets/TwoFactorSetupMonkeyPeek.tgs';\n// @ts-ignore\nimport FoldersAll from '../../../assets/FoldersAll.tgs';\n// @ts-ignore\nimport FoldersNew from '../../../assets/FoldersNew.tgs';\n// @ts-ignore\nimport DiscussionGroups from '../../../assets/DiscussionGroupsDucks.tgs';\n\nexport const ANIMATED_STICKERS_PATHS = {\n MonkeyIdle,\n MonkeyTracking,\n MonkeyClose,\n MonkeyPeek,\n FoldersAll,\n FoldersNew,\n DiscussionGroups,\n};\n\nexport default function getAnimationData(name: keyof typeof ANIMATED_STICKERS_PATHS) {\n const path = ANIMATED_STICKERS_PATHS[name].replace(window.location.origin, '');\n\n return mediaLoader.fetch(`file${path}`, ApiMediaFormat.Lottie);\n}\n","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab778dc8a3f0cd.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12e6248561fb58.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3ea19bef058241.tgs\";","export default __webpack_public_path__ + \"TwoFactorSetupMonkeyPeek.1905436b042520363d7e59f5d7f903ab.tgs\";","export default __webpack_public_path__ + \"FoldersAll.3f9f9e243d19f0fbf9aaaff11cbd4572.tgs\";","export default __webpack_public_path__ + \"FoldersNew.9a40d71c0c8be70f5bd14ff2d7bc1593.tgs\";","export default __webpack_public_path__ + \"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a992f8e587485.tgs\";","import React, {\n FC, useEffect, useState, memo,\n} from '../../lib/teact/teact';\n\nimport { DEBUG } from '../../config';\nimport { blobToFile, blobToDataUri } from '../../util/files';\nimport useLang from '../../hooks/useLang';\n\nimport Button from './Button';\nimport Modal from './Modal';\nimport Loading from './Loading';\n\nimport './CropModal.scss';\n\n// Change to 'base64' to get base64-encoded string\nconst cropperResultOptions: Croppie.ResultOptions & { type: 'blob' } = {\n type: 'blob',\n quality: 0.8,\n format: 'jpeg',\n circle: false,\n};\n\ntype ICroppie = typeof import('croppie');\nlet Croppie: ICroppie;\nlet croppiePromise: Promise<{ default: ICroppie }>;\n\nasync function ensureCroppie() {\n if (!croppiePromise) {\n croppiePromise = import('../../lib/croppie') as unknown as Promise<{ default: ICroppie }>;\n Croppie = (await croppiePromise).default;\n }\n\n return croppiePromise;\n}\n\nlet cropper: Croppie;\n\nasync function initCropper(imgFile: File) {\n try {\n const cropContainer = document.getElementById('avatar-crop');\n if (!cropContainer) {\n return;\n }\n\n const { offsetWidth, offsetHeight } = cropContainer;\n\n cropper = new Croppie(cropContainer, {\n enableZoom: true,\n boundary: {\n width: offsetWidth,\n height: offsetHeight,\n },\n viewport: {\n width: offsetWidth - 16,\n height: offsetHeight - 16,\n type: 'circle',\n },\n });\n\n const dataUri = await blobToDataUri(imgFile);\n await cropper.bind({ url: dataUri });\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n}\n\ntype OwnProps = {\n file?: File;\n onChange: (file: File) => void;\n onClose: () => void;\n};\n\nconst CropModal: FC = ({ file, onChange, onClose }: OwnProps) => {\n const [isCroppieReady, setIsCroppieReady] = useState(false);\n\n useEffect(() => {\n if (!file) {\n return;\n }\n\n if (!isCroppieReady) {\n ensureCroppie().then(() => setIsCroppieReady(true));\n\n return;\n }\n\n initCropper(file);\n }, [file, isCroppieReady]);\n\n const lang = useLang();\n\n async function handleCropClick() {\n if (!cropper) {\n return;\n }\n\n const result: Blob | string = await cropper.result(cropperResultOptions);\n const croppedImg = typeof result === 'string' ? result : blobToFile(result, 'avatar.jpg');\n\n onChange(croppedImg);\n }\n\n return (\n \n {isCroppieReady ? (\n
\n ) : (\n \n )}\n \n \n \n \n );\n};\n\nexport default memo(CropModal);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport CropModal from './CropModal';\n\nimport './AvatarEditable.scss';\n\ninterface OwnProps {\n title?: string;\n disabled?: boolean;\n currentAvatarBlobUrl?: string;\n onChange: (file: File) => void;\n}\n\nconst AvatarEditable: FC = ({\n title = 'Change your profile picture',\n disabled,\n currentAvatarBlobUrl,\n onChange,\n}) => {\n const [selectedFile, setSelectedFile] = useState();\n const [croppedBlobUrl, setCroppedBlobUrl] = useState(currentAvatarBlobUrl);\n\n useEffect(() => {\n setCroppedBlobUrl(currentAvatarBlobUrl);\n }, [currentAvatarBlobUrl]);\n\n function handleSelectFile(event: ChangeEvent) {\n const target = event.target as HTMLInputElement;\n\n if (!target || !target.files || !target.files[0]) {\n return;\n }\n\n setSelectedFile(target.files[0]);\n target.value = '';\n }\n\n function handleAvatarCrop(croppedImg: File) {\n setSelectedFile(undefined);\n onChange(croppedImg);\n\n if (croppedBlobUrl) {\n URL.revokeObjectURL(croppedBlobUrl);\n }\n setCroppedBlobUrl(URL.createObjectURL(croppedImg));\n }\n\n function handleModalClose() {\n setSelectedFile(undefined);\n }\n\n const labelClassName = buildClassName(\n croppedBlobUrl && 'filled',\n disabled && 'disabled',\n );\n\n return (\n
\n \n \n \n {croppedBlobUrl && \"Avatar\"}\n \n \n
\n );\n};\n\nexport default memo(AvatarEditable);\n","import React, {\n FC, useState, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\n\nimport { STICKER_SIZE_AUTH, STICKER_SIZE_AUTH_MOBILE, STICKER_SIZE_TWO_FA } from '../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport getAnimationData from './helpers/animatedAssets';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './PasswordMonkey.scss';\n\ntype OwnProps = {\n isPasswordVisible: boolean;\n isBig?: boolean;\n};\n\nconst PEEK_MONKEY_SHOW_DELAY = 2000;\nconst SEGMENT_COVER_EYES: [number, number] = [0, 50];\nconst SEGMENT_UNCOVER_EYE: [number, number] = [0, 20];\nconst SEGMENT_COVER_EYE: [number, number] = [20, 0];\nconst STICKER_SIZE = IS_SINGLE_COLUMN_LAYOUT ? STICKER_SIZE_AUTH_MOBILE : STICKER_SIZE_AUTH;\n\nconst PasswordMonkey: FC = ({ isPasswordVisible, isBig }) => {\n const [closeMonkeyData, setCloseMonkeyData] = useState>();\n const [peekMonkeyData, setPeekMonkeyData] = useState>();\n const [isFirstMonkeyLoaded, setIsFirstMonkeyLoaded] = useState(false);\n const [isPeekShown, setIsPeekShown] = useState(false);\n\n useEffect(() => {\n if (!closeMonkeyData) {\n getAnimationData('MonkeyClose').then(setCloseMonkeyData);\n } else {\n setTimeout(() => setIsPeekShown(true), PEEK_MONKEY_SHOW_DELAY);\n }\n }, [closeMonkeyData]);\n\n useEffect(() => {\n if (!peekMonkeyData) {\n getAnimationData('MonkeyPeek').then(setPeekMonkeyData);\n }\n }, [peekMonkeyData]);\n\n const handleFirstMonkeyLoad = useCallback(() => setIsFirstMonkeyLoaded(true), []);\n\n return (\n
\n {!isFirstMonkeyLoaded && (\n
\n )}\n {closeMonkeyData && (\n \n )}\n {peekMonkeyData && (\n \n )}\n
\n );\n};\n\nexport default memo(PasswordMonkey);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\n\nimport { MIN_PASSWORD_LENGTH } from '../../config';\nimport { IS_TOUCH_ENV, IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\n\ntype OwnProps = {\n submitLabel?: string;\n error?: string;\n hint?: string;\n placeholder?: string;\n isLoading?: boolean;\n isPasswordVisible?: boolean;\n clearError: NoneToVoidFunction;\n onChangePasswordVisibility: (state: boolean) => void;\n onInputChange?: (password: string) => void;\n onSubmit: (password: string) => void;\n};\n\nconst FOCUS_DELAY_TIMEOUT_MS = IS_SINGLE_COLUMN_LAYOUT ? 550 : 400;\n\nconst PasswordForm: FC = ({\n isLoading = false,\n isPasswordVisible,\n error,\n hint,\n placeholder = 'Password',\n submitLabel = 'Next',\n clearError,\n onChangePasswordVisibility,\n onInputChange,\n onSubmit,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const lang = useLang();\n\n const [password, setPassword] = useState('');\n const [canSubmit, setCanSubmit] = useState(false);\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n setTimeout(() => {\n inputRef.current!.focus();\n }, FOCUS_DELAY_TIMEOUT_MS);\n }\n }, []);\n\n useEffect(() => {\n if (error) {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n inputRef.current!.select();\n });\n }\n }, [error]);\n\n function onPasswordChange(e: ChangeEvent) {\n if (error) {\n clearError();\n }\n\n const { target } = e;\n setPassword(target.value);\n setCanSubmit(target.value.length >= MIN_PASSWORD_LENGTH);\n if (onInputChange) {\n onInputChange(target.value);\n }\n }\n\n function togglePasswordVisibility() {\n onChangePasswordVisibility(!isPasswordVisible);\n }\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (isLoading) {\n return;\n }\n\n if (canSubmit) {\n onSubmit(password);\n }\n }\n\n return (\n
\n \n \n \n \n \n
\n
\n {canSubmit && (\n \n )}\n \n );\n};\n\nexport default memo(PasswordForm);\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/5aa1e598c74b078112d5.worker.js.map b/dist/5aa1e598c74b078112d5.worker.js.map deleted file mode 100644 index 08a0981a1..000000000 --- a/dist/5aa1e598c74b078112d5.worker.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/gramjs/index.js","webpack:///./src/util/cacheApi.ts","webpack:///./src/api/gramjs/methods/media.ts","webpack:///./src/api/gramjs/methods/client.ts","webpack:///./src/api/gramjs/gramjsBuilders/index.ts","webpack:///./src/api/gramjs/apiBuilders/peers.ts","webpack:///./src/api/gramjs/apiBuilders/chats.ts","webpack:///./src/config.ts","webpack:///./src/api/gramjs/localDb.ts","webpack:///./src/lib/gramjs/tl/api.js","webpack:///./src/api/gramjs/methods/chats.ts","webpack:///./src/lib/gramjs/Helpers.js","webpack:///./src/components/middle/helpers/getCurrencySign.ts","webpack:///./src/api/gramjs/apiBuilders/messages.ts","webpack:///./node_modules/node-libs-browser/node_modules/buffer/index.js","webpack:///./src/api/gramjs/methods/messages.ts","webpack:///./src/api/gramjs/apiBuilders/users.ts","webpack:///./src/api/types/index.ts","webpack:///./src/util/iteratees.ts","webpack:///./node_modules/big-integer/BigInteger.js","webpack:///./src/lib/gramjs/errors/index.js","webpack:///./src/api/gramjs/helpers.ts","webpack:///./src/api/gramjs/methods/auth.ts","webpack:///./src/api/gramjs/apiBuilders/pathBytesToSvg.ts","webpack:///./src/api/gramjs/apiBuilders/common.ts","webpack:///./src/api/gramjs/apiBuilders/helpers.ts","webpack:///./src/lib/gramjs/Utils.js","webpack:///./src/api/gramjs/apiBuilders/symbols.ts","webpack:///./src/api/gramjs/apiBuilders/misc.ts","webpack:///./src/lib/gramjs/tl/index.js","webpack:///./src/lib/gramjs/errors/Common.js","webpack:///./src/lib/gramjs/extensions/BinaryReader.js","webpack:///./src/api/gramjs/methods/bots.ts","webpack:///./src/api/gramjs/updater.ts","webpack:///./src/lib/gramjs/sessions/Memory.js","webpack:///./src/lib/gramjs/crypto/AuthKey.js","webpack:///./src/util/schedulers.ts","webpack:///./src/lib/gramjs/Password.js","webpack:///./src/lib/gramjs/tl/core/GZIPPacked.js","webpack:///./src/util/waveform.ts","webpack:///./src/util/files.ts","webpack:///./src/lib/gramjs/crypto/crypto.js","webpack:///./src/lib/gramjs/errors/RPCBaseErrors.js","webpack:///./src/lib/gramjs/tl/core/TLMessage.js","webpack:///./src/lib/gramjs/tl/core/MessageContainer.js","webpack:///./src/lib/gramjs/network/connection/Connection.js","webpack:///./src/lib/gramjs/sessions/StorageSession.js","webpack:///./node_modules/pako/dist/pako_inflate.js","webpack:///./src/lib/gramjs/extensions/index.js","webpack:///./src/api/gramjs/apiBuilders/bots.ts","webpack:///(webpack)/buildin/global.js","webpack:///./src/lib/gramjs/tl/generationHelpers.js","webpack:///./node_modules/@cryptography/aes/dist/es/aes.js","webpack:///./src/lib/gramjs/extensions/Logger.js","webpack:///./src/lib/gramjs/errors/RPCErrorList.js","webpack:///./src/lib/gramjs/sessions/Abstract.js","webpack:///./src/lib/gramjs/tl/AllTLObjects.js","webpack:///./src/lib/gramjs/network/MTProtoSender.js","webpack:///./src/lib/gramjs/network/MTProtoPlainSender.js","webpack:///./src/lib/gramjs/network/MTProtoState.js","webpack:///./src/lib/gramjs/crypto/IGE.js","webpack:///./src/lib/gramjs/tl/core/index.js","webpack:///./src/lib/gramjs/tl/core/RPCResult.js","webpack:///./src/lib/gramjs/extensions/MessagePacker.js","webpack:///./src/lib/gramjs/extensions/BinaryWriter.js","webpack:///./src/lib/gramjs/network/index.js","webpack:///./src/lib/gramjs/extensions/PromisedWebSockets.js","webpack:///./src/lib/gramjs/extensions/AsyncQueue.js","webpack:///./src/lib/gramjs/network/connection/TCPAbridged.js","webpack:///./src/lib/gramjs/network/connection/TCPObfuscated.js","webpack:///./src/api/types/messages.ts","webpack:///./src/api/types/media.ts","webpack:///./src/lib/gramjs/crypto/RSA.ts","webpack:///./node_modules/base64-js/index.js","webpack:///./node_modules/ieee754/index.js","webpack:///./node_modules/isarray/index.js","webpack:///(webpack)/buildin/module.js","webpack:///./src/lib/gramjs/crypto/converters.ts","webpack:///./src/lib/gramjs/crypto/words.ts","webpack:///./src/lib/gramjs/tl/apiTl.js","webpack:///./src/lib/gramjs/tl/schemaTl.js","webpack:///./src/lib/gramjs/client/TelegramClient.js","webpack:///./node_modules/os-browserify/browser.js","webpack:///./node_modules/process/browser.js","webpack:///./src/lib/gramjs/network/Authenticator.ts","webpack:///./src/lib/gramjs/crypto/Factorizator.js","webpack:///./src/lib/gramjs/network/RequestState.js","webpack:///./src/lib/gramjs/network/connection/index.js","webpack:///./node_modules/async-mutex/lib/index.js","webpack:///./node_modules/async-mutex/lib/Mutex.js","webpack:///./node_modules/websocket/lib/browser.js","webpack:///./node_modules/websocket/lib/version.js","webpack:///./src/lib/gramjs/crypto/CTR.js","webpack:///./src/lib/gramjs/client/auth.ts","webpack:///./src/lib/gramjs/client/downloadFile.ts","webpack:///./src/lib/gramjs/client/uploadFile.ts","webpack:///./src/lib/gramjs/client/2fa.ts","webpack:///./src/lib/gramjs/Version.js","webpack:///./src/lib/gramjs/events/index.js","webpack:///./src/lib/gramjs/events/Raw.js","webpack:///./src/lib/gramjs/events/common.js","webpack:///./src/lib/gramjs/sessions/index.js","webpack:///./src/lib/gramjs/sessions/StringSession.js","webpack:///./src/lib/gramjs/sessions/CacheApiSession.js","webpack:///./src/lib/gramjs/sessions/LocalStorageSession.js","webpack:///./src/lib/gramjs/sessions/IdbSession.js","webpack:///./node_modules/idb-keyval/dist/esm/index.js","webpack:///./src/lib/gramjs/sessions/CallbackSession.js","webpack:///./src/api/gramjs/methods/users.ts","webpack:///./src/api/gramjs/methods/symbols.ts","webpack:///./src/api/gramjs/methods/management.ts","webpack:///./src/api/gramjs/methods/twoFaSettings.ts","webpack:///./src/api/gramjs/methods/settings.ts","webpack:///./src/api/gramjs/apiBuilders/payments.ts","webpack:///./src/api/gramjs/methods/payments.ts","webpack:///./src/api/gramjs/provider.ts","webpack:///./src/api/gramjs/worker/worker.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Api","require","TelegramClient","connection","tl","version","events","utils","errors","sessions","extensions","helpers","cacheApi","self","caches","Type","async","fetch","cacheName","type","request","Request","replace","cache","open","response","match","Text","text","Blob","blob","substr","contentType","headers","Json","json","err","console","warn","save","data","cacheData","JSON","stringify","Response","put","clear","delete","MEDIA_ENTITY_TYPES","Set","downloadMedia","url","mediaFormat","start","end","client","isConnected","onProgress","mimeType","fullSize","mediaMatch","startsWith","arrayBuffer","Promise","reject","Error","entityType","entityId","sizeType","undefined","entity","getEntityTypeById","Number","Math","abs","localDb","chats","users","messages","documents","photos","stickerSets","webDocuments","has","ApiMediaFormat","Stream","acceptsBuffer","progressCallback","workers","DOWNLOAD_WORKERS","GramJs","Message","message","media","MessageMediaPhoto","MessageMediaDocument","document","Document","attributes","some","a","DocumentAttributeSticker","MessageMediaWebPage","webpage","WebPage","getMessageMediaMimeType","size","Photo","downloadStickerSetThumb","Lottie","getMimeType","downloadProfilePhoto","download","parsed","DataUri","blobToDataUri","BlobUrl","inflate","to","parse","Progressive","buffer","parseMedia","canCache","MEDIA_CACHE_MAX_BYTES","MEDIA_CACHE_DISABLED","MEDIA_CACHE_NAME_AVATARS","MEDIA_CACHE_NAME","prepared","mediaData","URL","createObjectURL","prepareMedia","fallbackMimeType","length","subarray","reduce","result","byte","toString","GramJsLogger","setLevel","DEBUG_GRAMJS","gramJsUpdateEventBuilder","build","update","onUpdate","init","_onUpdate","initialArgs","DEBUG","log","userAgent","platform","sessionData","session","CallbackSession","onSessionUpdate","process","deviceModel","navigator","appVersion","APP_VERSION","useWSS","additionalDcsDisabled","IS_TEST","addEventHandler","handleGramJsUpdate","updater","phoneNumber","onRequestPhoneNumber","phoneCode","onRequestCode","password","onRequestPassword","firstAndLastNames","onRequestRegistration","qrCode","onRequestQrCode","onError","onAuthError","initialMethod","connectionState","invoke","invokeRequest","onAuthReady","getSessionData","fetchCurrentUser","destroy","auth","LogOut","disconnect","getClient","UpdateConnectionState","state","connected","UpdatesTooLong","GetFullUser","id","InputUserSelf","handleTerminatedSession","UpdateServerTimeOffset","serverTimeOffset","timeOffset","shouldHandleUpdates","shouldThrow","className","updatesContainer","Updates","UpdatesCombined","updates","entities","forEach","_entities","injectUpdateEntities","error","isSlowMode","SendMessage","SendMedia","SendMultiMedia","hasErrorKey","dispatchErrorUpdate","args","downloadMediaWithClient","uploadFile","file","UPLOAD_WORKERS","updateTwoFaSettings","params","userFull","user","User","currentUser","buildApiUserFromFull","setMessageBuilderCurrentUserId","onCurrentUserUpdate","chatOrUserId","buildPeer","PeerUser","userId","PeerChannel","channelId","PeerChat","chatId","buildInputPeer","accessHash","InputPeerUser","BigInt","InputPeerChannel","InputPeerChat","buildInputPeerFromLocalDb","buildInputEntity","InputUser","InputChannel","buildInputStickerSet","InputStickerSetID","buildInputDocument","InputDocument","pick","buildInputMediaDocument","inputDocument","InputMediaDocument","buildInputPoll","pollParams","randomId","summary","quiz","poll","Poll","publicVoters","isPublic","question","answers","map","option","PollAnswer","Buffer","from","multipleChoice","InputMediaPoll","correctAnswers","solution","solutionEntities","buildMtpMessageEntity","buildFilterFromApiFolder","folder","emoticon","contacts","nonContacts","groups","channels","bots","excludeArchived","excludeMuted","excludeRead","pinnedChatIds","includedChatIds","excludedChatIds","pinnedPeers","filter","Boolean","includePeers","excludePeers","DialogFilter","title","broadcasts","generateRandomBigInt","readBigIntFromBuffer","generateRandomBytes","buildMessageFromUpdate","peerId","fromId","offset","ApiMessageEntityTypes","Bold","MessageEntityBold","Italic","MessageEntityItalic","Underline","MessageEntityUnderline","Strike","MessageEntityStrike","Code","MessageEntityCode","Pre","MessageEntityPre","language","Blockquote","MessageEntityBlockquote","TextUrl","MessageEntityTextUrl","Url","MessageEntityUrl","Hashtag","MessageEntityHashtag","MentionName","InputMessageEntityMentionName","MessageEntityUnknown","calculateResultHash","ids","hash","isMessageWithMedia","photo","isServiceMessageWithMedia","action","buildChatPhotoForLocalDb","PhotoEmpty","ChatPhotoEmpty","dcId","photoId","ChatPhoto","buildInputContact","phone","firstName","lastName","InputPhoneContact","clientId","buildChatBannedRights","bannedRights","untilDate","ChatBannedRights","buildChatAdminRights","adminRights","ChatAdminRights","buildShippingInfo","info","shippingAddress","PaymentRequestedInfo","PostAddress","buildInputPrivacyKey","privacyKey","InputPrivacyKeyPhoneNumber","InputPrivacyKeyStatusTimestamp","InputPrivacyKeyProfilePhoto","InputPrivacyKeyForwards","InputPrivacyKeyChatInvite","buildInputReportReason","reason","InputReportReasonSpam","InputReportReasonViolence","InputReportReasonChildAbuse","InputReportReasonPornography","InputReportReasonCopyright","InputReportReasonFake","InputReportReasonGeoIrrelevant","InputReportReasonOther","isPeerUser","peer","isPeerChat","buildApiChatFieldsFromPeerEntity","peerEntity","isSupport","isMin","min","String","avatarHash","buildAvatarHash","isSignaturesShown","signatures","hasPrivateLink","hasLink","Channel","username","isVerified","verified","isCallActive","callActive","isCallNotEmpty","callNotEmpty","Chat","participantsCount","membersCount","joinDate","date","buildApiChatPermissions","isCreator","creator","buildApiChatRestrictions","buildApiChatMigrationInfo","buildApiChatFromDialog","dialog","folderId","unreadMark","unreadCount","unreadMentionsCount","notifySettings","silent","muteUntil","readOutboxMaxId","readInboxMaxId","draft","isMuted","Date","now","getApiChatIdFromMtpPeer","getApiChatTypeFromPeerEntity","getApiChatTitleFromMtpPeer","lastReadOutboxMessageId","lastReadInboxMessageId","hasUnreadMark","DraftMessage","draftDate","omitVirtualClassFields","currentUserBannedRights","defaultBannedRights","ChatForbidden","ChannelForbidden","isRestricted","restrictions","restrictionReason","restricted","restrictionReasons","targetReason","find","buildApiChatRestrictionReason","assign","isNotJoined","left","kicked","migratedTo","InputChannelEmpty","buildApiChatFromPreview","preview","withForbidden","getUserName","getApiChatIdFromInputMtpPeer","isInputPeerUser","isInputPeerChat","isInputPeerChannel","UserEmpty","ChatEmpty","megagroup","getPeerKey","buildChatMember","member","ChannelParticipantBanned","ChannelParticipantLeft","inviterId","joinedDate","kickedByUserId","kickedBy","promotedByUserId","promotedBy","customTitle","rank","ChannelParticipantAdmin","ChatParticipantAdmin","isAdmin","ChannelParticipantCreator","ChatParticipantCreator","isOwner","buildChatMembers","participants","ChatParticipants","ChannelParticipants","buildChatTypingStatus","SendMessageCancelAction","SendMessageTypingAction","SendMessageRecordVideoAction","SendMessageUploadVideoAction","SendMessageRecordAudioAction","SendMessageUploadAudioAction","SendMessageUploadPhotoAction","SendMessageUploadDocumentAction","SendMessageGeoLocationAction","SendMessageChooseContactAction","SendMessageGamePlayAction","SendMessageRecordRoundAction","SendMessageUploadRoundAction","UpdateUserTyping","timestamp","buildApiChatFolder","pickTruthy","buildApiChatFolderFromSuggested","description","MEMBERS_LOAD_SLICE","window","innerHeight","PINNED_MESSAGES_LIMIT","BLOCKED_LIST_LIMIT","PROFILE_PHOTOS_LIMIT","LOCAL_MESSAGE_ID_BASE","API_UPDATE_THROTTLE","round","API_THROTTLE_RESET_UPDATES","RECENT_STICKERS_LIMIT","MEMOJI_STICKER_ID","SERVICE_NOTIFICATIONS_USER_ID","ALL_FOLDER_ID","ARCHIVED_FOLDER_ID","DELETED_COMMENTS_CHANNEL_ID","DEFAULT_LANG_PACK","localMessages","parseTl","serializeBytes","serializeDate","toSignedLittleBuffer","tlContent","schemeContent","CACHING_SUPPORTED","localStorage","extractParams","fileContent","f","constructors","functions","isFunction","push","argToBytes","x","alloc","writeInt32LE","writeDoubleLE","getBytes","getArgFromReader","reader","arg","isVector","useVectorId","readInt","temp","len","flagIndicator","readLong","readLargeInt","readDouble","tgReadString","tgReadBool","tgReadBytes","tgReadDate","skipConstructorId","tgReadObject","createClasses","classesType","classes","classParams","constructorId","subclassOfId","argsConfig","namespace","fullName","join","VirtualClass","constructor","keys","argName","this","isFlag","flags","flagIndex","idForBytes","CONSTRUCTOR_ID","writeUInt32LE","buffers","concat","values","flagCalculate","boxed","charAt","indexOf","toUpperCase","shift","readResult","definitions","fromCache","jsonCache","getItem","loadFromCache","constructorParamsApi","functionParamsApi","constructorParamsSchema","functionParamsSchema","requests","loadFromTlSchemas","setItem","obj1","obj2","mergeWithNamespaces","buildApiFromTlSchema","fetchChats","limit","offsetDate","archived","withPinned","GetDialogs","offsetPeer","InputPeerEmpty","excludePinned","resultPinned","GetPinnedDialogs","DialogsNotModified","updateLocalDb","lastMessagesByChatId","buildCollectionByKey","buildApiMessage","peersByKey","preparePeers","draftsById","replyingToById","dialogs","orderedPinnedIds","Dialog","chat","lastMessage","isListed","pinned","formattedText","replyingToId","buildMessageDraft","buildApiUser","chatIds","totalChatCount","DialogsSlice","count","fetchFullChat","GetFullChannel","channel","fullChat","ChannelFull","about","onlineCount","exportedInvite","slowmodeSeconds","slowmodeNextSendDate","migratedFromChatId","migratedFromMaxId","canViewParticipants","linkedChatId","hiddenPrehistory","inviteLink","ChatInviteExported","link","members","fetchMembers","kickedMembers","bannedUsers","adminMembers","adminUsers","fullInfo","slowMode","seconds","nextSendDate","migratedFrom","maxMessageId","canViewMembers","isPreHistoryHidden","groupCallId","getFullChannelInfo","GetFullChat","ChatFull","getFullChatInfo","searchChats","query","Search","q","localPeerIds","myResults","allChats","allUsers","isSelf","localChats","includes","localUsers","u","globalChats","globalUsers","fetchChat","mtpUser","GetUsers","help","GetSupport","requestChatUpdate","GetPeerDialogs","peers","InputDialogPeer","saveDraft","replyToMsgId","SaveDraft","clearDraft","updateChatMutedState","account","UpdateNotifySettings","InputNotifyPeer","settings","InputPeerNotifySettings","createChannel","CreateChannel","broadcast","newChannel","InviteToChannel","joinChannel","JoinChannel","deleteChatUser","DeleteChatUser","deleteChat","DeleteChat","leaveChannel","LeaveChannel","deleteChannel","DeleteChannel","createGroupChat","CreateChat","newChat","editChatPhoto","uploadedPhoto","inputEntity","EditPhoto","InputChatUploadedPhoto","EditChatPhoto","toggleChatPinned","shouldBePinned","ToggleDialogPin","isPinned","toggleChatArchived","folders","EditPeerFolders","folderPeers","InputFolderPeer","fetchChatFolders","GetDialogFilters","byId","orderedIds","fetchRecommendedChatFolders","results","GetSuggestedDialogFilters","editChatFolder","folderUpdate","UpdateDialogFilter","deleteChatFolder","isActionSuccessful","recommendedChatFolders","toggleDialogUnread","MarkDialogUnread","unread","getChatByUsername","ResolveUsername","togglePreHistoryHidden","isEnabled","TogglePreHistoryHidden","enabled","updateChatDefaultBannedRights","EditChatDefaultBannedRights","updateChatMemberBannedRights","participant","EditBanned","updateChatAdmin","EditAdmin","updateChatTitle","EditTitle","EditChatTitle","updateChatAbout","EditChatAbout","toggleSignatures","ToggleSignatures","memberFilter","ChannelParticipantsKicked","ChannelParticipantsAdmins","ChannelParticipantsRecent","GetParticipants","ChannelParticipantsNotModified","fetchGroupsForDiscussion","GetGroupsForDiscussion","setDiscussionGroup","SetDiscussionGroup","group","migrateChat","MigrateChat","openChatByInvite","CheckChatInvite","ChatInvite","isChannel","addChatMembers","all","AddChatUser","deleteChatMember","viewMessages","sendMessages","sendMedia","sendStickers","sendGifs","sendGames","sendInline","embedLinks","sendPolls","changeInfo","inviteUsers","pinMessages","store","addMessageToLocalDb","importChatInvite","ImportChatInvite","crypto","little","signed","randBuffer","bytesNumber","reverse","bigInt","floor","subtract","pow","big","number","bigNumber","byteArray","shiftRight","and","readBufferFromBigInt","bitLength","ceil","lesser","below","hex","padStart","reminder","randomBytes","sha1","shaSum","createHash","digest","crcTable","generateRandomLong","mod","crc32","buf","k","makeCRCTable","isBuffer","crc","index","generateKeyDataFromNonce","serverNonce","newNonce","hash1","hash2","hash3","slice","iv","sha256","bigIntMod","remainder","add","modExp","b","one","greater","zero","leastSignificantBit","divide","eq","multiply","getRandomInt","max","random","sleep","ms","resolve","setTimeout","getByteArray","integer","bits","byteLength","convertToLittle","correct","writeUInt32BE","bufferXor","res","createDeferred","promise","_resolve","CURRENCIES","USD","EUR","GBP","JPY","RUB","UAH","INR","AED","getCurrencySign","currency","currentUserId","localMessageCounter","_currentUserId","mtpMessage","resolveMessageApiChatId","MessageService","buildApiMessageWithChatId","buildApiMessageFromShort","out","buildApiMessageFromShortChat","buildApiMessageFromNotification","notification","currentDate","localId","content","buildMessageMediaContent","sticker","contact","buildMessageTextContent","inboxDate","isOutgoing","isChatWithSelf","post","fwdFrom","senderId","isChannelPost","MessageActionEmpty","translationValues","targetUserIds","targetChatId","MessageActionChatCreate","MessageActionChatEditTitle","MessageActionChatEditPhoto","MessageActionChatDeletePhoto","MessageActionChatAddUser","MessageActionChatDeleteUser","MessageActionChatJoinedByLink","MessageActionChannelCreate","MessageActionChatMigrateTo","MessageActionChannelMigrateFrom","MessageActionPinMessage","MessageActionHistoryClear","MessageActionPhoneCall","withDuration","duration","video","mins","MessageActionContactSignUp","MessageActionPaymentSent","currencySign","amount","totalAmount","toFixed","MessageActionGroupCall","MessageActionBotAllowed","domain","addPhotoToLocalDb","buildApiPhoto","buildAction","replyToTopId","replyTo","isEdited","editDate","editHide","inlineButtons","keyboardButtons","messageId","replyMarkup","ReplyKeyboardMarkup","ReplyInlineMarkup","markup","rows","buttons","button","KeyboardButton","KeyboardButtonUrl","KeyboardButtonCallback","KeyboardButtonRequestPoll","KeyboardButtonBuy","MessageMediaInvoice","receiptMsgId","buildReplyButtons","forwardInfo","savedFromPeerId","savedFromPeer","channelPost","isLinkedChannelPost","fromChatId","fromMessageId","savedFromMsgId","senderUserId","hiddenUserName","fromName","adminTitle","postAuthor","buildApiMessageForwardInfo","replies","mediaUnread","isMediaUnread","groupedId","isInAlbum","audio","shouldHideKeyboardButtons","ReplyKeyboardHide","views","isFromScheduled","fromScheduled","replyToMessageId","replyToTopMessageId","mentioned","hasUnreadMention","viaBotId","comments","threadInfo","buildThreadInfo","buildApiMessageEntity","DraftMessageEmpty","buildStickerFromDocument","buildSticker","ttlSeconds","buildPhoto","buildVideoFromDocument","buildVideo","audioAttribute","attr","DocumentAttributeAudio","voice","fileName","getFilenameFromDocument","buildAudio","waveform","Array","buildVoice","buildApiDocument","buildDocumentFromMedia","MessageMediaContact","buildContact","MessageMediaPoll","buildPoll","buildPollFromMedia","webPage","buildWebPage","invoice","test","photoUrl","buildInvoice","buildInvoiceFromMedia","DocumentEmpty","thumbs","videoAttr","DocumentAttributeVideo","gifAttr","DocumentAttributeAnimated","w","width","h","height","supportsStreaming","roundMessage","isRound","isGif","thumbnail","buildApiThumbnailFromStripped","mediaType","mediaSize","photoSize","PhotoSize","imageAttribute","DocumentAttributeImageSize","pollResults","rawAnswers","answer","fromCharCode","buildPollResults","rawResults","totalVoters","recentVoters","recentVoterIds","chosen","voters","isChosen","isCorrect","votersCount","defaultBase","filenameAttribute","DocumentAttributeFilename","extension","split","buildLocalMessage","replyingTo","attachment","gif","scheduledAt","filename","blobUrl","previewBlobUrl","quick","sizes","dataUri","inputWaveform","interpolateArray","buildUploadingMedia","buildNewPoll","isScheduled","buildForwardedMessage","toChat","isAudio","asIncomingInChatWithSelf","sendingState","messageReplies","maxId","readMaxId","recentRepliers","threadId","originChannelId","messagesCount","lastMessageId","recentReplierIds","base64","ieee754","isArray","kMaxLength","TYPED_ARRAY_SUPPORT","createBuffer","that","RangeError","Uint8Array","__proto__","encodingOrOffset","allocUnsafe","TypeError","ArrayBuffer","array","byteOffset","fromArrayLike","fromArrayBuffer","string","encoding","isEncoding","actual","write","fromString","obj","checked","copy","val","fromObject","assertSize","isView","loweredCase","utf8ToBytes","base64ToBytes","toLowerCase","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","bidirectionalIndexOf","dir","isNaN","arrayIndexOf","lastIndexOf","arr","indexSize","arrLength","valLength","read","readUInt16BE","foundIndex","found","j","hexWrite","remaining","strLen","parseInt","utf8Write","blitBuffer","asciiWrite","str","charCodeAt","asciiToBytes","latin1Write","base64Write","ucs2Write","units","hi","lo","utf16leToBytes","fromByteArray","secondByte","thirdByte","fourthByte","tempCodePoint","firstByte","codePoint","bytesPerSequence","codePoints","apply","decodeCodePointsArray","SlowBuffer","INSPECT_MAX_BYTES","global","foo","e","typedArraySupport","poolSize","_augment","species","configurable","fill","allocUnsafeSlow","_isBuffer","compare","y","list","pos","swap16","swap32","swap64","arguments","equals","inspect","target","thisStart","thisEnd","thisCopy","targetCopy","isFinite","toJSON","_arr","ret","toHex","bytes","checkOffset","ext","checkInt","objectWriteUInt16","littleEndian","objectWriteUInt32","checkIEEE754","writeFloat","noAssert","writeDouble","newBuf","sliceLen","readUIntLE","mul","readUIntBE","readUInt8","readUInt16LE","readUInt32LE","readUInt32BE","readIntLE","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUIntLE","writeUIntBE","writeUInt8","writeUInt16LE","writeUInt16BE","writeIntLE","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32BE","writeFloatLE","writeFloatBE","writeDoubleBE","targetStart","set","code","INVALID_BASE64_RE","Infinity","leadSurrogate","toByteArray","trim","stringtrim","base64clean","src","dst","fetchMessages","pagination","RequestClass","MAIN_THREAD_ID","GetHistory","GetReplies","msgId","MessagesNotModified","threadInfos","fetchMessage","GetMessages","InputMessageID","MessageEmpty","MESSAGE_DELETED","queue","sendMessage","isSilent","noWebPage","localMessage","groupIndex","groupedUploads","counter","singleMediaByIndex","prevQueue","uploadMedia","inputMedia","uploadedMedia","messageMedia","UploadMedia","fileReference","InputMediaPhoto","InputPhoto","fetchInputMedia","InputSingleMedia","multiMedia","scheduleDate","sendGroupedMedia","noWebpage","editMessage","messageUpdate","mtpEntities","EditMessage","rescheduleMessage","fetchFile","patchedOnProgress","progress","isCanceled","inputFile","InputMediaUploadedPhoto","InputMediaUploadedDocument","pinMessage","isUnpin","isOneSide","UpdatePinnedMessage","unpin","pmOneside","unpinAllMessages","UnpinAllMessages","deleteMessages","messageIds","shouldDeleteForAll","DeleteMessages","revoke","deleteScheduledMessages","DeleteScheduledMessages","deleteHistory","DeleteHistory","just_clear","reportMessages","Report","markMessageListRead","ReadHistory","ReadDiscussion","requestThreadInfoUpdate","markMessagesRead","ReadMessageContents","topMessageResult","repliesResult","GetDiscussionMessage","offsetId","addOffset","discussionChatId","topMessageId","ChannelMessages","firstMessageId","noTopChatsRequest","searchMessagesLocal","chatOrUser","minDate","maxDate","InputMessagesFilterPhotoVideo","InputMessagesFilterDocument","InputMessagesFilterUrl","InputMessagesFilterMusic","InputMessagesFilterVoice","InputMessagesFilterChatPhotos","InputMessagesFilterEmpty","topMsgId","nextOffsetId","totalCount","MessagesSlice","searchMessagesGlobal","offsetRate","SearchGlobal","nextRate","fetchWebPagePreview","GetWebPagePreview","sendPollVote","options","SendVote","loadPollOptionResults","shouldResetVoters","GetPollVotes","votes","vote","nextOffset","forwardMessages","fromChat","randomIds","ForwardMessages","fromPeer","toPeer","findFirstMessageIdAfterDate","fetchScheduledHistory","GetScheduledHistory","sendScheduledMessages","SendScheduledMessages","fetchPinnedMessages","InputMessagesFilterPinned","mtpUserFull","commonChatsCount","pinnedMsgId","botInfo","blocked","bio","pinnedMessageId","isBlocked","botDescription","UserProfilePhoto","userType","bot","deleted","buildApiUserType","mutualContact","isContact","canBeInvitedToGroup","botNochats","status","buildApiUserStatus","botInlinePlaceholder","botPlaceholder","mtpStatus","UserStatusEmpty","UserStatusOnline","expires","UserStatusOffline","wasOnline","UserStatusRecently","UserStatusLastWeek","collection","byKey","BASE","MAX_INT","MAX_INT_ARR","smallToArray","supportsNativeBigInt","Integer","v","radix","alphabet","caseSensitive","parseBase","parseValue","BigInteger","sign","isSmall","SmallInteger","NativeBigInt","isPrecise","arrayToSmall","compareAbs","createArray","truncate","sum","l_a","l_b","carry","base","addAny","addSmall","difference","a_l","b_l","borrow","subtractSmall","multiplyLong","product","a_i","multiplySmall","shiftLeft","multiplySmallAndArray","square","divModSmall","lambda","divisor","quotient","divModAny","negate","comparison","quotientDigit","divisorMostSignificantDigit","divMod1","guess","xlen","highx","highy","check","part","unshift","divMod2","qSign","mSign","isBasicPrime","isUnit","isEven","isDivisibleBy","millerRabinTest","nPrev","prev","next","modPow","plus","subtractAny","minus","small","l1","l2","multiplyKaratsuba","ac","bd","abcd","times","_multiplyBySmall","divmod","over","_0","_1","_2","isNegative","exp","isZero","modInv","isPositive","isOdd","compareTo","notEquals","neq","gt","lt","greaterOrEquals","geq","lesserOrEquals","leq","isPrime","strict","logN","toJSNumber","isProbablePrime","iterations","rng","randBetween","lastT","lastR","newT","newR","powersOfTwo","powers2Length","highestPower2","shift_isSmall","bitwise","fn","xSign","ySign","xRem","not","yRem","xDigit","yDigit","xDivMod","yDivMod","remQuo","or","xor","roughLOB","gcd","integerLogarithm","tmp","absBase","alphabetValues","digits","parseBaseFromArray","toBase","valueOf","neg","digit","toBaseString","parseStringValue","decimalPlace","parseNumberValue","toArray","minusOne","lcm","isInstance","usedRNG","low","range","top","fromArray","RPCError","rpcErrorRe","Common","RPCBaseErrors","RPCErrorList","RPCMessageToError","rpcError","msgRegex","Cls","errorMessage","capture","messageFullId","ApiErrors","PHONE_NUMBER_INVALID","PHONE_CODE_INVALID","PASSWORD_HASH_INVALID","PHONE_PASSWORD_FLOOD","authController","buildAuthStateUpdate","isCodeViaApp","hint","token","btoa","FloodWaitError","hours","authorizationState","provideAuthPhoneNumber","provideAuthCode","provideAuthPassword","provideAuthRegistration","registration","restartAuth","restartAuthWithQr","pathBytesToSvg","path","num","buildPath","DEFAULT_THUMB_SIZE","thumb","PhotoStrippedSize","realSizes","bytesToDataUri","strippedPhotoToJpg","buildApiThumbnailFromCached","buildApiThumbnailFromPath","sizeAttribute","PhotoSizeProgressive","buildApiPhotoSize","shouldOmitPrefix","instance","SUBCLASS_OF_ID","classType","rest","JPEG_HEADER","JPEG_FOOTER","_raiseCastFail","getMessageId","getInputPeer","allowSelf","checkHash","InputPeerSelf","UserFull","getDisplayName","getAppropriatedPartSize","fileSize","stripped","header","getDC","ipAddress","port","stickerAttribute","fileAttribute","stickerSetInfo","stickerset","emoji","alt","isAnimated","cachedThumb","PhotoCachedSize","pathThumb","PhotoPathSize","stickerSetId","stickerSetAccessHash","buildStickerSet","animated","installedDate","hasThumbnail","buildStickerSetCovered","coveredStickerSet","stickerSet","stickerSetCovers","StickerSetMultiCovered","covers","cover","coverSticker","buildApiWallpaper","wallpaper","WallPaperNoFile","slug","buildApiSession","isCurrent","current","isOfficialApp","officialApp","isPasswordPending","passwordPending","buildPrivacyKey","buildPrivacyRules","rules","visibility","allowUserIds","allowChatIds","blockUserIds","blockChatIds","rule","PrivacyValueAllowAll","PrivacyValueAllowContacts","PrivacyValueDisallowContacts","PrivacyValueDisallowAll","PrivacyValueAllowUsers","PrivacyValueDisallowUsers","PrivacyValueAllowChatParticipants","PrivacyValueDisallowChatParticipants","buildApiNotifyException","showPreviews","sound","shouldShowPreviews","api","ReadCancelledError","super","TypeNotFoundError","invalidConstructorId","alert","InvalidChecksumError","checksum","validChecksum","InvalidBufferError","payload","SecurityError","BadMessageError","ErrorMessages","16","17","18","19","20","32","33","34","35","48","64","CdnFileTamperedError","coreObjects","tlobjects","stream","_last","readByte","readFloat","getBuffer","padding","clazz","seek","tellPosition","setPosition","fromReader","tgReadVector","close","position","answerCallbackButton","GetBotCallbackAnswer","fetchTopInlineBots","topPeers","GetTopPeers","botsInline","TopPeers","fetchInlineBot","resolvedPeer","addUserToLocalDb","fetchInlineBotResults","GetInlineBotResults","queryId","switchPm","isGallery","gallery","BotInlineMediaResult","addDocumentToLocalDb","buildApiBotInlineMediaResult","webDocument","buildApiBotInlineResult","sendInlineBotResult","resultId","SendInlineBotResult","sentMessageIds","originRequest","disconnected","broken","UpdateNewMessage","UpdateNewScheduledMessage","UpdateNewChannelMessage","UpdateShortChatMessage","UpdateShortMessage","UpdateServiceNotification","localDbChatId","newProfilePhoto","UpdateEditMessage","UpdateEditChannelMessage","UpdateDeleteMessages","UpdateDeleteScheduledMessages","UpdateDeleteChannelMessages","existingIds","missingIds","profilePhotoIds","UpdateMessageID","UpdateShortSentMessage","newContent","isAlreadySent","UpdateReadMessagesContents","UpdateChannelReadMessagesContents","UpdateMessagePoll","pollId","apiPoll","pollUpdate","UpdateMessagePollVote","UpdateChannelMessageViews","UpdateReadHistoryInbox","stillUnreadCount","UpdateReadHistoryOutbox","UpdateReadChannelInbox","UpdateReadChannelOutbox","UpdateDialogPinned","DialogPeer","UpdatePinnedDialogs","order","dp","UpdateFolderPeers","folderPeer","UpdateDialogFilterOrder","UpdateChatParticipants","replacedMembers","UpdateChatParticipantAdd","addedMember","UpdateChatParticipantDelete","deletedMemberId","UpdatePinnedMessages","UpdatePinnedChannelMessages","NotifyPeer","UpdateChatUserTyping","typingStatus","UpdateChannelUserTyping","UpdateChannel","UpdateDialogUnreadMark","UpdateChatDefaultBannedRights","UpdateUserStatus","UpdateUserName","updatedUser","UpdateUserPhoto","UpdateUserPhone","UpdatePeerSettings","peerType","UpdatePeerBlocked","UpdatePrivacy","UpdateDraftMessage","UpdateContactsReset","UpdateFavedStickers","Session","_serverAddress","_dcId","_port","_takeoutId","_updateStates","_authKey","setDC","serverAddress","BinaryReader","AuthKey","_key","_hash","auxHash","keyId","getKey","shaData","other","throttle","shouldRunFirst","interval","isPending","_args","setInterval","clearInterval","throttleWithTickEnd","throttleWith","onTickEnd","schedulerFn","waiting","cb","then","pause","checkPrimeAndGood","primeBytes","g","numBytesForHash","bigNumForHash","isGoodModExpFirst","modexp","prime","diff","computeHash","algo","salt1","salt2","salt","pbkdf2","pbkdf2sha512","computeCheck","currentAlgo","PasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow","pwHash","B","srp_B","isGoodLarge","pForHash","gForHash","bForHash","gX","kgX","aForHash","A","generateAndCheckRandom","gB","ux","aUx","S","K","pSha","gSha","salt1Sha","salt2Sha","M1","InputCheckPasswordSRP","srpId","computeDigest","GZIPPacked","contentRelated","gzipped","toBytes","input","gzip","ungzip","fitCount","peak","newData","springFactor","leftFiller","rightFiller","idx","File","fileBits","FileReader","onload","onerror","readAsDataURL","lastModified","blobToFile","fetchBlob","AES","default","i2ab","ab2i","getWords","Counter","initialValue","setBytes","_counter","increment","CTR","_remainingCounter","_remainingCounterIndex","_aes","plainText","encrypt","encrypted","Hash","algorithm","subtle","createCipheriv","createDecipheriv","getRandomValues","passwordKey","importKey","deriveBits","_fmtRequest","InvalidDCError","BadRequestError","UnauthorizedError","ForbiddenError","NotFoundError","AuthKeyError","FloodError","ServerError","TimedOutError","TLMessage","seqNo","MessageContainer","containerLength","before","tlMessage","PromisedWebSockets","AsyncQueue","Connection","ip","loggers","_ip","_log","_connected","_sendTask","_recvTask","_codec","_obfuscation","_sendArray","_recvArray","socket","disconnectCallback","debug","PacketCodecClass","connect","_initConn","_connect","_sendLoop","_recvLoop","fromCallback","pop","_send","_recv","tag","encodedPacket","encodePacket","readPacket","PacketCodec","_conn","ObfuscatedConnection","ObfuscatedIO","MemorySession","sessionInfo","_authKeys","_sessionString","_storageKey","_loadFromSessionString","_fetchFromCache","mainDcId","hashes","skipUpdateStorage","_updateStorage","getAuthKey","setAuthKey","authKey","asHex","mainDcIdStr","mainDcKey","setKey","_saveToCache","_delete","1","TYPED_OK","Uint16Array","Int32Array","_has","sources","source","shrinkBuf","fnTyped","arraySet","dest","src_offs","dest_offs","flattenChunks","chunks","chunk","fnUntyped","setTyped","on","Buf8","Buf16","Buf32","2","STR_APPLY_OK","STR_APPLY_UIA_OK","__","_utf8len","buf2binstring","string2buf","c2","m_pos","str_len","buf_len","binstring2buf","buf2string","c_len","utf16buf","utf8border","3","adler","s1","s2","4","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_TREES","Z_OK","Z_STREAM_END","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","5","table","makeTable","6","time","xflags","os","extra","extra_len","comment","hcrc","done","7","strm","_in","last","_out","beg","dmax","wsize","whave","wnext","s_window","hold","lcode","dcode","lmask","dmask","here","op","dist","from_source","output","next_in","avail_in","next_out","avail_out","lencode","distcode","lenbits","distbits","dolen","msg","dodist","sane","8","adler32","inflate_fast","inflate_table","zswap32","InflateState","wrap","havedict","total","head","wbits","ncode","nlen","ndist","have","lens","work","lendyn","distdyn","back","was","inflateResetKeep","total_in","total_out","inflateReset","inflateReset2","windowBits","inflateInit2","lenfix","distfix","virgin","fixedtables","sym","updatewindow","inflateInit","flush","here_bits","here_op","here_val","last_bits","last_op","last_val","opts","hbuf","inf_leave","data_type","inflateEnd","inflateGetHeader","inflateSetDictionary","dictionary","dictLength","inflateInfo","9","lbase","lext","dbase","dext","lens_index","codes","table_index","incr","mask","root","curr","drop","used","huff","base_index","MAXBITS","offs","extra_index","10","0","11","zlib_inflate","strings","ZStream","GZheader","Inflate","chunkSize","opt","raw","ended","inflator","_mode","next_out_utf8","tail","utf8str","allowBufError","onEnd","onData","inflateRaw","Logger","BinaryWriter","MessagePacker","webThumbnail","buildApiWebDocument","Function","snakeToCamelCase","_","variableSnakeToCamelCase","CORE_TYPES","AUTH_KEY_TYPES","findAll","regex","matches","RegExp","exec","fromLine","line","argsMatch","currentConfig","hexId","representation","brace","argType","buildArgConfig","flagMatch","vectorMatch","layer","methods","ignoreIds","objAll","objByName","objByType","commentIndex","followingTypes","dt","getTime","Si","T1","Uint32Array","T2","T3","T4","T5","T6","T7","T8","right","x2","x4","tEnc","tDec","xInv","computeTables","encKey","decKey","rcon","_message","a2","b2","rounds","decrypt","AES_IGE","blockSize","cipher","cipherText","prevX","prevY","yXOR","AES_IGE$1","incrementCounter","_level","level","isBrowser","browser","__nwjs","colors","messageFormat","canSend","levels","stack","format","toISOString","color","UserMigrateError","newDc","PhoneMigrateError","SlowModeWaitError","MsgWaitError","FloodTestPhoneWaitError","FileMigrateError","NetworkMigrateError","EmailUnconfirmedError","codeLength","LAYER","MtProtoPlainSender","MTProtoState","Helpers","doAuthentication","RPCResult","RequestState","MsgsAck","upload","MsgsStateInfo","Pong","BadServerSalt","BadMsgNotification","MsgDetailedInfo","MsgNewDetailedInfo","NewSessionCreated","FutureSalts","MsgsStateReq","MsgResendReq","MsgsAllInfo","MTProtoSender","DEFAULT_OPTIONS","_connection","logger","_retries","retries","_delay","delay","_autoReconnect","autoReconnect","_connectTimeout","connectTimeout","_authKeyCallback","authKeyCallback","_updateCallback","updateCallback","_autoReconnectCallback","autoReconnectCallback","_isMainSender","isMainSender","_onConnectionBreak","onConnectionBreak","userDisconnected","_user_connected","_reconnecting","_disconnected","_send_loop_handle","_recv_loop_handle","_state","_send_queue","_pending_state","_pending_ack","_last_acks","_handlers","_handleRPCResult","_handleContainer","_handleGzipPacked","_handlePong","_handleBadServerSalt","_handleBadNotification","_handleDetailedInfo","_handleNewDetailedInfo","_handleNewSessionCreated","_handleAck","_handleFutureSalts","_handleStateForgotten","_handleMsgAll","force","isConnecting","attempt","_disconnect","send","append","sendWithInvokeSupport","_authenticated","plain","rejectAll","ack","msgIds","batch","encryptMessageData","body","recv","reconnect","decryptMessageData","_processMessage","handler","_handleUpdate","_popStates","deferred","toPop","containerId","reqMsgId","innerMessage","pong","newTimeOffset","updateTimeOffset","badSalt","badMsgId","newServerSalt","states","extend","badMsg","errorCode","_sequence","answerMsgId","serverSalt","repeat","_reconnect","reset","newConnection","_getNewMsgId","IGE","InvokeAfterMsg","_lastMsgId","updateMessageId","msgKey","sha256a","sha256b","afterId","_getSeqNo","gzipIfSmaller","waitForKey","_calcKey","encryptIge","decryptIge","ourKey","remoteMsgId","remoteSequence","containerLen","nanoseconds","newMsgId","correctMsgId","bad","old","AESIGE","ige","RpcError","innerCode","USE_INVOKE_AFTER_WITH","_queue","_pendingStates","_ready","setReady","after","catch","finally","MAXIMUM_LENGTH","SIZE_OVERHEAD","MAXIMUM_SIZE","writeDataAsMessage","getValue","requestState","_stream","MTProtoPlainSender","ConnectionTCPFull","ConnectionTCPAbridged","ConnectionTCPObfuscated","Mutex","mutex","WebSocketClient","w3cwebsocket","closeError","disconnectedCallback","closed","readData","thisTime","canRead","toReturn","resolveRead","getWebSocketLink","website","onopen","receive","onclose","event","wasClean","addEventListener","onmessage","release","acquire","canGet","resolveGet","canPush","resolvePush","returned","AbridgedPacketCodec","props","obfuscateTag","initHeader","_encrypt","encryptor","_decrypt","decryptor","packetCodec","keywords","ok","randomReversed","encryptKey","encryptIv","decryptKey","decryptIv","readExactly","PUBLIC_KEYS","fingerprint","_serverKeys","Map","keyInfo","b64","getLens","validLen","placeHoldersLen","Arr","_byteLength","curByte","revLookup","uint8","extraBytes","parts","len2","encodeChunk","lookup","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","NaN","rt","LN2","webpackPolyfill","deprecate","paths","children","i2abLow","int","i2abBig","ab2iLow","ab","ab2iBig","isBigEndian","s2i","authFlow","checkAuthorization","downloadFile","sizeTypes","apiId","apiHash","_useIPV6","useIPV6","baseLogger","floodSleepLimit","_eventBuilders","_phoneCodeHash","_requestRetries","requestRetries","_connectionRetries","connectionRetries","_retryDelay","retryDelay","proxy","_proxy","_timeout","timeout","_floodWaitedRequests","_initWith","InvokeWithLayer","InitConnection","systemVersion","langCode","langPack","systemLangCode","_config","phoneCodeHashes","_exportedSenderPromises","_exportedSenderReleaseTimeouts","_additionalDcsDisabled","_loopStarted","_destroyed","_initSession","_sender","GetConfig","_updateLoop","load","attempts","PingDelayDisconnect","pingId","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","disconnectDelay","race","_lastRequest","GetState","sender","DC","_cleanupExportedSender","dc","ExportAuthorization","req","ImportAuthorization","shouldReconnect","existingSender","_connectSender","_createExportedSender","_borrowExportedSender","clearTimeout","getSender","inputLocation","messageOrMedia","_downloadPhoto","_downloadDocument","_downloadContact","WebDocument","WebDocumentNoProxy","_downloadWebDocument","isBig","loc","chatPhoto","InputPeerPhotoFileLocation","thumbVersion","InputStickerSetThumb","thumbDcId","_pickFileSize","_downloadCachedPhotoSize","PhotoSizeEmpty","InputPhotoFileLocation","thumbSize","doc","InputDocumentFileLocation","buff","downloaded","GetWebFile","location","InputWebFileLocation","_switchDC","isReady","authParams","apiCredentials","fileParams","callback","_processUpdate","UpdateShort","others","_dispatchUpdate","ptsDate","builder","sequentialUpdates","endianness","hostname","loadavg","uptime","freemem","MAX_VALUE","totalmem","cpus","networkInterfaces","getNetworkInterfaces","arch","tmpdir","tmpDir","EOL","homedir","cachedSetTimeout","cachedClearTimeout","defaultSetTimout","defaultClearTimeout","runTimeout","fun","currentQueue","draining","queueIndex","cleanUpNextTick","drainQueue","run","marker","runClearTimeout","Item","noop","nextTick","env","argv","versions","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","binding","cwd","chdir","umask","Factorizator","nonce","resPQ","ReqPqMulti","ResPQ","pq","factorize","pBuffer","qBuffer","pqInnerData","PQInnerData","targetFingerprint","targetKey","serverPublicKeyFingerprints","dataWithPadding","dataPadReversed","encryptedData","tempKey","shaDigestKeyWithData","dataWithHash","aesEncrypted","tempKeyXor","keyAesEncrypted","keyAesEncryptedInt","encryptedDataBuffer","serverDhParams","ReqDHParams","publicKeyFingerprint","ServerDHParamsOk","ServerDHParamsFail","sh","nnh","newNonceHash","encryptedAnswer","plainTextAnswer","serverDhInner","ServerDHInnerData","dhPrime","ga","gA","serverTime","gb","gab","clientDhInner","ClientDHInnerData","retryId","clientDdhInnerHashed","clientDhEncrypted","dhGen","SetClientDHParams","nonceTypes","DhGenOk","DhGenRetry","DhGenFail","nonceNumber","calcNewNonceHash","ys","condition","pending","Mutex_1","_pending","isLocked","_this","ticket","_dispatchNext","runExclusive","NativeWebSocket","_global","WebSocket","MozWebSocket","websocket_version","W3CWebSocket","uri","protocols","prop","DEFAULT_INITIAL_METHOD","me","botAuthToken","ImportBotAuthorization","signInBot","signInUser","signInUserWithQrCode","phoneCodeHash","sendCodeResult","sendCode","forceSMS","termsOfService","isRegistrationRequired","SignIn","AuthorizationSignUpRequired","signInWithPassword","SignUp","AcceptTermsOfService","isScanningComplete","inputPromise","ExportLoginToken","exceptIds","LoginToken","updatePromise","UpdateLoginToken","result2","LoginTokenSuccess","authorization","Authorization","LoginTokenMigrateTo","migratedResult","ImportLoginToken","sendResult","SendCode","CodeSettings","SentCodeTypeSms","SentCodeTypeApp","resendResult","ResendCode","passwordSrpResult","GetPassword","passwordSrpCheck","computePasswordSrpCheck","CheckPassword","Foreman","maxWorkers","requestWorker","activeWorkers","releaseWorker","partSizeKb","partSize","partsCount","foreman","promises","hasEnded","GetFile","offsetMemo","precise","totalLength","fileId","isLarge","partCount","fileToBuffer","sendingParts","jMemo","bytesMemo","SaveBigFilePart","filePart","fileTotalParts","SaveFilePart","InputFileBig","InputFile","md5Checksum","isCheckPassword","currentPassword","newPassword","email","emailCodeCallback","onEmailCodeError","pwd","newAlgo","PasswordKdfAlgoUnknown","hasPassword","InputCheckPasswordEmpty","UpdatePasswordSettings","newSettings","PasswordInputSettings","newPasswordHash","newSecureSettings","ConfirmPasswordEmail","NewMessage","Raw","StopPropagation","EventBuilder","types","func","blacklistChats","resolved","Memory","StringSession","CacheApiSession","LocalStorageSession","IdbSession","decode","serverAddressLen","dcBuffer","addressBuffer","addressLengthBuffer","portBuffer","encode","StorageSession","cached","removeItem","idb","del","promisifyRequest","oncomplete","onsuccess","onabort","createStore","dbName","storeName","indexedDB","onupgradeneeded","createObjectStore","dbp","txMode","db","transaction","objectStore","defaultGetStoreFunc","defaultGetStore","customStore","setMany","entries","entry","getMany","eachCursor","openCursor","continue","items","cursor","_sessionData","_callback","skipOnUpdate","fetchFullUser","userWithFullInfo","fetchNearestCountry","dcInfo","GetNearestDc","country","fetchTopUsers","correspondents","fetchContactList","GetContacts","ContactsNotModified","savedCount","fetchUsers","updateContact","ImportContacts","deleteUser","DeleteContacts","fetchProfilePhotos","GetUserPhotos","inputGifBot","fetchStickerSets","allStickers","GetAllStickers","AllStickersNotModified","sets","fetchRecentStickers","GetRecentStickers","RecentStickersNotModified","stickers","processStickerResult","fetchFavoriteStickers","GetFavedStickers","FavedStickersNotModified","fetchFeaturedStickers","GetFeaturedStickers","FeaturedStickersNotModified","faveSticker","unfave","FaveSticker","fetchStickers","GetStickerSet","packs","acc","documentId","fetchAnimatedEmojis","InputStickerSetAnimatedEmoji","searchStickers","SearchStickerSets","FoundStickerSetsNotModified","fetchSavedGifs","GetSavedGifs","SavedGifsNotModified","gifs","processGifResult","installStickerSet","InstallStickerSet","uninstallStickerSet","UninstallStickerSet","searchGifs","config","gifSearchUsername","foundGif","fetchStickersForEmoji","GetStickers","StickersNotModified","fetchEmojiKeywords","fromVersion","GetEmojiKeywordsDifference","emojiKeyword","keyword","emoticons","checkChatUsername","CheckUsername","setChatUsername","UpdateUsername","updatePrivateLink","ExportChatInvite","EMAIL_UNCONFIRMED","EMAIL_HASH_EXPIRED","NEW_SALT_INVALID","NEW_SETTINGS_INVALID","CODE_INVALID","emailCodeController","getPasswordInfo","onRequestEmailCode","checkPassword","clearPassword","updatePassword","updateRecoveryEmail","provideRecoveryEmailCode","BETA_LANG_CODES","updateProfile","UpdateProfile","checkUsername","updateUsername","updateProfilePhoto","UploadProfilePhoto","uploadProfilePhoto","fetchWallpapers","GetWallPapers","WallPapersNotModified","filteredWallpapers","wallpapers","WallPaper","pattern","uploadWallpaper","UploadWallPaper","WallPaperSettings","fetchBlockedContacts","GetBlocked","blockedIds","BlockedSlice","blockContact","Block","unblockContact","Unblock","fetchAuthorizations","GetAuthorizations","authorizations","terminateAuthorization","ResetAuthorization","terminateAllAuthorizations","ResetAuthorizations","fetchNotificationExceptions","GetNotifyExceptions","compareSound","fetchNotificationSettings","isMutedContactSignUpNotification","privateContactNotificationsSettings","groupNotificationsSettings","broadcastNotificationsSettings","GetContactSignUpNotification","GetNotifySettings","InputNotifyUsers","InputNotifyChats","InputNotifyBroadcasts","privateSilent","privateMuteUntil","privateShowPreviews","groupSilent","groupMuteUntil","groupShowPreviews","broadcastSilent","broadcastMuteUntil","broadcastShowPreviews","hasContactJoinedNotifications","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","updateContactSignUpNotification","SetContactSignUpNotification","updateNotificationSettings","fetchLanguages","langpack","GetLanguages","fetchLangPack","sourceLangPacks","collections","GetLangPack","fetchLangStrings","GetStrings","fetchPrivacySettings","GetPrivacy","registerDevice","secret","RegisterDevice","tokenType","appSandbox","otherUids","unregisterDevice","UnregisterDevice","setPrivacySettings","privacyRules","allowedUsers","InputPrivacyValueAllowUsers","allowedChats","InputPrivacyValueAllowChatParticipants","blockedUsers","InputPrivacyValueDisallowUsers","blockedChats","InputPrivacyValueDisallowChatParticipants","InputPrivacyValueAllowAll","InputPrivacyValueAllowContacts","InputPrivacyValueDisallowContacts","InputPrivacyValueDisallowAll","SetPrivacy","updateIsOnline","isOnline","UpdateStatus","offline","fetchContentSettings","GetContentSettings","isSensitiveEnabled","sensitiveEnabled","canChangeSensitive","sensitiveCanChange","updateContentSettings","SetContentSettings","buildShippingOptions","shippingOptions","prices","cur","label","validateRequestedInfo","requestInfo","shouldSave","payments","ValidateRequestedInfo","sendPaymentForm","requestedInfoId","shippingOptionId","credentials","SendPaymentForm","InputPaymentCredentials","DataJSON","getPaymentForm","GetPaymentForm","form","canSaveCredentials","passwordMissing","providerId","nativeProvider","nativeParams","savedInfo","nameRequested","phoneRequested","emailRequested","shippingAddressRequested","flexible","phoneToProvider","emailToProvider","mapedPrices","nativeData","needCardholderName","need_cardholder_name","needCountry","need_country","needZip","need_zip","publishableKey","publishable_key","buildPaymentForm","getReceipt","GetPaymentReceipt","receipt","shipping","credentialsTitle","shippingPrices","shippingMethod","buildReceipt","initApi","initUpdater","handleUpdate","initAuth","initChats","initMessages","initUsers","initStickers","initManagement","initTwoFaSettings","initClient","flushUpdatesOnTickEnd","throttleId","pendingUpdates","currentThrottleId","currentUpdates","flushUpdatesThrottled","sendToOrigin","callbackState","postMessage","callbackArgs","lastArg","fnName","callApi"],"mappings":"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","file":"5aa1e598c74b078112d5.worker.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 113);\n","const Api = require('./tl/api');\nconst TelegramClient = require('./client/TelegramClient');\nconst connection = require('./network');\nconst tl = require('./tl');\nconst version = require('./Version');\nconst events = require('./events');\nconst utils = require('./Utils');\nconst errors = require('./errors');\nconst sessions = require('./sessions');\nconst extensions = require('./extensions');\nconst helpers = require('./Helpers');\n\nmodule.exports = {\n Api,\n TelegramClient,\n sessions,\n connection,\n extensions,\n tl,\n version,\n events,\n utils,\n errors,\n helpers,\n};\n","// eslint-disable-next-line no-restricted-globals\nconst cacheApi = self.caches;\n\nexport enum Type {\n Text,\n Blob,\n Json,\n}\n\nexport async function fetch(cacheName: string, key: string, type: Type) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\n const cache = await cacheApi.open(cacheName);\n const response = await cache.match(request);\n if (!response) {\n return undefined;\n }\n\n switch (type) {\n case Type.Text:\n return await response.text();\n case Type.Blob: {\n const blob = await response.blob();\n\n // Safari does not return correct Content-Type header for webp images.\n if (key.substr(0, 7) === 'sticker') {\n return new Blob([blob], { type: 'image/webp' });\n }\n\n // iOS Safari fails to preserve `type` in cache\n if (!blob.type) {\n const contentType = response.headers.get('Content-Type');\n if (contentType) {\n return new Blob([blob], { type: contentType });\n }\n }\n\n return blob;\n }\n case Type.Json:\n return await response.json();\n default:\n return undefined;\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function save(cacheName: string, key: string, data: AnyLiteral | Blob | string) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n const cacheData = typeof data === 'string' || data instanceof Blob ? data : JSON.stringify(data);\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\n const response = new Response(cacheData);\n const cache = await cacheApi.open(cacheName);\n return await cache.put(request, response);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function clear(cacheName: string) {\n try {\n if (!cacheApi) {\n return undefined;\n }\n\n return await cacheApi.delete(cacheName);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n","import { inflate } from 'pako/dist/pako_inflate';\n\nimport { Api as GramJs, TelegramClient } from '../../../lib/gramjs';\nimport {\n ApiMediaFormat, ApiOnProgress, ApiParsedMedia, ApiPreparedMedia,\n} from '../../types';\n\nimport {\n DOWNLOAD_WORKERS,\n MEDIA_CACHE_DISABLED,\n MEDIA_CACHE_MAX_BYTES,\n MEDIA_CACHE_NAME,\n MEDIA_CACHE_NAME_AVATARS,\n} from '../../../config';\nimport localDb from '../localDb';\nimport { getEntityTypeById } from '../gramjsBuilders';\nimport { blobToDataUri } from '../../../util/files';\nimport * as cacheApi from '../../../util/cacheApi';\n\ntype EntityType = (\n 'msg' | 'sticker' | 'wallpaper' | 'gif' | 'channel' | 'chat' | 'user' | 'photo' | 'stickerSet' | 'webDocument'\n);\nconst MEDIA_ENTITY_TYPES = new Set(['msg', 'sticker', 'gif', 'wallpaper', 'photo', 'webDocument']);\n\nexport default async function downloadMedia(\n {\n url, mediaFormat, start, end,\n }: {\n url: string; mediaFormat: ApiMediaFormat; start?: number; end?: number;\n },\n client: TelegramClient,\n isConnected: boolean,\n onProgress?: ApiOnProgress,\n) {\n const {\n data, mimeType, fullSize,\n } = await download(url, client, isConnected, onProgress, start, end, mediaFormat) || {};\n if (!data) {\n return undefined;\n }\n\n const parsed = await parseMedia(data, mediaFormat, mimeType);\n if (!parsed) {\n return undefined;\n }\n\n const canCache = mediaFormat !== ApiMediaFormat.Progressive && (\n mediaFormat !== ApiMediaFormat.BlobUrl || (parsed as Blob).size <= MEDIA_CACHE_MAX_BYTES\n );\n\n if (!MEDIA_CACHE_DISABLED && cacheApi && canCache) {\n const cacheName = url.startsWith('avatar') ? MEDIA_CACHE_NAME_AVATARS : MEDIA_CACHE_NAME;\n void cacheApi.save(cacheName, url, parsed);\n }\n\n const prepared = mediaFormat === ApiMediaFormat.Progressive ? '' : prepareMedia(parsed);\n const arrayBuffer = mediaFormat === ApiMediaFormat.Progressive ? parsed as ArrayBuffer : undefined;\n\n return {\n prepared,\n arrayBuffer,\n mimeType,\n fullSize,\n };\n}\n\nasync function download(\n url: string,\n client: TelegramClient,\n isConnected: boolean,\n onProgress?: ApiOnProgress,\n start?: number,\n end?: number,\n mediaFormat?: ApiMediaFormat,\n) {\n const mediaMatch = url.startsWith('webDocument')\n ? url.match(/(webDocument):(.+)/)\n : url.match(/(avatar|profile|photo|msg|stickerSet|sticker|wallpaper|gif|file)([-\\d\\w./]+)(\\?size=\\w+)?/);\n if (!mediaMatch) {\n return undefined;\n }\n\n if (mediaMatch[1] === 'file') {\n const response = await fetch(mediaMatch[2]);\n const data = await response.arrayBuffer();\n return { data };\n }\n\n if (!isConnected) {\n return Promise.reject(new Error('ERROR: Client is not connected'));\n }\n\n let entityType: EntityType;\n let entityId: string | number = mediaMatch[2];\n const sizeType = mediaMatch[3] ? mediaMatch[3].replace('?size=', '') : undefined;\n let entity: (\n GramJs.User | GramJs.Chat | GramJs.Channel | GramJs.Photo |\n GramJs.Message | GramJs.Document | GramJs.StickerSet | GramJs.TypeWebDocument | undefined\n );\n\n if (mediaMatch[1] === 'avatar' || mediaMatch[1] === 'profile') {\n entityType = getEntityTypeById(Number(entityId));\n entityId = Math.abs(Number(entityId));\n } else {\n entityType = mediaMatch[1] as 'msg' | 'sticker' | 'wallpaper' | 'gif' | 'stickerSet' | 'photo' | 'webDocument';\n }\n\n switch (entityType) {\n case 'channel':\n case 'chat':\n entity = localDb.chats[entityId as number];\n break;\n case 'user':\n entity = localDb.users[entityId as number];\n break;\n case 'msg':\n entity = localDb.messages[entityId as string];\n break;\n case 'sticker':\n case 'gif':\n case 'wallpaper':\n entity = localDb.documents[entityId as string];\n break;\n case 'photo':\n entity = localDb.photos[entityId as string];\n break;\n case 'stickerSet':\n entity = localDb.stickerSets[entityId as string];\n break;\n case 'webDocument':\n entity = localDb.webDocuments[entityId as string];\n break;\n }\n\n if (!entity) {\n return undefined;\n }\n\n if (MEDIA_ENTITY_TYPES.has(entityType)) {\n if (mediaFormat === ApiMediaFormat.Stream) {\n onProgress!.acceptsBuffer = true;\n }\n\n const data = await client.downloadMedia(entity, {\n sizeType, start, end, progressCallback: onProgress, workers: DOWNLOAD_WORKERS,\n });\n let mimeType;\n let fullSize;\n\n if (entity instanceof GramJs.Message) {\n mimeType = getMessageMediaMimeType(entity, sizeType);\n if (entity.media instanceof GramJs.MessageMediaDocument && entity.media.document instanceof GramJs.Document) {\n fullSize = entity.media.document.size;\n }\n if (entity.media instanceof GramJs.MessageMediaWebPage\n && entity.media.webpage instanceof GramJs.WebPage\n && entity.media.webpage.document instanceof GramJs.Document) {\n fullSize = entity.media.webpage.document.size;\n }\n } else if (entity instanceof GramJs.Photo) {\n mimeType = 'image/jpeg';\n } else if (entityType === 'sticker' && sizeType) {\n mimeType = 'image/webp';\n } else if (entityType === 'webDocument') {\n mimeType = (entity as GramJs.TypeWebDocument).mimeType;\n } else {\n mimeType = (entity as GramJs.Document).mimeType;\n fullSize = (entity as GramJs.Document).size;\n }\n\n return { mimeType, data, fullSize };\n } else if (entityType === 'stickerSet') {\n const data = await client.downloadStickerSetThumb(entity);\n const mimeType = mediaFormat === ApiMediaFormat.Lottie ? 'application/json' : getMimeType(data);\n\n return { mimeType, data };\n } else {\n const data = await client.downloadProfilePhoto(entity, mediaMatch[1] === 'profile');\n const mimeType = getMimeType(data);\n\n return { mimeType, data };\n }\n}\n\nfunction getMessageMediaMimeType(message: GramJs.Message, sizeType?: string) {\n if (!message || !message.media) {\n return undefined;\n }\n\n if (message.media instanceof GramJs.MessageMediaPhoto) {\n return 'image/jpeg';\n }\n\n if (message.media instanceof GramJs.MessageMediaDocument && message.media.document instanceof GramJs.Document) {\n if (sizeType) {\n return message.media.document!.attributes.some((a) => a instanceof GramJs.DocumentAttributeSticker)\n ? 'image/webp'\n : 'image/jpeg';\n }\n\n return message.media.document!.mimeType;\n }\n\n if (message.media instanceof GramJs.MessageMediaWebPage\n && message.media.webpage instanceof GramJs.WebPage\n && message.media.webpage.document instanceof GramJs.Document) {\n return message.media.webpage.document.mimeType;\n }\n\n return undefined;\n}\n\n// eslint-disable-next-line no-async-without-await/no-async-without-await\nasync function parseMedia(\n data: Buffer, mediaFormat: ApiMediaFormat, mimeType?: string,\n): Promise {\n switch (mediaFormat) {\n case ApiMediaFormat.DataUri:\n return blobToDataUri(new Blob([data], { type: mimeType }));\n case ApiMediaFormat.BlobUrl:\n return new Blob([data], { type: mimeType });\n case ApiMediaFormat.Lottie: {\n const json = inflate(data, { to: 'string' });\n return JSON.parse(json);\n }\n case ApiMediaFormat.Progressive: {\n return data.buffer;\n }\n }\n\n return undefined;\n}\n\nfunction prepareMedia(mediaData: ApiParsedMedia): ApiPreparedMedia {\n if (mediaData instanceof Blob) {\n return URL.createObjectURL(mediaData);\n }\n\n return mediaData;\n}\n\nfunction getMimeType(data: Uint8Array, fallbackMimeType = 'image/jpeg') {\n if (data.length < 4) {\n return fallbackMimeType;\n }\n\n let type = fallbackMimeType;\n const signature = data.subarray(0, 4).reduce((result, byte) => result + byte.toString(16), '');\n\n // https://en.wikipedia.org/wiki/List_of_file_signatures\n switch (signature) {\n case '89504e47':\n type = 'image/png';\n break;\n case '47494638':\n type = 'image/gif';\n break;\n case 'ffd8ffe0':\n case 'ffd8ffe1':\n case 'ffd8ffe2':\n case 'ffd8ffe3':\n case 'ffd8ffe8':\n type = 'image/jpeg';\n break;\n case '52494646':\n // In our case only webp is expected\n type = 'image/webp';\n break;\n }\n\n return type;\n}\n","import {\n TelegramClient, sessions, Api as GramJs, connection,\n} from '../../../lib/gramjs';\nimport { Logger as GramJsLogger } from '../../../lib/gramjs/extensions/index';\nimport { TwoFaParams } from '../../../lib/gramjs/client/2fa';\n\nimport {\n ApiInitialArgs,\n ApiMediaFormat,\n ApiOnProgress,\n ApiSessionData,\n OnApiUpdate,\n} from '../../types';\n\nimport {\n DEBUG, DEBUG_GRAMJS, UPLOAD_WORKERS, IS_TEST, APP_VERSION,\n} from '../../../config';\nimport {\n onRequestPhoneNumber, onRequestCode, onRequestPassword, onRequestRegistration,\n onAuthError, onAuthReady, onCurrentUserUpdate, onRequestQrCode,\n} from './auth';\nimport { updater } from '../updater';\nimport { setMessageBuilderCurrentUserId } from '../apiBuilders/messages';\nimport downloadMediaWithClient from './media';\nimport { buildApiUserFromFull } from '../apiBuilders/users';\nimport localDb from '../localDb';\n\nconst DEFAULT_USER_AGENT = 'Unknown UserAgent';\nconst APP_CODE_NAME = 'Z';\n\nGramJsLogger.setLevel(DEBUG_GRAMJS ? 'debug' : 'warn');\n\nconst gramJsUpdateEventBuilder = { build: (update: object) => update };\n\nlet onUpdate: OnApiUpdate;\nlet client: TelegramClient;\nlet isConnected = false;\n\nexport async function init(_onUpdate: OnApiUpdate, initialArgs: ApiInitialArgs) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START INIT API');\n }\n\n onUpdate = _onUpdate;\n\n const { userAgent, platform, sessionData } = initialArgs;\n const session = new sessions.CallbackSession(sessionData, onSessionUpdate);\n\n client = new TelegramClient(\n session,\n process.env.TELEGRAM_T_API_ID,\n process.env.TELEGRAM_T_API_HASH,\n {\n deviceModel: navigator.userAgent || userAgent || DEFAULT_USER_AGENT,\n appVersion: `${APP_VERSION} ${APP_CODE_NAME}`,\n useWSS: true,\n additionalDcsDisabled: IS_TEST,\n } as any,\n );\n\n client.addEventHandler(handleGramJsUpdate, gramJsUpdateEventBuilder);\n client.addEventHandler(updater, gramJsUpdateEventBuilder);\n\n try {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[GramJs/client] CONNECTING');\n }\n\n try {\n await client.start({\n phoneNumber: onRequestPhoneNumber,\n phoneCode: onRequestCode,\n password: onRequestPassword,\n firstAndLastNames: onRequestRegistration,\n qrCode: onRequestQrCode,\n onError: onAuthError,\n initialMethod: platform === 'iOS' || platform === 'Android' ? 'phoneNumber' : 'qrCode',\n });\n } catch (err) {\n // TODO Investigate which request causes this exception\n if (err.message !== 'Disconnect') {\n onUpdate({\n '@type': 'updateConnectionState',\n connectionState: 'connectionStateBroken',\n });\n\n return;\n }\n }\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH INIT API');\n // eslint-disable-next-line no-console\n console.log('[GramJs/client] CONNECTED');\n\n // eslint-disable-next-line no-restricted-globals\n (self as any).invoke = invokeRequest;\n // eslint-disable-next-line no-restricted-globals\n (self as any).GramJs = GramJs;\n }\n\n onAuthReady();\n onSessionUpdate(session.getSessionData());\n onUpdate({ '@type': 'updateApiReady' });\n\n void fetchCurrentUser();\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[GramJs/client] CONNECTING ERROR', err);\n }\n\n throw err;\n }\n}\n\nexport async function destroy() {\n await invokeRequest(new GramJs.auth.LogOut());\n await client.destroy();\n}\n\nexport async function disconnect() {\n await client.disconnect();\n}\n\nexport function getClient() {\n return client;\n}\n\nfunction onSessionUpdate(sessionData: ApiSessionData) {\n onUpdate({\n '@type': 'updateSession',\n sessionData,\n });\n}\n\nfunction handleGramJsUpdate(update: any) {\n if (update instanceof connection.UpdateConnectionState) {\n isConnected = update.state === connection.UpdateConnectionState.connected;\n } else if (update instanceof GramJs.UpdatesTooLong) {\n void handleTerminatedSession();\n } else if (update instanceof connection.UpdateServerTimeOffset) {\n onUpdate({\n '@type': 'updateServerTimeOffset',\n serverTimeOffset: update.timeOffset,\n });\n }\n}\n\nexport async function invokeRequest(\n request: T,\n shouldHandleUpdates = false,\n shouldThrow = false,\n): Promise {\n if (!isConnected) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(`[GramJs/client] INVOKE ERROR ${request.className}: Client is not connected`);\n }\n\n return undefined;\n }\n\n try {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log(`[GramJs/client] INVOKE ${request.className}`);\n }\n\n const result = await client.invoke(request);\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log(`[GramJs/client] INVOKE RESPONSE ${request.className}`, result);\n }\n\n if (shouldHandleUpdates) {\n type ResultWithUpdates =\n typeof result\n & { updates?: GramJs.Updates | GramJs.UpdatesCombined };\n\n let updatesContainer;\n if (result instanceof GramJs.Updates || result instanceof GramJs.UpdatesCombined) {\n updatesContainer = result;\n } else if ('updates' in result && (\n (result as ResultWithUpdates).updates instanceof GramJs.Updates\n || (result as ResultWithUpdates).updates instanceof GramJs.UpdatesCombined\n )) {\n updatesContainer = (result as ResultWithUpdates).updates;\n }\n\n if (updatesContainer) {\n injectUpdateEntities(updatesContainer);\n\n updatesContainer.updates.forEach((update) => {\n updater(update, request);\n });\n } else if (result instanceof GramJs.UpdatesTooLong) {\n // TODO Implement\n } else {\n updater(result as GramJs.TypeUpdates, request);\n }\n }\n\n return result;\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log(`[GramJs/client] INVOKE ERROR ${request.className}`);\n // eslint-disable-next-line no-console\n console.error(err);\n }\n\n dispatchErrorUpdate(err, request);\n\n if (shouldThrow) {\n throw err;\n }\n\n return undefined;\n }\n}\n\nexport function downloadMedia(\n args: { url: string; mediaFormat: ApiMediaFormat; start?: number; end?: number },\n onProgress?: ApiOnProgress,\n) {\n return downloadMediaWithClient(args, client, isConnected, onProgress);\n}\n\nexport function uploadFile(file: File, onProgress?: ApiOnProgress) {\n return client.uploadFile({ file, onProgress, workers: UPLOAD_WORKERS });\n}\n\nexport function updateTwoFaSettings(params: TwoFaParams) {\n return client.updateTwoFaSettings(params);\n}\n\nexport async function fetchCurrentUser() {\n const userFull = await invokeRequest(new GramJs.users.GetFullUser({\n id: new GramJs.InputUserSelf(),\n }));\n\n if (!userFull || !(userFull.user instanceof GramJs.User)) {\n return;\n }\n\n localDb.users[userFull.user.id] = userFull.user;\n const currentUser = buildApiUserFromFull(userFull);\n\n setMessageBuilderCurrentUserId(currentUser.id);\n onCurrentUserUpdate(currentUser);\n}\n\nexport function dispatchErrorUpdate(err: Error, request: T) {\n const isSlowMode = err.message.startsWith('A wait of') && (\n request instanceof GramJs.messages.SendMessage\n || request instanceof GramJs.messages.SendMedia\n || request instanceof GramJs.messages.SendMultiMedia\n );\n\n const { message } = err;\n\n onUpdate({\n '@type': 'error',\n error: {\n message,\n isSlowMode,\n hasErrorKey: true,\n },\n });\n}\n\nfunction injectUpdateEntities(result: GramJs.Updates | GramJs.UpdatesCombined) {\n const entities = [...result.users, ...result.chats];\n\n result.updates.forEach((update) => {\n if (entities) {\n // eslint-disable-next-line no-underscore-dangle\n (update as any)._entities = entities;\n }\n });\n}\n\nasync function handleTerminatedSession() {\n try {\n await invokeRequest(new GramJs.users.GetFullUser({\n id: new GramJs.InputUserSelf(),\n }), undefined, true);\n } catch (err) {\n if (err.message === 'AUTH_KEY_UNREGISTERED') {\n onUpdate({\n '@type': 'updateConnectionState',\n connectionState: 'connectionStateBroken',\n });\n }\n }\n}\n","import BigInt from 'big-integer';\nimport { Api as GramJs } from '../../../lib/gramjs';\n\nimport { ApiPrivacyKey } from '../../../types';\n\nimport { generateRandomBytes, readBigIntFromBuffer } from '../../../lib/gramjs/Helpers';\nimport {\n ApiSticker,\n ApiVideo,\n ApiNewPoll,\n ApiMessageEntity,\n ApiMessageEntityTypes,\n ApiChatFolder,\n ApiChatBannedRights,\n ApiChatAdminRights,\n ApiReportReason,\n} from '../../types';\nimport localDb from '../localDb';\nimport { pick } from '../../../util/iteratees';\n\nexport function getEntityTypeById(chatOrUserId: number) {\n if (chatOrUserId > 0) {\n return 'user';\n } else if (chatOrUserId <= -1000000000) {\n return 'channel';\n } else {\n return 'chat';\n }\n}\n\nexport function buildPeer(chatOrUserId: number): GramJs.TypePeer {\n if (chatOrUserId > 0) {\n return new GramJs.PeerUser({\n userId: chatOrUserId,\n });\n } else if (chatOrUserId <= -1000000000) {\n return new GramJs.PeerChannel({\n channelId: -chatOrUserId,\n });\n } else {\n return new GramJs.PeerChat({\n chatId: -chatOrUserId,\n });\n }\n}\n\nexport function buildInputPeer(chatOrUserId: number, accessHash?: string): GramJs.TypeInputPeer {\n if (chatOrUserId > 0 || chatOrUserId <= -1000000000) {\n return chatOrUserId > 0\n ? new GramJs.InputPeerUser({\n userId: chatOrUserId,\n accessHash: BigInt(accessHash!),\n })\n : new GramJs.InputPeerChannel({\n channelId: -chatOrUserId,\n accessHash: BigInt(accessHash!),\n });\n } else {\n return new GramJs.InputPeerChat({\n chatId: -chatOrUserId,\n });\n }\n}\n\nexport function buildInputPeerFromLocalDb(chatOrUserId: number): GramJs.TypeInputPeer | undefined {\n if (chatOrUserId > 0) {\n const { accessHash } = localDb.users[chatOrUserId] || {};\n\n return accessHash\n ? new GramJs.InputPeerUser({\n userId: chatOrUserId,\n accessHash,\n })\n : undefined;\n }\n\n if (chatOrUserId <= -1000000000) {\n const { accessHash } = (localDb.chats[-chatOrUserId] as GramJs.Channel) || {};\n\n return accessHash\n ? new GramJs.InputPeerChannel({\n channelId: -chatOrUserId,\n accessHash,\n })\n : undefined;\n }\n\n return new GramJs.InputPeerChat({\n chatId: -chatOrUserId,\n });\n}\n\nexport function buildInputEntity(chatOrUserId: number, accessHash?: string) {\n if (chatOrUserId > 0) {\n return new GramJs.InputUser({\n userId: chatOrUserId,\n accessHash: BigInt(accessHash!),\n });\n } else if (chatOrUserId <= -1000000000) {\n return new GramJs.InputChannel({\n channelId: -chatOrUserId,\n accessHash: BigInt(accessHash!),\n });\n } else {\n return -chatOrUserId;\n }\n}\n\nexport function buildInputStickerSet(id: string, accessHash: string) {\n return new GramJs.InputStickerSetID({\n id: BigInt(id),\n accessHash: BigInt(accessHash),\n });\n}\n\nexport function buildInputDocument(media: ApiSticker | ApiVideo) {\n const document = localDb.documents[media.id];\n\n if (!document) {\n return undefined;\n }\n\n return new GramJs.InputDocument(pick(document, [\n 'id',\n 'accessHash',\n 'fileReference',\n ]));\n}\n\nexport function buildInputMediaDocument(media: ApiSticker | ApiVideo) {\n const inputDocument = buildInputDocument(media);\n\n if (!inputDocument) {\n return undefined;\n }\n\n return new GramJs.InputMediaDocument({ id: inputDocument });\n}\n\nexport function buildInputPoll(pollParams: ApiNewPoll, randomId: BigInt.BigInteger) {\n const { summary, quiz } = pollParams;\n\n const poll = new GramJs.Poll({\n id: randomId,\n publicVoters: summary.isPublic,\n question: summary.question,\n answers: summary.answers.map(({ text, option }) => new GramJs.PollAnswer({ text, option: Buffer.from(option) })),\n quiz: summary.quiz,\n multipleChoice: summary.multipleChoice,\n });\n\n if (!quiz) {\n return new GramJs.InputMediaPoll({ poll });\n }\n\n const correctAnswers = quiz.correctAnswers.map((key) => Buffer.from(key));\n const { solution } = quiz;\n const solutionEntities = quiz.solutionEntities ? quiz.solutionEntities.map(buildMtpMessageEntity) : [];\n\n return new GramJs.InputMediaPoll({\n poll,\n correctAnswers,\n ...(solution && {\n solution,\n solutionEntities,\n }),\n });\n}\n\nexport function buildFilterFromApiFolder(folder: ApiChatFolder): GramJs.DialogFilter {\n const {\n emoticon,\n contacts,\n nonContacts,\n groups,\n channels,\n bots,\n excludeArchived,\n excludeMuted,\n excludeRead,\n pinnedChatIds,\n includedChatIds,\n excludedChatIds,\n } = folder;\n\n const pinnedPeers = pinnedChatIds\n ? pinnedChatIds.map(buildInputPeerFromLocalDb).filter(Boolean as any)\n : [];\n\n const includePeers = includedChatIds\n ? includedChatIds.map(buildInputPeerFromLocalDb).filter(Boolean as any)\n : [];\n\n const excludePeers = excludedChatIds\n ? excludedChatIds.map(buildInputPeerFromLocalDb).filter(Boolean as any)\n : [];\n\n return new GramJs.DialogFilter({\n id: folder.id,\n title: folder.title,\n emoticon: emoticon || undefined,\n contacts: contacts || undefined,\n nonContacts: nonContacts || undefined,\n groups: groups || undefined,\n bots: bots || undefined,\n excludeArchived: excludeArchived || undefined,\n excludeMuted: excludeMuted || undefined,\n excludeRead: excludeRead || undefined,\n broadcasts: channels || undefined,\n pinnedPeers,\n includePeers,\n excludePeers,\n });\n}\n\nexport function generateRandomBigInt() {\n return readBigIntFromBuffer(generateRandomBytes(8), true, true);\n}\n\nexport function buildMessageFromUpdate(\n id: number,\n chatId: number,\n update: GramJs.UpdateShortSentMessage | GramJs.UpdateServiceNotification,\n) {\n // This is not a proper message, but we only need these fields for downloading media through `localDb`.\n return new GramJs.Message({\n id,\n peerId: buildPeer(chatId),\n fromId: buildPeer(chatId),\n media: update.media,\n } as GramJs.Message);\n}\n\nexport function buildMtpMessageEntity(entity: ApiMessageEntity): GramJs.TypeMessageEntity {\n const {\n type, offset, length, url, userId,\n } = entity;\n\n const user = userId ? localDb.users[userId] : undefined;\n\n switch (type) {\n case ApiMessageEntityTypes.Bold:\n return new GramJs.MessageEntityBold({ offset, length });\n case ApiMessageEntityTypes.Italic:\n return new GramJs.MessageEntityItalic({ offset, length });\n case ApiMessageEntityTypes.Underline:\n return new GramJs.MessageEntityUnderline({ offset, length });\n case ApiMessageEntityTypes.Strike:\n return new GramJs.MessageEntityStrike({ offset, length });\n case ApiMessageEntityTypes.Code:\n return new GramJs.MessageEntityCode({ offset, length });\n case ApiMessageEntityTypes.Pre:\n return new GramJs.MessageEntityPre({ offset, length, language: '' });\n case ApiMessageEntityTypes.Blockquote:\n return new GramJs.MessageEntityBlockquote({ offset, length });\n case ApiMessageEntityTypes.TextUrl:\n return new GramJs.MessageEntityTextUrl({ offset, length, url: url! });\n case ApiMessageEntityTypes.Url:\n return new GramJs.MessageEntityUrl({ offset, length });\n case ApiMessageEntityTypes.Hashtag:\n return new GramJs.MessageEntityHashtag({ offset, length });\n case ApiMessageEntityTypes.MentionName:\n return new GramJs.InputMessageEntityMentionName({\n offset,\n length,\n userId: new GramJs.InputUser({ userId: userId!, accessHash: user!.accessHash! }),\n });\n default:\n return new GramJs.MessageEntityUnknown({ offset, length });\n }\n}\n\n// TODO: This formula is taken from API docs, but doesn't seem to calculate hash correctly\nexport function calculateResultHash(ids: number[]) {\n let hash = 0;\n ids.forEach((id) => {\n // eslint-disable-next-line no-bitwise\n hash = (((hash * 0x4F25) & 0x7FFFFFFF) + id) & 0x7FFFFFFF;\n });\n\n return hash;\n}\n\nexport function isMessageWithMedia(message: GramJs.Message | GramJs.UpdateServiceNotification) {\n const { media } = message;\n if (!media) {\n return false;\n }\n\n return (\n media instanceof GramJs.MessageMediaPhoto\n || media instanceof GramJs.MessageMediaDocument\n || (\n media instanceof GramJs.MessageMediaWebPage\n && media.webpage instanceof GramJs.WebPage\n && (\n media.webpage.photo instanceof GramJs.Photo || (\n media.webpage.document instanceof GramJs.Document\n && media.webpage.document.mimeType.startsWith('video')\n )\n )\n )\n );\n}\n\nexport function isServiceMessageWithMedia(message: GramJs.MessageService) {\n return 'photo' in message.action && message.action.photo instanceof GramJs.Photo;\n}\n\nexport function buildChatPhotoForLocalDb(photo: GramJs.TypePhoto) {\n if (photo instanceof GramJs.PhotoEmpty) {\n return new GramJs.ChatPhotoEmpty();\n }\n\n const { dcId, id: photoId } = photo;\n\n return new GramJs.ChatPhoto({\n dcId,\n photoId,\n });\n}\n\nexport function buildInputContact({\n phone,\n firstName,\n lastName,\n}: {\n phone: string;\n firstName: string;\n lastName: string;\n}) {\n return new GramJs.InputPhoneContact({\n clientId: BigInt(1),\n phone,\n firstName,\n lastName,\n });\n}\n\nexport function buildChatBannedRights(\n bannedRights: ApiChatBannedRights,\n untilDate = 0,\n) {\n return new GramJs.ChatBannedRights({\n ...bannedRights,\n untilDate,\n });\n}\n\nexport function buildChatAdminRights(\n adminRights: ApiChatAdminRights,\n) {\n return new GramJs.ChatAdminRights(adminRights);\n}\n\nexport function buildShippingInfo(info: GramJs.PaymentRequestedInfo) {\n const { shippingAddress } = info;\n return new GramJs.PaymentRequestedInfo({\n ...info,\n shippingAddress: shippingAddress\n ? new GramJs.PostAddress(shippingAddress)\n : undefined,\n });\n}\n\nexport function buildInputPrivacyKey(privacyKey: ApiPrivacyKey) {\n switch (privacyKey) {\n case 'phoneNumber':\n return new GramJs.InputPrivacyKeyPhoneNumber();\n\n case 'lastSeen':\n return new GramJs.InputPrivacyKeyStatusTimestamp();\n\n case 'profilePhoto':\n return new GramJs.InputPrivacyKeyProfilePhoto();\n\n case 'forwards':\n return new GramJs.InputPrivacyKeyForwards();\n\n case 'chatInvite':\n return new GramJs.InputPrivacyKeyChatInvite();\n }\n\n return undefined;\n}\n\nexport function buildInputReportReason(reason: ApiReportReason) {\n switch (reason) {\n case 'spam':\n return new GramJs.InputReportReasonSpam();\n case 'violence':\n return new GramJs.InputReportReasonViolence();\n case 'childAbuse':\n return new GramJs.InputReportReasonChildAbuse();\n case 'pornography':\n return new GramJs.InputReportReasonPornography();\n case 'copyright':\n return new GramJs.InputReportReasonCopyright();\n case 'fake':\n return new GramJs.InputReportReasonFake();\n case 'geoIrrelevant':\n return new GramJs.InputReportReasonGeoIrrelevant();\n case 'other':\n return new GramJs.InputReportReasonOther();\n }\n\n return undefined;\n}\n","import { Api as GramJs } from '../../../lib/gramjs';\n\nexport function isPeerUser(peer: GramJs.TypePeer): peer is GramJs.PeerUser {\n return peer.hasOwnProperty('userId');\n}\n\nexport function isPeerChat(peer: GramJs.TypePeer): peer is GramJs.PeerChat {\n return peer.hasOwnProperty('chatId');\n}\n\nexport function isPeerChannel(peer: GramJs.TypePeer): peer is GramJs.PeerChannel {\n return peer.hasOwnProperty('channelId');\n}\n\nexport function isInputPeerUser(peer: GramJs.TypeInputPeer): peer is GramJs.InputPeerUser {\n return peer.hasOwnProperty('userId');\n}\n\nexport function isInputPeerChat(peer: GramJs.TypeInputPeer): peer is GramJs.InputPeerChat {\n return peer.hasOwnProperty('chatId');\n}\n\nexport function isInputPeerChannel(peer: GramJs.TypeInputPeer): peer is GramJs.InputPeerChannel {\n return peer.hasOwnProperty('channelId');\n}\n","import { Api as GramJs } from '../../../lib/gramjs';\nimport {\n ApiChat,\n ApiChatAdminRights,\n ApiChatBannedRights,\n ApiChatFolder,\n ApiChatMember,\n ApiRestrictionReason,\n} from '../../types';\nimport { pick, pickTruthy } from '../../../util/iteratees';\nimport {\n isInputPeerChannel, isInputPeerChat, isInputPeerUser, isPeerChat, isPeerUser,\n} from './peers';\nimport { omitVirtualClassFields } from './helpers';\n\ntype PeerEntityApiChatFields = Omit;\n\nfunction buildApiChatFieldsFromPeerEntity(\n peerEntity: GramJs.TypeUser | GramJs.TypeChat,\n isSupport = false,\n): PeerEntityApiChatFields {\n const isMin = Boolean('min' in peerEntity && peerEntity.min);\n const accessHash = ('accessHash' in peerEntity) && String(peerEntity.accessHash);\n const avatarHash = ('photo' in peerEntity) && peerEntity.photo && buildAvatarHash(peerEntity.photo);\n const isSignaturesShown = Boolean('signatures' in peerEntity && peerEntity.signatures);\n const hasPrivateLink = Boolean('hasLink' in peerEntity && peerEntity.hasLink);\n\n return {\n isMin,\n hasPrivateLink,\n isSignaturesShown,\n ...(accessHash && { accessHash }),\n ...(avatarHash && { avatarHash }),\n ...(\n (peerEntity instanceof GramJs.Channel || peerEntity instanceof GramJs.User)\n && { username: peerEntity.username }\n ),\n ...(('verified' in peerEntity) && { isVerified: peerEntity.verified }),\n ...(('callActive' in peerEntity) && { isCallActive: peerEntity.callActive }),\n ...(('callNotEmpty' in peerEntity) && { isCallNotEmpty: peerEntity.callNotEmpty }),\n ...((peerEntity instanceof GramJs.Chat || peerEntity instanceof GramJs.Channel) && {\n ...(peerEntity.participantsCount && { membersCount: peerEntity.participantsCount }),\n joinDate: peerEntity.date,\n }),\n ...(isSupport && { isSupport: true }),\n ...buildApiChatPermissions(peerEntity),\n ...(('creator' in peerEntity) && { isCreator: peerEntity.creator }),\n ...buildApiChatRestrictions(peerEntity),\n ...buildApiChatMigrationInfo(peerEntity),\n };\n}\n\nexport function buildApiChatFromDialog(\n dialog: GramJs.Dialog,\n peerEntity: GramJs.TypeUser | GramJs.TypeChat,\n serverTimeOffset: number,\n): ApiChat {\n const {\n peer, folderId, unreadMark, unreadCount, unreadMentionsCount, notifySettings: { silent, muteUntil },\n readOutboxMaxId, readInboxMaxId, draft,\n } = dialog;\n const isMuted = silent || (typeof muteUntil === 'number' && Date.now() + serverTimeOffset * 1000 < muteUntil * 1000);\n\n return {\n id: getApiChatIdFromMtpPeer(peer),\n ...(folderId && { folderId }),\n type: getApiChatTypeFromPeerEntity(peerEntity),\n title: getApiChatTitleFromMtpPeer(peer, peerEntity),\n lastReadOutboxMessageId: readOutboxMaxId,\n lastReadInboxMessageId: readInboxMaxId,\n unreadCount,\n unreadMentionsCount,\n isMuted,\n ...(unreadMark && { hasUnreadMark: true }),\n ...(draft instanceof GramJs.DraftMessage && { draftDate: draft.date }),\n ...buildApiChatFieldsFromPeerEntity(peerEntity),\n };\n}\n\nfunction buildApiChatPermissions(peerEntity: GramJs.TypeUser | GramJs.TypeChat): {\n adminRights?: ApiChatAdminRights;\n currentUserBannedRights?: ApiChatBannedRights;\n defaultBannedRights?: ApiChatBannedRights;\n} {\n if (!(peerEntity instanceof GramJs.Chat || peerEntity instanceof GramJs.Channel)) {\n return {};\n }\n\n return {\n adminRights: omitVirtualClassFields(peerEntity.adminRights),\n currentUserBannedRights: peerEntity instanceof GramJs.Channel\n ? omitVirtualClassFields(peerEntity.bannedRights)\n : undefined,\n defaultBannedRights: omitVirtualClassFields(peerEntity.defaultBannedRights),\n };\n}\n\nfunction buildApiChatRestrictions(peerEntity: GramJs.TypeUser | GramJs.TypeChat): {\n isNotJoined?: boolean;\n isRestricted?: boolean;\n restrictionReason?: ApiRestrictionReason;\n} {\n if (peerEntity instanceof GramJs.ChatForbidden || peerEntity instanceof GramJs.ChannelForbidden) {\n return {\n isRestricted: true,\n };\n }\n\n const restrictions = {};\n\n if ('restricted' in peerEntity) {\n const restrictionReason = peerEntity.restricted\n ? buildApiChatRestrictionReason(peerEntity.restrictionReason)\n : undefined;\n\n if (restrictionReason) {\n Object.assign(restrictions, {\n isRestricted: true,\n restrictionReason,\n });\n }\n }\n\n if (peerEntity instanceof GramJs.Chat) {\n Object.assign(restrictions, {\n isNotJoined: peerEntity.left,\n isRestricted: peerEntity.kicked,\n });\n }\n\n if (peerEntity instanceof GramJs.Channel) {\n Object.assign(restrictions, {\n // `left` is weirdly set to `true` on all channels never joined before\n isNotJoined: peerEntity.left,\n });\n }\n\n return restrictions;\n}\n\nfunction buildApiChatMigrationInfo(peerEntity: GramJs.TypeChat): {\n migratedTo?: {\n chatId: number;\n accessHash?: string;\n };\n} {\n if (\n peerEntity instanceof GramJs.Chat\n && peerEntity.migratedTo\n && !(peerEntity.migratedTo instanceof GramJs.InputChannelEmpty)\n ) {\n return {\n migratedTo: {\n chatId: getApiChatIdFromMtpPeer(peerEntity.migratedTo),\n ...(peerEntity.migratedTo instanceof GramJs.InputChannel && {\n accessHash: peerEntity.migratedTo.accessHash.toString(),\n }),\n },\n };\n }\n\n return {};\n}\n\nfunction buildApiChatRestrictionReason(\n restrictionReasons?: GramJs.RestrictionReason[],\n): ApiRestrictionReason | undefined {\n if (!restrictionReasons) {\n return undefined;\n }\n\n const targetReason = restrictionReasons.find(({ platform }) => platform === 'all');\n return targetReason ? pick(targetReason, ['reason', 'text']) : undefined;\n}\n\nexport function buildApiChatFromPreview(\n preview: GramJs.TypeChat | GramJs.TypeUser,\n isSupport = false,\n withForbidden = false,\n): ApiChat | undefined {\n if (!(\n preview instanceof GramJs.Chat\n || preview instanceof GramJs.Channel\n || preview instanceof GramJs.User\n || (\n withForbidden\n && (\n preview instanceof GramJs.ChatForbidden\n || preview instanceof GramJs.ChannelForbidden\n )\n )\n )) {\n return undefined;\n }\n\n return {\n id: preview instanceof GramJs.User ? preview.id : -preview.id,\n type: getApiChatTypeFromPeerEntity(preview),\n title: preview instanceof GramJs.User ? getUserName(preview) : preview.title,\n ...buildApiChatFieldsFromPeerEntity(preview, isSupport),\n };\n}\n\nexport function getApiChatIdFromMtpPeer(peer: GramJs.TypePeer): number {\n if (isPeerUser(peer)) {\n return peer.userId;\n } else if (isPeerChat(peer)) {\n return -peer.chatId;\n } else {\n return -peer.channelId;\n }\n}\n\nexport function getApiChatIdFromInputMtpPeer(peer: GramJs.TypeInputPeer): number | undefined {\n if (isInputPeerUser(peer)) {\n return peer.userId;\n } else if (isInputPeerChat(peer)) {\n return -peer.chatId;\n } else if (isInputPeerChannel(peer)) {\n return -peer.channelId;\n }\n return undefined;\n}\n\nexport function getApiChatTypeFromPeerEntity(peerEntity: GramJs.TypeChat | GramJs.TypeUser) {\n if (peerEntity instanceof GramJs.User || peerEntity instanceof GramJs.UserEmpty) {\n return 'chatTypePrivate';\n } else if (\n peerEntity instanceof GramJs.Chat\n || peerEntity instanceof GramJs.ChatForbidden\n || peerEntity instanceof GramJs.ChatEmpty\n ) {\n return 'chatTypeBasicGroup';\n } else {\n return peerEntity.megagroup ? 'chatTypeSuperGroup' : 'chatTypeChannel';\n }\n}\n\nexport function getPeerKey(peer: GramJs.TypePeer) {\n if (isPeerUser(peer)) {\n return `user${peer.userId}`;\n } else if (isPeerChat(peer)) {\n return `chat${peer.chatId}`;\n } else {\n return `chat${peer.channelId}`;\n }\n}\n\nexport function getApiChatTitleFromMtpPeer(peer: GramJs.TypePeer, peerEntity: GramJs.User | GramJs.Chat) {\n if (isPeerUser(peer)) {\n return getUserName(peerEntity as GramJs.User);\n } else {\n return (peerEntity as GramJs.Chat).title;\n }\n}\n\nfunction getUserName(user: GramJs.User) {\n return user.firstName\n ? `${user.firstName}${user.lastName ? ` ${user.lastName}` : ''}`\n : (user.lastName || undefined);\n}\n\nexport function buildAvatarHash(photo: GramJs.TypeUserProfilePhoto | GramJs.TypeChatPhoto) {\n if ('photoId' in photo) {\n return photo.photoId.toString();\n }\n\n return undefined;\n}\n\nexport function buildChatMember(\n member: GramJs.TypeChatParticipant | GramJs.TypeChannelParticipant,\n): ApiChatMember | undefined {\n const userId = (member instanceof GramJs.ChannelParticipantBanned || member instanceof GramJs.ChannelParticipantLeft)\n ? getApiChatIdFromMtpPeer(member.peer)\n : member.userId;\n\n return {\n userId,\n inviterId: 'inviterId' in member ? member.inviterId : undefined,\n joinedDate: 'date' in member ? member.date : undefined,\n kickedByUserId: 'kickedBy' in member ? member.kickedBy : undefined,\n promotedByUserId: 'promotedBy' in member ? member.promotedBy : undefined,\n bannedRights: 'bannedRights' in member ? omitVirtualClassFields(member.bannedRights) : undefined,\n adminRights: 'adminRights' in member ? omitVirtualClassFields(member.adminRights) : undefined,\n customTitle: 'rank' in member ? member.rank : undefined,\n ...((member instanceof GramJs.ChannelParticipantAdmin || member instanceof GramJs.ChatParticipantAdmin) && {\n isAdmin: true,\n }),\n ...((member instanceof GramJs.ChannelParticipantCreator || member instanceof GramJs.ChatParticipantCreator) && {\n isOwner: true,\n }),\n };\n}\n\nexport function buildChatMembers(\n participants: GramJs.TypeChatParticipants | GramJs.channels.ChannelParticipants,\n) {\n // Duplicate code because of TS union-type shenanigans\n if (participants instanceof GramJs.ChatParticipants) {\n return participants.participants.map(buildChatMember).filter(Boolean as any);\n }\n if (participants instanceof GramJs.channels.ChannelParticipants) {\n return participants.participants.map(buildChatMember).filter(Boolean as any);\n }\n\n return undefined;\n}\n\nexport function buildChatTypingStatus(\n update: GramJs.UpdateUserTyping | GramJs.UpdateChatUserTyping | GramJs.UpdateChannelUserTyping,\n serverTimeOffset: number,\n) {\n let action: string = '';\n if (update.action instanceof GramJs.SendMessageCancelAction) {\n return undefined;\n } else if (update.action instanceof GramJs.SendMessageTypingAction) {\n action = 'lng_user_typing';\n } else if (update.action instanceof GramJs.SendMessageRecordVideoAction) {\n action = 'lng_send_action_record_video';\n } else if (update.action instanceof GramJs.SendMessageUploadVideoAction) {\n action = 'lng_send_action_upload_video';\n } else if (update.action instanceof GramJs.SendMessageRecordAudioAction) {\n action = 'lng_send_action_record_audio';\n } else if (update.action instanceof GramJs.SendMessageUploadAudioAction) {\n action = 'lng_send_action_upload_audio';\n } else if (update.action instanceof GramJs.SendMessageUploadPhotoAction) {\n action = 'lng_send_action_upload_photo';\n } else if (update.action instanceof GramJs.SendMessageUploadDocumentAction) {\n action = 'lng_send_action_upload_file';\n } else if (update.action instanceof GramJs.SendMessageGeoLocationAction) {\n action = 'selecting a location to share';\n } else if (update.action instanceof GramJs.SendMessageChooseContactAction) {\n action = 'selecting a contact to share';\n } else if (update.action instanceof GramJs.SendMessageGamePlayAction) {\n action = 'lng_playing_game';\n } else if (update.action instanceof GramJs.SendMessageRecordRoundAction) {\n action = 'lng_send_action_record_round';\n } else if (update.action instanceof GramJs.SendMessageUploadRoundAction) {\n action = 'lng_send_action_upload_round';\n }\n\n return {\n action,\n ...(!(update instanceof GramJs.UpdateUserTyping) && { userId: getApiChatIdFromMtpPeer(update.fromId) }),\n timestamp: Date.now() + serverTimeOffset * 1000,\n };\n}\n\nexport function buildApiChatFolder(filter: GramJs.DialogFilter): ApiChatFolder {\n return {\n ...pickTruthy(filter, [\n 'id', 'title', 'emoticon', 'contacts', 'nonContacts', 'groups', 'bots',\n 'excludeMuted', 'excludeRead', 'excludeArchived',\n ]),\n channels: filter.broadcasts,\n pinnedChatIds: filter.pinnedPeers.map(getApiChatIdFromInputMtpPeer).filter(Boolean as any),\n includedChatIds: filter.includePeers.map(getApiChatIdFromInputMtpPeer).filter(Boolean as any),\n excludedChatIds: filter.excludePeers.map(getApiChatIdFromInputMtpPeer).filter(Boolean as any),\n };\n}\n\nexport function buildApiChatFolderFromSuggested({\n filter, description,\n}: {\n filter: GramJs.DialogFilter;\n description: string;\n}): ApiChatFolder {\n return {\n ...buildApiChatFolder(filter),\n description,\n };\n}\n","export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const APP_NAME = process.env.APP_NAME || 'Telegram WebZ';\nexport const APP_VERSION = process.env.APP_VERSION || 'dev';\n\nexport const DEBUG = (\n process.env.APP_ENV !== 'production' && process.env.APP_ENV !== 'perf' && process.env.APP_ENV !== 'test'\n);\nexport const DEBUG_MORE = false;\n\nexport const IS_TEST = process.env.APP_ENV === 'test';\nexport const IS_PERF = process.env.APP_ENV === 'perf';\n\nexport const DEBUG_ALERT_MSG = 'Shoot!\\nSomething went wrong, please see the error details in Dev Tools Console.';\nexport const DEBUG_GRAMJS = false;\n\nexport const SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_KEY = 'GramJs:sessionId';\n\nexport const GLOBAL_STATE_CACHE_DISABLED = false;\nexport const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';\nexport const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 30;\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 5000;\n\nexport const MEDIA_CACHE_DISABLED = false;\nexport const MEDIA_CACHE_NAME = 'tt-media';\nexport const MEDIA_CACHE_NAME_AVATARS = 'tt-media-avatars';\nexport const MEDIA_PROGRESSIVE_CACHE_DISABLED = false;\nexport const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive';\nexport const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB\nexport const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg';\nexport const LANG_CACHE_NAME = 'tt-lang-packs-v5';\nexport const ASSET_CACHE_NAME = 'tt-assets';\n\nexport const DOWNLOAD_WORKERS = 16;\nexport const UPLOAD_WORKERS = 16;\n\nconst isBigScreen = typeof window !== 'undefined' && window.innerHeight >= 900;\n\nexport const MIN_PASSWORD_LENGTH = 1;\n\nexport const MESSAGE_LIST_SENSITIVE_AREA = 750;\nexport const MESSAGE_LIST_SLICE = isBigScreen ? 60 : 40;\nexport const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2;\n\nexport const CHAT_HEIGHT_PX = 72;\nexport const CHAT_LIST_SLICE = isBigScreen ? 30 : 25;\nexport const CHAT_LIST_LOAD_SLICE = 100;\nexport const SHARED_MEDIA_SLICE = 42;\nexport const MESSAGE_SEARCH_SLICE = 42;\nexport const GLOBAL_SEARCH_SLICE = 20;\nexport const MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const ANIMATION_LEVEL_MIN = 0;\nexport const ANIMATION_LEVEL_MED = 1;\nexport const ANIMATION_LEVEL_MAX = 2;\nexport const ANIMATION_LEVEL_DEFAULT = ANIMATION_LEVEL_MAX;\n\nexport const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16;\nexport const IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 17;\nexport const MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 15;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\n\n// Screen width where Pinned Message / Audio Player in the Middle Header can be safely displayed\nexport const SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1440; // px\n// Screen width where Pinned Message / Audio Player in the Middle Header shouldn't collapse with ChatInfo\nexport const SAFE_SCREEN_WIDTH_FOR_CHAT_INFO = 1150; // px\n\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1275; // px\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN = 925; // px\nexport const MOBILE_SCREEN_MAX_WIDTH = 600; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH = 950; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT = 450; // px\n\nexport const LOCAL_MESSAGE_ID_BASE = 1e9;\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const FAST_SMOOTH_MAX_DISTANCE = 1500;\nexport const FAST_SMOOTH_MIN_DURATION = 250;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 500; // px\n\n// Average duration of message sending animation\nexport const API_UPDATE_THROTTLE = Math.round((FAST_SMOOTH_MIN_DURATION + FAST_SMOOTH_MAX_DURATION) / 2);\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\n\nexport const STICKER_SIZE_INLINE_DESKTOP_FACTOR = 13;\nexport const STICKER_SIZE_INLINE_MOBILE_FACTOR = 11;\nexport const STICKER_SIZE_AUTH = 160;\nexport const STICKER_SIZE_AUTH_MOBILE = 120;\nexport const STICKER_SIZE_PICKER = 64;\nexport const STICKER_SIZE_GENERAL_SETTINGS = 48;\nexport const STICKER_SIZE_PICKER_HEADER = 32;\nexport const STICKER_SIZE_SEARCH = 64;\nexport const STICKER_SIZE_MODAL = 64;\nexport const STICKER_SIZE_TWO_FA = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 80;\nexport const STICKER_SIZE_INLINE_BOT_RESULT = 100;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const BASE_EMOJI_KEYWORD_LANG = 'en';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = new Set([\n 'image/png', 'image/gif', 'image/jpeg', 'video/mp4', 'video/avi', 'video/quicktime',\n]);\n\n// eslint-disable-next-line max-len\nexport const RE_LINK_TEMPLATE = '((ftp|https?):\\\\/\\\\/)?((www\\\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,63})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_MENTION_TEMPLATE = '(@[\\\\w\\\\d_-]+)';\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)([\\d\\w_]+)(?:\\/([\\d]+))?(?:\\/([\\d]+))?$/gm;\nexport const RE_TME_INVITE_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/joinchat\\/)([\\d\\w_-]+)?$/gm;\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = 777000;\nexport const ALL_FOLDER_ID = 0;\nexport const ARCHIVED_FOLDER_ID = 1;\nexport const DELETED_COMMENTS_CHANNEL_ID = 777;\nexport const MAX_MEDIA_FILES_FOR_ALBUM = 10;\nexport const MAX_ACTIVE_PINNED_CHATS = 5;\nexport const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE;\nexport const DEFAULT_LANG_CODE = 'en';\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'] as const;\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const LOCALIZED_TIPS = ['ar', 'pt-br', 'id', 'it', 'ko', 'ms', 'pl', 'es', 'tr'];\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const LIGHT_THEME_BG_COLOR = '#A2AF8E';\nexport const DARK_THEME_BG_COLOR = '#0F0F0F';\nexport const DARK_THEME_PATTERN_COLOR = '#0a0a0a8c';\nexport const DEFAULT_PATTERN_COLOR = 'rgba(90, 110, 70, 0.6)';\n","import { Api as GramJs } from '../../lib/gramjs';\nimport { ApiMessage } from '../types';\n\ninterface LocalDb {\n localMessages: Record;\n // Used for loading avatars and media through in-memory Gram JS instances.\n chats: Record;\n users: Record;\n messages: Record;\n documents: Record;\n stickerSets: Record;\n photos: Record;\n webDocuments: Record;\n}\n\nexport default {\n localMessages: {},\n chats: {},\n users: {},\n messages: {},\n documents: {},\n stickerSets: {},\n photos: {},\n webDocuments: {},\n} as LocalDb;\n","const {\n parseTl,\n serializeBytes,\n serializeDate,\n} = require('./generationHelpers');\nconst {\n toSignedLittleBuffer,\n} = require('../Helpers');\n\nconst tlContent = require('./apiTl.js');\nconst schemeContent = require('./schemaTl.js');\n\n/* CONTEST\nconst NAMED_AUTO_CASTS = new Set([\n 'chatId,int'\n])\nconst NAMED_BLACKLIST = new Set([\n 'discardEncryption'\n])\nconst AUTO_CASTS = new Set([\n 'InputPeer',\n 'InputChannel',\n 'InputUser',\n 'InputDialogPeer',\n 'InputNotifyPeer',\n 'InputMedia',\n 'InputPhoto',\n 'InputMessage',\n 'InputDocument',\n 'InputChatPhoto'\n])\n\n */\n// eslint-disable-next-line no-restricted-globals\nconst CACHING_SUPPORTED = typeof self !== 'undefined' && self.localStorage !== undefined;\n\nconst CACHE_KEY = 'GramJs:apiCache';\n\nfunction buildApiFromTlSchema() {\n let definitions;\n const fromCache = CACHING_SUPPORTED && loadFromCache();\n\n if (fromCache) {\n definitions = fromCache;\n } else {\n definitions = loadFromTlSchemas();\n\n if (CACHING_SUPPORTED) {\n localStorage.setItem(CACHE_KEY, JSON.stringify(definitions));\n }\n }\n\n return mergeWithNamespaces(\n createClasses('constructor', definitions.constructors),\n createClasses('request', definitions.requests),\n );\n}\n\nfunction loadFromCache() {\n const jsonCache = localStorage.getItem(CACHE_KEY);\n return jsonCache && JSON.parse(jsonCache);\n}\n\nfunction loadFromTlSchemas() {\n const [constructorParamsApi, functionParamsApi] = extractParams(tlContent);\n const [constructorParamsSchema, functionParamsSchema] = extractParams(schemeContent);\n const constructors = [].concat(constructorParamsApi, constructorParamsSchema);\n const requests = [].concat(functionParamsApi, functionParamsSchema);\n\n return {\n constructors,\n requests,\n };\n}\n\nfunction mergeWithNamespaces(obj1, obj2) {\n const result = { ...obj1 };\n\n Object.keys(obj2)\n .forEach((key) => {\n if (typeof obj2[key] === 'function' || !result[key]) {\n result[key] = obj2[key];\n } else {\n Object.assign(result[key], obj2[key]);\n }\n });\n\n return result;\n}\n\nfunction extractParams(fileContent) {\n const f = parseTl(fileContent, 109);\n const constructors = [];\n const functions = [];\n for (const d of f) {\n if (d.isFunction) {\n functions.push(d);\n } else {\n constructors.push(d);\n }\n }\n return [constructors, functions];\n}\n\nfunction argToBytes(x, type) {\n switch (type) {\n case 'int': {\n const i = Buffer.alloc(4);\n i.writeInt32LE(x, 0);\n return i;\n }\n case 'long':\n return toSignedLittleBuffer(x, 8);\n case 'int128':\n return toSignedLittleBuffer(x, 16);\n case 'int256':\n return toSignedLittleBuffer(x, 32);\n case 'double': {\n const d = Buffer.alloc(8);\n d.writeDoubleLE(x, 0);\n return d;\n }\n case 'string':\n return serializeBytes(x);\n case 'Bool':\n return x ? Buffer.from('b5757299', 'hex') : Buffer.from('379779bc', 'hex');\n case 'true':\n return Buffer.alloc(0);\n case 'bytes':\n return serializeBytes(x);\n case 'date':\n return serializeDate(x);\n default:\n return x.getBytes();\n }\n}\n\n/*\nCONTEST\nasync function getInputFromResolve(utils, client, peer, peerType) {\n switch (peerType) {\n case 'InputPeer':\n return utils.getInputPeer(await client.getInputEntity(peer))\n case 'InputChannel':\n return utils.getInputChannel(await client.getInputEntity(peer))\n case 'InputUser':\n return utils.getInputUser(await client.getInputEntity(peer))\n case 'InputDialogPeer':\n return await client._getInputDialog(peer)\n case 'InputNotifyPeer':\n return await client._getInputNotify(peer)\n case 'InputMedia':\n return utils.getInputMedia(peer)\n case 'InputPhoto':\n return utils.getInputPhoto(peer)\n case 'InputMessage':\n return utils.getInputMessage(peer)\n case 'InputDocument':\n return utils.getInputDocument(peer)\n case 'InputChatPhoto':\n return utils.getInputChatPhoto(peer)\n case 'chatId,int' :\n return await client.getPeerId(peer, false)\n default:\n throw new Error('unsupported peer type : ' + peerType)\n }\n}\n*/\nfunction getArgFromReader(reader, arg) {\n if (arg.isVector) {\n if (arg.useVectorId) {\n reader.readInt();\n }\n const temp = [];\n const len = reader.readInt();\n arg.isVector = false;\n for (let i = 0; i < len; i++) {\n temp.push(getArgFromReader(reader, arg));\n }\n arg.isVector = true;\n return temp;\n } else if (arg.flagIndicator) {\n return reader.readInt();\n } else {\n switch (arg.type) {\n case 'int':\n return reader.readInt();\n case 'long':\n return reader.readLong();\n case 'int128':\n return reader.readLargeInt(128);\n case 'int256':\n return reader.readLargeInt(256);\n case 'double':\n return reader.readDouble();\n case 'string':\n return reader.tgReadString();\n case 'Bool':\n return reader.tgReadBool();\n case 'true':\n return true;\n case 'bytes':\n return reader.tgReadBytes();\n case 'date':\n return reader.tgReadDate();\n default:\n if (!arg.skipConstructorId) {\n return reader.tgReadObject();\n } else {\n throw new Error(`Unknown type ${arg}`);\n }\n }\n }\n}\n\nfunction createClasses(classesType, params) {\n const classes = {};\n for (const classParams of params) {\n const {\n name,\n constructorId,\n subclassOfId,\n argsConfig,\n namespace,\n result,\n } = classParams;\n const fullName = [namespace, name].join('.')\n .replace(/^\\./, '');\n\n class VirtualClass {\n static CONSTRUCTOR_ID = constructorId;\n\n static SUBCLASS_OF_ID = subclassOfId;\n\n static className = fullName;\n\n static classType = classesType;\n\n CONSTRUCTOR_ID = constructorId;\n\n SUBCLASS_OF_ID = subclassOfId;\n\n className = fullName;\n\n classType = classesType;\n\n constructor(args) {\n args = args || {};\n Object.keys(args)\n .forEach((argName) => {\n this[argName] = args[argName];\n });\n }\n\n static fromReader(reader) {\n const args = {};\n\n for (const argName in argsConfig) {\n if (argsConfig.hasOwnProperty(argName)) {\n const arg = argsConfig[argName];\n if (arg.isFlag) {\n if (arg.type === 'true') {\n args[argName] = Boolean(args.flags & (1 << arg.flagIndex));\n continue;\n }\n if (args.flags & (1 << arg.flagIndex)) {\n args[argName] = getArgFromReader(reader, arg);\n } else {\n args[argName] = undefined;\n }\n } else {\n if (arg.flagIndicator) {\n arg.name = 'flags';\n }\n args[argName] = getArgFromReader(reader, arg);\n }\n }\n }\n return new VirtualClass(args);\n }\n\n getBytes() {\n // The next is pseudo-code:\n const idForBytes = this.CONSTRUCTOR_ID;\n const c = Buffer.alloc(4);\n c.writeUInt32LE(idForBytes, 0);\n const buffers = [c];\n for (const arg in argsConfig) {\n if (argsConfig.hasOwnProperty(arg)) {\n if (argsConfig[arg].isFlag) {\n if ((this[arg] === false && argsConfig[arg].type === 'true')\n || this[arg] === undefined) {\n continue;\n }\n }\n if (argsConfig[arg].isVector) {\n if (argsConfig[arg].useVectorId) {\n buffers.push(Buffer.from('15c4b51c', 'hex'));\n }\n const l = Buffer.alloc(4);\n l.writeInt32LE(this[arg].length, 0);\n buffers.push(l, Buffer.concat(this[arg].map((x) => argToBytes(x, argsConfig[arg].type))));\n } else if (argsConfig[arg].flagIndicator) {\n if (!Object.values(argsConfig)\n .some((f) => f.isFlag)) {\n buffers.push(Buffer.alloc(4));\n } else {\n let flagCalculate = 0;\n for (const f in argsConfig) {\n if (argsConfig[f].isFlag) {\n if ((this[f] === false && argsConfig[f].type === 'true')\n || this[f] === undefined) {\n flagCalculate |= 0;\n } else {\n flagCalculate |= 1 << argsConfig[f].flagIndex;\n }\n }\n }\n const f = Buffer.alloc(4);\n f.writeUInt32LE(flagCalculate, 0);\n buffers.push(f);\n }\n } else {\n buffers.push(argToBytes(this[arg], argsConfig[arg].type));\n\n if (this[arg] && typeof this[arg].getBytes === 'function') {\n let boxed = (argsConfig[arg].type.charAt(argsConfig[arg].type.indexOf('.') + 1));\n boxed = boxed === boxed.toUpperCase();\n if (!boxed) {\n buffers.shift();\n }\n }\n }\n }\n }\n return Buffer.concat(buffers);\n }\n\n readResult(reader) {\n if (classesType !== 'request') {\n throw new Error('`readResult()` called for non-request instance');\n }\n\n const m = result.match(/Vector<(int|long)>/);\n if (m) {\n reader.readInt();\n const temp = [];\n const len = reader.readInt();\n if (m[1] === 'int') {\n for (let i = 0; i < len; i++) {\n temp.push(reader.readInt());\n }\n } else {\n for (let i = 0; i < len; i++) {\n temp.push(reader.readLong());\n }\n }\n return temp;\n } else {\n return reader.tgReadObject();\n }\n }\n\n /* CONTEST\n async resolve(client, utils) {\n\n if (classesType !== 'request') {\n throw new Error('`resolve()` called for non-request instance')\n }\n\n for (const arg in argsConfig) {\n if (argsConfig.hasOwnProperty(arg)) {\n if (!AUTO_CASTS.has(argsConfig[arg].type)) {\n if (!NAMED_AUTO_CASTS.has(`${argsConfig[arg].name},${argsConfig[arg].type}`)) {\n continue\n }\n }\n if (argsConfig[arg].isFlag) {\n if (!this[arg]) {\n continue\n }\n }\n if (argsConfig[arg].isVector) {\n const temp = []\n for (const x of this[arg]) {\n temp.push(await getInputFromResolve(utils, client, x, argsConfig[arg].type))\n }\n this[arg] = temp\n } else {\n this[arg] = await getInputFromResolve(utils, client, this[arg], argsConfig[arg].type)\n }\n }\n }\n } */\n }\n\n if (namespace) {\n if (!classes[namespace]) {\n classes[namespace] = {};\n }\n classes[namespace][name] = VirtualClass;\n } else {\n classes[name] = VirtualClass;\n }\n }\n\n return classes;\n}\n\nmodule.exports = buildApiFromTlSchema();\n","import { Api as GramJs } from '../../../lib/gramjs';\nimport {\n OnApiUpdate,\n ApiChat,\n ApiMessage,\n ApiUser,\n ApiMessageEntity,\n ApiFormattedText,\n ApiChatFullInfo,\n ApiChatFolder,\n ApiChatBannedRights,\n ApiChatAdminRights,\n} from '../../types';\n\nimport { DEBUG, ARCHIVED_FOLDER_ID, MEMBERS_LOAD_SLICE } from '../../../config';\nimport { invokeRequest, uploadFile } from './client';\nimport {\n buildApiChatFromDialog,\n getPeerKey,\n buildChatMembers,\n buildApiChatFromPreview,\n getApiChatIdFromMtpPeer,\n buildApiChatFolder,\n buildApiChatFolderFromSuggested,\n} from '../apiBuilders/chats';\nimport { buildApiMessage, buildMessageDraft } from '../apiBuilders/messages';\nimport { buildApiUser } from '../apiBuilders/users';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport localDb from '../localDb';\nimport {\n buildInputEntity,\n buildInputPeer,\n buildMtpMessageEntity,\n buildFilterFromApiFolder,\n isMessageWithMedia,\n buildChatBannedRights,\n buildChatAdminRights,\n} from '../gramjsBuilders';\nimport { addMessageToLocalDb } from '../helpers';\n\nconst MAX_INT_32 = 2 ** 31 - 1;\nlet onUpdate: OnApiUpdate;\n\nexport function init(_onUpdate: OnApiUpdate) {\n onUpdate = _onUpdate;\n}\n\nexport async function fetchChats({\n limit,\n offsetDate,\n archived,\n withPinned,\n serverTimeOffset,\n}: {\n limit: number;\n offsetDate?: number;\n archived?: boolean;\n withPinned?: boolean;\n serverTimeOffset: number;\n}) {\n const result = await invokeRequest(new GramJs.messages.GetDialogs({\n offsetPeer: new GramJs.InputPeerEmpty(),\n limit,\n offsetDate,\n folderId: archived ? ARCHIVED_FOLDER_ID : undefined,\n ...(withPinned && { excludePinned: true }),\n }));\n const resultPinned = withPinned\n ? await invokeRequest(new GramJs.messages.GetPinnedDialogs({\n folderId: archived ? ARCHIVED_FOLDER_ID : undefined,\n }))\n : undefined;\n\n if (!result || result instanceof GramJs.messages.DialogsNotModified) {\n return undefined;\n }\n\n\n if (resultPinned) {\n updateLocalDb(resultPinned);\n }\n updateLocalDb(result);\n\n const lastMessagesByChatId = buildCollectionByKey(\n (resultPinned ? resultPinned.messages : []).concat(result.messages)\n .map(buildApiMessage)\n .filter(Boolean as any),\n 'chatId',\n );\n const peersByKey: Record = {\n ...(resultPinned && preparePeers(resultPinned)),\n ...preparePeers(result),\n };\n const chats: ApiChat[] = [];\n const draftsById: Record = {};\n const replyingToById: Record = {};\n\n const dialogs = (resultPinned ? resultPinned.dialogs : []).concat(result.dialogs);\n\n const orderedPinnedIds: number[] = [];\n\n dialogs.forEach((dialog) => {\n if (\n !(dialog instanceof GramJs.Dialog)\n // This request can return dialogs not belonging to specified folder\n || (!archived && dialog.folderId === ARCHIVED_FOLDER_ID)\n || (archived && dialog.folderId !== ARCHIVED_FOLDER_ID)\n ) {\n return;\n }\n\n const peerEntity = peersByKey[getPeerKey(dialog.peer)];\n const chat = buildApiChatFromDialog(dialog, peerEntity, serverTimeOffset);\n chat.lastMessage = lastMessagesByChatId[chat.id];\n chat.isListed = true;\n chats.push(chat);\n\n if (withPinned && dialog.pinned) {\n orderedPinnedIds.push(chat.id);\n }\n\n if (dialog.draft) {\n const { formattedText, replyingToId } = buildMessageDraft(dialog.draft) || {};\n if (formattedText) {\n draftsById[chat.id] = formattedText;\n }\n if (replyingToId) {\n replyingToById[chat.id] = replyingToId;\n }\n }\n });\n\n const users = (resultPinned ? resultPinned.users : []).concat(result.users)\n .map(buildApiUser)\n .filter(Boolean as any);\n const chatIds = chats.map((chat) => chat.id);\n\n let totalChatCount: number;\n\n if (result instanceof GramJs.messages.DialogsSlice) {\n totalChatCount = result.count;\n } else {\n totalChatCount = chatIds.length;\n }\n\n return {\n chatIds,\n chats,\n users,\n draftsById,\n replyingToById,\n orderedPinnedIds: withPinned ? orderedPinnedIds : undefined,\n totalChatCount,\n };\n}\n\nexport function fetchFullChat(chat: ApiChat) {\n const { id, accessHash, adminRights } = chat;\n\n const input = buildInputEntity(id, accessHash);\n\n return input instanceof GramJs.InputChannel\n ? getFullChannelInfo(id, accessHash!, adminRights)\n : getFullChatInfo(id);\n}\n\nexport async function searchChats({ query }: { query: string }) {\n const result = await invokeRequest(new GramJs.contacts.Search({ q: query }));\n if (!result) {\n return undefined;\n }\n\n updateLocalDb(result);\n\n const localPeerIds = result.myResults.map(getApiChatIdFromMtpPeer);\n const allChats = result.chats.concat(result.users)\n .map((user) => buildApiChatFromPreview(user))\n .filter(Boolean as any);\n const allUsers = result.users.map(buildApiUser).filter((user) => !!user && !user.isSelf) as ApiUser[];\n\n return {\n localChats: allChats.filter((r) => localPeerIds.includes(r.id)),\n localUsers: allUsers.filter((u) => localPeerIds.includes(u.id)),\n globalChats: allChats.filter((r) => !localPeerIds.includes(r.id)),\n globalUsers: allUsers.filter((u) => !localPeerIds.includes(u.id)),\n };\n}\n\nexport async function fetchChat({\n type, user,\n}: {\n type: 'user' | 'self' | 'support'; user?: ApiUser;\n}) {\n let mtpUser: GramJs.User | undefined;\n\n if (type === 'self' || type === 'user') {\n const result = await invokeRequest(new GramJs.users.GetUsers({\n id: [\n type === 'user' && user\n ? buildInputEntity(user.id, user.accessHash) as GramJs.InputUser\n : new GramJs.InputUserSelf(),\n ],\n }));\n if (!result || !result.length) {\n return undefined;\n }\n\n [mtpUser] = result;\n } else if (type === 'support') {\n const result = await invokeRequest(new GramJs.help.GetSupport());\n if (!result || !result.user) {\n return undefined;\n }\n\n mtpUser = result.user;\n }\n\n const chat = buildApiChatFromPreview(mtpUser!, type === 'support');\n if (!chat) {\n return undefined;\n }\n\n onUpdate({\n '@type': 'updateChat',\n id: chat.id,\n chat,\n });\n\n return { chatId: chat.id };\n}\n\nexport async function requestChatUpdate({\n chat,\n serverTimeOffset,\n}: {\n chat: ApiChat; serverTimeOffset: number;\n}) {\n const { id, accessHash } = chat;\n\n const result = await invokeRequest(new GramJs.messages.GetPeerDialogs({\n peers: [new GramJs.InputDialogPeer({\n peer: buildInputPeer(id, accessHash),\n })],\n }));\n\n if (!result) {\n return;\n }\n\n const dialog = result.dialogs[0];\n if (!dialog || !(dialog instanceof GramJs.Dialog)) {\n return;\n }\n\n const peersByKey = preparePeers(result);\n const peerEntity = peersByKey[getPeerKey(dialog.peer)];\n if (!peerEntity) {\n return;\n }\n\n updateLocalDb(result);\n\n const lastMessage = buildApiMessage(result.messages[0]);\n\n onUpdate({\n '@type': 'updateChat',\n id,\n chat: {\n ...buildApiChatFromDialog(dialog, peerEntity, serverTimeOffset),\n lastMessage,\n },\n });\n}\n\nexport function saveDraft({\n chat,\n text,\n entities,\n replyToMsgId,\n}: {\n chat: ApiChat;\n text: string;\n entities?: ApiMessageEntity[];\n replyToMsgId?: number;\n}) {\n return invokeRequest(new GramJs.messages.SaveDraft({\n peer: buildInputPeer(chat.id, chat.accessHash),\n message: text,\n ...(entities && {\n entities: entities.map(buildMtpMessageEntity),\n }),\n replyToMsgId,\n }));\n}\n\nexport function clearDraft(chat: ApiChat) {\n return invokeRequest(new GramJs.messages.SaveDraft({\n peer: buildInputPeer(chat.id, chat.accessHash),\n message: '',\n }));\n}\n\nasync function getFullChatInfo(chatId: number): Promise<{\n fullInfo: ApiChatFullInfo;\n users?: ApiUser[];\n} | undefined> {\n const result = await invokeRequest(new GramJs.messages.GetFullChat({\n chatId: buildInputEntity(chatId) as number,\n }));\n\n if (!result || !(result.fullChat instanceof GramJs.ChatFull)) {\n return undefined;\n }\n\n updateLocalDb(result);\n\n const {\n about,\n participants,\n exportedInvite,\n } = result.fullChat;\n\n const members = buildChatMembers(participants);\n const adminMembers = members ? members.filter(({ isAdmin, isOwner }) => isAdmin || isOwner) : undefined;\n\n return {\n fullInfo: {\n about,\n members,\n adminMembers,\n canViewMembers: true,\n ...(exportedInvite && {\n inviteLink: exportedInvite.link,\n }),\n },\n users: result.users.map(buildApiUser).filter(Boolean as any),\n };\n}\n\nasync function getFullChannelInfo(\n id: number,\n accessHash: string,\n adminRights?: ApiChatAdminRights,\n) {\n const result = await invokeRequest(new GramJs.channels.GetFullChannel({\n channel: buildInputEntity(id, accessHash) as GramJs.InputChannel,\n }));\n\n if (!result || !(result.fullChat instanceof GramJs.ChannelFull)) {\n return undefined;\n }\n\n const {\n about,\n onlineCount,\n exportedInvite,\n slowmodeSeconds,\n slowmodeNextSendDate,\n migratedFromChatId,\n migratedFromMaxId,\n canViewParticipants,\n linkedChatId,\n hiddenPrehistory,\n call,\n } = result.fullChat;\n\n const inviteLink = exportedInvite instanceof GramJs.ChatInviteExported\n ? exportedInvite.link\n : undefined;\n\n const { members, users } = (canViewParticipants && await fetchMembers(id, accessHash)) || {};\n const { members: kickedMembers, users: bannedUsers } = (\n canViewParticipants && adminRights && await fetchMembers(id, accessHash, 'kicked')\n ) || {};\n const { members: adminMembers, users: adminUsers } = (\n canViewParticipants && adminRights && await fetchMembers(id, accessHash, 'admin')\n ) || {};\n\n return {\n fullInfo: {\n about,\n onlineCount,\n inviteLink,\n slowMode: slowmodeSeconds ? {\n seconds: slowmodeSeconds,\n nextSendDate: slowmodeNextSendDate,\n } : undefined,\n migratedFrom: migratedFromChatId ? {\n chatId: getApiChatIdFromMtpPeer({ chatId: migratedFromChatId } as GramJs.TypePeer),\n maxMessageId: migratedFromMaxId,\n } : undefined,\n canViewMembers: canViewParticipants,\n isPreHistoryHidden: hiddenPrehistory,\n members,\n kickedMembers,\n adminMembers,\n groupCallId: call ? call.id.toString() : undefined,\n linkedChatId: linkedChatId ? getApiChatIdFromMtpPeer({ chatId: linkedChatId } as GramJs.TypePeer) : undefined,\n },\n users: [...(users || []), ...(bannedUsers || []), ...(adminUsers || [])],\n };\n}\n\nexport async function updateChatMutedState({\n chat, isMuted, serverTimeOffset,\n}: {\n chat: ApiChat; isMuted: boolean; serverTimeOffset: number;\n}) {\n await invokeRequest(new GramJs.account.UpdateNotifySettings({\n peer: new GramJs.InputNotifyPeer({\n peer: buildInputPeer(chat.id, chat.accessHash),\n }),\n settings: new GramJs.InputPeerNotifySettings({ muteUntil: isMuted ? MAX_INT_32 : 0 }),\n }));\n\n onUpdate({\n '@type': 'updateNotifyExceptions',\n chatId: chat.id,\n isMuted,\n });\n\n void requestChatUpdate({\n chat,\n serverTimeOffset,\n });\n}\n\nexport async function createChannel({\n title, about, users,\n}: {\n title: string; about?: string; users: ApiUser[];\n}): Promise {\n const result = await invokeRequest(new GramJs.channels.CreateChannel({\n broadcast: true,\n title,\n about,\n }), true);\n\n // `createChannel` can return a lot of different update types according to docs,\n // but currently channel creation returns only `Updates` type.\n // Errors are added to catch unexpected cases in future testing\n if (!(result instanceof GramJs.Updates)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('Unexpected channel creation update', result);\n }\n return undefined;\n }\n\n const newChannel = result.chats[0];\n if (!newChannel || !(newChannel instanceof GramJs.Channel)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('Created channel not found', result);\n }\n return undefined;\n }\n\n const channel = buildApiChatFromPreview(newChannel)!;\n\n await invokeRequest(new GramJs.channels.InviteToChannel({\n channel: buildInputEntity(channel.id, channel.accessHash) as GramJs.InputChannel,\n users: users.map(({ id, accessHash }) => buildInputEntity(id, accessHash)) as GramJs.InputUser[],\n }));\n\n return channel;\n}\n\nexport function joinChannel({\n channelId, accessHash,\n}: {\n channelId: number; accessHash: string;\n}) {\n return invokeRequest(new GramJs.channels.JoinChannel({\n channel: buildInputEntity(channelId, accessHash) as GramJs.InputChannel,\n }), true);\n}\n\nexport function deleteChatUser({\n chat, user,\n}: {\n chat: ApiChat; user: ApiUser;\n}) {\n if (chat.type !== 'chatTypeBasicGroup') return undefined;\n return invokeRequest(new GramJs.messages.DeleteChatUser({\n chatId: buildInputEntity(chat.id, chat.accessHash) as number,\n userId: buildInputEntity(user.id, user.accessHash) as GramJs.InputUser,\n }), true);\n}\n\nexport function deleteChat({\n chatId,\n}: {\n chatId: number;\n}) {\n return invokeRequest(new GramJs.messages.DeleteChat({\n chatId: buildInputEntity(chatId) as number,\n }), true);\n}\n\nexport function leaveChannel({\n channelId, accessHash,\n}: {\n channelId: number; accessHash: string;\n}) {\n return invokeRequest(new GramJs.channels.LeaveChannel({\n channel: buildInputEntity(channelId, accessHash) as GramJs.InputChannel,\n }), true);\n}\n\nexport function deleteChannel({\n channelId, accessHash,\n}: {\n channelId: number; accessHash: string;\n}) {\n return invokeRequest(new GramJs.channels.DeleteChannel({\n channel: buildInputEntity(channelId, accessHash) as GramJs.InputChannel,\n }), true);\n}\n\nexport async function createGroupChat({\n title, users,\n}: {\n title: string; users: ApiUser[];\n}): Promise {\n const result = await invokeRequest(new GramJs.messages.CreateChat({\n title,\n users: users.map(({ id, accessHash }) => buildInputEntity(id, accessHash)) as GramJs.InputUser[],\n }), true);\n\n // `createChat` can return a lot of different update types according to docs,\n // but currently chat creation returns only `Updates` type.\n // Errors are added to catch unexpected cases in future testing\n if (!(result instanceof GramJs.Updates)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('Unexpected chat creation update', result);\n }\n return undefined;\n }\n\n const newChat = result.chats[0];\n if (!newChat || !(newChat instanceof GramJs.Chat)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('Created chat not found', result);\n }\n return undefined;\n }\n\n return buildApiChatFromPreview(newChat);\n}\n\nexport async function editChatPhoto({\n chatId, accessHash, photo,\n}: {\n chatId: number; accessHash?: string; photo: File;\n}) {\n const uploadedPhoto = await uploadFile(photo);\n const inputEntity = buildInputEntity(chatId, accessHash);\n\n return invokeRequest(\n inputEntity instanceof GramJs.InputChannel\n ? new GramJs.channels.EditPhoto({\n channel: inputEntity as GramJs.InputChannel,\n photo: new GramJs.InputChatUploadedPhoto({\n file: uploadedPhoto,\n }),\n })\n : new GramJs.messages.EditChatPhoto({\n chatId: inputEntity as number,\n photo: new GramJs.InputChatUploadedPhoto({\n file: uploadedPhoto,\n }),\n }),\n true,\n );\n}\n\nexport async function toggleChatPinned({\n chat,\n shouldBePinned,\n}: {\n chat: ApiChat;\n shouldBePinned: boolean;\n}) {\n const { id, accessHash } = chat;\n\n const isActionSuccessful = await invokeRequest(new GramJs.messages.ToggleDialogPin({\n peer: new GramJs.InputDialogPeer({\n peer: buildInputPeer(id, accessHash),\n }),\n pinned: shouldBePinned || undefined,\n }));\n\n if (isActionSuccessful) {\n onUpdate({\n '@type': 'updateChatPinned',\n id: chat.id,\n isPinned: shouldBePinned,\n });\n }\n}\n\nexport function toggleChatArchived({\n chat, folderId,\n}: {\n chat: ApiChat; folderId: number;\n}) {\n const { id, accessHash } = chat;\n\n return invokeRequest(new GramJs.folders.EditPeerFolders({\n folderPeers: [new GramJs.InputFolderPeer({\n peer: buildInputPeer(id, accessHash),\n folderId,\n })],\n }), true);\n}\n\nexport async function fetchChatFolders() {\n const result = await invokeRequest(new GramJs.messages.GetDialogFilters());\n\n if (!result) {\n return undefined;\n }\n\n return {\n byId: buildCollectionByKey(result.map(buildApiChatFolder), 'id') as Record,\n orderedIds: result.map(({ id }) => id),\n };\n}\n\nexport async function fetchRecommendedChatFolders() {\n const results = await invokeRequest(new GramJs.messages.GetSuggestedDialogFilters());\n\n if (!results) {\n return undefined;\n }\n\n return results.map(buildApiChatFolderFromSuggested);\n}\n\nexport async function editChatFolder({\n id,\n folderUpdate,\n}: {\n id: number;\n folderUpdate: ApiChatFolder;\n}) {\n const filter = buildFilterFromApiFolder(folderUpdate);\n\n const isActionSuccessful = await invokeRequest(new GramJs.messages.UpdateDialogFilter({\n id,\n filter,\n }));\n\n if (isActionSuccessful) {\n onUpdate({\n '@type': 'updateChatFolder',\n id,\n folder: folderUpdate,\n });\n }\n}\n\nexport async function deleteChatFolder(id: number) {\n const isActionSuccessful = await invokeRequest(new GramJs.messages.UpdateDialogFilter({\n id,\n filter: undefined,\n }));\n const recommendedChatFolders = await fetchRecommendedChatFolders();\n\n if (isActionSuccessful) {\n onUpdate({\n '@type': 'updateChatFolder',\n id,\n folder: undefined,\n });\n }\n if (recommendedChatFolders) {\n onUpdate({\n '@type': 'updateRecommendedChatFolders',\n folders: recommendedChatFolders,\n });\n }\n}\n\nexport async function toggleDialogUnread({\n chat, hasUnreadMark,\n}: {\n chat: ApiChat; hasUnreadMark: boolean | undefined;\n}) {\n const { id, accessHash } = chat;\n\n const isActionSuccessful = await invokeRequest(new GramJs.messages.MarkDialogUnread({\n peer: new GramJs.InputDialogPeer({\n peer: buildInputPeer(id, accessHash),\n }),\n unread: hasUnreadMark || undefined,\n }));\n\n if (isActionSuccessful) {\n onUpdate({\n '@type': 'updateChat',\n id: chat.id,\n chat: { hasUnreadMark },\n });\n }\n}\n\nexport async function getChatByUsername(username: string) {\n const result = await invokeRequest(new GramJs.contacts.ResolveUsername({\n username,\n }));\n\n if (!result) {\n return undefined;\n }\n\n const { users, chats } = result;\n\n const chat = chats.length\n ? buildApiChatFromPreview(chats[0])\n : buildApiChatFromPreview(users[0]);\n\n if (!chat) {\n return undefined;\n }\n\n updateLocalDb(result);\n\n return chat;\n}\n\nexport function togglePreHistoryHidden({\n chat, isEnabled,\n}: { chat: ApiChat; isEnabled: boolean }) {\n const { id, accessHash } = chat;\n const channel = buildInputEntity(id, accessHash);\n\n return invokeRequest(new GramJs.channels.TogglePreHistoryHidden({\n channel: channel as GramJs.InputChannel,\n enabled: isEnabled,\n }), true);\n}\n\nexport function updateChatDefaultBannedRights({\n chat, bannedRights,\n}: { chat: ApiChat; bannedRights: ApiChatBannedRights }) {\n const { id, accessHash } = chat;\n const peer = buildInputPeer(id, accessHash);\n\n return invokeRequest(new GramJs.messages.EditChatDefaultBannedRights({\n peer,\n bannedRights: buildChatBannedRights(bannedRights),\n }), true);\n}\n\nexport function updateChatMemberBannedRights({\n chat, user, bannedRights, untilDate,\n}: { chat: ApiChat; user: ApiUser; bannedRights: ApiChatBannedRights; untilDate?: number }) {\n const channel = buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel;\n const participant = buildInputPeer(user.id, user.accessHash) as GramJs.InputUser;\n\n return invokeRequest(new GramJs.channels.EditBanned({\n channel,\n participant,\n bannedRights: buildChatBannedRights(bannedRights, untilDate),\n }), true);\n}\n\nexport function updateChatAdmin({\n chat, user, adminRights, customTitle = '',\n}: { chat: ApiChat; user: ApiUser; adminRights: ApiChatAdminRights; customTitle: string }) {\n const channel = buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel;\n const userId = buildInputEntity(user.id, user.accessHash) as GramJs.InputUser;\n\n return invokeRequest(new GramJs.channels.EditAdmin({\n channel,\n userId,\n adminRights: buildChatAdminRights(adminRights),\n rank: customTitle,\n }), true);\n}\n\nexport async function updateChatTitle(chat: ApiChat, title: string) {\n const inputEntity = buildInputEntity(chat.id, chat.accessHash);\n await invokeRequest(\n inputEntity instanceof GramJs.InputChannel\n ? new GramJs.channels.EditTitle({\n channel: inputEntity as GramJs.InputChannel,\n title,\n }) : new GramJs.messages.EditChatTitle({\n chatId: inputEntity as number,\n title,\n }),\n true,\n );\n}\n\nexport async function updateChatAbout(chat: ApiChat, about: string) {\n const result = await invokeRequest(new GramJs.messages.EditChatAbout({\n peer: buildInputPeer(chat.id, chat.accessHash),\n about,\n }));\n\n if (!result) {\n return;\n }\n\n onUpdate({\n '@type': 'updateChatFullInfo',\n id: chat.id,\n fullInfo: {\n about,\n },\n });\n}\n\nexport function toggleSignatures({\n chat, isEnabled,\n}: { chat: ApiChat; isEnabled: boolean }) {\n const { id, accessHash } = chat;\n const channel = buildInputEntity(id, accessHash);\n\n return invokeRequest(new GramJs.channels.ToggleSignatures({\n channel: channel as GramJs.InputChannel,\n enabled: isEnabled,\n }), true);\n}\n\ntype ChannelMembersFilter =\n 'kicked'\n | 'admin'\n | 'recent';\n\nexport async function fetchMembers(\n chatId: number,\n accessHash: string,\n memberFilter: ChannelMembersFilter = 'recent',\n offset?: number,\n) {\n let filter: GramJs.TypeChannelParticipantsFilter;\n\n switch (memberFilter) {\n case 'kicked':\n filter = new GramJs.ChannelParticipantsKicked({ q: '' });\n break;\n case 'admin':\n filter = new GramJs.ChannelParticipantsAdmins();\n break;\n default:\n filter = new GramJs.ChannelParticipantsRecent();\n break;\n }\n\n const result = await invokeRequest(new GramJs.channels.GetParticipants({\n channel: buildInputEntity(chatId, accessHash) as GramJs.InputChannel,\n filter,\n offset,\n limit: MEMBERS_LOAD_SLICE,\n }));\n\n if (!result || result instanceof GramJs.channels.ChannelParticipantsNotModified) {\n return undefined;\n }\n\n updateLocalDb(result);\n\n return {\n members: buildChatMembers(result),\n users: result.users.map(buildApiUser).filter(Boolean as any),\n };\n}\n\nexport async function fetchGroupsForDiscussion() {\n const result = await invokeRequest(new GramJs.channels.GetGroupsForDiscussion());\n\n if (!result) {\n return undefined;\n }\n\n updateLocalDb(result);\n\n return result.chats.map((chat) => buildApiChatFromPreview(chat));\n}\n\nexport function setDiscussionGroup({\n channel,\n chat,\n}: {\n channel: ApiChat;\n chat?: ApiChat;\n}) {\n return invokeRequest(new GramJs.channels.SetDiscussionGroup({\n broadcast: buildInputPeer(channel.id, channel.accessHash),\n group: chat ? buildInputPeer(chat.id, chat.accessHash) : new GramJs.InputChannelEmpty(),\n }));\n}\n\nexport async function migrateChat(chat: ApiChat) {\n const result = await invokeRequest(\n new GramJs.messages.MigrateChat({ chatId: buildInputEntity(chat.id) as number }), true,\n );\n\n // `migrateChat` can return a lot of different update types according to docs,\n // but currently chat migrations returns only `Updates` type.\n // Errors are added to catch unexpected cases in future testing\n if (!result || !(result instanceof GramJs.Updates)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('Unexpected channel creation update', result);\n }\n\n return undefined;\n }\n\n updateLocalDb(result);\n\n return buildApiChatFromPreview(result.chats[1]);\n}\n\nexport async function openChatByInvite(hash: string) {\n const result = await invokeRequest(new GramJs.messages.CheckChatInvite({ hash }));\n\n if (!result) {\n return undefined;\n }\n\n let chat: ApiChat | undefined;\n\n if (result instanceof GramJs.ChatInvite) {\n onUpdate({\n '@type': 'showInvite',\n data: {\n title: result.title,\n hash,\n participantsCount: result.participantsCount,\n isChannel: result.channel,\n },\n });\n } else {\n chat = buildApiChatFromPreview(result.chat);\n\n if (chat) {\n onUpdate({\n '@type': 'updateChat',\n id: chat.id,\n chat,\n });\n }\n }\n\n if (!chat) {\n return undefined;\n }\n\n return { chatId: chat.id };\n}\n\nexport function addChatMembers(chat: ApiChat, users: ApiUser[]) {\n if (chat.type === 'chatTypeChannel' || chat.type === 'chatTypeSuperGroup') {\n return invokeRequest(new GramJs.channels.InviteToChannel({\n channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel,\n users: users.map((user) => buildInputEntity(user.id, user.accessHash)) as GramJs.InputUser[],\n }), true);\n }\n\n return Promise.all(users.map((user) => {\n return invokeRequest(new GramJs.messages.AddChatUser({\n chatId: buildInputEntity(chat.id) as number,\n userId: buildInputEntity(user.id, user.accessHash) as GramJs.InputUser,\n }), true);\n }));\n}\n\nexport function deleteChatMember(chat: ApiChat, user: ApiUser) {\n if (chat.type === 'chatTypeChannel' || chat.type === 'chatTypeSuperGroup') {\n return updateChatMemberBannedRights({\n chat,\n user,\n bannedRights: {\n viewMessages: true,\n sendMessages: true,\n sendMedia: true,\n sendStickers: true,\n sendGifs: true,\n sendGames: true,\n sendInline: true,\n embedLinks: true,\n sendPolls: true,\n changeInfo: true,\n inviteUsers: true,\n pinMessages: true,\n },\n untilDate: MAX_INT_32,\n });\n } else {\n return invokeRequest(new GramJs.messages.DeleteChatUser({\n chatId: buildInputEntity(chat.id) as number,\n userId: buildInputEntity(user.id, user.accessHash) as GramJs.InputUser,\n }), true);\n }\n}\n\nfunction preparePeers(\n result: GramJs.messages.Dialogs | GramJs.messages.DialogsSlice | GramJs.messages.PeerDialogs,\n) {\n const store: Record = {};\n\n result.chats.forEach((chat) => {\n store[`chat${chat.id}`] = chat;\n });\n\n result.users.forEach((user) => {\n store[`user${user.id}`] = user;\n });\n\n return store;\n}\n\nfunction updateLocalDb(result: (\n GramJs.messages.Dialogs | GramJs.messages.DialogsSlice | GramJs.messages.PeerDialogs |\n GramJs.messages.ChatFull | GramJs.contacts.Found |\n GramJs.contacts.ResolvedPeer | GramJs.channels.ChannelParticipants |\n GramJs.messages.Chats | GramJs.messages.ChatsSlice | GramJs.TypeUpdates\n)) {\n if ('users' in result) {\n result.users.forEach((user) => {\n if (user instanceof GramJs.User) {\n localDb.users[user.id] = user;\n }\n });\n }\n\n if ('chats' in result) {\n result.chats.forEach((chat) => {\n if (chat instanceof GramJs.Chat || chat instanceof GramJs.Channel) {\n localDb.chats[chat.id] = chat;\n }\n });\n }\n\n if ('messages' in result) {\n result.messages.forEach((message) => {\n if (message instanceof GramJs.Message && isMessageWithMedia(message)) {\n addMessageToLocalDb(message);\n }\n });\n }\n}\n\nexport async function importChatInvite({ hash }: { hash: string }) {\n const updates = await invokeRequest(new GramJs.messages.ImportChatInvite({ hash }), true);\n if (!(updates instanceof GramJs.Updates) || !updates.chats.length) {\n return undefined;\n }\n\n const chat = buildApiChatFromPreview(updates.chats[0]);\n\n return chat;\n}\n","const BigInt = require('big-integer');\nconst crypto = require('./crypto/crypto');\n\n/**\n * converts a buffer to big int\n * @param buffer\n * @param little\n * @param signed\n * @returns {bigInt.BigInteger}\n */\nfunction readBigIntFromBuffer(buffer, little = true, signed = false) {\n let randBuffer = Buffer.from(buffer);\n const bytesNumber = randBuffer.length;\n if (little) {\n randBuffer = randBuffer.reverse();\n }\n let bigInt = BigInt(randBuffer.toString('hex'), 16);\n if (signed && Math.floor(bigInt.toString('2').length / 8) >= bytesNumber) {\n bigInt = bigInt.subtract(BigInt(2)\n .pow(BigInt(bytesNumber * 8)));\n }\n return bigInt;\n}\n\n/**\n * Special case signed little ints\n * @param big\n * @param number\n * @returns {Buffer}\n */\nfunction toSignedLittleBuffer(big, number = 8) {\n const bigNumber = BigInt(big);\n const byteArray = [];\n for (let i = 0; i < number; i++) {\n byteArray[i] = bigNumber.shiftRight(8 * i)\n .and(255);\n }\n return Buffer.from(byteArray);\n}\n\n\n/**\n * converts a big int to a buffer\n * @param bigInt {bigInt.BigInteger}\n * @param bytesNumber\n * @param little\n * @param signed\n * @returns {Buffer}\n */\nfunction readBufferFromBigInt(bigInt, bytesNumber, little = true, signed = false) {\n bigInt = BigInt(bigInt);\n const bitLength = bigInt.bitLength();\n\n const bytes = Math.ceil(bitLength / 8);\n if (bytesNumber < bytes) {\n throw new Error('OverflowError: int too big to convert');\n }\n if (!signed && bigInt.lesser(BigInt(0))) {\n throw new Error('Cannot convert to unsigned');\n }\n let below = false;\n if (bigInt.lesser(BigInt(0))) {\n below = true;\n bigInt = bigInt.abs();\n }\n\n const hex = bigInt.toString('16')\n .padStart(bytesNumber * 2, '0');\n let l = Buffer.from(hex, 'hex');\n if (little) {\n l = l.reverse();\n }\n\n if (signed && below) {\n if (little) {\n let reminder = false;\n if (l[0] !== 0) {\n l[0] -= 1;\n }\n for (let i = 0; i < l.length; i++) {\n if (l[i] === 0) {\n reminder = true;\n continue;\n }\n if (reminder) {\n l[i] -= 1;\n reminder = false;\n }\n l[i] = 255 - l[i];\n }\n } else {\n l[l.length - 1] = 256 - l[l.length - 1];\n for (let i = 0; i < l.length - 1; i++) {\n l[i] = 255 - l[i];\n }\n }\n }\n return l;\n}\n\n/**\n * Generates a random long integer (8 bytes), which is optionally signed\n * @returns {BigInteger}\n */\nfunction generateRandomLong(signed = true) {\n return readBigIntFromBuffer(generateRandomBytes(8), true, signed);\n}\n\n/**\n * .... really javascript\n * @param n {number}\n * @param m {number}\n * @returns {number}\n */\nfunction mod(n, m) {\n return ((n % m) + m) % m;\n}\n\n/**\n * returns a positive bigInt\n * @param n {BigInt}\n * @param m {BigInt}\n * @returns {BigInt}\n */\nfunction bigIntMod(n, m) {\n return ((n.remainder(m)).add(m)).remainder(m);\n}\n\n/**\n * Generates a random bytes array\n * @param count\n * @returns {Buffer}\n */\nfunction generateRandomBytes(count) {\n return Buffer.from(crypto.randomBytes(count));\n}\n\n/**\n * Calculate the key based on Telegram guidelines, specifying whether it's the client or not\n * @param sharedKey\n * @param msgKey\n * @param client\n * @returns {{iv: Buffer, key: Buffer}}\n */\n\n/* CONTEST\nthis is mtproto 1 (mostly used for secret chats)\nasync function calcKey(sharedKey, msgKey, client) {\n const x = client === true ? 0 : 8\n const [sha1a, sha1b, sha1c, sha1d] = await Promise.all([\n sha1(Buffer.concat([msgKey, sharedKey.slice(x, x + 32)])),\n sha1(Buffer.concat([sharedKey.slice(x + 32, x + 48), msgKey, sharedKey.slice(x + 48, x + 64)])),\n sha1(Buffer.concat([sharedKey.slice(x + 64, x + 96), msgKey])),\n sha1(Buffer.concat([msgKey, sharedKey.slice(x + 96, x + 128)]))\n ])\n const key = Buffer.concat([sha1a.slice(0, 8), sha1b.slice(8, 20), sha1c.slice(4, 16)])\n const iv = Buffer.concat([sha1a.slice(8, 20), sha1b.slice(0, 8), sha1c.slice(16, 20), sha1d.slice(0, 8)])\n return {\n key,\n iv\n }\n}\n\n */\n\n/**\n * Generates the key data corresponding to the given nonces\n * @param serverNonce\n * @param newNonce\n * @returns {{key: Buffer, iv: Buffer}}\n */\nasync function generateKeyDataFromNonce(serverNonce, newNonce) {\n serverNonce = toSignedLittleBuffer(serverNonce, 16);\n newNonce = toSignedLittleBuffer(newNonce, 32);\n const [hash1, hash2, hash3] = await Promise.all([\n sha1(Buffer.concat([newNonce, serverNonce])),\n sha1(Buffer.concat([serverNonce, newNonce])),\n sha1(Buffer.concat([newNonce, newNonce])),\n ]);\n const keyBuffer = Buffer.concat([hash1, hash2.slice(0, 12)]);\n const ivBuffer = Buffer.concat([hash2.slice(12, 20), hash3, newNonce.slice(0, 4)]);\n return {\n key: keyBuffer,\n iv: ivBuffer,\n };\n}\n\nfunction convertToLittle(buf) {\n const correct = Buffer.alloc(buf.length * 4);\n\n for (let i = 0; i < buf.length; i++) {\n correct.writeUInt32BE(buf[i], i * 4);\n }\n return correct;\n}\n\n/**\n * Calculates the SHA1 digest for the given data\n * @param data\n * @returns {Promise}\n */\nfunction sha1(data) {\n const shaSum = crypto.createHash('sha1');\n shaSum.update(data);\n return shaSum.digest();\n}\n\n\n/**\n * Calculates the SHA256 digest for the given data\n * @param data\n * @returns {Promise}\n */\nfunction sha256(data) {\n const shaSum = crypto.createHash('sha256');\n shaSum.update(data);\n return shaSum.digest();\n}\n\n/**\n * Fast mod pow for RSA calculation. a^b % n\n * @param a\n * @param b\n * @param n\n * @returns {bigInt.BigInteger}\n */\nfunction modExp(a, b, n) {\n a = a.remainder(n);\n let result = BigInt.one;\n let x = a;\n while (b.greater(BigInt.zero)) {\n const leastSignificantBit = b.remainder(BigInt(2));\n b = b.divide(BigInt(2));\n if (leastSignificantBit.eq(BigInt.one)) {\n result = result.multiply(x);\n result = result.remainder(n);\n }\n x = x.multiply(x);\n x = x.remainder(n);\n }\n return result;\n}\n\n\n/**\n * Gets the arbitrary-length byte array corresponding to the given integer\n * @param integer {number,BigInteger}\n * @param signed {boolean}\n * @returns {Buffer}\n */\nfunction getByteArray(integer, signed = false) {\n const bits = integer.toString(2).length;\n const byteLength = Math.floor((bits + 8 - 1) / 8);\n return readBufferFromBigInt(BigInt(integer), byteLength, false, signed);\n}\n\n/**\n * returns a random int from min (inclusive) and max (inclusive)\n * @param min\n * @param max\n * @returns {number}\n */\nfunction getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\n/**\n * Sleeps a specified amount of time\n * @param ms time in milliseconds\n * @returns {Promise}\n */\nconst sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * Helper to export two buffers of same length\n * @returns {Buffer}\n */\n\nfunction bufferXor(a, b) {\n const res = [];\n for (let i = 0; i < a.length; i++) {\n res.push(a[i] ^ b[i]);\n }\n return Buffer.from(res);\n}\n\n/**\n * Checks if the obj is an array\n * @param obj\n * @returns {boolean}\n */\n/*\nCONTEST\nwe do'nt support array requests anyway\nfunction isArrayLike(obj) {\n if (!obj) return false\n const l = obj.length\n if (typeof l != 'number' || l < 0) return false\n if (Math.floor(l) !== l) return false\n // fast check\n if (l > 0 && !(l - 1 in obj)) return false\n // more complete check (optional)\n for (let i = 0; i < l; ++i) {\n if (!(i in obj)) return false\n }\n return true\n}\n*/\n\n// Taken from https://stackoverflow.com/questions/18638900/javascript-crc32/18639999#18639999\nfunction makeCRCTable() {\n let c;\n const crcTable = [];\n for (let n = 0; n < 256; n++) {\n c = n;\n for (let k = 0; k < 8; k++) {\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n crcTable[n] = c;\n }\n return crcTable;\n}\n\nlet crcTable;\n\nfunction crc32(buf) {\n if (!crcTable) {\n crcTable = makeCRCTable();\n }\n if (!Buffer.isBuffer(buf)) {\n buf = Buffer.from(buf);\n }\n let crc = -1;\n\n for (let index = 0; index < buf.length; index++) {\n const byte = buf[index];\n crc = crcTable[(crc ^ byte) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ (-1)) >>> 0;\n}\n\n/**\n * Creates a deferred object\n * @return {Deferred}\n */\nfunction createDeferred() {\n let resolve;\n const promise = new Promise((_resolve) => {\n resolve = _resolve;\n });\n\n return {\n promise,\n resolve,\n };\n}\n\nmodule.exports = {\n readBigIntFromBuffer,\n readBufferFromBigInt,\n generateRandomLong,\n mod,\n crc32,\n generateRandomBytes,\n // calcKey,\n generateKeyDataFromNonce,\n sha1,\n sha256,\n bigIntMod,\n modExp,\n getRandomInt,\n sleep,\n getByteArray,\n // isArrayLike,\n toSignedLittleBuffer,\n convertToLittle,\n bufferXor,\n createDeferred,\n};\n","const CURRENCIES: Record = {\n USD: '$',\n EUR: '€',\n GBP: '£',\n JPY: '¥',\n RUB: '₽',\n UAH: '₴',\n INR: '₹',\n AED: 'د.إ',\n};\n\nexport function getCurrencySign(currency: string | undefined): string {\n if (!currency) {\n return '';\n }\n return CURRENCIES[currency] || '';\n}\n","import { Api as GramJs } from '../../../lib/gramjs';\nimport {\n ApiMessage,\n ApiMessageForwardInfo,\n ApiPhoto,\n ApiSticker,\n ApiVideo,\n ApiVoice,\n ApiAudio,\n ApiDocument,\n ApiAction,\n ApiContact,\n ApiAttachment,\n ApiPoll,\n ApiNewPoll,\n ApiWebPage,\n ApiMessageEntity,\n ApiFormattedText,\n ApiKeyboardButtons,\n ApiKeyboardButton,\n ApiChat,\n ApiThreadInfo,\n ApiInvoice,\n} from '../../types';\n\nimport { DELETED_COMMENTS_CHANNEL_ID, LOCAL_MESSAGE_ID_BASE, SERVICE_NOTIFICATIONS_USER_ID } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { getApiChatIdFromMtpPeer } from './chats';\nimport { buildStickerFromDocument } from './symbols';\nimport { buildApiPhoto, buildApiThumbnailFromStripped } from './common';\nimport { interpolateArray } from '../../../util/waveform';\nimport { getCurrencySign } from '../../../components/middle/helpers/getCurrencySign';\nimport { buildPeer } from '../gramjsBuilders';\nimport { addPhotoToLocalDb, resolveMessageApiChatId } from '../helpers';\n\nconst LOCAL_IMAGE_UPLOADING_TEMP_ID = 'temp';\nconst LOCAL_VIDEO_UPLOADING_TEMP_ID = 'temp';\nconst INPUT_WAVEFORM_LENGTH = 63;\n\nlet localMessageCounter = LOCAL_MESSAGE_ID_BASE;\nlet currentUserId!: number;\n\nexport function setMessageBuilderCurrentUserId(_currentUserId: number) {\n currentUserId = _currentUserId;\n}\n\nexport function buildApiMessage(mtpMessage: GramJs.TypeMessage): ApiMessage | undefined {\n const chatId = resolveMessageApiChatId(mtpMessage);\n if (\n !chatId\n || !(mtpMessage instanceof GramJs.Message || mtpMessage instanceof GramJs.MessageService)) {\n return undefined;\n }\n\n return buildApiMessageWithChatId(chatId, mtpMessage);\n}\n\nexport function buildApiMessageFromShort(mtpMessage: GramJs.UpdateShortMessage): ApiMessage {\n const chatId = getApiChatIdFromMtpPeer({ userId: mtpMessage.userId } as GramJs.TypePeer);\n\n return buildApiMessageWithChatId(chatId, {\n ...mtpMessage,\n fromId: buildPeer(mtpMessage.out ? currentUserId : mtpMessage.userId),\n });\n}\n\nexport function buildApiMessageFromShortChat(mtpMessage: GramJs.UpdateShortChatMessage): ApiMessage {\n const chatId = getApiChatIdFromMtpPeer({ chatId: mtpMessage.chatId } as GramJs.TypePeer);\n\n return buildApiMessageWithChatId(chatId, {\n ...mtpMessage,\n fromId: buildPeer(mtpMessage.fromId),\n });\n}\n\nexport function buildApiMessageFromNotification(\n notification: GramJs.UpdateServiceNotification,\n currentDate: number,\n): ApiMessage {\n const localId = localMessageCounter++;\n let content: ApiMessage['content'] = {};\n\n if (notification.media) {\n content = {\n ...buildMessageMediaContent(notification.media),\n };\n }\n\n if (notification.message && !content.sticker && !content.poll && !content.contact) {\n content = {\n ...content,\n text: buildMessageTextContent(notification.message, notification.entities),\n };\n }\n\n return {\n id: localId,\n chatId: SERVICE_NOTIFICATIONS_USER_ID,\n date: notification.inboxDate || currentDate,\n content,\n isOutgoing: false,\n };\n}\n\ntype UniversalMessage = (\n Pick\n & Pick, (\n 'out' | 'message' | 'entities' | 'fromId' | 'peerId' | 'fwdFrom' | 'replyTo' | 'replyMarkup' | 'post' |\n 'media' | 'action' | 'views' | 'editDate' | 'editHide' | 'mediaUnread' | 'groupedId' | 'mentioned' | 'viaBotId' |\n 'replies' | 'fromScheduled' | 'postAuthor'\n )>\n);\n\nexport function buildApiMessageWithChatId(chatId: number, mtpMessage: UniversalMessage): ApiMessage {\n const fromId = mtpMessage.fromId ? getApiChatIdFromMtpPeer(mtpMessage.fromId) : undefined;\n const isChatWithSelf = !fromId && chatId === currentUserId;\n const isOutgoing = (mtpMessage.out && !mtpMessage.post) || (isChatWithSelf && !mtpMessage.fwdFrom);\n\n let content: ApiMessage['content'] = {};\n\n if (mtpMessage.media) {\n content = {\n ...buildMessageMediaContent(mtpMessage.media),\n };\n }\n\n if (mtpMessage.message && !content.sticker && !content.poll && !content.contact) {\n content = {\n ...content,\n text: buildMessageTextContent(mtpMessage.message, mtpMessage.entities),\n };\n }\n\n const action = mtpMessage.action && buildAction(mtpMessage.action, fromId, Boolean(mtpMessage.post), isOutgoing);\n if (action) {\n content.action = action;\n }\n\n const { replyToMsgId, replyToTopId } = mtpMessage.replyTo || {};\n const isEdited = mtpMessage.editDate && !mtpMessage.editHide;\n const { inlineButtons, keyboardButtons } = buildReplyButtons(mtpMessage) || {};\n const forwardInfo = mtpMessage.fwdFrom && buildApiMessageForwardInfo(mtpMessage.fwdFrom, isChatWithSelf);\n const { replies, mediaUnread: isMediaUnread, postAuthor } = mtpMessage;\n const groupedId = mtpMessage.groupedId && mtpMessage.groupedId.toString();\n const isInAlbum = Boolean(groupedId) && !(content.document || content.audio);\n const shouldHideKeyboardButtons = mtpMessage.replyMarkup instanceof GramJs.ReplyKeyboardHide;\n\n return {\n id: mtpMessage.id,\n chatId,\n isOutgoing,\n content,\n date: mtpMessage.date,\n senderId: fromId || (mtpMessage.out && mtpMessage.post && currentUserId) || chatId,\n views: mtpMessage.views,\n isFromScheduled: mtpMessage.fromScheduled,\n ...(replyToMsgId && { replyToMessageId: replyToMsgId }),\n ...(replyToTopId && { replyToTopMessageId: replyToTopId }),\n ...(forwardInfo && { forwardInfo }),\n ...(isEdited && { isEdited }),\n ...(isMediaUnread && { isMediaUnread }),\n ...(mtpMessage.mentioned && isMediaUnread && { hasUnreadMention: true }),\n ...(groupedId && {\n groupedId,\n isInAlbum,\n }),\n inlineButtons,\n ...(keyboardButtons && { keyboardButtons }),\n ...(shouldHideKeyboardButtons && { shouldHideKeyboardButtons }),\n ...(mtpMessage.viaBotId && { viaBotId: mtpMessage.viaBotId }),\n ...(replies && replies.comments && { threadInfo: buildThreadInfo(replies, mtpMessage.id, chatId) }),\n ...(postAuthor && { adminTitle: postAuthor }),\n };\n}\n\nexport function buildMessageTextContent(\n message: string,\n entities?: GramJs.TypeMessageEntity[],\n): ApiFormattedText {\n return {\n text: message,\n ...(entities && { entities: entities.map(buildApiMessageEntity) }),\n };\n}\n\nexport function buildMessageDraft(draft: GramJs.TypeDraftMessage) {\n if (draft instanceof GramJs.DraftMessageEmpty) {\n return undefined;\n }\n\n const {\n message, entities, replyToMsgId, date,\n } = draft;\n\n return {\n formattedText: message ? buildMessageTextContent(message, entities) : undefined,\n replyingToId: replyToMsgId,\n date,\n };\n}\n\nexport function buildMessageMediaContent(media: GramJs.TypeMessageMedia): ApiMessage['content'] | undefined {\n const sticker = buildSticker(media);\n if (sticker) return { sticker };\n\n const photo = buildPhoto(media);\n if (photo) return { photo };\n\n const video = buildVideo(media);\n if (video) return { video };\n\n const audio = buildAudio(media);\n if (audio) return { audio };\n\n const voice = buildVoice(media);\n if (voice) return { voice };\n\n const document = buildDocumentFromMedia(media);\n if (document) return { document };\n\n const contact = buildContact(media);\n if (contact) return { contact };\n\n const poll = buildPollFromMedia(media);\n if (poll) return { poll };\n\n const webPage = buildWebPage(media);\n if (webPage) return { webPage };\n\n const invoice = buildInvoiceFromMedia(media);\n if (invoice) return { invoice };\n\n return undefined;\n}\n\nfunction buildApiMessageForwardInfo(fwdFrom: GramJs.MessageFwdHeader, isChatWithSelf = false): ApiMessageForwardInfo {\n const savedFromPeerId = fwdFrom.savedFromPeer && getApiChatIdFromMtpPeer(fwdFrom.savedFromPeer);\n const fromId = fwdFrom.fromId && getApiChatIdFromMtpPeer(fwdFrom.fromId);\n\n return {\n isChannelPost: Boolean(fwdFrom.channelPost),\n isLinkedChannelPost: Boolean(fwdFrom.channelPost && savedFromPeerId && !isChatWithSelf),\n fromChatId: savedFromPeerId || fromId,\n fromMessageId: fwdFrom.channelPost || fwdFrom.savedFromMsgId,\n senderUserId: fromId,\n hiddenUserName: fwdFrom.fromName,\n adminTitle: fwdFrom.postAuthor,\n };\n}\n\nfunction buildSticker(media: GramJs.TypeMessageMedia): ApiSticker | undefined {\n if (\n !(media instanceof GramJs.MessageMediaDocument)\n || !media.document\n || !(media.document instanceof GramJs.Document)\n ) {\n return undefined;\n }\n\n return buildStickerFromDocument(media.document);\n}\n\nfunction buildPhoto(media: GramJs.TypeMessageMedia): ApiPhoto | undefined {\n if (!(media instanceof GramJs.MessageMediaPhoto) || !media.photo || !(media.photo instanceof GramJs.Photo)) {\n return undefined;\n }\n\n if (media.ttlSeconds) {\n return undefined;\n }\n\n return buildApiPhoto(media.photo);\n}\n\nexport function buildVideoFromDocument(document: GramJs.Document): ApiVideo | undefined {\n if (document instanceof GramJs.DocumentEmpty) {\n return undefined;\n }\n\n const {\n id, mimeType, thumbs, size, attributes,\n } = document;\n\n const videoAttr = attributes\n .find((a: any): a is GramJs.DocumentAttributeVideo => a instanceof GramJs.DocumentAttributeVideo);\n\n if (!videoAttr) {\n return undefined;\n }\n\n const gifAttr = attributes\n .find((a: any): a is GramJs.DocumentAttributeAnimated => a instanceof GramJs.DocumentAttributeAnimated);\n\n const {\n duration,\n w: width,\n h: height,\n supportsStreaming = false,\n roundMessage: isRound = false,\n } = videoAttr;\n\n return {\n id: String(id),\n mimeType,\n duration,\n fileName: getFilenameFromDocument(document, 'video'),\n width,\n height,\n supportsStreaming,\n isRound,\n isGif: Boolean(gifAttr),\n thumbnail: buildApiThumbnailFromStripped(thumbs),\n size,\n };\n}\n\nfunction buildVideo(media: GramJs.TypeMessageMedia): ApiVideo | undefined {\n if (\n !(media instanceof GramJs.MessageMediaDocument)\n || !(media.document instanceof GramJs.Document)\n || !media.document.mimeType.startsWith('video')\n ) {\n return undefined;\n }\n\n return buildVideoFromDocument(media.document);\n}\n\nfunction buildAudio(media: GramJs.TypeMessageMedia): ApiAudio | undefined {\n if (\n !(media instanceof GramJs.MessageMediaDocument)\n || !media.document\n || !(media.document instanceof GramJs.Document)\n ) {\n return undefined;\n }\n\n const audioAttribute = media.document.attributes\n .find((attr: any): attr is GramJs.DocumentAttributeAudio => (\n attr instanceof GramJs.DocumentAttributeAudio\n ));\n\n if (!audioAttribute || audioAttribute.voice) {\n return undefined;\n }\n\n return {\n fileName: getFilenameFromDocument(media.document, 'audio'),\n ...pick(media.document, ['size', 'mimeType']),\n ...pick(audioAttribute, ['duration', 'performer', 'title']),\n };\n}\n\nfunction buildVoice(media: GramJs.TypeMessageMedia): ApiVoice | undefined {\n if (\n !(media instanceof GramJs.MessageMediaDocument)\n || !media.document\n || !(media.document instanceof GramJs.Document)\n ) {\n return undefined;\n }\n\n const audioAttribute = media.document.attributes\n .find((attr: any): attr is GramJs.DocumentAttributeAudio => (\n attr instanceof GramJs.DocumentAttributeAudio\n ));\n\n if (!audioAttribute || !audioAttribute.voice) {\n return undefined;\n }\n\n const { duration, waveform } = audioAttribute;\n\n return {\n duration,\n waveform: waveform ? Array.from(waveform) : undefined,\n };\n}\n\nfunction buildDocumentFromMedia(media: GramJs.TypeMessageMedia) {\n if (!(media instanceof GramJs.MessageMediaDocument) || !media.document) {\n return undefined;\n }\n\n if (media.ttlSeconds) {\n return undefined;\n }\n\n return buildApiDocument(media.document);\n}\n\nexport function buildApiDocument(document: GramJs.TypeDocument): ApiDocument | undefined {\n if (!(document instanceof GramJs.Document)) {\n return undefined;\n }\n\n const {\n id, size, mimeType, date, thumbs, attributes,\n } = document;\n\n const thumbnail = thumbs && buildApiThumbnailFromStripped(thumbs);\n\n let mediaType: ApiDocument['mediaType'] | undefined;\n let mediaSize: ApiDocument['mediaSize'] | undefined;\n const photoSize = thumbs && thumbs.find((s: any): s is GramJs.PhotoSize => s instanceof GramJs.PhotoSize);\n if (photoSize) {\n mediaSize = {\n width: photoSize.w,\n height: photoSize.h,\n };\n\n if (mimeType.startsWith('image/')) {\n mediaType = 'photo';\n\n const imageAttribute = attributes\n .find((a: any): a is GramJs.DocumentAttributeImageSize => a instanceof GramJs.DocumentAttributeImageSize);\n\n if (imageAttribute) {\n const { w: width, h: height } = imageAttribute;\n mediaSize = {\n width,\n height,\n };\n }\n } else if (mimeType.startsWith('video/')) {\n mediaType = 'video';\n }\n }\n\n return {\n id: String(id),\n size,\n mimeType,\n timestamp: date,\n fileName: getFilenameFromDocument(document),\n thumbnail,\n mediaType,\n mediaSize,\n };\n}\n\nfunction buildContact(media: GramJs.TypeMessageMedia): ApiContact | undefined {\n if (!(media instanceof GramJs.MessageMediaContact)) {\n return undefined;\n }\n\n return pick(media, [\n 'firstName',\n 'lastName',\n 'phoneNumber',\n 'userId',\n ]);\n}\n\nfunction buildPollFromMedia(media: GramJs.TypeMessageMedia): ApiPoll | undefined {\n if (!(media instanceof GramJs.MessageMediaPoll)) {\n return undefined;\n }\n\n return buildPoll(media.poll, media.results);\n}\n\n\nfunction buildInvoiceFromMedia(media: GramJs.TypeMessageMedia): ApiInvoice | undefined {\n if (!(media instanceof GramJs.MessageMediaInvoice)) {\n return undefined;\n }\n\n return buildInvoice(media);\n}\n\nexport function buildPoll(poll: GramJs.Poll, pollResults: GramJs.PollResults): ApiPoll {\n const { id, answers: rawAnswers } = poll;\n const answers = rawAnswers.map((answer) => ({\n text: answer.text,\n option: String.fromCharCode(...answer.option),\n }));\n\n return {\n id: id.toString(),\n summary: {\n isPublic: poll.publicVoters,\n ...pick(poll, [\n 'closed',\n 'multipleChoice',\n 'quiz',\n 'question',\n 'closePeriod',\n 'closeDate',\n ]),\n answers,\n },\n results: buildPollResults(pollResults),\n };\n}\n\nexport function buildInvoice(media: GramJs.MessageMediaInvoice): ApiInvoice {\n const {\n description: text, title, photo, test, totalAmount, currency, receiptMsgId,\n } = media;\n const currencySign = getCurrencySign(currency);\n return {\n text,\n title,\n photoUrl: photo && photo.url,\n receiptMsgId,\n description: `${currencySign}${(Number(totalAmount) / 100).toFixed(2)} ${test ? 'TEST INVOICE' : ''}`,\n };\n}\n\nexport function buildPollResults(pollResults: GramJs.PollResults): ApiPoll['results'] {\n const {\n results: rawResults, totalVoters, recentVoters, solution, solutionEntities: entities,\n } = pollResults;\n const results = rawResults && rawResults.map(({\n option, chosen, correct, voters,\n }) => ({\n isChosen: chosen,\n isCorrect: correct,\n option: String.fromCharCode(...option),\n votersCount: voters,\n }));\n\n return {\n totalVoters,\n recentVoterIds: recentVoters,\n results,\n solution,\n ...(entities && { solutionEntities: entities.map(buildApiMessageEntity) }),\n };\n}\n\nexport function buildWebPage(media: GramJs.TypeMessageMedia): ApiWebPage | undefined {\n if (\n !(media instanceof GramJs.MessageMediaWebPage)\n || !(media.webpage instanceof GramJs.WebPage)\n ) {\n return undefined;\n }\n\n const { id, photo, document } = media.webpage;\n\n let video;\n if (document instanceof GramJs.Document && document.mimeType.startsWith('video/')) {\n video = buildVideoFromDocument(document);\n }\n\n return {\n id: Number(id),\n ...pick(media.webpage, [\n 'url',\n 'displayUrl',\n 'type',\n 'siteName',\n 'title',\n 'description',\n 'duration',\n ]),\n photo: photo instanceof GramJs.Photo ? buildApiPhoto(photo) : undefined,\n document: !video && document ? buildApiDocument(document) : undefined,\n video,\n };\n}\n\nfunction buildAction(\n action: GramJs.TypeMessageAction,\n senderId: number | undefined,\n isChannelPost: boolean,\n isOutgoing: boolean,\n): ApiAction | undefined {\n if (action instanceof GramJs.MessageActionEmpty) {\n return undefined;\n }\n\n let text = '';\n const translationValues = [];\n let type: ApiAction['type'] = 'other';\n let photo: ApiPhoto | undefined;\n\n const targetUserIds = 'users' in action\n ? action.users && action.users\n : ('userId' in action && [action.userId]) || [];\n let targetChatId: number | undefined;\n\n if (action instanceof GramJs.MessageActionChatCreate) {\n text = 'Notification.CreatedChatWithTitle';\n translationValues.push('%action_origin%', action.title);\n } else if (action instanceof GramJs.MessageActionChatEditTitle) {\n if (isChannelPost) {\n text = 'Channel.MessageTitleUpdated';\n translationValues.push(action.title);\n } else {\n text = 'Notification.ChangedGroupName';\n translationValues.push('%action_origin%', action.title);\n }\n } else if (action instanceof GramJs.MessageActionChatEditPhoto) {\n if (isChannelPost) {\n text = 'Channel.MessagePhotoUpdated';\n } else {\n text = 'Notification.ChangedGroupPhoto';\n translationValues.push('%action_origin%');\n }\n } else if (action instanceof GramJs.MessageActionChatDeletePhoto) {\n if (isChannelPost) {\n text = 'Channel.MessagePhotoRemoved';\n } else {\n text = 'Group.MessagePhotoRemoved';\n }\n } else if (action instanceof GramJs.MessageActionChatAddUser) {\n if (!senderId || targetUserIds.includes(senderId)) {\n text = 'Notification.JoinedChat';\n translationValues.push('%target_user%');\n } else {\n text = 'Notification.Invited';\n translationValues.push('%action_origin%', '%target_user%');\n }\n } else if (action instanceof GramJs.MessageActionChatDeleteUser) {\n if (!senderId || targetUserIds.includes(senderId)) {\n text = 'Notification.LeftChat';\n translationValues.push('%target_user%');\n } else {\n text = 'Notification.Kicked';\n translationValues.push('%action_origin%', '%target_user%');\n }\n } else if (action instanceof GramJs.MessageActionChatJoinedByLink) {\n text = 'Notification.JoinedGroupByLink';\n translationValues.push('%action_origin%');\n } else if (action instanceof GramJs.MessageActionChannelCreate) {\n text = 'Notification.CreatedChannel';\n } else if (action instanceof GramJs.MessageActionChatMigrateTo) {\n targetChatId = getApiChatIdFromMtpPeer(action);\n text = 'Migrated to %target_chat%';\n translationValues.push('%target_chat%');\n } else if (action instanceof GramJs.MessageActionChannelMigrateFrom) {\n targetChatId = getApiChatIdFromMtpPeer(action);\n text = 'Migrated from %target_chat%';\n translationValues.push('%target_chat%');\n } else if (action instanceof GramJs.MessageActionPinMessage) {\n text = 'Chat.Service.Group.UpdatedPinnedMessage1';\n translationValues.push('%action_origin%', '%message%');\n } else if (action instanceof GramJs.MessageActionHistoryClear) {\n text = 'HistoryCleared';\n type = 'historyClear';\n } else if (action instanceof GramJs.MessageActionPhoneCall) {\n const withDuration = Boolean(action.duration);\n text = [\n withDuration ? 'ChatList.Service' : 'Chat',\n action.video ? 'VideoCall' : 'Call',\n isOutgoing ? (withDuration ? 'outgoing' : 'Outgoing') : (withDuration ? 'incoming' : 'Incoming'),\n ].join('.');\n\n if (withDuration) {\n const mins = Math.max(Math.round(action.duration! / 60), 1);\n translationValues.push(`${mins} min${mins > 1 ? 's' : ''}`);\n }\n } else if (action instanceof GramJs.MessageActionContactSignUp) {\n text = 'Notification.Joined';\n translationValues.push('%action_origin%');\n } else if (action instanceof GramJs.MessageActionPaymentSent) {\n const currencySign = getCurrencySign(action.currency);\n const amount = (Number(action.totalAmount) / 100).toFixed(2);\n text = 'Notification.PaymentSent';\n translationValues.push(currencySign, amount, '%product%');\n } else if (action instanceof GramJs.MessageActionGroupCall) {\n if (action.duration) {\n const mins = Math.max(Math.round(action.duration / 60), 1);\n text = 'Notification.VoiceChatEnded';\n translationValues.push(`${mins} min${mins > 1 ? 's' : ''}`);\n } else {\n text = 'Notification.VoiceChatStartedChannel';\n }\n } else if (action instanceof GramJs.MessageActionBotAllowed) {\n text = 'Chat.Service.BotPermissionAllowed';\n translationValues.push(action.domain);\n } else {\n text = 'ChatList.UnsupportedMessage';\n }\n\n if ('photo' in action && action.photo instanceof GramJs.Photo) {\n addPhotoToLocalDb(action.photo);\n photo = buildApiPhoto(action.photo);\n }\n\n return {\n text,\n type,\n targetUserIds,\n targetChatId,\n photo, // TODO Only used internally now, will be used for the UI in future\n translationValues,\n };\n}\n\nfunction buildReplyButtons(message: UniversalMessage): {\n [K in 'inlineButtons' | 'keyboardButtons']?: ApiKeyboardButtons\n} | undefined {\n const { id: messageId, replyMarkup, media } = message;\n\n if (!replyMarkup) {\n if (media instanceof GramJs.MessageMediaWebPage && media.webpage instanceof GramJs.WebPage) {\n if (media.webpage.type === 'telegram_message') {\n return {\n inlineButtons: [[{\n type: 'url' as const,\n text: 'Show Message',\n messageId,\n value: media.webpage.url,\n }]],\n };\n }\n }\n\n return undefined;\n }\n\n // TODO\n if (!(replyMarkup instanceof GramJs.ReplyKeyboardMarkup || replyMarkup instanceof GramJs.ReplyInlineMarkup)) {\n return undefined;\n }\n\n const markup = replyMarkup.rows.map(({ buttons }) => {\n return buttons.map((button) => {\n let { text } = button;\n\n let type;\n let value;\n if (button instanceof GramJs.KeyboardButton) {\n type = 'command';\n value = text;\n } else if (button instanceof GramJs.KeyboardButtonUrl) {\n type = 'url';\n value = button.url;\n } else if (button instanceof GramJs.KeyboardButtonCallback) {\n type = 'callback';\n value = String(button.data);\n } else if (button instanceof GramJs.KeyboardButtonRequestPoll) {\n type = 'requestPoll';\n } else if (button instanceof GramJs.KeyboardButtonBuy) {\n if (media instanceof GramJs.MessageMediaInvoice && media.receiptMsgId) {\n text = 'Receipt';\n value = media.receiptMsgId;\n }\n type = 'buy';\n } else {\n type = 'NOT_SUPPORTED';\n }\n\n return {\n type,\n text,\n messageId,\n value,\n } as ApiKeyboardButton;\n });\n });\n\n return { [replyMarkup instanceof GramJs.ReplyKeyboardMarkup ? 'keyboardButtons' : 'inlineButtons']: markup };\n}\n\nfunction getFilenameFromDocument(document: GramJs.Document, defaultBase = 'file') {\n const { mimeType, attributes } = document;\n const filenameAttribute = attributes\n .find((a: any): a is GramJs.DocumentAttributeFilename => a instanceof GramJs.DocumentAttributeFilename);\n\n if (filenameAttribute) {\n return filenameAttribute.fileName;\n }\n\n const extension = mimeType.split('/')[1];\n\n return `${defaultBase}${String(document.id)}.${extension}`;\n}\n\nexport function buildLocalMessage(\n chat: ApiChat,\n text?: string,\n entities?: ApiMessageEntity[],\n replyingTo?: number,\n attachment?: ApiAttachment,\n sticker?: ApiSticker,\n gif?: ApiVideo,\n poll?: ApiNewPoll,\n groupedId?: string,\n scheduledAt?: number,\n serverTimeOffset = 0,\n): ApiMessage {\n const localId = localMessageCounter++;\n const media = attachment && buildUploadingMedia(attachment);\n const isChannel = chat.type === 'chatTypeChannel';\n\n return {\n id: localId,\n chatId: chat.id,\n content: {\n ...(text && {\n text: {\n text,\n entities,\n },\n }),\n ...media,\n ...(sticker && { sticker }),\n ...(gif && { video: gif }),\n ...(poll && buildNewPoll(poll, localId)),\n },\n date: scheduledAt || Math.round(Date.now() / 1000) + serverTimeOffset,\n isOutgoing: !isChannel,\n senderId: currentUserId,\n ...(replyingTo && { replyToMessageId: replyingTo }),\n ...(groupedId && {\n groupedId,\n ...(media && (media.photo || media.video) && { isInAlbum: true }),\n }),\n ...(scheduledAt && { isScheduled: true }),\n };\n}\n\nexport function buildForwardedMessage(\n toChat: ApiChat,\n message: ApiMessage,\n serverTimeOffset: number,\n): ApiMessage {\n const localId = localMessageCounter++;\n const {\n content,\n chatId: fromChatId,\n id: fromMessageId,\n senderId,\n groupedId,\n isInAlbum,\n } = message;\n\n const isAudio = content.audio;\n const asIncomingInChatWithSelf = (\n toChat.id === currentUserId && (fromChatId !== toChat.id || message.forwardInfo) && !isAudio\n );\n\n return {\n id: localId,\n chatId: toChat.id,\n content,\n date: Math.round(Date.now() / 1000) + serverTimeOffset,\n isOutgoing: !asIncomingInChatWithSelf && toChat.type !== 'chatTypeChannel',\n senderId: currentUserId,\n sendingState: 'messageSendingStatePending',\n // Forward info doesn't get added when users forwards his own messages, also when forwarding audio\n ...(senderId !== currentUserId && !isAudio && {\n forwardInfo: {\n isChannelPost: false,\n fromChatId,\n fromMessageId,\n senderUserId: senderId,\n },\n }),\n groupedId,\n isInAlbum,\n };\n}\n\nfunction buildUploadingMedia(\n attachment: ApiAttachment,\n): ApiMessage['content'] {\n const {\n filename: fileName,\n blobUrl,\n previewBlobUrl,\n mimeType,\n size,\n } = attachment;\n\n if (attachment.quick) {\n const { width, height, duration } = attachment.quick;\n\n if (mimeType.startsWith('image/')) {\n return {\n photo: {\n id: LOCAL_IMAGE_UPLOADING_TEMP_ID,\n sizes: [],\n thumbnail: { width, height, dataUri: '' }, // Used only for dimensions\n blobUrl,\n },\n };\n } else {\n return {\n video: {\n id: LOCAL_VIDEO_UPLOADING_TEMP_ID,\n mimeType,\n duration: duration || 0,\n fileName,\n width,\n height,\n blobUrl,\n ...(previewBlobUrl && { thumbnail: { width, height, dataUri: previewBlobUrl } }),\n size,\n },\n };\n }\n } else if (attachment.voice) {\n const { duration, waveform } = attachment.voice;\n const { data: inputWaveform } = interpolateArray(waveform, INPUT_WAVEFORM_LENGTH);\n return {\n voice: {\n duration,\n waveform: inputWaveform,\n },\n };\n } else if (mimeType.startsWith('audio/')) {\n return {\n audio: {\n mimeType,\n fileName,\n size,\n duration: 200, // Arbitrary\n },\n };\n } else {\n return {\n document: {\n mimeType,\n fileName,\n size,\n ...(previewBlobUrl && { previewBlobUrl }),\n },\n };\n }\n}\n\nfunction buildNewPoll(poll: ApiNewPoll, localId: number) {\n return {\n poll: {\n id: localId.toString(),\n summary: pick(poll.summary, ['question', 'answers']),\n results: {},\n },\n };\n}\n\nfunction buildApiMessageEntity(entity: GramJs.TypeMessageEntity): ApiMessageEntity {\n const { className: type, offset, length } = entity;\n return {\n type,\n offset,\n length,\n ...('userId' in entity && typeof entity.userId === 'number' && { userId: entity.userId }),\n ...('url' in entity && { url: entity.url }),\n };\n}\n\nfunction buildThreadInfo(\n messageReplies: GramJs.TypeMessageReplies, messageId: number, chatId: number,\n): ApiThreadInfo | undefined {\n const {\n channelId, replies, maxId, readMaxId, recentRepliers,\n } = messageReplies;\n\n if (channelId === DELETED_COMMENTS_CHANNEL_ID) {\n return undefined;\n }\n\n const isPostThread = chatId !== channelId;\n\n return {\n threadId: messageId,\n ...(isPostThread ? {\n chatId: getApiChatIdFromMtpPeer({ channelId } as GramJs.TypePeer),\n originChannelId: chatId,\n } : {\n chatId,\n }),\n messagesCount: replies,\n lastMessageId: maxId,\n lastReadInboxMessageId: readMaxId,\n ...(recentRepliers && { recentReplierIds: recentRepliers.map(getApiChatIdFromMtpPeer) }),\n };\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n * incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n ? global.TYPED_ARRAY_SUPPORT\n : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42 && // typed array instances can be augmented\n typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n } catch (e) {\n return false\n }\n}\n\nfunction kMaxLength () {\n return Buffer.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n if (kMaxLength() < length) {\n throw new RangeError('Invalid typed array length')\n }\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = new Uint8Array(length)\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n if (that === null) {\n that = new Buffer(length)\n }\n that.length = length\n }\n\n return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, encodingOrOffset, length)\n }\n\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(this, arg)\n }\n return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n arr.__proto__ = Buffer.prototype\n return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, encodingOrOffset)\n }\n\n return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype\n Buffer.__proto__ = Uint8Array\n if (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true\n })\n }\n}\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (that, size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(that, size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(that, size).fill(fill, encoding)\n : createBuffer(that, size).fill(fill)\n }\n return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n assertSize(size)\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0\n }\n }\n return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n\n var length = byteLength(string, encoding) | 0\n that = createBuffer(that, length)\n\n var actual = that.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n that = that.slice(0, actual)\n }\n\n return that\n}\n\nfunction fromArrayLike (that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n that = createBuffer(that, length)\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255\n }\n return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array)\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset)\n } else {\n array = new Uint8Array(array, byteOffset, length)\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = array\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n that = fromArrayLike(that, array)\n }\n return that\n}\n\nfunction fromObject (that, obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n that = createBuffer(that, len)\n\n if (that.length === 0) {\n return that\n }\n\n obj.copy(that, 0, 0, len)\n return that\n }\n\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0)\n }\n return fromArrayLike(that, obj)\n }\n\n if (obj.type === 'Buffer' && isArray(obj.data)) {\n return fromArrayLike(that, obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < kMaxLength()` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= kMaxLength()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + kMaxLength().toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length | 0\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return ''\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (isNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (Buffer.TYPED_ARRAY_SUPPORT &&\n typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n // must be an even number of digits\n var strLen = string.length\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (isNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset | 0\n if (isFinite(length)) {\n length = length | 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n // legacy write(string, encoding, offset, length) - remove in v0.13\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end)\n newBuf.__proto__ = Buffer.prototype\n } else {\n var sliceLen = end - start\n newBuf = new Buffer(sliceLen, undefined)\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start]\n }\n }\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n (littleEndian ? i : 1 - i) * 8\n }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n var i\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if (code < 256) {\n val = code\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : utf8ToBytes(new Buffer(val, encoding).toString())\n var len = bytes.length\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction stringtrim (str) {\n if (str.trim) return str.trim()\n return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\nfunction isnan (val) {\n return val !== val // eslint-disable-line no-self-compare\n}\n","import { Api as GramJs } from '../../../lib/gramjs';\nimport {\n ApiChat,\n ApiAttachment,\n ApiMessage,\n OnApiUpdate,\n ApiMessageSearchType,\n ApiUser,\n ApiSticker,\n ApiVideo,\n ApiNewPoll,\n ApiMessageEntity,\n ApiOnProgress,\n ApiThreadInfo,\n MAIN_THREAD_ID,\n MESSAGE_DELETED,\n ApiGlobalMessageSearchType,\n ApiReportReason,\n} from '../../types';\n\nimport { ALL_FOLDER_ID, DEBUG, PINNED_MESSAGES_LIMIT } from '../../../config';\nimport { invokeRequest, uploadFile } from './client';\nimport {\n buildApiMessage,\n buildLocalMessage,\n buildWebPage,\n buildForwardedMessage,\n} from '../apiBuilders/messages';\nimport { buildApiUser } from '../apiBuilders/users';\nimport {\n buildInputEntity,\n buildInputPeer,\n generateRandomBigInt,\n getEntityTypeById,\n buildInputMediaDocument,\n buildInputPoll,\n buildMtpMessageEntity,\n isMessageWithMedia,\n isServiceMessageWithMedia,\n calculateResultHash,\n buildInputReportReason,\n} from '../gramjsBuilders';\nimport localDb from '../localDb';\nimport { buildApiChatFromPreview } from '../apiBuilders/chats';\nimport { fetchFile } from '../../../util/files';\nimport { addMessageToLocalDb, resolveMessageApiChatId } from '../helpers';\nimport { interpolateArray } from '../../../util/waveform';\nimport { requestChatUpdate } from './chats';\n\nconst FAST_SEND_TIMEOUT = 1000;\nconst INPUT_WAVEFORM_LENGTH = 63;\n\nlet onUpdate: OnApiUpdate;\n\nexport function init(_onUpdate: OnApiUpdate) {\n onUpdate = _onUpdate;\n}\n\nexport async function fetchMessages({\n chat,\n threadId,\n ...pagination\n}: {\n chat: ApiChat;\n threadId?: number;\n offsetId?: number;\n addOffset?: number;\n limit: number;\n}) {\n const RequestClass = threadId === MAIN_THREAD_ID ? GramJs.messages.GetHistory : GramJs.messages.GetReplies;\n let result;\n\n try {\n result = await invokeRequest(new RequestClass({\n peer: buildInputPeer(chat.id, chat.accessHash),\n ...(threadId !== MAIN_THREAD_ID && {\n msgId: threadId,\n }),\n ...pagination,\n }), undefined, true);\n } catch (err) {\n if (err.message === 'CHANNEL_PRIVATE') {\n onUpdate({\n '@type': 'updateChat',\n id: chat.id,\n chat: {\n isRestricted: true,\n },\n });\n }\n }\n\n if (\n !result\n || result instanceof GramJs.messages.MessagesNotModified\n || !result.messages\n ) {\n return undefined;\n }\n\n updateLocalDb(result);\n\n const messages = result.messages.map(buildApiMessage).filter(Boolean as any);\n const users = result.users.map(buildApiUser).filter(Boolean as any);\n const chats = result.chats.map((c) => buildApiChatFromPreview(c)).filter(Boolean as any);\n const threadInfos = messages.map(({ threadInfo }) => threadInfo).filter(Boolean as any);\n\n return {\n messages,\n users,\n chats,\n threadInfos,\n };\n}\n\nexport async function fetchMessage({ chat, messageId }: { chat: ApiChat; messageId: number }) {\n const isChannel = getEntityTypeById(chat.id) === 'channel';\n\n const result = await invokeRequest(\n isChannel\n ? new GramJs.channels.GetMessages({\n channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel,\n id: [new GramJs.InputMessageID({ id: messageId })],\n })\n : new GramJs.messages.GetMessages({\n id: [new GramJs.InputMessageID({ id: messageId })],\n }),\n );\n\n if (!result || result instanceof GramJs.messages.MessagesNotModified) {\n return undefined;\n }\n\n const mtpMessage = result.messages[0];\n if (!mtpMessage) {\n return undefined;\n }\n\n if (mtpMessage instanceof GramJs.MessageEmpty) {\n return MESSAGE_DELETED;\n }\n\n const message = mtpMessage && buildApiMessage(mtpMessage);\n if (!message) {\n return undefined;\n }\n\n if (mtpMessage instanceof GramJs.Message) {\n addMessageToLocalDb(mtpMessage);\n }\n\n const users = result.users.map(buildApiUser).filter(Boolean as any);\n\n return { message, users };\n}\n\nlet queue = Promise.resolve();\n\nexport function sendMessage(\n {\n chat,\n text,\n entities,\n replyingTo,\n attachment,\n sticker,\n gif,\n poll,\n isSilent,\n scheduledAt,\n groupedId,\n noWebPage,\n serverTimeOffset,\n }: {\n chat: ApiChat;\n text?: string;\n entities?: ApiMessageEntity[];\n replyingTo?: number;\n attachment?: ApiAttachment;\n sticker?: ApiSticker;\n gif?: ApiVideo;\n poll?: ApiNewPoll;\n isSilent?: boolean;\n scheduledAt?: number;\n groupedId?: string;\n noWebPage?: boolean;\n serverTimeOffset?: number;\n },\n onProgress?: ApiOnProgress,\n) {\n const localMessage = buildLocalMessage(\n chat, text, entities, replyingTo, attachment, sticker, gif, poll, groupedId, scheduledAt, serverTimeOffset,\n );\n onUpdate({\n '@type': localMessage.isScheduled ? 'newScheduledMessage' : 'newMessage',\n id: localMessage.id,\n chatId: chat.id,\n message: localMessage,\n });\n\n // This is expected to arrive after `updateMessageSendSucceeded` which replaces the local ID,\n // so in most cases this will be simply ignored\n setTimeout(() => {\n onUpdate({\n '@type': localMessage.isScheduled ? 'updateScheduledMessage' : 'updateMessage',\n id: localMessage.id,\n chatId: chat.id,\n message: {\n sendingState: 'messageSendingStatePending',\n },\n });\n }, FAST_SEND_TIMEOUT);\n\n const randomId = generateRandomBigInt();\n localDb.localMessages[randomId.toString()] = localMessage;\n\n if (groupedId) {\n return sendGroupedMedia({\n chat, text, entities, replyingTo, attachment: attachment!, groupedId, isSilent, scheduledAt,\n }, randomId, localMessage, onProgress);\n }\n\n const prevQueue = queue;\n queue = (async () => {\n let media: GramJs.TypeInputMedia | undefined;\n if (attachment) {\n try {\n media = await uploadMedia(localMessage, attachment, onProgress!);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err);\n }\n\n await prevQueue;\n\n return;\n }\n } else if (sticker) {\n media = buildInputMediaDocument(sticker);\n } else if (gif) {\n media = buildInputMediaDocument(gif);\n } else if (poll) {\n media = buildInputPoll(poll, randomId);\n }\n\n await prevQueue;\n\n const RequestClass = media ? GramJs.messages.SendMedia : GramJs.messages.SendMessage;\n\n await invokeRequest(new RequestClass({\n clearDraft: true,\n message: text || '',\n entities: entities ? entities.map(buildMtpMessageEntity) : undefined,\n peer: buildInputPeer(chat.id, chat.accessHash),\n randomId,\n ...(isSilent && { silent: isSilent }),\n ...(scheduledAt && { scheduleDate: scheduledAt }),\n ...(replyingTo && { replyToMsgId: replyingTo }),\n ...(media && { media }),\n ...(noWebPage && { noWebpage: noWebPage }),\n }), true);\n })();\n\n return queue;\n}\n\nconst groupedUploads: Record;\n}> = {};\n\nfunction sendGroupedMedia(\n {\n chat,\n text,\n entities,\n replyingTo,\n attachment,\n groupedId,\n isSilent,\n scheduledAt,\n }: {\n chat: ApiChat;\n text?: string;\n entities?: ApiMessageEntity[];\n replyingTo?: number;\n attachment: ApiAttachment;\n groupedId: string;\n isSilent?: boolean;\n scheduledAt?: number;\n },\n randomId: GramJs.long,\n localMessage: ApiMessage,\n onProgress?: ApiOnProgress,\n) {\n let groupIndex = -1;\n if (!groupedUploads[groupedId]) {\n groupedUploads[groupedId] = {\n counter: 0,\n singleMediaByIndex: {},\n };\n }\n\n groupIndex = groupedUploads[groupedId].counter++;\n\n const prevQueue = queue;\n queue = (async () => {\n let media;\n try {\n media = await uploadMedia(localMessage, attachment, onProgress!);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err);\n }\n\n groupedUploads[groupedId].counter--;\n\n await prevQueue;\n\n return;\n }\n\n const inputMedia = await fetchInputMedia(\n buildInputPeer(chat.id, chat.accessHash),\n media as GramJs.InputMediaUploadedPhoto | GramJs.InputMediaUploadedDocument,\n );\n\n await prevQueue;\n\n if (!inputMedia) {\n groupedUploads[groupedId].counter--;\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to upload grouped media');\n }\n\n return;\n }\n\n groupedUploads[groupedId].singleMediaByIndex[groupIndex] = new GramJs.InputSingleMedia({\n media: inputMedia,\n randomId,\n message: text || '',\n entities: entities ? entities.map(buildMtpMessageEntity) : undefined,\n });\n\n if (Object.keys(groupedUploads[groupedId].singleMediaByIndex).length < groupedUploads[groupedId].counter) {\n return;\n }\n\n const { singleMediaByIndex } = groupedUploads[groupedId];\n delete groupedUploads[groupedId];\n\n await invokeRequest(new GramJs.messages.SendMultiMedia({\n clearDraft: true,\n peer: buildInputPeer(chat.id, chat.accessHash),\n multiMedia: Object.values(singleMediaByIndex), // Object keys are usually ordered\n replyToMsgId: replyingTo,\n ...(isSilent && { silent: isSilent }),\n ...(scheduledAt && { scheduleDate: scheduledAt }),\n }), true);\n })();\n\n return queue;\n}\n\nasync function fetchInputMedia(\n peer: GramJs.TypeInputPeer,\n uploadedMedia: GramJs.InputMediaUploadedPhoto | GramJs.InputMediaUploadedDocument,\n) {\n const messageMedia = await invokeRequest(new GramJs.messages.UploadMedia({\n peer,\n media: uploadedMedia,\n }));\n\n if ((\n messageMedia instanceof GramJs.MessageMediaPhoto\n && messageMedia.photo\n && messageMedia.photo instanceof GramJs.Photo)\n ) {\n const { photo: { id, accessHash, fileReference } } = messageMedia;\n\n return new GramJs.InputMediaPhoto({\n id: new GramJs.InputPhoto({ id, accessHash, fileReference }),\n });\n }\n\n if ((\n messageMedia instanceof GramJs.MessageMediaDocument\n && messageMedia.document\n && messageMedia.document instanceof GramJs.Document)\n ) {\n const { document: { id, accessHash, fileReference } } = messageMedia;\n\n return new GramJs.InputMediaDocument({\n id: new GramJs.InputDocument({ id, accessHash, fileReference }),\n });\n }\n\n return undefined;\n}\n\nexport async function editMessage({\n chat,\n message,\n text,\n entities,\n noWebPage,\n serverTimeOffset,\n}: {\n chat: ApiChat;\n message: ApiMessage;\n text: string;\n entities?: ApiMessageEntity[];\n noWebPage?: boolean;\n serverTimeOffset: number;\n}) {\n const isScheduled = message.date * 1000 > Date.now() + serverTimeOffset * 1000;\n const messageUpdate: Partial = {\n content: {\n ...message.content,\n ...(text && {\n text: {\n text,\n entities,\n },\n }),\n },\n };\n\n onUpdate({\n '@type': isScheduled ? 'updateScheduledMessage' : 'updateMessage',\n id: message.id,\n chatId: chat.id,\n message: messageUpdate,\n });\n\n // TODO Revise intersecting with scheduled\n localDb.localMessages[message.id] = { ...message, ...messageUpdate };\n\n const mtpEntities = entities && entities.map(buildMtpMessageEntity);\n\n await invokeRequest(new GramJs.messages.EditMessage({\n message: text || '',\n entities: mtpEntities,\n peer: buildInputPeer(chat.id, chat.accessHash),\n id: message.id,\n ...(isScheduled && { scheduleDate: message.date }),\n ...(noWebPage && { noWebpage: noWebPage }),\n }), true);\n}\n\nexport async function rescheduleMessage({\n chat,\n message,\n scheduledAt,\n}: {\n chat: ApiChat;\n message: ApiMessage;\n scheduledAt: number;\n}) {\n await invokeRequest(new GramJs.messages.EditMessage({\n peer: buildInputPeer(chat.id, chat.accessHash),\n id: message.id,\n scheduleDate: scheduledAt,\n }), true);\n}\n\nasync function uploadMedia(localMessage: ApiMessage, attachment: ApiAttachment, onProgress: ApiOnProgress) {\n const {\n filename, blobUrl, mimeType, quick, voice,\n } = attachment;\n\n const file = await fetchFile(blobUrl, filename);\n const patchedOnProgress: ApiOnProgress = (progress) => {\n if (onProgress.isCanceled) {\n patchedOnProgress.isCanceled = true;\n } else {\n onProgress(progress, localMessage.id);\n }\n };\n const inputFile = await uploadFile(file, patchedOnProgress);\n\n const attributes: GramJs.TypeDocumentAttribute[] = [new GramJs.DocumentAttributeFilename({ fileName: filename })];\n if (quick) {\n if (mimeType.startsWith('image/')) {\n return new GramJs.InputMediaUploadedPhoto({ file: inputFile });\n } else {\n const { width, height, duration } = quick;\n if (duration !== undefined) {\n attributes.push(new GramJs.DocumentAttributeVideo({\n duration,\n w: width,\n h: height,\n }));\n }\n }\n }\n\n if (voice) {\n const { duration, waveform } = voice;\n const { data: inputWaveform } = interpolateArray(waveform, INPUT_WAVEFORM_LENGTH);\n attributes.push(new GramJs.DocumentAttributeAudio({\n voice: true,\n duration,\n waveform: Buffer.from(inputWaveform),\n }));\n }\n\n return new GramJs.InputMediaUploadedDocument({\n file: inputFile,\n mimeType,\n attributes,\n });\n}\n\nexport async function pinMessage({\n chat, messageId, isUnpin, isOneSide, isSilent,\n}: { chat: ApiChat; messageId: number; isUnpin: boolean; isOneSide: boolean; isSilent: boolean }) {\n await invokeRequest(new GramJs.messages.UpdatePinnedMessage({\n peer: buildInputPeer(chat.id, chat.accessHash),\n id: messageId,\n ...(isUnpin && { unpin: true }),\n ...(isOneSide && { pmOneside: true }),\n ...(isSilent && { silent: true }),\n }), true);\n}\n\nexport async function unpinAllMessages({ chat }: { chat: ApiChat }) {\n await invokeRequest(new GramJs.messages.UnpinAllMessages({\n peer: buildInputPeer(chat.id, chat.accessHash),\n }), true);\n}\n\nexport async function deleteMessages({\n chat, messageIds, shouldDeleteForAll,\n}: {\n chat: ApiChat; messageIds: number[]; shouldDeleteForAll?: boolean;\n}) {\n const isChannel = getEntityTypeById(chat.id) === 'channel';\n\n const result = await invokeRequest(\n isChannel\n ? new GramJs.channels.DeleteMessages({\n channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel,\n id: messageIds,\n })\n : new GramJs.messages.DeleteMessages({\n id: messageIds,\n ...(shouldDeleteForAll && { revoke: true }),\n }),\n );\n\n if (!result) {\n return;\n }\n\n onUpdate({\n '@type': 'deleteMessages',\n ids: messageIds,\n ...(isChannel && { chatId: chat.id }),\n });\n}\n\nexport async function deleteScheduledMessages({\n chat, messageIds,\n}: {\n chat: ApiChat; messageIds: number[];\n}) {\n const result = await invokeRequest(\n new GramJs.messages.DeleteScheduledMessages({\n peer: buildInputPeer(chat.id, chat.accessHash),\n id: messageIds,\n }),\n );\n\n if (!result) {\n return;\n }\n\n onUpdate({\n '@type': 'deleteScheduledMessages',\n ids: messageIds,\n chatId: chat.id,\n });\n}\n\nexport async function deleteHistory({\n chat, shouldDeleteForAll, maxId,\n}: {\n chat: ApiChat; shouldDeleteForAll?: boolean; maxId?: number;\n}) {\n const isChannel = getEntityTypeById(chat.id) === 'channel';\n const result = await invokeRequest(\n isChannel\n ? new GramJs.channels.DeleteHistory({\n channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel,\n maxId,\n })\n : new GramJs.messages.DeleteHistory({\n peer: buildInputPeer(chat.id, chat.accessHash),\n ...(shouldDeleteForAll && { revoke: true }),\n ...(!shouldDeleteForAll && { just_clear: true }),\n maxId,\n }),\n );\n\n if (!result) {\n return;\n }\n\n onUpdate({\n '@type': 'deleteHistory',\n chatId: chat.id,\n });\n}\n\nexport async function reportMessages({\n peer, messageIds, reason, description,\n}: {\n peer: ApiChat | ApiUser; messageIds: number[]; reason: ApiReportReason; description?: string;\n}) {\n const result = await invokeRequest(new GramJs.messages.Report({\n peer: buildInputPeer(peer.id, peer.accessHash),\n id: messageIds,\n reason: buildInputReportReason(reason),\n message: description,\n }));\n\n return result;\n}\n\nexport async function markMessageListRead({\n chat, threadId, maxId, serverTimeOffset,\n}: {\n chat: ApiChat; threadId: number; maxId?: number; serverTimeOffset: number;\n}) {\n const isChannel = getEntityTypeById(chat.id) === 'channel';\n\n if (isChannel && threadId === MAIN_THREAD_ID) {\n await invokeRequest(new GramJs.channels.ReadHistory({\n channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel,\n maxId,\n }));\n } else if (isChannel) {\n await invokeRequest(new GramJs.messages.ReadDiscussion({\n peer: buildInputPeer(chat.id, chat.accessHash),\n msgId: threadId,\n readMaxId: maxId,\n }));\n } else {\n await invokeRequest(new GramJs.messages.ReadHistory({\n peer: buildInputPeer(chat.id, chat.accessHash),\n maxId,\n }));\n }\n\n if (threadId === MAIN_THREAD_ID) {\n void requestChatUpdate({ chat, serverTimeOffset });\n } else {\n void requestThreadInfoUpdate({ chat, threadId });\n }\n}\n\nexport async function markMessagesRead({\n chat, messageIds,\n}: {\n chat: ApiChat; messageIds: number[];\n}) {\n const isChannel = getEntityTypeById(chat.id) === 'channel';\n\n await invokeRequest(\n isChannel\n ? new GramJs.channels.ReadMessageContents({\n channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel,\n id: messageIds,\n })\n : new GramJs.messages.ReadMessageContents({\n id: messageIds,\n }),\n );\n\n onUpdate({\n ...(isChannel ? {\n '@type': 'updateChannelMessages',\n channelId: chat.id,\n } : {\n '@type': 'updateCommonBoxMessages',\n }),\n ids: messageIds,\n messageUpdate: {\n hasUnreadMention: false,\n isMediaUnread: false,\n },\n });\n}\n\nexport async function requestThreadInfoUpdate({\n chat, threadId,\n}: {\n chat: ApiChat; threadId: number;\n}) {\n const [topMessageResult, repliesResult] = await Promise.all([\n invokeRequest(new GramJs.messages.GetDiscussionMessage({\n peer: buildInputPeer(chat.id, chat.accessHash),\n msgId: threadId,\n })),\n invokeRequest(new GramJs.messages.GetReplies({\n peer: buildInputPeer(chat.id, chat.accessHash),\n msgId: threadId,\n offsetId: 1,\n addOffset: -1,\n limit: 1,\n })),\n ]);\n\n if (!topMessageResult || !topMessageResult.messages.length) {\n return;\n }\n\n const discussionChatId = resolveMessageApiChatId(topMessageResult.messages[0]);\n if (!discussionChatId) {\n return;\n }\n\n onUpdate({\n '@type': 'updateThreadInfo',\n chatId: discussionChatId,\n threadId,\n threadInfo: {\n topMessageId: topMessageResult.messages[topMessageResult.messages.length - 1].id,\n lastReadInboxMessageId: topMessageResult.readInboxMaxId,\n messagesCount: (repliesResult instanceof GramJs.messages.ChannelMessages) ? repliesResult.count : undefined,\n },\n firstMessageId: repliesResult && 'messages' in repliesResult && repliesResult.messages.length\n ? repliesResult.messages[0].id\n : undefined,\n });\n\n const chats = topMessageResult.chats.map((c) => buildApiChatFromPreview(c)).filter(Boolean as any);\n chats.forEach((newChat) => {\n onUpdate({\n '@type': 'updateChat',\n id: newChat.id,\n chat: newChat,\n noTopChatsRequest: true,\n });\n });\n}\n\nexport async function searchMessagesLocal({\n chatOrUser, type, query, topMessageId, minDate, maxDate, ...pagination\n}: {\n chatOrUser: ApiChat | ApiUser;\n type?: ApiMessageSearchType | ApiGlobalMessageSearchType;\n query?: string;\n topMessageId?: number;\n offsetId?: number;\n addOffset?: number;\n limit: number;\n minDate?: number;\n maxDate?: number;\n}) {\n let filter;\n switch (type) {\n case 'media':\n filter = new GramJs.InputMessagesFilterPhotoVideo();\n break;\n case 'documents':\n filter = new GramJs.InputMessagesFilterDocument();\n break;\n case 'links':\n filter = new GramJs.InputMessagesFilterUrl();\n break;\n case 'audio':\n filter = new GramJs.InputMessagesFilterMusic();\n break;\n case 'voice':\n filter = new GramJs.InputMessagesFilterVoice();\n break;\n case 'profilePhoto':\n filter = new GramJs.InputMessagesFilterChatPhotos();\n break;\n case 'text':\n default: {\n filter = new GramJs.InputMessagesFilterEmpty();\n }\n }\n\n const result = await invokeRequest(new GramJs.messages.Search({\n peer: buildInputPeer(chatOrUser.id, chatOrUser.accessHash),\n filter,\n q: query || '',\n topMsgId: topMessageId,\n minDate,\n maxDate,\n ...pagination,\n }));\n\n if (\n !result\n || result instanceof GramJs.messages.MessagesNotModified\n || !result.messages\n ) {\n return undefined;\n }\n\n updateLocalDb(result);\n\n const messages = result.messages.map(buildApiMessage).filter(Boolean as any);\n const users = result.users.map(buildApiUser).filter(Boolean as any);\n\n let totalCount = messages.length;\n let nextOffsetId: number | undefined;\n if (result instanceof GramJs.messages.MessagesSlice || result instanceof GramJs.messages.ChannelMessages) {\n totalCount = result.count;\n\n if (messages.length) {\n nextOffsetId = messages[messages.length - 1].id;\n }\n }\n\n return {\n messages,\n users,\n totalCount,\n nextOffsetId,\n };\n}\n\nexport async function searchMessagesGlobal({\n query, offsetRate = 0, limit, type = 'text', minDate, maxDate,\n}: {\n query: string;\n offsetRate?: number;\n limit: number;\n type?: ApiGlobalMessageSearchType;\n minDate?: number;\n maxDate?: number;\n}) {\n let filter;\n switch (type) {\n case 'media':\n filter = new GramJs.InputMessagesFilterPhotoVideo();\n break;\n case 'documents':\n filter = new GramJs.InputMessagesFilterDocument();\n break;\n case 'links':\n filter = new GramJs.InputMessagesFilterUrl();\n break;\n case 'audio':\n filter = new GramJs.InputMessagesFilterMusic();\n break;\n case 'voice':\n filter = new GramJs.InputMessagesFilterVoice();\n break;\n case 'text':\n default: {\n if (!query && !(maxDate && minDate)) {\n return undefined;\n }\n\n filter = new GramJs.InputMessagesFilterEmpty();\n }\n }\n\n const result = await invokeRequest(new GramJs.messages.SearchGlobal({\n q: query,\n offsetRate,\n offsetPeer: new GramJs.InputPeerEmpty(),\n limit,\n filter,\n folderId: ALL_FOLDER_ID,\n minDate,\n maxDate,\n }));\n\n if (\n !result\n || result instanceof GramJs.messages.MessagesNotModified\n || !result.messages\n ) {\n return undefined;\n }\n\n updateLocalDb({\n chats: result.chats,\n users: result.users,\n messages: result.messages,\n } as GramJs.messages.Messages);\n\n const chats = result.chats.map((user) => buildApiChatFromPreview(user)).filter(Boolean as any);\n const users = result.users.map(buildApiUser).filter(Boolean as any);\n const messages = result.messages.map(buildApiMessage).filter(Boolean as any);\n\n let totalCount = messages.length;\n let nextRate: number | undefined;\n if (result instanceof GramJs.messages.MessagesSlice || result instanceof GramJs.messages.ChannelMessages) {\n totalCount = result.count;\n\n if (messages.length) {\n nextRate = messages[messages.length - 1].id;\n }\n }\n\n return {\n messages,\n users,\n chats,\n totalCount,\n nextRate: 'nextRate' in result && result.nextRate ? result.nextRate : nextRate,\n };\n}\n\nexport async function fetchWebPagePreview({ message }: { message: string }) {\n const preview = await invokeRequest(new GramJs.messages.GetWebPagePreview({\n message,\n }));\n\n return preview && buildWebPage(preview);\n}\n\nexport async function sendPollVote({\n chat, messageId, options,\n}: {\n chat: ApiChat;\n messageId: number;\n options: string[];\n}) {\n const { id, accessHash } = chat;\n\n await invokeRequest(new GramJs.messages.SendVote({\n peer: buildInputPeer(id, accessHash),\n msgId: messageId,\n options: options.map((option) => Buffer.from(option)),\n }), true);\n}\n\nexport async function loadPollOptionResults({\n chat, messageId, option, offset, limit, shouldResetVoters,\n}: {\n chat: ApiChat;\n messageId: number;\n option?: string;\n offset?: string;\n limit?: number;\n shouldResetVoters?: boolean;\n}) {\n const { id, accessHash } = chat;\n\n const result = await invokeRequest(new GramJs.messages.GetPollVotes({\n peer: buildInputPeer(id, accessHash),\n id: messageId,\n ...(option && { option: Buffer.from(option) }),\n ...(offset && { offset }),\n ...(limit && { limit }),\n }));\n\n if (!result) {\n return undefined;\n }\n\n updateLocalDb({\n chats: [] as GramJs.TypeChat[],\n users: result.users,\n messages: [] as GramJs.Message[],\n } as GramJs.messages.Messages);\n\n const users = result.users.map(buildApiUser).filter(Boolean as any);\n const votes = result.votes.map((vote) => ({\n userId: vote.userId,\n date: vote.date,\n }));\n\n return {\n count: result.count,\n votes,\n users,\n nextOffset: result.nextOffset,\n shouldResetVoters,\n };\n}\n\nexport async function forwardMessages({\n fromChat,\n toChat,\n messages,\n serverTimeOffset,\n}: {\n fromChat: ApiChat;\n toChat: ApiChat;\n messages: ApiMessage[];\n serverTimeOffset: number;\n}) {\n const messageIds = messages.map(({ id }) => id);\n const randomIds = messages.map(generateRandomBigInt);\n\n messages.forEach((message, index) => {\n const localMessage = buildForwardedMessage(toChat, message, serverTimeOffset);\n localDb.localMessages[String(randomIds[index])] = localMessage;\n\n onUpdate({\n '@type': 'newMessage',\n id: localMessage.id,\n chatId: toChat.id,\n message: localMessage,\n });\n });\n\n await invokeRequest(new GramJs.messages.ForwardMessages({\n fromPeer: buildInputPeer(fromChat.id, fromChat.accessHash),\n toPeer: buildInputPeer(toChat.id, toChat.accessHash),\n randomId: randomIds,\n id: messageIds,\n }), true);\n}\n\nexport async function findFirstMessageIdAfterDate({\n chat,\n timestamp,\n}: {\n chat: ApiChat;\n timestamp: number;\n}) {\n const result = await invokeRequest(new GramJs.messages.GetHistory({\n peer: buildInputPeer(chat.id, chat.accessHash),\n offsetDate: timestamp,\n addOffset: -1,\n limit: 1,\n }));\n\n if (\n !result\n || result instanceof GramJs.messages.MessagesNotModified\n || !result.messages || !result.messages.length\n ) {\n return undefined;\n }\n\n return result.messages[0].id;\n}\n\nexport async function fetchScheduledHistory({ chat, hash = 0 }: { chat: ApiChat; hash?: number }) {\n const { id, accessHash } = chat;\n\n const result = await invokeRequest(new GramJs.messages.GetScheduledHistory({\n peer: buildInputPeer(id, accessHash),\n hash,\n }));\n\n if (\n !result\n || result instanceof GramJs.messages.MessagesNotModified\n || !result.messages\n ) {\n return undefined;\n }\n\n updateLocalDb(result);\n\n const messages = result.messages.map(buildApiMessage).filter(Boolean as any);\n\n return {\n messages,\n hash: calculateResultHash(messages.map((message) => message.id)),\n };\n}\n\nexport async function sendScheduledMessages({ chat, ids }: { chat: ApiChat; ids: number[] }) {\n const { id, accessHash } = chat;\n\n await invokeRequest(new GramJs.messages.SendScheduledMessages({\n peer: buildInputPeer(id, accessHash),\n id: ids,\n }), true);\n}\n\nfunction updateLocalDb(result: (\n GramJs.messages.MessagesSlice | GramJs.messages.Messages | GramJs.messages.ChannelMessages |\n GramJs.messages.DiscussionMessage\n)) {\n result.users.forEach((user) => {\n if (user instanceof GramJs.User) {\n localDb.users[user.id] = user;\n }\n });\n\n result.chats.forEach((chat) => {\n if (chat instanceof GramJs.Chat || chat instanceof GramJs.Channel) {\n localDb.chats[chat.id] = chat;\n }\n });\n\n result.messages.forEach((message) => {\n if ((message instanceof GramJs.Message && isMessageWithMedia(message))\n || (message instanceof GramJs.MessageService && isServiceMessageWithMedia(message))\n ) {\n addMessageToLocalDb(message);\n }\n });\n}\n\nexport async function fetchPinnedMessages({ chat }: { chat: ApiChat }) {\n const result = await invokeRequest(new GramJs.messages.Search(\n {\n peer: buildInputPeer(chat.id, chat.accessHash),\n filter: new GramJs.InputMessagesFilterPinned(),\n q: '',\n limit: PINNED_MESSAGES_LIMIT,\n },\n ));\n\n if (\n !result\n || result instanceof GramJs.messages.MessagesNotModified\n || !result.messages\n ) {\n return undefined;\n }\n\n updateLocalDb(result);\n\n const messages = result.messages.map(buildApiMessage).filter(Boolean as any);\n const users = result.users.map(buildApiUser).filter(Boolean as any);\n const chats = result.chats.map((c) => buildApiChatFromPreview(c)).filter(Boolean as any);\n\n return {\n messages,\n users,\n chats,\n };\n}\n","import { Api as GramJs } from '../../../lib/gramjs';\nimport { ApiUser, ApiUserStatus, ApiUserType } from '../../types';\n\nexport function buildApiUserFromFull(mtpUserFull: GramJs.UserFull): ApiUser {\n const {\n about, commonChatsCount, pinnedMsgId, botInfo, blocked,\n } = mtpUserFull;\n\n return {\n ...(buildApiUser(mtpUserFull.user) as ApiUser),\n fullInfo: {\n bio: about,\n commonChatsCount,\n pinnedMessageId: pinnedMsgId,\n isBlocked: Boolean(blocked),\n ...(botInfo && { botDescription: botInfo.description }),\n },\n };\n}\n\nexport function buildApiUser(mtpUser: GramJs.TypeUser): ApiUser | undefined {\n if (!(mtpUser instanceof GramJs.User)) {\n return undefined;\n }\n\n const { id, firstName, lastName } = mtpUser;\n const avatarHash = mtpUser.photo instanceof GramJs.UserProfilePhoto\n ? String(mtpUser.photo.photoId)\n : undefined;\n const userType = buildApiUserType(mtpUser);\n\n return {\n id,\n isMin: Boolean(mtpUser.min),\n ...(mtpUser.self && { isSelf: true }),\n ...(mtpUser.verified && { isVerified: true }),\n ...((mtpUser.contact || mtpUser.mutualContact) && { isContact: true }),\n type: userType,\n ...(firstName && { firstName }),\n ...(userType === 'userTypeBot' && { canBeInvitedToGroup: !mtpUser.botNochats }),\n ...(lastName && { lastName }),\n username: mtpUser.username || '',\n phoneNumber: mtpUser.phone || '',\n status: buildApiUserStatus(mtpUser.status),\n ...(mtpUser.accessHash && { accessHash: String(mtpUser.accessHash) }),\n ...(avatarHash && { avatarHash }),\n ...(mtpUser.bot && mtpUser.botInlinePlaceholder && { botPlaceholder: mtpUser.botInlinePlaceholder }),\n };\n}\n\nfunction buildApiUserType(user: GramJs.User): ApiUserType {\n if (user.bot) {\n return 'userTypeBot';\n }\n if (user.deleted) {\n return 'userTypeDeleted';\n }\n\n return 'userTypeRegular';\n}\n\nexport function buildApiUserStatus(mtpStatus?: GramJs.TypeUserStatus): ApiUserStatus {\n if (!mtpStatus || mtpStatus instanceof GramJs.UserStatusEmpty) {\n return { type: 'userStatusEmpty' };\n } else if (mtpStatus instanceof GramJs.UserStatusOnline) {\n return { type: 'userStatusOnline', expires: mtpStatus.expires };\n } else if (mtpStatus instanceof GramJs.UserStatusOffline) {\n return { type: 'userStatusOffline', wasOnline: mtpStatus.wasOnline };\n } else if (mtpStatus instanceof GramJs.UserStatusRecently) {\n return { type: 'userStatusRecently' };\n } else if (mtpStatus instanceof GramJs.UserStatusLastWeek) {\n return { type: 'userStatusLastWeek' };\n } else {\n return { type: 'userStatusLastMonth' };\n }\n}\n","export * from './users';\nexport * from './chats';\nexport * from './messages';\nexport * from './updates';\nexport * from './media';\nexport * from './payments';\nexport * from './settings';\nexport * from './bots';\nexport * from './misc';\n","type CollectionByKey = Record;\n\ntype OrderDirection = 'asc' | 'desc';\n\ninterface OrderCallback {\n (member: T): any;\n}\n\nexport function buildCollectionByKey(collection: T[], key: keyof T) {\n return collection.reduce((byKey: CollectionByKey, member: T) => {\n byKey[member[key]] = member;\n\n return byKey;\n }, {});\n}\n\nexport function mapValues(\n byKey: CollectionByKey,\n callback: (member: M, key: string, index: number, originalByKey: CollectionByKey) => R,\n): CollectionByKey {\n return Object.keys(byKey).reduce((newByKey: CollectionByKey, key, index) => {\n newByKey[key] = callback(byKey[key], key, index, byKey);\n return newByKey;\n }, {});\n}\n\nexport function pick(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n result[key] = object[key];\n return result;\n }, {} as Pick);\n}\n\nexport function pickTruthy(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n if (object[key]) {\n result[key] = object[key];\n }\n\n return result;\n }, {} as Pick);\n}\n\nexport function omit(object: T, keys: K[]) {\n const stringKeys = new Set(keys.map(String));\n const savedKeys = Object.keys(object)\n .filter((key) => !stringKeys.has(key)) as Array>;\n\n return pick(object, savedKeys);\n}\n\nexport function orderBy(\n collection: T[],\n orderKey: (keyof T) | OrderCallback | ((keyof T) | OrderCallback)[],\n mode: OrderDirection | [OrderDirection, OrderDirection] = 'asc',\n): T[] {\n return collection.sort((a, b) => {\n if (Array.isArray(orderKey)) {\n const [mode1, mode2] = Array.isArray(mode) ? mode : [mode, mode];\n const [orderKey1, orderKey2] = orderKey;\n\n let aValue1;\n let bValue1;\n\n if (typeof orderKey1 === 'function') {\n aValue1 = orderKey1(a) || 0;\n bValue1 = orderKey1(b) || 0;\n } else if (typeof orderKey1 === 'string') {\n aValue1 = a[orderKey1] || 0;\n bValue1 = b[orderKey1] || 0;\n }\n\n if (aValue1 !== bValue1) {\n return mode1 === 'asc' ? aValue1 - bValue1 : bValue1 - aValue1;\n } else {\n let aValue2;\n let bValue2;\n\n if (typeof orderKey2 === 'function') {\n aValue2 = orderKey2(a) || 0;\n bValue2 = orderKey2(b) || 0;\n } else if (typeof orderKey2 === 'string') {\n aValue2 = a[orderKey2] || 0;\n bValue2 = b[orderKey2] || 0;\n }\n\n return mode2 === 'asc' ? aValue2 - bValue2 : bValue2 - aValue2;\n }\n }\n\n let aValue;\n let bValue;\n\n if (typeof orderKey === 'function') {\n aValue = orderKey(a) || 0;\n bValue = orderKey(b) || 0;\n } else if (typeof orderKey === 'string') {\n aValue = a[orderKey] || 0;\n bValue = b[orderKey] || 0;\n }\n\n return mode === 'asc' ? aValue - bValue : bValue - aValue;\n });\n}\n\nexport function flatten(array: any[]) {\n return array.reduce((result, member) => {\n if (Array.isArray(member)) {\n return result.concat(member);\n } else {\n result.push(member);\n return result;\n }\n }, []);\n}\n\nexport function unique(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function compact(array: any[]) {\n return array.filter(Boolean);\n}\n\nexport function areSortedArraysEqual(array1: any[], array2: any[]) {\n if (array1.length !== array2.length) {\n return false;\n }\n\n return array1.every((item, i) => item === array2[i]);\n}\n\nexport function areSortedArraysIntersecting(array1: any[], array2: any[]) {\n return array1[0] <= array2[array2.length - 1] && array1[array1.length - 1] >= array2[0];\n}\n\nexport function findIntersectionWithSet(array: T[], set: Set): T[] {\n return array.filter((a) => set.has(a));\n}\n\nexport function split(array: any[], chunkSize: number) {\n const result = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n\n return result;\n}\n\nexport function cloneDeep(value: T): T {\n if (typeof value !== 'object') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(cloneDeep) as typeof value;\n }\n\n return Object.keys(value).reduce((acc, key) => {\n acc[key as keyof T] = cloneDeep(value[key as keyof T]);\n return acc;\n }, {} as T);\n}\n\n/**\n * Returns the index of the last element in the array where predicate is true, and -1 otherwise.\n *\n * @param array The source array to search in\n * @param predicate find calls predicate once for each element of the array, in descending\n * order, until it finds one where predicate returns true. If such an element is found,\n * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.\n */\nexport function findLast(array: Array, predicate: (value: T, index: number, obj: T[]) => boolean): T | undefined {\n let cursor = array.length;\n\n while (cursor--) {\n if (predicate(array[cursor], cursor, array)) {\n return array[cursor];\n }\n }\n\n return undefined;\n}\n","var bigInt = (function (undefined) {\r\n \"use strict\";\r\n\r\n var BASE = 1e7,\r\n LOG_BASE = 7,\r\n MAX_INT = 9007199254740992,\r\n MAX_INT_ARR = smallToArray(MAX_INT),\r\n DEFAULT_ALPHABET = \"0123456789abcdefghijklmnopqrstuvwxyz\";\r\n\r\n var supportsNativeBigInt = typeof BigInt === \"function\";\r\n\r\n function Integer(v, radix, alphabet, caseSensitive) {\r\n if (typeof v === \"undefined\") return Integer[0];\r\n if (typeof radix !== \"undefined\") return +radix === 10 && !alphabet ? parseValue(v) : parseBase(v, radix, alphabet, caseSensitive);\r\n return parseValue(v);\r\n }\r\n\r\n function BigInteger(value, sign) {\r\n this.value = value;\r\n this.sign = sign;\r\n this.isSmall = false;\r\n }\r\n BigInteger.prototype = Object.create(Integer.prototype);\r\n\r\n function SmallInteger(value) {\r\n this.value = value;\r\n this.sign = value < 0;\r\n this.isSmall = true;\r\n }\r\n SmallInteger.prototype = Object.create(Integer.prototype);\r\n\r\n function NativeBigInt(value) {\r\n this.value = value;\r\n }\r\n NativeBigInt.prototype = Object.create(Integer.prototype);\r\n\r\n function isPrecise(n) {\r\n return -MAX_INT < n && n < MAX_INT;\r\n }\r\n\r\n function smallToArray(n) { // For performance reasons doesn't reference BASE, need to change this function if BASE changes\r\n if (n < 1e7)\r\n return [n];\r\n if (n < 1e14)\r\n return [n % 1e7, Math.floor(n / 1e7)];\r\n return [n % 1e7, Math.floor(n / 1e7) % 1e7, Math.floor(n / 1e14)];\r\n }\r\n\r\n function arrayToSmall(arr) { // If BASE changes this function may need to change\r\n trim(arr);\r\n var length = arr.length;\r\n if (length < 4 && compareAbs(arr, MAX_INT_ARR) < 0) {\r\n switch (length) {\r\n case 0: return 0;\r\n case 1: return arr[0];\r\n case 2: return arr[0] + arr[1] * BASE;\r\n default: return arr[0] + (arr[1] + arr[2] * BASE) * BASE;\r\n }\r\n }\r\n return arr;\r\n }\r\n\r\n function trim(v) {\r\n var i = v.length;\r\n while (v[--i] === 0);\r\n v.length = i + 1;\r\n }\r\n\r\n function createArray(length) { // function shamelessly stolen from Yaffle's library https://github.com/Yaffle/BigInteger\r\n var x = new Array(length);\r\n var i = -1;\r\n while (++i < length) {\r\n x[i] = 0;\r\n }\r\n return x;\r\n }\r\n\r\n function truncate(n) {\r\n if (n > 0) return Math.floor(n);\r\n return Math.ceil(n);\r\n }\r\n\r\n function add(a, b) { // assumes a and b are arrays with a.length >= b.length\r\n var l_a = a.length,\r\n l_b = b.length,\r\n r = new Array(l_a),\r\n carry = 0,\r\n base = BASE,\r\n sum, i;\r\n for (i = 0; i < l_b; i++) {\r\n sum = a[i] + b[i] + carry;\r\n carry = sum >= base ? 1 : 0;\r\n r[i] = sum - carry * base;\r\n }\r\n while (i < l_a) {\r\n sum = a[i] + carry;\r\n carry = sum === base ? 1 : 0;\r\n r[i++] = sum - carry * base;\r\n }\r\n if (carry > 0) r.push(carry);\r\n return r;\r\n }\r\n\r\n function addAny(a, b) {\r\n if (a.length >= b.length) return add(a, b);\r\n return add(b, a);\r\n }\r\n\r\n function addSmall(a, carry) { // assumes a is array, carry is number with 0 <= carry < MAX_INT\r\n var l = a.length,\r\n r = new Array(l),\r\n base = BASE,\r\n sum, i;\r\n for (i = 0; i < l; i++) {\r\n sum = a[i] - base + carry;\r\n carry = Math.floor(sum / base);\r\n r[i] = sum - carry * base;\r\n carry += 1;\r\n }\r\n while (carry > 0) {\r\n r[i++] = carry % base;\r\n carry = Math.floor(carry / base);\r\n }\r\n return r;\r\n }\r\n\r\n BigInteger.prototype.add = function (v) {\r\n var n = parseValue(v);\r\n if (this.sign !== n.sign) {\r\n return this.subtract(n.negate());\r\n }\r\n var a = this.value, b = n.value;\r\n if (n.isSmall) {\r\n return new BigInteger(addSmall(a, Math.abs(b)), this.sign);\r\n }\r\n return new BigInteger(addAny(a, b), this.sign);\r\n };\r\n BigInteger.prototype.plus = BigInteger.prototype.add;\r\n\r\n SmallInteger.prototype.add = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value;\r\n if (a < 0 !== n.sign) {\r\n return this.subtract(n.negate());\r\n }\r\n var b = n.value;\r\n if (n.isSmall) {\r\n if (isPrecise(a + b)) return new SmallInteger(a + b);\r\n b = smallToArray(Math.abs(b));\r\n }\r\n return new BigInteger(addSmall(b, Math.abs(a)), a < 0);\r\n };\r\n SmallInteger.prototype.plus = SmallInteger.prototype.add;\r\n\r\n NativeBigInt.prototype.add = function (v) {\r\n return new NativeBigInt(this.value + parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.plus = NativeBigInt.prototype.add;\r\n\r\n function subtract(a, b) { // assumes a and b are arrays with a >= b\r\n var a_l = a.length,\r\n b_l = b.length,\r\n r = new Array(a_l),\r\n borrow = 0,\r\n base = BASE,\r\n i, difference;\r\n for (i = 0; i < b_l; i++) {\r\n difference = a[i] - borrow - b[i];\r\n if (difference < 0) {\r\n difference += base;\r\n borrow = 1;\r\n } else borrow = 0;\r\n r[i] = difference;\r\n }\r\n for (i = b_l; i < a_l; i++) {\r\n difference = a[i] - borrow;\r\n if (difference < 0) difference += base;\r\n else {\r\n r[i++] = difference;\r\n break;\r\n }\r\n r[i] = difference;\r\n }\r\n for (; i < a_l; i++) {\r\n r[i] = a[i];\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n function subtractAny(a, b, sign) {\r\n var value;\r\n if (compareAbs(a, b) >= 0) {\r\n value = subtract(a, b);\r\n } else {\r\n value = subtract(b, a);\r\n sign = !sign;\r\n }\r\n value = arrayToSmall(value);\r\n if (typeof value === \"number\") {\r\n if (sign) value = -value;\r\n return new SmallInteger(value);\r\n }\r\n return new BigInteger(value, sign);\r\n }\r\n\r\n function subtractSmall(a, b, sign) { // assumes a is array, b is number with 0 <= b < MAX_INT\r\n var l = a.length,\r\n r = new Array(l),\r\n carry = -b,\r\n base = BASE,\r\n i, difference;\r\n for (i = 0; i < l; i++) {\r\n difference = a[i] + carry;\r\n carry = Math.floor(difference / base);\r\n difference %= base;\r\n r[i] = difference < 0 ? difference + base : difference;\r\n }\r\n r = arrayToSmall(r);\r\n if (typeof r === \"number\") {\r\n if (sign) r = -r;\r\n return new SmallInteger(r);\r\n } return new BigInteger(r, sign);\r\n }\r\n\r\n BigInteger.prototype.subtract = function (v) {\r\n var n = parseValue(v);\r\n if (this.sign !== n.sign) {\r\n return this.add(n.negate());\r\n }\r\n var a = this.value, b = n.value;\r\n if (n.isSmall)\r\n return subtractSmall(a, Math.abs(b), this.sign);\r\n return subtractAny(a, b, this.sign);\r\n };\r\n BigInteger.prototype.minus = BigInteger.prototype.subtract;\r\n\r\n SmallInteger.prototype.subtract = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value;\r\n if (a < 0 !== n.sign) {\r\n return this.add(n.negate());\r\n }\r\n var b = n.value;\r\n if (n.isSmall) {\r\n return new SmallInteger(a - b);\r\n }\r\n return subtractSmall(b, Math.abs(a), a >= 0);\r\n };\r\n SmallInteger.prototype.minus = SmallInteger.prototype.subtract;\r\n\r\n NativeBigInt.prototype.subtract = function (v) {\r\n return new NativeBigInt(this.value - parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.minus = NativeBigInt.prototype.subtract;\r\n\r\n BigInteger.prototype.negate = function () {\r\n return new BigInteger(this.value, !this.sign);\r\n };\r\n SmallInteger.prototype.negate = function () {\r\n var sign = this.sign;\r\n var small = new SmallInteger(-this.value);\r\n small.sign = !sign;\r\n return small;\r\n };\r\n NativeBigInt.prototype.negate = function () {\r\n return new NativeBigInt(-this.value);\r\n }\r\n\r\n BigInteger.prototype.abs = function () {\r\n return new BigInteger(this.value, false);\r\n };\r\n SmallInteger.prototype.abs = function () {\r\n return new SmallInteger(Math.abs(this.value));\r\n };\r\n NativeBigInt.prototype.abs = function () {\r\n return new NativeBigInt(this.value >= 0 ? this.value : -this.value);\r\n }\r\n\r\n\r\n function multiplyLong(a, b) {\r\n var a_l = a.length,\r\n b_l = b.length,\r\n l = a_l + b_l,\r\n r = createArray(l),\r\n base = BASE,\r\n product, carry, i, a_i, b_j;\r\n for (i = 0; i < a_l; ++i) {\r\n a_i = a[i];\r\n for (var j = 0; j < b_l; ++j) {\r\n b_j = b[j];\r\n product = a_i * b_j + r[i + j];\r\n carry = Math.floor(product / base);\r\n r[i + j] = product - carry * base;\r\n r[i + j + 1] += carry;\r\n }\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n function multiplySmall(a, b) { // assumes a is array, b is number with |b| < BASE\r\n var l = a.length,\r\n r = new Array(l),\r\n base = BASE,\r\n carry = 0,\r\n product, i;\r\n for (i = 0; i < l; i++) {\r\n product = a[i] * b + carry;\r\n carry = Math.floor(product / base);\r\n r[i] = product - carry * base;\r\n }\r\n while (carry > 0) {\r\n r[i++] = carry % base;\r\n carry = Math.floor(carry / base);\r\n }\r\n return r;\r\n }\r\n\r\n function shiftLeft(x, n) {\r\n var r = [];\r\n while (n-- > 0) r.push(0);\r\n return r.concat(x);\r\n }\r\n\r\n function multiplyKaratsuba(x, y) {\r\n var n = Math.max(x.length, y.length);\r\n\r\n if (n <= 30) return multiplyLong(x, y);\r\n n = Math.ceil(n / 2);\r\n\r\n var b = x.slice(n),\r\n a = x.slice(0, n),\r\n d = y.slice(n),\r\n c = y.slice(0, n);\r\n\r\n var ac = multiplyKaratsuba(a, c),\r\n bd = multiplyKaratsuba(b, d),\r\n abcd = multiplyKaratsuba(addAny(a, b), addAny(c, d));\r\n\r\n var product = addAny(addAny(ac, shiftLeft(subtract(subtract(abcd, ac), bd), n)), shiftLeft(bd, 2 * n));\r\n trim(product);\r\n return product;\r\n }\r\n\r\n // The following function is derived from a surface fit of a graph plotting the performance difference\r\n // between long multiplication and karatsuba multiplication versus the lengths of the two arrays.\r\n function useKaratsuba(l1, l2) {\r\n return -0.012 * l1 - 0.012 * l2 + 0.000015 * l1 * l2 > 0;\r\n }\r\n\r\n BigInteger.prototype.multiply = function (v) {\r\n var n = parseValue(v),\r\n a = this.value, b = n.value,\r\n sign = this.sign !== n.sign,\r\n abs;\r\n if (n.isSmall) {\r\n if (b === 0) return Integer[0];\r\n if (b === 1) return this;\r\n if (b === -1) return this.negate();\r\n abs = Math.abs(b);\r\n if (abs < BASE) {\r\n return new BigInteger(multiplySmall(a, abs), sign);\r\n }\r\n b = smallToArray(abs);\r\n }\r\n if (useKaratsuba(a.length, b.length)) // Karatsuba is only faster for certain array sizes\r\n return new BigInteger(multiplyKaratsuba(a, b), sign);\r\n return new BigInteger(multiplyLong(a, b), sign);\r\n };\r\n\r\n BigInteger.prototype.times = BigInteger.prototype.multiply;\r\n\r\n function multiplySmallAndArray(a, b, sign) { // a >= 0\r\n if (a < BASE) {\r\n return new BigInteger(multiplySmall(b, a), sign);\r\n }\r\n return new BigInteger(multiplyLong(b, smallToArray(a)), sign);\r\n }\r\n SmallInteger.prototype._multiplyBySmall = function (a) {\r\n if (isPrecise(a.value * this.value)) {\r\n return new SmallInteger(a.value * this.value);\r\n }\r\n return multiplySmallAndArray(Math.abs(a.value), smallToArray(Math.abs(this.value)), this.sign !== a.sign);\r\n };\r\n BigInteger.prototype._multiplyBySmall = function (a) {\r\n if (a.value === 0) return Integer[0];\r\n if (a.value === 1) return this;\r\n if (a.value === -1) return this.negate();\r\n return multiplySmallAndArray(Math.abs(a.value), this.value, this.sign !== a.sign);\r\n };\r\n SmallInteger.prototype.multiply = function (v) {\r\n return parseValue(v)._multiplyBySmall(this);\r\n };\r\n SmallInteger.prototype.times = SmallInteger.prototype.multiply;\r\n\r\n NativeBigInt.prototype.multiply = function (v) {\r\n return new NativeBigInt(this.value * parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.times = NativeBigInt.prototype.multiply;\r\n\r\n function square(a) {\r\n //console.assert(2 * BASE * BASE < MAX_INT);\r\n var l = a.length,\r\n r = createArray(l + l),\r\n base = BASE,\r\n product, carry, i, a_i, a_j;\r\n for (i = 0; i < l; i++) {\r\n a_i = a[i];\r\n carry = 0 - a_i * a_i;\r\n for (var j = i; j < l; j++) {\r\n a_j = a[j];\r\n product = 2 * (a_i * a_j) + r[i + j] + carry;\r\n carry = Math.floor(product / base);\r\n r[i + j] = product - carry * base;\r\n }\r\n r[i + l] = carry;\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n BigInteger.prototype.square = function () {\r\n return new BigInteger(square(this.value), false);\r\n };\r\n\r\n SmallInteger.prototype.square = function () {\r\n var value = this.value * this.value;\r\n if (isPrecise(value)) return new SmallInteger(value);\r\n return new BigInteger(square(smallToArray(Math.abs(this.value))), false);\r\n };\r\n\r\n NativeBigInt.prototype.square = function (v) {\r\n return new NativeBigInt(this.value * this.value);\r\n }\r\n\r\n function divMod1(a, b) { // Left over from previous version. Performs faster than divMod2 on smaller input sizes.\r\n var a_l = a.length,\r\n b_l = b.length,\r\n base = BASE,\r\n result = createArray(b.length),\r\n divisorMostSignificantDigit = b[b_l - 1],\r\n // normalization\r\n lambda = Math.ceil(base / (2 * divisorMostSignificantDigit)),\r\n remainder = multiplySmall(a, lambda),\r\n divisor = multiplySmall(b, lambda),\r\n quotientDigit, shift, carry, borrow, i, l, q;\r\n if (remainder.length <= a_l) remainder.push(0);\r\n divisor.push(0);\r\n divisorMostSignificantDigit = divisor[b_l - 1];\r\n for (shift = a_l - b_l; shift >= 0; shift--) {\r\n quotientDigit = base - 1;\r\n if (remainder[shift + b_l] !== divisorMostSignificantDigit) {\r\n quotientDigit = Math.floor((remainder[shift + b_l] * base + remainder[shift + b_l - 1]) / divisorMostSignificantDigit);\r\n }\r\n // quotientDigit <= base - 1\r\n carry = 0;\r\n borrow = 0;\r\n l = divisor.length;\r\n for (i = 0; i < l; i++) {\r\n carry += quotientDigit * divisor[i];\r\n q = Math.floor(carry / base);\r\n borrow += remainder[shift + i] - (carry - q * base);\r\n carry = q;\r\n if (borrow < 0) {\r\n remainder[shift + i] = borrow + base;\r\n borrow = -1;\r\n } else {\r\n remainder[shift + i] = borrow;\r\n borrow = 0;\r\n }\r\n }\r\n while (borrow !== 0) {\r\n quotientDigit -= 1;\r\n carry = 0;\r\n for (i = 0; i < l; i++) {\r\n carry += remainder[shift + i] - base + divisor[i];\r\n if (carry < 0) {\r\n remainder[shift + i] = carry + base;\r\n carry = 0;\r\n } else {\r\n remainder[shift + i] = carry;\r\n carry = 1;\r\n }\r\n }\r\n borrow += carry;\r\n }\r\n result[shift] = quotientDigit;\r\n }\r\n // denormalization\r\n remainder = divModSmall(remainder, lambda)[0];\r\n return [arrayToSmall(result), arrayToSmall(remainder)];\r\n }\r\n\r\n function divMod2(a, b) { // Implementation idea shamelessly stolen from Silent Matt's library http://silentmatt.com/biginteger/\r\n // Performs faster than divMod1 on larger input sizes.\r\n var a_l = a.length,\r\n b_l = b.length,\r\n result = [],\r\n part = [],\r\n base = BASE,\r\n guess, xlen, highx, highy, check;\r\n while (a_l) {\r\n part.unshift(a[--a_l]);\r\n trim(part);\r\n if (compareAbs(part, b) < 0) {\r\n result.push(0);\r\n continue;\r\n }\r\n xlen = part.length;\r\n highx = part[xlen - 1] * base + part[xlen - 2];\r\n highy = b[b_l - 1] * base + b[b_l - 2];\r\n if (xlen > b_l) {\r\n highx = (highx + 1) * base;\r\n }\r\n guess = Math.ceil(highx / highy);\r\n do {\r\n check = multiplySmall(b, guess);\r\n if (compareAbs(check, part) <= 0) break;\r\n guess--;\r\n } while (guess);\r\n result.push(guess);\r\n part = subtract(part, check);\r\n }\r\n result.reverse();\r\n return [arrayToSmall(result), arrayToSmall(part)];\r\n }\r\n\r\n function divModSmall(value, lambda) {\r\n var length = value.length,\r\n quotient = createArray(length),\r\n base = BASE,\r\n i, q, remainder, divisor;\r\n remainder = 0;\r\n for (i = length - 1; i >= 0; --i) {\r\n divisor = remainder * base + value[i];\r\n q = truncate(divisor / lambda);\r\n remainder = divisor - q * lambda;\r\n quotient[i] = q | 0;\r\n }\r\n return [quotient, remainder | 0];\r\n }\r\n\r\n function divModAny(self, v) {\r\n var value, n = parseValue(v);\r\n if (supportsNativeBigInt) {\r\n return [new NativeBigInt(self.value / n.value), new NativeBigInt(self.value % n.value)];\r\n }\r\n var a = self.value, b = n.value;\r\n var quotient;\r\n if (b === 0) throw new Error(\"Cannot divide by zero\");\r\n if (self.isSmall) {\r\n if (n.isSmall) {\r\n return [new SmallInteger(truncate(a / b)), new SmallInteger(a % b)];\r\n }\r\n return [Integer[0], self];\r\n }\r\n if (n.isSmall) {\r\n if (b === 1) return [self, Integer[0]];\r\n if (b == -1) return [self.negate(), Integer[0]];\r\n var abs = Math.abs(b);\r\n if (abs < BASE) {\r\n value = divModSmall(a, abs);\r\n quotient = arrayToSmall(value[0]);\r\n var remainder = value[1];\r\n if (self.sign) remainder = -remainder;\r\n if (typeof quotient === \"number\") {\r\n if (self.sign !== n.sign) quotient = -quotient;\r\n return [new SmallInteger(quotient), new SmallInteger(remainder)];\r\n }\r\n return [new BigInteger(quotient, self.sign !== n.sign), new SmallInteger(remainder)];\r\n }\r\n b = smallToArray(abs);\r\n }\r\n var comparison = compareAbs(a, b);\r\n if (comparison === -1) return [Integer[0], self];\r\n if (comparison === 0) return [Integer[self.sign === n.sign ? 1 : -1], Integer[0]];\r\n\r\n // divMod1 is faster on smaller input sizes\r\n if (a.length + b.length <= 200)\r\n value = divMod1(a, b);\r\n else value = divMod2(a, b);\r\n\r\n quotient = value[0];\r\n var qSign = self.sign !== n.sign,\r\n mod = value[1],\r\n mSign = self.sign;\r\n if (typeof quotient === \"number\") {\r\n if (qSign) quotient = -quotient;\r\n quotient = new SmallInteger(quotient);\r\n } else quotient = new BigInteger(quotient, qSign);\r\n if (typeof mod === \"number\") {\r\n if (mSign) mod = -mod;\r\n mod = new SmallInteger(mod);\r\n } else mod = new BigInteger(mod, mSign);\r\n return [quotient, mod];\r\n }\r\n\r\n BigInteger.prototype.divmod = function (v) {\r\n var result = divModAny(this, v);\r\n return {\r\n quotient: result[0],\r\n remainder: result[1]\r\n };\r\n };\r\n NativeBigInt.prototype.divmod = SmallInteger.prototype.divmod = BigInteger.prototype.divmod;\r\n\r\n\r\n BigInteger.prototype.divide = function (v) {\r\n return divModAny(this, v)[0];\r\n };\r\n NativeBigInt.prototype.over = NativeBigInt.prototype.divide = function (v) {\r\n return new NativeBigInt(this.value / parseValue(v).value);\r\n };\r\n SmallInteger.prototype.over = SmallInteger.prototype.divide = BigInteger.prototype.over = BigInteger.prototype.divide;\r\n\r\n BigInteger.prototype.mod = function (v) {\r\n return divModAny(this, v)[1];\r\n };\r\n NativeBigInt.prototype.mod = NativeBigInt.prototype.remainder = function (v) {\r\n return new NativeBigInt(this.value % parseValue(v).value);\r\n };\r\n SmallInteger.prototype.remainder = SmallInteger.prototype.mod = BigInteger.prototype.remainder = BigInteger.prototype.mod;\r\n\r\n BigInteger.prototype.pow = function (v) {\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value,\r\n value, x, y;\r\n if (b === 0) return Integer[1];\r\n if (a === 0) return Integer[0];\r\n if (a === 1) return Integer[1];\r\n if (a === -1) return n.isEven() ? Integer[1] : Integer[-1];\r\n if (n.sign) {\r\n return Integer[0];\r\n }\r\n if (!n.isSmall) throw new Error(\"The exponent \" + n.toString() + \" is too large.\");\r\n if (this.isSmall) {\r\n if (isPrecise(value = Math.pow(a, b)))\r\n return new SmallInteger(truncate(value));\r\n }\r\n x = this;\r\n y = Integer[1];\r\n while (true) {\r\n if (b & 1 === 1) {\r\n y = y.times(x);\r\n --b;\r\n }\r\n if (b === 0) break;\r\n b /= 2;\r\n x = x.square();\r\n }\r\n return y;\r\n };\r\n SmallInteger.prototype.pow = BigInteger.prototype.pow;\r\n\r\n NativeBigInt.prototype.pow = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value, b = n.value;\r\n var _0 = BigInt(0), _1 = BigInt(1), _2 = BigInt(2);\r\n if (b === _0) return Integer[1];\r\n if (a === _0) return Integer[0];\r\n if (a === _1) return Integer[1];\r\n if (a === BigInt(-1)) return n.isEven() ? Integer[1] : Integer[-1];\r\n if (n.isNegative()) return new NativeBigInt(_0);\r\n var x = this;\r\n var y = Integer[1];\r\n while (true) {\r\n if ((b & _1) === _1) {\r\n y = y.times(x);\r\n --b;\r\n }\r\n if (b === _0) break;\r\n b /= _2;\r\n x = x.square();\r\n }\r\n return y;\r\n }\r\n\r\n BigInteger.prototype.modPow = function (exp, mod) {\r\n exp = parseValue(exp);\r\n mod = parseValue(mod);\r\n if (mod.isZero()) throw new Error(\"Cannot take modPow with modulus 0\");\r\n var r = Integer[1],\r\n base = this.mod(mod);\r\n if (exp.isNegative()) {\r\n exp = exp.multiply(Integer[-1]);\r\n base = base.modInv(mod);\r\n }\r\n while (exp.isPositive()) {\r\n if (base.isZero()) return Integer[0];\r\n if (exp.isOdd()) r = r.multiply(base).mod(mod);\r\n exp = exp.divide(2);\r\n base = base.square().mod(mod);\r\n }\r\n return r;\r\n };\r\n NativeBigInt.prototype.modPow = SmallInteger.prototype.modPow = BigInteger.prototype.modPow;\r\n\r\n function compareAbs(a, b) {\r\n if (a.length !== b.length) {\r\n return a.length > b.length ? 1 : -1;\r\n }\r\n for (var i = a.length - 1; i >= 0; i--) {\r\n if (a[i] !== b[i]) return a[i] > b[i] ? 1 : -1;\r\n }\r\n return 0;\r\n }\r\n\r\n BigInteger.prototype.compareAbs = function (v) {\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (n.isSmall) return 1;\r\n return compareAbs(a, b);\r\n };\r\n SmallInteger.prototype.compareAbs = function (v) {\r\n var n = parseValue(v),\r\n a = Math.abs(this.value),\r\n b = n.value;\r\n if (n.isSmall) {\r\n b = Math.abs(b);\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n return -1;\r\n };\r\n NativeBigInt.prototype.compareAbs = function (v) {\r\n var a = this.value;\r\n var b = parseValue(v).value;\r\n a = a >= 0 ? a : -a;\r\n b = b >= 0 ? b : -b;\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n\r\n BigInteger.prototype.compare = function (v) {\r\n // See discussion about comparison with Infinity:\r\n // https://github.com/peterolson/BigInteger.js/issues/61\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (this.sign !== n.sign) {\r\n return n.sign ? 1 : -1;\r\n }\r\n if (n.isSmall) {\r\n return this.sign ? -1 : 1;\r\n }\r\n return compareAbs(a, b) * (this.sign ? -1 : 1);\r\n };\r\n BigInteger.prototype.compareTo = BigInteger.prototype.compare;\r\n\r\n SmallInteger.prototype.compare = function (v) {\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (n.isSmall) {\r\n return a == b ? 0 : a > b ? 1 : -1;\r\n }\r\n if (a < 0 !== n.sign) {\r\n return a < 0 ? -1 : 1;\r\n }\r\n return a < 0 ? 1 : -1;\r\n };\r\n SmallInteger.prototype.compareTo = SmallInteger.prototype.compare;\r\n\r\n NativeBigInt.prototype.compare = function (v) {\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n var a = this.value;\r\n var b = parseValue(v).value;\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n NativeBigInt.prototype.compareTo = NativeBigInt.prototype.compare;\r\n\r\n BigInteger.prototype.equals = function (v) {\r\n return this.compare(v) === 0;\r\n };\r\n NativeBigInt.prototype.eq = NativeBigInt.prototype.equals = SmallInteger.prototype.eq = SmallInteger.prototype.equals = BigInteger.prototype.eq = BigInteger.prototype.equals;\r\n\r\n BigInteger.prototype.notEquals = function (v) {\r\n return this.compare(v) !== 0;\r\n };\r\n NativeBigInt.prototype.neq = NativeBigInt.prototype.notEquals = SmallInteger.prototype.neq = SmallInteger.prototype.notEquals = BigInteger.prototype.neq = BigInteger.prototype.notEquals;\r\n\r\n BigInteger.prototype.greater = function (v) {\r\n return this.compare(v) > 0;\r\n };\r\n NativeBigInt.prototype.gt = NativeBigInt.prototype.greater = SmallInteger.prototype.gt = SmallInteger.prototype.greater = BigInteger.prototype.gt = BigInteger.prototype.greater;\r\n\r\n BigInteger.prototype.lesser = function (v) {\r\n return this.compare(v) < 0;\r\n };\r\n NativeBigInt.prototype.lt = NativeBigInt.prototype.lesser = SmallInteger.prototype.lt = SmallInteger.prototype.lesser = BigInteger.prototype.lt = BigInteger.prototype.lesser;\r\n\r\n BigInteger.prototype.greaterOrEquals = function (v) {\r\n return this.compare(v) >= 0;\r\n };\r\n NativeBigInt.prototype.geq = NativeBigInt.prototype.greaterOrEquals = SmallInteger.prototype.geq = SmallInteger.prototype.greaterOrEquals = BigInteger.prototype.geq = BigInteger.prototype.greaterOrEquals;\r\n\r\n BigInteger.prototype.lesserOrEquals = function (v) {\r\n return this.compare(v) <= 0;\r\n };\r\n NativeBigInt.prototype.leq = NativeBigInt.prototype.lesserOrEquals = SmallInteger.prototype.leq = SmallInteger.prototype.lesserOrEquals = BigInteger.prototype.leq = BigInteger.prototype.lesserOrEquals;\r\n\r\n BigInteger.prototype.isEven = function () {\r\n return (this.value[0] & 1) === 0;\r\n };\r\n SmallInteger.prototype.isEven = function () {\r\n return (this.value & 1) === 0;\r\n };\r\n NativeBigInt.prototype.isEven = function () {\r\n return (this.value & BigInt(1)) === BigInt(0);\r\n }\r\n\r\n BigInteger.prototype.isOdd = function () {\r\n return (this.value[0] & 1) === 1;\r\n };\r\n SmallInteger.prototype.isOdd = function () {\r\n return (this.value & 1) === 1;\r\n };\r\n NativeBigInt.prototype.isOdd = function () {\r\n return (this.value & BigInt(1)) === BigInt(1);\r\n }\r\n\r\n BigInteger.prototype.isPositive = function () {\r\n return !this.sign;\r\n };\r\n SmallInteger.prototype.isPositive = function () {\r\n return this.value > 0;\r\n };\r\n NativeBigInt.prototype.isPositive = SmallInteger.prototype.isPositive;\r\n\r\n BigInteger.prototype.isNegative = function () {\r\n return this.sign;\r\n };\r\n SmallInteger.prototype.isNegative = function () {\r\n return this.value < 0;\r\n };\r\n NativeBigInt.prototype.isNegative = SmallInteger.prototype.isNegative;\r\n\r\n BigInteger.prototype.isUnit = function () {\r\n return false;\r\n };\r\n SmallInteger.prototype.isUnit = function () {\r\n return Math.abs(this.value) === 1;\r\n };\r\n NativeBigInt.prototype.isUnit = function () {\r\n return this.abs().value === BigInt(1);\r\n }\r\n\r\n BigInteger.prototype.isZero = function () {\r\n return false;\r\n };\r\n SmallInteger.prototype.isZero = function () {\r\n return this.value === 0;\r\n };\r\n NativeBigInt.prototype.isZero = function () {\r\n return this.value === BigInt(0);\r\n }\r\n\r\n BigInteger.prototype.isDivisibleBy = function (v) {\r\n var n = parseValue(v);\r\n if (n.isZero()) return false;\r\n if (n.isUnit()) return true;\r\n if (n.compareAbs(2) === 0) return this.isEven();\r\n return this.mod(n).isZero();\r\n };\r\n NativeBigInt.prototype.isDivisibleBy = SmallInteger.prototype.isDivisibleBy = BigInteger.prototype.isDivisibleBy;\r\n\r\n function isBasicPrime(v) {\r\n var n = v.abs();\r\n if (n.isUnit()) return false;\r\n if (n.equals(2) || n.equals(3) || n.equals(5)) return true;\r\n if (n.isEven() || n.isDivisibleBy(3) || n.isDivisibleBy(5)) return false;\r\n if (n.lesser(49)) return true;\r\n // we don't know if it's prime: let the other functions figure it out\r\n }\r\n\r\n function millerRabinTest(n, a) {\r\n var nPrev = n.prev(),\r\n b = nPrev,\r\n r = 0,\r\n d, t, i, x;\r\n while (b.isEven()) b = b.divide(2), r++;\r\n next: for (i = 0; i < a.length; i++) {\r\n if (n.lesser(a[i])) continue;\r\n x = bigInt(a[i]).modPow(b, n);\r\n if (x.isUnit() || x.equals(nPrev)) continue;\r\n for (d = r - 1; d != 0; d--) {\r\n x = x.square().mod(n);\r\n if (x.isUnit()) return false;\r\n if (x.equals(nPrev)) continue next;\r\n }\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n // Set \"strict\" to true to force GRH-supported lower bound of 2*log(N)^2\r\n BigInteger.prototype.isPrime = function (strict) {\r\n var isPrime = isBasicPrime(this);\r\n if (isPrime !== undefined) return isPrime;\r\n var n = this.abs();\r\n var bits = n.bitLength();\r\n if (bits <= 64)\r\n return millerRabinTest(n, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]);\r\n var logN = Math.log(2) * bits.toJSNumber();\r\n var t = Math.ceil((strict === true) ? (2 * Math.pow(logN, 2)) : logN);\r\n for (var a = [], i = 0; i < t; i++) {\r\n a.push(bigInt(i + 2));\r\n }\r\n return millerRabinTest(n, a);\r\n };\r\n NativeBigInt.prototype.isPrime = SmallInteger.prototype.isPrime = BigInteger.prototype.isPrime;\r\n\r\n BigInteger.prototype.isProbablePrime = function (iterations, rng) {\r\n var isPrime = isBasicPrime(this);\r\n if (isPrime !== undefined) return isPrime;\r\n var n = this.abs();\r\n var t = iterations === undefined ? 5 : iterations;\r\n for (var a = [], i = 0; i < t; i++) {\r\n a.push(bigInt.randBetween(2, n.minus(2), rng));\r\n }\r\n return millerRabinTest(n, a);\r\n };\r\n NativeBigInt.prototype.isProbablePrime = SmallInteger.prototype.isProbablePrime = BigInteger.prototype.isProbablePrime;\r\n\r\n BigInteger.prototype.modInv = function (n) {\r\n var t = bigInt.zero, newT = bigInt.one, r = parseValue(n), newR = this.abs(), q, lastT, lastR;\r\n while (!newR.isZero()) {\r\n q = r.divide(newR);\r\n lastT = t;\r\n lastR = r;\r\n t = newT;\r\n r = newR;\r\n newT = lastT.subtract(q.multiply(newT));\r\n newR = lastR.subtract(q.multiply(newR));\r\n }\r\n if (!r.isUnit()) throw new Error(this.toString() + \" and \" + n.toString() + \" are not co-prime\");\r\n if (t.compare(0) === -1) {\r\n t = t.add(n);\r\n }\r\n if (this.isNegative()) {\r\n return t.negate();\r\n }\r\n return t;\r\n };\r\n\r\n NativeBigInt.prototype.modInv = SmallInteger.prototype.modInv = BigInteger.prototype.modInv;\r\n\r\n BigInteger.prototype.next = function () {\r\n var value = this.value;\r\n if (this.sign) {\r\n return subtractSmall(value, 1, this.sign);\r\n }\r\n return new BigInteger(addSmall(value, 1), this.sign);\r\n };\r\n SmallInteger.prototype.next = function () {\r\n var value = this.value;\r\n if (value + 1 < MAX_INT) return new SmallInteger(value + 1);\r\n return new BigInteger(MAX_INT_ARR, false);\r\n };\r\n NativeBigInt.prototype.next = function () {\r\n return new NativeBigInt(this.value + BigInt(1));\r\n }\r\n\r\n BigInteger.prototype.prev = function () {\r\n var value = this.value;\r\n if (this.sign) {\r\n return new BigInteger(addSmall(value, 1), true);\r\n }\r\n return subtractSmall(value, 1, this.sign);\r\n };\r\n SmallInteger.prototype.prev = function () {\r\n var value = this.value;\r\n if (value - 1 > -MAX_INT) return new SmallInteger(value - 1);\r\n return new BigInteger(MAX_INT_ARR, true);\r\n };\r\n NativeBigInt.prototype.prev = function () {\r\n return new NativeBigInt(this.value - BigInt(1));\r\n }\r\n\r\n var powersOfTwo = [1];\r\n while (2 * powersOfTwo[powersOfTwo.length - 1] <= BASE) powersOfTwo.push(2 * powersOfTwo[powersOfTwo.length - 1]);\r\n var powers2Length = powersOfTwo.length, highestPower2 = powersOfTwo[powers2Length - 1];\r\n\r\n function shift_isSmall(n) {\r\n return Math.abs(n) <= BASE;\r\n }\r\n\r\n BigInteger.prototype.shiftLeft = function (v) {\r\n var n = parseValue(v).toJSNumber();\r\n if (!shift_isSmall(n)) {\r\n throw new Error(String(n) + \" is too large for shifting.\");\r\n }\r\n if (n < 0) return this.shiftRight(-n);\r\n var result = this;\r\n if (result.isZero()) return result;\r\n while (n >= powers2Length) {\r\n result = result.multiply(highestPower2);\r\n n -= powers2Length - 1;\r\n }\r\n return result.multiply(powersOfTwo[n]);\r\n };\r\n NativeBigInt.prototype.shiftLeft = function(v){\r\n v = parseValue(v)\r\n return new NativeBigInt(this.value << v.value)\r\n }\r\n SmallInteger.prototype.shiftLeft = BigInteger.prototype.shiftLeft;\r\n\r\n BigInteger.prototype.shiftRight = function (v) {\r\n var remQuo;\r\n var n = parseValue(v).toJSNumber();\r\n if (!shift_isSmall(n)) {\r\n throw new Error(String(n) + \" is too large for shifting.\");\r\n }\r\n if (n < 0) return this.shiftLeft(-n);\r\n var result = this;\r\n while (n >= powers2Length) {\r\n if (result.isZero() || (result.isNegative() && result.isUnit())) return result;\r\n remQuo = divModAny(result, highestPower2);\r\n result = remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];\r\n n -= powers2Length - 1;\r\n }\r\n remQuo = divModAny(result, powersOfTwo[n]);\r\n return remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];\r\n };\r\n NativeBigInt.prototype.shiftRight = function (v){\r\n v = parseValue(v)\r\n return new NativeBigInt(this.value >> v.value)\r\n }\r\n SmallInteger.prototype.shiftRight = BigInteger.prototype.shiftRight;\r\n\r\n function bitwise(x, y, fn) {\r\n y = parseValue(y);\r\n var xSign = x.isNegative(), ySign = y.isNegative();\r\n var xRem = xSign ? x.not() : x,\r\n yRem = ySign ? y.not() : y;\r\n var xDigit = 0, yDigit = 0;\r\n var xDivMod = null, yDivMod = null;\r\n var result = [];\r\n while (!xRem.isZero() || !yRem.isZero()) {\r\n xDivMod = divModAny(xRem, highestPower2);\r\n xDigit = xDivMod[1].toJSNumber();\r\n if (xSign) {\r\n xDigit = highestPower2 - 1 - xDigit; // two's complement for negative numbers\r\n }\r\n\r\n yDivMod = divModAny(yRem, highestPower2);\r\n yDigit = yDivMod[1].toJSNumber();\r\n if (ySign) {\r\n yDigit = highestPower2 - 1 - yDigit; // two's complement for negative numbers\r\n }\r\n\r\n xRem = xDivMod[0];\r\n yRem = yDivMod[0];\r\n result.push(fn(xDigit, yDigit));\r\n }\r\n var sum = fn(xSign ? 1 : 0, ySign ? 1 : 0) !== 0 ? bigInt(-1) : bigInt(0);\r\n for (var i = result.length - 1; i >= 0; i -= 1) {\r\n sum = sum.multiply(highestPower2).add(bigInt(result[i]));\r\n }\r\n return sum;\r\n }\r\n\r\n BigInteger.prototype.not = function () {\r\n return this.negate().prev();\r\n };\r\n NativeBigInt.prototype.not = SmallInteger.prototype.not = BigInteger.prototype.not;\r\n\r\n BigInteger.prototype.and = function (n) {\r\n return bitwise(this, n, function (a, b) { return a & b; });\r\n };\r\n NativeBigInt.prototype.and = SmallInteger.prototype.and = BigInteger.prototype.and;\r\n\r\n BigInteger.prototype.or = function (n) {\r\n return bitwise(this, n, function (a, b) { return a | b; });\r\n };\r\n NativeBigInt.prototype.or = SmallInteger.prototype.or = BigInteger.prototype.or;\r\n\r\n BigInteger.prototype.xor = function (n) {\r\n return bitwise(this, n, function (a, b) { return a ^ b; });\r\n };\r\n NativeBigInt.prototype.xor = SmallInteger.prototype.xor = BigInteger.prototype.xor;\r\n\r\n var LOBMASK_I = 1 << 30, LOBMASK_BI = (BASE & -BASE) * (BASE & -BASE) | LOBMASK_I;\r\n function roughLOB(n) { // get lowestOneBit (rough)\r\n // SmallInteger: return Min(lowestOneBit(n), 1 << 30)\r\n // BigInteger: return Min(lowestOneBit(n), 1 << 14) [BASE=1e7]\r\n var v = n.value,\r\n x = typeof v === \"number\" ? v | LOBMASK_I :\r\n typeof v === \"bigint\" ? v | BigInt(LOBMASK_I) :\r\n v[0] + v[1] * BASE | LOBMASK_BI;\r\n return x & -x;\r\n }\r\n\r\n function integerLogarithm(value, base) {\r\n if (base.compareTo(value) <= 0) {\r\n var tmp = integerLogarithm(value, base.square(base));\r\n var p = tmp.p;\r\n var e = tmp.e;\r\n var t = p.multiply(base);\r\n return t.compareTo(value) <= 0 ? { p: t, e: e * 2 + 1 } : { p: p, e: e * 2 };\r\n }\r\n return { p: bigInt(1), e: 0 };\r\n }\r\n\r\n BigInteger.prototype.bitLength = function () {\r\n var n = this;\r\n if (n.compareTo(bigInt(0)) < 0) {\r\n n = n.negate().subtract(bigInt(1));\r\n }\r\n if (n.compareTo(bigInt(0)) === 0) {\r\n return bigInt(0);\r\n }\r\n return bigInt(integerLogarithm(n, bigInt(2)).e).add(bigInt(1));\r\n }\r\n NativeBigInt.prototype.bitLength = SmallInteger.prototype.bitLength = BigInteger.prototype.bitLength;\r\n\r\n function max(a, b) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n return a.greater(b) ? a : b;\r\n }\r\n function min(a, b) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n return a.lesser(b) ? a : b;\r\n }\r\n function gcd(a, b) {\r\n a = parseValue(a).abs();\r\n b = parseValue(b).abs();\r\n if (a.equals(b)) return a;\r\n if (a.isZero()) return b;\r\n if (b.isZero()) return a;\r\n var c = Integer[1], d, t;\r\n while (a.isEven() && b.isEven()) {\r\n d = min(roughLOB(a), roughLOB(b));\r\n a = a.divide(d);\r\n b = b.divide(d);\r\n c = c.multiply(d);\r\n }\r\n while (a.isEven()) {\r\n a = a.divide(roughLOB(a));\r\n }\r\n do {\r\n while (b.isEven()) {\r\n b = b.divide(roughLOB(b));\r\n }\r\n if (a.greater(b)) {\r\n t = b; b = a; a = t;\r\n }\r\n b = b.subtract(a);\r\n } while (!b.isZero());\r\n return c.isUnit() ? a : a.multiply(c);\r\n }\r\n function lcm(a, b) {\r\n a = parseValue(a).abs();\r\n b = parseValue(b).abs();\r\n return a.divide(gcd(a, b)).multiply(b);\r\n }\r\n function randBetween(a, b, rng) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n var usedRNG = rng || Math.random;\r\n var low = min(a, b), high = max(a, b);\r\n var range = high.subtract(low).add(1);\r\n if (range.isSmall) return low.add(Math.floor(usedRNG() * range));\r\n var digits = toBase(range, BASE).value;\r\n var result = [], restricted = true;\r\n for (var i = 0; i < digits.length; i++) {\r\n var top = restricted ? digits[i] : BASE;\r\n var digit = truncate(usedRNG() * top);\r\n result.push(digit);\r\n if (digit < top) restricted = false;\r\n }\r\n return low.add(Integer.fromArray(result, BASE, false));\r\n }\r\n\r\n var parseBase = function (text, base, alphabet, caseSensitive) {\r\n alphabet = alphabet || DEFAULT_ALPHABET;\r\n text = String(text);\r\n if (!caseSensitive) {\r\n text = text.toLowerCase();\r\n alphabet = alphabet.toLowerCase();\r\n }\r\n var length = text.length;\r\n var i;\r\n var absBase = Math.abs(base);\r\n var alphabetValues = {};\r\n for (i = 0; i < alphabet.length; i++) {\r\n alphabetValues[alphabet[i]] = i;\r\n }\r\n for (i = 0; i < length; i++) {\r\n var c = text[i];\r\n if (c === \"-\") continue;\r\n if (c in alphabetValues) {\r\n if (alphabetValues[c] >= absBase) {\r\n if (c === \"1\" && absBase === 1) continue;\r\n throw new Error(c + \" is not a valid digit in base \" + base + \".\");\r\n }\r\n }\r\n }\r\n base = parseValue(base);\r\n var digits = [];\r\n var isNegative = text[0] === \"-\";\r\n for (i = isNegative ? 1 : 0; i < text.length; i++) {\r\n var c = text[i];\r\n if (c in alphabetValues) digits.push(parseValue(alphabetValues[c]));\r\n else if (c === \"<\") {\r\n var start = i;\r\n do { i++; } while (text[i] !== \">\" && i < text.length);\r\n digits.push(parseValue(text.slice(start + 1, i)));\r\n }\r\n else throw new Error(c + \" is not a valid character\");\r\n }\r\n return parseBaseFromArray(digits, base, isNegative);\r\n };\r\n\r\n function parseBaseFromArray(digits, base, isNegative) {\r\n var val = Integer[0], pow = Integer[1], i;\r\n for (i = digits.length - 1; i >= 0; i--) {\r\n val = val.add(digits[i].times(pow));\r\n pow = pow.times(base);\r\n }\r\n return isNegative ? val.negate() : val;\r\n }\r\n\r\n function stringify(digit, alphabet) {\r\n alphabet = alphabet || DEFAULT_ALPHABET;\r\n if (digit < alphabet.length) {\r\n return alphabet[digit];\r\n }\r\n return \"<\" + digit + \">\";\r\n }\r\n\r\n function toBase(n, base) {\r\n base = bigInt(base);\r\n if (base.isZero()) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n throw new Error(\"Cannot convert nonzero numbers to base 0.\");\r\n }\r\n if (base.equals(-1)) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n if (n.isNegative())\r\n return {\r\n value: [].concat.apply([], Array.apply(null, Array(-n.toJSNumber()))\r\n .map(Array.prototype.valueOf, [1, 0])\r\n ),\r\n isNegative: false\r\n };\r\n\r\n var arr = Array.apply(null, Array(n.toJSNumber() - 1))\r\n .map(Array.prototype.valueOf, [0, 1]);\r\n arr.unshift([1]);\r\n return {\r\n value: [].concat.apply([], arr),\r\n isNegative: false\r\n };\r\n }\r\n\r\n var neg = false;\r\n if (n.isNegative() && base.isPositive()) {\r\n neg = true;\r\n n = n.abs();\r\n }\r\n if (base.isUnit()) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n\r\n return {\r\n value: Array.apply(null, Array(n.toJSNumber()))\r\n .map(Number.prototype.valueOf, 1),\r\n isNegative: neg\r\n };\r\n }\r\n var out = [];\r\n var left = n, divmod;\r\n while (left.isNegative() || left.compareAbs(base) >= 0) {\r\n divmod = left.divmod(base);\r\n left = divmod.quotient;\r\n var digit = divmod.remainder;\r\n if (digit.isNegative()) {\r\n digit = base.minus(digit).abs();\r\n left = left.next();\r\n }\r\n out.push(digit.toJSNumber());\r\n }\r\n out.push(left.toJSNumber());\r\n return { value: out.reverse(), isNegative: neg };\r\n }\r\n\r\n function toBaseString(n, base, alphabet) {\r\n var arr = toBase(n, base);\r\n return (arr.isNegative ? \"-\" : \"\") + arr.value.map(function (x) {\r\n return stringify(x, alphabet);\r\n }).join('');\r\n }\r\n\r\n BigInteger.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n SmallInteger.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n NativeBigInt.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n BigInteger.prototype.toString = function (radix, alphabet) {\r\n if (radix === undefined) radix = 10;\r\n if (radix !== 10) return toBaseString(this, radix, alphabet);\r\n var v = this.value, l = v.length, str = String(v[--l]), zeros = \"0000000\", digit;\r\n while (--l >= 0) {\r\n digit = String(v[l]);\r\n str += zeros.slice(digit.length) + digit;\r\n }\r\n var sign = this.sign ? \"-\" : \"\";\r\n return sign + str;\r\n };\r\n\r\n SmallInteger.prototype.toString = function (radix, alphabet) {\r\n if (radix === undefined) radix = 10;\r\n if (radix != 10) return toBaseString(this, radix, alphabet);\r\n return String(this.value);\r\n };\r\n\r\n NativeBigInt.prototype.toString = SmallInteger.prototype.toString;\r\n\r\n NativeBigInt.prototype.toJSON = BigInteger.prototype.toJSON = SmallInteger.prototype.toJSON = function () { return this.toString(); }\r\n\r\n BigInteger.prototype.valueOf = function () {\r\n return parseInt(this.toString(), 10);\r\n };\r\n BigInteger.prototype.toJSNumber = BigInteger.prototype.valueOf;\r\n\r\n SmallInteger.prototype.valueOf = function () {\r\n return this.value;\r\n };\r\n SmallInteger.prototype.toJSNumber = SmallInteger.prototype.valueOf;\r\n NativeBigInt.prototype.valueOf = NativeBigInt.prototype.toJSNumber = function () {\r\n return parseInt(this.toString(), 10);\r\n }\r\n\r\n function parseStringValue(v) {\r\n if (isPrecise(+v)) {\r\n var x = +v;\r\n if (x === truncate(x))\r\n return supportsNativeBigInt ? new NativeBigInt(BigInt(x)) : new SmallInteger(x);\r\n throw new Error(\"Invalid integer: \" + v);\r\n }\r\n var sign = v[0] === \"-\";\r\n if (sign) v = v.slice(1);\r\n var split = v.split(/e/i);\r\n if (split.length > 2) throw new Error(\"Invalid integer: \" + split.join(\"e\"));\r\n if (split.length === 2) {\r\n var exp = split[1];\r\n if (exp[0] === \"+\") exp = exp.slice(1);\r\n exp = +exp;\r\n if (exp !== truncate(exp) || !isPrecise(exp)) throw new Error(\"Invalid integer: \" + exp + \" is not a valid exponent.\");\r\n var text = split[0];\r\n var decimalPlace = text.indexOf(\".\");\r\n if (decimalPlace >= 0) {\r\n exp -= text.length - decimalPlace - 1;\r\n text = text.slice(0, decimalPlace) + text.slice(decimalPlace + 1);\r\n }\r\n if (exp < 0) throw new Error(\"Cannot include negative exponent part for integers\");\r\n text += (new Array(exp + 1)).join(\"0\");\r\n v = text;\r\n }\r\n var isValid = /^([0-9][0-9]*)$/.test(v);\r\n if (!isValid) throw new Error(\"Invalid integer: \" + v);\r\n if (supportsNativeBigInt) {\r\n return new NativeBigInt(BigInt(sign ? \"-\" + v : v));\r\n }\r\n var r = [], max = v.length, l = LOG_BASE, min = max - l;\r\n while (max > 0) {\r\n r.push(+v.slice(min, max));\r\n min -= l;\r\n if (min < 0) min = 0;\r\n max -= l;\r\n }\r\n trim(r);\r\n return new BigInteger(r, sign);\r\n }\r\n\r\n function parseNumberValue(v) {\r\n if (supportsNativeBigInt) {\r\n return new NativeBigInt(BigInt(v));\r\n }\r\n if (isPrecise(v)) {\r\n if (v !== truncate(v)) throw new Error(v + \" is not an integer.\");\r\n return new SmallInteger(v);\r\n }\r\n return parseStringValue(v.toString());\r\n }\r\n\r\n function parseValue(v) {\r\n if (typeof v === \"number\") {\r\n return parseNumberValue(v);\r\n }\r\n if (typeof v === \"string\") {\r\n return parseStringValue(v);\r\n }\r\n if (typeof v === \"bigint\") {\r\n return new NativeBigInt(v);\r\n }\r\n return v;\r\n }\r\n // Pre-define numbers in range [-999,999]\r\n for (var i = 0; i < 1000; i++) {\r\n Integer[i] = parseValue(i);\r\n if (i > 0) Integer[-i] = parseValue(-i);\r\n }\r\n // Backwards compatibility\r\n Integer.one = Integer[1];\r\n Integer.zero = Integer[0];\r\n Integer.minusOne = Integer[-1];\r\n Integer.max = max;\r\n Integer.min = min;\r\n Integer.gcd = gcd;\r\n Integer.lcm = lcm;\r\n Integer.isInstance = function (x) { return x instanceof BigInteger || x instanceof SmallInteger || x instanceof NativeBigInt; };\r\n Integer.randBetween = randBetween;\r\n\r\n Integer.fromArray = function (digits, base, isNegative) {\r\n return parseBaseFromArray(digits.map(parseValue), parseValue(base || 10), isNegative);\r\n };\r\n\r\n return Integer;\r\n})();\r\n\r\n// Node.js check\r\nif (typeof module !== \"undefined\" && module.hasOwnProperty(\"exports\")) {\r\n module.exports = bigInt;\r\n}\r\n\r\n//amd check\r\nif (typeof define === \"function\" && define.amd) {\r\n define( function () {\r\n return bigInt;\r\n });\r\n}\r\n","/**\n * Converts a Telegram's RPC Error to a Python error.\n * @param rpcError the RPCError instance\n * @param request the request that caused this error\n * @constructor the RPCError as a Python exception that represents this error\n */\nconst { RPCError } = require('./RPCBaseErrors');\nconst { rpcErrorRe } = require('./RPCErrorList');\n\nfunction RPCMessageToError(rpcError, request) {\n for (const [msgRegex, Cls] of rpcErrorRe) {\n const m = rpcError.errorMessage.match(msgRegex);\n if (m) {\n const capture = m.length === 2 ? parseInt(m[1], 10) : undefined;\n return new Cls({\n request,\n capture,\n });\n }\n }\n\n return new RPCError(rpcError.errorMessage, request);\n}\n\nconst Common = require('./Common');\nconst RPCBaseErrors = require('./RPCBaseErrors');\nconst RPCErrorList = require('./RPCErrorList');\n\nmodule.exports = {\n RPCMessageToError,\n ...Common,\n ...RPCBaseErrors,\n ...RPCErrorList,\n};\n","import { Api as GramJs } from '../../lib/gramjs';\nimport localDb from './localDb';\nimport { getApiChatIdFromMtpPeer } from './apiBuilders/chats';\n\nexport function resolveMessageApiChatId(mtpMessage: GramJs.TypeMessage) {\n if (!(mtpMessage instanceof GramJs.Message || mtpMessage instanceof GramJs.MessageService)) {\n return undefined;\n }\n\n return getApiChatIdFromMtpPeer(mtpMessage.peerId);\n}\n\nexport function addMessageToLocalDb(message: GramJs.Message | GramJs.MessageService) {\n const messageFullId = `${resolveMessageApiChatId(message)}-${message.id}`;\n localDb.messages[messageFullId] = message;\n\n if (\n message instanceof GramJs.Message\n && message.media instanceof GramJs.MessageMediaDocument\n && message.media.document instanceof GramJs.Document\n ) {\n localDb.documents[String(message.media.document.id)] = message.media.document;\n }\n\n if (\n message instanceof GramJs.Message\n && message.media instanceof GramJs.MessageMediaWebPage\n && message.media.webpage instanceof GramJs.WebPage\n && message.media.webpage.document instanceof GramJs.Document\n ) {\n localDb.documents[String(message.media.webpage.document.id)] = message.media.webpage.document;\n }\n\n if (message instanceof GramJs.MessageService && 'photo' in message.action) {\n addPhotoToLocalDb(message.action.photo);\n }\n}\n\nexport function addPhotoToLocalDb(photo: GramJs.TypePhoto) {\n if (photo instanceof GramJs.Photo) {\n localDb.photos[String(photo.id)] = photo;\n }\n}\n","import { errors } from '../../../lib/gramjs';\nimport {\n ApiUpdateAuthorizationState,\n ApiUpdateAuthorizationStateType,\n OnApiUpdate,\n ApiUser,\n} from '../../types';\n\nimport { DEBUG } from '../../../config';\n\nconst ApiErrors: { [k: string]: string } = {\n PHONE_NUMBER_INVALID: 'PHONE_NUMBER_INVALID',\n PHONE_CODE_INVALID: 'PHONE_CODE_INVALID',\n PASSWORD_HASH_INVALID: 'PASSWORD_HASH_INVALID',\n PHONE_PASSWORD_FLOOD: 'You have tried logging in too many times',\n};\n\nconst authController: {\n resolve?: Function;\n reject?: Function;\n} = {};\n\nlet onUpdate: OnApiUpdate;\n\nexport function init(_onUpdate: OnApiUpdate) {\n onUpdate = _onUpdate;\n}\n\nexport function onRequestPhoneNumber() {\n onUpdate(buildAuthStateUpdate('authorizationStateWaitPhoneNumber'));\n\n return new Promise((resolve, reject) => {\n authController.resolve = resolve;\n authController.reject = reject;\n });\n}\n\nexport function onRequestCode(isCodeViaApp = false) {\n onUpdate({\n ...buildAuthStateUpdate('authorizationStateWaitCode'),\n isCodeViaApp,\n });\n\n return new Promise((resolve, reject) => {\n authController.resolve = resolve;\n authController.reject = reject;\n });\n}\n\nexport function onRequestPassword(hint?: string) {\n onUpdate({\n ...buildAuthStateUpdate('authorizationStateWaitPassword'),\n hint,\n });\n\n return new Promise((resolve) => {\n authController.resolve = resolve;\n });\n}\n\nexport function onRequestRegistration() {\n onUpdate(buildAuthStateUpdate('authorizationStateWaitRegistration'));\n\n return new Promise<[string, string?]>((resolve) => {\n authController.resolve = resolve;\n });\n}\n\nexport function onRequestQrCode(qrCode: { token: Buffer; expires: number }) {\n onUpdate({\n ...buildAuthStateUpdate('authorizationStateWaitQrCode'),\n qrCode: {\n token: btoa(String.fromCharCode(...qrCode.token)).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, ''),\n expires: qrCode.expires,\n },\n });\n\n return new Promise((resolve, reject) => {\n authController.reject = reject;\n });\n}\n\nexport function onAuthError(err: Error) {\n let message: string;\n\n if (err instanceof errors.FloodWaitError) {\n const hours = Math.ceil(Number(err.seconds) / 60 / 60);\n message = `Too many attempts. Try again in ${hours > 1 ? `${hours} hours` : 'an hour'}`;\n } else {\n message = ApiErrors[err.message];\n }\n\n if (!message) {\n message = 'Unexpected Error';\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n\n onUpdate({\n '@type': 'updateAuthorizationError',\n message,\n });\n}\n\nexport function onAuthReady() {\n onUpdate(buildAuthStateUpdate('authorizationStateReady'));\n}\n\nexport function onCurrentUserUpdate(currentUser: ApiUser) {\n onUpdate({\n '@type': 'updateCurrentUser',\n currentUser,\n });\n}\n\nexport function buildAuthStateUpdate(authorizationState: ApiUpdateAuthorizationStateType): ApiUpdateAuthorizationState {\n return {\n '@type': 'updateAuthorizationState',\n authorizationState,\n };\n}\n\nexport function provideAuthPhoneNumber(phoneNumber: string) {\n if (!authController.resolve) {\n return;\n }\n\n authController.resolve(phoneNumber);\n}\n\nexport function provideAuthCode(code: string) {\n if (!authController.resolve) {\n return;\n }\n\n authController.resolve(code);\n}\n\nexport function provideAuthPassword(password: string) {\n if (!authController.resolve) {\n return;\n }\n\n authController.resolve(password);\n}\n\nexport function provideAuthRegistration(registration: { firstName: string; lastName: string }) {\n const { firstName, lastName } = registration;\n\n if (!authController.resolve) {\n return;\n }\n\n authController.resolve([firstName, lastName]);\n}\n\nexport function restartAuth() {\n if (!authController.reject) {\n return;\n }\n\n authController.reject(new Error('RESTART_AUTH'));\n}\n\nexport function restartAuthWithQr() {\n if (!authController.reject) {\n return;\n }\n\n authController.reject(new Error('RESTART_AUTH_WITH_QR'));\n}\n","/* eslint-disable no-bitwise */\n\n// eslint-disable-next-line max-len\nconst TEMPLATE = '';\nconst LOOKUP = 'AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,';\n\nexport function pathBytesToSvg(bytes: Buffer, width: number, height: number) {\n return TEMPLATE\n .replace('{{path}}', buildPath(bytes))\n .replace('{{width}}', String(width))\n .replace('{{height}}', String(height));\n}\n\nfunction buildPath(bytes: Buffer) {\n let path = 'M';\n\n const len = bytes.length;\n for (let i = 0; i < len; i++) {\n const num = bytes[i];\n if (num >= 128 + 64) {\n path += LOOKUP[num - 128 - 64];\n } else {\n if (num >= 128) {\n path += ',';\n } else if (num >= 64) {\n path += '-';\n }\n path += String(num & 63);\n }\n }\n\n path += 'z';\n\n return path;\n}\n","import { Api as GramJs } from '../../../lib/gramjs';\nimport { strippedPhotoToJpg } from '../../../lib/gramjs/Utils';\n\nimport {\n ApiPhoto, ApiPhotoSize, ApiThumbnail,\n} from '../../types';\nimport { bytesToDataUri } from './helpers';\nimport { pathBytesToSvg } from './pathBytesToSvg';\n\nconst DEFAULT_THUMB_SIZE = { w: 100, h: 100 };\n\nexport function buildApiThumbnailFromStripped(\n sizes?: GramJs.TypePhotoSize[], mimeType?: string,\n): ApiThumbnail | undefined {\n if (!sizes || !sizes.length) {\n return undefined;\n }\n\n const thumb = sizes.find((s: any): s is GramJs.PhotoStrippedSize => s instanceof GramJs.PhotoStrippedSize);\n if (!thumb) {\n return undefined;\n }\n\n const realSizes = sizes.filter((s): s is GramJs.PhotoSize => s instanceof GramJs.PhotoSize);\n const { w, h } = realSizes && realSizes.length ? realSizes[realSizes.length - 1] : DEFAULT_THUMB_SIZE;\n const { bytes } = thumb;\n const dataUri = bytesToDataUri(\n !mimeType || mimeType === 'image/jpeg' ? strippedPhotoToJpg(bytes) : bytes,\n undefined,\n mimeType,\n );\n\n return {\n dataUri,\n width: w,\n height: h,\n };\n}\n\nexport function buildApiThumbnailFromCached(photoSize: GramJs.PhotoCachedSize): ApiThumbnail | undefined {\n const { w, h, bytes } = photoSize;\n const dataUri = bytesToDataUri(bytes, undefined, 'image/webp');\n\n return {\n dataUri,\n width: w,\n height: h,\n };\n}\n\nexport function buildApiThumbnailFromPath(\n photoSize: GramJs.PhotoPathSize,\n sizeAttribute: GramJs.DocumentAttributeImageSize,\n): ApiThumbnail | undefined {\n const { w, h } = sizeAttribute;\n const dataUri = `data:image/svg+xml;utf8,${pathBytesToSvg(photoSize.bytes, w, h)}`;\n\n return {\n dataUri,\n width: w,\n height: h,\n };\n}\n\nexport function buildApiPhoto(photo: GramJs.Photo): ApiPhoto {\n const sizes = photo.sizes\n .filter((s: any): s is GramJs.PhotoSize => {\n return s instanceof GramJs.PhotoSize || s instanceof GramJs.PhotoSizeProgressive;\n })\n .map(buildApiPhotoSize);\n\n return {\n id: String(photo.id),\n thumbnail: buildApiThumbnailFromStripped(photo.sizes),\n sizes,\n };\n}\n\nexport function buildApiPhotoSize(photoSize: GramJs.PhotoSize): ApiPhotoSize {\n const { w, h, type } = photoSize;\n\n return {\n width: w,\n height: h,\n type: type as ('m' | 'x' | 'y'),\n };\n}\n","export function bytesToDataUri(bytes: Buffer, shouldOmitPrefix = false, mimeType: string = 'image/jpeg') {\n const prefix = shouldOmitPrefix ? '' : `data:${mimeType};base64,`;\n\n return `${prefix}${btoa(String.fromCharCode(...bytes))}`;\n}\n\nexport function omitVirtualClassFields(instance: any) {\n if (!instance) {\n return undefined;\n }\n\n const {\n flags,\n CONSTRUCTOR_ID,\n SUBCLASS_OF_ID,\n className,\n classType,\n ...rest\n } = instance;\n\n return rest;\n}\n","const { constructors } = require('./tl');\n\n// eslint-disable-next-line max-len\nconst JPEG_HEADER = Buffer.from('ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00', 'hex');\nconst JPEG_FOOTER = Buffer.from('ffd9', 'hex');\n\nfunction _raiseCastFail(entity, target) {\n throw new Error(`Cannot cast ${entity.className} to any kind of ${target}`);\n}\n\n/**\n Gets the input peer for the given \"entity\" (user, chat or channel).\n\n A ``TypeError`` is raised if the given entity isn't a supported type\n or if ``check_hash is True`` but the entity's ``accessHash is None``\n *or* the entity contains ``min`` information. In this case, the hash\n cannot be used for general purposes, and thus is not returned to avoid\n any issues which can derive from invalid access hashes.\n\n Note that ``check_hash`` **is ignored** if an input peer is already\n passed since in that case we assume the user knows what they're doing.\n This is key to getting entities by explicitly passing ``hash = 0``.\n\n * @param entity\n * @param allowSelf\n * @param checkHash\n */\nfunction getInputPeer(entity, allowSelf = true, checkHash = true) {\n if (entity.SUBCLASS_OF_ID === undefined) {\n // e.g. custom.Dialog (can't cyclic import).\n\n if (allowSelf && 'inputEntity' in entity) {\n return entity.inputEntity;\n } else if ('entity' in entity) {\n return getInputPeer(entity.entity);\n } else {\n _raiseCastFail(entity, 'InputPeer');\n }\n }\n if (entity.SUBCLASS_OF_ID === 0xc91c90b6) { // crc32(b'InputPeer')\n return entity;\n }\n\n if (entity instanceof constructors.User) {\n if (entity.isSelf && allowSelf) {\n return new constructors.InputPeerSelf();\n } else if (entity.accessHash !== undefined || !checkHash) {\n return new constructors.InputPeerUser({\n userId: entity.id,\n accessHash: entity.accessHash,\n });\n } else {\n throw new Error('User without accessHash or min info cannot be input');\n }\n }\n if (entity instanceof constructors.Chat || entity instanceof constructors.ChatEmpty\n || entity instanceof constructors.ChatForbidden) {\n return new constructors.InputPeerChat({ chatId: entity.id });\n }\n if (entity instanceof constructors.Channel) {\n if (entity.accessHash !== undefined || !checkHash) {\n return new constructors.InputPeerChannel({\n channelId: entity.id,\n accessHash: entity.accessHash,\n });\n } else {\n throw new TypeError('Channel without accessHash or min info cannot be input');\n }\n }\n if (entity instanceof constructors.ChannelForbidden) {\n // \"channelForbidden are never min\", and since their hash is\n // also not optional, we assume that this truly is the case.\n return new constructors.InputPeerChannel({\n channelId: entity.id,\n accessHash: entity.accessHash,\n });\n }\n\n if (entity instanceof constructors.InputUser) {\n return new constructors.InputPeerUser({\n userId: entity.userId,\n accessHash: entity.accessHash,\n });\n }\n if (entity instanceof constructors.InputChannel) {\n return new constructors.InputPeerChannel({\n channelId: entity.channelId,\n accessHash: entity.accessHash,\n });\n }\n if (entity instanceof constructors.UserEmpty) {\n return new constructors.InputPeerEmpty();\n }\n if (entity instanceof constructors.UserFull) {\n return getInputPeer(entity.user);\n }\n\n if (entity instanceof constructors.ChatFull) {\n return new constructors.InputPeerChat({ chatId: entity.id });\n }\n\n if (entity instanceof constructors.PeerChat) {\n return new constructors.InputPeerChat(entity.chatId);\n }\n\n _raiseCastFail(entity, 'InputPeer');\n return undefined;\n}\n\n/**\n Similar to :meth:`get_input_peer`, but for :tl:`InputChannel`'s alone.\n\n .. important::\n\n This method does not validate for invalid general-purpose access\n hashes, unlike `get_input_peer`. Consider using instead:\n ``get_input_channel(get_input_peer(channel))``.\n\n * @param entity\n * @returns {InputChannel|*}\n */\n/* CONTEST\nfunction getInputChannel(entity) {\n if (entity.SUBCLASS_OF_ID === undefined) {\n _raiseCastFail(entity, 'InputChannel')\n }\n\n\n if (entity.SUBCLASS_OF_ID === 0x40f202fd) { // crc32(b'InputChannel')\n return entity\n }\n if (entity instanceof constructors.Channel || entity instanceof constructors.ChannelForbidden) {\n return new constructors.InputChannel({\n channelId: entity.id,\n accessHash: entity.accessHash || 0\n })\n }\n\n if (entity instanceof constructors.InputPeerChannel) {\n return new constructors.InputChannel({\n channelId: entity.channelId,\n accessHash: entity.accessHash\n })\n }\n _raiseCastFail(entity, 'InputChannel')\n}\n*/\n/**\n Similar to :meth:`get_input_peer`, but for :tl:`InputUser`'s alone.\n\n .. important::\n\n This method does not validate for invalid general-purpose access\n hashes, unlike `get_input_peer`. Consider using instead:\n ``get_input_channel(get_input_peer(channel))``.\n\n * @param entity\n */\n/* CONTEST\nfunction getInputUser(entity) {\n if (entity.SUBCLASS_OF_ID === undefined) {\n _raiseCastFail(entity, 'InputUser')\n }\n if (entity.SUBCLASS_OF_ID === 0xe669bf46) { // crc32(b'InputUser')\n return entity\n }\n\n if (entity instanceof constructors.User) {\n if (entity.isSelf) {\n return new constructors.InputPeerSelf()\n } else {\n return new constructors.InputUser({\n userId: entity.id,\n accessHash: entity.accessHash || 0,\n })\n }\n }\n if (entity instanceof constructors.InputPeerSelf) {\n return new constructors.InputPeerSelf()\n }\n if (entity instanceof constructors.UserEmpty || entity instanceof constructors.InputPeerEmpty) {\n return new constructors.InputUserEmpty()\n }\n\n if (entity instanceof constructors.UserFull) {\n return getInputUser(entity.user)\n }\n\n if (entity instanceof constructors.InputPeerUser) {\n return new constructors.InputUser({\n userId: entity.userId,\n accessHash: entity.accessHash\n })\n }\n\n _raiseCastFail(entity, 'InputUser')\n}\n*/\n/**\n Similar to :meth:`get_input_peer`, but for dialogs\n * @param dialog\n */\n/* CONTEST\nfunction getInputDialog(dialog) {\n try {\n if (dialog.SUBCLASS_OF_ID === 0xa21c9795) { // crc32(b'InputDialogPeer')\n return dialog\n }\n if (dialog.SUBCLASS_OF_ID === 0xc91c90b6) { // crc32(b'InputPeer')\n return new constructors.InputDialogPeer({ peer: dialog })\n }\n } catch (e) {\n _raiseCastFail(dialog, 'InputDialogPeer')\n }\n\n try {\n return new constructors.InputDialogPeer(getInputPeer(dialog))\n // eslint-disable-next-line no-empty\n } catch (e) {\n\n }\n _raiseCastFail(dialog, 'InputDialogPeer')\n}\n*/\n\n/* CONTEST\n\nfunction getInputMessage(message) {\n try {\n if (typeof message == 'number') { // This case is really common too\n return new constructors.InputMessageID({\n id: message,\n })\n } else if (message.SUBCLASS_OF_ID === 0x54b6bcc5) { // crc32(b'InputMessage')\n return message\n } else if (message.SUBCLASS_OF_ID === 0x790009e3) { // crc32(b'Message')\n return new constructors.InputMessageID(message.id)\n }\n // eslint-disable-next-line no-empty\n } catch (e) {\n }\n\n _raiseCastFail(message, 'InputMessage')\n}\n*/\n\n/**\n * Adds the JPG header and footer to a stripped image.\n * Ported from https://github.com/telegramdesktop/\n * tdesktop/blob/bec39d89e19670eb436dc794a8f20b657cb87c71/Telegram/SourceFiles/ui/image/image.cpp#L225\n\n * @param stripped{Buffer}\n * @returns {Buffer}\n */\nfunction strippedPhotoToJpg(stripped) {\n // Note: Changes here should update _stripped_real_length\n if (stripped.length < 3 || stripped[0] !== 1) {\n return stripped;\n }\n const header = Buffer.from(JPEG_HEADER);\n // eslint-disable-next-line prefer-destructuring\n header[164] = stripped[1];\n // eslint-disable-next-line prefer-destructuring\n header[166] = stripped[2];\n return Buffer.concat([header, stripped.slice(3), JPEG_FOOTER]);\n}\n\n/* CONTEST\nfunction getInputLocation(location) {\n try {\n if (!location.SUBCLASS_OF_ID) {\n throw new Error()\n }\n if (location.SUBCLASS_OF_ID === 0x1523d462) {\n return {\n dcId: null,\n inputLocation: location\n }\n }\n } catch (e) {\n _raiseCastFail(location, 'InputFileLocation')\n }\n if (location instanceof constructors.Message) {\n location = location.media\n }\n\n if (location instanceof constructors.MessageMediaDocument) {\n location = location.document\n } else if (location instanceof constructors.MessageMediaPhoto) {\n location = location.photo\n }\n\n if (location instanceof constructors.Document) {\n return {\n dcId: location.dcId,\n inputLocation: new constructors.InputDocumentFileLocation({\n id: location.id,\n accessHash: location.accessHash,\n fileReference: location.fileReference,\n thumbSize: '', // Presumably to download one of its thumbnails\n }),\n }\n } else if (location instanceof constructors.Photo) {\n return {\n dcId: location.dcId,\n inputLocation: new constructors.InputPhotoFileLocation({\n id: location.id,\n accessHash: location.accessHash,\n fileReference: location.fileReference,\n thumbSize: location.sizes[location.sizes.length - 1].type,\n }),\n }\n }\n\n if (location instanceof constructors.FileLocationToBeDeprecated) {\n throw new Error('Unavailable location cannot be used as input')\n }\n _raiseCastFail(location, 'InputFileLocation')\n}\n*/\n\n/**\n * Gets the appropriated part size when uploading or downloading files,\n * given an initial file size.\n * @param fileSize\n * @returns {Number}\n */\nfunction getAppropriatedPartSize(fileSize) {\n if (fileSize <= 104857600) { // 100MB\n return 128;\n }\n if (fileSize <= 786432000) { // 750MB\n return 256;\n }\n if (fileSize <= 2097152000) { // 2000MB\n return 512;\n }\n\n throw new Error('File size too large');\n}\n\n/* CONTEST\nfunction getPeer(peer) {\n try {\n if (typeof peer === 'number') {\n const res = resolveId(peer)\n\n if (res[1] === constructors.PeerChannel) {\n return new res[1]({ channelId: res[0] })\n } else if (res[1] === constructors.PeerChat) {\n return new res[1]({ chatId: res[0] })\n } else {\n return new res[1]({ userId: res[0] })\n }\n }\n if (peer.SUBCLASS_OF_ID === undefined) {\n throw new Error()\n }\n if (peer.SUBCLASS_OF_ID === 0x2d45687) {\n return peer\n } else if (peer instanceof constructors.contacts.ResolvedPeer ||\n peer instanceof constructors.InputNotifyPeer || peer instanceof constructors.TopPeer ||\n peer instanceof constructors.Dialog || peer instanceof constructors.DialogPeer) {\n return peer.peer\n } else if (peer instanceof constructors.ChannelFull) {\n return new constructors.PeerChannel({ channelId: peer.id })\n }\n if (peer.SUBCLASS_OF_ID === 0x7d7c6f86 || peer.SUBCLASS_OF_ID === 0xd9c7fc18) {\n // ChatParticipant, ChannelParticipant\n return new constructors.PeerUser({ userId: peer.userId })\n }\n peer = getInputPeer(peer, false, false)\n\n if (peer instanceof constructors.InputPeerUser) {\n return new constructors.PeerUser({ userId: peer.userId })\n } else if (peer instanceof constructors.InputPeerChat) {\n return new constructors.PeerChat({ chatId: peer.chatId })\n } else if (peer instanceof constructors.InputPeerChannel) {\n return new constructors.PeerChannel({ channelId: peer.channelId })\n }\n // eslint-disable-next-line no-empty\n } catch (e) {\n console.log(e)\n }\n _raiseCastFail(peer, 'peer')\n}\n*/\n\n/**\n Convert the given peer into its marked ID by default.\n\n This \"mark\" comes from the \"bot api\" format, and with it the peer type\n can be identified back. User ID is left unmodified, chat ID is negated,\n and channel ID is prefixed with -100:\n\n * ``userId``\n * ``-chatId``\n * ``-100channel_id``\n\n The original ID and the peer type class can be returned with\n a call to :meth:`resolve_id(marked_id)`.\n * @param peer\n * @param addMark\n */\n/* CONTEST\nfunction getPeerId(peer, addMark = true) {\n // First we assert it's a Peer TLObject, or early return for integers\n if (typeof peer == 'number') {\n return addMark ? peer : resolveId(peer)[0]\n }\n\n // Tell the user to use their client to resolve InputPeerSelf if we got one\n if (peer instanceof constructors.InputPeerSelf) {\n _raiseCastFail(peer, 'int (you might want to use client.get_peer_id)')\n }\n\n try {\n peer = getPeer(peer)\n } catch (e) {\n _raiseCastFail(peer, 'int')\n }\n if (peer instanceof constructors.PeerUser) {\n return peer.userId\n } else if (peer instanceof constructors.PeerChat) {\n // Check in case the user mixed things up to avoid blowing up\n if (!(0 < peer.chatId <= 0x7fffffff)) {\n peer.chatId = resolveId(peer.chatId)[0]\n }\n\n return addMark ? -(peer.chatId) : peer.chatId\n } else { // if (peer instanceof constructors.PeerChannel)\n // Check in case the user mixed things up to avoid blowing up\n if (!(0 < peer.channelId <= 0x7fffffff)) {\n peer.channelId = resolveId(peer.channelId)[0]\n }\n if (!addMark) {\n return peer.channelId\n }\n // Concat -100 through math tricks, .to_supergroup() on\n // Madeline IDs will be strictly positive -> log works.\n try {\n return -(peer.channelId + Math.pow(10, Math.floor(Math.log10(peer.channelId) + 3)))\n } catch (e) {\n throw new Error('Cannot get marked ID of a channel unless its ID is strictly positive')\n }\n }\n}\n*/\n/**\n * Given a marked ID, returns the original ID and its :tl:`Peer` type.\n * @param markedId\n */\n/* CONTEST\nfunction resolveId(markedId) {\n if (markedId >= 0) {\n return [markedId, constructors.PeerUser]\n }\n\n // There have been report of chat IDs being 10000xyz, which means their\n // marked version is -10000xyz, which in turn looks like a channel but\n // it becomes 00xyz (= xyz). Hence, we must assert that there are only\n // two zeroes.\n const m = markedId.toString()\n .match(/-100([^0]\\d*)/)\n if (m) {\n return [parseInt(m[1]), constructors.PeerChannel]\n }\n return [-markedId, constructors.PeerChat]\n}\n*/\n\n/**\n * returns an entity pair\n * @param entityId\n * @param entities\n * @param cache\n * @param getInputPeer\n * @returns {{inputEntity: *, entity: *}}\n * @private\n */\n\n/* CONTEST\n\nfunction _getEntityPair(entityId, entities, cache, getInputPeer = getInputPeer) {\n const entity = entities.get(entityId)\n let inputEntity = cache[entityId]\n if (inputEntity === undefined) {\n try {\n inputEntity = getInputPeer(inputEntity)\n } catch (e) {\n inputEntity = null\n }\n }\n return {\n entity,\n inputEntity\n }\n}\n*/\n\nfunction getMessageId(message) {\n if (message === undefined) {\n return undefined;\n }\n if (typeof message === 'number') {\n return message;\n }\n if (message.SUBCLASS_OF_ID === 0x790009e3) { // crc32(b'Message')\n return message.id;\n }\n throw new Error(`Invalid message type: ${message.constructor.name}`);\n}\n\n\n/**\n Parses the given username or channel access hash, given\n a string, username or URL. Returns a tuple consisting of\n both the stripped, lowercase username and whether it is\n a joinchat/ hash (in which case is not lowercase'd).\n\n Returns ``(None, False)`` if the ``username`` or link is not valid.\n\n * @param username {string}\n */\n\n/* CONTEST\n\nfunction parseUsername(username) {\n username = username.trim()\n const m = username.match(USERNAME_RE) || username.match(TG_JOIN_RE)\n if (m) {\n username = username.replace(m[0], '')\n if (m[1]) {\n return {\n username: username,\n isInvite: true\n }\n } else {\n username = rtrim(username, '/')\n }\n }\n if (username.match(VALID_USERNAME_RE)) {\n return {\n username: username.toLowerCase(),\n isInvite: false\n }\n } else {\n return {\n username: null,\n isInvite: false\n }\n }\n}\n\nfunction rtrim(s, mask) {\n while (~mask.indexOf(s[s.length - 1])) {\n s = s.slice(0, -1)\n }\n return s\n}\n\n */\n\n/**\n * Gets the display name for the given :tl:`User`,\n :tl:`Chat` or :tl:`Channel`. Returns an empty string otherwise\n * @param entity\n */\nfunction getDisplayName(entity) {\n if (entity instanceof constructors.User) {\n if (entity.lastName && entity.firstName) {\n return `${entity.firstName} ${entity.lastName}`;\n } else if (entity.firstName) {\n return entity.firstName;\n } else if (entity.lastName) {\n return entity.lastName;\n } else {\n return '';\n }\n } else if (entity instanceof constructors.Chat || entity instanceof constructors.Channel) {\n return entity.title;\n }\n return '';\n}\n\n/**\n * check if a given item is an array like or not\n * @param item\n * @returns {boolean}\n */\n\n/* CONTEST\nDuplicate ?\nfunction isListLike(item) {\n return (\n Array.isArray(item) ||\n (!!item &&\n typeof item === 'object' &&\n typeof (item.length) === 'number' &&\n (item.length === 0 ||\n (item.length > 0 &&\n (item.length - 1) in item)\n )\n )\n )\n}\n*/\nfunction getDC(dcId) {\n // TODO Move to external config\n switch (dcId) {\n case 1:\n return {\n id: 1,\n ipAddress: 'zws1.web.telegram.org',\n port: 443,\n };\n case 2:\n return {\n id: 2,\n ipAddress: 'zws2.web.telegram.org',\n port: 443,\n };\n case 3:\n return {\n id: 3,\n ipAddress: 'zws3.web.telegram.org',\n port: 443,\n };\n case 4:\n return {\n id: 4,\n ipAddress: 'zws4.web.telegram.org',\n port: 443,\n };\n case 5:\n return {\n id: 5,\n ipAddress: 'zws5.web.telegram.org',\n port: 443,\n };\n default:\n throw new Error(`Cannot find the DC with the ID of ${dcId}`);\n }\n // TODO chose based on current connection method\n /*\n if (!this._config) {\n this._config = await this.invoke(new requests.help.GetConfig())\n }\n if (cdn && !this._cdnConfig) {\n this._cdnConfig = await this.invoke(new requests.help.GetCdnConfig())\n for (const pk of this._cdnConfig.publicKeys) {\n addKey(pk.publicKey)\n }\n }\n for (const DC of this._config.dcOptions) {\n if (DC.id === dcId && Boolean(DC.ipv6) === this._useIPV6 && Boolean(DC.cdn) === cdn) {\n return DC\n }\n } */\n}\n\nmodule.exports = {\n getMessageId,\n // _getEntityPair,\n // getInputMessage,\n // getInputDialog,\n // getInputUser,\n // getInputChannel,\n getInputPeer,\n // parsePhone,\n // parseUsername,\n // getPeer,\n // getPeerId,\n getDisplayName,\n // resolveId,\n // isListLike,\n getAppropriatedPartSize,\n // getInputLocation,\n strippedPhotoToJpg,\n getDC,\n};\n","import { Api as GramJs } from '../../../lib/gramjs';\nimport { ApiSticker, ApiStickerSet } from '../../types';\nimport { MEMOJI_STICKER_ID } from '../../../config';\n\nimport { buildApiThumbnailFromCached, buildApiThumbnailFromPath } from './common';\nimport localDb from '../localDb';\n\nconst ANIMATED_STICKER_MIME_TYPE = 'application/x-tgsticker';\n\nexport function buildStickerFromDocument(document: GramJs.TypeDocument): ApiSticker | undefined {\n if (document instanceof GramJs.DocumentEmpty) {\n return undefined;\n }\n\n const stickerAttribute = document.attributes\n .find((attr: any): attr is GramJs.DocumentAttributeSticker => (\n attr instanceof GramJs.DocumentAttributeSticker\n ));\n\n const fileAttribute = document.mimeType === ANIMATED_STICKER_MIME_TYPE && document.attributes\n .find((attr: any): attr is GramJs.DocumentAttributeFilename => (\n attr instanceof GramJs.DocumentAttributeFilename\n ));\n\n if (!stickerAttribute && !fileAttribute) {\n return undefined;\n }\n\n const sizeAttribute = document.attributes\n .find((attr: any): attr is GramJs.DocumentAttributeImageSize => (\n attr instanceof GramJs.DocumentAttributeImageSize\n ));\n\n const stickerSetInfo = stickerAttribute && stickerAttribute.stickerset instanceof GramJs.InputStickerSetID\n ? stickerAttribute.stickerset\n : undefined;\n const emoji = stickerAttribute ? stickerAttribute.alt : undefined;\n const isAnimated = document.mimeType === ANIMATED_STICKER_MIME_TYPE;\n const cachedThumb = document.thumbs && document.thumbs.find(\n (s): s is GramJs.PhotoCachedSize => s instanceof GramJs.PhotoCachedSize,\n );\n const pathThumb = document.thumbs && document.thumbs.find(\n (s): s is GramJs.PhotoPathSize => s instanceof GramJs.PhotoPathSize,\n );\n const thumbnail = cachedThumb ? (\n buildApiThumbnailFromCached(cachedThumb)\n ) : pathThumb && sizeAttribute ? (\n buildApiThumbnailFromPath(pathThumb, sizeAttribute)\n ) : undefined;\n\n const { w: width, h: height } = cachedThumb as GramJs.PhotoCachedSize || sizeAttribute || {};\n\n return {\n id: String(document.id),\n stickerSetId: stickerSetInfo ? String(stickerSetInfo.id) : MEMOJI_STICKER_ID,\n stickerSetAccessHash: stickerSetInfo && String(stickerSetInfo.accessHash),\n emoji,\n isAnimated,\n width,\n height,\n thumbnail,\n };\n}\n\nexport function buildStickerSet(set: GramJs.StickerSet): ApiStickerSet {\n const {\n archived,\n animated,\n installedDate,\n id,\n accessHash,\n title,\n thumbs,\n count,\n hash,\n } = set;\n\n return {\n archived,\n isAnimated: animated,\n installedDate,\n id: String(id),\n accessHash: String(accessHash),\n title,\n hasThumbnail: Boolean(thumbs && thumbs.length),\n count,\n hash,\n };\n}\n\nexport function buildStickerSetCovered(coveredStickerSet: GramJs.TypeStickerSetCovered): ApiStickerSet {\n const stickerSet = buildStickerSet(coveredStickerSet.set);\n\n const stickerSetCovers = (coveredStickerSet instanceof GramJs.StickerSetMultiCovered)\n ? coveredStickerSet.covers\n : [coveredStickerSet.cover];\n\n stickerSet.covers = [];\n stickerSetCovers.forEach((cover) => {\n if (cover instanceof GramJs.Document) {\n const coverSticker = buildStickerFromDocument(cover);\n if (coverSticker) {\n stickerSet.covers!.push(coverSticker);\n localDb.documents[String(cover.id)] = cover;\n }\n }\n });\n\n return stickerSet;\n}\n","import { Api as GramJs } from '../../../lib/gramjs';\n\nimport { ApiSession, ApiWallpaper } from '../../types';\nimport { ApiPrivacySettings, ApiPrivacyKey, PrivacyVisibility } from '../../../types';\n\nimport { buildApiDocument } from './messages';\nimport { getApiChatIdFromMtpPeer } from './chats';\nimport { pick } from '../../../util/iteratees';\n\nexport function buildApiWallpaper(wallpaper: GramJs.TypeWallPaper): ApiWallpaper | undefined {\n if (wallpaper instanceof GramJs.WallPaperNoFile) {\n // TODO: Plain color wallpapers\n return undefined;\n }\n\n const { slug } = wallpaper;\n\n const document = buildApiDocument(wallpaper.document);\n\n if (!document) {\n return undefined;\n }\n\n return {\n slug,\n document,\n };\n}\n\nexport function buildApiSession(session: GramJs.Authorization): ApiSession {\n return {\n isCurrent: Boolean(session.current),\n isOfficialApp: Boolean(session.officialApp),\n isPasswordPending: Boolean(session.passwordPending),\n hash: String(session.hash),\n ...pick(session, [\n 'deviceModel', 'platform', 'systemVersion', 'appName', 'appVersion', 'dateCreated', 'dateActive',\n 'ip', 'country', 'region',\n ]),\n };\n}\n\nexport function buildPrivacyKey(key: GramJs.TypePrivacyKey): ApiPrivacyKey | undefined {\n switch (key.className) {\n case 'PrivacyKeyPhoneNumber':\n return 'phoneNumber';\n case 'PrivacyKeyStatusTimestamp':\n return 'lastSeen';\n case 'PrivacyKeyProfilePhoto':\n return 'profilePhoto';\n case 'PrivacyKeyForwards':\n return 'forwards';\n case 'PrivacyKeyChatInvite':\n return 'chatInvite';\n }\n\n return undefined;\n}\n\nexport function buildPrivacyRules(rules: GramJs.TypePrivacyRule[]): ApiPrivacySettings {\n let visibility: PrivacyVisibility | undefined;\n let allowUserIds: number[] | undefined;\n let allowChatIds: number[] | undefined;\n let blockUserIds: number[] | undefined;\n let blockChatIds: number[] | undefined;\n\n rules.forEach((rule) => {\n if (rule instanceof GramJs.PrivacyValueAllowAll) {\n visibility = visibility || 'everybody';\n } else if (rule instanceof GramJs.PrivacyValueAllowContacts) {\n visibility = visibility || 'contacts';\n } else if (rule instanceof GramJs.PrivacyValueDisallowContacts) {\n visibility = visibility || 'nonContacts';\n } else if (rule instanceof GramJs.PrivacyValueDisallowAll) {\n visibility = visibility || 'nobody';\n } else if (rule instanceof GramJs.PrivacyValueAllowUsers) {\n allowUserIds = rule.users;\n } else if (rule instanceof GramJs.PrivacyValueDisallowUsers) {\n blockUserIds = rule.users;\n } else if (rule instanceof GramJs.PrivacyValueAllowChatParticipants) {\n allowChatIds = rule.chats.map((id) => -id);\n } else if (rule instanceof GramJs.PrivacyValueDisallowChatParticipants) {\n blockChatIds = rule.chats.map((id) => -id);\n }\n });\n\n if (!visibility) {\n // disallow by default.\n visibility = 'nobody';\n }\n\n return {\n visibility,\n allowUserIds: allowUserIds || [],\n allowChatIds: allowChatIds || [],\n blockUserIds: blockUserIds || [],\n blockChatIds: blockChatIds || [],\n };\n}\n\nexport function buildApiNotifyException(\n notifySettings: GramJs.TypePeerNotifySettings, peer: GramJs.TypePeer, serverTimeOffset: number,\n) {\n const {\n silent, muteUntil, showPreviews, sound,\n } = notifySettings;\n\n return {\n chatId: getApiChatIdFromMtpPeer(peer),\n isMuted: silent || (typeof muteUntil === 'number' && Date.now() + serverTimeOffset * 1000 < muteUntil * 1000),\n ...(sound === '' && { isSilent: true }),\n ...(showPreviews !== undefined && { shouldShowPreviews: Boolean(showPreviews) }),\n };\n}\n","const api = require('./api');\nconst {\n serializeBytes,\n serializeDate,\n} = require('./generationHelpers');\n\nmodule.exports = {\n // TODO Refactor internal usages to always use `api`.\n constructors: api,\n requests: api,\n serializeBytes,\n serializeDate,\n};\n","/**\n * Errors not related to the Telegram API itself\n */\n\n\n/**\n * Occurs when a read operation was cancelled.\n */\nclass ReadCancelledError extends Error {\n constructor() {\n super('The read operation was cancelled.');\n }\n}\n\n/**\n * Occurs when a type is not found, for example,\n * when trying to read a TLObject with an invalid constructor code.\n */\nclass TypeNotFoundError extends Error {\n constructor(invalidConstructorId, remaining) {\n super(`Could not find a matching Constructor ID for the TLObject that was supposed to be\n read with ID ${invalidConstructorId}. Most likely, a TLObject was trying to be read when\n it should not be read. Remaining bytes: ${remaining.length}`);\n if (typeof alert !== 'undefined') {\n // eslint-disable-next-line no-alert\n alert(`Missing MTProto Entity: Please, make sure to add TL definition for ID ${invalidConstructorId}`);\n }\n this.invalidConstructorId = invalidConstructorId;\n this.remaining = remaining;\n }\n}\n\n/**\n * Occurs when using the TCP full mode and the checksum of a received\n * packet doesn't match the expected checksum.\n */\nclass InvalidChecksumError extends Error {\n constructor(checksum, validChecksum) {\n super(`Invalid checksum (${checksum} when ${validChecksum} was expected). This packet should be skipped.`);\n this.checksum = checksum;\n this.validChecksum = validChecksum;\n }\n}\n\n/**\n * Occurs when the buffer is invalid, and may contain an HTTP error code.\n * For instance, 404 means \"forgotten/broken authorization key\", while\n */\nclass InvalidBufferError extends Error {\n constructor(payload) {\n let code;\n if (payload.length === 4) {\n code = -payload.readInt32LE(0);\n super(`Invalid response buffer (HTTP code ${code})`);\n } else {\n super(`Invalid response buffer (too short ${payload})`);\n }\n this.code = code;\n this.payload = payload;\n }\n}\n\n/**\n * Generic security error, mostly used when generating a new AuthKey.\n */\nclass SecurityError extends Error {\n constructor(...args) {\n if (!args.length) {\n args = ['A security check failed.'];\n }\n super(...args);\n }\n}\n\n/**\n * Occurs when there's a hash mismatch between the decrypted CDN file\n * and its expected hash.\n */\nclass CdnFileTamperedError extends SecurityError {\n constructor() {\n super('The CDN file has been altered and its download cancelled.');\n }\n}\n\n/**\n * Occurs when handling a badMessageNotification\n */\nclass BadMessageError extends Error {\n static ErrorMessages = {\n 16:\n 'msg_id too low (most likely, client time is wrong it would be worthwhile to '\n + 'synchronize it using msg_id notifications and re-send the original message '\n + 'with the “correct” msg_id or wrap it in a container with a new msg_id if the '\n + 'original message had waited too long on the client to be transmitted).',\n\n 17:\n 'msg_id too high (similar to the previous case, the client time has to be '\n + 'synchronized, and the message re-sent with the correct msg_id).',\n\n 18:\n 'Incorrect two lower order msg_id bits (the server expects client message msg_id '\n + 'to be divisible by 4).',\n\n 19: 'Container msg_id is the same as msg_id of a previously received message (this must never happen).',\n\n 20:\n 'Message too old, and it cannot be verified whether the server has received a '\n + 'message with this msg_id or not.',\n\n 32:\n 'msg_seqno too low (the server has already received a message with a lower '\n + 'msg_id but with either a higher or an equal and odd seqno).',\n\n 33:\n 'msg_seqno too high (similarly, there is a message with a higher msg_id but with '\n + 'either a lower or an equal and odd seqno).',\n\n 34: 'An even msg_seqno expected (irrelevant message), but odd received.',\n\n 35: 'Odd msg_seqno expected (relevant message), but even received.',\n\n 48:\n 'Incorrect server salt (in this case, the bad_server_salt response is received with '\n + 'the correct salt, and the message is to be re-sent with it).',\n\n 64: 'Invalid container.',\n };\n\n constructor(request, code) {\n let errorMessage = BadMessageError.ErrorMessages[code]\n || `Unknown error code (this should not happen): ${code}.`;\n errorMessage += ` Caused by ${request.className}`;\n super(errorMessage);\n this.message = errorMessage;\n this.code = code;\n }\n}\n\n// TODO : Support multi errors.\n\nmodule.exports = {\n ReadCancelledError,\n TypeNotFoundError,\n InvalidChecksumError,\n InvalidBufferError,\n SecurityError,\n CdnFileTamperedError,\n BadMessageError,\n};\n","const { TypeNotFoundError } = require('../errors/Common');\nconst { coreObjects } = require('../tl/core');\nconst { tlobjects } = require('../tl/AllTLObjects');\nconst { readBigIntFromBuffer } = require('../Helpers');\n\nclass BinaryReader {\n /**\n * Small utility class to read binary data.\n * @param data {Buffer}\n */\n constructor(data) {\n this.stream = data;\n this._last = undefined;\n this.offset = 0;\n }\n\n // region Reading\n\n // \"All numbers are written as little endian.\"\n // https://core.telegram.org/mtproto\n /**\n * Reads a single byte value.\n */\n readByte() {\n return this.read(1)[0];\n }\n\n /**\n * Reads an integer (4 bytes or 32 bits) value.\n * @param signed {Boolean}\n */\n readInt(signed = true) {\n let res;\n if (signed) {\n res = this.stream.readInt32LE(this.offset);\n } else {\n res = this.stream.readUInt32LE(this.offset);\n }\n this.offset += 4;\n return res;\n }\n\n /**\n * Reads a long integer (8 bytes or 64 bits) value.\n * @param signed\n * @returns {BigInteger}\n */\n readLong(signed = true) {\n return this.readLargeInt(64, signed);\n }\n\n /**\n * Reads a real floating point (4 bytes) value.\n * @returns {number}\n */\n readFloat() {\n return this.read(4)\n .readFloatLE(0);\n }\n\n /**\n * Reads a real floating point (8 bytes) value.\n * @returns {BigInteger}\n */\n readDouble() {\n // was this a bug ? it should have been 0) {\n padding = 4 - padding;\n this.read(padding);\n }\n\n return data;\n }\n\n /**\n * Reads a Telegram-encoded string.\n * @returns {string}\n */\n tgReadString() {\n return this.tgReadBytes()\n .toString('utf-8');\n }\n\n /**\n * Reads a Telegram boolean value.\n * @returns {boolean}\n */\n tgReadBool() {\n const value = this.readInt(false);\n if (value === 0x997275b5) {\n // boolTrue\n return true;\n } else if (value === 0xbc799737) {\n // boolFalse\n return false;\n } else {\n throw new Error(`Invalid boolean code ${value.toString('16')}`);\n }\n }\n\n /**\n * Reads and converts Unix time (used by Telegram)\n * into a Javascript {Date} object.\n * @returns {Date}\n */\n tgReadDate() {\n const value = this.readInt();\n return new Date(value * 1000);\n }\n\n /**\n * Reads a Telegram object.\n */\n tgReadObject() {\n const constructorId = this.readInt(false);\n let clazz = tlobjects[constructorId];\n if (clazz === undefined) {\n /**\n * The class was None, but there's still a\n * chance of it being a manually parsed value like bool!\n */\n const value = constructorId;\n if (value === 0x997275b5) {\n // boolTrue\n return true;\n } else if (value === 0xbc799737) {\n // boolFalse\n return false;\n } else if (value === 0x1cb5c415) {\n // Vector\n const temp = [];\n const length = this.readInt();\n for (let i = 0; i < length; i++) {\n temp.push(this.tgReadObject());\n }\n return temp;\n }\n\n clazz = coreObjects[constructorId];\n\n if (clazz === undefined) {\n // If there was still no luck, give up\n this.seek(-4); // Go back\n const pos = this.tellPosition();\n const error = new TypeNotFoundError(constructorId, this.read());\n this.setPosition(pos);\n throw error;\n }\n }\n return clazz.fromReader(this);\n }\n\n /**\n * Reads a vector (a list) of Telegram objects.\n * @returns {[Buffer]}\n */\n tgReadVector() {\n if (this.readInt(false) !== 0x1cb5c415) {\n throw new Error('Invalid constructor code, vector was expected');\n }\n const count = this.readInt();\n const temp = [];\n for (let i = 0; i < count; i++) {\n temp.push(this.tgReadObject());\n }\n return temp;\n }\n\n // endregion\n\n /**\n * Closes the reader.\n */\n close() {\n this.stream = undefined;\n }\n\n // region Position related\n\n /**\n * Tells the current position on the stream.\n * @returns {number}\n */\n tellPosition() {\n return this.offset;\n }\n\n /**\n * Sets the current position on the stream.\n * @param position\n */\n setPosition(position) {\n this.offset = position;\n }\n\n /**\n * Seeks the stream position given an offset from the current position.\n * The offset may be negative.\n * @param offset\n */\n seek(offset) {\n this.offset += offset;\n }\n\n // endregion\n}\n\nmodule.exports = BinaryReader;\n","import BigInt from 'big-integer';\nimport { Api as GramJs } from '../../../lib/gramjs';\n\nimport { ApiBotInlineSwitchPm, ApiChat, ApiUser } from '../../types';\n\nimport localDb from '../localDb';\nimport { invokeRequest } from './client';\nimport { buildInputPeer, calculateResultHash, generateRandomBigInt } from '../gramjsBuilders';\nimport { buildApiUser } from '../apiBuilders/users';\nimport { buildApiBotInlineMediaResult, buildApiBotInlineResult } from '../apiBuilders/bots';\nimport { buildApiChatFromPreview } from '../apiBuilders/chats';\nimport { pick } from '../../../util/iteratees';\n\nexport function init() {\n}\n\nexport function answerCallbackButton(\n {\n chatId, accessHash, messageId, data,\n }: {\n chatId: number; accessHash?: string; messageId: number; data: string;\n },\n) {\n return invokeRequest(new GramJs.messages.GetBotCallbackAnswer({\n peer: buildInputPeer(chatId, accessHash),\n msgId: messageId,\n data: Buffer.from(data),\n }));\n}\n\nexport async function fetchTopInlineBots({ hash = 0 }: { hash?: number }) {\n const topPeers = await invokeRequest(new GramJs.contacts.GetTopPeers({\n hash,\n botsInline: true,\n }));\n\n if (!(topPeers instanceof GramJs.contacts.TopPeers)) {\n return undefined;\n }\n\n const users = topPeers.users.map(buildApiUser).filter(Boolean as any);\n const ids = users.map(({ id }) => id);\n\n return {\n hash: calculateResultHash(ids),\n ids,\n users,\n };\n}\n\nexport async function fetchInlineBot({ username }: { username: string }) {\n const resolvedPeer = await invokeRequest(new GramJs.contacts.ResolveUsername({ username }));\n\n if (\n !resolvedPeer\n || !(\n resolvedPeer.users[0] instanceof GramJs.User\n && resolvedPeer.users[0].bot\n && resolvedPeer.users[0].botInlinePlaceholder\n )\n ) {\n return undefined;\n }\n\n addUserToLocalDb(resolvedPeer.users[0]);\n\n return {\n user: buildApiUser(resolvedPeer.users[0]),\n chat: buildApiChatFromPreview(resolvedPeer.users[0]),\n };\n}\n\nexport async function fetchInlineBotResults({\n bot, chat, query, offset = '',\n}: {\n bot: ApiUser; chat: ApiChat; query: string; offset?: string;\n}) {\n const result = await invokeRequest(new GramJs.messages.GetInlineBotResults({\n bot: buildInputPeer(bot.id, bot.accessHash),\n peer: buildInputPeer(chat.id, chat.accessHash),\n query,\n offset,\n }));\n\n if (!result) {\n return undefined;\n }\n\n result.users.map(addUserToLocalDb);\n\n return {\n isGallery: Boolean(result.gallery),\n help: bot.botPlaceholder,\n nextOffset: getInlineBotResultsNextOffset(bot.username, result.nextOffset),\n switchPm: buildSwitchPm(result.switchPm),\n users: result.users.map(buildApiUser).filter(Boolean as any),\n results: processInlineBotResult(String(result.queryId), result.results),\n };\n}\n\nexport async function sendInlineBotResult({\n chat, resultId, queryId, replyingTo,\n}: {\n chat: ApiChat;\n resultId: string;\n queryId: string;\n replyingTo?: number;\n}) {\n const randomId = generateRandomBigInt();\n\n await invokeRequest(new GramJs.messages.SendInlineBotResult({\n clearDraft: true,\n randomId,\n queryId: BigInt(queryId),\n peer: buildInputPeer(chat.id, chat.accessHash),\n id: resultId,\n ...(replyingTo && { replyToMsgId: replyingTo }),\n }), true);\n}\n\nfunction buildSwitchPm(switchPm?: GramJs.InlineBotSwitchPM) {\n return switchPm ? pick(switchPm, ['text', 'startParam']) as ApiBotInlineSwitchPm : undefined;\n}\n\nfunction processInlineBotResult(queryId: string, results: GramJs.TypeBotInlineResult[]) {\n return results.map((result) => {\n if (result instanceof GramJs.BotInlineMediaResult) {\n if (result.document instanceof GramJs.Document) {\n addDocumentToLocalDb(result.document);\n }\n\n if (result.photo instanceof GramJs.Photo) {\n addPhotoToLocalDb(result.photo);\n }\n\n return buildApiBotInlineMediaResult(result, queryId);\n }\n\n if (result.thumb) {\n addWebDocumentToLocalDb(result.thumb);\n }\n\n return buildApiBotInlineResult(result, queryId);\n });\n}\n\nfunction getInlineBotResultsNextOffset(username: string, nextOffset?: string) {\n return username === 'gif' && nextOffset === '0' ? '' : nextOffset;\n}\n\nfunction addUserToLocalDb(user: GramJs.User) {\n localDb.users[user.id] = user;\n}\n\nfunction addDocumentToLocalDb(document: GramJs.Document) {\n localDb.documents[String(document.id)] = document;\n}\n\nfunction addPhotoToLocalDb(photo: GramJs.Photo) {\n localDb.photos[String(photo.id)] = photo;\n}\n\nfunction addWebDocumentToLocalDb(webDocument: GramJs.TypeWebDocument) {\n localDb.webDocuments[webDocument.url] = webDocument;\n}\n","import { Api as GramJs, connection } from '../../lib/gramjs';\nimport { ApiMessage, ApiUpdateConnectionStateType, OnApiUpdate } from '../types';\n\nimport { pick } from '../../util/iteratees';\nimport {\n buildApiMessage,\n buildApiMessageFromShort,\n buildApiMessageFromShortChat,\n buildMessageMediaContent,\n buildMessageTextContent,\n buildPoll,\n buildPollResults,\n buildApiMessageFromNotification,\n buildMessageDraft,\n} from './apiBuilders/messages';\nimport {\n getApiChatIdFromMtpPeer,\n buildChatMember,\n buildChatMembers,\n buildChatTypingStatus,\n buildAvatarHash,\n buildApiChatFromPreview,\n buildApiChatFolder,\n getApiChatIdFromInputMtpPeer,\n} from './apiBuilders/chats';\nimport { buildApiUser, buildApiUserStatus } from './apiBuilders/users';\nimport {\n buildMessageFromUpdate,\n isMessageWithMedia,\n buildChatPhotoForLocalDb,\n} from './gramjsBuilders';\nimport localDb from './localDb';\nimport { omitVirtualClassFields } from './apiBuilders/helpers';\nimport { DEBUG } from '../../config';\nimport { addMessageToLocalDb, addPhotoToLocalDb, resolveMessageApiChatId } from './helpers';\nimport { buildApiNotifyException, buildPrivacyKey, buildPrivacyRules } from './apiBuilders/misc';\nimport { buildApiPhoto } from './apiBuilders/common';\n\ntype Update = (\n (GramJs.TypeUpdate | GramJs.TypeUpdates) & { _entities?: (GramJs.TypeUser | GramJs.TypeChat)[] }\n) | typeof connection.UpdateConnectionState;\n\nconst DELETE_MISSING_CHANNEL_MESSAGE_DELAY = 1000;\n\nlet onUpdate: OnApiUpdate;\n\nexport function init(_onUpdate: OnApiUpdate) {\n onUpdate = _onUpdate;\n}\n\nconst sentMessageIds = new Set();\nlet serverTimeOffset = 0;\n\nexport function updater(update: Update, originRequest?: GramJs.AnyRequest) {\n if (update instanceof connection.UpdateServerTimeOffset) {\n serverTimeOffset = update.timeOffset;\n } else if (update instanceof connection.UpdateConnectionState) {\n let connectionState: ApiUpdateConnectionStateType;\n\n switch (update.state) {\n case connection.UpdateConnectionState.disconnected:\n connectionState = 'connectionStateConnecting';\n break;\n case connection.UpdateConnectionState.broken:\n connectionState = 'connectionStateBroken';\n break;\n case connection.UpdateConnectionState.connected:\n default:\n connectionState = 'connectionStateReady';\n break;\n }\n\n onUpdate({\n '@type': 'updateConnectionState',\n connectionState,\n });\n\n // Messages\n } else if (\n update instanceof GramJs.UpdateNewMessage\n || update instanceof GramJs.UpdateNewScheduledMessage\n || update instanceof GramJs.UpdateNewChannelMessage\n || update instanceof GramJs.UpdateShortChatMessage\n || update instanceof GramJs.UpdateShortMessage\n || update instanceof GramJs.UpdateServiceNotification\n ) {\n let message: ApiMessage | undefined;\n\n if (update instanceof GramJs.UpdateShortChatMessage) {\n message = buildApiMessageFromShortChat(update);\n } else if (update instanceof GramJs.UpdateShortMessage) {\n message = buildApiMessageFromShort(update);\n } else if (update instanceof GramJs.UpdateServiceNotification) {\n const currentDate = Date.now() / 1000 + serverTimeOffset;\n message = buildApiMessageFromNotification(update, currentDate);\n\n if (isMessageWithMedia(update)) {\n addMessageToLocalDb(buildMessageFromUpdate(message.id, message.chatId, update));\n }\n } else {\n // TODO Remove if proven not reproducing\n if (update.message instanceof GramJs.MessageEmpty) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('Unexpected update:', update.className, update);\n }\n\n return;\n }\n\n if (update.message instanceof GramJs.Message && isMessageWithMedia(update.message)) {\n addMessageToLocalDb(update.message);\n }\n\n message = buildApiMessage(update.message)!;\n }\n\n // eslint-disable-next-line no-underscore-dangle\n const entities = update._entities;\n if (entities && entities.length) {\n entities\n .filter((e) => e instanceof GramJs.User)\n .map(buildApiUser)\n .forEach((user) => {\n if (!user) {\n return;\n }\n\n onUpdate({\n '@type': 'updateUser',\n id: user.id,\n user,\n });\n });\n entities\n .filter((e) => e instanceof GramJs.Chat || e instanceof GramJs.Channel)\n .map((e) => buildApiChatFromPreview(e))\n .forEach((chat) => {\n if (!chat) {\n return;\n }\n\n onUpdate({\n '@type': 'updateChat',\n id: chat.id,\n chat,\n });\n });\n }\n\n if (update instanceof GramJs.UpdateNewScheduledMessage) {\n onUpdate({\n '@type': sentMessageIds.has(message.id) ? 'updateScheduledMessage' : 'newScheduledMessage',\n id: message.id,\n chatId: message.chatId,\n message,\n });\n } else {\n onUpdate({\n '@type': sentMessageIds.has(message.id) ? 'updateMessage' : 'newMessage',\n id: message.id,\n chatId: message.chatId,\n message,\n });\n }\n\n // Some updates to a Chat/Channel don't have a dedicated update class.\n // We can get info on some updates from Service Messages.\n if (update.message instanceof GramJs.MessageService) {\n const { action } = update.message;\n\n if (action instanceof GramJs.MessageActionChatEditTitle) {\n onUpdate({\n '@type': 'updateChat',\n id: message.chatId,\n chat: {\n title: action.title,\n },\n });\n } else if (action instanceof GramJs.MessageActionChatEditPhoto) {\n const photo = buildChatPhotoForLocalDb(action.photo);\n const avatarHash = buildAvatarHash(photo);\n\n const localDbChatId = Math.abs(resolveMessageApiChatId(update.message)!);\n if (localDb.chats[localDbChatId]) {\n localDb.chats[localDbChatId].photo = photo;\n }\n addPhotoToLocalDb(action.photo);\n\n if (avatarHash) {\n onUpdate({\n '@type': 'updateChat',\n id: message.chatId,\n chat: {\n avatarHash,\n },\n ...(action.photo instanceof GramJs.Photo && { newProfilePhoto: buildApiPhoto(action.photo) }),\n });\n }\n } else if (action instanceof GramJs.MessageActionChatDeletePhoto) {\n const localDbChatId = Math.abs(resolveMessageApiChatId(update.message)!);\n if (localDb.chats[localDbChatId]) {\n localDb.chats[localDbChatId].photo = new GramJs.ChatPhotoEmpty();\n }\n\n onUpdate({\n '@type': 'updateChat',\n id: message.chatId,\n chat: { avatarHash: undefined },\n });\n } else if (action instanceof GramJs.MessageActionChatDeleteUser) {\n // eslint-disable-next-line no-underscore-dangle\n if (update._entities && update._entities.some((e): e is GramJs.User => (\n e instanceof GramJs.User && !!e.self && e.id === action.userId\n ))) {\n onUpdate({\n '@type': 'updateChat',\n id: message.chatId,\n chat: {\n isRestricted: true,\n },\n });\n\n onUpdate({\n '@type': 'updateChatLeave',\n id: message.chatId,\n });\n }\n } else if (action instanceof GramJs.MessageActionChatAddUser) {\n // eslint-disable-next-line no-underscore-dangle\n if (update._entities && update._entities.some((e): e is GramJs.User => (\n e instanceof GramJs.User && !!e.self && action.users.includes(e.id)\n ))) {\n onUpdate({\n '@type': 'updateChatJoin',\n id: message.chatId,\n });\n }\n }\n }\n } else if (\n update instanceof GramJs.UpdateEditMessage\n || update instanceof GramJs.UpdateEditChannelMessage\n ) {\n // TODO Remove if proven not reproducing\n if (update.message instanceof GramJs.MessageEmpty) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('Unexpected update:', update.className, update);\n }\n\n return;\n }\n\n if (update.message instanceof GramJs.Message && isMessageWithMedia(update.message)) {\n addMessageToLocalDb(update.message);\n }\n\n const message = buildApiMessage(update.message)!;\n\n onUpdate({\n '@type': 'updateMessage',\n id: message.id,\n chatId: message.chatId,\n message,\n });\n } else if (update instanceof GramJs.UpdateDeleteMessages) {\n onUpdate({\n '@type': 'deleteMessages',\n ids: update.messages,\n });\n } else if (update instanceof GramJs.UpdateDeleteScheduledMessages) {\n onUpdate({\n '@type': 'deleteScheduledMessages',\n ids: update.messages,\n chatId: getApiChatIdFromInputMtpPeer(update.peer),\n });\n } else if (update instanceof GramJs.UpdateDeleteChannelMessages) {\n const chatId = getApiChatIdFromMtpPeer({ channelId: update.channelId } as GramJs.PeerChannel);\n const ids = update.messages;\n const existingIds = ids.filter((id) => localDb.messages[`${chatId}-${id}`]);\n const missingIds = ids.filter((id) => !localDb.messages[`${chatId}-${id}`]);\n const profilePhotoIds = ids.map((id) => {\n const message = localDb.messages[`${chatId}-${id}`];\n\n return message && message instanceof GramJs.MessageService && 'photo' in message.action\n ? String(message.action.photo.id)\n : undefined;\n }).filter(Boolean as any);\n\n if (existingIds.length) {\n onUpdate({\n '@type': 'deleteMessages',\n ids: existingIds,\n chatId,\n });\n }\n\n if (profilePhotoIds.length) {\n onUpdate({\n '@type': 'deleteProfilePhotos',\n ids: profilePhotoIds,\n chatId,\n });\n }\n\n // For some reason delete message update sometimes comes before new message update\n if (missingIds.length) {\n setTimeout(() => {\n onUpdate({\n '@type': 'deleteMessages',\n ids: missingIds,\n chatId,\n });\n }, DELETE_MISSING_CHANNEL_MESSAGE_DELAY);\n }\n } else if ((\n originRequest instanceof GramJs.messages.SendMessage\n || originRequest instanceof GramJs.messages.SendMedia\n || originRequest instanceof GramJs.messages.SendMultiMedia\n || originRequest instanceof GramJs.messages.ForwardMessages\n ) && (\n update instanceof GramJs.UpdateMessageID\n || update instanceof GramJs.UpdateShortSentMessage\n )) {\n let randomId;\n if ('randomId' in update) {\n randomId = update.randomId;\n } else if ('randomId' in originRequest) {\n randomId = originRequest.randomId;\n }\n\n const localMessage = randomId && localDb.localMessages[randomId.toString()];\n if (!localMessage) {\n throw new Error('Local message not found');\n }\n\n let newContent: ApiMessage['content'] | undefined;\n if (update instanceof GramJs.UpdateShortSentMessage) {\n if (localMessage.content.text && update.entities) {\n newContent = {\n text: buildMessageTextContent(localMessage.content.text.text, update.entities),\n };\n }\n if (update.media) {\n newContent = {\n ...newContent,\n ...buildMessageMediaContent(update.media),\n };\n }\n\n const mtpMessage = buildMessageFromUpdate(update.id, localMessage.chatId, update);\n if (isMessageWithMedia(mtpMessage)) {\n addMessageToLocalDb(mtpMessage);\n }\n }\n\n sentMessageIds.add(update.id);\n\n // Edge case for \"Send When Online\"\n const isAlreadySent = 'date' in update && update.date * 1000 < Date.now() + serverTimeOffset * 1000;\n\n onUpdate({\n '@type': localMessage.isScheduled && !isAlreadySent\n ? 'updateScheduledMessageSendSucceeded'\n : 'updateMessageSendSucceeded',\n chatId: localMessage.chatId,\n localId: localMessage.id,\n message: {\n ...localMessage,\n ...(newContent && {\n content: {\n ...localMessage.content,\n ...newContent,\n },\n }),\n id: update.id,\n sendingState: undefined,\n ...('date' in update && { date: update.date }),\n },\n });\n } else if (update instanceof GramJs.UpdateReadMessagesContents) {\n onUpdate({\n '@type': 'updateCommonBoxMessages',\n ids: update.messages,\n messageUpdate: {\n hasUnreadMention: false,\n isMediaUnread: false,\n },\n });\n } else if (update instanceof GramJs.UpdateChannelReadMessagesContents) {\n onUpdate({\n '@type': 'updateChannelMessages',\n channelId: update.channelId,\n ids: update.messages,\n messageUpdate: {\n hasUnreadMention: false,\n isMediaUnread: false,\n },\n });\n } else if (update instanceof GramJs.UpdateMessagePoll) {\n const { pollId, poll, results } = update;\n if (poll) {\n const apiPoll = buildPoll(poll, results);\n\n onUpdate({\n '@type': 'updateMessagePoll',\n pollId: pollId.toString(),\n pollUpdate: apiPoll,\n });\n } else {\n const pollResults = buildPollResults(results);\n onUpdate({\n '@type': 'updateMessagePoll',\n pollId: pollId.toString(),\n pollUpdate: { results: pollResults },\n });\n }\n } else if (update instanceof GramJs.UpdateMessagePollVote) {\n onUpdate({\n '@type': 'updateMessagePollVote',\n pollId: update.pollId.toString(),\n userId: update.userId,\n options: update.options.map((option) => String.fromCharCode(...option)),\n });\n } else if (update instanceof GramJs.UpdateChannelMessageViews) {\n onUpdate({\n '@type': 'updateMessage',\n chatId: getApiChatIdFromMtpPeer({ channelId: update.channelId } as GramJs.PeerChannel),\n id: update.id,\n message: { views: update.views },\n });\n\n // Chats\n } else if (update instanceof GramJs.UpdateReadHistoryInbox) {\n onUpdate({\n '@type': 'updateChatInbox',\n id: getApiChatIdFromMtpPeer(update.peer),\n chat: {\n lastReadInboxMessageId: update.maxId,\n unreadCount: update.stillUnreadCount,\n },\n });\n } else if (update instanceof GramJs.UpdateReadHistoryOutbox) {\n onUpdate({\n '@type': 'updateChat',\n id: getApiChatIdFromMtpPeer(update.peer),\n chat: {\n lastReadOutboxMessageId: update.maxId,\n },\n });\n } else if (update instanceof GramJs.UpdateReadChannelInbox) {\n onUpdate({\n '@type': 'updateChat',\n id: getApiChatIdFromMtpPeer({ channelId: update.channelId } as GramJs.PeerChannel),\n chat: {\n lastReadInboxMessageId: update.maxId,\n unreadCount: update.stillUnreadCount,\n },\n });\n } else if (update instanceof GramJs.UpdateReadChannelOutbox) {\n onUpdate({\n '@type': 'updateChat',\n id: getApiChatIdFromMtpPeer({ channelId: update.channelId } as GramJs.PeerChannel),\n chat: {\n lastReadOutboxMessageId: update.maxId,\n },\n });\n } else if (\n update instanceof GramJs.UpdateDialogPinned\n && update.peer instanceof GramJs.DialogPeer\n ) {\n onUpdate({\n '@type': 'updateChatPinned',\n id: getApiChatIdFromMtpPeer(update.peer.peer),\n isPinned: update.pinned || false,\n });\n } else if (update instanceof GramJs.UpdatePinnedDialogs) {\n const ids = update.order\n ? update.order\n .filter((dp): dp is GramJs.DialogPeer => dp instanceof GramJs.DialogPeer)\n .map((dp) => getApiChatIdFromMtpPeer(dp.peer))\n : [];\n\n onUpdate({\n '@type': 'updatePinnedChatIds',\n ids,\n folderId: update.folderId || undefined,\n });\n } else if (update instanceof GramJs.UpdateFolderPeers) {\n update.folderPeers.forEach((folderPeer) => {\n const { folderId, peer } = folderPeer;\n\n onUpdate({\n '@type': 'updateChatListType',\n id: getApiChatIdFromMtpPeer(peer),\n folderId,\n });\n });\n } else if (update instanceof GramJs.UpdateDialogFilter) {\n const { id, filter } = update;\n const folder = filter ? buildApiChatFolder(filter) : undefined;\n\n onUpdate({\n '@type': 'updateChatFolder',\n id,\n folder,\n });\n } else if (update instanceof GramJs.UpdateDialogFilterOrder) {\n onUpdate({\n '@type': 'updateChatFoldersOrder',\n orderedIds: update.order,\n });\n } else if (update instanceof GramJs.UpdateChatParticipants) {\n const replacedMembers = buildChatMembers(update.participants);\n\n onUpdate({\n '@type': 'updateChatMembers',\n id: getApiChatIdFromMtpPeer({ chatId: update.participants.chatId } as GramJs.TypePeer),\n replacedMembers,\n });\n } else if (update instanceof GramJs.UpdateChatParticipantAdd) {\n const addedMember = buildChatMember(\n pick(update, ['userId', 'inviterId', 'date']) as GramJs.ChatParticipant,\n );\n\n onUpdate({\n '@type': 'updateChatMembers',\n id: getApiChatIdFromMtpPeer({ chatId: update.chatId } as GramJs.PeerChat),\n addedMember,\n });\n } else if (update instanceof GramJs.UpdateChatParticipantDelete) {\n const { userId: deletedMemberId } = update;\n\n onUpdate({\n '@type': 'updateChatMembers',\n id: getApiChatIdFromMtpPeer({ chatId: update.chatId } as GramJs.PeerChat),\n deletedMemberId,\n });\n } else if (\n update instanceof GramJs.UpdatePinnedMessages\n || update instanceof GramJs.UpdatePinnedChannelMessages\n ) {\n const peer = update instanceof GramJs.UpdatePinnedMessages\n ? update.peer\n : { channelId: update.channelId } as GramJs.PeerChannel;\n const chatId = getApiChatIdFromMtpPeer(peer);\n\n onUpdate({\n '@type': 'updatePinnedIds',\n chatId,\n messageIds: update.messages,\n isPinned: update.pinned,\n });\n } else if (\n update instanceof GramJs.UpdateNotifySettings\n && update.peer instanceof GramJs.NotifyPeer\n ) {\n onUpdate({\n '@type': 'updateNotifyExceptions',\n ...buildApiNotifyException(update.notifySettings, update.peer.peer, serverTimeOffset),\n });\n } else if (\n update instanceof GramJs.UpdateUserTyping\n || update instanceof GramJs.UpdateChatUserTyping\n ) {\n const id = update instanceof GramJs.UpdateUserTyping\n ? update.userId\n : getApiChatIdFromMtpPeer({ chatId: update.chatId } as GramJs.PeerChat);\n\n onUpdate({\n '@type': 'updateChatTypingStatus',\n id,\n typingStatus: buildChatTypingStatus(update, serverTimeOffset),\n });\n } else if (update instanceof GramJs.UpdateChannelUserTyping) {\n const id = getApiChatIdFromMtpPeer({ channelId: update.channelId } as GramJs.PeerChannel);\n\n onUpdate({\n '@type': 'updateChatTypingStatus',\n id,\n typingStatus: buildChatTypingStatus(update, serverTimeOffset),\n });\n } else if (update instanceof GramJs.UpdateChannel) {\n const { _entities } = update;\n if (!_entities) {\n return;\n }\n\n const channel = _entities.find((e): e is GramJs.Channel | GramJs.ChannelForbidden => (\n e instanceof GramJs.Channel || e instanceof GramJs.ChannelForbidden\n ));\n\n if (channel instanceof GramJs.Channel) {\n const chat = buildApiChatFromPreview(channel);\n if (chat) {\n onUpdate({\n '@type': 'updateChat',\n id: chat.id,\n chat,\n });\n\n onUpdate({\n '@type': chat.isNotJoined ? 'updateChatLeave' : 'updateChatJoin',\n id: getApiChatIdFromMtpPeer({ channelId: update.channelId } as GramJs.PeerChannel),\n });\n }\n } else if (channel instanceof GramJs.ChannelForbidden) {\n const chatId = getApiChatIdFromMtpPeer({ channelId: update.channelId } as GramJs.PeerChannel);\n\n onUpdate({\n '@type': 'updateChat',\n id: chatId,\n chat: {\n isRestricted: true,\n },\n });\n\n onUpdate({\n '@type': 'updateChatLeave',\n id: chatId,\n });\n } else if (_entities.length === 0) {\n // The link to the discussion group may have been changed.\n // No corresponding update available at this moment https://core.telegram.org/type/Updates\n onUpdate({\n '@type': 'resetMessages',\n id: getApiChatIdFromMtpPeer({ chatId: update.channelId } as GramJs.PeerChat),\n });\n }\n } else if (\n update instanceof GramJs.UpdateDialogUnreadMark\n && update.peer instanceof GramJs.DialogPeer\n ) {\n onUpdate({\n '@type': 'updateChat',\n id: getApiChatIdFromMtpPeer(update.peer.peer),\n chat: {\n hasUnreadMark: update.unread,\n },\n });\n } else if (update instanceof GramJs.UpdateChatDefaultBannedRights) {\n onUpdate({\n '@type': 'updateChat',\n id: getApiChatIdFromMtpPeer(update.peer),\n chat: {\n defaultBannedRights: omitVirtualClassFields(update.defaultBannedRights),\n },\n });\n\n // Users\n } else if (update instanceof GramJs.UpdateUserStatus) {\n const { userId, status } = update;\n\n onUpdate({\n '@type': 'updateUserStatus',\n userId,\n status: buildApiUserStatus(status),\n });\n } else if (update instanceof GramJs.UpdateUserName) {\n const updatedUser = localDb.users[update.userId];\n const user = updatedUser && updatedUser.mutualContact && !updatedUser.self\n ? pick(update, ['username'])\n : pick(update, ['firstName', 'lastName', 'username']);\n\n onUpdate({\n '@type': 'updateUser',\n id: update.userId,\n user,\n });\n } else if (update instanceof GramJs.UpdateUserPhoto) {\n const { userId, photo } = update;\n const avatarHash = buildAvatarHash(photo);\n\n if (localDb.users[userId]) {\n localDb.users[userId].photo = photo;\n }\n\n onUpdate({\n '@type': 'updateUser',\n id: userId,\n user: { avatarHash },\n });\n } else if (update instanceof GramJs.UpdateUserPhone) {\n const { userId, phone } = update;\n\n onUpdate({\n '@type': 'updateUser',\n id: userId,\n user: { phoneNumber: phone },\n });\n } else if (update instanceof GramJs.UpdatePeerSettings) {\n const { _entities } = update;\n if (!_entities) {\n return;\n }\n\n if (_entities && _entities.length) {\n _entities\n .filter((e) => e instanceof GramJs.User && !e.contact)\n .forEach((user) => {\n onUpdate({\n '@type': 'deleteUser',\n id: user.id,\n });\n });\n\n _entities\n .filter((e) => e instanceof GramJs.User && e.contact)\n .map(buildApiUser)\n .forEach((user) => {\n if (!user) {\n return;\n }\n\n onUpdate({\n '@type': 'updateUser',\n id: user.id,\n user,\n });\n });\n }\n\n // Settings\n } else if (update instanceof GramJs.UpdateNotifySettings) {\n const {\n notifySettings: {\n showPreviews, silent, muteUntil,\n },\n peer: { className },\n } = update;\n\n const peerType = className === 'NotifyUsers'\n ? 'contact'\n : (className === 'NotifyChats'\n ? 'group'\n : (className === 'NotifyBroadcasts'\n ? 'broadcast'\n : undefined\n )\n );\n\n if (!peerType) {\n return;\n }\n\n onUpdate({\n '@type': 'updateNotifySettings',\n peerType,\n isSilent: Boolean(silent\n || (typeof muteUntil === 'number' && Date.now() + serverTimeOffset * 1000 < muteUntil * 1000)),\n shouldShowPreviews: Boolean(showPreviews),\n });\n } else if (update instanceof GramJs.UpdatePeerBlocked) {\n onUpdate({\n '@type': 'updatePeerBlocked',\n id: getApiChatIdFromMtpPeer(update.peerId),\n isBlocked: update.blocked,\n });\n } else if (update instanceof GramJs.UpdatePrivacy) {\n const key = buildPrivacyKey(update.key);\n if (key) {\n onUpdate({\n '@type': 'updatePrivacy',\n key,\n rules: buildPrivacyRules(update.rules),\n });\n }\n\n // Misc\n } else if (update instanceof GramJs.UpdateDraftMessage) {\n onUpdate({\n '@type': 'draftMessage',\n chatId: getApiChatIdFromMtpPeer(update.peer),\n ...buildMessageDraft(update.draft),\n });\n } else if (update instanceof GramJs.UpdateContactsReset) {\n onUpdate({ '@type': 'updateResetContactList' });\n } else if (update instanceof GramJs.UpdateFavedStickers) {\n onUpdate({ '@type': 'updateFavoriteStickers' });\n } else if (DEBUG) {\n const params = typeof update === 'object' && 'className' in update ? update.className : update;\n // eslint-disable-next-line no-console\n console.warn('[GramJs/updater] Unexpected update:', params);\n }\n}\n","const Session = require('./Abstract');\n\nclass MemorySession extends Session {\n constructor() {\n super();\n\n this._serverAddress = undefined;\n this._dcId = 0;\n this._port = undefined;\n this._takeoutId = undefined;\n\n this._entities = new Set();\n this._updateStates = {};\n }\n\n get dcId() {\n return this._dcId;\n }\n\n get serverAddress() {\n return this._serverAddress;\n }\n\n get port() {\n return this._port;\n }\n\n get authKey() {\n return this._authKey;\n }\n\n set authKey(value) {\n this._authKey = value;\n }\n\n setDC(dcId, serverAddress, port) {\n this._dcId = dcId | 0;\n this._serverAddress = serverAddress;\n this._port = port;\n }\n\n /* CONTEST\n get takeoutId() {\n return this._takeoutId\n }\n\n set takeoutId(value) {\n this._takeoutId = value\n }\n\n\n getUpdateState(entityId) {\n return this._updateStates[entityId]\n }\n\n setUpdateState(entityId, state) {\n return this._updateStates[entityId] = state\n }\n\n close() {\n }\n\n save() {\n }\n\n async load() {\n\n }\n\n delete() {\n }\n\n _entityValuesToRow(id, hash, username, phone, name) {\n // While this is a simple implementation it might be overrode by,\n // other classes so they don't need to implement the plural form\n // of the method. Don't remove.\n return [id, hash, username, phone, name]\n }\n\n _entityToRow(e) {\n if (!(e.classType === \"constructor\")) {\n return\n }\n let p\n let markedId\n try {\n p = utils.getInputPeer(e, false)\n markedId = utils.getPeerId(p)\n } catch (e) {\n // Note: `get_input_peer` already checks for non-zero `accessHash`.\n // See issues #354 and #392. It also checks that the entity\n // is not `min`, because its `accessHash` cannot be used\n // anywhere (since layer 102, there are two access hashes).\n return\n }\n let pHash\n if (p instanceof types.InputPeerUser || p instanceof types.InputPeerChannel) {\n pHash = p.accessHash\n } else if (p instanceof types.InputPeerChat) {\n pHash = 0\n } else {\n return\n }\n\n let username = e.username\n if (username) {\n username = username.toLowerCase()\n }\n const phone = e.phone\n const name = utils.getDisplayName(e)\n return this._entityValuesToRow(markedId, pHash, username, phone, name)\n }\n\n _entitiesToRows(tlo) {\n let entities = []\n if (tlo.classType === \"constructor\" && utils.isListLike(tlo)) {\n // This may be a list of users already for instance\n entities = tlo\n } else {\n if (tlo instanceof Object) {\n if ('user' in tlo) {\n entities.push(tlo.user)\n }\n if ('chats' in tlo && utils.isListLike(tlo.chats)) {\n entities.concat(tlo.chats)\n }\n if ('users' in tlo && utils.isListLike(tlo.users)) {\n entities.concat(tlo.users)\n }\n }\n }\n const rows = [] // Rows to add (id, hash, username, phone, name)\n for (const e of entities) {\n const row = this._entityToRow(e)\n if (row) {\n rows.push(row)\n }\n }\n return rows\n }\n\n processEntities(tlo) {\n const entitiesSet = this._entitiesToRows(tlo)\n for (const e of entitiesSet) {\n this._entities.add(e)\n }\n }\n\n getEntityRowsByPhone(phone) {\n for (const e of this._entities) { // id, hash, username, phone, name\n if (e[3] === phone) {\n return [e[0], e[1]]\n }\n }\n }\n\n getEntityRowsByUsername(username) {\n for (const e of this._entities) { // id, hash, username, phone, name\n if (e[2] === username) {\n return [e[0], e[1]]\n }\n }\n }\n\n getEntityRowsByName(name) {\n for (const e of this._entities) { // id, hash, username, phone, name\n if (e[4] === name) {\n return [e[0], e[1]]\n }\n }\n }\n\n getEntityRowsById(id, exact = true) {\n if (exact) {\n for (const e of this._entities) { // id, hash, username, phone, name\n if (e[0] === id) {\n return [e[0], e[1]]\n }\n }\n } else {\n const ids = [utils.getPeerId(new types.PeerUser({ userId: id })),\n utils.getPeerId(new types.PeerChat({ chatId: id })),\n utils.getPeerId(new types.PeerChannel({ channelId: id })),\n ]\n for (const e of this._entities) { // id, hash, username, phone, name\n if (ids.includes(e[0])) {\n return [e[0], e[1]]\n }\n }\n }\n }\n\n getInputEntity(key) {\n let exact\n if (key.SUBCLASS_OF_ID !== undefined) {\n if ([0xc91c90b6, 0xe669bf46, 0x40f202fd].includes(key.SUBCLASS_OF_ID)) {\n // hex(crc32(b'InputPeer', b'InputUser' and b'InputChannel'))\n // We already have an Input version, so nothing else required\n return key\n }\n // Try to early return if this key can be casted as input peer\n return utils.getInputPeer(key)\n } else {\n // Not a TLObject or can't be cast into InputPeer\n if (key.classType === 'constructor') {\n key = utils.getPeerId(key)\n exact = true\n } else {\n exact = !(typeof key == 'number') || key < 0\n }\n }\n let result = null\n if (typeof key === 'string') {\n const phone = utils.parsePhone(key)\n if (phone) {\n result = this.getEntityRowsByPhone(phone)\n } else {\n const { username, isInvite } = utils.parseUsername(key)\n if (username && !isInvite) {\n result = this.getEntityRowsByUsername(username)\n } else {\n const tup = utils.resolveInviteLink(key)[1]\n if (tup) {\n result = this.getEntityRowsById(tup, false)\n }\n }\n }\n } else if (typeof key === 'number') {\n result = this.getEntityRowsById(key, exact)\n }\n if (!result && typeof key === 'string') {\n result = this.getEntityRowsByName(key)\n }\n\n if (result) {\n let entityId = result[0] // unpack resulting tuple\n const entityHash = result[1]\n const resolved = utils.resolveId(entityId)\n entityId = resolved[0]\n const kind = resolved[1]\n // removes the mark and returns type of entity\n if (kind === types.PeerUser) {\n return new types.InputPeerUser({ userId: entityId, accessHash: entityHash })\n } else if (kind === types.PeerChat) {\n return new types.InputPeerChat({ chatId: entityId })\n } else if (kind === types.PeerChannel) {\n return new types.InputPeerChannel({ channelId: entityId, accessHash: entityHash })\n }\n } else {\n throw new Error('Could not find input entity with key ' + key)\n }\n } */\n}\n\nmodule.exports = MemorySession;\n","const {\n sha1,\n toSignedLittleBuffer,\n readBufferFromBigInt,\n readBigIntFromBuffer,\n} = require('../Helpers');\nconst BinaryReader = require('../extensions/BinaryReader');\nconst { sleep } = require('../Helpers');\n\nclass AuthKey {\n constructor(value, hash) {\n if (!hash || !value) {\n return;\n }\n this._key = value;\n this._hash = hash;\n const reader = new BinaryReader(hash);\n this.auxHash = reader.readLong(false);\n reader.read(4);\n this.keyId = reader.readLong(false);\n }\n\n async setKey(value) {\n if (!value) {\n this._key = undefined;\n this.auxHash = undefined;\n this.keyId = undefined;\n this._hash = undefined;\n return;\n }\n if (value instanceof AuthKey) {\n this._key = value._key;\n this.auxHash = value.auxHash;\n this.keyId = value.keyId;\n this._hash = value._hash;\n return;\n }\n this._key = value;\n this._hash = await sha1(this._key);\n const reader = new BinaryReader(this._hash);\n this.auxHash = reader.readLong(false);\n reader.read(4);\n this.keyId = reader.readLong(false);\n }\n\n async waitForKey() {\n while (!this.keyId) {\n await sleep(20);\n }\n }\n\n getKey() {\n return this._key;\n }\n\n // TODO : This doesn't really fit here, it's only used in authentication\n\n /**\n * Calculates the new nonce hash based on the current class fields' values\n * @param newNonce\n * @param number\n * @returns {bigint}\n */\n async calcNewNonceHash(newNonce, number) {\n newNonce = toSignedLittleBuffer(newNonce, 32);\n const n = Buffer.alloc(1);\n n.writeUInt8(number, 0);\n const data = Buffer.concat([newNonce,\n Buffer.concat([n, readBufferFromBigInt(this.auxHash, 8, true)])]);\n\n // Calculates the message key from the given data\n const shaData = (await sha1(data)).slice(4, 20);\n return readBigIntFromBuffer(shaData, true, true);\n }\n\n equals(other) {\n return other instanceof this.constructor && this._key && other.getKey() && other.getKey()\n .equals(this._key);\n }\n}\n\nmodule.exports = AuthKey;\n","type Scheduler =\n typeof requestAnimationFrame\n | typeof onTickEnd\n | typeof runNow;\n\nexport function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true,\n) {\n let waitingTimeout: number | undefined;\n\n return (...args: Parameters) => {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = undefined;\n } else if (shouldRunFirst) {\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\n // @ts-ignore\n fn(...args);\n }\n\n waitingTimeout = undefined;\n }, ms);\n };\n}\n\nexport function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n) {\n let interval: number | undefined;\n let isPending: boolean;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n interval = self.setInterval(() => {\n if (!isPending) {\n // eslint-disable-next-line no-restricted-globals\n self.clearInterval(interval!);\n interval = undefined;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n\nexport function throttleWithPrimaryRaf(fn: F) {\n return throttleWith(fastPrimaryRaf, fn);\n}\n\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function throttleWith(schedulerFn: Scheduler, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nexport function onIdle(cb: NoneToVoidFunction) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb);\n } else {\n onTickEnd(cb);\n }\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n}\n\nexport const pause = (ms: number) => new Promise((resolve) => {\n setTimeout(() => resolve(), ms);\n});\n\nexport function rafPromise() {\n return new Promise((resolve) => {\n fastRaf(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nlet fastRafPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\n// May result in an immediate execution if called from another `requestAnimationFrame` callback\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = isPrimary ? [] : [callback];\n fastRafPrimaryCallbacks = isPrimary ? [callback] : [];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n const currentPrimaryCallbacks = fastRafPrimaryCallbacks!;\n fastRafCallbacks = undefined;\n fastRafPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafPrimaryCallbacks!.push(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastPrimaryRaf(callback: NoneToVoidFunction) {\n fastRaf(callback, true);\n}\n\nlet beforeUnloadCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onBeforeUnload(callback: NoneToVoidFunction, isLast = false) {\n if (!beforeUnloadCallbacks) {\n beforeUnloadCallbacks = [];\n // eslint-disable-next-line no-restricted-globals\n self.addEventListener('beforeunload', () => {\n beforeUnloadCallbacks!.forEach((cb) => cb());\n });\n }\n\n if (isLast) {\n beforeUnloadCallbacks.push(callback);\n } else {\n beforeUnloadCallbacks.unshift(callback);\n }\n\n return () => {\n beforeUnloadCallbacks = beforeUnloadCallbacks!.filter((cb) => cb !== callback);\n };\n}\n","const BigInt = require('big-integer');\nconst { constructors } = require('./tl');\nconst {\n readBigIntFromBuffer,\n readBufferFromBigInt,\n sha256,\n bigIntMod,\n modExp,\n generateRandomBytes,\n} = require('./Helpers');\nconst crypto = require('./crypto/crypto');\n\nconst SIZE_FOR_HASH = 256;\n\n/**\n *\n *\n * @param prime{BigInteger}\n * @param g{BigInteger}\n */\n\n/*\nWe don't support changing passwords yet\nfunction checkPrimeAndGoodCheck(prime, g) {\n console.error('Unsupported function `checkPrimeAndGoodCheck` call. Arguments:', prime, g)\n\n const goodPrimeBitsCount = 2048\n if (prime < 0 || prime.bitLength() !== goodPrimeBitsCount) {\n throw new Error(`bad prime count ${prime.bitLength()},expected ${goodPrimeBitsCount}`)\n }\n // TODO this is kinda slow\n if (Factorizator.factorize(prime)[0] !== 1) {\n throw new Error('give \"prime\" is not prime')\n }\n if (g.eq(BigInt(2))) {\n if ((prime.remainder(BigInt(8))).neq(BigInt(7))) {\n throw new Error(`bad g ${g}, mod8 ${prime % 8}`)\n }\n } else if (g.eq(BigInt(3))) {\n if ((prime.remainder(BigInt(3))).neq(BigInt(2))) {\n throw new Error(`bad g ${g}, mod3 ${prime % 3}`)\n }\n // eslint-disable-next-line no-empty\n } else if (g.eq(BigInt(4))) {\n\n } else if (g.eq(BigInt(5))) {\n if (!([ BigInt(1), BigInt(4) ].includes(prime.remainder(BigInt(5))))) {\n throw new Error(`bad g ${g}, mod8 ${prime % 5}`)\n }\n } else if (g.eq(BigInt(6))) {\n if (!([ BigInt(19), BigInt(23) ].includes(prime.remainder(BigInt(24))))) {\n throw new Error(`bad g ${g}, mod8 ${prime % 24}`)\n }\n } else if (g.eq(BigInt(7))) {\n if (!([ BigInt(3), BigInt(5), BigInt(6) ].includes(prime.remainder(BigInt(7))))) {\n throw new Error(`bad g ${g}, mod8 ${prime % 7}`)\n }\n } else {\n throw new Error(`bad g ${g}`)\n }\n const primeSub1Div2 = (prime.subtract(BigInt(1))).divide(BigInt(2))\n if (Factorizator.factorize(primeSub1Div2)[0] !== 1) {\n throw new Error('(prime - 1) // 2 is not prime')\n }\n}\n*/\n/**\n *\n * @param primeBytes{Buffer}\n * @param g{number}\n */\nfunction checkPrimeAndGood(primeBytes, g) {\n const goodPrime = Buffer.from([\n 0xC7, 0x1C, 0xAE, 0xB9, 0xC6, 0xB1, 0xC9, 0x04, 0x8E, 0x6C, 0x52, 0x2F, 0x70, 0xF1, 0x3F, 0x73,\n 0x98, 0x0D, 0x40, 0x23, 0x8E, 0x3E, 0x21, 0xC1, 0x49, 0x34, 0xD0, 0x37, 0x56, 0x3D, 0x93, 0x0F,\n 0x48, 0x19, 0x8A, 0x0A, 0xA7, 0xC1, 0x40, 0x58, 0x22, 0x94, 0x93, 0xD2, 0x25, 0x30, 0xF4, 0xDB,\n 0xFA, 0x33, 0x6F, 0x6E, 0x0A, 0xC9, 0x25, 0x13, 0x95, 0x43, 0xAE, 0xD4, 0x4C, 0xCE, 0x7C, 0x37,\n 0x20, 0xFD, 0x51, 0xF6, 0x94, 0x58, 0x70, 0x5A, 0xC6, 0x8C, 0xD4, 0xFE, 0x6B, 0x6B, 0x13, 0xAB,\n 0xDC, 0x97, 0x46, 0x51, 0x29, 0x69, 0x32, 0x84, 0x54, 0xF1, 0x8F, 0xAF, 0x8C, 0x59, 0x5F, 0x64,\n 0x24, 0x77, 0xFE, 0x96, 0xBB, 0x2A, 0x94, 0x1D, 0x5B, 0xCD, 0x1D, 0x4A, 0xC8, 0xCC, 0x49, 0x88,\n 0x07, 0x08, 0xFA, 0x9B, 0x37, 0x8E, 0x3C, 0x4F, 0x3A, 0x90, 0x60, 0xBE, 0xE6, 0x7C, 0xF9, 0xA4,\n 0xA4, 0xA6, 0x95, 0x81, 0x10, 0x51, 0x90, 0x7E, 0x16, 0x27, 0x53, 0xB5, 0x6B, 0x0F, 0x6B, 0x41,\n 0x0D, 0xBA, 0x74, 0xD8, 0xA8, 0x4B, 0x2A, 0x14, 0xB3, 0x14, 0x4E, 0x0E, 0xF1, 0x28, 0x47, 0x54,\n 0xFD, 0x17, 0xED, 0x95, 0x0D, 0x59, 0x65, 0xB4, 0xB9, 0xDD, 0x46, 0x58, 0x2D, 0xB1, 0x17, 0x8D,\n 0x16, 0x9C, 0x6B, 0xC4, 0x65, 0xB0, 0xD6, 0xFF, 0x9C, 0xA3, 0x92, 0x8F, 0xEF, 0x5B, 0x9A, 0xE4,\n 0xE4, 0x18, 0xFC, 0x15, 0xE8, 0x3E, 0xBE, 0xA0, 0xF8, 0x7F, 0xA9, 0xFF, 0x5E, 0xED, 0x70, 0x05,\n 0x0D, 0xED, 0x28, 0x49, 0xF4, 0x7B, 0xF9, 0x59, 0xD9, 0x56, 0x85, 0x0C, 0xE9, 0x29, 0x85, 0x1F,\n 0x0D, 0x81, 0x15, 0xF6, 0x35, 0xB1, 0x05, 0xEE, 0x2E, 0x4E, 0x15, 0xD0, 0x4B, 0x24, 0x54, 0xBF,\n 0x6F, 0x4F, 0xAD, 0xF0, 0x34, 0xB1, 0x04, 0x03, 0x11, 0x9C, 0xD8, 0xE3, 0xB9, 0x2F, 0xCC, 0x5B,\n ]);\n if (goodPrime.equals(primeBytes)) {\n if ([3, 4, 5, 7].includes(g)) {\n return; // It's good\n }\n }\n throw new Error('Changing passwords unsupported');\n // checkPrimeAndGoodCheck(readBigIntFromBuffer(primeBytes, false), g)\n}\n\n/**\n *\n * @param number{BigInteger}\n * @param p{BigInteger}\n * @returns {boolean}\n */\nfunction isGoodLarge(number, p) {\n return (number.greater(BigInt(0)) && (p.subtract(number)\n .greater(BigInt(0))));\n}\n\n/**\n *\n * @param number {Buffer}\n * @returns {Buffer}\n */\nfunction numBytesForHash(number) {\n return Buffer.concat([Buffer.alloc(SIZE_FOR_HASH - number.length), number]);\n}\n\n/**\n *\n * @param g {Buffer}\n * @returns {Buffer}\n */\nfunction bigNumForHash(g) {\n return readBufferFromBigInt(g, SIZE_FOR_HASH, false);\n}\n\n/**\n *\n * @param modexp {BigInteger}\n * @param prime {BigInteger}\n * @returns {Boolean}\n */\nfunction isGoodModExpFirst(modexp, prime) {\n const diff = prime.subtract(modexp);\n\n const minDiffBitsCount = 2048 - 64;\n const maxModExpSize = 256;\n\n return !(diff.lesser(BigInt(0)) || diff.bitLength() < minDiffBitsCount\n || modexp.bitLength() < minDiffBitsCount\n || Math.floor((modexp.bitLength() + 7) / 8) > maxModExpSize);\n}\n\nfunction xor(a, b) {\n const length = Math.min(a.length, b.length);\n\n for (let i = 0; i < length; i++) {\n a[i] ^= b[i];\n }\n\n return a;\n}\n\n/**\n *\n * @param password{Buffer}\n * @param salt{Buffer}\n * @param iterations{number}\n * @returns {*}\n */\n\nfunction pbkdf2sha512(password, salt, iterations) {\n return crypto.pbkdf2(password, salt, iterations, 64, 'sha512');\n}\n\n/**\n *\n * @param algo {constructors.PasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow}\n * @param password\n * @returns {Buffer|*}\n */\nasync function computeHash(algo, password) {\n const hash1 = await sha256(Buffer.concat([algo.salt1, Buffer.from(password, 'utf-8'), algo.salt1]));\n const hash2 = await sha256(Buffer.concat([algo.salt2, hash1, algo.salt2]));\n const hash3 = await pbkdf2sha512(hash2, algo.salt1, 100000);\n return sha256(Buffer.concat([algo.salt2, hash3, algo.salt2]));\n}\n\n/**\n *\n * @param algo {constructors.PasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow}\n * @param password\n */\nasync function computeDigest(algo, password) {\n try {\n checkPrimeAndGood(algo.p, algo.g);\n } catch (e) {\n throw new Error('bad p/g in password');\n }\n\n const value = modExp(BigInt(algo.g),\n readBigIntFromBuffer(await computeHash(algo, password), false),\n readBigIntFromBuffer(algo.p, false));\n return bigNumForHash(value);\n}\n\n/**\n *\n * @param request {constructors.account.Password}\n * @param password {string}\n */\nasync function computeCheck(request, password) {\n const algo = request.currentAlgo;\n if (!(algo instanceof constructors.PasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow)) {\n throw new Error(`Unsupported password algorithm ${algo.className}`);\n }\n\n const pwHash = await computeHash(algo, password);\n const p = readBigIntFromBuffer(algo.p, false);\n const { g } = algo;\n const B = readBigIntFromBuffer(request.srp_B, false);\n try {\n checkPrimeAndGood(algo.p, g);\n } catch (e) {\n throw new Error('bad /g in password');\n }\n if (!isGoodLarge(B, p)) {\n throw new Error('bad b in check');\n }\n const x = readBigIntFromBuffer(pwHash, false);\n const pForHash = numBytesForHash(algo.p);\n const gForHash = bigNumForHash(g);\n const bForHash = numBytesForHash(request.srp_B);\n const gX = modExp(BigInt(g), x, p);\n const k = readBigIntFromBuffer(await sha256(Buffer.concat([pForHash, gForHash])), false);\n const kgX = bigIntMod(k.multiply(gX), p);\n const generateAndCheckRandom = async () => {\n const randomSize = 256;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const random = generateRandomBytes(randomSize);\n const a = readBigIntFromBuffer(random, false);\n const A = modExp(BigInt(g), a, p);\n if (isGoodModExpFirst(A, p)) {\n const aForHash = bigNumForHash(A);\n const u = readBigIntFromBuffer(await sha256(Buffer.concat([aForHash, bForHash])), false);\n if (u.greater(BigInt(0))) {\n return [a, aForHash, u];\n }\n }\n }\n };\n const [a, aForHash, u] = await generateAndCheckRandom();\n const gB = bigIntMod(B.subtract(kgX), p);\n if (!isGoodModExpFirst(gB, p)) {\n throw new Error('bad gB');\n }\n\n const ux = u.multiply(x);\n const aUx = a.add(ux);\n const S = modExp(gB, aUx, p);\n const [K, pSha, gSha, salt1Sha, salt2Sha] = await Promise.all([\n sha256(bigNumForHash(S)),\n sha256(pForHash),\n sha256(gForHash),\n sha256(algo.salt1),\n sha256(algo.salt2),\n ]);\n const M1 = await sha256(Buffer.concat([\n xor(pSha, gSha),\n salt1Sha,\n salt2Sha,\n aForHash,\n bForHash,\n K,\n ]));\n\n\n return new constructors.InputCheckPasswordSRP({\n srpId: request.srpId,\n A: Buffer.from(aForHash),\n M1,\n\n });\n}\n\nmodule.exports = {\n computeCheck,\n computeDigest,\n};\n","const { inflate } = require('pako/dist/pako_inflate');\nconst { serializeBytes } = require('../index');\n\n// CONTEST const { deflate } = require('pako/dist/pako_deflate')\n\nclass GZIPPacked {\n static CONSTRUCTOR_ID = 0x3072cfa1;\n\n static classType = 'constructor';\n\n constructor(data) {\n this.data = data;\n this.CONSTRUCTOR_ID = 0x3072cfa1;\n this.classType = 'constructor';\n }\n\n static async gzipIfSmaller(contentRelated, data) {\n if (contentRelated && data.length > 512) {\n const gzipped = await (new GZIPPacked(data)).toBytes();\n if (gzipped.length < data.length) {\n return gzipped;\n }\n }\n return data;\n }\n\n static gzip(input) {\n return Buffer.from(input);\n // TODO this usually makes it faster for large requests\n // return Buffer.from(deflate(input, { level: 9, gzip: true }))\n }\n\n static ungzip(input) {\n return Buffer.from(inflate(input));\n }\n\n static read(reader) {\n const constructor = reader.readInt(false);\n if (constructor !== GZIPPacked.CONSTRUCTOR_ID) {\n throw new Error('not equal');\n }\n return GZIPPacked.gzip(reader.tgReadBytes());\n }\n\n static async fromReader(reader) {\n return new GZIPPacked(await GZIPPacked.ungzip(reader.tgReadBytes()));\n }\n\n async toBytes() {\n const g = Buffer.alloc(4);\n g.writeUInt32LE(GZIPPacked.CONSTRUCTOR_ID, 0);\n return Buffer.concat([\n g,\n serializeBytes(await GZIPPacked.gzip(this.data)),\n ]);\n }\n}\n\nmodule.exports = GZIPPacked;\n","/* eslint-disable no-bitwise */\n\n// eslint-disable-next-line max-len\n// Ref: https://github.com/telegramdesktop/tdesktop/blob/0743e71ab6b928d2ee5bae1aed991849b1e2b291/Telegram/SourceFiles/data/data_document.cpp#L1018\nexport function decodeWaveform(encoded5bit: Uint8Array) {\n const bitsCount = encoded5bit.length * 8;\n const valuesCount = Math.floor(bitsCount / 5);\n if (!valuesCount) {\n return [];\n }\n\n // Read each 5 bit of encoded5bit as 0-31 unsigned char.\n // We count the index of the byte in which the desired 5-bit sequence starts.\n // And then we read a uint16 starting from that byte to guarantee to get all of those 5 bits.\n //\n // BUT! if it is the last byte we have, we're not allowed to read a uint16 starting with it.\n // Because it will be an overflow (we'll access one byte after the available memory).\n // We see, that only the last 5 bits could start in the last available byte and be problematic.\n // So we read in a general way all the entries in a general way except the last one.\n const result = Array(valuesCount);\n const bitsData = encoded5bit;\n for (let i = 0, l = valuesCount - 1; i !== l; ++i) {\n const byteIndex = Math.floor((i * 5) / 8);\n const bitShift = Math.floor((i * 5) % 8);\n const value = bitsData[byteIndex] + (bitsData[byteIndex + 1] << 8);\n result[i] = ((value >> bitShift) & 0x1F);\n }\n const lastByteIndex = Math.floor(((valuesCount - 1) * 5) / 8);\n const lastBitShift = Math.floor(((valuesCount - 1) * 5) % 8);\n const lastValue = bitsData[lastByteIndex] + (bitsData[lastByteIndex + 1] << 8);\n result[valuesCount - 1] = (lastValue >> lastBitShift) & 0x1F;\n\n return result;\n}\n\nexport function interpolateArray(data: number[], fitCount: number) {\n let peak = 0;\n const newData = new Array(fitCount);\n const springFactor = data.length / fitCount;\n const leftFiller = data[0];\n const rightFiller = data[data.length - 1];\n for (let i = 0; i < fitCount; i++) {\n const idx = Math.floor(i * springFactor);\n const val = ((data[idx - 1] ?? leftFiller) + (data[idx] ?? leftFiller) + (data[idx + 1] ?? rightFiller)) / 3;\n newData[i] = val;\n if (peak < val) {\n peak = val;\n }\n }\n return { data: newData, peak };\n}\n","import { pause } from './schedulers';\n\n// Polyfill for Safari: `File` is not available in web worker\nif (typeof File === 'undefined') {\n // eslint-disable-next-line no-global-assign, no-restricted-globals, func-names\n self.File = class extends Blob {\n name: string;\n\n constructor(fileBits: BlobPart[], fileName: string, options?: FilePropertyBag) {\n if (options) {\n const { type, ...rest } = options;\n super(fileBits, { type });\n Object.assign(this, rest);\n } else {\n super(fileBits);\n }\n\n this.name = fileName;\n }\n } as typeof File;\n}\n\nexport function dataUriToBlob(dataUri: string) {\n const arr = dataUri.split(',');\n const mime = arr[0].match(/:(.*?);/)![1];\n const bstr = atob(arr[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n\n return new Blob([u8arr], { type: mime });\n}\n\nexport function blobToDataUri(blob: Blob): Promise {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e: ProgressEvent) => {\n const { result } = e.target || {};\n if (typeof result === 'string') {\n resolve(result);\n }\n\n reject(new Error('Failed to read blob'));\n };\n\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport function blobToFile(blob: Blob, fileName: string) {\n return new File([blob], fileName, {\n lastModified: Date.now(),\n type: blob.type,\n });\n}\n\nexport function preloadImage(url: string): Promise {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = url;\n });\n}\n\nexport function preloadVideo(url: string): Promise {\n return new Promise((resolve, reject) => {\n const video = document.createElement('video');\n video.volume = 0;\n video.onloadedmetadata = () => resolve(video);\n video.onerror = reject;\n video.src = url;\n });\n}\n\nexport async function createPosterForVideo(url: string): Promise {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise,\n new Promise((resolve, reject) => {\n video.onseeked = () => {\n if (!video.videoWidth || !video.videoHeight) {\n resolve(undefined);\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(video, 0, 0);\n resolve(canvas.toDataURL('image/jpeg'));\n };\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n }),\n ]);\n}\n\nexport async function fetchBlob(blobUrl: string) {\n const response = await fetch(blobUrl);\n return response.blob();\n}\n\nexport async function fetchFile(blobUrl: string, fileName: string) {\n const blob = await fetchBlob(blobUrl);\n return blobToFile(blob, fileName);\n}\n\nexport function imgToCanvas(img: HTMLImageElement) {\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0);\n\n return canvas;\n}\n","const AES = require('@cryptography/aes').default;\nconst {\n i2ab,\n ab2i,\n} = require('./converters');\nconst { getWords } = require('./words');\n\nclass Counter {\n constructor(initialValue) {\n this.setBytes(initialValue);\n }\n\n setBytes(bytes) {\n bytes = Buffer.from(bytes);\n this._counter = bytes;\n }\n\n increment() {\n for (let i = 15; i >= 0; i--) {\n if (this._counter[i] === 255) {\n this._counter[i] = 0;\n } else {\n this._counter[i]++;\n break;\n }\n }\n }\n}\n\nclass CTR {\n constructor(key, counter) {\n if (!(counter instanceof Counter)) {\n counter = new Counter(counter);\n }\n\n this._counter = counter;\n\n this._remainingCounter = undefined;\n this._remainingCounterIndex = 16;\n\n this._aes = new AES(getWords(key));\n }\n\n update(plainText) {\n return this.encrypt(plainText);\n }\n\n encrypt(plainText) {\n const encrypted = Buffer.from(plainText);\n\n for (let i = 0; i < encrypted.length; i++) {\n if (this._remainingCounterIndex === 16) {\n this._remainingCounter = Buffer.from(i2ab(this._aes.encrypt(ab2i(this._counter._counter))));\n this._remainingCounterIndex = 0;\n this._counter.increment();\n }\n encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];\n }\n\n return encrypted;\n }\n}\n\n// endregion\nfunction createDecipheriv(algorithm, key, iv) {\n if (algorithm.includes('ECB')) {\n throw new Error('Not supported');\n } else {\n return new CTR(key, iv);\n }\n}\n\nfunction createCipheriv(algorithm, key, iv) {\n if (algorithm.includes('ECB')) {\n throw new Error('Not supported');\n } else {\n return new CTR(key, iv);\n }\n}\n\nfunction randomBytes(count) {\n const bytes = new Uint8Array(count);\n crypto.getRandomValues(bytes);\n return bytes;\n}\n\nclass Hash {\n constructor(algorithm) {\n this.algorithm = algorithm;\n }\n\n update(data) {\n // We shouldn't be needing new Uint8Array but it doesn't\n // work without it\n this.data = new Uint8Array(data);\n }\n\n\n async digest() {\n if (this.algorithm === 'sha1') {\n // eslint-disable-next-line no-restricted-globals\n return Buffer.from(await self.crypto.subtle.digest('SHA-1', this.data));\n } else if (this.algorithm === 'sha256') {\n // eslint-disable-next-line no-restricted-globals\n return Buffer.from(await self.crypto.subtle.digest('SHA-256', this.data));\n }\n return undefined;\n }\n}\n\nasync function pbkdf2(password, salt, iterations) {\n const passwordKey = await crypto.subtle.importKey('raw', password,\n { name: 'PBKDF2' }, false, ['deriveBits']);\n return Buffer.from(await crypto.subtle.deriveBits({\n name: 'PBKDF2',\n hash: 'SHA-512',\n salt,\n iterations,\n }, passwordKey, 512));\n}\n\nfunction createHash(algorithm) {\n return new Hash(algorithm);\n}\n\nmodule.exports = {\n createCipheriv,\n createDecipheriv,\n randomBytes,\n createHash,\n pbkdf2,\n};\n","/**\n * Base class for all Remote Procedure Call errors.\n */\nclass RPCError extends Error {\n constructor(message, request, code = undefined) {\n super(\n 'RPCError {0}: {1}{2}'\n .replace('{0}', code)\n .replace('{1}', message)\n .replace('{2}', RPCError._fmtRequest(request)),\n );\n this.code = code;\n this.message = message;\n }\n\n static _fmtRequest(request) {\n // TODO fix this\n if (request) {\n return ` (caused by ${request.className})`;\n } else {\n return '';\n }\n }\n}\n\n/**\n * The request must be repeated, but directed to a different data center.\n */\nclass InvalidDCError extends RPCError {\n constructor(request, message, code) {\n super(message, request, code);\n this.code = code || 303;\n this.message = message || 'ERROR_SEE_OTHER';\n }\n}\n\n/**\n * The query contains errors. In the event that a request was created\n * using a form and contains user generated data, the user should be\n * notified that the data must be corrected before the query is repeated.\n */\nclass BadRequestError extends RPCError {\n code = 400;\n\n message = 'BAD_REQUEST';\n}\n\n/**\n * There was an unauthorized attempt to use functionality available only\n * to authorized users.\n */\nclass UnauthorizedError extends RPCError {\n code = 401;\n\n message = 'UNAUTHORIZED';\n}\n\n/**\n * Privacy violation. For example, an attempt to write a message to\n * someone who has blacklisted the current user.\n */\nclass ForbiddenError extends RPCError {\n code = 403;\n\n message = 'FORBIDDEN';\n}\n\n/**\n * An attempt to invoke a non-existent object, such as a method.\n */\nclass NotFoundError extends RPCError {\n code = 404;\n\n message = 'NOT_FOUND';\n}\n\n/**\n * Errors related to invalid authorization key, like\n * AUTH_KEY_DUPLICATED which can cause the connection to fail.\n */\nclass AuthKeyError extends RPCError {\n code = 406;\n\n message = 'AUTH_KEY';\n}\n\n/**\n * The maximum allowed number of attempts to invoke the given method\n * with the given input parameters has been exceeded. For example, in an\n * attempt to request a large number of text messages (SMS) for the same\n * phone number.\n */\nclass FloodError extends RPCError {\n code = 420;\n\n message = 'FLOOD';\n}\n\n/**\n * An internal server error occurred while a request was being processed\n * for example, there was a disruption while accessing a database or file\n * storage\n */\nclass ServerError extends RPCError {\n code = 500; // Also witnessed as -500\n\n message = 'INTERNAL';\n}\n\n/**\n * Clicking the inline buttons of bots that never (or take to long to)\n * call ``answerCallbackQuery`` will result in this \"special\" RPCError.\n */\nclass TimedOutError extends RPCError {\n code = 503; // Only witnessed as -503\n\n message = 'Timeout';\n}\n\nmodule.exports = {\n RPCError,\n InvalidDCError,\n BadRequestError,\n UnauthorizedError,\n ForbiddenError,\n NotFoundError,\n AuthKeyError,\n FloodError,\n ServerError,\n TimedOutError,\n};\n","class TLMessage {\n static SIZE_OVERHEAD = 12;\n\n static classType = 'constructor';\n\n constructor(msgId, seqNo, obj) {\n this.msgId = msgId;\n this.seqNo = seqNo;\n this.obj = obj;\n this.classType = 'constructor';\n }\n}\n\nmodule.exports = TLMessage;\n","const TLMessage = require('./TLMessage');\n\nclass MessageContainer {\n static CONSTRUCTOR_ID = 0x73f1f8dc;\n\n static classType = 'constructor';\n\n // Maximum size in bytes for the inner payload of the container.\n // Telegram will close the connection if the payload is bigger.\n // The overhead of the container itself is subtracted.\n static MAXIMUM_SIZE = 1044456 - 8;\n\n // Maximum amount of messages that can't be sent inside a single\n // container, inclusive. Beyond this limit Telegram will respond\n // with BAD_MESSAGE 64 (invalid container).\n //\n // This limit is not 100% accurate and may in some cases be higher.\n // However, sending up to 100 requests at once in a single container\n // is a reasonable conservative value, since it could also depend on\n // other factors like size per request, but we cannot know this.\n static MAXIMUM_LENGTH = 100;\n\n constructor(messages) {\n this.CONSTRUCTOR_ID = 0x73f1f8dc;\n this.messages = messages;\n this.classType = 'constructor';\n }\n\n static fromReader(reader) {\n const messages = [];\n const length = reader.readInt();\n for (let x = 0; x < length; x++) {\n const msgId = reader.readLong();\n const seqNo = reader.readInt();\n const containerLength = reader.readInt();\n const before = reader.tellPosition();\n const obj = reader.tgReadObject();\n reader.setPosition(before + containerLength);\n const tlMessage = new TLMessage(msgId, seqNo, obj);\n messages.push(tlMessage);\n }\n return new MessageContainer(messages);\n }\n}\n\nmodule.exports = MessageContainer;\n","const PromisedWebSockets = require('../../extensions/PromisedWebSockets');\nconst AsyncQueue = require('../../extensions/AsyncQueue');\n\n/**\n * The `Connection` class is a wrapper around ``asyncio.open_connection``.\n *\n * Subclasses will implement different transport modes as atomic operations,\n * which this class eases doing since the exposed interface simply puts and\n * gets complete data payloads to and from queues.\n *\n * The only error that will raise from send and receive methods is\n * ``ConnectionError``, which will raise when attempting to send if\n * the client is disconnected (includes remote disconnections).\n */\nclass Connection {\n PacketCodecClass = undefined;\n\n constructor(ip, port, dcId, loggers) {\n this._ip = ip;\n this._port = port;\n this._dcId = dcId;\n this._log = loggers;\n this._connected = false;\n this._sendTask = undefined;\n this._recvTask = undefined;\n this._codec = undefined;\n this._obfuscation = undefined; // TcpObfuscated and MTProxy\n this._sendArray = new AsyncQueue();\n this._recvArray = new AsyncQueue();\n // this.socket = new PromiseSocket(new Socket())\n\n this.socket = new PromisedWebSockets(this.disconnectCallback.bind(this));\n }\n\n async disconnectCallback() {\n await this.disconnect(true);\n }\n\n async _connect() {\n this._log.debug('Connecting');\n this._codec = new this.PacketCodecClass(this);\n await this.socket.connect(this._port, this._ip, this);\n this._log.debug('Finished connecting');\n // await this.socket.connect({host: this._ip, port: this._port});\n await this._initConn();\n }\n\n async connect() {\n await this._connect();\n this._connected = true;\n\n if (!this._sendTask) {\n this._sendTask = this._sendLoop();\n }\n this._recvTask = this._recvLoop();\n }\n\n async disconnect(fromCallback = false) {\n if (!this._connected) {\n return;\n }\n\n this._connected = false;\n void this._recvArray.push(undefined);\n if (!fromCallback) {\n await this.socket.close();\n }\n }\n\n async send(data) {\n if (!this._connected) {\n throw new Error('Not connected');\n }\n await this._sendArray.push(data);\n }\n\n async recv() {\n while (this._connected) {\n const result = await this._recvArray.pop();\n // null = sentinel value = keep trying\n if (result) {\n return result;\n }\n }\n throw new Error('Not connected');\n }\n\n async _sendLoop() {\n // TODO handle errors\n try {\n while (this._connected) {\n const data = await this._sendArray.pop();\n if (!data) {\n this._sendTask = undefined;\n return;\n }\n await this._send(data);\n }\n } catch (e) {\n this._log.info('The server closed the connection while sending');\n }\n }\n\n async _recvLoop() {\n let data;\n while (this._connected) {\n try {\n data = await this._recv();\n if (!data) {\n throw new Error('no data received');\n }\n } catch (e) {\n this._log.info('connection closed');\n // await this._recvArray.push()\n\n this.disconnect();\n return;\n }\n await this._recvArray.push(data);\n }\n }\n\n async _initConn() {\n if (this._codec.tag) {\n await this.socket.write(this._codec.tag);\n }\n }\n\n _send(data) {\n const encodedPacket = this._codec.encodePacket(data);\n this.socket.write(encodedPacket);\n }\n\n _recv() {\n return this._codec.readPacket(this.socket);\n }\n\n toString() {\n return `${this._ip}:${this._port}/${this.constructor.name.replace('Connection', '')}`;\n }\n}\n\nclass ObfuscatedConnection extends Connection {\n ObfuscatedIO = undefined;\n\n _initConn() {\n this._obfuscation = new this.ObfuscatedIO(this);\n this.socket.write(this._obfuscation.header);\n }\n\n _send(data) {\n this._obfuscation.write(this._codec.encodePacket(data));\n }\n\n\n _recv() {\n return this._codec.readPacket(this._obfuscation);\n }\n}\n\nclass PacketCodec {\n constructor(connection) {\n this._conn = connection;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n encodePacket(data) {\n throw new Error('Not Implemented');\n\n // Override\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n readPacket(reader) {\n // override\n throw new Error('Not Implemented');\n }\n}\n\nmodule.exports = {\n Connection,\n PacketCodec,\n ObfuscatedConnection,\n};\n","const MemorySession = require('./Memory');\nconst AuthKey = require('../crypto/AuthKey');\nconst utils = require('../Utils');\n\nconst STORAGE_KEY_BASE = 'GramJs-session-';\nconst SESSION_DATA_PREFIX = 'session:';\n\nclass StorageSession extends MemorySession {\n constructor(sessionInfo) {\n super();\n\n this._authKeys = {};\n\n if (sessionInfo && sessionInfo.startsWith(SESSION_DATA_PREFIX)) {\n this._sessionString = sessionInfo;\n } else if (sessionInfo) {\n this._storageKey = sessionInfo;\n }\n }\n\n get authKey() {\n throw new Error('Not supported');\n }\n\n set authKey(value) {\n throw new Error('Not supported');\n }\n\n async load() {\n if (this._sessionString) {\n await this._loadFromSessionString();\n return;\n }\n\n if (!this._storageKey) {\n return;\n }\n\n try {\n const json = await this._fetchFromCache();\n const {\n mainDcId,\n keys,\n hashes,\n } = JSON.parse(json);\n const {\n ipAddress,\n port,\n } = utils.getDC(mainDcId);\n\n this.setDC(mainDcId, ipAddress, port, true);\n\n Object.keys(keys)\n .forEach((dcId) => {\n if (keys[dcId] && hashes[dcId]) {\n this._authKeys[dcId] = new AuthKey(\n Buffer.from(keys[dcId].data),\n Buffer.from(hashes[dcId].data),\n );\n }\n });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('Failed to retrieve or parse session from storage');\n // eslint-disable-next-line no-console\n console.warn(err);\n }\n }\n\n setDC(dcId, serverAddress, port, skipUpdateStorage = false) {\n this._dcId = dcId;\n this._serverAddress = serverAddress;\n this._port = port;\n\n delete this._authKeys[dcId];\n\n if (!skipUpdateStorage) {\n void this._updateStorage();\n }\n }\n\n async save() {\n if (!this._storageKey) {\n this._storageKey = generateStorageKey();\n }\n\n await this._updateStorage();\n\n return this._storageKey;\n }\n\n getAuthKey(dcId = this._dcId) {\n return this._authKeys[dcId];\n }\n\n setAuthKey(authKey, dcId = this._dcId) {\n this._authKeys[dcId] = authKey;\n\n void this._updateStorage();\n }\n\n getSessionData(asHex) {\n const sessionData = {\n mainDcId: this._dcId,\n keys: {},\n hashes: {},\n };\n\n Object\n .keys(this._authKeys)\n .forEach((dcId) => {\n const authKey = this._authKeys[dcId];\n if (!authKey._key) return;\n\n sessionData.keys[dcId] = asHex ? authKey._key.toString('hex') : authKey._key;\n sessionData.hashes[dcId] = asHex ? authKey._hash.toString('hex') : authKey._hash;\n });\n\n return sessionData;\n }\n\n async _loadFromSessionString() {\n const [, mainDcIdStr, mainDcKey] = this._sessionString.split(':');\n const mainDcId = Number(mainDcIdStr);\n const {\n ipAddress,\n port,\n } = utils.getDC(mainDcId);\n this.setDC(mainDcId, ipAddress, port);\n const authKey = new AuthKey();\n await authKey.setKey(Buffer.from(mainDcKey, 'hex'), true);\n this.setAuthKey(authKey, mainDcId);\n }\n\n async _updateStorage() {\n if (!this._storageKey) {\n return;\n }\n\n try {\n await this._saveToCache(JSON.stringify(this.getSessionData()));\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('Failed to update session in storage');\n // eslint-disable-next-line no-console\n console.warn(err);\n }\n }\n\n async delete() {\n try {\n return await this._delete();\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('Failed to delete session from storage');\n // eslint-disable-next-line no-console\n console.warn(err);\n }\n return undefined;\n }\n\n // @abstract\n _delete() {\n throw new Error('Not Implemented');\n }\n\n // @abstract\n _fetchFromCache() {\n throw new Error('Not Implemented');\n }\n\n // @abstract\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _saveToCache(data) {\n throw new Error('Not Implemented');\n }\n}\n\nfunction generateStorageKey() {\n // Creating two sessions at the same moment is not expected nor supported.\n return `${STORAGE_KEY_BASE}${Date.now()}`;\n}\n\nmodule.exports = StorageSession;\n","/* pako 1.0.10 nodeca/pako */(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.pako = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nexports.string2buf = function (str) {\n var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new utils.Buf8(buf_len);\n\n // convert\n for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n};\n\n// Helper (used in 2 places)\nfunction buf2binstring(buf, len) {\n // On Chrome, the arguments in a function call that are allowed is `65534`.\n // If the length of the buffer is smaller than that, we can use this optimization,\n // otherwise we will take a slower path.\n if (len < 65534) {\n if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {\n return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));\n }\n }\n\n var result = '';\n for (var i = 0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n}\n\n\n// Convert byte array to binary string\nexports.buf2binstring = function (buf) {\n return buf2binstring(buf, buf.length);\n};\n\n\n// Convert binary string (typed, when possible)\nexports.binstring2buf = function (str) {\n var buf = new utils.Buf8(str.length);\n for (var i = 0, len = buf.length; i < len; i++) {\n buf[i] = str.charCodeAt(i);\n }\n return buf;\n};\n\n\n// convert array to string\nexports.buf2string = function (buf, max) {\n var i, out, c, c_len;\n var len = max || buf.length;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n var utf16buf = new Array(len * 2);\n\n for (out = 0, i = 0; i < len;) {\n c = buf[i++];\n // quick process ascii\n if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n c_len = _utf8len[c];\n // skip 5 & 6 byte codes\n if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nexports.utf8border = function (buf, max) {\n var pos;\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n pos = max - 1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means buffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n\n},{\"./common\":1}],3:[function(require,module,exports){\n'use strict';\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction adler32(adler, buf, len, pos) {\n var s1 = (adler & 0xffff) |0,\n s2 = ((adler >>> 16) & 0xffff) |0,\n n = 0;\n\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n\n do {\n s1 = (s1 + buf[pos++]) |0;\n s2 = (s2 + s1) |0;\n } while (--n);\n\n s1 %= 65521;\n s2 %= 65521;\n }\n\n return (s1 | (s2 << 16)) |0;\n}\n\n\nmodule.exports = adler32;\n\n},{}],4:[function(require,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n //Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n\n\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n};\n\n},{}],5:[function(require,module,exports){\n'use strict';\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nfunction makeTable() {\n var c, table = [];\n\n for (var n = 0; n < 256; n++) {\n c = n;\n for (var k = 0; k < 8; k++) {\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n return table;\n}\n\n// Create table on load. Just 255 signed longs. Not a problem.\nvar crcTable = makeTable();\n\n\nfunction crc32(crc, buf, len, pos) {\n var t = crcTable,\n end = pos + len;\n\n crc ^= -1;\n\n for (var i = pos; i < end; i++) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n}\n\n\nmodule.exports = crc32;\n\n},{}],6:[function(require,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n}\n\nmodule.exports = GZheader;\n\n},{}],7:[function(require,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nvar BAD = 30; /* got a data error -- remain here until reset */\nvar TYPE = 12; /* i: waiting for type bits, including last-flag bit */\n\n/*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\nmodule.exports = function inflate_fast(strm, start) {\n var state;\n var _in; /* local strm.input */\n var last; /* have enough input while in < last */\n var _out; /* local strm.output */\n var beg; /* inflate()'s initial strm.output */\n var end; /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n var dmax; /* maximum distance from zlib header */\n//#endif\n var wsize; /* window size or zero if not using window */\n var whave; /* valid bytes in the window */\n var wnext; /* window write index */\n // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n var s_window; /* allocated sliding window, if wsize != 0 */\n var hold; /* local strm.hold */\n var bits; /* local strm.bits */\n var lcode; /* local strm.lencode */\n var dcode; /* local strm.distcode */\n var lmask; /* mask for first level of length codes */\n var dmask; /* mask for first level of distance codes */\n var here; /* retrieved table entry */\n var op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n var len; /* match length, unused bytes */\n var dist; /* match distance */\n var from; /* where to copy match from */\n var from_source;\n\n\n var input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n dmax = state.dmax;\n//#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n s_window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top:\n do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n\n here = lcode[hold & lmask];\n\n dolen:\n for (;;) { // Goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n if (op === 0) { /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n output[_out++] = here & 0xffff/*here.val*/;\n }\n else if (op & 16) { /* length base */\n len = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & ((1 << op) - 1);\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n\n dodist:\n for (;;) { // goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n\n if (op & 16) { /* distance base */\n dist = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n//#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\\n\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) { /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// if (len <= op - whave) {\n// do {\n// output[_out++] = 0;\n// } while (--len);\n// continue top;\n// }\n// len -= op - whave;\n// do {\n// output[_out++] = 0;\n// } while (--op > whave);\n// if (op === 0) {\n// from = _out - dist;\n// do {\n// output[_out++] = output[from++];\n// } while (--len);\n// continue top;\n// }\n//#endif\n }\n from = 0; // window index\n from_source = s_window;\n if (wnext === 0) { /* very common case */\n from += wsize - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n else if (wnext < op) { /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) { /* some from end of window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) { /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n }\n else { /* contiguous in window */\n from += wnext - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n }\n else {\n from = _out - dist; /* copy direct from output */\n do { /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n }\n else if ((op & 64) === 0) { /* 2nd level distance code */\n here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dodist;\n }\n else {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n }\n else if ((op & 64) === 0) { /* 2nd level length code */\n here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dolen;\n }\n else if (op & 32) { /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.mode = TYPE;\n break top;\n }\n else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n state.hold = hold;\n state.bits = bits;\n return;\n};\n\n},{}],8:[function(require,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = require('../utils/common');\nvar adler32 = require('./adler32');\nvar crc32 = require('./crc32');\nvar inflate_fast = require('./inffast');\nvar inflate_table = require('./inftrees');\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\n//var Z_NO_FLUSH = 0;\n//var Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH = 2;\n//var Z_FULL_FLUSH = 3;\nvar Z_FINISH = 4;\nvar Z_BLOCK = 5;\nvar Z_TREES = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK = 0;\nvar Z_STREAM_END = 1;\nvar Z_NEED_DICT = 2;\n//var Z_ERRNO = -1;\nvar Z_STREAM_ERROR = -2;\nvar Z_DATA_ERROR = -3;\nvar Z_MEM_ERROR = -4;\nvar Z_BUF_ERROR = -5;\n//var Z_VERSION_ERROR = -6;\n\n/* The deflate compression method */\nvar Z_DEFLATED = 8;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nvar HEAD = 1; /* i: waiting for magic header */\nvar FLAGS = 2; /* i: waiting for method and flags (gzip) */\nvar TIME = 3; /* i: waiting for modification time (gzip) */\nvar OS = 4; /* i: waiting for extra flags and operating system (gzip) */\nvar EXLEN = 5; /* i: waiting for extra length (gzip) */\nvar EXTRA = 6; /* i: waiting for extra bytes (gzip) */\nvar NAME = 7; /* i: waiting for end of file name (gzip) */\nvar COMMENT = 8; /* i: waiting for end of comment (gzip) */\nvar HCRC = 9; /* i: waiting for header crc (gzip) */\nvar DICTID = 10; /* i: waiting for dictionary check value */\nvar DICT = 11; /* waiting for inflateSetDictionary() call */\nvar TYPE = 12; /* i: waiting for type bits, including last-flag bit */\nvar TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */\nvar STORED = 14; /* i: waiting for stored size (length and complement) */\nvar COPY_ = 15; /* i/o: same as COPY below, but only first time in */\nvar COPY = 16; /* i/o: waiting for input or output to copy stored block */\nvar TABLE = 17; /* i: waiting for dynamic block table lengths */\nvar LENLENS = 18; /* i: waiting for code length code lengths */\nvar CODELENS = 19; /* i: waiting for length/lit and distance code lengths */\nvar LEN_ = 20; /* i: same as LEN below, but only first time in */\nvar LEN = 21; /* i: waiting for length/lit/eob code */\nvar LENEXT = 22; /* i: waiting for length extra bits */\nvar DIST = 23; /* i: waiting for distance code */\nvar DISTEXT = 24; /* i: waiting for distance extra bits */\nvar MATCH = 25; /* o: waiting for output space to copy string */\nvar LIT = 26; /* o: waiting for output space to write literal */\nvar CHECK = 27; /* i: waiting for 32-bit check value */\nvar LENGTH = 28; /* i: waiting for 32-bit length (gzip) */\nvar DONE = 29; /* finished check, done -- remain here until reset */\nvar BAD = 30; /* got a data error -- remain here until reset */\nvar MEM = 31; /* got an inflate() memory error -- remain here until reset */\nvar SYNC = 32; /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_WBITS = MAX_WBITS;\n\n\nfunction zswap32(q) {\n return (((q >>> 24) & 0xff) +\n ((q >>> 8) & 0xff00) +\n ((q & 0xff00) << 8) +\n ((q & 0xff) << 24));\n}\n\n\nfunction InflateState() {\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib) */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new utils.Buf16(320); /* temporary storage for code lengths */\n this.work = new utils.Buf16(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n}\n\nfunction inflateResetKeep(strm) {\n var state;\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) { /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.dmax = 32768;\n state.head = null/*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);\n state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);\n\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\\n\"));\n return Z_OK;\n}\n\nfunction inflateReset(strm) {\n var state;\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n\n}\n\nfunction inflateReset2(strm, windowBits) {\n var wrap;\n var state;\n\n /* get the state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n }\n else {\n wrap = (windowBits >> 4) + 1;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n}\n\nfunction inflateInit2(strm, windowBits) {\n var ret;\n var state;\n\n if (!strm) { return Z_STREAM_ERROR; }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\\n\"));\n strm.state = state;\n state.window = null/*Z_NULL*/;\n ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK) {\n strm.state = null/*Z_NULL*/;\n }\n return ret;\n}\n\nfunction inflateInit(strm) {\n return inflateInit2(strm, DEF_WBITS);\n}\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nvar virgin = true;\n\nvar lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\nfunction fixedtables(state) {\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n var sym;\n\n lenfix = new utils.Buf32(512);\n distfix = new utils.Buf32(32);\n\n /* literal/length table */\n sym = 0;\n while (sym < 144) { state.lens[sym++] = 8; }\n while (sym < 256) { state.lens[sym++] = 9; }\n while (sym < 280) { state.lens[sym++] = 7; }\n while (sym < 288) { state.lens[sym++] = 8; }\n\n inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });\n\n /* distance table */\n sym = 0;\n while (sym < 32) { state.lens[sym++] = 5; }\n\n inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });\n\n /* do this just once */\n virgin = false;\n }\n\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n}\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nfunction updatewindow(strm, src, end, copy) {\n var dist;\n var state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n\n state.window = new utils.Buf8(state.wsize);\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);\n state.wnext = 0;\n state.whave = state.wsize;\n }\n else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n utils.arraySet(state.window, src, end - copy, dist, state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n utils.arraySet(state.window, src, end - copy, copy, 0);\n state.wnext = copy;\n state.whave = state.wsize;\n }\n else {\n state.wnext += dist;\n if (state.wnext === state.wsize) { state.wnext = 0; }\n if (state.whave < state.wsize) { state.whave += dist; }\n }\n }\n return 0;\n}\n\nfunction inflate(strm, flush) {\n var state;\n var input, output; // input/output buffers\n var next; /* next input INDEX */\n var put; /* next output INDEX */\n var have, left; /* available input and output */\n var hold; /* bit buffer */\n var bits; /* bits in bit buffer */\n var _in, _out; /* save starting available input and output */\n var copy; /* number of stored or match bytes to copy */\n var from; /* where to copy match bytes from */\n var from_source;\n var here = 0; /* current decoding table entry */\n var here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //var last; /* parent table entry */\n var last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n var len; /* length to copy for repeats, bits to drop */\n var ret; /* return code */\n var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */\n var opts;\n\n var n; // temporary var for NEED_BITS\n\n var order = /* permutation of code lengths */\n [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];\n\n\n if (!strm || !strm.state || !strm.output ||\n (!strm.input && strm.avail_in !== 0)) {\n return Z_STREAM_ERROR;\n }\n\n state = strm.state;\n if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */\n\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK;\n\n inf_leave: // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */\n state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n state.flags = 0; /* expect zlib header */\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD;\n break;\n }\n if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f)/*BITS(4)*/ + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n else if (len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD;\n break;\n }\n state.dmax = 1 << len;\n //Tracev((stderr, \"inflate: zlib header ok\\n\"));\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD;\n break;\n }\n if (state.head) {\n state.head.text = ((hold >> 8) & 1);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n hbuf[2] = (hold >>> 16) & 0xff;\n hbuf[3] = (hold >>> 24) & 0xff;\n state.check = crc32(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = (hold & 0xff);\n state.head.os = (hold >> 8);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n else if (state.head) {\n state.head.extra = null/*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) { copy = have; }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more convenient processing later\n state.head.extra = new Array(state.head.extra_len);\n }\n utils.arraySet(\n state.head.extra,\n input,\n next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n copy,\n /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len\n );\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) { break inf_leave; }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.name_max*/)) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.comm_max*/)) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = ((state.flags >> 9) & 1);\n state.head.done = true;\n }\n strm.adler = state.check = 0;\n state.mode = TYPE;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = zswap32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT;\n }\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE;\n /* falls through */\n case TYPE:\n if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = (hold & 0x01)/*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch ((hold & 0x03)/*BITS(2)*/) {\n case 0: /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1: /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2: /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\\n\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) { copy = have; }\n if (copy > left) { copy = left; }\n if (copy === 0) { break inf_leave; }\n //--- zmemcpy(put, next, copy); ---\n utils.arraySet(output, input, next, copy, put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\\n\"));\n state.mode = TYPE;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracev((stderr, \"inflate: table sizes ok\\n\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n\n opts = { bits: state.lenbits };\n ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\\n\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n }\n else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03);//BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n }\n else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f);//BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD) { break; }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n\n opts = { bits: state.lenbits };\n ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD;\n break;\n }\n\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = { bits: state.distbits };\n ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok\\n'));\n state.mode = LEN_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inflate_fast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if (here_bits <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.back = -1;\n state.mode = TYPE;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break;\n }\n state.offset = here_val;\n state.extra = (here_op) & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n//#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracevv((stderr, \"inflate: distance %u\\n\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) { break inf_leave; }\n copy = _out - left;\n if (state.offset > copy) { /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// Trace((stderr, \"inflate.c too far\\n\"));\n// copy -= state.whave;\n// if (copy > state.length) { copy = state.length; }\n// if (copy > left) { copy = left; }\n// left -= copy;\n// state.length -= copy;\n// do {\n// output[put++] = 0;\n// } while (--copy);\n// if (state.length === 0) { state.mode = LEN; }\n// break;\n//#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n }\n else {\n from = state.wnext - copy;\n }\n if (copy > state.length) { copy = state.length; }\n from_source = state.window;\n }\n else { /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) { copy = left; }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) { state.mode = LEN; }\n break;\n case LIT:\n if (left === 0) { break inf_leave; }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n // Use '|' instead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if (_out) {\n strm.adler = state.check =\n /*UPDATE(state.check, put - _out, _out);*/\n (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));\n\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\\n\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\\n\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END;\n break inf_leave;\n case BAD:\n ret = Z_DATA_ERROR;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n (state.mode < CHECK || flush !== Z_FINISH))) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {\n state.mode = MEM;\n return Z_MEM_ERROR;\n }\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if (state.wrap && _out) {\n strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) +\n (state.mode === TYPE ? 128 : 0) +\n (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {\n ret = Z_BUF_ERROR;\n }\n return ret;\n}\n\nfunction inflateEnd(strm) {\n\n if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n return Z_STREAM_ERROR;\n }\n\n var state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK;\n}\n\nfunction inflateGetHeader(strm, head) {\n var state;\n\n /* check state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK;\n}\n\nfunction inflateSetDictionary(strm, dictionary) {\n var dictLength = dictionary.length;\n\n var state;\n var dictid;\n var ret;\n\n /* check state */\n if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }\n state = strm.state;\n\n if (state.wrap !== 0 && state.mode !== DICT) {\n return Z_STREAM_ERROR;\n }\n\n /* check for correct dictionary identifier */\n if (state.mode === DICT) {\n dictid = 1; /* adler32(0, null, 0)*/\n /* dictid = adler32(dictid, dictionary, dictLength); */\n dictid = adler32(dictid, dictionary, dictLength, 0);\n if (dictid !== state.check) {\n return Z_DATA_ERROR;\n }\n }\n /* copy dictionary to window using updatewindow(), which will amend the\n existing dictionary if appropriate */\n ret = updatewindow(strm, dictionary, dictLength, dictLength);\n if (ret) {\n state.mode = MEM;\n return Z_MEM_ERROR;\n }\n state.havedict = 1;\n // Tracev((stderr, \"inflate: dictionary set\\n\"));\n return Z_OK;\n}\n\nexports.inflateReset = inflateReset;\nexports.inflateReset2 = inflateReset2;\nexports.inflateResetKeep = inflateResetKeep;\nexports.inflateInit = inflateInit;\nexports.inflateInit2 = inflateInit2;\nexports.inflate = inflate;\nexports.inflateEnd = inflateEnd;\nexports.inflateGetHeader = inflateGetHeader;\nexports.inflateSetDictionary = inflateSetDictionary;\nexports.inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nexports.inflateCopy = inflateCopy;\nexports.inflateGetDictionary = inflateGetDictionary;\nexports.inflateMark = inflateMark;\nexports.inflatePrime = inflatePrime;\nexports.inflateSync = inflateSync;\nexports.inflateSyncPoint = inflateSyncPoint;\nexports.inflateUndermine = inflateUndermine;\n*/\n\n},{\"../utils/common\":1,\"./adler32\":3,\"./crc32\":5,\"./inffast\":7,\"./inftrees\":9}],9:[function(require,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = require('../utils/common');\n\nvar MAXBITS = 15;\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\nvar lbase = [ /* Length codes 257..285 base */\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n];\n\nvar lext = [ /* Length codes 257..285 extra */\n 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n];\n\nvar dbase = [ /* Distance codes 0..29 base */\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12289, 16385, 24577, 0, 0\n];\n\nvar dext = [ /* Distance codes 0..29 extra */\n 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n 28, 28, 29, 29, 64, 64\n];\n\nmodule.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)\n{\n var bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n var len = 0; /* a code's length in bits */\n var sym = 0; /* index of code symbols */\n var min = 0, max = 0; /* minimum and maximum code lengths */\n var root = 0; /* number of index bits for root table */\n var curr = 0; /* number of index bits for current table */\n var drop = 0; /* code bits to drop for sub-table */\n var left = 0; /* number of prefix codes available */\n var used = 0; /* code entries in table used */\n var huff = 0; /* Huffman code */\n var incr; /* for incrementing code, index */\n var fill; /* index for replicating entries */\n var low; /* low bits for current root entry */\n var mask; /* mask for low root bits */\n var next; /* next available space in table */\n var base = null; /* base value table to use */\n var base_index = 0;\n// var shoextra; /* extra bits table to use */\n var end; /* use base and extra for symbol > end */\n var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */\n var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */\n var extra = null;\n var extra_index = 0;\n\n var here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) { break; }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) { /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) { break; }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES) {\n base = extra = work; /* dummy value--not used */\n end = 19;\n\n } else if (type === LENS) {\n base = lbase;\n base_index -= 257;\n extra = lext;\n extra_index -= 257;\n end = 256;\n\n } else { /* DISTS */\n base = dbase;\n extra = dext;\n end = -1;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n /* process all codes and make table entries */\n for (;;) {\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] < end) {\n here_op = 0;\n here_val = work[sym];\n }\n else if (work[sym] > end) {\n here_op = extra[extra_index + work[sym]];\n here_val = base[base_index + work[sym]];\n }\n else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << (len - drop);\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << (len - 1);\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) { break; }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) { break; }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n};\n\n},{\"../utils/common\":1}],10:[function(require,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n 2: 'need dictionary', /* Z_NEED_DICT 2 */\n 1: 'stream end', /* Z_STREAM_END 1 */\n 0: '', /* Z_OK 0 */\n '-1': 'file error', /* Z_ERRNO (-1) */\n '-2': 'stream error', /* Z_STREAM_ERROR (-2) */\n '-3': 'data error', /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error', /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n\n},{}],11:[function(require,module,exports){\n'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = ''/*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2/*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n}\n\nmodule.exports = ZStream;\n\n},{}],\"/lib/inflate.js\":[function(require,module,exports){\n'use strict';\n\n\nvar zlib_inflate = require('./zlib/inflate');\nvar utils = require('./utils/common');\nvar strings = require('./utils/strings');\nvar c = require('./zlib/constants');\nvar msg = require('./zlib/messages');\nvar ZStream = require('./zlib/zstream');\nvar GZheader = require('./zlib/gzheader');\n\nvar toString = Object.prototype.toString;\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you\n * push a chunk with explicit flush (call [[Inflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate(options) {\n if (!(this instanceof Inflate)) return new Inflate(options);\n\n this.options = utils.assign({\n chunkSize: 16384,\n windowBits: 0,\n to: ''\n }, options || {});\n\n var opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) { opt.windowBits = -15; }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new ZStream();\n this.strm.avail_out = 0;\n\n var status = zlib_inflate.inflateInit2(\n this.strm,\n opt.windowBits\n );\n\n if (status !== c.Z_OK) {\n throw new Error(msg[status]);\n }\n\n this.header = new GZheader();\n\n zlib_inflate.inflateGetHeader(this.strm, this.header);\n\n // Setup dictionary\n if (opt.dictionary) {\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n opt.dictionary = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n opt.dictionary = new Uint8Array(opt.dictionary);\n }\n if (opt.raw) { //In raw mode we need to set the dictionary early\n status = zlib_inflate.inflateSetDictionary(this.strm, opt.dictionary);\n if (status !== c.Z_OK) {\n throw new Error(msg[status]);\n }\n }\n }\n}\n\n/**\n * Inflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the decompression context.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nInflate.prototype.push = function (data, mode) {\n var strm = this.strm;\n var chunkSize = this.options.chunkSize;\n var dictionary = this.options.dictionary;\n var status, _mode;\n var next_out_utf8, tail, utf8str;\n\n // Flag to properly process Z_BUF_ERROR on testing inflate call\n // when we check that all output data was flushed.\n var allowBufError = false;\n\n if (this.ended) { return false; }\n _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);\n\n // Convert data if needed\n if (typeof data === 'string') {\n // Only binary strings can be decompressed on practice\n strm.input = strings.binstring2buf(data);\n } else if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n do {\n if (strm.avail_out === 0) {\n strm.output = new utils.Buf8(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); /* no bad return value */\n\n if (status === c.Z_NEED_DICT && dictionary) {\n status = zlib_inflate.inflateSetDictionary(this.strm, dictionary);\n }\n\n if (status === c.Z_BUF_ERROR && allowBufError === true) {\n status = c.Z_OK;\n allowBufError = false;\n }\n\n if (status !== c.Z_STREAM_END && status !== c.Z_OK) {\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n if (strm.next_out) {\n if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) {\n\n if (this.options.to === 'string') {\n\n next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n tail = strm.next_out - next_out_utf8;\n utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }\n\n this.onData(utf8str);\n\n } else {\n this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n }\n }\n }\n\n // When no more input data, we should check that internal inflate buffers\n // are flushed. The only way to do it when avail_out = 0 - run one more\n // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.\n // Here we set flag to process this error properly.\n //\n // NOTE. Deflate does not return error in this case and does not needs such\n // logic.\n if (strm.avail_in === 0 && strm.avail_out === 0) {\n allowBufError = true;\n }\n\n } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END);\n\n if (status === c.Z_STREAM_END) {\n _mode = c.Z_FINISH;\n }\n\n // Finalize on the last chunk.\n if (_mode === c.Z_FINISH) {\n status = zlib_inflate.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === c.Z_OK;\n }\n\n // callback interim results if Z_SYNC_FLUSH.\n if (_mode === c.Z_SYNC_FLUSH) {\n this.onEnd(c.Z_OK);\n strm.avail_out = 0;\n return true;\n }\n\n return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): output data. Type of array depends\n * on js engine support. When string output requested, each chunk\n * will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate.prototype.onEnd = function (status) {\n // On success - join\n if (status === c.Z_OK) {\n if (this.options.to === 'string') {\n // Glue & convert here, until we teach pako to send\n // utf8 aligned strings to onData\n this.result = this.chunks.join('');\n } else {\n this.result = utils.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , input = pako.deflate([1,2,3,4,5,6,7,8,9])\n * , output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err)\n * console.log(err);\n * }\n * ```\n **/\nfunction inflate(input, options) {\n var inflator = new Inflate(options);\n\n inflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) { throw inflator.msg || msg[inflator.err]; }\n\n return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return inflate(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nexports.Inflate = Inflate;\nexports.inflate = inflate;\nexports.inflateRaw = inflateRaw;\nexports.ungzip = inflate;\n\n},{\"./utils/common\":1,\"./utils/strings\":2,\"./zlib/constants\":4,\"./zlib/gzheader\":6,\"./zlib/inflate\":8,\"./zlib/messages\":10,\"./zlib/zstream\":11}]},{},[])(\"/lib/inflate.js\")\n});\n","const Logger = require('./Logger');\nconst BinaryWriter = require('./BinaryWriter');\nconst BinaryReader = require('./BinaryReader');\nconst PromisedWebSockets = require('./PromisedWebSockets');\nconst MessagePacker = require('./MessagePacker');\nconst AsyncQueue = require('./AsyncQueue');\n\nmodule.exports = {\n BinaryWriter,\n BinaryReader,\n MessagePacker,\n AsyncQueue,\n Logger,\n PromisedWebSockets,\n};\n","import { Api as GramJs } from '../../../lib/gramjs';\nimport {\n ApiBotInlineMediaResult, ApiBotInlineResult, ApiInlineResultType, ApiWebDocument,\n} from '../../types';\n\nimport { pick } from '../../../util/iteratees';\nimport { buildApiPhoto, buildApiThumbnailFromStripped } from './common';\nimport { buildVideoFromDocument } from './messages';\nimport { buildStickerFromDocument } from './symbols';\n\nexport function buildApiBotInlineResult(result: GramJs.BotInlineResult, queryId: string): ApiBotInlineResult {\n const {\n id, type, title, description, url, thumb,\n } = result;\n\n return {\n id,\n queryId,\n type: type as ApiInlineResultType,\n title,\n description,\n url,\n webThumbnail: buildApiWebDocument(thumb),\n };\n}\n\nexport function buildApiBotInlineMediaResult(\n result: GramJs.BotInlineMediaResult, queryId: string,\n): ApiBotInlineMediaResult {\n const {\n id, type, title, description, photo, document,\n } = result;\n\n return {\n id,\n queryId,\n type: type as ApiInlineResultType,\n title,\n description,\n ...(type === 'sticker' && document instanceof GramJs.Document && { sticker: buildStickerFromDocument(document) }),\n ...(photo instanceof GramJs.Photo && { photo: buildApiPhoto(photo) }),\n ...(type === 'gif' && document instanceof GramJs.Document && { gif: buildVideoFromDocument(document) }),\n ...(type === 'video' && document instanceof GramJs.Document && {\n thumbnail: buildApiThumbnailFromStripped(document.thumbs),\n }),\n };\n}\n\nfunction buildApiWebDocument(document?: GramJs.TypeWebDocument): ApiWebDocument | undefined {\n return document ? pick(document, ['url', 'mimeType']) : undefined;\n}\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","const snakeToCamelCase = (name) => {\n const result = name.replace(/(?:^|_)([a-z])/g, (_, g) => g.toUpperCase());\n return result.replace(/_/g, '');\n};\nconst variableSnakeToCamelCase = (str) => str.replace(\n /([-_][a-z])/g,\n (group) => group.toUpperCase()\n .replace('-', '')\n .replace('_', ''),\n);\n\nconst CORE_TYPES = new Set([\n 0xbc799737, // boolFalse#bc799737 = Bool;\n 0x997275b5, // boolTrue#997275b5 = Bool;\n 0x3fedd339, // true#3fedd339 = True;\n 0xc4b9f9bb, // error#c4b9f9bb code:int text:string = Error;\n 0x56730bcc, // null#56730bcc = Null;\n]);\nconst AUTH_KEY_TYPES = new Set([\n 0x05162463, // resPQ,\n 0x83c95aec, // p_q_inner_data\n 0xa9f55f95, // p_q_inner_data_dc\n 0x3c6a84d4, // p_q_inner_data_temp\n 0x56fddf88, // p_q_inner_data_temp_dc\n 0xd0e8075c, // server_DH_params_ok\n 0xb5890dba, // server_DH_inner_data\n 0x6643b654, // client_DH_inner_data\n 0xd712e4be, // req_DH_params\n 0xf5045f1f, // set_client_DH_params\n 0x3072cfa1, // gzip_packed\n]);\n\n// This is copy-pasted from `gramjs/Helpers.js` to not depend on TypeScript modules\nfunction makeCRCTable() {\n let c;\n const crcTable = [];\n for (let n = 0; n < 256; n++) {\n c = n;\n for (let k = 0; k < 8; k++) {\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n crcTable[n] = c;\n }\n return crcTable;\n}\n\nlet crcTable;\n\nfunction crc32(buf) {\n if (!crcTable) {\n crcTable = makeCRCTable();\n }\n if (!Buffer.isBuffer(buf)) {\n buf = Buffer.from(buf);\n }\n let crc = -1;\n\n for (let index = 0; index < buf.length; index++) {\n const byte = buf[index];\n crc = crcTable[(crc ^ byte) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ (-1)) >>> 0;\n}\n\nconst findAll = (regex, str, matches = []) => {\n if (!regex.flags.includes('g')) {\n regex = new RegExp(regex.source, 'g');\n }\n\n const res = regex.exec(str);\n\n if (res) {\n matches.push(res.slice(1));\n findAll(regex, str, matches);\n }\n\n return matches;\n};\n\nconst fromLine = (line, isFunction) => {\n const match = line.match(/([\\w.]+)(?:#([0-9a-fA-F]+))?(?:\\s{?\\w+:[\\w\\d<>#.?!]+}?)*\\s=\\s([\\w\\d<>#.?]+);$/);\n if (!match) {\n // Probably \"vector#1cb5c415 {t:Type} # [ t ] = Vector t;\"\n throw new Error(`Cannot parse TLObject ${line}`);\n }\n\n const argsMatch = findAll(/({)?(\\w+):([\\w\\d<>#.?!]+)}?/, line);\n const currentConfig = {\n name: match[1],\n constructorId: parseInt(match[2], 16),\n argsConfig: {},\n subclassOfId: crc32(match[3]),\n result: match[3],\n isFunction,\n namespace: undefined,\n };\n if (!currentConfig.constructorId) {\n const hexId = '';\n let args;\n\n if (Object.values(currentConfig.argsConfig).length) {\n args = ` ${Object.keys(currentConfig.argsConfig)\n .map((arg) => arg.toString())\n .join(' ')}`;\n } else {\n args = '';\n }\n\n const representation = `${currentConfig.name}${hexId}${args} = ${currentConfig.result}`\n .replace(/(:|\\?)bytes /g, '$1string ')\n .replace(/|{|}/g, '')\n .replace(/ \\w+:flags\\.\\d+\\?true/g, '');\n\n if (currentConfig.name === 'inputMediaInvoice') {\n // eslint-disable-next-line no-empty\n if (currentConfig.name === 'inputMediaInvoice') {\n }\n }\n\n currentConfig.constructorId = crc32(Buffer.from(representation, 'utf8'));\n }\n for (const [brace, name, argType] of argsMatch) {\n if (brace === undefined) {\n currentConfig.argsConfig[variableSnakeToCamelCase(name)] = buildArgConfig(name, argType);\n }\n }\n if (currentConfig.name.includes('.')) {\n [currentConfig.namespace, currentConfig.name] = currentConfig.name.split(/\\.(.+)/);\n }\n currentConfig.name = snakeToCamelCase(currentConfig.name);\n /*\n for (const arg in currentConfig.argsConfig){\n if (currentConfig.argsConfig.hasOwnProperty(arg)){\n if (currentConfig.argsConfig[arg].flagIndicator){\n delete currentConfig.argsConfig[arg]\n }\n }\n } */\n return currentConfig;\n};\n\nfunction buildArgConfig(name, argType) {\n name = name === 'self' ? 'is_self' : name;\n // Default values\n const currentConfig = {\n isVector: false,\n isFlag: false,\n skipConstructorId: false,\n flagIndex: -1,\n flagIndicator: true,\n type: undefined,\n useVectorId: undefined,\n };\n\n // The type can be an indicator that other arguments will be flags\n if (argType !== '#') {\n currentConfig.flagIndicator = false;\n // Strip the exclamation mark always to have only the name\n currentConfig.type = argType.replace(/^!+/, '');\n\n // The type may be a flag (flags.IDX?REAL_TYPE)\n // Note that 'flags' is NOT the flags name; this\n // is determined by a previous argument\n // However, we assume that the argument will always be called 'flags'\n // @ts-ignore\n const flagMatch = currentConfig.type.match(/flags.(\\d+)\\?([\\w<>.]+)/);\n\n if (flagMatch) {\n currentConfig.isFlag = true;\n currentConfig.flagIndex = Number(flagMatch[1]);\n // Update the type to match the exact type, not the \"flagged\" one\n [, , currentConfig.type] = flagMatch;\n }\n\n // Then check if the type is a Vector\n // @ts-ignore\n const vectorMatch = currentConfig.type.match(/[Vv]ector<([\\w\\d.]+)>/);\n\n if (vectorMatch) {\n currentConfig.isVector = true;\n\n // If the type's first letter is not uppercase, then\n // it is a constructor and we use (read/write) its ID.\n // @ts-ignore\n currentConfig.useVectorId = currentConfig.type.charAt(0) === 'V';\n\n // Update the type to match the one inside the vector\n [, currentConfig.type] = vectorMatch;\n }\n\n // See use_vector_id. An example of such case is ipPort in\n // help.configSpecial\n // @ts-ignore\n if (/^[a-z]$/.test(currentConfig.type.split('.')\n .pop()\n .charAt(0))\n ) {\n currentConfig.skipConstructorId = true;\n }\n\n // The name may contain \"date\" in it, if this is the case and\n // the type is \"int\", we can safely assume that this should be\n // treated as a \"date\" object. Note that this is not a valid\n // Telegram object, but it's easier to work with\n // if (\n // this.type === 'int' &&\n // (/(\\b|_)([dr]ate|until|since)(\\b|_)/.test(name) ||\n // ['expires', 'expires_at', 'was_online'].includes(name))\n // ) {\n // this.type = 'date';\n // }\n }\n return currentConfig;\n}\n\n\nfunction* parseTl(content, layer, methods = [], ignoreIds = CORE_TYPES) {\n (methods || []).reduce((o, m) => ({\n ...o,\n [m.name]: m,\n }), {});\n const objAll = [];\n const objByName = {};\n const objByType = {};\n\n const file = content;\n\n let isFunction = false;\n\n for (let line of file.split('\\n')) {\n const commentIndex = line.indexOf('//');\n\n if (commentIndex !== -1) {\n line = line.slice(0, commentIndex);\n }\n\n line = line.trim();\n\n if (!line) {\n continue;\n }\n\n const match = line.match(/---(\\w+)---/);\n\n if (match) {\n const [, followingTypes] = match;\n isFunction = followingTypes === 'functions';\n continue;\n }\n\n try {\n const result = fromLine(line, isFunction);\n\n if (ignoreIds.has(result.constructorId)) {\n continue;\n }\n\n objAll.push(result);\n\n if (!result.isFunction) {\n if (!objByType[result.result]) {\n objByType[result.result] = [];\n }\n\n objByName[result.name] = result;\n objByType[result.result].push(result);\n }\n } catch (e) {\n if (!e.toString()\n .includes('vector#1cb5c415')) {\n throw e;\n }\n }\n }\n\n // Once all objects have been parsed, replace the\n // string type from the arguments with references\n for (const obj of objAll) {\n // console.log(obj)\n if (AUTH_KEY_TYPES.has(obj.constructorId)) {\n for (const arg in obj.argsConfig) {\n if (obj.argsConfig[arg].type === 'string') {\n obj.argsConfig[arg].type = 'bytes';\n }\n }\n }\n }\n\n for (const obj of objAll) {\n yield obj;\n }\n}\n\nfunction serializeBytes(data) {\n if (!(data instanceof Buffer)) {\n if (typeof data === 'string') {\n data = Buffer.from(data);\n } else {\n throw Error(`Bytes or str expected, not ${data.constructor.name}`);\n }\n }\n const r = [];\n let padding;\n if (data.length < 254) {\n padding = (data.length + 1) % 4;\n if (padding !== 0) {\n padding = 4 - padding;\n }\n r.push(Buffer.from([data.length]));\n r.push(data);\n } else {\n padding = data.length % 4;\n if (padding !== 0) {\n padding = 4 - padding;\n }\n r.push(Buffer.from([254, data.length % 256, (data.length >> 8) % 256, (data.length >> 16) % 256]));\n r.push(data);\n }\n r.push(Buffer.alloc(padding)\n .fill(0));\n\n return Buffer.concat(r);\n}\n\nfunction serializeDate(dt) {\n if (!dt) {\n return Buffer.alloc(4)\n .fill(0);\n }\n if (dt instanceof Date) {\n dt = Math.floor((Date.now() - dt.getTime()) / 1000);\n }\n if (typeof dt === 'number') {\n const t = Buffer.alloc(4);\n t.writeInt32LE(dt, 0);\n return t;\n }\n throw Error(`Cannot interpret \"${dt}\" as a date`);\n}\n\nmodule.exports = {\n findAll,\n parseTl,\n buildArgConfig,\n fromLine,\n CORE_TYPES,\n serializeDate,\n serializeBytes,\n snakeToCamelCase,\n variableSnakeToCamelCase,\n};\n","var S = new Uint8Array(256);\nvar Si = new Uint8Array(256);\nvar T1 = new Uint32Array(256);\nvar T2 = new Uint32Array(256);\nvar T3 = new Uint32Array(256);\nvar T4 = new Uint32Array(256);\nvar T5 = new Uint32Array(256);\nvar T6 = new Uint32Array(256);\nvar T7 = new Uint32Array(256);\nvar T8 = new Uint32Array(256);\nfunction computeTables() {\n var d = new Uint8Array(256);\n var t = new Uint8Array(256);\n var x2;\n var x4;\n var x8;\n var s;\n var tEnc;\n var tDec;\n var x = 0;\n var xInv = 0;\n // Compute double and third tables\n for (var i = 0; i < 256; i++) {\n d[i] = i << 1 ^ (i >> 7) * 283;\n t[d[i] ^ i] = i;\n }\n for (; !S[x]; x ^= x2 || 1) {\n // Compute sbox\n s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;\n s = s >> 8 ^ s & 255 ^ 99;\n S[x] = s;\n Si[s] = x;\n // Compute MixColumns\n x8 = d[x4 = d[x2 = d[x]]];\n tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;\n tEnc = d[s] * 0x101 ^ s * 0x1010100;\n T1[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T2[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T3[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T4[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T5[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T6[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T7[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T8[s] = tDec = tDec << 24 ^ tDec >>> 8;\n xInv = t[xInv] || 1;\n }\n}\n\n/**\n * Gets a uint32 from string in big-endian order order\n */\nfunction s2i(str, pos) {\n return (str.charCodeAt(pos) << 24\n ^ str.charCodeAt(pos + 1) << 16\n ^ str.charCodeAt(pos + 2) << 8\n ^ str.charCodeAt(pos + 3));\n}\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Helper function for transforming string key to Uint32Array\n */\nfunction getWords(key) {\n if (key instanceof Uint32Array) {\n return key;\n }\n if (typeof key === 'string') {\n if (key.length % 4 !== 0)\n for (var i = key.length % 4; i <= 4; i++)\n key += '\\0x00';\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4)\n buf[i / 4] = s2i(key, i);\n return buf;\n }\n if (key instanceof Uint8Array) {\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4) {\n buf[i / 4] = (key[i] << 24\n ^ key[i + 1] << 16\n ^ key[i + 2] << 8\n ^ key[i + 3]);\n }\n return buf;\n }\n throw new Error('Unable to create 32-bit words');\n}\nfunction xor(left, right, to) {\n if (to === void 0) { to = left; }\n for (var i = 0; i < left.length; i++)\n to[i] = left[i] ^ right[i];\n}\n\ncomputeTables();\n/**\n * Low-level AES Cipher\n */\nvar AES = /** @class */ (function () {\n function AES(_key) {\n var key = getWords(_key);\n if (key.length !== 4 && key.length !== 6 && key.length !== 8) {\n throw new Error('Invalid key size');\n }\n this.encKey = new Uint32Array(4 * key.length + 28);\n this.decKey = new Uint32Array(4 * key.length + 28);\n this.encKey.set(key);\n var rcon = 1;\n var i = key.length;\n var tmp;\n // schedule encryption keys\n for (; i < 4 * key.length + 28; i++) {\n tmp = this.encKey[i - 1];\n // apply sbox\n if (i % key.length === 0 || (key.length === 8 && i % key.length === 4)) {\n tmp = S[tmp >>> 24] << 24 ^ S[(tmp >> 16) & 255] << 16 ^ S[(tmp >> 8) & 255] << 8 ^ S[tmp & 255];\n // shift rows and add rcon\n if (i % key.length === 0) {\n tmp = tmp << 8 ^ tmp >>> 24 ^ (rcon << 24);\n rcon = rcon << 1 ^ (rcon >> 7) * 283;\n }\n }\n this.encKey[i] = this.encKey[i - key.length] ^ tmp;\n }\n // schedule decryption keys\n for (var j = 0; i; j++, i--) {\n tmp = this.encKey[j & 3 ? i : i - 4];\n if (i <= 4 || j < 4) {\n this.decKey[j] = tmp;\n }\n else {\n this.decKey[j] = (T5[S[tmp >>> 24]]\n ^ T6[S[(tmp >> 16) & 255]]\n ^ T7[S[(tmp >> 8) & 255]]\n ^ T8[S[tmp & 255]]);\n }\n }\n }\n AES.prototype.encrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.encKey[0];\n var b = message[1] ^ this.encKey[1];\n var c = message[2] ^ this.encKey[2];\n var d = message[3] ^ this.encKey[3];\n var rounds = this.encKey.length / 4 - 2;\n var k = 4;\n var a2;\n var b2;\n var c2;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T1[a >>> 24] ^ T2[(b >> 16) & 255] ^ T3[(c >> 8) & 255] ^ T4[d & 255] ^ this.encKey[k];\n b2 = T1[b >>> 24] ^ T2[(c >> 16) & 255] ^ T3[(d >> 8) & 255] ^ T4[a & 255] ^ this.encKey[k + 1];\n c2 = T1[c >>> 24] ^ T2[(d >> 16) & 255] ^ T3[(a >> 8) & 255] ^ T4[b & 255] ^ this.encKey[k + 2];\n d = T1[d >>> 24] ^ T2[(a >> 16) & 255] ^ T3[(b >> 8) & 255] ^ T4[c & 255] ^ this.encKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n // console.log(a, b, c, d);\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[i] = (S[a >>> 24] << 24\n ^ S[(b >> 16) & 255] << 16\n ^ S[(c >> 8) & 255] << 8\n ^ S[d & 255]\n ^ this.encKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n AES.prototype.decrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.decKey[0];\n var b = message[3] ^ this.decKey[1];\n var c = message[2] ^ this.decKey[2];\n var d = message[1] ^ this.decKey[3];\n var rounds = this.decKey.length / 4 - 2;\n var a2;\n var b2;\n var c2;\n var k = 4;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T5[a >>> 24] ^ T6[(b >> 16) & 255] ^ T7[(c >> 8) & 255] ^ T8[d & 255] ^ this.decKey[k];\n b2 = T5[b >>> 24] ^ T6[(c >> 16) & 255] ^ T7[(d >> 8) & 255] ^ T8[a & 255] ^ this.decKey[k + 1];\n c2 = T5[c >>> 24] ^ T6[(d >> 16) & 255] ^ T7[(a >> 8) & 255] ^ T8[b & 255] ^ this.decKey[k + 2];\n d = T5[d >>> 24] ^ T6[(a >> 16) & 255] ^ T7[(b >> 8) & 255] ^ T8[c & 255] ^ this.decKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[3 & -i] = (Si[a >>> 24] << 24\n ^ Si[(b >> 16) & 255] << 16\n ^ Si[(c >> 8) & 255] << 8\n ^ Si[d & 255]\n ^ this.decKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n return AES;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE = /** @class */ (function () {\n function AES_IGE(key, iv, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.key = getWords(key);\n this.iv = getWords(iv);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var prevX = this.iv.subarray(this.blockSize, this.iv.length);\n var prevY = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = text.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.encrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n cipherText[j] = y[k];\n }\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n var cipherText = getWords(message);\n var text = buf || new Uint32Array(cipherText.length);\n var prevY = this.iv.subarray(this.blockSize, this.iv.length);\n var prevX = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = cipherText.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.decrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n text[j] = y[k];\n }\n return text;\n };\n return AES_IGE;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE$1 = /** @class */ (function () {\n function AES_IGE(key, counter, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.offset = 0;\n this.key = getWords(key);\n this.counter = getWords(counter);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n if (this.counter.length !== 4) {\n throw new Error('AES-CTR mode counter must be 16 bytes length');\n }\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var offset = this.offset;\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = this.cipher.encrypt(this.counter);\n for (var j = i, k = offset; j < text.length && k < this.blockSize; j++, k++)\n cipherText[j] = x[k] ^ text[j];\n if (text.length - i >= this.blockSize)\n this.incrementCounter();\n if (offset) {\n i -= offset;\n offset = 0;\n }\n }\n this.offset = (this.offset + (text.length % 4)) % 4;\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n return this.encrypt(message, buf);\n };\n AES_IGE.prototype.incrementCounter = function () {\n // increment counter\n for (var carry = this.counter.length - 1; carry >= 0; carry--) {\n if (++this.counter[carry] < 0xFFFFFFFF)\n break; // If overflowing, it'll be 0 and we'll have to continue propagating the carry\n }\n };\n return AES_IGE;\n}());\n\nexport default AES;\nexport { AES_IGE$1 as CTR, AES_IGE as IGE };\n","let _level;\n\nclass Logger {\n static levels = ['error', 'warn', 'info', 'debug'];\n\n constructor(level) {\n if (!_level) {\n _level = level || 'debug';\n }\n\n this.isBrowser = typeof process === 'undefined'\n || process.type === 'renderer'\n || process.browser === true\n || process.__nwjs;\n if (!this.isBrowser) {\n this.colors = {\n start: '\\x1b[2m',\n warn: '\\x1b[35m',\n info: '\\x1b[33m',\n debug: '\\x1b[36m',\n error: '\\x1b[31m',\n end: '\\x1b[0m',\n };\n } else {\n this.colors = {\n start: '%c',\n warn: 'color : #ff00ff',\n info: 'color : #ffff00',\n debug: 'color : #00ffff',\n error: 'color : #ff0000',\n end: '',\n };\n }\n this.messageFormat = '[%t] [%l] - [%m]';\n }\n\n static setLevel(level) {\n _level = level;\n }\n\n /**\n *\n * @param level {string}\n * @returns {boolean}\n */\n canSend(level) {\n return (Logger.levels.indexOf(_level) >= Logger.levels.indexOf(level));\n }\n\n /**\n * @param message {string}\n */\n warn(message) {\n // todo remove later\n if (_level === 'debug') {\n // eslint-disable-next-line no-console\n console.error(new Error().stack);\n }\n this._log('warn', message, this.colors.warn);\n }\n\n /**\n * @param message {string}\n */\n info(message) {\n this._log('info', message, this.colors.info);\n }\n\n /**\n * @param message {string}\n */\n debug(message) {\n this._log('debug', message, this.colors.debug);\n }\n\n /**\n * @param message {string}\n */\n error(message) {\n // todo remove later\n if (_level === 'debug') {\n // eslint-disable-next-line no-console\n console.error(new Error().stack);\n }\n this._log('error', message, this.colors.error);\n }\n\n format(message, level) {\n return this.messageFormat.replace('%t', new Date().toISOString())\n .replace('%l', level.toUpperCase())\n .replace('%m', message);\n }\n\n /**\n * @param level {string}\n * @param message {string}\n * @param color {string}\n */\n _log(level, message, color) {\n if (!_level) {\n return;\n }\n if (this.canSend(level)) {\n if (!this.isBrowser) {\n // eslint-disable-next-line no-console\n console.log(color + this.format(message, level) + this.colors.end);\n } else {\n // eslint-disable-next-line no-console\n console.log(this.colors.start + this.format(message, level), color);\n }\n }\n }\n}\n\nmodule.exports = Logger;\n","const {\n RPCError,\n InvalidDCError,\n FloodError,\n BadRequestError,\n} = require('./RPCBaseErrors');\n\n\nclass UserMigrateError extends InvalidDCError {\n constructor(args) {\n const newDc = Number(args.capture || 0);\n // eslint-disable-next-line max-len\n super(`The user whose identity is being used to execute queries is associated with DC ${newDc}${RPCError._fmtRequest(args.request)}`);\n // eslint-disable-next-line max-len\n this.message = `The user whose identity is being used to execute queries is associated with DC ${newDc}${RPCError._fmtRequest(args.request)}`;\n this.newDc = newDc;\n }\n}\n\n\nclass PhoneMigrateError extends InvalidDCError {\n constructor(args) {\n const newDc = Number(args.capture || 0);\n // eslint-disable-next-line max-len\n super(`The phone number a user is trying to use for authorization is associated with DC ${newDc}${RPCError._fmtRequest(args.request)}`);\n // eslint-disable-next-line max-len\n this.message = `The phone number a user is trying to use for authorization is associated with DC ${newDc}${RPCError._fmtRequest(args.request)}`;\n this.newDc = newDc;\n }\n}\n\nclass SlowModeWaitError extends FloodError {\n constructor(args) {\n const seconds = Number(args.capture || 0);\n // eslint-disable-next-line max-len\n super(`A wait of ${seconds} seconds is required before sending another message in this chat${RPCError._fmtRequest(args.request)}`);\n // eslint-disable-next-line max-len\n this.message = `A wait of ${seconds} seconds is required before sending another message in this chat${RPCError._fmtRequest(args.request)}`;\n this.seconds = seconds;\n }\n}\n\nclass FloodWaitError extends FloodError {\n constructor(args) {\n const seconds = Number(args.capture || 0);\n super(`A wait of ${seconds} seconds is required${RPCError._fmtRequest(args.request)}`);\n this.message = `A wait of ${seconds} seconds is required${RPCError._fmtRequest(args.request)}`;\n this.seconds = seconds;\n }\n}\nclass MsgWaitError extends FloodError {\n constructor(args) {\n super(`Message failed to be sent.${RPCError._fmtRequest(args.request)}`);\n this.message = `Message failed to be sent.${RPCError._fmtRequest(args.request)}`;\n }\n}\n\nclass FloodTestPhoneWaitError extends FloodError {\n constructor(args) {\n const seconds = Number(args.capture || 0);\n super(`A wait of ${seconds} seconds is required in the test servers${RPCError._fmtRequest(args.request)}`);\n // eslint-disable-next-line max-len\n this.message = `A wait of ${seconds} seconds is required in the test servers${RPCError._fmtRequest(args.request)}`;\n this.seconds = seconds;\n }\n}\n\nclass FileMigrateError extends InvalidDCError {\n constructor(args) {\n const newDc = Number(args.capture || 0);\n super(`The file to be accessed is currently stored in DC ${newDc}${RPCError._fmtRequest(args.request)}`);\n // eslint-disable-next-line max-len\n this.message = `The file to be accessed is currently stored in DC ${newDc}${RPCError._fmtRequest(args.request)}`;\n this.newDc = newDc;\n }\n}\n\nclass NetworkMigrateError extends InvalidDCError {\n constructor(args) {\n const newDc = Number(args.capture || 0);\n super(`The source IP address is associated with DC ${newDc}${RPCError._fmtRequest(args.request)}`);\n this.message = `The source IP address is associated with DC ${newDc}${RPCError._fmtRequest(args.request)}`;\n this.newDc = newDc;\n }\n}\n\nclass EmailUnconfirmedError extends BadRequestError {\n constructor(args) {\n const codeLength = Number(args.capture || 0);\n super(`Email unconfirmed, the length of the code must be ${codeLength}${RPCError._fmtRequest(args.request)}`);\n // eslint-disable-next-line max-len\n this.message = `Email unconfirmed, the length of the code must be ${codeLength}${RPCError._fmtRequest(args.request)}`;\n this.codeLength = codeLength;\n }\n}\n\nconst rpcErrorRe = [\n [/FILE_MIGRATE_(\\d+)/, FileMigrateError],\n [/FLOOD_TEST_PHONE_WAIT_(\\d+)/, FloodTestPhoneWaitError],\n [/FLOOD_WAIT_(\\d+)/, FloodWaitError],\n [/MSG_WAIT_(.*)/, MsgWaitError],\n [/PHONE_MIGRATE_(\\d+)/, PhoneMigrateError],\n [/SLOWMODE_WAIT_(\\d+)/, SlowModeWaitError],\n [/USER_MIGRATE_(\\d+)/, UserMigrateError],\n [/NETWORK_MIGRATE_(\\d+)/, NetworkMigrateError],\n [/EMAIL_UNCONFIRMED_(\\d+)/, EmailUnconfirmedError],\n\n];\nmodule.exports = {\n rpcErrorRe,\n FileMigrateError,\n FloodTestPhoneWaitError,\n FloodWaitError,\n PhoneMigrateError,\n SlowModeWaitError,\n UserMigrateError,\n NetworkMigrateError,\n MsgWaitError,\n EmailUnconfirmedError,\n};\n","class Session {\n /**\n * Creates a clone of this session file\n * @param toInstance {Session|null}\n * @returns {Session}\n */\n\n /* CONTEST\n clone(toInstance = null) {\n return toInstance || new this.constructor()\n } */\n\n /**\n * Returns the currently-used data center ID.\n */\n get dcId() {\n throw new Error('Not Implemented');\n }\n\n /**\n * Returns the server address where the library should connect to.\n */\n get serverAddress() {\n throw new Error('Not Implemented');\n }\n\n /**\n * Returns the port to which the library should connect to.\n */\n get port() {\n throw new Error('Not Implemented');\n }\n\n /**\n * Returns an ``AuthKey`` instance associated with the saved\n * data center, or `None` if a new one should be generated.\n */\n get authKey() {\n throw new Error('Not Implemented');\n }\n\n /**\n * Sets the ``AuthKey`` to be used for the saved data center.\n * @param value\n */\n set authKey(value) {\n throw new Error('Not Implemented');\n }\n\n /**\n * Sets the information of the data center address and port that\n * the library should connect to, as well as the data center ID,\n * which is currently unused.\n * @param dcId {number}\n * @param serverAddress {string}\n * @param port {number}\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setDC(dcId, serverAddress, port) {\n throw new Error('Not implemented');\n }\n\n /**\n * Returns an ID of the takeout process initialized for this session,\n * or `None` if there's no were any unfinished takeout requests.\n */\n /* CONTEST\n get takeoutId() {\n throw new Error('Not Implemented')\n }\n */\n /**\n * Sets the ID of the unfinished takeout process for this session.\n * @param value\n */\n /* CONTEST\n set takeoutId(value) {\n throw new Error('Not Implemented')\n }\n */\n /**\n * Returns the ``UpdateState`` associated with the given `entity_id`.\n * If the `entity_id` is 0, it should return the ``UpdateState`` for\n * no specific channel (the \"general\" state). If no state is known\n * it should ``return None``.\n * @param entityId\n */\n /* CONTEST\n getUpdateState(entityId) {\n throw new Error('Not Implemented')\n }\n\n */\n\n /**\n * Sets the given ``UpdateState`` for the specified `entity_id`, which\n * should be 0 if the ``UpdateState`` is the \"general\" state (and not\n * for any specific channel).\n * @param entityId\n * @param state\n */\n /* CONTEST\n setUpdateState(entityId, state) {\n throw new Error('Not Implemented')\n }\n\n */\n\n /**\n * Called on client disconnection. Should be used to\n * free any used resources. Can be left empty if none.\n */\n\n /* CONTEST\n close() {\n\n }\n\n */\n\n /**\n * called whenever important properties change. It should\n * make persist the relevant session information to disk.\n */\n save() {\n throw new Error('Not Implemented');\n }\n\n /**\n * Called upon client.log_out(). Should delete the stored\n * information from disk since it's not valid anymore.\n */\n\n delete() {\n throw new Error('Not Implemented');\n }\n\n /**\n * Lists available sessions. Not used by the library itself.\n */\n /* CONTEST\n listSessions() {\n throw new Error('Not Implemented')\n }\n\n */\n\n /**\n * Processes the input ``TLObject`` or ``list`` and saves\n * whatever information is relevant (e.g., ID or access hash).\n * @param tlo\n */\n /* CONTEST\n processEntities(tlo) {\n throw new Error('Not Implemented')\n }\n\n */\n\n /**\n * Turns the given key into an ``InputPeer`` (e.g. ``InputPeerUser``).\n * The library uses this method whenever an ``InputPeer`` is needed\n * to suit several purposes (e.g. user only provided its ID or wishes\n * to use a cached username to avoid extra RPC).\n */\n /* CONTEST\n getInputEntity(key) {\n throw new Error('Not Implemented')\n }\n\n */\n}\n\nmodule.exports = Session;\n","const api = require('./api');\n\nconst LAYER = 131;\nconst tlobjects = {};\n\n\nfor (const tl of Object.values(api)) {\n if (tl.CONSTRUCTOR_ID) {\n tlobjects[tl.CONSTRUCTOR_ID] = tl;\n } else {\n for (const sub of Object.values(tl)) {\n tlobjects[sub.CONSTRUCTOR_ID] = sub;\n }\n }\n}\n\nmodule.exports = {\n LAYER,\n tlobjects,\n};\n","const MtProtoPlainSender = require('./MTProtoPlainSender');\nconst MTProtoState = require('./MTProtoState');\nconst Helpers = require('../Helpers');\nconst AuthKey = require('../crypto/AuthKey');\nconst { doAuthentication } = require('./Authenticator');\nconst RPCResult = require('../tl/core/RPCResult');\nconst MessageContainer = require('../tl/core/MessageContainer');\nconst GZIPPacked = require('../tl/core/GZIPPacked');\nconst RequestState = require('./RequestState');\n\nconst {\n MsgsAck,\n upload,\n MsgsStateInfo,\n Pong,\n} = require('../tl').constructors;\nconst MessagePacker = require('../extensions/MessagePacker');\nconst BinaryReader = require('../extensions/BinaryReader');\nconst { UpdateConnectionState, UpdateServerTimeOffset } = require('./index');\nconst { BadMessageError } = require('../errors/Common');\nconst {\n BadServerSalt,\n BadMsgNotification,\n MsgDetailedInfo,\n MsgNewDetailedInfo,\n NewSessionCreated,\n FutureSalts,\n MsgsStateReq,\n MsgResendReq,\n MsgsAllInfo,\n} = require('../tl').constructors;\nconst { SecurityError } = require('../errors/Common');\nconst { InvalidBufferError } = require('../errors/Common');\nconst { LogOut } = require('../tl').requests.auth;\nconst { RPCMessageToError } = require('../errors');\nconst { TypeNotFoundError } = require('../errors/Common');\n\n\n/**\n * MTProto Mobile Protocol sender\n * (https://core.telegram.org/mtproto/description)\n * This class is responsible for wrapping requests into `TLMessage`'s,\n * sending them over the network and receiving them in a safe manner.\n *\n * Automatic reconnection due to temporary network issues is a concern\n * for this class as well, including retry of messages that could not\n * be sent successfully.\n *\n * A new authorization key will be generated on connection if no other\n * key exists yet.\n */\nclass MTProtoSender {\n static DEFAULT_OPTIONS = {\n logger: undefined,\n retries: Infinity,\n delay: 2000,\n autoReconnect: true,\n connectTimeout: undefined,\n authKeyCallback: undefined,\n updateCallback: undefined,\n autoReconnectCallback: undefined,\n isMainSender: undefined,\n onConnectionBreak: undefined,\n };\n\n /**\n * @param authKey\n * @param opts\n */\n constructor(authKey, opts) {\n const args = { ...MTProtoSender.DEFAULT_OPTIONS, ...opts };\n this._connection = undefined;\n this._log = args.logger;\n this._dcId = args.dcId;\n this._retries = args.retries;\n this._delay = args.delay;\n this._autoReconnect = args.autoReconnect;\n this._connectTimeout = args.connectTimeout;\n this._authKeyCallback = args.authKeyCallback;\n this._updateCallback = args.updateCallback;\n this._autoReconnectCallback = args.autoReconnectCallback;\n this._isMainSender = args.isMainSender;\n this._onConnectionBreak = args.onConnectionBreak;\n\n\n /**\n * whether we disconnected ourself or telegram did it.\n */\n this.userDisconnected = false;\n\n /**\n * Whether the user has explicitly connected or disconnected.\n *\n * If a disconnection happens for any other reason and it\n * was *not* user action then the pending messages won't\n * be cleared but on explicit user disconnection all the\n * pending futures should be cancelled.\n */\n this._user_connected = false;\n this._reconnecting = false;\n this._disconnected = true;\n\n /**\n * We need to join the loops upon disconnection\n */\n this._send_loop_handle = undefined;\n this._recv_loop_handle = undefined;\n\n /**\n * Preserving the references of the AuthKey and state is important\n */\n this.authKey = authKey || new AuthKey();\n this._state = new MTProtoState(this.authKey, this._log);\n\n /**\n * Outgoing messages are put in a queue and sent in a batch.\n * Note that here we're also storing their ``_RequestState``.\n */\n this._send_queue = new MessagePacker(this._state, this._log);\n\n /**\n * Sent states are remembered until a response is received.\n */\n this._pending_state = {};\n\n /**\n * Responses must be acknowledged, and we can also batch these.\n */\n this._pending_ack = new Set();\n\n /**\n * Similar to pending_messages but only for the last acknowledges.\n * These can't go in pending_messages because no acknowledge for them\n * is received, but we may still need to resend their state on bad salts.\n */\n this._last_acks = [];\n\n /**\n * Jump table from response ID to method that handles it\n */\n\n this._handlers = {\n [RPCResult.CONSTRUCTOR_ID]: this._handleRPCResult.bind(this),\n [MessageContainer.CONSTRUCTOR_ID]: this._handleContainer.bind(this),\n [GZIPPacked.CONSTRUCTOR_ID]: this._handleGzipPacked.bind(this),\n [Pong.CONSTRUCTOR_ID]: this._handlePong.bind(this),\n [BadServerSalt.CONSTRUCTOR_ID]: this._handleBadServerSalt.bind(this),\n [BadMsgNotification.CONSTRUCTOR_ID]: this._handleBadNotification.bind(this),\n [MsgDetailedInfo.CONSTRUCTOR_ID]: this._handleDetailedInfo.bind(this),\n [MsgNewDetailedInfo.CONSTRUCTOR_ID]: this._handleNewDetailedInfo.bind(this),\n [NewSessionCreated.CONSTRUCTOR_ID]: this._handleNewSessionCreated.bind(this),\n [MsgsAck.CONSTRUCTOR_ID]: this._handleAck.bind(this),\n [FutureSalts.CONSTRUCTOR_ID]: this._handleFutureSalts.bind(this),\n [MsgsStateReq.CONSTRUCTOR_ID]: this._handleStateForgotten.bind(this),\n [MsgResendReq.CONSTRUCTOR_ID]: this._handleStateForgotten.bind(this),\n [MsgsAllInfo.CONSTRUCTOR_ID]: this._handleMsgAll.bind(this),\n };\n }\n\n // Public API\n\n /**\n * Connects to the specified given connection using the given auth key.\n * @param connection\n * @param [force]\n * @returns {Promise}\n */\n async connect(connection, force) {\n if (this._user_connected && !force) {\n this._log.info('User is already connected!');\n return false;\n }\n this.isConnecting = true;\n this._connection = connection;\n\n for (let attempt = 0; attempt < this._retries; attempt++) {\n try {\n await this._connect();\n if (this._updateCallback) {\n this._updateCallback(new UpdateConnectionState(UpdateConnectionState.connected));\n }\n break;\n } catch (err) {\n if (this._updateCallback && attempt === 0) {\n this._updateCallback(new UpdateConnectionState(UpdateConnectionState.disconnected));\n }\n this._log.error(`WebSocket connection failed attempt: ${attempt + 1}`);\n // eslint-disable-next-line no-console\n console.error(err);\n await Helpers.sleep(this._delay);\n }\n }\n this.isConnecting = false;\n return true;\n }\n\n isConnected() {\n return this._user_connected;\n }\n\n /**\n * Cleanly disconnects the instance from the network, cancels\n * all pending requests, and closes the send and receive loops.\n */\n async disconnect() {\n this.userDisconnected = true;\n await this._disconnect();\n }\n\n /**\n *\n This method enqueues the given request to be sent. Its send\n state will be saved until a response arrives, and a ``Future``\n that will be resolved when the response arrives will be returned:\n\n .. code-block:: javascript\n\n async def method():\n # Sending (enqueued for the send loop)\n future = sender.send(request)\n # Receiving (waits for the receive loop to read the result)\n result = await future\n\n Designed like this because Telegram may send the response at\n any point, and it can send other items while one waits for it.\n Once the response for this future arrives, it is set with the\n received result, quite similar to how a ``receive()`` call\n would otherwise work.\n\n Since the receiving part is \"built in\" the future, it's\n impossible to await receive a result that was never sent.\n * @param request\n * @returns {RequestState}\n */\n send(request) {\n if (!this._user_connected) {\n throw new Error('Cannot send requests while disconnected');\n }\n const state = new RequestState(request);\n this._send_queue.append(state);\n return state.promise;\n }\n\n /**\n * Same as send but returns the full state. usefull for invoke after logic\n * @param request\n * @return {RequestState}\n */\n sendWithInvokeSupport(request) {\n if (!this._user_connected) {\n throw new Error('Cannot send requests while disconnected');\n }\n const state = new RequestState(request, undefined, this._pending_state);\n this._send_queue.append(state);\n return state;\n }\n\n /**\n * Performs the actual connection, retrying, generating the\n * authorization key if necessary, and starting the send and\n * receive loops.\n * @returns {Promise}\n * @private\n */\n async _connect() {\n this._log.info('Connecting to {0}...'.replace('{0}', this._connection));\n await this._connection.connect();\n this._log.debug('Connection success!');\n // process.exit(0)\n if (!this.authKey.getKey()) {\n const plain = new MtProtoPlainSender(this._connection, this._log);\n this._log.debug('New auth_key attempt ...');\n const res = await doAuthentication(plain, this._log);\n this._log.debug('Generated new auth_key successfully');\n await this.authKey.setKey(res.authKey);\n\n this._state.timeOffset = res.timeOffset;\n\n if (this._updateCallback) {\n this._updateCallback(new UpdateServerTimeOffset(this._state.timeOffset));\n }\n\n /**\n * This is *EXTREMELY* important since we don't control\n * external references to the authorization key, we must\n * notify whenever we change it. This is crucial when we\n * switch to different data centers.\n */\n if (this._authKeyCallback) {\n await this._authKeyCallback(this.authKey, this._dcId);\n }\n } else {\n this._authenticated = true;\n this._log.debug('Already have an auth key ...');\n }\n this._user_connected = true;\n this._reconnecting = false;\n\n this._log.debug('Starting send loop');\n this._send_loop_handle = this._sendLoop();\n\n this._log.debug('Starting receive loop');\n this._recv_loop_handle = this._recvLoop();\n\n // _disconnected only completes after manual disconnection\n // or errors after which the sender cannot continue such\n // as failing to reconnect or any unexpected error.\n\n this._log.info('Connection to %s complete!'.replace('%s', this._connection.toString()));\n }\n\n async _disconnect() {\n this._send_queue.rejectAll();\n\n if (this._connection === undefined) {\n this._log.info('Not disconnecting (already have no connection)');\n return;\n }\n if (this._updateCallback) {\n this._updateCallback(new UpdateConnectionState(UpdateConnectionState.disconnected));\n }\n this._log.info('Disconnecting from %s...'.replace('%s', this._connection.toString()));\n this._user_connected = false;\n this._log.debug('Closing current connection...');\n await this._connection.disconnect();\n }\n\n /**\n * This loop is responsible for popping items off the send\n * queue, encrypting them, and sending them over the network.\n * Besides `connect`, only this method ever sends data.\n * @returns {Promise}\n * @private\n */\n async _sendLoop() {\n this._send_queue = new MessagePacker(this._state, this._log);\n\n while (this._user_connected && !this._reconnecting) {\n if (this._pending_ack.size) {\n const ack = new RequestState(new MsgsAck({ msgIds: Array(...this._pending_ack) }));\n this._send_queue.append(ack);\n this._last_acks.push(ack);\n this._pending_ack.clear();\n }\n this._log.debug(`Waiting for messages to send...${this._reconnecting}`);\n // TODO Wait for the connection send queue to be empty?\n // This means that while it's not empty we can wait for\n // more messages to be added to the send queue.\n const res = await this._send_queue.get();\n\n if (this._reconnecting) {\n return;\n }\n\n if (!res) {\n continue;\n }\n let { data } = res;\n const { batch } = res;\n this._log.debug(`Encrypting ${batch.length} message(s) in ${data.length} bytes for sending`);\n\n data = await this._state.encryptMessageData(data);\n\n try {\n await this._connection.send(data);\n } catch (e) {\n this._log.error(e);\n this._log.info('Connection closed while sending data');\n return;\n }\n for (const state of batch) {\n if (!Array.isArray(state)) {\n if (state.request.classType === 'request') {\n this._pending_state[state.msgId] = state;\n }\n } else {\n for (const s of state) {\n if (s.request.classType === 'request') {\n this._pending_state[s.msgId] = s;\n }\n }\n }\n }\n this._log.debug('Encrypted messages put in a queue to be sent');\n }\n }\n\n async _recvLoop() {\n let body;\n let message;\n\n while (this._user_connected && !this._reconnecting) {\n // this._log.debug('Receiving items from the network...');\n this._log.debug('Receiving items from the network...');\n try {\n body = await this._connection.recv();\n } catch (e) {\n // this._log.info('Connection closed while receiving data');\n /** when the server disconnects us we want to reconnect */\n if (!this.userDisconnected) {\n this._log.error(e);\n this._log.warn('Connection closed while receiving data');\n this.reconnect();\n }\n return;\n }\n try {\n message = await this._state.decryptMessageData(body);\n } catch (e) {\n if (e instanceof TypeNotFoundError) {\n // Received object which we don't know how to deserialize\n this._log.info(`Type ${e.invalidConstructorId} not found, remaining data ${e.remaining}`);\n continue;\n } else if (e instanceof SecurityError) {\n // A step while decoding had the incorrect data. This message\n // should not be considered safe and it should be ignored.\n this._log.warn(`Security error while unpacking a received message: ${e}`);\n continue;\n } else if (e instanceof InvalidBufferError) {\n // 404 means that the server has \"forgotten\" our auth key and we need to create a new one.\n if (e.code === 404) {\n this._log.warn(`Broken authorization key for dc ${this._dcId}; resetting`);\n if (this._updateCallback && this._isMainSender) {\n this._updateCallback(new UpdateConnectionState(UpdateConnectionState.broken));\n } else if (this._onConnectionBreak && !this._isMainSender) {\n // Deletes the current sender from the object\n this._onConnectionBreak(this._dcId);\n }\n } else {\n // this happens sometimes when telegram is having some internal issues.\n // reconnecting should be enough usually\n // since the data we sent and received is probably wrong now.\n this._log.warn(`Invalid buffer ${e.code} for dc ${this._dcId}`);\n this.reconnect();\n }\n return;\n } else {\n this._log.error('Unhandled error while receiving data');\n this._log.error(e);\n this.reconnect();\n return;\n }\n }\n try {\n await this._processMessage(message);\n } catch (e) {\n this._log.error('Unhandled error while receiving data');\n this._log.error(e);\n }\n }\n }\n\n // Response Handlers\n\n /**\n * Adds the given message to the list of messages that must be\n * acknowledged and dispatches control to different ``_handle_*``\n * method based on its type.\n * @param message\n * @returns {Promise}\n * @private\n */\n async _processMessage(message) {\n this._pending_ack.add(message.msgId);\n // eslint-disable-next-line require-atomic-updates\n message.obj = await message.obj;\n let handler = this._handlers[message.obj.CONSTRUCTOR_ID];\n if (!handler) {\n handler = this._handleUpdate.bind(this);\n }\n\n await handler(message);\n }\n\n /**\n * Pops the states known to match the given ID from pending messages.\n * This method should be used when the response isn't specific.\n * @param msgId\n * @returns {*[]}\n * @private\n */\n _popStates(msgId) {\n let state = this._pending_state[msgId];\n if (state) {\n this._pending_state[msgId].deferred.resolve();\n delete this._pending_state[msgId];\n return [state];\n }\n\n const toPop = [];\n\n for (state of Object.values(this._pending_state)) {\n if (state.containerId && state.containerId.equals(msgId)) {\n toPop.push(state.msgId);\n }\n }\n\n if (toPop.length) {\n const temp = [];\n for (const x of toPop) {\n temp.push(this._pending_state[x]);\n this._pending_state[x].deferred.resolve();\n delete this._pending_state[x];\n }\n return temp;\n }\n\n for (const ack of this._last_acks) {\n if (ack.msgId === msgId) {\n return [ack];\n }\n }\n\n return [];\n }\n\n /**\n * Handles the result for Remote Procedure Calls:\n * rpc_result#f35c6d01 req_msg_id:long result:bytes = RpcResult;\n * This is where the future results for sent requests are set.\n * @param message\n * @returns {Promise}\n * @private\n */\n _handleRPCResult(message) {\n const result = message.obj;\n const state = this._pending_state[result.reqMsgId];\n if (state) {\n state.deferred.resolve();\n delete this._pending_state[result.reqMsgId];\n }\n this._log.debug(`Handling RPC result for message ${result.reqMsgId}`);\n\n if (!state) {\n // TODO We should not get responses to things we never sent\n // However receiving a File() with empty bytes is \"common\".\n // See #658, #759 and #958. They seem to happen in a container\n // which contain the real response right after.\n try {\n const reader = new BinaryReader(result.body);\n if (!(reader.tgReadObject() instanceof upload.File)) {\n throw new TypeNotFoundError('Not an upload.File');\n }\n } catch (e) {\n this._log.error(e);\n if (e instanceof TypeNotFoundError) {\n this._log.info(`Received response without parent request: ${result.body}`);\n return;\n } else {\n throw e;\n }\n }\n }\n if (result.error) {\n // eslint-disable-next-line new-cap\n const error = RPCMessageToError(result.error, state.request);\n this._send_queue.append(new RequestState(new MsgsAck({ msgIds: [state.msgId] })));\n state.reject(error);\n } else {\n const reader = new BinaryReader(result.body);\n const read = state.request.readResult(reader);\n state.resolve(read);\n }\n }\n\n /**\n * Processes the inner messages of a container with many of them:\n * msg_container#73f1f8dc messages:vector<%Message> = MessageContainer;\n * @param message\n * @returns {Promise}\n * @private\n */\n async _handleContainer(message) {\n this._log.debug('Handling container');\n for (const innerMessage of message.obj.messages) {\n await this._processMessage(innerMessage);\n }\n }\n\n /**\n * Unpacks the data from a gzipped object and processes it:\n * gzip_packed#3072cfa1 packed_data:bytes = Object;\n * @param message\n * @returns {Promise}\n * @private\n */\n async _handleGzipPacked(message) {\n this._log.debug('Handling gzipped data');\n const reader = new BinaryReader(message.obj.data);\n message.obj = reader.tgReadObject();\n await this._processMessage(message);\n }\n\n _handleUpdate(message) {\n if (message.obj.SUBCLASS_OF_ID !== 0x8af52aac) {\n // crc32(b'Updates')\n this._log.warn(`Note: ${message.obj.className} is not an update, not dispatching it`);\n return;\n }\n this._log.debug(`Handling update ${message.obj.className}`);\n if (this._updateCallback) {\n this._updateCallback(message.obj);\n }\n }\n\n /**\n * Handles pong results, which don't come inside a ``RPCResult``\n * but are still sent through a request:\n * pong#347773c5 msg_id:long ping_id:long = Pong;\n * @param message\n * @returns {Promise}\n * @private\n */\n _handlePong(message) {\n const pong = message.obj;\n\n const newTimeOffset = this._state.updateTimeOffset(message.msgId);\n if (this._updateCallback) {\n this._updateCallback(new UpdateServerTimeOffset(newTimeOffset));\n }\n\n this._log.debug(`Handling pong for message ${pong.msgId}`);\n const state = this._pending_state[pong.msgId];\n this._pending_state[pong.msgId].deferred.resolve();\n delete this._pending_state[pong.msgId];\n\n // Todo Check result\n if (state) {\n state.resolve(pong);\n }\n }\n\n /**\n * Corrects the currently used server salt to use the right value\n * before enqueuing the rejected message to be re-sent:\n * bad_server_salt#edab447b bad_msg_id:long bad_msg_seqno:int\n * error_code:int new_server_salt:long = BadMsgNotification;\n * @param message\n * @returns {Promise}\n * @private\n */\n _handleBadServerSalt(message) {\n const badSalt = message.obj;\n this._log.debug(`Handling bad salt for message ${badSalt.badMsgId}`);\n this._state.salt = badSalt.newServerSalt;\n const states = this._popStates(badSalt.badMsgId);\n this._send_queue.extend(states);\n this._log.debug(`${states.length} message(s) will be resent`);\n }\n\n /**\n * Adjusts the current state to be correct based on the\n * received bad message notification whenever possible:\n * bad_msg_notification#a7eff811 bad_msg_id:long bad_msg_seqno:int\n * error_code:int = BadMsgNotification;\n * @param message\n * @returns {Promise}\n * @private\n */\n _handleBadNotification(message) {\n const badMsg = message.obj;\n const states = this._popStates(badMsg.badMsgId);\n this._log.debug(`Handling bad msg ${JSON.stringify(badMsg)}`);\n if ([16, 17].includes(badMsg.errorCode)) {\n // Sent msg_id too low or too high (respectively).\n // Use the current msg_id to determine the right time offset.\n const newTimeOffset = this._state.updateTimeOffset(message.msgId);\n\n if (this._updateCallback) {\n this._updateCallback(new UpdateServerTimeOffset(newTimeOffset));\n }\n\n this._log.info(`System clock is wrong, set time offset to ${newTimeOffset}s`);\n } else if (badMsg.errorCode === 32) {\n // msg_seqno too low, so just pump it up by some \"large\" amount\n // TODO A better fix would be to start with a new fresh session ID\n this._state._sequence += 64;\n } else if (badMsg.errorCode === 33) {\n // msg_seqno too high never seems to happen but just in case\n this._state._sequence -= 16;\n } else {\n for (const state of states) {\n state.reject(new BadMessageError(state.request, badMsg.errorCode));\n }\n\n return;\n }\n // Messages are to be re-sent once we've corrected the issue\n this._send_queue.extend(states);\n this._log.debug(`${states.length} messages will be resent due to bad msg`);\n }\n\n /**\n * Updates the current status with the received detailed information:\n * msg_detailed_info#276d3ec6 msg_id:long answer_msg_id:long\n * bytes:int status:int = MsgDetailedInfo;\n * @param message\n * @returns {Promise}\n * @private\n */\n _handleDetailedInfo(message) {\n // TODO https://goo.gl/VvpCC6\n const msgId = message.obj.answerMsgId;\n this._log.debug(`Handling detailed info for message ${msgId}`);\n this._pending_ack.add(msgId);\n }\n\n /**\n * Updates the current status with the received detailed information:\n * msg_new_detailed_info#809db6df answer_msg_id:long\n * bytes:int status:int = MsgDetailedInfo;\n * @param message\n * @returns {Promise}\n * @private\n */\n _handleNewDetailedInfo(message) {\n // TODO https://goo.gl/VvpCC6\n const msgId = message.obj.answerMsgId;\n this._log.debug(`Handling new detailed info for message ${msgId}`);\n this._pending_ack.add(msgId);\n }\n\n /**\n * Updates the current status with the received session information:\n * new_session_created#9ec20908 first_msg_id:long unique_id:long\n * server_salt:long = NewSession;\n * @param message\n * @returns {Promise}\n * @private\n */\n _handleNewSessionCreated(message) {\n // TODO https://goo.gl/LMyN7A\n this._log.debug('Handling new session created');\n this._state.salt = message.obj.serverSalt;\n }\n\n /**\n * Handles a server acknowledge about our messages. Normally\n * these can be ignored except in the case of ``auth.logOut``:\n *\n * auth.logOut#5717da40 = Bool;\n *\n * Telegram doesn't seem to send its result so we need to confirm\n * it manually. No other request is known to have this behaviour.\n\n * Since the ID of sent messages consisting of a container is\n * never returned (unless on a bad notification), this method\n * also removes containers messages when any of their inner\n * messages are acknowledged.\n\n * @param message\n * @returns {Promise}\n * @private\n */\n _handleAck(message) {\n const ack = message.obj;\n this._log.debug(`Handling acknowledge for ${ack.msgIds}`);\n for (const msgId of ack.msgIds) {\n const state = this._pending_state[msgId];\n if (state && state.request instanceof LogOut) {\n this._pending_state[msgId].deferred.resolve();\n delete this._pending_state[msgId];\n state.resolve(true);\n }\n }\n }\n\n /**\n * Handles future salt results, which don't come inside a\n * ``rpc_result`` but are still sent through a request:\n * future_salts#ae500895 req_msg_id:long now:int\n * salts:vector = FutureSalts;\n * @param message\n * @returns {Promise}\n * @private\n */\n _handleFutureSalts(message) {\n // TODO save these salts and automatically adjust to the\n // correct one whenever the salt in use expires.\n this._log.debug(`Handling future salts for message ${message.msgId}`);\n const state = this._pending_state[message.msgId];\n\n if (state) {\n this._pending_state[message].deferred.resolve();\n delete this._pending_state[message];\n state.resolve(message.obj);\n }\n }\n\n /**\n * Handles both :tl:`MsgsStateReq` and :tl:`MsgResendReq` by\n * enqueuing a :tl:`MsgsStateInfo` to be sent at a later point.\n * @param message\n * @returns {Promise}\n * @private\n */\n _handleStateForgotten(message) {\n this._send_queue.append(\n new RequestState(new MsgsStateInfo(message.msgId, String.fromCharCode(1)\n .repeat(message.obj.msgIds))),\n );\n }\n\n /**\n * Handles :tl:`MsgsAllInfo` by doing nothing (yet).\n * used as part of the telegram protocol https://core.telegram.org/mtproto/service_messages_about_messages\n * This message does not require an acknowledgment.\n * @param message\n * @returns {Promise}\n * @private\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _handleMsgAll(message) {\n }\n\n reconnect() {\n if (this._user_connected && !this._reconnecting) {\n this._reconnecting = true;\n // TODO Should we set this?\n // this._user_connected = false\n // we want to wait a second between each reconnect try to not flood the server with reconnects\n // in case of internal server issues.\n Helpers.sleep(1000).then(() => {\n this._log.info('Started reconnecting');\n this._reconnect();\n });\n }\n }\n\n async _reconnect() {\n this._log.debug('Closing current connection...');\n try {\n await this._disconnect();\n } catch (err) {\n this._log.warn(err);\n }\n\n this._send_queue.append(undefined);\n this._state.reset();\n\n // For some reason reusing existing connection caused stuck requests\n const newConnection = new this._connection.constructor(\n this._connection._ip,\n this._connection._port,\n this._connection._dcId,\n this._connection._log,\n );\n await this.connect(newConnection, true);\n\n this._reconnecting = false;\n // uncomment this if you want to resend\n // this._send_queue.extend(Object.values(this._pending_state))\n for (const state of Object.values(this._pending_state)) {\n state.deferred.resolve();\n }\n this._pending_state = {};\n if (this._autoReconnectCallback) {\n await this._autoReconnectCallback();\n }\n }\n}\n\nmodule.exports = MTProtoSender;\n","/**\n * This module contains the class used to communicate with Telegram's servers\n * in plain text, when no authorization key has been created yet.\n */\nconst BigInt = require('big-integer');\nconst MTProtoState = require('./MTProtoState');\nconst BinaryReader = require('../extensions/BinaryReader');\nconst { InvalidBufferError } = require('../errors/Common');\nconst { toSignedLittleBuffer } = require('../Helpers');\n\n/**\n * MTProto Mobile Protocol plain sender (https://core.telegram.org/mtproto/description#unencrypted-messages)\n */\n\nclass MTProtoPlainSender {\n /**\n * Initializes the MTProto plain sender.\n * @param connection connection: the Connection to be used.\n * @param loggers\n */\n constructor(connection, loggers) {\n this._state = new MTProtoState(connection, loggers);\n this._connection = connection;\n }\n\n /**\n * Sends and receives the result for the given request.\n * @param request\n */\n async send(request) {\n let body = request.getBytes();\n let msgId = this._state._getNewMsgId();\n const m = toSignedLittleBuffer(msgId, 8);\n const b = Buffer.alloc(4);\n b.writeInt32LE(body.length, 0);\n\n const res = Buffer.concat([Buffer.concat([Buffer.alloc(8), m, b]), body]);\n\n await this._connection.send(res);\n body = await this._connection.recv();\n if (body.length < 8) {\n throw new InvalidBufferError(body);\n }\n const reader = new BinaryReader(body);\n const authKeyId = reader.readLong();\n if (authKeyId.neq(BigInt(0))) {\n throw new Error('Bad authKeyId');\n }\n msgId = reader.readLong();\n if (msgId.eq(BigInt(0))) {\n throw new Error('Bad msgId');\n }\n /** ^ We should make sure that the read ``msg_id`` is greater\n * than our own ``msg_id``. However, under some circumstances\n * (bad system clock/working behind proxies) this seems to not\n * be the case, which would cause endless assertion errors.\n */\n\n const length = reader.readInt();\n if (length <= 0) {\n throw new Error('Bad length');\n }\n /**\n * We could read length bytes and use those in a new reader to read\n * the next TLObject without including the padding, but since the\n * reader isn't used for anything else after this, it's unnecessary.\n */\n return reader.tgReadObject();\n }\n}\n\nmodule.exports = MTProtoPlainSender;\n","const BigInt = require('big-integer');\n\nconst Helpers = require('../Helpers');\nconst IGE = require('../crypto/IGE');\nconst BinaryReader = require('../extensions/BinaryReader');\nconst GZIPPacked = require('../tl/core/GZIPPacked');\nconst { TLMessage } = require('../tl/core');\nconst {\n SecurityError,\n InvalidBufferError,\n} = require('../errors/Common');\nconst { InvokeAfterMsg } = require('../tl').requests;\nconst {\n toSignedLittleBuffer,\n} = require('../Helpers');\n\nclass MTProtoState {\n /**\n *\n `telethon.network.mtprotosender.MTProtoSender` needs to hold a state\n in order to be able to encrypt and decrypt incoming/outgoing messages,\n as well as generating the message IDs. Instances of this class hold\n together all the required information.\n\n It doesn't make sense to use `telethon.sessions.abstract.Session` for\n the sender because the sender should *not* be concerned about storing\n this information to disk, as one may create as many senders as they\n desire to any other data center, or some CDN. Using the same session\n for all these is not a good idea as each need their own authkey, and\n the concept of \"copying\" sessions with the unnecessary entities or\n updates state for these connections doesn't make sense.\n\n While it would be possible to have a `MTProtoPlainState` that does no\n encryption so that it was usable through the `MTProtoLayer` and thus\n avoid the need for a `MTProtoPlainSender`, the `MTProtoLayer` is more\n focused to efficiency and this state is also more advanced (since it\n supports gzipping and invoking after other message IDs). There are too\n many methods that would be needed to make it convenient to use for the\n authentication process, at which point the `MTProtoPlainSender` is better\n * @param authKey\n * @param loggers\n */\n constructor(authKey, loggers) {\n this.authKey = authKey;\n this._log = loggers;\n this.timeOffset = 0;\n this.salt = 0;\n\n this.id = undefined;\n this._sequence = undefined;\n this._lastMsgId = undefined;\n this.reset();\n }\n\n /**\n * Resets the state\n */\n reset() {\n // Session IDs can be random on every connection\n this.id = Helpers.generateRandomLong(true);\n this._sequence = 0;\n this._lastMsgId = BigInt(0);\n }\n\n /**\n * Updates the message ID to a new one,\n * used when the time offset changed.\n * @param message\n */\n updateMessageId(message) {\n message.msgId = this._getNewMsgId();\n }\n\n /**\n * Calculate the key based on Telegram guidelines, specifying whether it's the client or not\n * @param authKey\n * @param msgKey\n * @param client\n * @returns {{iv: Buffer, key: Buffer}}\n */\n async _calcKey(authKey, msgKey, client) {\n const x = client === true ? 0 : 8;\n const [sha256a, sha256b] = await Promise.all([\n Helpers.sha256(Buffer.concat([msgKey, authKey.slice(x, x + 36)])),\n Helpers.sha256(Buffer.concat([authKey.slice(x + 40, x + 76), msgKey])),\n ]);\n const key = Buffer.concat([sha256a.slice(0, 8), sha256b.slice(8, 24), sha256a.slice(24, 32)]);\n const iv = Buffer.concat([sha256b.slice(0, 8), sha256a.slice(8, 24), sha256b.slice(24, 32)]);\n return {\n key,\n iv,\n };\n }\n\n /**\n * Writes a message containing the given data into buffer.\n * Returns the message id.\n * @param buffer\n * @param data\n * @param contentRelated\n * @param afterId\n */\n async writeDataAsMessage(buffer, data, contentRelated, afterId) {\n const msgId = this._getNewMsgId();\n const seqNo = this._getSeqNo(contentRelated);\n let body;\n if (!afterId) {\n body = await GZIPPacked.gzipIfSmaller(contentRelated, data);\n } else {\n // Invoke query expects a query with a getBytes func\n body = await GZIPPacked.gzipIfSmaller(contentRelated, new InvokeAfterMsg(afterId, {\n getBytes() {\n return data;\n },\n }).getBytes());\n }\n const s = Buffer.alloc(4);\n s.writeInt32LE(seqNo, 0);\n const b = Buffer.alloc(4);\n b.writeInt32LE(body.length, 0);\n const m = toSignedLittleBuffer(msgId, 8);\n buffer.write(Buffer.concat([m, s, b]));\n buffer.write(body);\n return msgId;\n }\n\n /**\n * Encrypts the given message data using the current authorization key\n * following MTProto 2.0 guidelines core.telegram.org/mtproto/description.\n * @param data\n */\n async encryptMessageData(data) {\n await this.authKey.waitForKey();\n const s = toSignedLittleBuffer(this.salt, 8);\n const i = toSignedLittleBuffer(this.id, 8);\n data = Buffer.concat([Buffer.concat([s, i]), data]);\n const padding = Helpers.generateRandomBytes(Helpers.mod(-(data.length + 12), 16) + 12);\n // Being substr(what, offset, length); x = 0 for client\n // \"msg_key_large = SHA256(substr(auth_key, 88+x, 32) + pt + padding)\"\n const msgKeyLarge = await Helpers.sha256(Buffer.concat([this.authKey.getKey()\n .slice(88, 88 + 32), data, padding]));\n // \"msg_key = substr (msg_key_large, 8, 16)\"\n const msgKey = msgKeyLarge.slice(8, 24);\n\n const {\n iv,\n key,\n } = await this._calcKey(this.authKey.getKey(), msgKey, true);\n\n const keyId = Helpers.readBufferFromBigInt(this.authKey.keyId, 8);\n return Buffer.concat([keyId, msgKey, new IGE(key, iv).encryptIge(Buffer.concat([data, padding]))]);\n }\n\n /**\n * Inverse of `encrypt_message_data` for incoming server messages.\n * @param body\n */\n async decryptMessageData(body) {\n if (body.length < 8) {\n throw new InvalidBufferError(body);\n }\n if (body.length < 0) { // length needs to be positive\n throw new SecurityError('Server replied with negative length');\n }\n if (body.length % 4 !== 0) {\n throw new SecurityError('Server replied with length not divisible by 4');\n }\n // TODO Check salt,sessionId, and sequenceNumber\n const keyId = Helpers.readBigIntFromBuffer(body.slice(0, 8));\n if (keyId.neq(this.authKey.keyId)) {\n throw new SecurityError('Server replied with an invalid auth key');\n }\n\n const msgKey = body.slice(8, 24);\n const {\n iv,\n key,\n } = await this._calcKey(this.authKey.getKey(), msgKey, false);\n body = new IGE(key, iv).decryptIge(body.slice(24));\n\n // https://core.telegram.org/mtproto/security_guidelines\n // Sections \"checking sha256 hash\" and \"message length\"\n\n const ourKey = await Helpers.sha256(Buffer.concat([this.authKey.getKey()\n .slice(96, 96 + 32), body]));\n\n if (!msgKey.equals(ourKey.slice(8, 24))) {\n throw new SecurityError('Received msg_key doesn\\'t match with expected one');\n }\n\n const reader = new BinaryReader(body);\n reader.readLong(); // removeSalt\n const serverId = reader.readLong();\n if (!serverId.eq(this.id)) {\n throw new SecurityError('Server replied with a wrong session ID');\n }\n\n const remoteMsgId = reader.readLong();\n const remoteSequence = reader.readInt();\n const containerLen = reader.readInt(); // msgLen for the inner object, padding ignored\n const diff = body.length - containerLen;\n // We want to check if it's between 12 and 1024\n // https://core.telegram.org/mtproto/security_guidelines#checking-message-length\n if (diff < 12 || diff > 1024) {\n throw new SecurityError('Server replied with the wrong message padding');\n }\n\n // We could read msg_len bytes and use those in a new reader to read\n // the next TLObject without including the padding, but since the\n // reader isn't used for anything else after this, it's unnecessary.\n const obj = reader.tgReadObject();\n\n return new TLMessage(remoteMsgId, remoteSequence, obj);\n }\n\n /**\n * Generates a new unique message ID based on the current\n * time (in ms) since epoch, applying a known time offset.\n * @private\n */\n _getNewMsgId() {\n const now = new Date().getTime() / 1000 + this.timeOffset;\n const nanoseconds = Math.floor((now - Math.floor(now)) * 1e9);\n let newMsgId = (BigInt(Math.floor(now))\n .shiftLeft(BigInt(32))).or(BigInt(nanoseconds)\n .shiftLeft(BigInt(2)));\n if (this._lastMsgId.greaterOrEquals(newMsgId)) {\n newMsgId = this._lastMsgId.add(BigInt(4));\n }\n this._lastMsgId = newMsgId;\n return newMsgId;\n }\n\n /**\n * Updates the time offset to the correct\n * one given a known valid message ID.\n * @param correctMsgId {BigInteger}\n */\n updateTimeOffset(correctMsgId) {\n const bad = this._getNewMsgId();\n const old = this.timeOffset;\n const now = Math.floor(new Date().getTime() / 1000);\n const correct = correctMsgId.shiftRight(BigInt(32));\n this.timeOffset = correct - now;\n\n if (this.timeOffset !== old) {\n this._lastMsgId = BigInt(0);\n this._log.debug(\n `Updated time offset (old offset ${old}, bad ${bad}, good ${correctMsgId}, new ${this.timeOffset})`,\n );\n }\n\n return this.timeOffset;\n }\n\n /**\n * Generates the next sequence number depending on whether\n * it should be for a content-related query or not.\n * @param contentRelated\n * @private\n */\n _getSeqNo(contentRelated) {\n if (contentRelated) {\n const result = this._sequence * 2 + 1;\n this._sequence += 1;\n return result;\n } else {\n return this._sequence * 2;\n }\n }\n}\n\nmodule.exports = MTProtoState;\n","const { IGE: AESIGE } = require('@cryptography/aes');\nconst Helpers = require('../Helpers');\n\n\nclass IGENEW {\n constructor(key, iv) {\n this.ige = new AESIGE(key, iv);\n }\n\n /**\n * Decrypts the given text in 16-bytes blocks by using the given key and 32-bytes initialization vector\n * @param cipherText {Buffer}\n * @returns {Buffer}\n */\n decryptIge(cipherText) {\n return Helpers.convertToLittle(this.ige.decrypt(cipherText));\n }\n\n /**\n * Encrypts the given text in 16-bytes blocks by using the given key and 32-bytes initialization vector\n * @param plainText {Buffer}\n * @returns {Buffer}\n */\n encryptIge(plainText) {\n const padding = plainText.length % 16;\n if (padding) {\n plainText = Buffer.concat([plainText, Helpers.generateRandomBytes(16 - padding)]);\n }\n\n return Helpers.convertToLittle(this.ige.encrypt(plainText));\n }\n}\n\nmodule.exports = IGENEW;\n","const TLMessage = require('./TLMessage');\nconst RPCResult = require('./RPCResult');\nconst MessageContainer = require('./MessageContainer');\nconst GZIPPacked = require('./GZIPPacked');\n\nconst coreObjects = {\n [RPCResult.CONSTRUCTOR_ID]: RPCResult,\n [GZIPPacked.CONSTRUCTOR_ID]: GZIPPacked,\n [MessageContainer.CONSTRUCTOR_ID]: MessageContainer,\n};\n\nmodule.exports = {\n TLMessage,\n RPCResult,\n MessageContainer,\n GZIPPacked,\n coreObjects,\n};\n","const { RpcError } = require('../index').constructors;\nconst GZIPPacked = require('./GZIPPacked');\n\nclass RPCResult {\n static CONSTRUCTOR_ID = 0xf35c6d01;\n\n static classType = 'constructor';\n\n constructor(reqMsgId, body, error) {\n this.CONSTRUCTOR_ID = 0xf35c6d01;\n this.reqMsgId = reqMsgId;\n this.body = body;\n this.error = error;\n this.classType = 'constructor';\n }\n\n static async fromReader(reader) {\n const msgId = reader.readLong();\n const innerCode = reader.readInt(false);\n if (innerCode === RpcError.CONSTRUCTOR_ID) {\n return new RPCResult(msgId, undefined, RpcError.fromReader(reader));\n }\n if (innerCode === GZIPPacked.CONSTRUCTOR_ID) {\n return new RPCResult(msgId, (await GZIPPacked.fromReader(reader)).data);\n }\n reader.seek(-4);\n // This reader.read() will read more than necessary, but it's okay.\n // We could make use of MessageContainer's length here, but since\n // it's not necessary we don't need to care about it.\n return new RPCResult(msgId, reader.read(), undefined);\n }\n}\n\nmodule.exports = RPCResult;\n","const MessageContainer = require('../tl/core/MessageContainer');\nconst TLMessage = require('../tl/core/TLMessage');\nconst BinaryWriter = require('../extensions/BinaryWriter');\n\nconst USE_INVOKE_AFTER_WITH = [\n 'messages.SendMessage', 'messages.SendMedia', 'messages.SendMultiMedia',\n 'messages.ForwardMessages', 'messages.SendInlineBotResult',\n];\n\nclass MessagePacker {\n constructor(state, logger) {\n this._state = state;\n this._queue = [];\n this._pendingStates = [];\n this._ready = new Promise(((resolve) => {\n this.setReady = resolve;\n }));\n this._log = logger;\n }\n\n values() {\n return this._queue;\n }\n\n append(state) {\n // we need to check if there is already a request with the same name that we should send after.\n if (state && USE_INVOKE_AFTER_WITH.includes(state.request.className)) {\n // we now need to check if there is any request in queue already.\n // we loop backwards since the latest request is the most recent\n for (let i = this._queue.length - 1; i >= 0; i--) {\n if (USE_INVOKE_AFTER_WITH.includes(this._queue[i].request.className)) {\n state.after = this._queue[i];\n break;\n }\n }\n }\n\n\n this._queue.push(state);\n this.setReady(true);\n\n if (state) {\n this._pendingStates.push(state);\n state.promise\n // Using finally causes triggering `unhandledrejection` event\n .catch(() => {\n })\n .finally(() => {\n this._pendingStates = this._pendingStates.filter((s) => s !== state);\n });\n }\n }\n\n extend(states) {\n for (const state of states) {\n this._queue.push(state);\n }\n this.setReady(true);\n }\n\n async get() {\n if (!this._queue.length) {\n this._ready = new Promise(((resolve) => {\n this.setReady = resolve;\n }));\n await this._ready;\n }\n if (!this._queue[this._queue.length - 1]) {\n this._queue = [];\n return undefined;\n }\n let data;\n let buffer = new BinaryWriter(Buffer.alloc(0));\n\n const batch = [];\n let size = 0;\n\n while (this._queue.length && batch.length <= MessageContainer.MAXIMUM_LENGTH) {\n const state = this._queue.shift();\n size += state.data.length + TLMessage.SIZE_OVERHEAD;\n if (size <= MessageContainer.MAXIMUM_SIZE) {\n let afterId;\n if (state.after) {\n afterId = state.after.msgId;\n }\n state.msgId = await this._state.writeDataAsMessage(\n buffer, state.data, state.request.classType === 'request',\n afterId,\n );\n this._log.debug(`Assigned msgId = ${state.msgId} to ${state.request.className\n || state.request.constructor.name}`);\n batch.push(state);\n continue;\n }\n if (batch.length) {\n this._queue.unshift(state);\n break;\n }\n this._log.warn(`Message payload for ${state.request.className\n || state.request.constructor.name} is too long ${state.data.length} and cannot be sent`);\n state.reject('Request Payload is too big');\n size = 0;\n }\n if (!batch.length) {\n return undefined;\n }\n if (batch.length > 1) {\n const b = Buffer.alloc(8);\n b.writeUInt32LE(MessageContainer.CONSTRUCTOR_ID, 0);\n b.writeInt32LE(batch.length, 4);\n data = Buffer.concat([b, buffer.getValue()]);\n buffer = new BinaryWriter(Buffer.alloc(0));\n const containerId = await this._state.writeDataAsMessage(\n buffer, data, false,\n );\n for (const s of batch) {\n s.containerId = containerId;\n }\n }\n\n data = buffer.getValue();\n return {\n batch,\n data,\n };\n }\n\n rejectAll() {\n this._pendingStates.forEach((requestState) => {\n requestState.reject(new Error('Disconnect'));\n });\n }\n}\n\nmodule.exports = MessagePacker;\n","class BinaryWriter {\n constructor(stream) {\n this._stream = stream;\n }\n\n write(buffer) {\n this._stream = Buffer.concat([this._stream, buffer]);\n }\n\n getValue() {\n return this._stream;\n }\n}\n\nmodule.exports = BinaryWriter;\n","const MTProtoPlainSender = require('./MTProtoPlainSender');\nconst MTProtoSender = require('./MTProtoSender');\n\nclass UpdateConnectionState {\n static disconnected = -1;\n\n static connected = 1;\n\n static broken = 0;\n\n constructor(state) {\n this.state = state;\n }\n}\n\nclass UpdateServerTimeOffset {\n constructor(timeOffset) {\n this.timeOffset = timeOffset;\n }\n}\n\nconst {\n Connection,\n ConnectionTCPFull,\n ConnectionTCPAbridged,\n ConnectionTCPObfuscated,\n} = require('./connection');\n\nmodule.exports = {\n Connection,\n ConnectionTCPFull,\n ConnectionTCPAbridged,\n ConnectionTCPObfuscated,\n MTProtoPlainSender,\n MTProtoSender,\n UpdateConnectionState,\n UpdateServerTimeOffset,\n};\n","const { Mutex } = require('async-mutex');\n\nconst mutex = new Mutex();\n\nconst WebSocketClient = require('websocket').w3cwebsocket;\n\nconst closeError = new Error('WebSocket was closed');\n\nclass PromisedWebSockets {\n constructor(disconnectedCallback) {\n /* CONTEST\n this.isBrowser = typeof process === 'undefined' ||\n process.type === 'renderer' ||\n process.browser === true ||\n process.__nwjs\n\n */\n this.client = undefined;\n this.closed = true;\n this.disconnectedCallback = disconnectedCallback;\n }\n\n async readExactly(number) {\n let readData = Buffer.alloc(0);\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const thisTime = await this.read(number);\n readData = Buffer.concat([readData, thisTime]);\n number -= thisTime.length;\n if (!number) {\n return readData;\n }\n }\n }\n\n async read(number) {\n if (this.closed) {\n throw closeError;\n }\n await this.canRead;\n if (this.closed) {\n throw closeError;\n }\n const toReturn = this.stream.slice(0, number);\n this.stream = this.stream.slice(number);\n if (this.stream.length === 0) {\n this.canRead = new Promise((resolve) => {\n this.resolveRead = resolve;\n });\n }\n\n return toReturn;\n }\n\n async readAll() {\n if (this.closed || !await this.canRead) {\n throw closeError;\n }\n const toReturn = this.stream;\n this.stream = Buffer.alloc(0);\n this.canRead = new Promise((resolve) => {\n this.resolveRead = resolve;\n });\n\n return toReturn;\n }\n\n getWebSocketLink(ip, port) {\n if (port === 443) {\n return `wss://${ip}:${port}/apiws`;\n } else {\n return `ws://${ip}:${port}/apiws`;\n }\n }\n\n connect(port, ip) {\n this.stream = Buffer.alloc(0);\n this.canRead = new Promise((resolve) => {\n this.resolveRead = resolve;\n });\n this.closed = false;\n this.website = this.getWebSocketLink(ip, port);\n this.client = new WebSocketClient(this.website, 'binary');\n return new Promise((resolve, reject) => {\n this.client.onopen = () => {\n this.receive();\n resolve(this);\n };\n this.client.onerror = (error) => {\n // eslint-disable-next-line no-console\n console.error('WebSocket error', error);\n reject(error);\n };\n this.client.onclose = (event) => {\n const { code, reason, wasClean } = event;\n if (code !== 1000) {\n // eslint-disable-next-line no-console\n console.error(`Socket ${ip} closed. Code: ${code}, reason: ${reason}, was clean: ${wasClean}`);\n }\n\n this.resolveRead(false);\n this.closed = true;\n if (this.disconnectedCallback) {\n this.disconnectedCallback();\n }\n };\n // CONTEST\n // Seems to not be working, at least in a web worker\n // eslint-disable-next-line no-restricted-globals\n self.addEventListener('offline', async () => {\n await this.close();\n this.resolveRead(false);\n });\n });\n }\n\n write(data) {\n if (this.closed) {\n throw closeError;\n }\n this.client.send(data);\n }\n\n async close() {\n await this.client.close();\n this.closed = true;\n }\n\n receive() {\n this.client.onmessage = async (message) => {\n const release = await mutex.acquire();\n try {\n const data = message.data instanceof ArrayBuffer\n ? Buffer.from(message.data)\n : Buffer.from(await new Response(message.data).arrayBuffer());\n this.stream = Buffer.concat([this.stream, data]);\n this.resolveRead(true);\n } finally {\n release();\n }\n };\n }\n}\n\nmodule.exports = PromisedWebSockets;\n","class AsyncQueue {\n constructor() {\n this._queue = [];\n this.canGet = new Promise((resolve) => {\n this.resolveGet = resolve;\n });\n this.canPush = true;\n }\n\n async push(value) {\n await this.canPush;\n this._queue.push(value);\n this.resolveGet(true);\n this.canPush = new Promise((resolve) => {\n this.resolvePush = resolve;\n });\n }\n\n async pop() {\n await this.canGet;\n const returned = this._queue.pop();\n this.resolvePush(true);\n this.canGet = new Promise((resolve) => {\n this.resolveGet = resolve;\n });\n return returned;\n }\n}\n\nmodule.exports = AsyncQueue;\n","const BigInt = require('big-integer');\nconst { readBufferFromBigInt } = require('../../Helpers');\nconst {\n Connection,\n PacketCodec,\n} = require('./Connection');\n\nclass AbridgedPacketCodec extends PacketCodec {\n static tag = Buffer.from('ef', 'hex');\n\n static obfuscateTag = Buffer.from('efefefef', 'hex');\n\n constructor(props) {\n super(props);\n this.tag = AbridgedPacketCodec.tag;\n this.obfuscateTag = AbridgedPacketCodec.obfuscateTag;\n }\n\n encodePacket(data) {\n let length = data.length >> 2;\n if (length < 127) {\n const b = Buffer.alloc(1);\n b.writeUInt8(length, 0);\n length = b;\n } else {\n length = Buffer.concat([Buffer.from('7f', 'hex'), readBufferFromBigInt(BigInt(length), 3)]);\n }\n return Buffer.concat([length, data]);\n }\n\n async readPacket(reader) {\n const readData = await reader.read(1);\n let length = readData[0];\n if (length >= 127) {\n length = Buffer.concat([await reader.read(3), Buffer.alloc(1)])\n .readInt32LE(0);\n }\n\n return reader.read(length << 2);\n }\n}\n\n/**\n * This is the mode with the lowest overhead, as it will\n * only require 1 byte if the packet length is less than\n * 508 bytes (127 << 2, which is very common).\n */\nclass ConnectionTCPAbridged extends Connection {\n PacketCodecClass = AbridgedPacketCodec;\n}\n\nmodule.exports = {\n ConnectionTCPAbridged,\n AbridgedPacketCodec,\n};\n","const { generateRandomBytes } = require('../../Helpers');\nconst { ObfuscatedConnection } = require('./Connection');\nconst { AbridgedPacketCodec } = require('./TCPAbridged');\nconst CTR = require('../../crypto/CTR');\n\nclass ObfuscatedIO {\n header = undefined;\n\n constructor(connection) {\n this.connection = connection.socket;\n const res = this.initHeader(connection.PacketCodecClass);\n this.header = res.random;\n\n this._encrypt = res.encryptor;\n this._decrypt = res.decryptor;\n }\n\n initHeader(packetCodec) {\n // Obfuscated messages secrets cannot start with any of these\n const keywords = [Buffer.from('50567247', 'hex'), Buffer.from('474554', 'hex'),\n Buffer.from('504f5354', 'hex'), Buffer.from('eeeeeeee', 'hex')];\n let random;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n random = generateRandomBytes(64);\n if (random[0] !== 0xef && !(random.slice(4, 8)\n .equals(Buffer.alloc(4)))) {\n let ok = true;\n for (const key of keywords) {\n if (key.equals(random.slice(0, 4))) {\n ok = false;\n break;\n }\n }\n if (ok) {\n break;\n }\n }\n }\n random = random.toJSON().data;\n\n const randomReversed = Buffer.from(random.slice(8, 56))\n .reverse();\n // Encryption has \"continuous buffer\" enabled\n const encryptKey = Buffer.from(random.slice(8, 40));\n const encryptIv = Buffer.from(random.slice(40, 56));\n const decryptKey = Buffer.from(randomReversed.slice(0, 32));\n const decryptIv = Buffer.from(randomReversed.slice(32, 48));\n const encryptor = new CTR(encryptKey, encryptIv);\n const decryptor = new CTR(decryptKey, decryptIv);\n\n random = Buffer.concat([\n Buffer.from(random.slice(0, 56)), packetCodec.obfuscateTag, Buffer.from(random.slice(60)),\n ]);\n random = Buffer.concat([\n Buffer.from(random.slice(0, 56)), Buffer.from(encryptor.encrypt(random)\n .slice(56, 64)), Buffer.from(random.slice(64)),\n ]);\n return {\n random,\n encryptor,\n decryptor,\n };\n }\n\n async read(n) {\n const data = await this.connection.readExactly(n);\n return this._decrypt.encrypt(data);\n }\n\n write(data) {\n this.connection.write(this._encrypt.encrypt(data));\n }\n}\n\nclass ConnectionTCPObfuscated extends ObfuscatedConnection {\n ObfuscatedIO = ObfuscatedIO;\n\n PacketCodecClass = AbridgedPacketCodec;\n}\n\nmodule.exports = {\n ConnectionTCPObfuscated,\n};\n","export interface ApiDimensions {\n width: number;\n height: number;\n}\n\nexport interface ApiPhotoSize extends ApiDimensions {\n type: 's' | 'm' | 'x' | 'y' | 'z';\n}\n\nexport interface ApiThumbnail extends ApiDimensions {\n dataUri: string;\n}\n\nexport interface ApiPhoto {\n id: string;\n thumbnail?: ApiThumbnail;\n sizes: ApiPhotoSize[];\n blobUrl?: string;\n}\n\nexport interface ApiSticker {\n id: string;\n stickerSetId: string;\n stickerSetAccessHash?: string;\n emoji?: string;\n isAnimated: boolean;\n width?: number;\n height?: number;\n thumbnail?: ApiThumbnail;\n isPreloadedGlobally?: boolean;\n}\n\nexport interface ApiStickerSet {\n archived?: true;\n isAnimated?: true;\n installedDate?: number;\n id: string;\n accessHash: string;\n title: string;\n hasThumbnail?: boolean;\n count: number;\n hash: number;\n stickers?: ApiSticker[];\n packs?: Record;\n covers?: ApiSticker[];\n}\n\nexport interface ApiVideo {\n id: string;\n mimeType: string;\n duration: number;\n fileName: string;\n width?: number;\n height?: number;\n supportsStreaming?: boolean;\n isRound?: boolean;\n isGif?: boolean;\n thumbnail?: ApiThumbnail;\n blobUrl?: string;\n size: number;\n}\n\nexport interface ApiAudio {\n size: number;\n mimeType: string;\n fileName: string;\n duration: number;\n performer?: string;\n title?: string;\n}\n\nexport interface ApiVoice {\n duration: number;\n waveform?: number[];\n}\n\nexport interface ApiDocument {\n id?: string;\n fileName: string;\n size: number;\n timestamp?: number;\n mimeType: string;\n thumbnail?: ApiThumbnail;\n previewBlobUrl?: string;\n mediaType?: 'photo' | 'video';\n mediaSize?: ApiDimensions;\n}\n\nexport interface ApiContact {\n firstName: string;\n lastName: string;\n phoneNumber: string;\n userId: number;\n}\n\nexport interface ApiPollAnswer {\n text: string;\n option: string;\n}\n\nexport interface ApiPollResult {\n isChosen?: true;\n isCorrect?: true;\n option: string;\n votersCount: number;\n}\n\nexport interface ApiPoll {\n id: string;\n summary: {\n closed?: true;\n isPublic?: true;\n multipleChoice?: true;\n quiz?: true;\n question: string;\n answers: ApiPollAnswer[];\n closePeriod?: number;\n closeDate?: number;\n };\n results: {\n results?: ApiPollResult[];\n totalVoters?: number;\n recentVoterIds?: number[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n}\n\nexport interface ApiInvoice {\n text: string;\n title: string;\n photoUrl?: string;\n description?: string;\n receiptMsgId?: number;\n}\n\nexport type ApiNewPoll = {\n summary: ApiPoll['summary'];\n quiz?: {\n correctAnswers: string[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n};\n\nexport interface ApiAction {\n text: string;\n targetUserIds?: number[];\n targetChatId?: number;\n type: 'historyClear' | 'other';\n photo?: ApiPhoto;\n translationValues: string[];\n}\n\nexport interface ApiWebPage {\n id: number;\n url: string;\n displayUrl: string;\n type?: string;\n siteName?: string;\n title?: string;\n description?: string;\n photo?: ApiPhoto;\n duration?: number;\n document?: ApiDocument;\n video?: ApiVideo;\n}\n\nexport interface ApiMessageForwardInfo {\n isChannelPost: boolean;\n isLinkedChannelPost?: boolean;\n fromChatId?: number;\n senderUserId?: number;\n fromMessageId?: number;\n hiddenUserName?: string;\n adminTitle?: string;\n}\n\nexport interface ApiMessageEntity {\n type: string;\n offset: number;\n length: number;\n userId?: number;\n url?: string;\n}\n\nexport enum ApiMessageEntityTypes {\n Bold = 'MessageEntityBold',\n Blockquote = 'MessageEntityBlockquote',\n BotCommand = 'MessageEntityBotCommand',\n Cashtag = 'MessageEntityCashtag',\n Code = 'MessageEntityCode',\n Email = 'MessageEntityEmail',\n Hashtag = 'MessageEntityHashtag',\n Italic = 'MessageEntityItalic',\n MentionName = 'MessageEntityMentionName',\n Mention = 'MessageEntityMention',\n Phone = 'MessageEntityPhone',\n Pre = 'MessageEntityPre',\n Strike = 'MessageEntityStrike',\n TextUrl = 'MessageEntityTextUrl',\n Url = 'MessageEntityUrl',\n Underline = 'MessageEntityUnderline',\n Unknown = 'MessageEntityUnknown',\n}\n\nexport interface ApiFormattedText {\n text: string;\n entities?: ApiMessageEntity[];\n}\n\nexport interface ApiMessage {\n id: number;\n chatId: number;\n content: {\n text?: ApiFormattedText;\n photo?: ApiPhoto;\n video?: ApiVideo;\n document?: ApiDocument;\n sticker?: ApiSticker;\n contact?: ApiContact;\n poll?: ApiPoll;\n action?: ApiAction;\n webPage?: ApiWebPage;\n audio?: ApiAudio;\n voice?: ApiVoice;\n invoice?: ApiInvoice;\n };\n date: number;\n isOutgoing: boolean;\n senderId?: number;\n replyToMessageId?: number;\n replyToTopMessageId?: number;\n sendingState?: 'messageSendingStatePending' | 'messageSendingStateFailed';\n forwardInfo?: ApiMessageForwardInfo;\n isDeleting?: boolean;\n previousLocalId?: number;\n views?: number;\n isEdited?: boolean;\n isMediaUnread?: boolean;\n groupedId?: string;\n isInAlbum?: boolean;\n hasUnreadMention?: boolean;\n inlineButtons?: ApiKeyboardButtons;\n keyboardButtons?: ApiKeyboardButtons;\n viaBotId?: number;\n threadInfo?: ApiThreadInfo;\n adminTitle?: string;\n isScheduled?: boolean;\n shouldHideKeyboardButtons?: boolean;\n isFromScheduled?: boolean;\n}\n\nexport interface ApiThreadInfo {\n threadId: number;\n chatId: number;\n topMessageId?: number;\n originChannelId?: number;\n messagesCount: number;\n lastMessageId?: number;\n lastReadInboxMessageId?: number;\n recentReplierIds?: number[];\n}\n\nexport type ApiMessageOutgoingStatus = 'read' | 'succeeded' | 'pending' | 'failed';\n\nexport interface ApiKeyboardButton {\n type: 'command' | 'url' | 'callback' | 'requestPoll' | 'buy' | 'NOT_SUPPORTED';\n text: string;\n messageId: number;\n value?: string;\n}\n\nexport type ApiKeyboardButtons = ApiKeyboardButton[][];\n\nexport type ApiMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'profilePhoto';\nexport type ApiGlobalMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\n\nexport type ApiReportReason = 'spam' | 'violence' | 'pornography' | 'childAbuse'\n| 'copyright' | 'geoIrrelevant' | 'fake' | 'other';\n\nexport const MAIN_THREAD_ID = -1;\n\n// `Symbol` can not be transferred from worker\nexport const MESSAGE_DELETED = 'MESSAGE_DELETED';\n","// We cache avatars as Data URI for faster initial load\n// and messages media as Blob for smaller size.\n\nexport enum ApiMediaFormat {\n DataUri,\n BlobUrl,\n Lottie,\n Progressive,\n Stream,\n}\n\nexport type ApiParsedMedia = string | Blob | AnyLiteral | ArrayBuffer;\nexport type ApiPreparedMedia = string | AnyLiteral;\nexport type ApiMediaFormatToPrepared = T extends ApiMediaFormat.Lottie ? AnyLiteral : string;\n","import bigInt from 'big-integer';\nimport {\n generateRandomBytes,\n modExp,\n readBigIntFromBuffer,\n readBufferFromBigInt,\n sha1,\n} from '../Helpers';\n\nconst PUBLIC_KEYS = [\n {\n fingerprint: bigInt('-3414540481677951611'),\n n: bigInt(\n '2937959817066933702298617714945612856538843112005886376816255642404751219133084745514657634448776440866'\n + '1701890505066208632169112269581063774293102577308490531282748465986139880977280302242772832972539403531'\n + '3160108704012876427630091361567343395380424193887227773571344877461690935390938502512438971889287359033'\n + '8945177273024525306296338410881284207988753897636046529094613963869149149606209957083647645485599631919'\n + '2747663615955633778034897140982517446405334423701359108810182097749467210509584293428076654573384828809'\n + '574217079944388301239431309115013843331317877374435868468779972014486325557807783825502498215169806323',\n ),\n e: 65537,\n },\n];\n\nexport const _serverKeys = new Map();\n\nPUBLIC_KEYS.forEach(({ fingerprint, ...keyInfo }) => {\n _serverKeys.set(fingerprint.toString(),\n keyInfo);\n});\n\n/**\n * Encrypts the given data known the fingerprint to be used\n * in the way Telegram requires us to do so (sha1(data) + data + padding)\n\n * @param fingerprint the fingerprint of the RSA key.\n * @param data the data to be encrypted.\n * @returns {Buffer|*|undefined} the cipher text, or undefined if no key matching this fingerprint is found.\n */\nexport async function encrypt(fingerprint: bigInt.BigInteger, data: Buffer) {\n const key = _serverKeys.get(fingerprint.toString());\n if (!key) {\n return undefined;\n }\n\n // len(sha1.digest) is always 20, so we're left with 255 - 20 - x padding\n const rand = generateRandomBytes(235 - data.length);\n\n const toEncrypt = Buffer.concat([await sha1(data), data, rand]);\n\n // rsa module rsa.encrypt adds 11 bits for padding which we don't want\n // rsa module uses rsa.transform.bytes2int(to_encrypt), easier way:\n const payload = readBigIntFromBuffer(toEncrypt, false);\n const encrypted = modExp(payload, bigInt(key.e), key.n);\n // rsa module uses transform.int2bytes(encrypted, keylength), easier:\n return readBufferFromBigInt(encrypted, 256, false);\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","/**\n * Uint32Array -> ArrayBuffer (low-endian os)\n */\nexport function i2abLow(buf: Uint32Array): ArrayBuffer {\n const uint8 = new Uint8Array(buf.length * 4);\n let i = 0;\n\n for (let j = 0; j < buf.length; j++) {\n const int = buf[j];\n\n uint8[i++] = int >>> 24;\n uint8[i++] = (int >> 16) & 0xFF;\n uint8[i++] = (int >> 8) & 0xFF;\n uint8[i++] = int & 0xFF;\n }\n\n return uint8.buffer;\n}\n\n/**\n * Uint32Array -> ArrayBuffer (big-endian os)\n */\nexport function i2abBig(buf: Uint32Array): ArrayBuffer {\n return buf.buffer;\n}\n\n/**\n * ArrayBuffer -> Uint32Array (low-endian os)\n */\nexport function ab2iLow(ab: ArrayBuffer | SharedArrayBuffer | Uint8Array): Uint32Array {\n const uint8 = new Uint8Array(ab);\n const buf = new Uint32Array(uint8.length / 4);\n\n for (let i = 0; i < uint8.length; i += 4) {\n buf[i / 4] = (\n uint8[i] << 24\n ^ uint8[i + 1] << 16\n ^ uint8[i + 2] << 8\n ^ uint8[i + 3]\n );\n }\n\n return buf;\n}\n\n/**\n * ArrayBuffer -> Uint32Array (big-endian os)\n */\nexport function ab2iBig(ab: ArrayBuffer | SharedArrayBuffer | Uint8Array): Uint32Array {\n return new Uint32Array(ab);\n}\n\nexport const isBigEndian = new Uint8Array(new Uint32Array([0x01020304]))[0] === 0x01;\nexport const i2ab = isBigEndian ? i2abBig : i2abLow;\nexport const ab2i = isBigEndian ? ab2iBig : ab2iLow;\n","/*\n * Imported from https://github.com/spalt08/cryptography/blob/master/packages/aes/src/utils/words.ts\n */\n\nexport function s2i(str: string, pos: number) {\n return (\n str.charCodeAt(pos) << 24\n ^ str.charCodeAt(pos + 1) << 16\n ^ str.charCodeAt(pos + 2) << 8\n ^ str.charCodeAt(pos + 3)\n );\n}\n\n/**\n * Helper function for transforming string key to Uint32Array\n */\nexport function getWords(key: string | Uint8Array | Uint32Array) {\n if (key instanceof Uint32Array) {\n return key;\n }\n\n if (typeof key === 'string') {\n if (key.length % 4 !== 0) for (let i = key.length % 4; i <= 4; i++) key += '\\0x00';\n\n const buf = new Uint32Array(key.length / 4);\n for (let i = 0; i < key.length; i += 4) buf[i / 4] = s2i(key, i);\n\n return buf;\n }\n\n if (key instanceof Uint8Array) {\n const buf = new Uint32Array(key.length / 4);\n\n for (let i = 0; i < key.length; i += 4) {\n buf[i / 4] = (\n key[i] << 24\n ^ key[i + 1] << 16\n ^ key[i + 2] << 8\n ^ key[i + 3]\n );\n }\n\n return buf;\n }\n\n throw new Error('Unable to create 32-bit words');\n}\n\nexport function xor(left: Uint32Array, right: Uint32Array, to = left) {\n for (let i = 0; i < left.length; i++) to[i] = left[i] ^ right[i];\n}\n","module.exports = `boolFalse#bc799737 = Bool;\nboolTrue#997275b5 = Bool;\ntrue#3fedd339 = True;\nvector#1cb5c415 {t:Type} # [ t ] = Vector t;\nerror#c4b9f9bb code:int text:string = Error;\nnull#56730bcc = Null;\ninputPeerEmpty#7f3b18ea = InputPeer;\ninputPeerSelf#7da07ec9 = InputPeer;\ninputPeerChat#179be863 chat_id:int = InputPeer;\ninputPeerUser#7b8e7de6 user_id:int access_hash:long = InputPeer;\ninputPeerChannel#20adaef8 channel_id:int access_hash:long = InputPeer;\ninputPeerUserFromMessage#17bae2e6 peer:InputPeer msg_id:int user_id:int = InputPeer;\ninputPeerChannelFromMessage#9c95f7bb peer:InputPeer msg_id:int channel_id:int = InputPeer;\ninputUserEmpty#b98886cf = InputUser;\ninputUserSelf#f7c1b13f = InputUser;\ninputUser#d8292816 user_id:int access_hash:long = InputUser;\ninputUserFromMessage#2d117597 peer:InputPeer msg_id:int user_id:int = InputUser;\ninputPhoneContact#f392b7f4 client_id:long phone:string first_name:string last_name:string = InputContact;\ninputFile#f52ff27f id:long parts:int name:string md5_checksum:string = InputFile;\ninputFileBig#fa4f0bb5 id:long parts:int name:string = InputFile;\ninputMediaEmpty#9664f57f = InputMedia;\ninputMediaUploadedPhoto#1e287d04 flags:# file:InputFile stickers:flags.0?Vector ttl_seconds:flags.1?int = InputMedia;\ninputMediaPhoto#b3ba0635 flags:# id:InputPhoto ttl_seconds:flags.0?int = InputMedia;\ninputMediaGeoPoint#f9c44144 geo_point:InputGeoPoint = InputMedia;\ninputMediaContact#f8ab7dfb phone_number:string first_name:string last_name:string vcard:string = InputMedia;\ninputMediaUploadedDocument#5b38c6c1 flags:# nosound_video:flags.3?true force_file:flags.4?true file:InputFile thumb:flags.2?InputFile mime_type:string attributes:Vector stickers:flags.0?Vector ttl_seconds:flags.1?int = InputMedia;\ninputMediaDocument#33473058 flags:# id:InputDocument ttl_seconds:flags.0?int query:flags.1?string = InputMedia;\ninputMediaVenue#c13d1c11 geo_point:InputGeoPoint title:string address:string provider:string venue_id:string venue_type:string = InputMedia;\ninputMediaPhotoExternal#e5bbfe1a flags:# url:string ttl_seconds:flags.0?int = InputMedia;\ninputMediaDocumentExternal#fb52dc99 flags:# url:string ttl_seconds:flags.0?int = InputMedia;\ninputMediaGame#d33f43f3 id:InputGame = InputMedia;\ninputMediaInvoice#d9799874 flags:# title:string description:string photo:flags.0?InputWebDocument invoice:Invoice payload:bytes provider:string provider_data:DataJSON start_param:flags.1?string = InputMedia;\ninputMediaGeoLive#971fa843 flags:# stopped:flags.0?true geo_point:InputGeoPoint heading:flags.2?int period:flags.1?int proximity_notification_radius:flags.3?int = InputMedia;\ninputMediaPoll#f94e5f1 flags:# poll:Poll correct_answers:flags.0?Vector solution:flags.1?string solution_entities:flags.1?Vector = InputMedia;\ninputMediaDice#e66fbf7b emoticon:string = InputMedia;\ninputChatPhotoEmpty#1ca48f57 = InputChatPhoto;\ninputChatUploadedPhoto#c642724e flags:# file:flags.0?InputFile video:flags.1?InputFile video_start_ts:flags.2?double = InputChatPhoto;\ninputChatPhoto#8953ad37 id:InputPhoto = InputChatPhoto;\ninputGeoPointEmpty#e4c123d6 = InputGeoPoint;\ninputGeoPoint#48222faf flags:# lat:double long:double accuracy_radius:flags.0?int = InputGeoPoint;\ninputPhotoEmpty#1cd7bf0d = InputPhoto;\ninputPhoto#3bb3b94a id:long access_hash:long file_reference:bytes = InputPhoto;\ninputFileLocation#dfdaabe1 volume_id:long local_id:int secret:long file_reference:bytes = InputFileLocation;\ninputEncryptedFileLocation#f5235d55 id:long access_hash:long = InputFileLocation;\ninputDocumentFileLocation#bad07584 id:long access_hash:long file_reference:bytes thumb_size:string = InputFileLocation;\ninputSecureFileLocation#cbc7ee28 id:long access_hash:long = InputFileLocation;\ninputTakeoutFileLocation#29be5899 = InputFileLocation;\ninputPhotoFileLocation#40181ffe id:long access_hash:long file_reference:bytes thumb_size:string = InputFileLocation;\ninputPhotoLegacyFileLocation#d83466f3 id:long access_hash:long file_reference:bytes volume_id:long local_id:int secret:long = InputFileLocation;\ninputPeerPhotoFileLocation#37257e99 flags:# big:flags.0?true peer:InputPeer photo_id:long = InputFileLocation;\ninputStickerSetThumb#9d84f3db stickerset:InputStickerSet thumb_version:int = InputFileLocation;\ninputGroupCallStream#bba51639 call:InputGroupCall time_ms:long scale:int = InputFileLocation;\npeerUser#9db1bc6d user_id:int = Peer;\npeerChat#bad0e5bb chat_id:int = Peer;\npeerChannel#bddde532 channel_id:int = Peer;\nstorage.fileUnknown#aa963b05 = storage.FileType;\nstorage.filePartial#40bc6f52 = storage.FileType;\nstorage.fileJpeg#7efe0e = storage.FileType;\nstorage.fileGif#cae1aadf = storage.FileType;\nstorage.filePng#a4f63c0 = storage.FileType;\nstorage.filePdf#ae1e508d = storage.FileType;\nstorage.fileMp3#528a0677 = storage.FileType;\nstorage.fileMov#4b09ebbc = storage.FileType;\nstorage.fileMp4#b3cea0e4 = storage.FileType;\nstorage.fileWebp#1081464c = storage.FileType;\nuserEmpty#200250ba id:int = User;\nuser#938458c1 flags:# self:flags.10?true contact:flags.11?true mutual_contact:flags.12?true deleted:flags.13?true bot:flags.14?true bot_chat_history:flags.15?true bot_nochats:flags.16?true verified:flags.17?true restricted:flags.18?true min:flags.20?true bot_inline_geo:flags.21?true support:flags.23?true scam:flags.24?true apply_min_photo:flags.25?true fake:flags.26?true id:int access_hash:flags.0?long first_name:flags.1?string last_name:flags.2?string username:flags.3?string phone:flags.4?string photo:flags.5?UserProfilePhoto status:flags.6?UserStatus bot_info_version:flags.14?int restriction_reason:flags.18?Vector bot_inline_placeholder:flags.19?string lang_code:flags.22?string = User;\nuserProfilePhotoEmpty#4f11bae1 = UserProfilePhoto;\nuserProfilePhoto#82d1f706 flags:# has_video:flags.0?true photo_id:long stripped_thumb:flags.1?bytes dc_id:int = UserProfilePhoto;\nuserStatusEmpty#9d05049 = UserStatus;\nuserStatusOnline#edb93949 expires:int = UserStatus;\nuserStatusOffline#8c703f was_online:int = UserStatus;\nuserStatusRecently#e26f42f1 = UserStatus;\nuserStatusLastWeek#7bf09fc = UserStatus;\nuserStatusLastMonth#77ebc742 = UserStatus;\nchatEmpty#9ba2d800 id:int = Chat;\nchat#3bda1bde flags:# creator:flags.0?true kicked:flags.1?true left:flags.2?true deactivated:flags.5?true call_active:flags.23?true call_not_empty:flags.24?true id:int title:string photo:ChatPhoto participants_count:int date:int version:int migrated_to:flags.6?InputChannel admin_rights:flags.14?ChatAdminRights default_banned_rights:flags.18?ChatBannedRights = Chat;\nchatForbidden#7328bdb id:int title:string = Chat;\nchannel#d31a961e flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true call_not_empty:flags.24?true fake:flags.25?true gigagroup:flags.26?true id:int access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int version:int restriction_reason:flags.9?Vector admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int = Chat;\nchannelForbidden#289da732 flags:# broadcast:flags.5?true megagroup:flags.8?true id:int access_hash:long title:string until_date:flags.16?int = Chat;\nchatFull#8a1e2983 flags:# can_set_username:flags.7?true has_scheduled:flags.8?true id:int about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer = ChatFull;\nchannelFull#548c3f93 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?int location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer = ChatFull;\nchatParticipant#c8d7493e user_id:int inviter_id:int date:int = ChatParticipant;\nchatParticipantCreator#da13538a user_id:int = ChatParticipant;\nchatParticipantAdmin#e2d6e436 user_id:int inviter_id:int date:int = ChatParticipant;\nchatParticipantsForbidden#fc900c2b flags:# chat_id:int self_participant:flags.0?ChatParticipant = ChatParticipants;\nchatParticipants#3f460fed chat_id:int participants:Vector version:int = ChatParticipants;\nchatPhotoEmpty#37c1011c = ChatPhoto;\nchatPhoto#1c6e1c11 flags:# has_video:flags.0?true photo_id:long stripped_thumb:flags.1?bytes dc_id:int = ChatPhoto;\nmessageEmpty#90a6ca84 flags:# id:int peer_id:flags.0?Peer = Message;\nmessage#bce383d2 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true pinned:flags.24?true id:int from_id:flags.8?Peer peer_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long restriction_reason:flags.22?Vector ttl_period:flags.25?int = Message;\nmessageService#2b085862 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true legacy:flags.19?true id:int from_id:flags.8?Peer peer_id:Peer reply_to:flags.3?MessageReplyHeader date:int action:MessageAction ttl_period:flags.25?int = Message;\nmessageMediaEmpty#3ded6320 = MessageMedia;\nmessageMediaPhoto#695150d7 flags:# photo:flags.0?Photo ttl_seconds:flags.2?int = MessageMedia;\nmessageMediaGeo#56e0d474 geo:GeoPoint = MessageMedia;\nmessageMediaContact#cbf24940 phone_number:string first_name:string last_name:string vcard:string user_id:int = MessageMedia;\nmessageMediaUnsupported#9f84f49e = MessageMedia;\nmessageMediaDocument#9cb070d7 flags:# document:flags.0?Document ttl_seconds:flags.2?int = MessageMedia;\nmessageMediaWebPage#a32dd600 webpage:WebPage = MessageMedia;\nmessageMediaVenue#2ec0533f geo:GeoPoint title:string address:string provider:string venue_id:string venue_type:string = MessageMedia;\nmessageMediaGame#fdb19008 game:Game = MessageMedia;\nmessageMediaInvoice#84551347 flags:# shipping_address_requested:flags.1?true test:flags.3?true title:string description:string photo:flags.0?WebDocument receipt_msg_id:flags.2?int currency:string total_amount:long start_param:string = MessageMedia;\nmessageMediaGeoLive#b940c666 flags:# geo:GeoPoint heading:flags.0?int period:int proximity_notification_radius:flags.1?int = MessageMedia;\nmessageMediaPoll#4bd6e798 poll:Poll results:PollResults = MessageMedia;\nmessageMediaDice#3f7ee58b value:int emoticon:string = MessageMedia;\nmessageActionEmpty#b6aef7b0 = MessageAction;\nmessageActionChatCreate#a6638b9a title:string users:Vector = MessageAction;\nmessageActionChatEditTitle#b5a1ce5a title:string = MessageAction;\nmessageActionChatEditPhoto#7fcb13a8 photo:Photo = MessageAction;\nmessageActionChatDeletePhoto#95e3fbef = MessageAction;\nmessageActionChatAddUser#488a7337 users:Vector = MessageAction;\nmessageActionChatDeleteUser#b2ae9b0c user_id:int = MessageAction;\nmessageActionChatJoinedByLink#f89cf5e8 inviter_id:int = MessageAction;\nmessageActionChannelCreate#95d2ac92 title:string = MessageAction;\nmessageActionChatMigrateTo#51bdb021 channel_id:int = MessageAction;\nmessageActionChannelMigrateFrom#b055eaee title:string chat_id:int = MessageAction;\nmessageActionPinMessage#94bd38ed = MessageAction;\nmessageActionHistoryClear#9fbab604 = MessageAction;\nmessageActionGameScore#92a72876 game_id:long score:int = MessageAction;\nmessageActionPaymentSentMe#8f31b327 flags:# currency:string total_amount:long payload:bytes info:flags.0?PaymentRequestedInfo shipping_option_id:flags.1?string charge:PaymentCharge = MessageAction;\nmessageActionPaymentSent#40699cd0 currency:string total_amount:long = MessageAction;\nmessageActionPhoneCall#80e11a7f flags:# video:flags.2?true call_id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = MessageAction;\nmessageActionScreenshotTaken#4792929b = MessageAction;\nmessageActionCustomAction#fae69f56 message:string = MessageAction;\nmessageActionBotAllowed#abe9affe domain:string = MessageAction;\nmessageActionSecureValuesSentMe#1b287353 values:Vector credentials:SecureCredentialsEncrypted = MessageAction;\nmessageActionSecureValuesSent#d95c6154 types:Vector = MessageAction;\nmessageActionContactSignUp#f3f25f76 = MessageAction;\nmessageActionGeoProximityReached#98e0d697 from_id:Peer to_id:Peer distance:int = MessageAction;\nmessageActionGroupCall#7a0d7f42 flags:# call:InputGroupCall duration:flags.0?int = MessageAction;\nmessageActionInviteToGroupCall#76b9f11a call:InputGroupCall users:Vector = MessageAction;\nmessageActionSetMessagesTTL#aa1afbfd period:int = MessageAction;\nmessageActionGroupCallScheduled#b3a07661 call:InputGroupCall schedule_date:int = MessageAction;\ndialog#2c171f72 flags:# pinned:flags.2?true unread_mark:flags.3?true peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int notify_settings:PeerNotifySettings pts:flags.0?int draft:flags.1?DraftMessage folder_id:flags.4?int = Dialog;\ndialogFolder#71bd134c flags:# pinned:flags.2?true folder:Folder peer:Peer top_message:int unread_muted_peers_count:int unread_unmuted_peers_count:int unread_muted_messages_count:int unread_unmuted_messages_count:int = Dialog;\nphotoEmpty#2331b22d id:long = Photo;\nphoto#fb197a65 flags:# has_stickers:flags.0?true id:long access_hash:long file_reference:bytes date:int sizes:Vector video_sizes:flags.1?Vector dc_id:int = Photo;\nphotoSizeEmpty#e17e23c type:string = PhotoSize;\nphotoSize#75c78e60 type:string w:int h:int size:int = PhotoSize;\nphotoCachedSize#21e1ad6 type:string w:int h:int bytes:bytes = PhotoSize;\nphotoStrippedSize#e0b0bc2e type:string bytes:bytes = PhotoSize;\nphotoSizeProgressive#fa3efb95 type:string w:int h:int sizes:Vector = PhotoSize;\nphotoPathSize#d8214d41 type:string bytes:bytes = PhotoSize;\ngeoPointEmpty#1117dd5f = GeoPoint;\ngeoPoint#b2a2f663 flags:# long:double lat:double access_hash:long accuracy_radius:flags.0?int = GeoPoint;\nauth.sentCode#5e002502 flags:# type:auth.SentCodeType phone_code_hash:string next_type:flags.1?auth.CodeType timeout:flags.2?int = auth.SentCode;\nauth.authorization#cd050916 flags:# tmp_sessions:flags.0?int user:User = auth.Authorization;\nauth.authorizationSignUpRequired#44747e9a flags:# terms_of_service:flags.0?help.TermsOfService = auth.Authorization;\nauth.exportedAuthorization#df969c2d id:int bytes:bytes = auth.ExportedAuthorization;\ninputNotifyPeer#b8bc5b0c peer:InputPeer = InputNotifyPeer;\ninputNotifyUsers#193b4417 = InputNotifyPeer;\ninputNotifyChats#4a95e84e = InputNotifyPeer;\ninputNotifyBroadcasts#b1db7c7e = InputNotifyPeer;\ninputPeerNotifySettings#9c3d198e flags:# show_previews:flags.0?Bool silent:flags.1?Bool mute_until:flags.2?int sound:flags.3?string = InputPeerNotifySettings;\npeerNotifySettings#af509d20 flags:# show_previews:flags.0?Bool silent:flags.1?Bool mute_until:flags.2?int sound:flags.3?string = PeerNotifySettings;\npeerSettings#733f2961 flags:# report_spam:flags.0?true add_contact:flags.1?true block_contact:flags.2?true share_contact:flags.3?true need_contacts_exception:flags.4?true report_geo:flags.5?true autoarchived:flags.7?true invite_members:flags.8?true geo_distance:flags.6?int = PeerSettings;\nwallPaper#a437c3ed id:long flags:# creator:flags.0?true default:flags.1?true pattern:flags.3?true dark:flags.4?true access_hash:long slug:string document:Document settings:flags.2?WallPaperSettings = WallPaper;\nwallPaperNoFile#e0804116 id:long flags:# default:flags.1?true dark:flags.4?true settings:flags.2?WallPaperSettings = WallPaper;\ninputReportReasonSpam#58dbcab8 = ReportReason;\ninputReportReasonViolence#1e22c78d = ReportReason;\ninputReportReasonPornography#2e59d922 = ReportReason;\ninputReportReasonChildAbuse#adf44ee3 = ReportReason;\ninputReportReasonOther#c1e4a2b1 = ReportReason;\ninputReportReasonCopyright#9b89f93a = ReportReason;\ninputReportReasonGeoIrrelevant#dbd4feed = ReportReason;\ninputReportReasonFake#f5ddd6e7 = ReportReason;\nuserFull#139a9a77 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true user:User about:flags.1?string settings:PeerSettings profile_photo:flags.2?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int ttl_period:flags.14?int = UserFull;\ncontact#f911c994 user_id:int mutual:Bool = Contact;\nimportedContact#d0028438 user_id:int client_id:long = ImportedContact;\ncontactStatus#d3680c61 user_id:int status:UserStatus = ContactStatus;\ncontacts.contactsNotModified#b74ba9d2 = contacts.Contacts;\ncontacts.contacts#eae87e42 contacts:Vector saved_count:int users:Vector = contacts.Contacts;\ncontacts.importedContacts#77d01c3b imported:Vector popular_invites:Vector retry_contacts:Vector users:Vector = contacts.ImportedContacts;\ncontacts.blocked#ade1591 blocked:Vector chats:Vector users:Vector = contacts.Blocked;\ncontacts.blockedSlice#e1664194 count:int blocked:Vector chats:Vector users:Vector = contacts.Blocked;\nmessages.dialogs#15ba6c40 dialogs:Vector messages:Vector chats:Vector users:Vector = messages.Dialogs;\nmessages.dialogsSlice#71e094f3 count:int dialogs:Vector messages:Vector chats:Vector users:Vector = messages.Dialogs;\nmessages.dialogsNotModified#f0e3e596 count:int = messages.Dialogs;\nmessages.messages#8c718e87 messages:Vector chats:Vector users:Vector = messages.Messages;\nmessages.messagesSlice#3a54685e flags:# inexact:flags.1?true count:int next_rate:flags.0?int offset_id_offset:flags.2?int messages:Vector chats:Vector users:Vector = messages.Messages;\nmessages.channelMessages#64479808 flags:# inexact:flags.1?true pts:int count:int offset_id_offset:flags.2?int messages:Vector chats:Vector users:Vector = messages.Messages;\nmessages.messagesNotModified#74535f21 count:int = messages.Messages;\nmessages.chats#64ff9fd5 chats:Vector = messages.Chats;\nmessages.chatsSlice#9cd81144 count:int chats:Vector = messages.Chats;\nmessages.chatFull#e5d7d19c full_chat:ChatFull chats:Vector users:Vector = messages.ChatFull;\nmessages.affectedHistory#b45c69d1 pts:int pts_count:int offset:int = messages.AffectedHistory;\ninputMessagesFilterEmpty#57e2f66c = MessagesFilter;\ninputMessagesFilterPhotos#9609a51c = MessagesFilter;\ninputMessagesFilterVideo#9fc00e65 = MessagesFilter;\ninputMessagesFilterPhotoVideo#56e9f0e4 = MessagesFilter;\ninputMessagesFilterDocument#9eddf188 = MessagesFilter;\ninputMessagesFilterUrl#7ef0dd87 = MessagesFilter;\ninputMessagesFilterGif#ffc86587 = MessagesFilter;\ninputMessagesFilterVoice#50f5c392 = MessagesFilter;\ninputMessagesFilterMusic#3751b49e = MessagesFilter;\ninputMessagesFilterChatPhotos#3a20ecb8 = MessagesFilter;\ninputMessagesFilterPhoneCalls#80c99768 flags:# missed:flags.0?true = MessagesFilter;\ninputMessagesFilterRoundVoice#7a7c17a4 = MessagesFilter;\ninputMessagesFilterRoundVideo#b549da53 = MessagesFilter;\ninputMessagesFilterMyMentions#c1f8e69a = MessagesFilter;\ninputMessagesFilterGeo#e7026d0d = MessagesFilter;\ninputMessagesFilterContacts#e062db83 = MessagesFilter;\ninputMessagesFilterPinned#1bb00451 = MessagesFilter;\nupdateNewMessage#1f2b0afd message:Message pts:int pts_count:int = Update;\nupdateMessageID#4e90bfd6 id:int random_id:long = Update;\nupdateDeleteMessages#a20db0e5 messages:Vector pts:int pts_count:int = Update;\nupdateUserTyping#5c486927 user_id:int action:SendMessageAction = Update;\nupdateChatUserTyping#86cadb6c chat_id:int from_id:Peer action:SendMessageAction = Update;\nupdateChatParticipants#7761198 participants:ChatParticipants = Update;\nupdateUserStatus#1bfbd823 user_id:int status:UserStatus = Update;\nupdateUserName#a7332b73 user_id:int first_name:string last_name:string username:string = Update;\nupdateUserPhoto#95313b0c user_id:int date:int photo:UserProfilePhoto previous:Bool = Update;\nupdateNewEncryptedMessage#12bcbd9a message:EncryptedMessage qts:int = Update;\nupdateEncryptedChatTyping#1710f156 chat_id:int = Update;\nupdateEncryption#b4a2e88d chat:EncryptedChat date:int = Update;\nupdateEncryptedMessagesRead#38fe25b7 chat_id:int max_date:int date:int = Update;\nupdateChatParticipantAdd#ea4b0e5c chat_id:int user_id:int inviter_id:int date:int version:int = Update;\nupdateChatParticipantDelete#6e5f8c22 chat_id:int user_id:int version:int = Update;\nupdateDcOptions#8e5e9873 dc_options:Vector = Update;\nupdateNotifySettings#bec268ef peer:NotifyPeer notify_settings:PeerNotifySettings = Update;\nupdateServiceNotification#ebe46819 flags:# popup:flags.0?true inbox_date:flags.1?int type:string message:string media:MessageMedia entities:Vector = Update;\nupdatePrivacy#ee3b272a key:PrivacyKey rules:Vector = Update;\nupdateUserPhone#12b9417b user_id:int phone:string = Update;\nupdateReadHistoryInbox#9c974fdf flags:# folder_id:flags.0?int peer:Peer max_id:int still_unread_count:int pts:int pts_count:int = Update;\nupdateReadHistoryOutbox#2f2f21bf peer:Peer max_id:int pts:int pts_count:int = Update;\nupdateWebPage#7f891213 webpage:WebPage pts:int pts_count:int = Update;\nupdateReadMessagesContents#68c13933 messages:Vector pts:int pts_count:int = Update;\nupdateChannelTooLong#eb0467fb flags:# channel_id:int pts:flags.0?int = Update;\nupdateChannel#b6d45656 channel_id:int = Update;\nupdateNewChannelMessage#62ba04d9 message:Message pts:int pts_count:int = Update;\nupdateReadChannelInbox#330b5424 flags:# folder_id:flags.0?int channel_id:int max_id:int still_unread_count:int pts:int = Update;\nupdateDeleteChannelMessages#c37521c9 channel_id:int messages:Vector pts:int pts_count:int = Update;\nupdateChannelMessageViews#98a12b4b channel_id:int id:int views:int = Update;\nupdateChatParticipantAdmin#b6901959 chat_id:int user_id:int is_admin:Bool version:int = Update;\nupdateNewStickerSet#688a30aa stickerset:messages.StickerSet = Update;\nupdateStickerSetsOrder#bb2d201 flags:# masks:flags.0?true order:Vector = Update;\nupdateStickerSets#43ae3dec = Update;\nupdateSavedGifs#9375341e = Update;\nupdateBotInlineQuery#3f2038db flags:# query_id:long user_id:int query:string geo:flags.0?GeoPoint peer_type:flags.1?InlineQueryPeerType offset:string = Update;\nupdateBotInlineSend#e48f964 flags:# user_id:int query:string geo:flags.0?GeoPoint id:string msg_id:flags.1?InputBotInlineMessageID = Update;\nupdateEditChannelMessage#1b3f4df7 message:Message pts:int pts_count:int = Update;\nupdateBotCallbackQuery#e73547e1 flags:# query_id:long user_id:int peer:Peer msg_id:int chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update;\nupdateEditMessage#e40370a3 message:Message pts:int pts_count:int = Update;\nupdateInlineBotCallbackQuery#f9d27a5a flags:# query_id:long user_id:int msg_id:InputBotInlineMessageID chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update;\nupdateReadChannelOutbox#25d6c9c7 channel_id:int max_id:int = Update;\nupdateDraftMessage#ee2bb969 peer:Peer draft:DraftMessage = Update;\nupdateReadFeaturedStickers#571d2742 = Update;\nupdateRecentStickers#9a422c20 = Update;\nupdateConfig#a229dd06 = Update;\nupdatePtsChanged#3354678f = Update;\nupdateChannelWebPage#40771900 channel_id:int webpage:WebPage pts:int pts_count:int = Update;\nupdateDialogPinned#6e6fe51c flags:# pinned:flags.0?true folder_id:flags.1?int peer:DialogPeer = Update;\nupdatePinnedDialogs#fa0f3ca2 flags:# folder_id:flags.1?int order:flags.0?Vector = Update;\nupdateBotWebhookJSON#8317c0c3 data:DataJSON = Update;\nupdateBotWebhookJSONQuery#9b9240a6 query_id:long data:DataJSON timeout:int = Update;\nupdateBotShippingQuery#e0cdc940 query_id:long user_id:int payload:bytes shipping_address:PostAddress = Update;\nupdateBotPrecheckoutQuery#5d2f3aa9 flags:# query_id:long user_id:int payload:bytes info:flags.0?PaymentRequestedInfo shipping_option_id:flags.1?string currency:string total_amount:long = Update;\nupdatePhoneCall#ab0f6b1e phone_call:PhoneCall = Update;\nupdateLangPackTooLong#46560264 lang_code:string = Update;\nupdateLangPack#56022f4d difference:LangPackDifference = Update;\nupdateFavedStickers#e511996d = Update;\nupdateChannelReadMessagesContents#89893b45 channel_id:int messages:Vector = Update;\nupdateContactsReset#7084a7be = Update;\nupdateChannelAvailableMessages#70db6837 channel_id:int available_min_id:int = Update;\nupdateDialogUnreadMark#e16459c3 flags:# unread:flags.0?true peer:DialogPeer = Update;\nupdateMessagePoll#aca1657b flags:# poll_id:long poll:flags.0?Poll results:PollResults = Update;\nupdateChatDefaultBannedRights#54c01850 peer:Peer default_banned_rights:ChatBannedRights version:int = Update;\nupdateFolderPeers#19360dc0 folder_peers:Vector pts:int pts_count:int = Update;\nupdatePeerSettings#6a7e7366 peer:Peer settings:PeerSettings = Update;\nupdatePeerLocated#b4afcfb0 peers:Vector = Update;\nupdateNewScheduledMessage#39a51dfb message:Message = Update;\nupdateDeleteScheduledMessages#90866cee peer:Peer messages:Vector = Update;\nupdateTheme#8216fba3 theme:Theme = Update;\nupdateGeoLiveViewed#871fb939 peer:Peer msg_id:int = Update;\nupdateLoginToken#564fe691 = Update;\nupdateMessagePollVote#37f69f0b poll_id:long user_id:int options:Vector qts:int = Update;\nupdateDialogFilter#26ffde7d flags:# id:int filter:flags.0?DialogFilter = Update;\nupdateDialogFilterOrder#a5d72105 order:Vector = Update;\nupdateDialogFilters#3504914f = Update;\nupdatePhoneCallSignalingData#2661bf09 phone_call_id:long data:bytes = Update;\nupdateChannelMessageForwards#6e8a84df channel_id:int id:int forwards:int = Update;\nupdateReadChannelDiscussionInbox#1cc7de54 flags:# channel_id:int top_msg_id:int read_max_id:int broadcast_id:flags.0?int broadcast_post:flags.0?int = Update;\nupdateReadChannelDiscussionOutbox#4638a26c channel_id:int top_msg_id:int read_max_id:int = Update;\nupdatePeerBlocked#246a4b22 peer_id:Peer blocked:Bool = Update;\nupdateChannelUserTyping#6b171718 flags:# channel_id:int top_msg_id:flags.0?int from_id:Peer action:SendMessageAction = Update;\nupdatePinnedMessages#ed85eab5 flags:# pinned:flags.0?true peer:Peer messages:Vector pts:int pts_count:int = Update;\nupdatePinnedChannelMessages#8588878b flags:# pinned:flags.0?true channel_id:int messages:Vector pts:int pts_count:int = Update;\nupdateChat#1330a196 chat_id:int = Update;\nupdateGroupCallParticipants#f2ebdb4e call:InputGroupCall participants:Vector version:int = Update;\nupdateGroupCall#a45eb99b chat_id:int call:GroupCall = Update;\nupdatePeerHistoryTTL#bb9bb9a5 flags:# peer:Peer ttl_period:flags.0?int = Update;\nupdateChatParticipant#f3b3781f flags:# chat_id:int date:int actor_id:int user_id:int prev_participant:flags.0?ChatParticipant new_participant:flags.1?ChatParticipant invite:flags.2?ExportedChatInvite qts:int = Update;\nupdateChannelParticipant#7fecb1ec flags:# channel_id:int date:int actor_id:int user_id:int prev_participant:flags.0?ChannelParticipant new_participant:flags.1?ChannelParticipant invite:flags.2?ExportedChatInvite qts:int = Update;\nupdateBotStopped#7f9488a user_id:int date:int stopped:Bool qts:int = Update;\nupdateGroupCallConnection#b783982 flags:# presentation:flags.0?true params:DataJSON = Update;\nupdateBotCommands#cf7e0873 peer:Peer bot_id:int commands:Vector = Update;\nupdates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;\nupdates.differenceEmpty#5d75a138 date:int seq:int = updates.Difference;\nupdates.difference#f49ca0 new_messages:Vector new_encrypted_messages:Vector other_updates:Vector chats:Vector users:Vector state:updates.State = updates.Difference;\nupdates.differenceSlice#a8fb1981 new_messages:Vector new_encrypted_messages:Vector other_updates:Vector chats:Vector users:Vector intermediate_state:updates.State = updates.Difference;\nupdates.differenceTooLong#4afe8f6d pts:int = updates.Difference;\nupdatesTooLong#e317af7e = Updates;\nupdateShortMessage#faeff833 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int user_id:int message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader entities:flags.7?Vector ttl_period:flags.25?int = Updates;\nupdateShortChatMessage#1157b858 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true id:int from_id:int chat_id:int message:string pts:int pts_count:int date:int fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader entities:flags.7?Vector ttl_period:flags.25?int = Updates;\nupdateShort#78d4dec1 update:Update date:int = Updates;\nupdatesCombined#725b04c3 updates:Vector users:Vector chats:Vector date:int seq_start:int seq:int = Updates;\nupdates#74ae4240 updates:Vector users:Vector chats:Vector date:int seq:int = Updates;\nupdateShortSentMessage#9015e101 flags:# out:flags.1?true id:int pts:int pts_count:int date:int media:flags.9?MessageMedia entities:flags.7?Vector ttl_period:flags.25?int = Updates;\nphotos.photos#8dca6aa5 photos:Vector users:Vector = photos.Photos;\nphotos.photosSlice#15051f54 count:int photos:Vector users:Vector = photos.Photos;\nphotos.photo#20212ca8 photo:Photo users:Vector = photos.Photo;\nupload.file#96a18d5 type:storage.FileType mtime:int bytes:bytes = upload.File;\nupload.fileCdnRedirect#f18cda44 dc_id:int file_token:bytes encryption_key:bytes encryption_iv:bytes file_hashes:Vector = upload.File;\ndcOption#18b7a10d flags:# ipv6:flags.0?true media_only:flags.1?true tcpo_only:flags.2?true cdn:flags.3?true static:flags.4?true id:int ip_address:string port:int secret:flags.10?bytes = DcOption;\nconfig#330b4067 flags:# phonecalls_enabled:flags.1?true default_p2p_contacts:flags.3?true preload_featured_stickers:flags.4?true ignore_phone_entities:flags.5?true revoke_pm_inbox:flags.6?true blocked_mode:flags.8?true pfs_enabled:flags.13?true date:int expires:int test_mode:Bool this_dc:int dc_options:Vector dc_txt_domain_name:string chat_size_max:int megagroup_size_max:int forwarded_count_max:int online_update_period_ms:int offline_blur_timeout_ms:int offline_idle_timeout_ms:int online_cloud_timeout_ms:int notify_cloud_delay_ms:int notify_default_delay_ms:int push_chat_period_ms:int push_chat_limit:int saved_gifs_limit:int edit_time_limit:int revoke_time_limit:int revoke_pm_time_limit:int rating_e_decay:int stickers_recent_limit:int stickers_faved_limit:int channels_read_media_period:int tmp_sessions:flags.0?int pinned_dialogs_count_max:int pinned_infolder_count_max:int call_receive_timeout_ms:int call_ring_timeout_ms:int call_connect_timeout_ms:int call_packet_timeout_ms:int me_url_prefix:string autoupdate_url_prefix:flags.7?string gif_search_username:flags.9?string venue_search_username:flags.10?string img_search_username:flags.11?string static_maps_provider:flags.12?string caption_length_max:int message_length_max:int webfile_dc_id:int suggested_lang_code:flags.2?string lang_pack_version:flags.2?int base_lang_pack_version:flags.2?int = Config;\nnearestDc#8e1a1775 country:string this_dc:int nearest_dc:int = NearestDc;\nhelp.appUpdate#ccbbce30 flags:# can_not_skip:flags.0?true id:int version:string text:string entities:Vector document:flags.1?Document url:flags.2?string sticker:flags.3?Document = help.AppUpdate;\nhelp.noAppUpdate#c45a6536 = help.AppUpdate;\nhelp.inviteText#18cb9f78 message:string = help.InviteText;\nencryptedChatEmpty#ab7ec0a0 id:int = EncryptedChat;\nencryptedChatWaiting#3bf703dc id:int access_hash:long date:int admin_id:int participant_id:int = EncryptedChat;\nencryptedChatRequested#62718a82 flags:# folder_id:flags.0?int id:int access_hash:long date:int admin_id:int participant_id:int g_a:bytes = EncryptedChat;\nencryptedChat#fa56ce36 id:int access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long = EncryptedChat;\nencryptedChatDiscarded#1e1c7c45 flags:# history_deleted:flags.0?true id:int = EncryptedChat;\ninputEncryptedChat#f141b5e1 chat_id:int access_hash:long = InputEncryptedChat;\nencryptedFileEmpty#c21f497e = EncryptedFile;\nencryptedFile#4a70994c id:long access_hash:long size:int dc_id:int key_fingerprint:int = EncryptedFile;\ninputEncryptedFileEmpty#1837c364 = InputEncryptedFile;\ninputEncryptedFileUploaded#64bd0306 id:long parts:int md5_checksum:string key_fingerprint:int = InputEncryptedFile;\ninputEncryptedFile#5a17b5e5 id:long access_hash:long = InputEncryptedFile;\ninputEncryptedFileBigUploaded#2dc173c8 id:long parts:int key_fingerprint:int = InputEncryptedFile;\nencryptedMessage#ed18c118 random_id:long chat_id:int date:int bytes:bytes file:EncryptedFile = EncryptedMessage;\nencryptedMessageService#23734b06 random_id:long chat_id:int date:int bytes:bytes = EncryptedMessage;\nmessages.dhConfigNotModified#c0e24635 random:bytes = messages.DhConfig;\nmessages.dhConfig#2c221edd g:int p:bytes version:int random:bytes = messages.DhConfig;\nmessages.sentEncryptedMessage#560f8935 date:int = messages.SentEncryptedMessage;\nmessages.sentEncryptedFile#9493ff32 date:int file:EncryptedFile = messages.SentEncryptedMessage;\ninputDocumentEmpty#72f0eaae = InputDocument;\ninputDocument#1abfb575 id:long access_hash:long file_reference:bytes = InputDocument;\ndocumentEmpty#36f8c871 id:long = Document;\ndocument#1e87342b flags:# id:long access_hash:long file_reference:bytes date:int mime_type:string size:int thumbs:flags.0?Vector video_thumbs:flags.1?Vector dc_id:int attributes:Vector = Document;\nhelp.support#17c6b5f6 phone_number:string user:User = help.Support;\nnotifyPeer#9fd40bd8 peer:Peer = NotifyPeer;\nnotifyUsers#b4c83b4c = NotifyPeer;\nnotifyChats#c007cec3 = NotifyPeer;\nnotifyBroadcasts#d612e8ef = NotifyPeer;\nsendMessageTypingAction#16bf744e = SendMessageAction;\nsendMessageCancelAction#fd5ec8f5 = SendMessageAction;\nsendMessageRecordVideoAction#a187d66f = SendMessageAction;\nsendMessageUploadVideoAction#e9763aec progress:int = SendMessageAction;\nsendMessageRecordAudioAction#d52f73f7 = SendMessageAction;\nsendMessageUploadAudioAction#f351d7ab progress:int = SendMessageAction;\nsendMessageUploadPhotoAction#d1d34a26 progress:int = SendMessageAction;\nsendMessageUploadDocumentAction#aa0cd9e4 progress:int = SendMessageAction;\nsendMessageGeoLocationAction#176f8ba1 = SendMessageAction;\nsendMessageChooseContactAction#628cbc6f = SendMessageAction;\nsendMessageGamePlayAction#dd6a8f48 = SendMessageAction;\nsendMessageRecordRoundAction#88f27fbc = SendMessageAction;\nsendMessageUploadRoundAction#243e1c66 progress:int = SendMessageAction;\nspeakingInGroupCallAction#d92c2285 = SendMessageAction;\nsendMessageHistoryImportAction#dbda9246 progress:int = SendMessageAction;\ncontacts.found#b3134d9d my_results:Vector results:Vector chats:Vector users:Vector = contacts.Found;\ninputPrivacyKeyStatusTimestamp#4f96cb18 = InputPrivacyKey;\ninputPrivacyKeyChatInvite#bdfb0426 = InputPrivacyKey;\ninputPrivacyKeyPhoneCall#fabadc5f = InputPrivacyKey;\ninputPrivacyKeyPhoneP2P#db9e70d2 = InputPrivacyKey;\ninputPrivacyKeyForwards#a4dd4c08 = InputPrivacyKey;\ninputPrivacyKeyProfilePhoto#5719bacc = InputPrivacyKey;\ninputPrivacyKeyPhoneNumber#352dafa = InputPrivacyKey;\ninputPrivacyKeyAddedByPhone#d1219bdd = InputPrivacyKey;\nprivacyKeyStatusTimestamp#bc2eab30 = PrivacyKey;\nprivacyKeyChatInvite#500e6dfa = PrivacyKey;\nprivacyKeyPhoneCall#3d662b7b = PrivacyKey;\nprivacyKeyPhoneP2P#39491cc8 = PrivacyKey;\nprivacyKeyForwards#69ec56a3 = PrivacyKey;\nprivacyKeyProfilePhoto#96151fed = PrivacyKey;\nprivacyKeyPhoneNumber#d19ae46d = PrivacyKey;\nprivacyKeyAddedByPhone#42ffd42b = PrivacyKey;\ninputPrivacyValueAllowContacts#d09e07b = InputPrivacyRule;\ninputPrivacyValueAllowAll#184b35ce = InputPrivacyRule;\ninputPrivacyValueAllowUsers#131cc67f users:Vector = InputPrivacyRule;\ninputPrivacyValueDisallowContacts#ba52007 = InputPrivacyRule;\ninputPrivacyValueDisallowAll#d66b66c9 = InputPrivacyRule;\ninputPrivacyValueDisallowUsers#90110467 users:Vector = InputPrivacyRule;\ninputPrivacyValueAllowChatParticipants#4c81c1ba chats:Vector = InputPrivacyRule;\ninputPrivacyValueDisallowChatParticipants#d82363af chats:Vector = InputPrivacyRule;\nprivacyValueAllowContacts#fffe1bac = PrivacyRule;\nprivacyValueAllowAll#65427b82 = PrivacyRule;\nprivacyValueAllowUsers#4d5bbe0c users:Vector = PrivacyRule;\nprivacyValueDisallowContacts#f888fa1a = PrivacyRule;\nprivacyValueDisallowAll#8b73e763 = PrivacyRule;\nprivacyValueDisallowUsers#c7f49b7 users:Vector = PrivacyRule;\nprivacyValueAllowChatParticipants#18be796b chats:Vector = PrivacyRule;\nprivacyValueDisallowChatParticipants#acae0690 chats:Vector = PrivacyRule;\naccount.privacyRules#50a04e45 rules:Vector chats:Vector users:Vector = account.PrivacyRules;\naccountDaysTTL#b8d0afdf days:int = AccountDaysTTL;\ndocumentAttributeImageSize#6c37c15c w:int h:int = DocumentAttribute;\ndocumentAttributeAnimated#11b58939 = DocumentAttribute;\ndocumentAttributeSticker#6319d612 flags:# mask:flags.1?true alt:string stickerset:InputStickerSet mask_coords:flags.0?MaskCoords = DocumentAttribute;\ndocumentAttributeVideo#ef02ce6 flags:# round_message:flags.0?true supports_streaming:flags.1?true duration:int w:int h:int = DocumentAttribute;\ndocumentAttributeAudio#9852f9c6 flags:# voice:flags.10?true duration:int title:flags.0?string performer:flags.1?string waveform:flags.2?bytes = DocumentAttribute;\ndocumentAttributeFilename#15590068 file_name:string = DocumentAttribute;\ndocumentAttributeHasStickers#9801d2f7 = DocumentAttribute;\nmessages.stickersNotModified#f1749a22 = messages.Stickers;\nmessages.stickers#e4599bbd hash:int stickers:Vector = messages.Stickers;\nstickerPack#12b299d4 emoticon:string documents:Vector = StickerPack;\nmessages.allStickersNotModified#e86602c3 = messages.AllStickers;\nmessages.allStickers#edfd405f hash:int sets:Vector = messages.AllStickers;\nmessages.affectedMessages#84d19185 pts:int pts_count:int = messages.AffectedMessages;\nwebPageEmpty#eb1477e8 id:long = WebPage;\nwebPagePending#c586da1c id:long date:int = WebPage;\nwebPage#e89c45b2 flags:# id:long url:string display_url:string hash:int type:flags.0?string site_name:flags.1?string title:flags.2?string description:flags.3?string photo:flags.4?Photo embed_url:flags.5?string embed_type:flags.5?string embed_width:flags.6?int embed_height:flags.6?int duration:flags.7?int author:flags.8?string document:flags.9?Document cached_page:flags.10?Page attributes:flags.12?Vector = WebPage;\nwebPageNotModified#7311ca11 flags:# cached_page_views:flags.0?int = WebPage;\nauthorization#ad01d61d flags:# current:flags.0?true official_app:flags.1?true password_pending:flags.2?true hash:long device_model:string platform:string system_version:string api_id:int app_name:string app_version:string date_created:int date_active:int ip:string country:string region:string = Authorization;\naccount.authorizations#1250abde authorizations:Vector = account.Authorizations;\naccount.password#185b184f flags:# has_recovery:flags.0?true has_secure_values:flags.1?true has_password:flags.2?true current_algo:flags.2?PasswordKdfAlgo srp_B:flags.2?bytes srp_id:flags.2?long hint:flags.3?string email_unconfirmed_pattern:flags.4?string new_algo:PasswordKdfAlgo new_secure_algo:SecurePasswordKdfAlgo secure_random:bytes pending_reset_date:flags.5?int = account.Password;\naccount.passwordSettings#9a5c33e5 flags:# email:flags.0?string secure_settings:flags.1?SecureSecretSettings = account.PasswordSettings;\naccount.passwordInputSettings#c23727c9 flags:# new_algo:flags.0?PasswordKdfAlgo new_password_hash:flags.0?bytes hint:flags.0?string email:flags.1?string new_secure_settings:flags.2?SecureSecretSettings = account.PasswordInputSettings;\nauth.passwordRecovery#137948a5 email_pattern:string = auth.PasswordRecovery;\nreceivedNotifyMessage#a384b779 id:int flags:int = ReceivedNotifyMessage;\nchatInviteExported#6e24fc9d flags:# revoked:flags.0?true permanent:flags.5?true link:string admin_id:int date:int start_date:flags.4?int expire_date:flags.1?int usage_limit:flags.2?int usage:flags.3?int = ExportedChatInvite;\nchatInviteAlready#5a686d7c chat:Chat = ChatInvite;\nchatInvite#dfc2f58e flags:# channel:flags.0?true broadcast:flags.1?true public:flags.2?true megagroup:flags.3?true title:string photo:Photo participants_count:int participants:flags.4?Vector = ChatInvite;\nchatInvitePeek#61695cb0 chat:Chat expires:int = ChatInvite;\ninputStickerSetEmpty#ffb62b95 = InputStickerSet;\ninputStickerSetID#9de7a269 id:long access_hash:long = InputStickerSet;\ninputStickerSetShortName#861cc8a0 short_name:string = InputStickerSet;\ninputStickerSetAnimatedEmoji#28703c8 = InputStickerSet;\ninputStickerSetDice#e67f520e emoticon:string = InputStickerSet;\nstickerSet#d7df217a flags:# archived:flags.1?true official:flags.2?true masks:flags.3?true animated:flags.5?true installed_date:flags.0?int id:long access_hash:long title:string short_name:string thumbs:flags.4?Vector thumb_dc_id:flags.4?int thumb_version:flags.4?int count:int hash:int = StickerSet;\nmessages.stickerSet#b60a24a6 set:StickerSet packs:Vector documents:Vector = messages.StickerSet;\nbotCommand#c27ac8c7 command:string description:string = BotCommand;\nbotInfo#98e81d3a user_id:int description:string commands:Vector = BotInfo;\nkeyboardButton#a2fa4880 text:string = KeyboardButton;\nkeyboardButtonUrl#258aff05 text:string url:string = KeyboardButton;\nkeyboardButtonCallback#35bbdb6b flags:# requires_password:flags.0?true text:string data:bytes = KeyboardButton;\nkeyboardButtonRequestPhone#b16a6c29 text:string = KeyboardButton;\nkeyboardButtonRequestGeoLocation#fc796b3f text:string = KeyboardButton;\nkeyboardButtonSwitchInline#568a748 flags:# same_peer:flags.0?true text:string query:string = KeyboardButton;\nkeyboardButtonGame#50f41ccf text:string = KeyboardButton;\nkeyboardButtonBuy#afd93fbb text:string = KeyboardButton;\nkeyboardButtonUrlAuth#10b78d29 flags:# text:string fwd_text:flags.0?string url:string button_id:int = KeyboardButton;\ninputKeyboardButtonUrlAuth#d02e7fd4 flags:# request_write_access:flags.0?true text:string fwd_text:flags.1?string url:string bot:InputUser = KeyboardButton;\nkeyboardButtonRequestPoll#bbc7515d flags:# quiz:flags.0?Bool text:string = KeyboardButton;\nkeyboardButtonRow#77608b83 buttons:Vector = KeyboardButtonRow;\nreplyKeyboardHide#a03e5b85 flags:# selective:flags.2?true = ReplyMarkup;\nreplyKeyboardForceReply#86b40b08 flags:# single_use:flags.1?true selective:flags.2?true placeholder:flags.3?string = ReplyMarkup;\nreplyKeyboardMarkup#85dd99d1 flags:# resize:flags.0?true single_use:flags.1?true selective:flags.2?true rows:Vector placeholder:flags.3?string = ReplyMarkup;\nreplyInlineMarkup#48a30254 rows:Vector = ReplyMarkup;\nmessageEntityUnknown#bb92ba95 offset:int length:int = MessageEntity;\nmessageEntityMention#fa04579d offset:int length:int = MessageEntity;\nmessageEntityHashtag#6f635b0d offset:int length:int = MessageEntity;\nmessageEntityBotCommand#6cef8ac7 offset:int length:int = MessageEntity;\nmessageEntityUrl#6ed02538 offset:int length:int = MessageEntity;\nmessageEntityEmail#64e475c2 offset:int length:int = MessageEntity;\nmessageEntityBold#bd610bc9 offset:int length:int = MessageEntity;\nmessageEntityItalic#826f8b60 offset:int length:int = MessageEntity;\nmessageEntityCode#28a20571 offset:int length:int = MessageEntity;\nmessageEntityPre#73924be0 offset:int length:int language:string = MessageEntity;\nmessageEntityTextUrl#76a6d327 offset:int length:int url:string = MessageEntity;\nmessageEntityMentionName#352dca58 offset:int length:int user_id:int = MessageEntity;\ninputMessageEntityMentionName#208e68c9 offset:int length:int user_id:InputUser = MessageEntity;\nmessageEntityPhone#9b69e34b offset:int length:int = MessageEntity;\nmessageEntityCashtag#4c4e743f offset:int length:int = MessageEntity;\nmessageEntityUnderline#9c4e7e8b offset:int length:int = MessageEntity;\nmessageEntityStrike#bf0693d4 offset:int length:int = MessageEntity;\nmessageEntityBlockquote#20df5d0 offset:int length:int = MessageEntity;\nmessageEntityBankCard#761e6af4 offset:int length:int = MessageEntity;\ninputChannelEmpty#ee8c1e86 = InputChannel;\ninputChannel#afeb712e channel_id:int access_hash:long = InputChannel;\ninputChannelFromMessage#2a286531 peer:InputPeer msg_id:int channel_id:int = InputChannel;\ncontacts.resolvedPeer#7f077ad9 peer:Peer chats:Vector users:Vector = contacts.ResolvedPeer;\nmessageRange#ae30253 min_id:int max_id:int = MessageRange;\nupdates.channelDifferenceEmpty#3e11affb flags:# final:flags.0?true pts:int timeout:flags.1?int = updates.ChannelDifference;\nupdates.channelDifferenceTooLong#a4bcc6fe flags:# final:flags.0?true timeout:flags.1?int dialog:Dialog messages:Vector chats:Vector users:Vector = updates.ChannelDifference;\nupdates.channelDifference#2064674e flags:# final:flags.0?true pts:int timeout:flags.1?int new_messages:Vector other_updates:Vector chats:Vector users:Vector = updates.ChannelDifference;\nchannelMessagesFilterEmpty#94d42ee7 = ChannelMessagesFilter;\nchannelMessagesFilter#cd77d957 flags:# exclude_new_messages:flags.1?true ranges:Vector = ChannelMessagesFilter;\nchannelParticipant#15ebac1d user_id:int date:int = ChannelParticipant;\nchannelParticipantSelf#a3289a6d user_id:int inviter_id:int date:int = ChannelParticipant;\nchannelParticipantCreator#447dca4b flags:# user_id:int admin_rights:ChatAdminRights rank:flags.0?string = ChannelParticipant;\nchannelParticipantAdmin#ccbebbaf flags:# can_edit:flags.0?true self:flags.1?true user_id:int inviter_id:flags.1?int promoted_by:int date:int admin_rights:ChatAdminRights rank:flags.2?string = ChannelParticipant;\nchannelParticipantBanned#50a1dfd6 flags:# left:flags.0?true peer:Peer kicked_by:int date:int banned_rights:ChatBannedRights = ChannelParticipant;\nchannelParticipantLeft#1b03f006 peer:Peer = ChannelParticipant;\nchannelParticipantsRecent#de3f3c79 = ChannelParticipantsFilter;\nchannelParticipantsAdmins#b4608969 = ChannelParticipantsFilter;\nchannelParticipantsKicked#a3b54985 q:string = ChannelParticipantsFilter;\nchannelParticipantsBots#b0d1865b = ChannelParticipantsFilter;\nchannelParticipantsBanned#1427a5e1 q:string = ChannelParticipantsFilter;\nchannelParticipantsSearch#656ac4b q:string = ChannelParticipantsFilter;\nchannelParticipantsContacts#bb6ae88d q:string = ChannelParticipantsFilter;\nchannelParticipantsMentions#e04b5ceb flags:# q:flags.0?string top_msg_id:flags.1?int = ChannelParticipantsFilter;\nchannels.channelParticipants#9ab0feaf count:int participants:Vector chats:Vector users:Vector = channels.ChannelParticipants;\nchannels.channelParticipantsNotModified#f0173fe9 = channels.ChannelParticipants;\nchannels.channelParticipant#dfb80317 participant:ChannelParticipant chats:Vector users:Vector = channels.ChannelParticipant;\nhelp.termsOfService#780a0310 flags:# popup:flags.0?true id:DataJSON text:string entities:Vector min_age_confirm:flags.1?int = help.TermsOfService;\nmessages.savedGifsNotModified#e8025ca2 = messages.SavedGifs;\nmessages.savedGifs#2e0709a5 hash:int gifs:Vector = messages.SavedGifs;\ninputBotInlineMessageMediaAuto#3380c786 flags:# message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\ninputBotInlineMessageText#3dcd7a87 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\ninputBotInlineMessageMediaGeo#96929a85 flags:# geo_point:InputGeoPoint heading:flags.0?int period:flags.1?int proximity_notification_radius:flags.3?int reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\ninputBotInlineMessageMediaVenue#417bbf11 flags:# geo_point:InputGeoPoint title:string address:string provider:string venue_id:string venue_type:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\ninputBotInlineMessageMediaContact#a6edbffd flags:# phone_number:string first_name:string last_name:string vcard:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\ninputBotInlineMessageGame#4b425864 flags:# reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\ninputBotInlineMessageMediaInvoice#d7e78225 flags:# title:string description:string photo:flags.0?InputWebDocument invoice:Invoice payload:bytes provider:string provider_data:DataJSON reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage;\ninputBotInlineResult#88bf9319 flags:# id:string type:string title:flags.1?string description:flags.2?string url:flags.3?string thumb:flags.4?InputWebDocument content:flags.5?InputWebDocument send_message:InputBotInlineMessage = InputBotInlineResult;\ninputBotInlineResultPhoto#a8d864a7 id:string type:string photo:InputPhoto send_message:InputBotInlineMessage = InputBotInlineResult;\ninputBotInlineResultDocument#fff8fdc4 flags:# id:string type:string title:flags.1?string description:flags.2?string document:InputDocument send_message:InputBotInlineMessage = InputBotInlineResult;\ninputBotInlineResultGame#4fa417f2 id:string short_name:string send_message:InputBotInlineMessage = InputBotInlineResult;\nbotInlineMessageMediaAuto#764cf810 flags:# message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = BotInlineMessage;\nbotInlineMessageText#8c7f65e2 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = BotInlineMessage;\nbotInlineMessageMediaGeo#51846fd flags:# geo:GeoPoint heading:flags.0?int period:flags.1?int proximity_notification_radius:flags.3?int reply_markup:flags.2?ReplyMarkup = BotInlineMessage;\nbotInlineMessageMediaVenue#8a86659c flags:# geo:GeoPoint title:string address:string provider:string venue_id:string venue_type:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage;\nbotInlineMessageMediaContact#18d1cdc2 flags:# phone_number:string first_name:string last_name:string vcard:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage;\nbotInlineMessageMediaInvoice#354a9b09 flags:# shipping_address_requested:flags.1?true test:flags.3?true title:string description:string photo:flags.0?WebDocument currency:string total_amount:long reply_markup:flags.2?ReplyMarkup = BotInlineMessage;\nbotInlineResult#11965f3a flags:# id:string type:string title:flags.1?string description:flags.2?string url:flags.3?string thumb:flags.4?WebDocument content:flags.5?WebDocument send_message:BotInlineMessage = BotInlineResult;\nbotInlineMediaResult#17db940b flags:# id:string type:string photo:flags.0?Photo document:flags.1?Document title:flags.2?string description:flags.3?string send_message:BotInlineMessage = BotInlineResult;\nmessages.botResults#947ca848 flags:# gallery:flags.0?true query_id:long next_offset:flags.1?string switch_pm:flags.2?InlineBotSwitchPM results:Vector cache_time:int users:Vector = messages.BotResults;\nexportedMessageLink#5dab1af4 link:string html:string = ExportedMessageLink;\nmessageFwdHeader#5f777dce flags:# imported:flags.7?true from_id:flags.0?Peer from_name:flags.5?string date:int channel_post:flags.2?int post_author:flags.3?string saved_from_peer:flags.4?Peer saved_from_msg_id:flags.4?int psa_type:flags.6?string = MessageFwdHeader;\nauth.codeTypeSms#72a3158c = auth.CodeType;\nauth.codeTypeCall#741cd3e3 = auth.CodeType;\nauth.codeTypeFlashCall#226ccefb = auth.CodeType;\nauth.sentCodeTypeApp#3dbb5986 length:int = auth.SentCodeType;\nauth.sentCodeTypeSms#c000bba2 length:int = auth.SentCodeType;\nauth.sentCodeTypeCall#5353e5a7 length:int = auth.SentCodeType;\nauth.sentCodeTypeFlashCall#ab03c6d9 pattern:string = auth.SentCodeType;\nmessages.botCallbackAnswer#36585ea4 flags:# alert:flags.1?true has_url:flags.3?true native_ui:flags.4?true message:flags.0?string url:flags.2?string cache_time:int = messages.BotCallbackAnswer;\nmessages.messageEditData#26b5dde6 flags:# caption:flags.0?true = messages.MessageEditData;\ninputBotInlineMessageID#890c3d89 dc_id:int id:long access_hash:long = InputBotInlineMessageID;\ninlineBotSwitchPM#3c20629f text:string start_param:string = InlineBotSwitchPM;\nmessages.peerDialogs#3371c354 dialogs:Vector messages:Vector chats:Vector users:Vector state:updates.State = messages.PeerDialogs;\ntopPeer#edcdc05b peer:Peer rating:double = TopPeer;\ntopPeerCategoryBotsPM#ab661b5b = TopPeerCategory;\ntopPeerCategoryBotsInline#148677e2 = TopPeerCategory;\ntopPeerCategoryCorrespondents#637b7ed = TopPeerCategory;\ntopPeerCategoryGroups#bd17a14a = TopPeerCategory;\ntopPeerCategoryChannels#161d9628 = TopPeerCategory;\ntopPeerCategoryPhoneCalls#1e76a78c = TopPeerCategory;\ntopPeerCategoryForwardUsers#a8406ca9 = TopPeerCategory;\ntopPeerCategoryForwardChats#fbeec0f0 = TopPeerCategory;\ntopPeerCategoryPeers#fb834291 category:TopPeerCategory count:int peers:Vector = TopPeerCategoryPeers;\ncontacts.topPeersNotModified#de266ef5 = contacts.TopPeers;\ncontacts.topPeers#70b772a8 categories:Vector chats:Vector users:Vector = contacts.TopPeers;\ncontacts.topPeersDisabled#b52c939d = contacts.TopPeers;\ndraftMessageEmpty#1b0c841a flags:# date:flags.0?int = DraftMessage;\ndraftMessage#fd8e711f flags:# no_webpage:flags.1?true reply_to_msg_id:flags.0?int message:string entities:flags.3?Vector date:int = DraftMessage;\nmessages.featuredStickersNotModified#c6dc0c66 count:int = messages.FeaturedStickers;\nmessages.featuredStickers#b6abc341 hash:int count:int sets:Vector unread:Vector = messages.FeaturedStickers;\nmessages.recentStickersNotModified#b17f890 = messages.RecentStickers;\nmessages.recentStickers#22f3afb3 hash:int packs:Vector stickers:Vector dates:Vector = messages.RecentStickers;\nmessages.archivedStickers#4fcba9c8 count:int sets:Vector = messages.ArchivedStickers;\nmessages.stickerSetInstallResultSuccess#38641628 = messages.StickerSetInstallResult;\nmessages.stickerSetInstallResultArchive#35e410a8 sets:Vector = messages.StickerSetInstallResult;\nstickerSetCovered#6410a5d2 set:StickerSet cover:Document = StickerSetCovered;\nstickerSetMultiCovered#3407e51b set:StickerSet covers:Vector = StickerSetCovered;\nmaskCoords#aed6dbb2 n:int x:double y:double zoom:double = MaskCoords;\ninputStickeredMediaPhoto#4a992157 id:InputPhoto = InputStickeredMedia;\ninputStickeredMediaDocument#438865b id:InputDocument = InputStickeredMedia;\ngame#bdf9653b flags:# id:long access_hash:long short_name:string title:string description:string photo:Photo document:flags.0?Document = Game;\ninputGameID#32c3e77 id:long access_hash:long = InputGame;\ninputGameShortName#c331e80a bot_id:InputUser short_name:string = InputGame;\nhighScore#58fffcd0 pos:int user_id:int score:int = HighScore;\nmessages.highScores#9a3bfd99 scores:Vector users:Vector = messages.HighScores;\ntextEmpty#dc3d824f = RichText;\ntextPlain#744694e0 text:string = RichText;\ntextBold#6724abc4 text:RichText = RichText;\ntextItalic#d912a59c text:RichText = RichText;\ntextUnderline#c12622c4 text:RichText = RichText;\ntextStrike#9bf8bb95 text:RichText = RichText;\ntextFixed#6c3f19b9 text:RichText = RichText;\ntextUrl#3c2884c1 text:RichText url:string webpage_id:long = RichText;\ntextEmail#de5a0dd6 text:RichText email:string = RichText;\ntextConcat#7e6260d7 texts:Vector = RichText;\ntextSubscript#ed6a8504 text:RichText = RichText;\ntextSuperscript#c7fb5e01 text:RichText = RichText;\ntextMarked#34b8621 text:RichText = RichText;\ntextPhone#1ccb966a text:RichText phone:string = RichText;\ntextImage#81ccf4f document_id:long w:int h:int = RichText;\ntextAnchor#35553762 text:RichText name:string = RichText;\npageBlockUnsupported#13567e8a = PageBlock;\npageBlockTitle#70abc3fd text:RichText = PageBlock;\npageBlockSubtitle#8ffa9a1f text:RichText = PageBlock;\npageBlockAuthorDate#baafe5e0 author:RichText published_date:int = PageBlock;\npageBlockHeader#bfd064ec text:RichText = PageBlock;\npageBlockSubheader#f12bb6e1 text:RichText = PageBlock;\npageBlockParagraph#467a0766 text:RichText = PageBlock;\npageBlockPreformatted#c070d93e text:RichText language:string = PageBlock;\npageBlockFooter#48870999 text:RichText = PageBlock;\npageBlockDivider#db20b188 = PageBlock;\npageBlockAnchor#ce0d37b0 name:string = PageBlock;\npageBlockList#e4e88011 items:Vector = PageBlock;\npageBlockBlockquote#263d7c26 text:RichText caption:RichText = PageBlock;\npageBlockPullquote#4f4456d3 text:RichText caption:RichText = PageBlock;\npageBlockPhoto#1759c560 flags:# photo_id:long caption:PageCaption url:flags.0?string webpage_id:flags.0?long = PageBlock;\npageBlockVideo#7c8fe7b6 flags:# autoplay:flags.0?true loop:flags.1?true video_id:long caption:PageCaption = PageBlock;\npageBlockCover#39f23300 cover:PageBlock = PageBlock;\npageBlockEmbed#a8718dc5 flags:# full_width:flags.0?true allow_scrolling:flags.3?true url:flags.1?string html:flags.2?string poster_photo_id:flags.4?long w:flags.5?int h:flags.5?int caption:PageCaption = PageBlock;\npageBlockEmbedPost#f259a80b url:string webpage_id:long author_photo_id:long author:string date:int blocks:Vector caption:PageCaption = PageBlock;\npageBlockCollage#65a0fa4d items:Vector caption:PageCaption = PageBlock;\npageBlockSlideshow#31f9590 items:Vector caption:PageCaption = PageBlock;\npageBlockChannel#ef1751b5 channel:Chat = PageBlock;\npageBlockAudio#804361ea audio_id:long caption:PageCaption = PageBlock;\npageBlockKicker#1e148390 text:RichText = PageBlock;\npageBlockTable#bf4dea82 flags:# bordered:flags.0?true striped:flags.1?true title:RichText rows:Vector = PageBlock;\npageBlockOrderedList#9a8ae1e1 items:Vector = PageBlock;\npageBlockDetails#76768bed flags:# open:flags.0?true blocks:Vector title:RichText = PageBlock;\npageBlockRelatedArticles#16115a96 title:RichText articles:Vector = PageBlock;\npageBlockMap#a44f3ef6 geo:GeoPoint zoom:int w:int h:int caption:PageCaption = PageBlock;\nphoneCallDiscardReasonMissed#85e42301 = PhoneCallDiscardReason;\nphoneCallDiscardReasonDisconnect#e095c1a0 = PhoneCallDiscardReason;\nphoneCallDiscardReasonHangup#57adc690 = PhoneCallDiscardReason;\nphoneCallDiscardReasonBusy#faf7e8c9 = PhoneCallDiscardReason;\ndataJSON#7d748d04 data:string = DataJSON;\nlabeledPrice#cb296bf8 label:string amount:long = LabeledPrice;\ninvoice#cd886e0 flags:# test:flags.0?true name_requested:flags.1?true phone_requested:flags.2?true email_requested:flags.3?true shipping_address_requested:flags.4?true flexible:flags.5?true phone_to_provider:flags.6?true email_to_provider:flags.7?true currency:string prices:Vector max_tip_amount:flags.8?long suggested_tip_amounts:flags.8?Vector = Invoice;\npaymentCharge#ea02c27e id:string provider_charge_id:string = PaymentCharge;\npostAddress#1e8caaeb street_line1:string street_line2:string city:string state:string country_iso2:string post_code:string = PostAddress;\npaymentRequestedInfo#909c3f94 flags:# name:flags.0?string phone:flags.1?string email:flags.2?string shipping_address:flags.3?PostAddress = PaymentRequestedInfo;\npaymentSavedCredentialsCard#cdc27a1f id:string title:string = PaymentSavedCredentials;\nwebDocument#1c570ed1 url:string access_hash:long size:int mime_type:string attributes:Vector = WebDocument;\nwebDocumentNoProxy#f9c8bcc6 url:string size:int mime_type:string attributes:Vector = WebDocument;\ninputWebDocument#9bed434d url:string size:int mime_type:string attributes:Vector = InputWebDocument;\ninputWebFileLocation#c239d686 url:string access_hash:long = InputWebFileLocation;\ninputWebFileGeoPointLocation#9f2221c9 geo_point:InputGeoPoint access_hash:long w:int h:int zoom:int scale:int = InputWebFileLocation;\nupload.webFile#21e753bc size:int mime_type:string file_type:storage.FileType mtime:int bytes:bytes = upload.WebFile;\npayments.paymentForm#8d0b2415 flags:# can_save_credentials:flags.2?true password_missing:flags.3?true form_id:long bot_id:int invoice:Invoice provider_id:int url:string native_provider:flags.4?string native_params:flags.4?DataJSON saved_info:flags.0?PaymentRequestedInfo saved_credentials:flags.1?PaymentSavedCredentials users:Vector = payments.PaymentForm;\npayments.validatedRequestedInfo#d1451883 flags:# id:flags.0?string shipping_options:flags.1?Vector = payments.ValidatedRequestedInfo;\npayments.paymentResult#4e5f810d updates:Updates = payments.PaymentResult;\npayments.paymentVerificationNeeded#d8411139 url:string = payments.PaymentResult;\npayments.paymentReceipt#10b555d0 flags:# date:int bot_id:int provider_id:int title:string description:string photo:flags.2?WebDocument invoice:Invoice info:flags.0?PaymentRequestedInfo shipping:flags.1?ShippingOption tip_amount:flags.3?long currency:string total_amount:long credentials_title:string users:Vector = payments.PaymentReceipt;\npayments.savedInfo#fb8fe43c flags:# has_saved_credentials:flags.1?true saved_info:flags.0?PaymentRequestedInfo = payments.SavedInfo;\ninputPaymentCredentialsSaved#c10eb2cf id:string tmp_password:bytes = InputPaymentCredentials;\ninputPaymentCredentials#3417d728 flags:# save:flags.0?true data:DataJSON = InputPaymentCredentials;\ninputPaymentCredentialsApplePay#aa1c39f payment_data:DataJSON = InputPaymentCredentials;\ninputPaymentCredentialsGooglePay#8ac32801 payment_token:DataJSON = InputPaymentCredentials;\naccount.tmpPassword#db64fd34 tmp_password:bytes valid_until:int = account.TmpPassword;\nshippingOption#b6213cdf id:string title:string prices:Vector = ShippingOption;\ninputStickerSetItem#ffa0a496 flags:# document:InputDocument emoji:string mask_coords:flags.0?MaskCoords = InputStickerSetItem;\ninputPhoneCall#1e36fded id:long access_hash:long = InputPhoneCall;\nphoneCallEmpty#5366c915 id:long = PhoneCall;\nphoneCallWaiting#1b8f4ad1 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int protocol:PhoneCallProtocol receive_date:flags.0?int = PhoneCall;\nphoneCallRequested#87eabb53 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int g_a_hash:bytes protocol:PhoneCallProtocol = PhoneCall;\nphoneCallAccepted#997c454a flags:# video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int g_b:bytes protocol:PhoneCallProtocol = PhoneCall;\nphoneCall#8742ae7f flags:# p2p_allowed:flags.5?true video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long protocol:PhoneCallProtocol connections:Vector start_date:int = PhoneCall;\nphoneCallDiscarded#50ca4de1 flags:# need_rating:flags.2?true need_debug:flags.3?true video:flags.6?true id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = PhoneCall;\nphoneConnection#9d4c17c0 id:long ip:string ipv6:string port:int peer_tag:bytes = PhoneConnection;\nphoneConnectionWebrtc#635fe375 flags:# turn:flags.0?true stun:flags.1?true id:long ip:string ipv6:string port:int username:string password:string = PhoneConnection;\nphoneCallProtocol#fc878fc8 flags:# udp_p2p:flags.0?true udp_reflector:flags.1?true min_layer:int max_layer:int library_versions:Vector = PhoneCallProtocol;\nphone.phoneCall#ec82e140 phone_call:PhoneCall users:Vector = phone.PhoneCall;\nupload.cdnFileReuploadNeeded#eea8e46e request_token:bytes = upload.CdnFile;\nupload.cdnFile#a99fca4f bytes:bytes = upload.CdnFile;\ncdnPublicKey#c982eaba dc_id:int public_key:string = CdnPublicKey;\ncdnConfig#5725e40a public_keys:Vector = CdnConfig;\nlangPackString#cad181f6 key:string value:string = LangPackString;\nlangPackStringPluralized#6c47ac9f flags:# key:string zero_value:flags.0?string one_value:flags.1?string two_value:flags.2?string few_value:flags.3?string many_value:flags.4?string other_value:string = LangPackString;\nlangPackStringDeleted#2979eeb2 key:string = LangPackString;\nlangPackDifference#f385c1f6 lang_code:string from_version:int version:int strings:Vector = LangPackDifference;\nlangPackLanguage#eeca5ce3 flags:# official:flags.0?true rtl:flags.2?true beta:flags.3?true name:string native_name:string lang_code:string base_lang_code:flags.1?string plural_code:string strings_count:int translated_count:int translations_url:string = LangPackLanguage;\nchannelAdminLogEventActionChangeTitle#e6dfb825 prev_value:string new_value:string = ChannelAdminLogEventAction;\nchannelAdminLogEventActionChangeAbout#55188a2e prev_value:string new_value:string = ChannelAdminLogEventAction;\nchannelAdminLogEventActionChangeUsername#6a4afc38 prev_value:string new_value:string = ChannelAdminLogEventAction;\nchannelAdminLogEventActionChangePhoto#434bd2af prev_photo:Photo new_photo:Photo = ChannelAdminLogEventAction;\nchannelAdminLogEventActionToggleInvites#1b7907ae new_value:Bool = ChannelAdminLogEventAction;\nchannelAdminLogEventActionToggleSignatures#26ae0971 new_value:Bool = ChannelAdminLogEventAction;\nchannelAdminLogEventActionUpdatePinned#e9e82c18 message:Message = ChannelAdminLogEventAction;\nchannelAdminLogEventActionEditMessage#709b2405 prev_message:Message new_message:Message = ChannelAdminLogEventAction;\nchannelAdminLogEventActionDeleteMessage#42e047bb message:Message = ChannelAdminLogEventAction;\nchannelAdminLogEventActionParticipantJoin#183040d3 = ChannelAdminLogEventAction;\nchannelAdminLogEventActionParticipantLeave#f89777f2 = ChannelAdminLogEventAction;\nchannelAdminLogEventActionParticipantInvite#e31c34d8 participant:ChannelParticipant = ChannelAdminLogEventAction;\nchannelAdminLogEventActionParticipantToggleBan#e6d83d7e prev_participant:ChannelParticipant new_participant:ChannelParticipant = ChannelAdminLogEventAction;\nchannelAdminLogEventActionParticipantToggleAdmin#d5676710 prev_participant:ChannelParticipant new_participant:ChannelParticipant = ChannelAdminLogEventAction;\nchannelAdminLogEventActionChangeStickerSet#b1c3caa7 prev_stickerset:InputStickerSet new_stickerset:InputStickerSet = ChannelAdminLogEventAction;\nchannelAdminLogEventActionTogglePreHistoryHidden#5f5c95f1 new_value:Bool = ChannelAdminLogEventAction;\nchannelAdminLogEventActionDefaultBannedRights#2df5fc0a prev_banned_rights:ChatBannedRights new_banned_rights:ChatBannedRights = ChannelAdminLogEventAction;\nchannelAdminLogEventActionStopPoll#8f079643 message:Message = ChannelAdminLogEventAction;\nchannelAdminLogEventActionChangeLinkedChat#a26f881b prev_value:int new_value:int = ChannelAdminLogEventAction;\nchannelAdminLogEventActionChangeLocation#e6b76ae prev_value:ChannelLocation new_value:ChannelLocation = ChannelAdminLogEventAction;\nchannelAdminLogEventActionToggleSlowMode#53909779 prev_value:int new_value:int = ChannelAdminLogEventAction;\nchannelAdminLogEventActionStartGroupCall#23209745 call:InputGroupCall = ChannelAdminLogEventAction;\nchannelAdminLogEventActionDiscardGroupCall#db9f9140 call:InputGroupCall = ChannelAdminLogEventAction;\nchannelAdminLogEventActionParticipantMute#f92424d2 participant:GroupCallParticipant = ChannelAdminLogEventAction;\nchannelAdminLogEventActionParticipantUnmute#e64429c0 participant:GroupCallParticipant = ChannelAdminLogEventAction;\nchannelAdminLogEventActionToggleGroupCallSetting#56d6a247 join_muted:Bool = ChannelAdminLogEventAction;\nchannelAdminLogEventActionParticipantJoinByInvite#5cdada77 invite:ExportedChatInvite = ChannelAdminLogEventAction;\nchannelAdminLogEventActionExportedInviteDelete#5a50fca4 invite:ExportedChatInvite = ChannelAdminLogEventAction;\nchannelAdminLogEventActionExportedInviteRevoke#410a134e invite:ExportedChatInvite = ChannelAdminLogEventAction;\nchannelAdminLogEventActionExportedInviteEdit#e90ebb59 prev_invite:ExportedChatInvite new_invite:ExportedChatInvite = ChannelAdminLogEventAction;\nchannelAdminLogEventActionParticipantVolume#3e7f6847 participant:GroupCallParticipant = ChannelAdminLogEventAction;\nchannelAdminLogEventActionChangeHistoryTTL#6e941a38 prev_value:int new_value:int = ChannelAdminLogEventAction;\nchannelAdminLogEvent#3b5a3e40 id:long date:int user_id:int action:ChannelAdminLogEventAction = ChannelAdminLogEvent;\nchannels.adminLogResults#ed8af74d events:Vector chats:Vector users:Vector = channels.AdminLogResults;\nchannelAdminLogEventsFilter#ea107ae4 flags:# join:flags.0?true leave:flags.1?true invite:flags.2?true ban:flags.3?true unban:flags.4?true kick:flags.5?true unkick:flags.6?true promote:flags.7?true demote:flags.8?true info:flags.9?true settings:flags.10?true pinned:flags.11?true edit:flags.12?true delete:flags.13?true group_call:flags.14?true invites:flags.15?true = ChannelAdminLogEventsFilter;\npopularContact#5ce14175 client_id:long importers:int = PopularContact;\nmessages.favedStickersNotModified#9e8fa6d3 = messages.FavedStickers;\nmessages.favedStickers#f37f2f16 hash:int packs:Vector stickers:Vector = messages.FavedStickers;\nrecentMeUrlUnknown#46e1d13d url:string = RecentMeUrl;\nrecentMeUrlUser#8dbc3336 url:string user_id:int = RecentMeUrl;\nrecentMeUrlChat#a01b22f9 url:string chat_id:int = RecentMeUrl;\nrecentMeUrlChatInvite#eb49081d url:string chat_invite:ChatInvite = RecentMeUrl;\nrecentMeUrlStickerSet#bc0a57dc url:string set:StickerSetCovered = RecentMeUrl;\nhelp.recentMeUrls#e0310d7 urls:Vector chats:Vector users:Vector = help.RecentMeUrls;\ninputSingleMedia#1cc6e91f flags:# media:InputMedia random_id:long message:string entities:flags.0?Vector = InputSingleMedia;\nwebAuthorization#cac943f2 hash:long bot_id:int domain:string browser:string platform:string date_created:int date_active:int ip:string region:string = WebAuthorization;\naccount.webAuthorizations#ed56c9fc authorizations:Vector users:Vector = account.WebAuthorizations;\ninputMessageID#a676a322 id:int = InputMessage;\ninputMessageReplyTo#bad88395 id:int = InputMessage;\ninputMessagePinned#86872538 = InputMessage;\ninputMessageCallbackQuery#acfa1a7e id:int query_id:long = InputMessage;\ninputDialogPeer#fcaafeb7 peer:InputPeer = InputDialogPeer;\ninputDialogPeerFolder#64600527 folder_id:int = InputDialogPeer;\ndialogPeer#e56dbf05 peer:Peer = DialogPeer;\ndialogPeerFolder#514519e2 folder_id:int = DialogPeer;\nmessages.foundStickerSetsNotModified#d54b65d = messages.FoundStickerSets;\nmessages.foundStickerSets#5108d648 hash:int sets:Vector = messages.FoundStickerSets;\nfileHash#6242c773 offset:int limit:int hash:bytes = FileHash;\ninputClientProxy#75588b3f address:string port:int = InputClientProxy;\nhelp.termsOfServiceUpdateEmpty#e3309f7f expires:int = help.TermsOfServiceUpdate;\nhelp.termsOfServiceUpdate#28ecf961 expires:int terms_of_service:help.TermsOfService = help.TermsOfServiceUpdate;\ninputSecureFileUploaded#3334b0f0 id:long parts:int md5_checksum:string file_hash:bytes secret:bytes = InputSecureFile;\ninputSecureFile#5367e5be id:long access_hash:long = InputSecureFile;\nsecureFileEmpty#64199744 = SecureFile;\nsecureFile#e0277a62 id:long access_hash:long size:int dc_id:int date:int file_hash:bytes secret:bytes = SecureFile;\nsecureData#8aeabec3 data:bytes data_hash:bytes secret:bytes = SecureData;\nsecurePlainPhone#7d6099dd phone:string = SecurePlainData;\nsecurePlainEmail#21ec5a5f email:string = SecurePlainData;\nsecureValueTypePersonalDetails#9d2a81e3 = SecureValueType;\nsecureValueTypePassport#3dac6a00 = SecureValueType;\nsecureValueTypeDriverLicense#6e425c4 = SecureValueType;\nsecureValueTypeIdentityCard#a0d0744b = SecureValueType;\nsecureValueTypeInternalPassport#99a48f23 = SecureValueType;\nsecureValueTypeAddress#cbe31e26 = SecureValueType;\nsecureValueTypeUtilityBill#fc36954e = SecureValueType;\nsecureValueTypeBankStatement#89137c0d = SecureValueType;\nsecureValueTypeRentalAgreement#8b883488 = SecureValueType;\nsecureValueTypePassportRegistration#99e3806a = SecureValueType;\nsecureValueTypeTemporaryRegistration#ea02ec33 = SecureValueType;\nsecureValueTypePhone#b320aadb = SecureValueType;\nsecureValueTypeEmail#8e3ca7ee = SecureValueType;\nsecureValue#187fa0ca flags:# type:SecureValueType data:flags.0?SecureData front_side:flags.1?SecureFile reverse_side:flags.2?SecureFile selfie:flags.3?SecureFile translation:flags.6?Vector files:flags.4?Vector plain_data:flags.5?SecurePlainData hash:bytes = SecureValue;\ninputSecureValue#db21d0a7 flags:# type:SecureValueType data:flags.0?SecureData front_side:flags.1?InputSecureFile reverse_side:flags.2?InputSecureFile selfie:flags.3?InputSecureFile translation:flags.6?Vector files:flags.4?Vector plain_data:flags.5?SecurePlainData = InputSecureValue;\nsecureValueHash#ed1ecdb0 type:SecureValueType hash:bytes = SecureValueHash;\nsecureValueErrorData#e8a40bd9 type:SecureValueType data_hash:bytes field:string text:string = SecureValueError;\nsecureValueErrorFrontSide#be3dfa type:SecureValueType file_hash:bytes text:string = SecureValueError;\nsecureValueErrorReverseSide#868a2aa5 type:SecureValueType file_hash:bytes text:string = SecureValueError;\nsecureValueErrorSelfie#e537ced6 type:SecureValueType file_hash:bytes text:string = SecureValueError;\nsecureValueErrorFile#7a700873 type:SecureValueType file_hash:bytes text:string = SecureValueError;\nsecureValueErrorFiles#666220e9 type:SecureValueType file_hash:Vector text:string = SecureValueError;\nsecureValueError#869d758f type:SecureValueType hash:bytes text:string = SecureValueError;\nsecureValueErrorTranslationFile#a1144770 type:SecureValueType file_hash:bytes text:string = SecureValueError;\nsecureValueErrorTranslationFiles#34636dd8 type:SecureValueType file_hash:Vector text:string = SecureValueError;\nsecureCredentialsEncrypted#33f0ea47 data:bytes hash:bytes secret:bytes = SecureCredentialsEncrypted;\naccount.authorizationForm#ad2e1cd8 flags:# required_types:Vector values:Vector errors:Vector users:Vector privacy_policy_url:flags.0?string = account.AuthorizationForm;\naccount.sentEmailCode#811f854f email_pattern:string length:int = account.SentEmailCode;\nhelp.deepLinkInfoEmpty#66afa166 = help.DeepLinkInfo;\nhelp.deepLinkInfo#6a4ee832 flags:# update_app:flags.0?true message:string entities:flags.1?Vector = help.DeepLinkInfo;\nsavedPhoneContact#1142bd56 phone:string first_name:string last_name:string date:int = SavedContact;\naccount.takeout#4dba4501 id:long = account.Takeout;\npasswordKdfAlgoUnknown#d45ab096 = PasswordKdfAlgo;\npasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow#3a912d4a salt1:bytes salt2:bytes g:int p:bytes = PasswordKdfAlgo;\nsecurePasswordKdfAlgoUnknown#4a8537 = SecurePasswordKdfAlgo;\nsecurePasswordKdfAlgoPBKDF2HMACSHA512iter100000#bbf2dda0 salt:bytes = SecurePasswordKdfAlgo;\nsecurePasswordKdfAlgoSHA512#86471d92 salt:bytes = SecurePasswordKdfAlgo;\nsecureSecretSettings#1527bcac secure_algo:SecurePasswordKdfAlgo secure_secret:bytes secure_secret_id:long = SecureSecretSettings;\ninputCheckPasswordEmpty#9880f658 = InputCheckPasswordSRP;\ninputCheckPasswordSRP#d27ff082 srp_id:long A:bytes M1:bytes = InputCheckPasswordSRP;\nsecureRequiredType#829d99da flags:# native_names:flags.0?true selfie_required:flags.1?true translation_required:flags.2?true type:SecureValueType = SecureRequiredType;\nsecureRequiredTypeOneOf#27477b4 types:Vector = SecureRequiredType;\nhelp.passportConfigNotModified#bfb9f457 = help.PassportConfig;\nhelp.passportConfig#a098d6af hash:int countries_langs:DataJSON = help.PassportConfig;\ninputAppEvent#1d1b1245 time:double type:string peer:long data:JSONValue = InputAppEvent;\njsonObjectValue#c0de1bd9 key:string value:JSONValue = JSONObjectValue;\njsonNull#3f6d7b68 = JSONValue;\njsonBool#c7345e6a value:Bool = JSONValue;\njsonNumber#2be0dfa4 value:double = JSONValue;\njsonString#b71e767a value:string = JSONValue;\njsonArray#f7444763 value:Vector = JSONValue;\njsonObject#99c1d49d value:Vector = JSONValue;\npageTableCell#34566b6a flags:# header:flags.0?true align_center:flags.3?true align_right:flags.4?true valign_middle:flags.5?true valign_bottom:flags.6?true text:flags.7?RichText colspan:flags.1?int rowspan:flags.2?int = PageTableCell;\npageTableRow#e0c0c5e5 cells:Vector = PageTableRow;\npageCaption#6f747657 text:RichText credit:RichText = PageCaption;\npageListItemText#b92fb6cd text:RichText = PageListItem;\npageListItemBlocks#25e073fc blocks:Vector = PageListItem;\npageListOrderedItemText#5e068047 num:string text:RichText = PageListOrderedItem;\npageListOrderedItemBlocks#98dd8936 num:string blocks:Vector = PageListOrderedItem;\npageRelatedArticle#b390dc08 flags:# url:string webpage_id:long title:flags.0?string description:flags.1?string photo_id:flags.2?long author:flags.3?string published_date:flags.4?int = PageRelatedArticle;\npage#98657f0d flags:# part:flags.0?true rtl:flags.1?true v2:flags.2?true url:string blocks:Vector photos:Vector documents:Vector views:flags.3?int = Page;\nhelp.supportName#8c05f1c9 name:string = help.SupportName;\nhelp.userInfoEmpty#f3ae2eed = help.UserInfo;\nhelp.userInfo#1eb3758 message:string entities:Vector author:string date:int = help.UserInfo;\npollAnswer#6ca9c2e9 text:string option:bytes = PollAnswer;\npoll#86e18161 id:long flags:# closed:flags.0?true public_voters:flags.1?true multiple_choice:flags.2?true quiz:flags.3?true question:string answers:Vector close_period:flags.4?int close_date:flags.5?int = Poll;\npollAnswerVoters#3b6ddad2 flags:# chosen:flags.0?true correct:flags.1?true option:bytes voters:int = PollAnswerVoters;\npollResults#badcc1a3 flags:# min:flags.0?true results:flags.1?Vector total_voters:flags.2?int recent_voters:flags.3?Vector solution:flags.4?string solution_entities:flags.4?Vector = PollResults;\nchatOnlines#f041e250 onlines:int = ChatOnlines;\nstatsURL#47a971e0 url:string = StatsURL;\nchatAdminRights#5fb224d5 flags:# change_info:flags.0?true post_messages:flags.1?true edit_messages:flags.2?true delete_messages:flags.3?true ban_users:flags.4?true invite_users:flags.5?true pin_messages:flags.7?true add_admins:flags.9?true anonymous:flags.10?true manage_call:flags.11?true other:flags.12?true = ChatAdminRights;\nchatBannedRights#9f120418 flags:# view_messages:flags.0?true send_messages:flags.1?true send_media:flags.2?true send_stickers:flags.3?true send_gifs:flags.4?true send_games:flags.5?true send_inline:flags.6?true embed_links:flags.7?true send_polls:flags.8?true change_info:flags.10?true invite_users:flags.15?true pin_messages:flags.17?true until_date:int = ChatBannedRights;\ninputWallPaper#e630b979 id:long access_hash:long = InputWallPaper;\ninputWallPaperSlug#72091c80 slug:string = InputWallPaper;\ninputWallPaperNoFile#967a462e id:long = InputWallPaper;\naccount.wallPapersNotModified#1c199183 = account.WallPapers;\naccount.wallPapers#702b65a9 hash:int wallpapers:Vector = account.WallPapers;\ncodeSettings#debebe83 flags:# allow_flashcall:flags.0?true current_number:flags.1?true allow_app_hash:flags.4?true = CodeSettings;\nwallPaperSettings#1dc1bca4 flags:# blur:flags.1?true motion:flags.2?true background_color:flags.0?int second_background_color:flags.4?int third_background_color:flags.5?int fourth_background_color:flags.6?int intensity:flags.3?int rotation:flags.4?int = WallPaperSettings;\nautoDownloadSettings#e04232f3 flags:# disabled:flags.0?true video_preload_large:flags.1?true audio_preload_next:flags.2?true phonecalls_less_data:flags.3?true photo_size_max:int video_size_max:int file_size_max:int video_upload_maxbitrate:int = AutoDownloadSettings;\naccount.autoDownloadSettings#63cacf26 low:AutoDownloadSettings medium:AutoDownloadSettings high:AutoDownloadSettings = account.AutoDownloadSettings;\nemojiKeyword#d5b3b9f9 keyword:string emoticons:Vector = EmojiKeyword;\nemojiKeywordDeleted#236df622 keyword:string emoticons:Vector = EmojiKeyword;\nemojiKeywordsDifference#5cc761bd lang_code:string from_version:int version:int keywords:Vector = EmojiKeywordsDifference;\nemojiURL#a575739d url:string = EmojiURL;\nemojiLanguage#b3fb5361 lang_code:string = EmojiLanguage;\nfolder#ff544e65 flags:# autofill_new_broadcasts:flags.0?true autofill_public_groups:flags.1?true autofill_new_correspondents:flags.2?true id:int title:string photo:flags.3?ChatPhoto = Folder;\ninputFolderPeer#fbd2c296 peer:InputPeer folder_id:int = InputFolderPeer;\nfolderPeer#e9baa668 peer:Peer folder_id:int = FolderPeer;\nmessages.searchCounter#e844ebff flags:# inexact:flags.1?true filter:MessagesFilter count:int = messages.SearchCounter;\nurlAuthResultRequest#92d33a0e flags:# request_write_access:flags.0?true bot:User domain:string = UrlAuthResult;\nurlAuthResultAccepted#8f8c0e4e url:string = UrlAuthResult;\nurlAuthResultDefault#a9d6db1f = UrlAuthResult;\nchannelLocationEmpty#bfb5ad8b = ChannelLocation;\nchannelLocation#209b82db geo_point:GeoPoint address:string = ChannelLocation;\npeerLocated#ca461b5d peer:Peer expires:int distance:int = PeerLocated;\npeerSelfLocated#f8ec284b expires:int = PeerLocated;\nrestrictionReason#d072acb4 platform:string reason:string text:string = RestrictionReason;\ninputTheme#3c5693e9 id:long access_hash:long = InputTheme;\ninputThemeSlug#f5890df1 slug:string = InputTheme;\ntheme#28f1114 flags:# creator:flags.0?true default:flags.1?true id:long access_hash:long slug:string title:string document:flags.2?Document settings:flags.3?ThemeSettings installs_count:int = Theme;\naccount.themesNotModified#f41eb622 = account.Themes;\naccount.themes#7f676421 hash:int themes:Vector = account.Themes;\nauth.loginToken#629f1980 expires:int token:bytes = auth.LoginToken;\nauth.loginTokenMigrateTo#68e9916 dc_id:int token:bytes = auth.LoginToken;\nauth.loginTokenSuccess#390d5c5e authorization:auth.Authorization = auth.LoginToken;\naccount.contentSettings#57e28221 flags:# sensitive_enabled:flags.0?true sensitive_can_change:flags.1?true = account.ContentSettings;\nmessages.inactiveChats#a927fec5 dates:Vector chats:Vector users:Vector = messages.InactiveChats;\nbaseThemeClassic#c3a12462 = BaseTheme;\nbaseThemeDay#fbd81688 = BaseTheme;\nbaseThemeNight#b7b31ea8 = BaseTheme;\nbaseThemeTinted#6d5f77ee = BaseTheme;\nbaseThemeArctic#5b11125a = BaseTheme;\ninputThemeSettings#bd507cd1 flags:# base_theme:BaseTheme accent_color:int message_top_color:flags.0?int message_bottom_color:flags.0?int wallpaper:flags.1?InputWallPaper wallpaper_settings:flags.1?WallPaperSettings = InputThemeSettings;\nthemeSettings#9c14984a flags:# base_theme:BaseTheme accent_color:int message_top_color:flags.0?int message_bottom_color:flags.0?int wallpaper:flags.1?WallPaper = ThemeSettings;\nwebPageAttributeTheme#54b56617 flags:# documents:flags.0?Vector settings:flags.1?ThemeSettings = WebPageAttribute;\nmessageUserVote#a28e5559 user_id:int option:bytes date:int = MessageUserVote;\nmessageUserVoteInputOption#36377430 user_id:int date:int = MessageUserVote;\nmessageUserVoteMultiple#e8fe0de user_id:int options:Vector date:int = MessageUserVote;\nmessages.votesList#823f649 flags:# count:int votes:Vector users:Vector next_offset:flags.0?string = messages.VotesList;\nbankCardOpenUrl#f568028a url:string name:string = BankCardOpenUrl;\npayments.bankCardData#3e24e573 title:string open_urls:Vector = payments.BankCardData;\ndialogFilter#7438f7e8 flags:# contacts:flags.0?true non_contacts:flags.1?true groups:flags.2?true broadcasts:flags.3?true bots:flags.4?true exclude_muted:flags.11?true exclude_read:flags.12?true exclude_archived:flags.13?true id:int title:string emoticon:flags.25?string pinned_peers:Vector include_peers:Vector exclude_peers:Vector = DialogFilter;\ndialogFilterSuggested#77744d4a filter:DialogFilter description:string = DialogFilterSuggested;\nstatsDateRangeDays#b637edaf min_date:int max_date:int = StatsDateRangeDays;\nstatsAbsValueAndPrev#cb43acde current:double previous:double = StatsAbsValueAndPrev;\nstatsPercentValue#cbce2fe0 part:double total:double = StatsPercentValue;\nstatsGraphAsync#4a27eb2d token:string = StatsGraph;\nstatsGraphError#bedc9822 error:string = StatsGraph;\nstatsGraph#8ea464b6 flags:# json:DataJSON zoom_token:flags.0?string = StatsGraph;\nmessageInteractionCounters#ad4fc9bd msg_id:int views:int forwards:int = MessageInteractionCounters;\nstats.broadcastStats#bdf78394 period:StatsDateRangeDays followers:StatsAbsValueAndPrev views_per_post:StatsAbsValueAndPrev shares_per_post:StatsAbsValueAndPrev enabled_notifications:StatsPercentValue growth_graph:StatsGraph followers_graph:StatsGraph mute_graph:StatsGraph top_hours_graph:StatsGraph interactions_graph:StatsGraph iv_interactions_graph:StatsGraph views_by_source_graph:StatsGraph new_followers_by_source_graph:StatsGraph languages_graph:StatsGraph recent_message_interactions:Vector = stats.BroadcastStats;\nhelp.promoDataEmpty#98f6ac75 expires:int = help.PromoData;\nhelp.promoData#8c39793f flags:# proxy:flags.0?true expires:int peer:Peer chats:Vector users:Vector psa_type:flags.1?string psa_message:flags.2?string = help.PromoData;\nvideoSize#de33b094 flags:# type:string w:int h:int size:int video_start_ts:flags.0?double = VideoSize;\nstatsGroupTopPoster#18f3d0f7 user_id:int messages:int avg_chars:int = StatsGroupTopPoster;\nstatsGroupTopAdmin#6014f412 user_id:int deleted:int kicked:int banned:int = StatsGroupTopAdmin;\nstatsGroupTopInviter#31962a4c user_id:int invitations:int = StatsGroupTopInviter;\nstats.megagroupStats#ef7ff916 period:StatsDateRangeDays members:StatsAbsValueAndPrev messages:StatsAbsValueAndPrev viewers:StatsAbsValueAndPrev posters:StatsAbsValueAndPrev growth_graph:StatsGraph members_graph:StatsGraph new_members_by_source_graph:StatsGraph languages_graph:StatsGraph messages_graph:StatsGraph actions_graph:StatsGraph top_hours_graph:StatsGraph weekdays_graph:StatsGraph top_posters:Vector top_admins:Vector top_inviters:Vector users:Vector = stats.MegagroupStats;\nglobalPrivacySettings#bea2f424 flags:# archive_and_mute_new_noncontact_peers:flags.0?Bool = GlobalPrivacySettings;\nhelp.countryCode#4203c5ef flags:# country_code:string prefixes:flags.0?Vector patterns:flags.1?Vector = help.CountryCode;\nhelp.country#c3878e23 flags:# hidden:flags.0?true iso2:string default_name:string name:flags.1?string country_codes:Vector = help.Country;\nhelp.countriesListNotModified#93cc1f32 = help.CountriesList;\nhelp.countriesList#87d0759e countries:Vector hash:int = help.CountriesList;\nmessageViews#455b853d flags:# views:flags.0?int forwards:flags.1?int replies:flags.2?MessageReplies = MessageViews;\nmessages.messageViews#b6c4f543 views:Vector chats:Vector users:Vector = messages.MessageViews;\nmessages.discussionMessage#f5dd8f9d flags:# messages:Vector max_id:flags.0?int read_inbox_max_id:flags.1?int read_outbox_max_id:flags.2?int chats:Vector users:Vector = messages.DiscussionMessage;\nmessageReplyHeader#a6d57763 flags:# reply_to_msg_id:int reply_to_peer_id:flags.0?Peer reply_to_top_id:flags.1?int = MessageReplyHeader;\nmessageReplies#4128faac flags:# comments:flags.0?true replies:int replies_pts:int recent_repliers:flags.1?Vector channel_id:flags.0?int max_id:flags.2?int read_max_id:flags.3?int = MessageReplies;\npeerBlocked#e8fd8014 peer_id:Peer date:int = PeerBlocked;\nstats.messageStats#8999f295 views_graph:StatsGraph = stats.MessageStats;\ngroupCallDiscarded#7780bcb4 id:long access_hash:long duration:int = GroupCall;\ngroupCall#d597650c flags:# join_muted:flags.1?true can_change_join_muted:flags.2?true join_date_asc:flags.6?true schedule_start_subscribed:flags.8?true can_start_video:flags.9?true id:long access_hash:long participants_count:int title:flags.3?string stream_dc_id:flags.4?int record_start_date:flags.5?int schedule_date:flags.7?int unmuted_video_count:flags.10?int unmuted_video_limit:int version:int = GroupCall;\ninputGroupCall#d8aa840f id:long access_hash:long = InputGroupCall;\ngroupCallParticipant#eba636fe flags:# muted:flags.0?true left:flags.1?true can_self_unmute:flags.2?true just_joined:flags.4?true versioned:flags.5?true min:flags.8?true muted_by_you:flags.9?true volume_by_admin:flags.10?true self:flags.12?true video_joined:flags.15?true peer:Peer date:int active_date:flags.3?int source:int volume:flags.7?int about:flags.11?string raise_hand_rating:flags.13?long video:flags.6?GroupCallParticipantVideo presentation:flags.14?GroupCallParticipantVideo = GroupCallParticipant;\nphone.groupCall#9e727aad call:GroupCall participants:Vector participants_next_offset:string chats:Vector users:Vector = phone.GroupCall;\nphone.groupParticipants#f47751b6 count:int participants:Vector next_offset:string chats:Vector users:Vector version:int = phone.GroupParticipants;\ninlineQueryPeerTypeSameBotPM#3081ed9d = InlineQueryPeerType;\ninlineQueryPeerTypePM#833c0fac = InlineQueryPeerType;\ninlineQueryPeerTypeChat#d766c50a = InlineQueryPeerType;\ninlineQueryPeerTypeMegagroup#5ec4be43 = InlineQueryPeerType;\ninlineQueryPeerTypeBroadcast#6334ee9a = InlineQueryPeerType;\nmessages.historyImport#1662af0b id:long = messages.HistoryImport;\nmessages.historyImportParsed#5e0fb7b9 flags:# pm:flags.0?true group:flags.1?true title:flags.2?string = messages.HistoryImportParsed;\nmessages.affectedFoundMessages#ef8d3e6c pts:int pts_count:int offset:int messages:Vector = messages.AffectedFoundMessages;\nchatInviteImporter#1e3e6680 user_id:int date:int = ChatInviteImporter;\nmessages.exportedChatInvites#bdc62dcc count:int invites:Vector users:Vector = messages.ExportedChatInvites;\nmessages.exportedChatInvite#1871be50 invite:ExportedChatInvite users:Vector = messages.ExportedChatInvite;\nmessages.exportedChatInviteReplaced#222600ef invite:ExportedChatInvite new_invite:ExportedChatInvite users:Vector = messages.ExportedChatInvite;\nmessages.chatInviteImporters#81b6b00a count:int importers:Vector users:Vector = messages.ChatInviteImporters;\nchatAdminWithInvites#dfd2330f admin_id:int invites_count:int revoked_invites_count:int = ChatAdminWithInvites;\nmessages.chatAdminsWithInvites#b69b72d7 admins:Vector users:Vector = messages.ChatAdminsWithInvites;\nmessages.checkedHistoryImportPeer#a24de717 confirm_text:string = messages.CheckedHistoryImportPeer;\nphone.joinAsPeers#afe5623f peers:Vector chats:Vector users:Vector = phone.JoinAsPeers;\nphone.exportedGroupCallInvite#204bd158 link:string = phone.ExportedGroupCallInvite;\ngroupCallParticipantVideoSourceGroup#dcb118b7 semantics:string sources:Vector = GroupCallParticipantVideoSourceGroup;\ngroupCallParticipantVideo#67753ac8 flags:# paused:flags.0?true endpoint:string source_groups:Vector audio_source:flags.1?int = GroupCallParticipantVideo;\nstickers.suggestedShortName#85fea03f short_name:string = stickers.SuggestedShortName;\nbotCommandScopeDefault#2f6cb2ab = BotCommandScope;\nbotCommandScopeUsers#3c4f04d8 = BotCommandScope;\nbotCommandScopeChats#6fe1a881 = BotCommandScope;\nbotCommandScopeChatAdmins#b9aa606a = BotCommandScope;\nbotCommandScopePeer#db9d897d peer:InputPeer = BotCommandScope;\nbotCommandScopePeerAdmins#3fd863d1 peer:InputPeer = BotCommandScope;\nbotCommandScopePeerUser#a1321f3 peer:InputPeer user_id:InputUser = BotCommandScope;\naccount.resetPasswordFailedWait#e3779861 retry_date:int = account.ResetPasswordResult;\naccount.resetPasswordRequestedWait#e9effc7d until_date:int = account.ResetPasswordResult;\naccount.resetPasswordOk#e926d63e = account.ResetPasswordResult;\n---functions---\ninitConnection#c1cd5ea9 {X:Type} flags:# api_id:int device_model:string system_version:string app_version:string system_lang_code:string lang_pack:string lang_code:string proxy:flags.0?InputClientProxy params:flags.1?JSONValue query:!X = X;\ninvokeWithLayer#da9b0d0d {X:Type} layer:int query:!X = X;\nauth.sendCode#a677244f phone_number:string api_id:int api_hash:string settings:CodeSettings = auth.SentCode;\nauth.signUp#80eee427 phone_number:string phone_code_hash:string first_name:string last_name:string = auth.Authorization;\nauth.signIn#bcd51581 phone_number:string phone_code_hash:string phone_code:string = auth.Authorization;\nauth.logOut#5717da40 = Bool;\nauth.resetAuthorizations#9fab0d1a = Bool;\nauth.exportAuthorization#e5bfffcd dc_id:int = auth.ExportedAuthorization;\nauth.importAuthorization#e3ef9613 id:int bytes:bytes = auth.Authorization;\nauth.bindTempAuthKey#cdd42a05 perm_auth_key_id:long nonce:long expires_at:int encrypted_message:bytes = Bool;\nauth.checkPassword#d18b4d16 password:InputCheckPasswordSRP = auth.Authorization;\nauth.requestPasswordRecovery#d897bc66 = auth.PasswordRecovery;\nauth.resendCode#3ef1a9bf phone_number:string phone_code_hash:string = auth.SentCode;\nauth.cancelCode#1f040578 phone_number:string phone_code_hash:string = Bool;\nauth.dropTempAuthKeys#8e48a188 except_auth_keys:Vector = Bool;\nauth.exportLoginToken#b1b41517 api_id:int api_hash:string except_ids:Vector = auth.LoginToken;\nauth.importLoginToken#95ac5ce4 token:bytes = auth.LoginToken;\naccount.registerDevice#68976c6f flags:# no_muted:flags.0?true token_type:int token:string app_sandbox:Bool secret:bytes other_uids:Vector = Bool;\naccount.unregisterDevice#3076c4bf token_type:int token:string other_uids:Vector = Bool;\naccount.updateNotifySettings#84be5b93 peer:InputNotifyPeer settings:InputPeerNotifySettings = Bool;\naccount.getNotifySettings#12b3ad31 peer:InputNotifyPeer = PeerNotifySettings;\naccount.updateProfile#78515775 flags:# first_name:flags.0?string last_name:flags.1?string about:flags.2?string = User;\naccount.updateStatus#6628562c offline:Bool = Bool;\naccount.getWallPapers#aabb1763 hash:int = account.WallPapers;\naccount.checkUsername#2714d86c username:string = Bool;\naccount.updateUsername#3e0bdd7c username:string = User;\naccount.getPrivacy#dadbc950 key:InputPrivacyKey = account.PrivacyRules;\naccount.setPrivacy#c9f81ce8 key:InputPrivacyKey rules:Vector = account.PrivacyRules;\naccount.getAuthorizations#e320c158 = account.Authorizations;\naccount.resetAuthorization#df77f3bc hash:long = Bool;\naccount.getPassword#548a30f5 = account.Password;\naccount.getPasswordSettings#9cd4eaf9 password:InputCheckPasswordSRP = account.PasswordSettings;\naccount.updatePasswordSettings#a59b102f password:InputCheckPasswordSRP new_settings:account.PasswordInputSettings = Bool;\naccount.sendConfirmPhoneCode#1b3faa88 hash:string settings:CodeSettings = auth.SentCode;\naccount.confirmPhone#5f2178c3 phone_code_hash:string phone_code:string = Bool;\naccount.getTmpPassword#449e0b51 password:InputCheckPasswordSRP period:int = account.TmpPassword;\naccount.sendVerifyPhoneCode#a5a356f9 phone_number:string settings:CodeSettings = auth.SentCode;\naccount.confirmPasswordEmail#8fdf1920 code:string = Bool;\naccount.getContactSignUpNotification#9f07c728 = Bool;\naccount.setContactSignUpNotification#cff43f61 silent:Bool = Bool;\naccount.getNotifyExceptions#53577479 flags:# compare_sound:flags.1?true peer:flags.0?InputNotifyPeer = Updates;\naccount.uploadWallPaper#dd853661 file:InputFile mime_type:string settings:WallPaperSettings = WallPaper;\naccount.setContentSettings#b574b16b flags:# sensitive_enabled:flags.0?true = Bool;\naccount.getContentSettings#8b9b4dae = account.ContentSettings;\nusers.getUsers#d91a548 id:Vector = Vector;\nusers.getFullUser#ca30a5b1 id:InputUser = UserFull;\ncontacts.getContacts#c023849f hash:int = contacts.Contacts;\ncontacts.importContacts#2c800be5 contacts:Vector = contacts.ImportedContacts;\ncontacts.deleteContacts#96a0e00 id:Vector = Updates;\ncontacts.block#68cc1411 id:InputPeer = Bool;\ncontacts.unblock#bea65d50 id:InputPeer = Bool;\ncontacts.getBlocked#f57c350f offset:int limit:int = contacts.Blocked;\ncontacts.search#11f812d8 q:string limit:int = contacts.Found;\ncontacts.resolveUsername#f93ccba3 username:string = contacts.ResolvedPeer;\ncontacts.getTopPeers#d4982db5 flags:# correspondents:flags.0?true bots_pm:flags.1?true bots_inline:flags.2?true phone_calls:flags.3?true forward_users:flags.4?true forward_chats:flags.5?true groups:flags.10?true channels:flags.15?true offset:int limit:int hash:int = contacts.TopPeers;\nmessages.getMessages#63c66506 id:Vector = messages.Messages;\nmessages.getDialogs#a0ee3b73 flags:# exclude_pinned:flags.0?true folder_id:flags.1?int offset_date:int offset_id:int offset_peer:InputPeer limit:int hash:int = messages.Dialogs;\nmessages.getHistory#dcbb8260 peer:InputPeer offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages;\nmessages.search#c352eec flags:# peer:InputPeer q:string from_id:flags.0?InputPeer top_msg_id:flags.1?int filter:MessagesFilter min_date:int max_date:int offset_id:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages;\nmessages.readHistory#e306d3a peer:InputPeer max_id:int = messages.AffectedMessages;\nmessages.deleteHistory#1c015b09 flags:# just_clear:flags.0?true revoke:flags.1?true peer:InputPeer max_id:int = messages.AffectedHistory;\nmessages.deleteMessages#e58e95d2 flags:# revoke:flags.0?true id:Vector = messages.AffectedMessages;\nmessages.receivedMessages#5a954c0 max_id:int = Vector;\nmessages.setTyping#58943ee2 flags:# peer:InputPeer top_msg_id:flags.0?int action:SendMessageAction = Bool;\nmessages.sendMessage#520c3870 flags:# no_webpage:flags.1?true silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int = Updates;\nmessages.sendMedia#3491eba9 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int media:InputMedia message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int = Updates;\nmessages.forwardMessages#d9fee60e flags:# silent:flags.5?true background:flags.6?true with_my_score:flags.8?true from_peer:InputPeer id:Vector random_id:Vector to_peer:InputPeer schedule_date:flags.10?int = Updates;\nmessages.report#8953ab4e peer:InputPeer id:Vector reason:ReportReason message:string = Bool;\nmessages.getChats#3c6aa187 id:Vector = messages.Chats;\nmessages.getFullChat#3b831c66 chat_id:int = messages.ChatFull;\nmessages.editChatTitle#dc452855 chat_id:int title:string = Updates;\nmessages.editChatPhoto#ca4c79d8 chat_id:int photo:InputChatPhoto = Updates;\nmessages.addChatUser#f9a0aa09 chat_id:int user_id:InputUser fwd_limit:int = Updates;\nmessages.deleteChatUser#c534459a flags:# revoke_history:flags.0?true chat_id:int user_id:InputUser = Updates;\nmessages.createChat#9cb126e users:Vector title:string = Updates;\nmessages.getDhConfig#26cf8950 version:int random_length:int = messages.DhConfig;\nmessages.readMessageContents#36a73f77 id:Vector = messages.AffectedMessages;\nmessages.getStickers#43d4f2c emoticon:string hash:int = messages.Stickers;\nmessages.getAllStickers#1c9618b1 hash:int = messages.AllStickers;\nmessages.getWebPagePreview#8b68b0cc flags:# message:string entities:flags.3?Vector = MessageMedia;\nmessages.exportChatInvite#14b9bcd7 flags:# legacy_revoke_permanent:flags.2?true peer:InputPeer expire_date:flags.0?int usage_limit:flags.1?int = ExportedChatInvite;\nmessages.checkChatInvite#3eadb1bb hash:string = ChatInvite;\nmessages.importChatInvite#6c50051c hash:string = Updates;\nmessages.getStickerSet#2619a90e stickerset:InputStickerSet = messages.StickerSet;\nmessages.installStickerSet#c78fe460 stickerset:InputStickerSet archived:Bool = messages.StickerSetInstallResult;\nmessages.uninstallStickerSet#f96e55de stickerset:InputStickerSet = Bool;\nmessages.migrateChat#15a3b8e3 chat_id:int = Updates;\nmessages.searchGlobal#4bc6589a flags:# folder_id:flags.0?int q:string filter:MessagesFilter min_date:int max_date:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages;\nmessages.getDocumentByHash#338e2464 sha256:bytes size:int mime_type:string = Document;\nmessages.getSavedGifs#83bf3d52 hash:int = messages.SavedGifs;\nmessages.getInlineBotResults#514e999d flags:# bot:InputUser peer:InputPeer geo_point:flags.0?InputGeoPoint query:string offset:string = messages.BotResults;\nmessages.sendInlineBotResult#220815b0 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true hide_via:flags.11?true peer:InputPeer reply_to_msg_id:flags.0?int random_id:long query_id:long id:string schedule_date:flags.10?int = Updates;\nmessages.editMessage#48f71778 flags:# no_webpage:flags.1?true peer:InputPeer id:int message:flags.11?string media:flags.14?InputMedia reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.15?int = Updates;\nmessages.getBotCallbackAnswer#9342ca07 flags:# game:flags.1?true peer:InputPeer msg_id:int data:flags.0?bytes password:flags.2?InputCheckPasswordSRP = messages.BotCallbackAnswer;\nmessages.getPeerDialogs#e470bcfd peers:Vector = messages.PeerDialogs;\nmessages.saveDraft#bc39e14b flags:# no_webpage:flags.1?true reply_to_msg_id:flags.0?int peer:InputPeer message:string entities:flags.3?Vector = Bool;\nmessages.getFeaturedStickers#2dacca4f hash:int = messages.FeaturedStickers;\nmessages.readFeaturedStickers#5b118126 id:Vector = Bool;\nmessages.getRecentStickers#5ea192c9 flags:# attached:flags.0?true hash:int = messages.RecentStickers;\nmessages.getWebPage#32ca8f91 url:string hash:int = WebPage;\nmessages.toggleDialogPin#a731e257 flags:# pinned:flags.0?true peer:InputDialogPeer = Bool;\nmessages.getPinnedDialogs#d6b94df2 folder_id:int = messages.PeerDialogs;\nmessages.uploadMedia#519bc2b1 peer:InputPeer media:InputMedia = MessageMedia;\nmessages.getFavedStickers#21ce0b0e hash:int = messages.FavedStickers;\nmessages.faveSticker#b9ffc55b id:InputDocument unfave:Bool = Bool;\nmessages.sendMultiMedia#cc0110cb flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int multi_media:Vector schedule_date:flags.10?int = Updates;\nmessages.searchStickerSets#c2b7d08b flags:# exclude_featured:flags.0?true q:string hash:int = messages.FoundStickerSets;\nmessages.markDialogUnread#c286d98f flags:# unread:flags.0?true peer:InputDialogPeer = Bool;\nmessages.updatePinnedMessage#d2aaf7ec flags:# silent:flags.0?true unpin:flags.1?true pm_oneside:flags.2?true peer:InputPeer id:int = Updates;\nmessages.sendVote#10ea6184 peer:InputPeer msg_id:int options:Vector = Updates;\nmessages.getOnlines#6e2be050 peer:InputPeer = ChatOnlines;\nmessages.editChatAbout#def60797 peer:InputPeer about:string = Bool;\nmessages.editChatDefaultBannedRights#a5866b41 peer:InputPeer banned_rights:ChatBannedRights = Updates;\nmessages.getEmojiKeywordsDifference#1508b6af lang_code:string from_version:int = EmojiKeywordsDifference;\nmessages.getScheduledHistory#e2c2685b peer:InputPeer hash:int = messages.Messages;\nmessages.sendScheduledMessages#bd38850a peer:InputPeer id:Vector = Updates;\nmessages.deleteScheduledMessages#59ae2b16 peer:InputPeer id:Vector = Updates;\nmessages.getPollVotes#b86e380e flags:# peer:InputPeer id:int option:flags.0?bytes offset:flags.1?string limit:int = messages.VotesList;\nmessages.getDialogFilters#f19ed96d = Vector;\nmessages.getSuggestedDialogFilters#a29cd42c = Vector;\nmessages.updateDialogFilter#1ad4a04a flags:# id:int filter:flags.0?DialogFilter = Bool;\nmessages.getReplies#24b581ba peer:InputPeer msg_id:int offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages;\nmessages.getDiscussionMessage#446972fd peer:InputPeer msg_id:int = messages.DiscussionMessage;\nmessages.readDiscussion#f731a9f4 peer:InputPeer msg_id:int read_max_id:int = Bool;\nmessages.unpinAllMessages#f025bc8b peer:InputPeer = messages.AffectedHistory;\nmessages.deleteChat#83247d11 chat_id:int = Bool;\nupdates.getState#edd4882a = updates.State;\nupdates.getDifference#25939651 flags:# pts:int pts_total_limit:flags.0?int date:int qts:int = updates.Difference;\nupdates.getChannelDifference#3173d78 flags:# force:flags.0?true channel:InputChannel filter:ChannelMessagesFilter pts:int limit:int = updates.ChannelDifference;\nphotos.uploadProfilePhoto#89f30f69 flags:# file:flags.0?InputFile video:flags.1?InputFile video_start_ts:flags.2?double = photos.Photo;\nphotos.getUserPhotos#91cd32a8 user_id:InputUser offset:int max_id:long limit:int = photos.Photos;\nupload.saveFilePart#b304a621 file_id:long file_part:int bytes:bytes = Bool;\nupload.getFile#b15a9afc flags:# precise:flags.0?true cdn_supported:flags.1?true location:InputFileLocation offset:int limit:int = upload.File;\nupload.saveBigFilePart#de7b673d file_id:long file_part:int file_total_parts:int bytes:bytes = Bool;\nupload.getWebFile#24e6818d location:InputWebFileLocation offset:int limit:int = upload.WebFile;\nhelp.getConfig#c4f9186b = Config;\nhelp.getNearestDc#1fb33026 = NearestDc;\nhelp.getSupport#9cdf08cd = help.Support;\nhelp.acceptTermsOfService#ee72f79a id:DataJSON = Bool;\nchannels.readHistory#cc104937 channel:InputChannel max_id:int = Bool;\nchannels.deleteMessages#84c1fd4e channel:InputChannel id:Vector = messages.AffectedMessages;\nchannels.getMessages#ad8c9a23 channel:InputChannel id:Vector = messages.Messages;\nchannels.getParticipants#123e05e9 channel:InputChannel filter:ChannelParticipantsFilter offset:int limit:int hash:int = channels.ChannelParticipants;\nchannels.getParticipant#a0ab6cc6 channel:InputChannel participant:InputPeer = channels.ChannelParticipant;\nchannels.getChannels#a7f6bbb id:Vector = messages.Chats;\nchannels.getFullChannel#8736a09 channel:InputChannel = messages.ChatFull;\nchannels.createChannel#3d5fb10f flags:# broadcast:flags.0?true megagroup:flags.1?true for_import:flags.3?true title:string about:string geo_point:flags.2?InputGeoPoint address:flags.2?string = Updates;\nchannels.editAdmin#d33c8902 channel:InputChannel user_id:InputUser admin_rights:ChatAdminRights rank:string = Updates;\nchannels.editTitle#566decd0 channel:InputChannel title:string = Updates;\nchannels.editPhoto#f12e57c9 channel:InputChannel photo:InputChatPhoto = Updates;\nchannels.checkUsername#10e6bd2c channel:InputChannel username:string = Bool;\nchannels.updateUsername#3514b3de channel:InputChannel username:string = Bool;\nchannels.joinChannel#24b524c5 channel:InputChannel = Updates;\nchannels.leaveChannel#f836aa95 channel:InputChannel = Updates;\nchannels.inviteToChannel#199f3a6c channel:InputChannel users:Vector = Updates;\nchannels.deleteChannel#c0111fe3 channel:InputChannel = Updates;\nchannels.toggleSignatures#1f69b606 channel:InputChannel enabled:Bool = Updates;\nchannels.editBanned#96e6cd81 channel:InputChannel participant:InputPeer banned_rights:ChatBannedRights = Updates;\nchannels.readMessageContents#eab5dc38 channel:InputChannel id:Vector = Bool;\nchannels.togglePreHistoryHidden#eabbb94c channel:InputChannel enabled:Bool = Updates;\nchannels.getGroupsForDiscussion#f5dad378 = messages.Chats;\nchannels.setDiscussionGroup#40582bb2 broadcast:InputChannel group:InputChannel = Bool;\npayments.getPaymentForm#8a333c8d flags:# peer:InputPeer msg_id:int theme_params:flags.0?DataJSON = payments.PaymentForm;\npayments.getPaymentReceipt#2478d1cc peer:InputPeer msg_id:int = payments.PaymentReceipt;\npayments.validateRequestedInfo#db103170 flags:# save:flags.0?true peer:InputPeer msg_id:int info:PaymentRequestedInfo = payments.ValidatedRequestedInfo;\npayments.sendPaymentForm#30c3bc9d flags:# form_id:long peer:InputPeer msg_id:int requested_info_id:flags.0?string shipping_option_id:flags.1?string credentials:InputPaymentCredentials tip_amount:flags.2?long = payments.PaymentResult;\npayments.getSavedInfo#227d824b = payments.SavedInfo;\nlangpack.getLangPack#f2f2330a lang_pack:string lang_code:string = LangPackDifference;\nlangpack.getStrings#efea3803 lang_pack:string lang_code:string keys:Vector = Vector;\nlangpack.getLanguages#42c6978f lang_pack:string = Vector;\nfolders.editPeerFolders#6847d0ab folder_peers:Vector = Updates;\n`;","module.exports = `resPQ#05162463 nonce:int128 server_nonce:int128 pq:string server_public_key_fingerprints:Vector = ResPQ;\np_q_inner_data#83c95aec pq:string p:string q:string nonce:int128 server_nonce:int128 new_nonce:int256 = P_Q_inner_data;\nserver_DH_params_fail#79cb045d nonce:int128 server_nonce:int128 new_nonce_hash:int128 = Server_DH_Params;\nserver_DH_params_ok#d0e8075c nonce:int128 server_nonce:int128 encrypted_answer:string = Server_DH_Params;\nserver_DH_inner_data#b5890dba nonce:int128 server_nonce:int128 g:int dh_prime:string g_a:string server_time:int = Server_DH_inner_data;\nclient_DH_inner_data#6643b654 nonce:int128 server_nonce:int128 retry_id:long g_b:string = Client_DH_Inner_Data;\ndh_gen_ok#3bcbf734 nonce:int128 server_nonce:int128 new_nonce_hash1:int128 = Set_client_DH_params_answer;\ndh_gen_retry#46dc1fb9 nonce:int128 server_nonce:int128 new_nonce_hash2:int128 = Set_client_DH_params_answer;\ndh_gen_fail#a69dae02 nonce:int128 server_nonce:int128 new_nonce_hash3:int128 = Set_client_DH_params_answer;\ndestroy_auth_key_ok#f660e1d4 = DestroyAuthKeyRes;\ndestroy_auth_key_none#0a9f2259 = DestroyAuthKeyRes;\ndestroy_auth_key_fail#ea109b13 = DestroyAuthKeyRes;\n---functions---\nreq_pq#60469778 nonce:int128 = ResPQ;\nreq_pq_multi#be7e8ef1 nonce:int128 = ResPQ;\nreq_pq_multi_new#51b410fd nonce:int128 = ResPQ;\nreq_DH_params#d712e4be nonce:int128 server_nonce:int128 p:string q:string public_key_fingerprint:long encrypted_data:string = Server_DH_Params;\nset_client_DH_params#f5045f1f nonce:int128 server_nonce:int128 encrypted_data:string = Set_client_DH_params_answer;\ndestroy_auth_key#d1435160 = DestroyAuthKeyRes;\n---types---\nmsgs_ack#62d6b459 msg_ids:Vector = MsgsAck;\nbad_msg_notification#a7eff811 bad_msg_id:long bad_msg_seqno:int error_code:int = BadMsgNotification;\nbad_server_salt#edab447b bad_msg_id:long bad_msg_seqno:int error_code:int new_server_salt:long = BadMsgNotification;\nmsgs_state_req#da69fb52 msg_ids:Vector = MsgsStateReq;\nmsgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo;\nmsgs_all_info#8cc0d131 msg_ids:Vector info:string = MsgsAllInfo;\nmsg_detailed_info#276d3ec6 msg_id:long answer_msg_id:long bytes:int status:int = MsgDetailedInfo;\nmsg_new_detailed_info#809db6df answer_msg_id:long bytes:int status:int = MsgDetailedInfo;\nmsg_resend_req#7d861a08 msg_ids:Vector = MsgResendReq;\nrpc_error#2144ca19 error_code:int error_message:string = RpcError;\nfuture_salt#0949d9dc valid_since:int valid_until:int salt:long = FutureSalt;\nfuture_salts#ae500895 req_msg_id:long now:int salts:vector = FutureSalts;\npong#347773c5 msg_id:long ping_id:long = Pong;\ndestroy_session_ok#e22045fc session_id:long = DestroySessionRes;\ndestroy_session_none#62d350c9 session_id:long = DestroySessionRes;\nnew_session_created#9ec20908 first_msg_id:long unique_id:long server_salt:long = NewSession;\n---functions---\nping#7abe77ec ping_id:long = Pong;\nping_delay_disconnect#f3427b8c ping_id:long disconnect_delay:int = Pong;`;","const os = require('os');\nconst Logger = require('../extensions/Logger');\nconst { sleep } = require('../Helpers');\nconst errors = require('../errors');\nconst MemorySession = require('../sessions/Memory');\nconst Helpers = require('../Helpers');\nconst utils = require('../Utils');\nconst Session = require('../sessions/Abstract');\nconst { LAYER } = require('../tl/AllTLObjects');\nconst {\n constructors,\n requests,\n} = require('../tl');\nconst MTProtoSender = require('../network/MTProtoSender');\nconst { ConnectionTCPObfuscated } = require('../network/connection/TCPObfuscated');\nconst {\n authFlow,\n checkAuthorization,\n} = require('./auth');\nconst { downloadFile } = require('./downloadFile');\nconst { uploadFile } = require('./uploadFile');\nconst { updateTwoFaSettings } = require('./2fa');\n\nconst DEFAULT_DC_ID = 2;\nconst WEBDOCUMENT_DC_ID = 4;\nconst DEFAULT_IPV4_IP = 'zws2.web.telegram.org';\nconst DEFAULT_IPV6_IP = '[2001:67c:4e8:f002::a]';\nconst EXPORTED_SENDER_RECONNECT_TIMEOUT = 1000; // 1 sec\nconst EXPORTED_SENDER_RELEASE_TIMEOUT = 30000; // 30 sec\nconst WEBDOCUMENT_REQUEST_PART_SIZE = 131072; // 128kb\n\nconst PING_INTERVAL = 3000; // 3 sec\nconst PING_TIMEOUT = 5000; // 5 sec\nconst PING_FAIL_ATTEMPTS = 3;\nconst PING_FAIL_INTERVAL = 100; // ms\nconst PING_DISCONNECT_DELAY = 60000; // 1 min\n\n// All types\nconst sizeTypes = ['w', 'y', 'd', 'x', 'c', 'm', 'b', 'a', 's'];\n\n\nclass TelegramClient {\n static DEFAULT_OPTIONS = {\n connection: ConnectionTCPObfuscated,\n useIPV6: false,\n proxy: undefined,\n timeout: 10,\n requestRetries: 5,\n connectionRetries: Infinity,\n retryDelay: 1000,\n autoReconnect: true,\n sequentialUpdates: false,\n floodSleepLimit: 60,\n deviceModel: undefined,\n systemVersion: undefined,\n appVersion: undefined,\n langCode: 'en',\n systemLangCode: 'en',\n baseLogger: 'gramjs',\n useWSS: false,\n additionalDcsDisabled: false,\n };\n\n /**\n *\n * @param session {StringSession|LocalStorageSession}\n * @param apiId\n * @param apiHash\n * @param opts\n */\n constructor(session, apiId, apiHash, opts = TelegramClient.DEFAULT_OPTIONS) {\n if (!apiId || !apiHash) {\n throw Error('Your API ID or Hash are invalid. Please read \"Requirements\" on README.md');\n }\n const args = { ...TelegramClient.DEFAULT_OPTIONS, ...opts };\n this.apiId = apiId;\n this.apiHash = apiHash;\n this._useIPV6 = args.useIPV6;\n // this._entityCache = new Set()\n if (typeof args.baseLogger === 'string') {\n this._log = new Logger();\n } else {\n this._log = args.baseLogger;\n }\n // Determine what session we will use\n if (typeof session === 'string' || !session) {\n try {\n throw new Error('not implemented');\n } catch (e) {\n session = new MemorySession();\n }\n } else if (!(session instanceof Session)) {\n throw new Error('The given session must be str or a session instance');\n }\n\n this.floodSleepLimit = args.floodSleepLimit;\n this._eventBuilders = [];\n\n this._phoneCodeHash = {};\n this.session = session;\n // this._entityCache = EntityCache();\n this.apiId = parseInt(apiId, 10);\n this.apiHash = apiHash;\n\n this._requestRetries = args.requestRetries;\n this._connectionRetries = args.connectionRetries;\n this._retryDelay = args.retryDelay || 0;\n if (args.proxy) {\n this._log.warn('proxies are not supported');\n }\n this._proxy = args.proxy;\n this._timeout = args.timeout;\n this._autoReconnect = args.autoReconnect;\n\n this._connection = args.connection;\n // TODO add proxy support\n\n this._floodWaitedRequests = {};\n\n this._initWith = (x) => {\n return new requests.InvokeWithLayer({\n layer: LAYER,\n query: new requests.InitConnection({\n apiId: this.apiId,\n deviceModel: args.deviceModel || os.type()\n .toString() || 'Unknown',\n systemVersion: args.systemVersion || os.release()\n .toString() || '1.0',\n appVersion: args.appVersion || '1.0',\n langCode: args.langCode,\n langPack: '', // this should be left empty.\n systemLangCode: args.systemLangCode,\n query: x,\n proxy: undefined, // no proxies yet.\n }),\n });\n };\n\n this._args = args;\n // These will be set later\n this._config = undefined;\n this.phoneCodeHashes = [];\n this._exportedSenderPromises = {};\n this._exportedSenderReleaseTimeouts = {};\n this._additionalDcsDisabled = args.additionalDcsDisabled;\n this._loopStarted = false;\n this._reconnecting = false;\n this._destroyed = false;\n }\n\n\n // region Connecting\n\n /**\n * Connects to the Telegram servers, executing authentication if required.\n * Note that authenticating to the Telegram servers is not the same as authenticating\n * the app, which requires to send a code first.\n * @returns {Promise}\n */\n async connect() {\n await this._initSession();\n\n if (this._sender === undefined) {\n // only init sender once to avoid multiple loops.\n this._sender = new MTProtoSender(this.session.getAuthKey(), {\n logger: this._log,\n dcId: this.session.dcId,\n retries: this._connectionRetries,\n delay: this._retryDelay,\n autoReconnect: this._autoReconnect,\n connectTimeout: this._timeout,\n authKeyCallback: this._authKeyCallback.bind(this),\n updateCallback: this._handleUpdate.bind(this),\n isMainSender: true,\n });\n }\n // set defaults vars\n this._sender.userDisconnected = false;\n this._sender._user_connected = false;\n this._sender._reconnecting = false;\n this._sender._disconnected = true;\n\n const connection = new this._connection(\n this.session.serverAddress, this.session.port, this.session.dcId, this._log,\n );\n\n const newConnection = await this._sender.connect(connection);\n if (!newConnection) {\n // we're already connected so no need to reset auth key.\n if (!this._loopStarted) {\n this._updateLoop();\n this._loopStarted = true;\n }\n return;\n }\n\n this.session.setAuthKey(this._sender.authKey);\n await this._sender.send(this._initWith(\n new requests.help.GetConfig({}),\n ));\n\n if (!this._loopStarted) {\n this._updateLoop();\n this._loopStarted = true;\n }\n this._reconnecting = false;\n }\n\n async _initSession() {\n await this.session.load();\n\n if (!this.session.serverAddress || (this.session.serverAddress.includes(':') !== this._useIPV6)) {\n this.session.setDC(DEFAULT_DC_ID, this._useIPV6\n ? DEFAULT_IPV6_IP : DEFAULT_IPV4_IP, this._args.useWSS ? 443 : 80);\n }\n }\n\n async _updateLoop() {\n while (!this._destroyed) {\n await Helpers.sleep(PING_INTERVAL);\n if (this._reconnecting) {\n continue;\n }\n\n try {\n await attempts(() => {\n return timeout(this._sender.send(new requests.PingDelayDisconnect({\n pingId: Helpers.getRandomInt(Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER),\n disconnectDelay: PING_DISCONNECT_DELAY,\n })), PING_TIMEOUT);\n }, PING_FAIL_ATTEMPTS, PING_FAIL_INTERVAL);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n if (this._reconnecting) {\n continue;\n }\n\n await this.disconnect();\n await this.connect();\n }\n\n // We need to send some content-related request at least hourly\n // for Telegram to keep delivering updates, otherwise they will\n // just stop even if we're connected. Do so every 30 minutes.\n\n // TODO Call getDifference instead since it's more relevant\n if (new Date().getTime() - this._lastRequest > 30 * 60 * 1000) {\n try {\n await this.invoke(new requests.updates.GetState());\n } catch (e) {\n // we don't care about errors here\n }\n }\n }\n await this.disconnect();\n }\n\n /**\n * Disconnects from the Telegram server\n * @returns {Promise}\n */\n async disconnect() {\n if (this._sender) {\n await this._sender.disconnect();\n }\n\n await Promise.all(\n Object.values(this._exportedSenderPromises)\n .map((promise) => {\n return promise && promise.then((sender) => {\n if (sender) {\n return sender.disconnect();\n }\n return undefined;\n });\n }),\n );\n\n this._exportedSenderPromises = {};\n }\n\n /**\n * Disconnects all senders and removes all handlers\n * @returns {Promise}\n */\n async destroy() {\n this._destroyed = true;\n\n try {\n await this.disconnect();\n } catch (err) {\n // Do nothing\n }\n\n this.session.delete();\n this._eventBuilders = [];\n }\n\n async _switchDC(newDc) {\n this._log.info(`Reconnecting to new data center ${newDc}`);\n const DC = utils.getDC(newDc);\n this.session.setDC(newDc, DC.ipAddress, DC.port);\n // authKey's are associated with a server, which has now changed\n // so it's not valid anymore. Set to None to force recreating it.\n await this._sender.authKey.setKey(undefined);\n this.session.setAuthKey(undefined);\n this._reconnecting = true;\n await this.disconnect();\n return this.connect();\n }\n\n _authKeyCallback(authKey, dcId) {\n this.session.setAuthKey(authKey, dcId);\n }\n\n // endregion\n // export region\n\n _cleanupExportedSender(dcId) {\n if (this.session.dcId !== dcId) {\n this.session.setAuthKey(undefined, dcId);\n }\n this._exportedSenderPromises[dcId] = undefined;\n }\n\n async _connectSender(sender, dcId) {\n const dc = utils.getDC(dcId);\n\n while (true) {\n try {\n await sender.connect(new this._connection(\n dc.ipAddress,\n dc.port,\n dcId,\n this._log,\n ));\n\n if (this.session.dcId !== dcId && !sender._authenticated) {\n this._log.info(`Exporting authorization for data center ${dc.ipAddress}`);\n const auth = await this.invoke(new requests.auth.ExportAuthorization({ dcId }));\n const req = this._initWith(new requests.auth.ImportAuthorization({\n id: auth.id,\n bytes: auth.bytes,\n }));\n await sender.send(req);\n sender._authenticated = true;\n }\n sender.dcId = dcId;\n sender.userDisconnected = false;\n\n return sender;\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n\n await Helpers.sleep(1000);\n await sender.disconnect();\n }\n }\n }\n\n async _borrowExportedSender(dcId, shouldReconnect, existingSender) {\n if (this._additionalDcsDisabled) {\n return undefined;\n }\n\n if (!this._exportedSenderPromises[dcId] || shouldReconnect) {\n this._exportedSenderPromises[dcId] = this._connectSender(\n existingSender || this._createExportedSender(dcId),\n dcId,\n );\n }\n\n let sender;\n try {\n sender = await this._exportedSenderPromises[dcId];\n\n if (!sender.isConnected()) {\n if (sender.isConnecting) {\n await Helpers.sleep(EXPORTED_SENDER_RECONNECT_TIMEOUT);\n return this._borrowExportedSender(dcId, false, sender);\n } else {\n return this._borrowExportedSender(dcId, true, sender);\n }\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n\n return this._borrowExportedSender(dcId, true);\n }\n\n if (this._exportedSenderReleaseTimeouts[dcId]) {\n clearTimeout(this._exportedSenderReleaseTimeouts[dcId]);\n this._exportedSenderReleaseTimeouts[dcId] = undefined;\n }\n\n this._exportedSenderReleaseTimeouts[dcId] = setTimeout(() => {\n this._exportedSenderReleaseTimeouts[dcId] = undefined;\n sender.disconnect();\n }, EXPORTED_SENDER_RELEASE_TIMEOUT);\n\n return sender;\n }\n\n _createExportedSender(dcId) {\n return new MTProtoSender(this.session.getAuthKey(dcId), {\n logger: this._log,\n dcId,\n retries: this._connectionRetries,\n delay: this._retryDelay,\n autoReconnect: this._autoReconnect,\n connectTimeout: this._timeout,\n authKeyCallback: this._authKeyCallback.bind(this),\n isMainSender: dcId === this.session.dcId,\n onConnectionBreak: this._cleanupExportedSender.bind(this),\n });\n }\n\n getSender(dcId) {\n return dcId ? this._borrowExportedSender(dcId) : Promise.resolve(this._sender);\n }\n\n // end region\n\n // download region\n\n /**\n * Complete flow to download a file.\n * @param inputLocation {constructors.InputFileLocation}\n * @param [args[partSizeKb] {number}]\n * @param [args[fileSize] {number}]\n * @param [args[progressCallback] {Function}]\n * @param [args[start] {number}]\n * @param [args[end] {number}]\n * @param [args[dcId] {number}]\n * @param [args[workers] {number}]\n * @returns {Promise}\n */\n downloadFile(inputLocation, args = {}) {\n return downloadFile(this, inputLocation, args);\n }\n\n downloadMedia(messageOrMedia, args) {\n let media;\n if (messageOrMedia instanceof constructors.Message) {\n media = messageOrMedia.media;\n } else {\n media = messageOrMedia;\n }\n if (typeof media === 'string') {\n throw new Error('not implemented');\n }\n\n if (media instanceof constructors.MessageMediaWebPage) {\n if (media.webpage instanceof constructors.WebPage) {\n media = media.webpage.document || media.webpage.photo;\n }\n }\n if (media instanceof constructors.MessageMediaPhoto || media instanceof constructors.Photo) {\n return this._downloadPhoto(media, args);\n } else if (media instanceof constructors.MessageMediaDocument || media instanceof constructors.Document) {\n return this._downloadDocument(media, args);\n } else if (media instanceof constructors.MessageMediaContact) {\n return this._downloadContact(media, args);\n } else if (media instanceof constructors.WebDocument || media instanceof constructors.WebDocumentNoProxy) {\n return this._downloadWebDocument(media, args);\n }\n return undefined;\n }\n\n downloadProfilePhoto(entity, isBig = false) {\n // ('User', 'Chat', 'UserFull', 'ChatFull')\n const ENTITIES = [0x2da17977, 0xc5af5d94, 0x1f4661b9, 0xd49a2697];\n // ('InputPeer', 'InputUser', 'InputChannel')\n // const INPUTS = [0xc91c90b6, 0xe669bf46, 0x40f202fd]\n // Todo account for input methods\n const sizeType = isBig ? 'x' : 'm';\n let photo;\n if (!(ENTITIES.includes(entity.SUBCLASS_OF_ID))) {\n photo = entity;\n } else {\n if (!entity.photo) {\n // Special case: may be a ChatFull with photo:Photo\n if (!entity.chatPhoto) {\n return undefined;\n }\n\n return this._downloadPhoto(\n entity.chatPhoto, { sizeType },\n );\n }\n photo = entity.photo;\n }\n\n let dcId;\n let loc;\n if (photo instanceof constructors.UserProfilePhoto || photo instanceof constructors.ChatPhoto) {\n dcId = photo.dcId;\n loc = new constructors.InputPeerPhotoFileLocation({\n peer: utils.getInputPeer(entity),\n photoId: photo.photoId,\n big: isBig,\n });\n } else {\n // It doesn't make any sense to check if `photo` can be used\n // as input location, because then this method would be able\n // to \"download the profile photo of a message\", i.e. its\n // media which should be done with `download_media` instead.\n return undefined;\n }\n return this.downloadFile(loc, {\n dcId,\n });\n }\n\n downloadStickerSetThumb(stickerSet) {\n if (!stickerSet.thumbs || !stickerSet.thumbs.length) {\n return undefined;\n }\n\n const { thumbVersion } = stickerSet;\n return this.downloadFile(\n new constructors.InputStickerSetThumb({\n stickerset: new constructors.InputStickerSetID({\n id: stickerSet.id,\n accessHash: stickerSet.accessHash,\n }),\n thumbVersion,\n }),\n { dcId: stickerSet.thumbDcId },\n );\n }\n\n _pickFileSize(sizes, sizeType) {\n if (!sizeType || !sizes || !sizes.length) {\n return undefined;\n }\n const indexOfSize = sizeTypes.indexOf(sizeType);\n let size;\n for (let i = indexOfSize; i < sizeTypes.length; i++) {\n size = sizes.find((s) => s.type === sizeTypes[i]);\n if (size) {\n return size;\n }\n }\n return undefined;\n }\n\n\n _downloadCachedPhotoSize(size) {\n // No need to download anything, simply write the bytes\n let data;\n if (size instanceof constructors.PhotoStrippedSize) {\n data = utils.strippedPhotoToJpg(size.bytes);\n } else {\n data = size.bytes;\n }\n return data;\n }\n\n _downloadPhoto(photo, args) {\n if (photo instanceof constructors.MessageMediaPhoto) {\n photo = photo.photo;\n }\n if (!(photo instanceof constructors.Photo)) {\n return undefined;\n }\n const size = this._pickFileSize(photo.sizes, args.sizeType);\n if (!size || (size instanceof constructors.PhotoSizeEmpty)) {\n return undefined;\n }\n\n if (size instanceof constructors.PhotoCachedSize || size instanceof constructors.PhotoStrippedSize) {\n return this._downloadCachedPhotoSize(size);\n }\n return this.downloadFile(\n new constructors.InputPhotoFileLocation({\n id: photo.id,\n accessHash: photo.accessHash,\n fileReference: photo.fileReference,\n thumbSize: size.type,\n }),\n {\n dcId: photo.dcId,\n fileSize: size.size,\n progressCallback: args.progressCallback,\n },\n );\n }\n\n _downloadDocument(doc, args) {\n if (doc instanceof constructors.MessageMediaDocument) {\n doc = doc.document;\n }\n if (!(doc instanceof constructors.Document)) {\n return undefined;\n }\n\n let size;\n if (args.sizeType) {\n size = doc.thumbs ? this._pickFileSize(doc.thumbs, args.sizeType) : undefined;\n if (!size && doc.mimeType.startsWith('video/')) {\n return undefined;\n }\n\n if (size && (size instanceof constructors.PhotoCachedSize\n || size instanceof constructors.PhotoStrippedSize)) {\n return this._downloadCachedPhotoSize(size);\n }\n }\n\n return this.downloadFile(\n new constructors.InputDocumentFileLocation({\n id: doc.id,\n accessHash: doc.accessHash,\n fileReference: doc.fileReference,\n thumbSize: size ? size.type : '',\n }),\n {\n fileSize: size ? size.size : doc.size,\n progressCallback: args.progressCallback,\n start: args.start,\n end: args.end,\n dcId: doc.dcId,\n workers: args.workers,\n },\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _downloadContact(media, args) {\n throw new Error('not implemented');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async _downloadWebDocument(media) {\n try {\n const buff = [];\n let offset = 0;\n while (true) {\n const downloaded = new requests.upload.GetWebFile({\n location: new constructors.InputWebFileLocation({\n url: media.url,\n accessHash: media.accessHash,\n }),\n offset,\n limit: WEBDOCUMENT_REQUEST_PART_SIZE,\n });\n const sender = await this._borrowExportedSender(WEBDOCUMENT_DC_ID);\n const res = await sender.send(downloaded);\n offset += 131072;\n if (res.bytes.length) {\n buff.push(res.bytes);\n if (res.bytes.length < WEBDOCUMENT_REQUEST_PART_SIZE) {\n break;\n }\n } else {\n break;\n }\n }\n return Buffer.concat(buff);\n } catch (e) {\n // the file is no longer saved in telegram's cache.\n if (e.message === 'WEBFILE_NOT_AVAILABLE') {\n return Buffer.alloc(0);\n } else {\n throw e;\n }\n }\n }\n\n // region Invoking Telegram request\n /**\n * Invokes a MTProtoRequest (sends and receives it) and returns its result\n * @param request\n * @returns {Promise}\n */\n\n async invoke(request) {\n if (request.classType !== 'request') {\n throw new Error('You can only invoke MTProtoRequests');\n }\n // This causes issues for now because not enough utils\n // await request.resolve(this, utils)\n\n\n this._lastRequest = new Date().getTime();\n let attempt = 0;\n for (attempt = 0; attempt < this._requestRetries; attempt++) {\n const promise = this._sender.sendWithInvokeSupport(request);\n try {\n const result = await promise.promise;\n return result;\n } catch (e) {\n if (e instanceof errors.ServerError || e.message === 'RPC_CALL_FAIL'\n || e.message === 'RPC_MCGET_FAIL') {\n this._log.warn(`Telegram is having internal issues ${e.constructor.name}`);\n await sleep(2000);\n } else if (e instanceof errors.FloodWaitError || e instanceof errors.FloodTestPhoneWaitError) {\n if (e.seconds <= this.floodSleepLimit) {\n this._log.info(`Sleeping for ${e.seconds}s on flood wait`);\n await sleep(e.seconds * 1000);\n } else {\n throw e;\n }\n } else if (e instanceof errors.PhoneMigrateError || e instanceof errors.NetworkMigrateError\n || e instanceof errors.UserMigrateError) {\n this._log.info(`Phone migrated to ${e.newDc}`);\n const shouldRaise = e instanceof errors.PhoneMigrateError\n || e instanceof errors.NetworkMigrateError;\n if (shouldRaise && await checkAuthorization(this)) {\n throw e;\n }\n await this._switchDC(e.newDc);\n } else if (e instanceof errors.MsgWaitError) {\n // we need to resend this after the old one was confirmed.\n await promise.isReady();\n } else {\n throw e;\n }\n }\n }\n throw new Error(`Request was unsuccessful ${attempt} time(s)`);\n }\n\n async getMe() {\n try {\n return (await this.invoke(new requests.users\n .GetUsers({ id: [new constructors.InputUserSelf()] })))[0];\n } catch (e) {\n this._log.warn('error while getting me');\n this._log.warn(e);\n }\n return undefined;\n }\n\n async start(authParams) {\n if (!this.isConnected()) {\n await this.connect();\n }\n\n if (await checkAuthorization(this)) {\n return;\n }\n\n const apiCredentials = {\n apiId: this.apiId,\n apiHash: this.apiHash,\n };\n\n await authFlow(this, apiCredentials, authParams);\n }\n\n uploadFile(fileParams) {\n return uploadFile(this, fileParams);\n }\n\n updateTwoFaSettings(params) {\n return updateTwoFaSettings(this, params);\n }\n\n // event region\n addEventHandler(callback, event) {\n this._eventBuilders.push([event, callback]);\n }\n\n _handleUpdate(update) {\n // this.session.processEntities(update)\n // this._entityCache.add(update)\n\n if (update instanceof constructors.Updates || update instanceof constructors.UpdatesCombined) {\n // TODO deal with entities\n const entities = [];\n for (const x of [...update.users, ...update.chats]) {\n entities.push(x);\n }\n for (const u of update.updates) {\n this._processUpdate(u, update.updates, entities);\n }\n } else if (update instanceof constructors.UpdateShort) {\n this._processUpdate(update.update, undefined);\n } else {\n this._processUpdate(update, undefined);\n }\n // TODO add caching\n // this._stateCache.update(update)\n }\n\n _processUpdate(update, others, entities) {\n update._entities = entities || [];\n const args = {\n update,\n others,\n };\n this._dispatchUpdate(args);\n }\n\n\n // endregion\n\n // region private methods\n\n /**\n Gets a full entity from the given string, which may be a phone or\n a username, and processes all the found entities on the session.\n The string may also be a user link, or a channel/chat invite link.\n\n This method has the side effect of adding the found users to the\n session database, so it can be queried later without API calls,\n if this option is enabled on the session.\n\n Returns the found entity, or raises TypeError if not found.\n * @param string {string}\n * @returns {Promise}\n * @private\n */\n /* CONTEST\n async _getEntityFromString(string) {\n const phone = utils.parsePhone(string)\n if (phone) {\n try {\n for (const user of (await this.invoke(\n new requests.contacts.GetContacts(0))).users) {\n if (user.phone === phone) {\n return user\n }\n }\n } catch (e) {\n if (e.message === 'BOT_METHOD_INVALID') {\n throw new Error('Cannot get entity by phone number as a ' +\n 'bot (try using integer IDs, not strings)')\n }\n throw e\n }\n } else if (['me', 'this'].includes(string.toLowerCase())) {\n return this.getMe()\n } else {\n const { username, isJoinChat } = utils.parseUsername(string)\n if (isJoinChat) {\n const invite = await this.invoke(new requests.messages.CheckChatInvite({\n 'hash': username,\n }))\n if (invite instanceof constructors.ChatInvite) {\n throw new Error('Cannot get entity from a channel (or group) ' +\n 'that you are not part of. Join the group and retry',\n )\n } else if (invite instanceof constructors.ChatInviteAlready) {\n return invite.chat\n }\n } else if (username) {\n try {\n const result = await this.invoke(\n new requests.contacts.ResolveUsername(username))\n const pid = utils.getPeerId(result.peer, false)\n if (result.peer instanceof constructors.PeerUser) {\n for (const x of result.users) {\n if (x.id === pid) {\n return x\n }\n }\n } else {\n for (const x of result.chats) {\n if (x.id === pid) {\n return x\n }\n }\n }\n } catch (e) {\n if (e.message === 'USERNAME_NOT_OCCUPIED') {\n throw new Error(`No user has \"${username}\" as username`)\n }\n throw e\n }\n }\n }\n throw new Error(`Cannot find any entity corresponding to \"${string}\"`)\n }\n */\n // endregion\n\n\n // users region\n /**\n Turns the given entity into its input entity version.\n\n Most requests use this kind of :tl:`InputPeer`, so this is the most\n suitable call to make for those cases. **Generally you should let the\n library do its job** and don't worry about getting the input entity\n first, but if you're going to use an entity often, consider making the\n call:\n\n Arguments\n entity (`str` | `int` | :tl:`Peer` | :tl:`InputPeer`):\n If a username or invite link is given, **the library will\n use the cache**. This means that it's possible to be using\n a username that *changed* or an old invite link (this only\n happens if an invite link for a small group chat is used\n after it was upgraded to a mega-group).\n\n If the username or ID from the invite link is not found in\n the cache, it will be fetched. The same rules apply to phone\n numbers (``'+34 123456789'``) from people in your contact list.\n\n If an exact name is given, it must be in the cache too. This\n is not reliable as different people can share the same name\n and which entity is returned is arbitrary, and should be used\n only for quick tests.\n\n If a positive integer ID is given, the entity will be searched\n in cached users, chats or channels, without making any call.\n\n If a negative integer ID is given, the entity will be searched\n exactly as either a chat (prefixed with ``-``) or as a channel\n (prefixed with ``-100``).\n\n If a :tl:`Peer` is given, it will be searched exactly in the\n cache as either a user, chat or channel.\n\n If the given object can be turned into an input entity directly,\n said operation will be done.\n\n Unsupported types will raise ``TypeError``.\n\n If the entity can't be found, ``ValueError`` will be raised.\n\n Returns\n :tl:`InputPeerUser`, :tl:`InputPeerChat` or :tl:`InputPeerChannel`\n or :tl:`InputPeerSelf` if the parameter is ``'me'`` or ``'self'``.\n\n If you need to get the ID of yourself, you should use\n `get_me` with ``input_peer=True``) instead.\n\n Example\n .. code-block:: python\n\n // If you're going to use \"username\" often in your code\n // (make a lot of calls), consider getting its input entity\n // once, and then using the \"user\" everywhere instead.\n user = await client.get_input_entity('username')\n\n // The same applies to IDs, chats or channels.\n chat = await client.get_input_entity(-123456789)\n\n * @param peer\n * @returns {Promise<>}\n */\n\n /* CONTEST\n async getInputEntity(peer) {\n // Short-circuit if the input parameter directly maps to an InputPeer\n try {\n return utils.getInputPeer(peer)\n // eslint-disable-next-line no-empty\n } catch (e) {\n }\n // Next in priority is having a peer (or its ID) cached in-memory\n try {\n // 0x2d45687 == crc32(b'Peer')\n if (typeof peer === 'number' || peer.SUBCLASS_OF_ID === 0x2d45687) {\n if (this._entityCache.has(peer)) {\n return this._entityCache[peer]\n }\n }\n // eslint-disable-next-line no-empty\n } catch (e) {\n }\n // Then come known strings that take precedence\n if (['me', 'this'].includes(peer)) {\n return new constructors.InputPeerSelf()\n }\n // No InputPeer, cached peer, or known string. Fetch from disk cache\n try {\n return this.session.getInputEntity(peer)\n // eslint-disable-next-line no-empty\n } catch (e) {\n }\n // Only network left to try\n if (typeof peer === 'string') {\n return utils.getInputPeer(await this._getEntityFromString(peer))\n }\n // If we're a bot and the user has messaged us privately users.getUsers\n // will work with accessHash = 0. Similar for channels.getChannels.\n // If we're not a bot but the user is in our contacts, it seems to work\n // regardless. These are the only two special-cased requests.\n peer = utils.getPeer(peer)\n if (peer instanceof constructors.PeerUser) {\n const users = await this.invoke(new requests.users.GetUsers({\n id: [new constructors.InputUser({\n userId: peer.userId,\n accessHash: 0,\n })],\n }))\n if (users && !(users[0] instanceof constructors.UserEmpty)) {\n // If the user passed a valid ID they expect to work for\n // channels but would be valid for users, we get UserEmpty.\n // Avoid returning the invalid empty input peer for that.\n //\n // We *could* try to guess if it's a channel first, and if\n // it's not, work as a chat and try to validate it through\n // another request, but that becomes too much work.\n return utils.getInputPeer(users[0])\n }\n } else if (peer instanceof constructors.PeerChat) {\n return new constructors.InputPeerChat({\n chatId: peer.chatId,\n })\n } else if (peer instanceof constructors.PeerChannel) {\n try {\n const channels = await this.invoke(new requests.channels.GetChannels({\n id: [new constructors.InputChannel({\n channelId: peer.channelId,\n accessHash: 0,\n })],\n }))\n\n return utils.getInputPeer(channels.chats[0])\n // eslint-disable-next-line no-empty\n } catch (e) {\n console.log(e)\n }\n }\n throw new Error(`Could not find the input entity for ${peer.id || peer.channelId || peer.chatId || peer.userId}.\n Please read https://` +\n 'docs.telethon.dev/en/latest/concepts/entities.html to' +\n ' find out more details.',\n )\n }\n */\n async _dispatchUpdate(args = {\n update: undefined,\n others: undefined,\n channelId: undefined,\n ptsDate: undefined,\n }) {\n for (const [builder, callback] of this._eventBuilders) {\n const event = builder.build(args.update);\n if (event) {\n await callback(event);\n }\n }\n }\n\n isConnected() {\n if (this._sender) {\n if (this._sender.isConnected()) {\n return true;\n }\n }\n return false;\n }\n}\n\nfunction timeout(promise, ms) {\n return Promise.race([\n promise,\n Helpers.sleep(ms)\n .then(() => Promise.reject(new Error('TIMEOUT'))),\n ]);\n}\n\nasync function attempts(cb, times, pause) {\n for (let i = 0; i < times; i++) {\n try {\n // We need to `return await` here so it can be caught locally\n return await cb();\n } catch (err) {\n if (i === times - 1) {\n throw err;\n }\n\n await Helpers.sleep(pause);\n }\n }\n return undefined;\n}\n\nmodule.exports = TelegramClient;\n","exports.endianness = function () { return 'LE' };\n\nexports.hostname = function () {\n if (typeof location !== 'undefined') {\n return location.hostname\n }\n else return '';\n};\n\nexports.loadavg = function () { return [] };\n\nexports.uptime = function () { return 0 };\n\nexports.freemem = function () {\n return Number.MAX_VALUE;\n};\n\nexports.totalmem = function () {\n return Number.MAX_VALUE;\n};\n\nexports.cpus = function () { return [] };\n\nexports.type = function () { return 'Browser' };\n\nexports.release = function () {\n if (typeof navigator !== 'undefined') {\n return navigator.appVersion;\n }\n return '';\n};\n\nexports.networkInterfaces\n= exports.getNetworkInterfaces\n= function () { return {} };\n\nexports.arch = function () { return 'javascript' };\n\nexports.platform = function () { return 'browser' };\n\nexports.tmpdir = exports.tmpDir = function () {\n return '/tmp';\n};\n\nexports.EOL = '\\n';\n\nexports.homedir = function () {\n\treturn '/'\n};\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","/**\n * Executes the authentication process with the Telegram servers.\n * @param sender a connected {MTProtoPlainSender}.\n * @param log\n * @returns {Promise<{authKey: *, timeOffset: *}>}\n */\n// eslint-disable-next-line import/no-named-default\nimport { default as Api } from '../tl/api';\nimport { SecurityError } from '../errors';\n// eslint-disable-next-line import/no-named-default\nimport { default as MTProtoPlainSender } from './MTProtoPlainSender';\nimport { _serverKeys } from '../crypto/RSA';\n\nconst bigInt = require('big-integer');\nconst IGE = require('../crypto/IGE');\nconst AuthKey = require('../crypto/AuthKey');\nconst Factorizator = require('../crypto/Factorizator');\nconst Helpers = require('../Helpers');\nconst BinaryReader = require('../extensions/BinaryReader');\n\nconst RETRIES = 20;\n\nexport async function doAuthentication(sender: MTProtoPlainSender, log: any) {\n // Step 1 sending: PQ Request, endianness doesn't matter since it's random\n let bytes = Helpers.generateRandomBytes(16);\n\n const nonce = Helpers.readBigIntFromBuffer(bytes, false, true);\n const resPQ = await sender.send(new Api.ReqPqMulti({ nonce }));\n log.debug('Starting authKey generation step 1');\n\n if (!(resPQ instanceof Api.ResPQ)) {\n throw new SecurityError(`Step 1 answer was ${resPQ}`);\n }\n if (resPQ.nonce.neq(nonce)) {\n throw new SecurityError('Step 1 invalid nonce from server');\n }\n const pq = Helpers.readBigIntFromBuffer(resPQ.pq, false, true);\n log.debug('Finished authKey generation step 1');\n // Step 2 sending: DH Exchange\n const { p, q } = Factorizator.factorize(pq);\n\n const pBuffer = Helpers.getByteArray(p);\n const qBuffer = Helpers.getByteArray(q);\n\n bytes = Helpers.generateRandomBytes(32);\n const newNonce = Helpers.readBigIntFromBuffer(bytes, true, true);\n const pqInnerData = new Api.PQInnerData({\n pq: Helpers.getByteArray(pq), // unsigned\n p: pBuffer,\n q: qBuffer,\n nonce: resPQ.nonce,\n serverNonce: resPQ.serverNonce,\n newNonce,\n }).getBytes();\n if (pqInnerData.length > 144) {\n throw new SecurityError('Step 1 invalid nonce from server');\n }\n let targetFingerprint;\n let targetKey;\n for (const fingerprint of resPQ.serverPublicKeyFingerprints) {\n targetKey = _serverKeys.get(fingerprint.toString());\n if (targetKey !== undefined) {\n targetFingerprint = fingerprint;\n break;\n }\n }\n if (targetFingerprint === undefined || targetKey === undefined) {\n throw new SecurityError(\n 'Step 2 could not find a valid key for fingerprints',\n );\n }\n // Value should be padded to be made 192 exactly\n const padding = Helpers.generateRandomBytes(192 - pqInnerData.length);\n const dataWithPadding = Buffer.concat([pqInnerData, padding]);\n const dataPadReversed = Buffer.from(dataWithPadding).reverse();\n\n let encryptedData;\n for (let i = 0; i < RETRIES; i++) {\n const tempKey = Helpers.generateRandomBytes(32);\n const shaDigestKeyWithData = await Helpers.sha256(Buffer.concat([tempKey, dataWithPadding]));\n const dataWithHash = Buffer.concat([dataPadReversed, shaDigestKeyWithData]);\n\n const ige = new IGE(tempKey, Buffer.alloc(32));\n const aesEncrypted = ige.encryptIge(dataWithHash);\n const tempKeyXor = Helpers.bufferXor(tempKey, await Helpers.sha256(aesEncrypted));\n\n const keyAesEncrypted = Buffer.concat([tempKeyXor, aesEncrypted]);\n const keyAesEncryptedInt = Helpers.readBigIntFromBuffer(keyAesEncrypted, false, false);\n if (keyAesEncryptedInt.greaterOrEquals(targetKey.n)) {\n log.debug('Aes key greater than RSA. retrying');\n continue;\n }\n const encryptedDataBuffer = Helpers.modExp(keyAesEncryptedInt, bigInt(targetKey.e), targetKey.n);\n encryptedData = Helpers.readBufferFromBigInt(encryptedDataBuffer, 256, false, false);\n\n break;\n }\n if (encryptedData === undefined) {\n throw new SecurityError(\n 'Step 2 could create a secure encrypted key',\n );\n }\n log.debug('Step 2 : Generated a secure aes encrypted data');\n\n const serverDhParams = await sender.send(\n new Api.ReqDHParams({\n nonce: resPQ.nonce,\n serverNonce: resPQ.serverNonce,\n p: pBuffer,\n q: qBuffer,\n publicKeyFingerprint: targetFingerprint,\n encryptedData,\n }),\n );\n\n if (\n !(\n serverDhParams instanceof Api.ServerDHParamsOk\n || serverDhParams instanceof Api.ServerDHParamsFail\n )\n ) {\n throw new Error(`Step 2.1 answer was ${serverDhParams}`);\n }\n if (serverDhParams.nonce.neq(resPQ.nonce)) {\n throw new SecurityError('Step 2 invalid nonce from server');\n }\n\n if (serverDhParams.serverNonce.neq(resPQ.serverNonce)) {\n throw new SecurityError('Step 2 invalid server nonce from server');\n }\n\n if (serverDhParams instanceof Api.ServerDHParamsFail) {\n const sh = await Helpers.sha1(\n Helpers.toSignedLittleBuffer(newNonce, 32).slice(4, 20),\n );\n const nnh = Helpers.readBigIntFromBuffer(sh, true, true);\n if (serverDhParams.newNonceHash.neq(nnh)) {\n throw new SecurityError('Step 2 invalid DH fail nonce from server');\n }\n }\n if (!(serverDhParams instanceof Api.ServerDHParamsOk)) {\n throw new Error(`Step 2.2 answer was ${serverDhParams}`);\n }\n log.debug('Finished authKey generation step 2');\n log.debug('Starting authKey generation step 3');\n\n // Step 3 sending: Complete DH Exchange\n const { key, iv } = await Helpers.generateKeyDataFromNonce(\n resPQ.serverNonce,\n newNonce,\n );\n if (serverDhParams.encryptedAnswer.length % 16 !== 0) {\n // See PR#453\n throw new SecurityError('Step 3 AES block size mismatch');\n }\n const ige = new IGE(key, iv);\n const plainTextAnswer = ige.decryptIge(serverDhParams.encryptedAnswer);\n const reader = new BinaryReader(plainTextAnswer);\n reader.read(20); // hash sum\n const serverDhInner = reader.tgReadObject();\n if (!(serverDhInner instanceof Api.ServerDHInnerData)) {\n throw new Error(`Step 3 answer was ${serverDhInner}`);\n }\n\n if (serverDhInner.nonce.neq(resPQ.nonce)) {\n throw new SecurityError('Step 3 Invalid nonce in encrypted answer');\n }\n if (serverDhInner.serverNonce.neq(resPQ.serverNonce)) {\n throw new SecurityError(\n 'Step 3 Invalid server nonce in encrypted answer',\n );\n }\n const dhPrime = Helpers.readBigIntFromBuffer(\n serverDhInner.dhPrime,\n false,\n false,\n );\n const ga = Helpers.readBigIntFromBuffer(serverDhInner.gA, false, false);\n const timeOffset = serverDhInner.serverTime - Math.floor(new Date().getTime() / 1000);\n const b = Helpers.readBigIntFromBuffer(\n Helpers.generateRandomBytes(256),\n false,\n false,\n );\n const gb = Helpers.modExp(bigInt(serverDhInner.g), b, dhPrime);\n const gab = Helpers.modExp(ga, b, dhPrime);\n\n // Prepare client DH Inner Data\n const clientDhInner = new Api.ClientDHInnerData({\n nonce: resPQ.nonce,\n serverNonce: resPQ.serverNonce,\n retryId: bigInt.zero, // TODO Actual retry ID\n gB: Helpers.getByteArray(gb, false),\n }).getBytes();\n\n const clientDdhInnerHashed = Buffer.concat([\n await Helpers.sha1(clientDhInner),\n clientDhInner,\n ]);\n // Encryption\n\n const clientDhEncrypted = ige.encryptIge(clientDdhInnerHashed);\n const dhGen = await sender.send(\n new Api.SetClientDHParams({\n nonce: resPQ.nonce,\n serverNonce: resPQ.serverNonce,\n encryptedData: clientDhEncrypted,\n }),\n );\n const nonceTypes = [Api.DhGenOk, Api.DhGenRetry, Api.DhGenFail];\n // TS being weird again.\n const nonceTypesString = ['DhGenOk', 'DhGenRetry', 'DhGenFail'];\n if (\n !(\n dhGen instanceof nonceTypes[0]\n || dhGen instanceof nonceTypes[1]\n || dhGen instanceof nonceTypes[2]\n )\n ) {\n throw new Error(`Step 3.1 answer was ${dhGen}`);\n }\n const { name } = dhGen.constructor;\n if (dhGen.nonce.neq(resPQ.nonce)) {\n throw new SecurityError(`Step 3 invalid ${name} nonce from server`);\n }\n if (dhGen.serverNonce.neq(resPQ.serverNonce)) {\n throw new SecurityError(\n `Step 3 invalid ${name} server nonce from server`,\n );\n }\n const authKey = new AuthKey();\n await authKey.setKey(Helpers.getByteArray(gab));\n\n const nonceNumber = 1 + nonceTypesString.indexOf(dhGen.className);\n\n const newNonceHash = await authKey.calcNewNonceHash(newNonce, nonceNumber);\n // @ts-ignore\n const dhHash = dhGen[`newNonceHash${nonceNumber}`];\n\n if (dhHash.neq(newNonceHash)) {\n throw new SecurityError('Step 3 invalid new nonce hash');\n }\n\n if (!(dhGen instanceof Api.DhGenOk)) {\n throw new Error(`Step 3.2 answer was ${dhGen}`);\n }\n log.debug('Finished authKey generation step 3');\n\n return { authKey, timeOffset };\n}\n","const BigInt = require('big-integer');\nconst { modExp } = require('../Helpers');\n\nclass Factorizator {\n /**\n * Calculates the greatest common divisor\n * @param a {BigInteger}\n * @param b {BigInteger}\n * @returns {BigInteger}\n */\n static gcd(a, b) {\n while (b.neq(BigInt.zero)) {\n const temp = b;\n b = a.remainder(b);\n a = temp;\n }\n return a;\n }\n\n /**\n * Factorizes the given number and returns both the divisor and the number divided by the divisor\n * @param pq {BigInteger}\n * @returns {{p: *, q: *}}\n */\n static factorize(pq) {\n if (pq.remainder(2)\n .equals(BigInt.zero)) {\n return {\n p: BigInt(2),\n q: pq.divide(BigInt(2)),\n };\n }\n let y = BigInt.randBetween(BigInt(1), pq.minus(1));\n const c = BigInt.randBetween(BigInt(1), pq.minus(1));\n const m = BigInt.randBetween(BigInt(1), pq.minus(1));\n\n let g = BigInt.one;\n let r = BigInt.one;\n let q = BigInt.one;\n let x = BigInt.zero;\n let ys = BigInt.zero;\n let k;\n\n while (g.eq(BigInt.one)) {\n x = y;\n for (let i = 0; BigInt(i)\n .lesser(r); i++) {\n y = (modExp(y, BigInt(2), pq)).add(c)\n .remainder(pq);\n }\n k = BigInt.zero;\n\n while (k.lesser(r) && g.eq(BigInt.one)) {\n ys = y;\n const condition = BigInt.min(m, r.minus(k));\n for (let i = 0; BigInt(i)\n .lesser(condition); i++) {\n y = (modExp(y, BigInt(2), pq)).add(c)\n .remainder(pq);\n q = q.multiply(x.minus(y)\n .abs())\n .remainder(pq);\n }\n g = Factorizator.gcd(q, pq);\n k = k.add(m);\n }\n\n r = r.multiply(2);\n }\n\n\n if (g.eq(pq)) {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n ys = (modExp(ys, BigInt(2), pq)).add(c)\n .remainder(pq);\n g = Factorizator.gcd(x.minus(ys)\n .abs(), pq);\n\n if (g.greater(1)) {\n break;\n }\n }\n }\n const p = g;\n q = pq.divide(g);\n return p < q ? {\n p,\n q,\n } : {\n p: q,\n q: p,\n };\n }\n}\n\nmodule.exports = Factorizator;\n","const { createDeferred } = require('../Helpers');\n\nclass RequestState {\n constructor(request, after = undefined, pending = {}) {\n this.containerId = undefined;\n this.msgId = undefined;\n this.request = request;\n this.data = request.getBytes();\n this.after = after;\n this.result = undefined;\n this.pending = pending;\n this.deferred = createDeferred();\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n\n isReady() {\n const state = this.pending[this.after.id];\n if (!state) {\n return true;\n }\n return state.deferred.promise;\n }\n}\n\nmodule.exports = RequestState;\n","const { Connection } = require('./Connection');\nconst { ConnectionTCPFull } = require('./TCPFull');\nconst { ConnectionTCPAbridged } = require('./TCPAbridged');\nconst { ConnectionTCPObfuscated } = require('./TCPObfuscated');\n\nmodule.exports = {\n Connection,\n ConnectionTCPFull,\n ConnectionTCPAbridged,\n ConnectionTCPObfuscated,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Mutex_1 = require(\"./Mutex\");\nexports.Mutex = Mutex_1.default;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar Mutex = /** @class */ (function () {\n function Mutex() {\n this._queue = [];\n this._pending = false;\n }\n Mutex.prototype.isLocked = function () {\n return this._pending;\n };\n Mutex.prototype.acquire = function () {\n var _this = this;\n var ticket = new Promise(function (resolve) { return _this._queue.push(resolve); });\n if (!this._pending) {\n this._dispatchNext();\n }\n return ticket;\n };\n Mutex.prototype.runExclusive = function (callback) {\n return this\n .acquire()\n .then(function (release) {\n var result;\n try {\n result = callback();\n }\n catch (e) {\n release();\n throw (e);\n }\n return Promise\n .resolve(result)\n .then(function (x) { return (release(), x); }, function (e) {\n release();\n throw e;\n });\n });\n };\n Mutex.prototype._dispatchNext = function () {\n if (this._queue.length > 0) {\n this._pending = true;\n this._queue.shift()(this._dispatchNext.bind(this));\n }\n else {\n this._pending = false;\n }\n };\n return Mutex;\n}());\nexports.default = Mutex;\n","var _global = (function () {\n\tif (!this && typeof global !== 'undefined') {\n\t\treturn global;\n\t}\n\treturn this;\n})();\nvar NativeWebSocket = _global.WebSocket || _global.MozWebSocket;\nvar websocket_version = require('./version');\n\n\n/**\n * Expose a W3C WebSocket class with just one or two arguments.\n */\nfunction W3CWebSocket(uri, protocols) {\n\tvar native_instance;\n\n\tif (protocols) {\n\t\tnative_instance = new NativeWebSocket(uri, protocols);\n\t}\n\telse {\n\t\tnative_instance = new NativeWebSocket(uri);\n\t}\n\n\t/**\n\t * 'native_instance' is an instance of nativeWebSocket (the browser's WebSocket\n\t * class). Since it is an Object it will be returned as it is when creating an\n\t * instance of W3CWebSocket via 'new W3CWebSocket()'.\n\t *\n\t * ECMAScript 5: http://bclary.com/2004/11/07/#a-13.2.2\n\t */\n\treturn native_instance;\n}\nif (NativeWebSocket) {\n\t['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'].forEach(function(prop) {\n\t\tObject.defineProperty(W3CWebSocket, prop, {\n\t\t\tget: function() { return NativeWebSocket[prop]; }\n\t\t});\n\t});\n}\n\n/**\n * Module exports.\n */\nmodule.exports = {\n 'w3cwebsocket' : NativeWebSocket ? W3CWebSocket : null,\n 'version' : websocket_version\n};\n","module.exports = require('../package.json').version;\n","const crypto = require('./crypto');\n\nclass CTR {\n constructor(key, iv) {\n if (!Buffer.isBuffer(key) || !Buffer.isBuffer(iv) || iv.length !== 16) {\n throw new Error('Key and iv need to be a buffer');\n }\n\n this.cipher = crypto.createCipheriv('AES-256-CTR', key, iv);\n }\n\n encrypt(data) {\n return Buffer.from(this.cipher.update(data));\n }\n}\n\nmodule.exports = CTR;\n","// eslint-disable-next-line import/no-named-default\nimport { default as Api } from '../tl/api';\nimport TelegramClient from './TelegramClient';\nimport utils from '../Utils';\nimport { sleep } from '../Helpers';\nimport { computeCheck as computePasswordSrpCheck } from '../Password';\n\nexport interface UserAuthParams {\n phoneNumber: string | (() => Promise);\n phoneCode: (isCodeViaApp?: boolean) => Promise;\n password: (hint?: string) => Promise;\n firstAndLastNames: () => Promise<[string, string?]>;\n qrCode: (qrCode: { token: Buffer; expires: number }) => Promise;\n onError: (err: Error) => void;\n forceSMS?: boolean;\n initialMethod?: 'phoneNumber' | 'qrCode';\n}\n\nexport interface BotAuthParams {\n botAuthToken: string;\n}\n\ninterface ApiCredentials {\n apiId: number;\n apiHash: string;\n}\n\nconst DEFAULT_INITIAL_METHOD = 'phoneNumber';\nconst QR_CODE_TIMEOUT = 30000;\n\nexport async function authFlow(\n client: TelegramClient,\n apiCredentials: ApiCredentials,\n authParams: UserAuthParams | BotAuthParams,\n) {\n let me: Api.TypeUser;\n\n if ('botAuthToken' in authParams) {\n me = await signInBot(client, apiCredentials, authParams);\n } else {\n const { initialMethod = DEFAULT_INITIAL_METHOD } = authParams;\n\n if (initialMethod === 'phoneNumber') {\n me = await signInUser(client, apiCredentials, authParams);\n } else {\n me = await signInUserWithQrCode(client, apiCredentials, authParams);\n }\n }\n\n client._log.info('Signed in successfully as', utils.getDisplayName(me));\n}\n\n\nexport async function checkAuthorization(client: TelegramClient) {\n try {\n await client.invoke(new Api.updates.GetState());\n return true;\n } catch (e) {\n if (e.message === 'Disconnect') throw e;\n return false;\n }\n}\n\nasync function signInUser(\n client: TelegramClient, apiCredentials: ApiCredentials, authParams: UserAuthParams,\n): Promise {\n let phoneNumber;\n let phoneCodeHash;\n let isCodeViaApp = false;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n if (typeof authParams.phoneNumber === 'function') {\n try {\n phoneNumber = await authParams.phoneNumber();\n } catch (err) {\n if (err.message === 'RESTART_AUTH_WITH_QR') {\n return signInUserWithQrCode(client, apiCredentials, authParams);\n }\n\n throw err;\n }\n } else {\n phoneNumber = authParams.phoneNumber;\n }\n const sendCodeResult = await sendCode(client, apiCredentials, phoneNumber, authParams.forceSMS);\n phoneCodeHash = sendCodeResult.phoneCodeHash;\n isCodeViaApp = sendCodeResult.isCodeViaApp;\n\n if (typeof phoneCodeHash !== 'string') {\n throw new Error('Failed to retrieve phone code hash');\n }\n\n break;\n } catch (err) {\n if (typeof authParams.phoneNumber !== 'function') {\n throw err;\n }\n\n authParams.onError(err);\n }\n }\n\n let phoneCode;\n let isRegistrationRequired = false;\n let termsOfService;\n\n // eslint-disable-next-line no-constant-condition\n while (1) {\n try {\n try {\n phoneCode = await authParams.phoneCode(isCodeViaApp);\n } catch (err) {\n // This is the support for changing phone number from the phone code screen.\n if (err.message === 'RESTART_AUTH') {\n return signInUser(client, apiCredentials, authParams);\n }\n }\n\n if (!phoneCode) {\n throw new Error('Code is empty');\n }\n\n // May raise PhoneCodeEmptyError, PhoneCodeExpiredError,\n // PhoneCodeHashEmptyError or PhoneCodeInvalidError.\n const result = await client.invoke(new Api.auth.SignIn({\n phoneNumber,\n phoneCodeHash,\n phoneCode,\n }));\n\n if (result instanceof Api.auth.AuthorizationSignUpRequired) {\n isRegistrationRequired = true;\n termsOfService = result.termsOfService;\n break;\n }\n\n return result.user;\n } catch (err) {\n if (err.message === 'SESSION_PASSWORD_NEEDED') {\n return signInWithPassword(client, apiCredentials, authParams);\n } else {\n authParams.onError(err);\n }\n }\n }\n\n if (isRegistrationRequired) {\n // eslint-disable-next-line no-constant-condition\n while (1) {\n try {\n const [firstName, lastName] = await authParams.firstAndLastNames();\n if (!firstName) {\n throw new Error('First name is required');\n }\n\n const { user } = await client.invoke(new Api.auth.SignUp({\n phoneNumber,\n phoneCodeHash,\n firstName,\n lastName,\n })) as Api.auth.Authorization;\n\n if (termsOfService) {\n // This is a violation of Telegram rules: the user should be presented with and accept TOS.\n await client.invoke(new Api.help.AcceptTermsOfService({ id: termsOfService.id }));\n }\n\n return user;\n } catch (err) {\n authParams.onError(err);\n }\n }\n }\n\n authParams.onError(new Error('Auth failed'));\n return signInUser(client, apiCredentials, authParams);\n}\n\nasync function signInUserWithQrCode(\n client: TelegramClient, apiCredentials: ApiCredentials, authParams: UserAuthParams,\n): Promise {\n let isScanningComplete = false;\n\n const inputPromise = (async () => {\n // eslint-disable-next-line no-constant-condition\n while (1) {\n if (isScanningComplete) {\n break;\n }\n\n const result = await client.invoke(new Api.auth.ExportLoginToken({\n apiId: Number(process.env.TELEGRAM_T_API_ID),\n apiHash: process.env.TELEGRAM_T_API_HASH,\n exceptIds: [],\n }));\n if (!(result instanceof Api.auth.LoginToken)) {\n throw new Error('Unexpected');\n }\n\n const { token, expires } = result;\n\n await Promise.race([\n authParams.qrCode({ token, expires }),\n sleep(QR_CODE_TIMEOUT),\n ]);\n }\n })();\n\n const updatePromise = new Promise((resolve) => {\n client.addEventHandler((update: Api.TypeUpdate) => {\n if (update instanceof Api.UpdateLoginToken) {\n resolve();\n }\n }, { build: (update: object) => update });\n });\n\n try {\n // Either we receive an update that QR is successfully scanned,\n // or we receive a rejection caused by user going back to the regular auth form\n await Promise.race([updatePromise, inputPromise]);\n } catch (err) {\n if (err.message === 'RESTART_AUTH') {\n return signInUser(client, apiCredentials, authParams);\n }\n\n throw err;\n } finally {\n isScanningComplete = true;\n }\n\n try {\n const result2 = await client.invoke(new Api.auth.ExportLoginToken({\n apiId: Number(process.env.TELEGRAM_T_API_ID),\n apiHash: process.env.TELEGRAM_T_API_HASH,\n exceptIds: [],\n }));\n\n if (result2 instanceof Api.auth.LoginTokenSuccess && result2.authorization instanceof Api.auth.Authorization) {\n return result2.authorization.user;\n } else if (result2 instanceof Api.auth.LoginTokenMigrateTo) {\n await client._switchDC(result2.dcId);\n const migratedResult = await client.invoke(new Api.auth.ImportLoginToken({\n token: result2.token,\n }));\n\n if (migratedResult instanceof Api.auth.LoginTokenSuccess\n && migratedResult.authorization instanceof Api.auth.Authorization) {\n return migratedResult.authorization.user;\n }\n }\n } catch (err) {\n if (err.message === 'SESSION_PASSWORD_NEEDED') {\n return signInWithPassword(client, apiCredentials, authParams);\n }\n\n throw err;\n }\n\n // This is a workaround for TypeScript (never actually reached)\n // eslint-disable-next-line no-throw-literal\n throw undefined;\n}\n\nasync function sendCode(\n client: TelegramClient, apiCredentials: ApiCredentials, phoneNumber: string, forceSMS = false,\n): Promise<{\n phoneCodeHash: string;\n isCodeViaApp: boolean;\n }> {\n try {\n const { apiId, apiHash } = apiCredentials;\n const sendResult = await client.invoke(new Api.auth.SendCode({\n phoneNumber,\n apiId,\n apiHash,\n settings: new Api.CodeSettings(),\n }));\n\n // If we already sent a SMS, do not resend the phoneCode (hash may be empty)\n if (!forceSMS || (sendResult.type instanceof Api.auth.SentCodeTypeSms)) {\n return {\n phoneCodeHash: sendResult.phoneCodeHash,\n isCodeViaApp: sendResult.type instanceof Api.auth.SentCodeTypeApp,\n };\n }\n\n const resendResult = await client.invoke(new Api.auth.ResendCode({\n phoneNumber,\n phoneCodeHash: sendResult.phoneCodeHash,\n }));\n\n return {\n phoneCodeHash: resendResult.phoneCodeHash,\n isCodeViaApp: resendResult.type instanceof Api.auth.SentCodeTypeApp,\n };\n } catch (err) {\n if (err.message === 'AUTH_RESTART') {\n return sendCode(client, apiCredentials, phoneNumber, forceSMS);\n } else {\n throw err;\n }\n }\n}\n\nasync function signInWithPassword(\n client: TelegramClient, apiCredentials: ApiCredentials, authParams: UserAuthParams,\n): Promise {\n // eslint-disable-next-line no-constant-condition\n while (1) {\n try {\n const passwordSrpResult = await client.invoke(new Api.account.GetPassword());\n const password = await authParams.password(passwordSrpResult.hint);\n if (!password) {\n throw new Error('Password is empty');\n }\n\n const passwordSrpCheck = await computePasswordSrpCheck(passwordSrpResult, password);\n const { user } = await client.invoke(new Api.auth.CheckPassword({\n password: passwordSrpCheck,\n })) as Api.auth.Authorization;\n\n return user;\n } catch (err) {\n authParams.onError(err);\n }\n }\n\n // eslint-disable-next-line no-unreachable\n return undefined!; // Never reached (TypeScript fix)\n}\n\nasync function signInBot(client: TelegramClient, apiCredentials: ApiCredentials, authParams: BotAuthParams) {\n const { apiId, apiHash } = apiCredentials;\n const { botAuthToken } = authParams;\n\n const { user } = await client.invoke(new Api.auth.ImportBotAuthorization({\n apiId,\n apiHash,\n botAuthToken,\n })) as Api.auth.Authorization;\n\n return user;\n}\n","// eslint-disable-next-line import/no-named-default\nimport { default as Api } from '../tl/api';\nimport TelegramClient from './TelegramClient';\nimport { getAppropriatedPartSize } from '../Utils';\nimport { sleep, createDeferred } from '../Helpers';\nimport errors from '../errors';\n\nexport interface progressCallback {\n isCanceled?: boolean;\n acceptsBuffer?: boolean;\n\n (\n progress: number, // Float between 0 and 1.\n ...args: any[]\n ): void;\n}\n\nexport interface DownloadFileParams {\n dcId: number;\n fileSize: number;\n workers?: number;\n partSizeKb?: number;\n start?: number;\n end?: number;\n progressCallback?: progressCallback;\n}\n\ninterface Deferred {\n promise: Promise;\n resolve: (value?: any) => void;\n}\n\n// Chunk sizes for `upload.getFile` must be multiple of the smallest size\nconst MIN_CHUNK_SIZE = 4096;\nconst DEFAULT_CHUNK_SIZE = 64; // kb\nconst ONE_MB = 1024 * 1024;\nconst DISCONNECT_SLEEP = 1000;\n\n\nclass Foreman {\n private deferred: Deferred | undefined;\n\n private activeWorkers = 0;\n\n constructor(private maxWorkers: number) {\n }\n\n requestWorker() {\n this.activeWorkers++;\n\n if (this.activeWorkers > this.maxWorkers) {\n this.deferred = createDeferred();\n return this.deferred!.promise;\n }\n\n return Promise.resolve();\n }\n\n releaseWorker() {\n this.activeWorkers--;\n\n if (this.deferred && (this.activeWorkers <= this.maxWorkers)) {\n this.deferred.resolve();\n }\n }\n}\n\nexport async function downloadFile(\n client: TelegramClient,\n inputLocation: Api.InputFileLocation,\n fileParams: DownloadFileParams,\n) {\n let {\n partSizeKb, end,\n } = fileParams;\n const {\n fileSize, workers = 1,\n } = fileParams;\n const { dcId, progressCallback, start = 0 } = fileParams;\n\n end = end && end < fileSize ? end : fileSize - 1;\n\n if (!partSizeKb) {\n partSizeKb = fileSize ? getAppropriatedPartSize(fileSize) : DEFAULT_CHUNK_SIZE;\n }\n\n const partSize = partSizeKb * 1024;\n const partsCount = end ? Math.ceil((end - start) / partSize) : 1;\n\n if (partSize % MIN_CHUNK_SIZE !== 0) {\n throw new Error(`The part size must be evenly divisible by ${MIN_CHUNK_SIZE}`);\n }\n\n client._log.info(`Downloading file in chunks of ${partSize} bytes`);\n\n const foreman = new Foreman(workers);\n const promises: Promise[] = [];\n let offset = start;\n // Used for files with unknown size and for manual cancellations\n let hasEnded = false;\n\n let progress = 0;\n if (progressCallback) {\n progressCallback(progress);\n }\n\n // Preload sender\n await client.getSender(dcId);\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let limit = partSize;\n let isPrecise = false;\n\n if (Math.floor(offset / ONE_MB) !== Math.floor((offset + limit - 1) / ONE_MB)) {\n limit = ONE_MB - (offset % ONE_MB);\n isPrecise = true;\n }\n\n await foreman.requestWorker();\n\n if (hasEnded) {\n foreman.releaseWorker();\n break;\n }\n\n // eslint-disable-next-line no-loop-func\n promises.push((async (offsetMemo: number) => {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let sender;\n try {\n sender = await client.getSender(dcId);\n const result = await sender.send(new Api.upload.GetFile({\n location: inputLocation,\n offset: offsetMemo,\n limit,\n precise: isPrecise || undefined,\n }));\n\n if (progressCallback) {\n if (progressCallback.isCanceled) {\n throw new Error('USER_CANCELED');\n }\n\n progress += (1 / partsCount);\n progressCallback(progress);\n }\n\n if (!end && (result.bytes.length < limit)) {\n hasEnded = true;\n }\n\n foreman.releaseWorker();\n\n return result.bytes;\n } catch (err) {\n if (sender && !sender.isConnected()) {\n await sleep(DISCONNECT_SLEEP);\n continue;\n } else if (err instanceof errors.FloodWaitError) {\n await sleep(err.seconds * 1000);\n continue;\n }\n\n foreman.releaseWorker();\n\n hasEnded = true;\n throw err;\n }\n }\n })(offset));\n\n offset += limit;\n\n if (end && (offset > end)) {\n break;\n }\n }\n const results = await Promise.all(promises);\n const buffers = results.filter(Boolean);\n const totalLength = end ? (end + 1) - start : undefined;\n return Buffer.concat(buffers, totalLength);\n}\n","// eslint-disable-next-line import/no-named-default\nimport { default as Api } from '../tl/api';\n\nimport TelegramClient from './TelegramClient';\nimport { generateRandomBytes, readBigIntFromBuffer, sleep } from '../Helpers';\nimport { getAppropriatedPartSize } from '../Utils';\nimport errors from '../errors';\n\ninterface OnProgress {\n isCanceled?: boolean;\n\n // Float between 0 and 1.\n (progress: number): void;\n}\n\nexport interface UploadFileParams {\n file: File;\n workers: number;\n onProgress?: OnProgress;\n}\n\nconst KB_TO_BYTES = 1024;\nconst LARGE_FILE_THRESHOLD = 10 * 1024 * 1024;\nconst DISCONNECT_SLEEP = 1000;\n\nexport async function uploadFile(\n client: TelegramClient,\n fileParams: UploadFileParams,\n): Promise {\n const { file, onProgress } = fileParams;\n let { workers } = fileParams;\n\n const { name, size } = file;\n const fileId = readBigIntFromBuffer(generateRandomBytes(8), true, true);\n const isLarge = size > LARGE_FILE_THRESHOLD;\n\n const partSize = getAppropriatedPartSize(size) * KB_TO_BYTES;\n const partCount = Math.floor((size + partSize - 1) / partSize);\n const buffer = Buffer.from(await fileToBuffer(file));\n\n // Make sure a new sender can be created before starting upload\n await client.getSender(client.session.dcId);\n\n if (!workers || !size) {\n workers = 1;\n }\n if (workers >= partCount) {\n workers = partCount;\n }\n\n let progress = 0;\n if (onProgress) {\n onProgress(progress);\n }\n\n for (let i = 0; i < partCount; i += workers) {\n const sendingParts = [];\n let end = i + workers;\n if (end > partCount) {\n end = partCount;\n }\n\n for (let j = i; j < end; j++) {\n const bytes = buffer.slice(j * partSize, (j + 1) * partSize);\n\n // eslint-disable-next-line no-loop-func\n sendingParts.push((async (jMemo: number, bytesMemo: Buffer) => {\n while (true) {\n let sender;\n try {\n // We always upload from the DC we are in\n sender = await client.getSender(client.session.dcId);\n await sender.send(\n isLarge\n ? new Api.upload.SaveBigFilePart({\n fileId,\n filePart: jMemo,\n fileTotalParts: partCount,\n bytes: bytesMemo,\n })\n : new Api.upload.SaveFilePart({\n fileId,\n filePart: jMemo,\n bytes: bytesMemo,\n }),\n );\n } catch (err) {\n if (sender && !sender.isConnected()) {\n await sleep(DISCONNECT_SLEEP);\n continue;\n } else if (err instanceof errors.FloodWaitError) {\n await sleep(err.seconds * 1000);\n continue;\n }\n throw err;\n }\n\n if (onProgress) {\n if (onProgress.isCanceled) {\n throw new Error('USER_CANCELED');\n }\n\n progress += (1 / partCount);\n onProgress(progress);\n }\n break;\n }\n })(j, bytes));\n }\n\n await Promise.all(sendingParts);\n }\n\n return isLarge\n ? new Api.InputFileBig({\n id: fileId,\n parts: partCount,\n name,\n })\n : new Api.InputFile({\n id: fileId,\n parts: partCount,\n name,\n md5Checksum: '', // This is not a \"flag\", so not sure if we can make it optional.\n });\n}\n\nfunction fileToBuffer(file: File) {\n return new Response(file).arrayBuffer();\n}\n","import TelegramClient from './TelegramClient';\n// eslint-disable-next-line import/no-named-default\nimport { default as Api } from '../tl/api';\nimport { generateRandomBytes } from '../Helpers';\nimport { computeCheck, computeDigest } from '../Password';\nimport errors from '../errors';\n\nexport interface TwoFaParams {\n isCheckPassword?: boolean;\n currentPassword?: string;\n newPassword?: string;\n hint?: string;\n email?: string;\n emailCodeCallback?: (length: number) => Promise;\n onEmailCodeError?: (err: Error) => void;\n}\n\n/**\n * Changes the 2FA settings of the logged in user.\n Note that this method may be *incredibly* slow depending on the\n prime numbers that must be used during the process to make sure\n that everything is safe.\n\n Has no effect if both current and new password are omitted.\n\n * @param client: The telegram client instance\n * @param isCheckPassword: Must be ``true`` if you want to check the current password\n * @param currentPassword: The current password, to authorize changing to ``new_password``.\n Must be set if changing existing 2FA settings.\n Must **not** be set if 2FA is currently disabled.\n Passing this by itself will remove 2FA (if correct).\n * @param newPassword: The password to set as 2FA.\n If 2FA was already enabled, ``currentPassword`` **must** be set.\n Leaving this blank or `undefined` will remove the password.\n * @param hint: Hint to be displayed by Telegram when it asks for 2FA.\n Must be set when changing or creating a new password.\n Has no effect if ``newPassword`` is not set.\n * @param email: Recovery and verification email. If present, you must also\n set `emailCodeCallback`, else it raises an Error.\n * @param emailCodeCallback: If an email is provided, a callback that returns the code sent\n to it must also be set. This callback may be asynchronous.\n It should return a string with the code. The length of the\n code will be passed to the callback as an input parameter.\n\n If the callback returns an invalid code, it will raise an rpc error with the message\n ``CODE_INVALID``\n\n * @returns Promise\n * @throws this method can throw:\n \"PASSWORD_HASH_INVALID\" if you entered a wrong password (or set it to undefined).\n \"EMAIL_INVALID\" if the entered email is wrong\n \"EMAIL_HASH_EXPIRED\" if the user took too long to verify their email\n */\nexport async function updateTwoFaSettings(\n client: TelegramClient,\n {\n isCheckPassword,\n currentPassword,\n newPassword,\n hint = '',\n email,\n emailCodeCallback,\n onEmailCodeError,\n }: TwoFaParams,\n) {\n if (!newPassword && !currentPassword) {\n throw new Error('Neither `currentPassword` nor `newPassword` is present');\n }\n\n if (email && !(emailCodeCallback && onEmailCodeError)) {\n throw new Error('`email` present without `emailCodeCallback` and `onEmailCodeError`');\n }\n\n const pwd = await client.invoke(new Api.account.GetPassword());\n\n if (!(pwd.newAlgo instanceof Api.PasswordKdfAlgoUnknown)) {\n pwd.newAlgo.salt1 = Buffer.concat([pwd.newAlgo.salt1, generateRandomBytes(32)]);\n }\n if (!pwd.hasPassword && currentPassword) {\n currentPassword = undefined;\n }\n\n const password = currentPassword ? await computeCheck(pwd, currentPassword!) : new Api.InputCheckPasswordEmpty();\n\n if (isCheckPassword) {\n await client.invoke(new Api.auth.CheckPassword({ password }));\n return;\n }\n\n try {\n await client.invoke(new Api.account.UpdatePasswordSettings({\n password,\n newSettings: new Api.account.PasswordInputSettings({\n newAlgo: pwd.newAlgo,\n newPasswordHash: newPassword ? await computeDigest(pwd.newAlgo, newPassword) : Buffer.alloc(0),\n hint,\n email,\n // not explained what it does and it seems to always be set to empty in tdesktop\n newSecureSettings: undefined,\n }),\n }));\n } catch (e) {\n if (e instanceof errors.EmailUnconfirmedError) {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n const code = await emailCodeCallback!(e.codeLength);\n\n if (!code) {\n throw new Error('Code is empty');\n }\n\n await client.invoke(new Api.account.ConfirmPasswordEmail({ code }));\n break;\n } catch (err) {\n onEmailCodeError!(err);\n }\n }\n } else {\n throw e;\n }\n }\n}\n","module.exports = '0.0.2';\n","const NewMessage = require('./NewMessage');\nconst Raw = require('./Raw');\n\nclass StopPropagation extends Error {\n\n}\n\nmodule.exports = {\n NewMessage,\n StopPropagation,\n Raw,\n};\n","const { EventBuilder } = require('./common');\n\nclass Raw extends EventBuilder {\n constructor(args = {\n types: undefined,\n func: undefined,\n }) {\n super();\n if (!args.types) {\n this.types = true;\n } else {\n this.types = args.types;\n }\n }\n\n build(update) {\n return update;\n }\n}\n\nmodule.exports = Raw;\n","class EventBuilder {\n constructor(args = {\n chats: undefined,\n blacklistChats: undefined,\n func: undefined,\n }) {\n this.chats = args.chats;\n this.blacklistChats = Boolean(args.blacklistChats);\n this.resolved = false;\n this.func = args.func;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n build(update) {\n\n }\n}\n\n\nmodule.exports = {\n EventBuilder,\n};\n","const Memory = require('./Memory');\nconst StringSession = require('./StringSession');\nconst CacheApiSession = require('./CacheApiSession');\nconst LocalStorageSession = require('./LocalStorageSession');\nconst IdbSession = require('./IdbSession');\nconst CallbackSession = require('./CallbackSession');\n\nmodule.exports = {\n Memory,\n StringSession,\n CacheApiSession,\n LocalStorageSession,\n IdbSession,\n CallbackSession,\n};\n","const MemorySession = require('./Memory');\nconst AuthKey = require('../crypto/AuthKey');\nconst BinaryReader = require('../extensions/BinaryReader');\n\nconst CURRENT_VERSION = '1';\n\n\nclass StringSession extends MemorySession {\n /**\n * This session file can be easily saved and loaded as a string. According\n * to the initial design, it contains only the data that is necessary for\n * successful connection and authentication, so takeout ID is not stored.\n\n * It is thought to be used where you don't want to create any on-disk\n * files but would still like to be able to save and load existing sessions\n * by other means.\n\n * You can use custom `encode` and `decode` functions, if present:\n\n * `encode` definition must be ``function encode(value: Buffer) -> string:``.\n * `decode` definition must be ``function decode(value: string) -> Buffer:``.\n * @param session {string|null}\n */\n constructor(session = undefined) {\n super();\n if (session) {\n if (session[0] !== CURRENT_VERSION) {\n throw new Error('Not a valid string');\n }\n session = session.slice(1);\n const r = StringSession.decode(session);\n const reader = new BinaryReader(r);\n this._dcId = reader.read(1)\n .readUInt8(0);\n const serverAddressLen = reader.read(2)\n .readInt16BE(0);\n this._serverAddress = String(reader.read(serverAddressLen));\n this._port = reader.read(2)\n .readInt16BE(0);\n this._key = reader.read(-1);\n }\n }\n\n /**\n * @param x {Buffer}\n * @returns {string}\n */\n static encode(x) {\n return x.toString('base64');\n }\n\n /**\n * @param x {string}\n * @returns {Buffer}\n */\n static decode(x) {\n return Buffer.from(x, 'base64');\n }\n\n async load() {\n if (this._key) {\n this._authKey = new AuthKey();\n await this._authKey.setKey(this._key);\n }\n }\n\n save() {\n if (!this.authKey) {\n return '';\n }\n const dcBuffer = Buffer.from([this.dcId]);\n const addressBuffer = Buffer.from(this.serverAddress);\n const addressLengthBuffer = Buffer.alloc(2);\n addressLengthBuffer.writeInt16BE(addressBuffer.length, 0);\n const portBuffer = Buffer.alloc(2);\n portBuffer.writeInt16BE(this.port, 0);\n\n return CURRENT_VERSION + StringSession.encode(Buffer.concat([\n dcBuffer,\n addressLengthBuffer,\n addressBuffer,\n portBuffer,\n this.authKey.getKey(),\n ]));\n }\n\n getAuthKey(dcId) {\n if (dcId && dcId !== this.dcId) {\n // Not supported.\n return undefined;\n }\n\n return this.authKey;\n }\n\n setAuthKey(authKey, dcId) {\n if (dcId && dcId !== this.dcId) {\n // Not supported.\n return;\n }\n\n this.authKey = authKey;\n }\n}\n\nmodule.exports = StringSession;\n","/* eslint-disable no-restricted-globals */\nconst StorageSession = require('./StorageSession');\n\nconst CACHE_NAME = 'GramJs';\n\nclass CacheApiSession extends StorageSession {\n async _delete() {\n const request = new Request(this._storageKey);\n const cache = await self.caches.open(CACHE_NAME);\n return cache.delete(request);\n }\n\n async _fetchFromCache() {\n const request = new Request(this._storageKey);\n const cache = await self.caches.open(CACHE_NAME);\n const cached = await cache.match(request);\n return cached ? cached.text() : undefined;\n }\n\n async _saveToCache(data) {\n const request = new Request(this._storageKey);\n const response = new Response(data);\n const cache = await self.caches.open(CACHE_NAME);\n return cache.put(request, response);\n }\n}\n\nmodule.exports = CacheApiSession;\n","const StorageSession = require('./StorageSession');\n\nclass LocalStorageSession extends StorageSession {\n _delete() {\n return localStorage.removeItem(this._storageKey);\n }\n\n _fetchFromCache() {\n return localStorage.getItem(this._storageKey);\n }\n\n _saveToCache(data) {\n return localStorage.setItem(this._storageKey, data);\n }\n}\n\nmodule.exports = LocalStorageSession;\n","const idb = require('idb-keyval');\nconst StorageSession = require('./StorageSession');\n\nconst CACHE_NAME = 'GramJs';\n\nclass IdbSession extends StorageSession {\n _delete() {\n return idb.del(`${CACHE_NAME}:${this._storageKey}`);\n }\n\n _fetchFromCache() {\n return idb.get(`${CACHE_NAME}:${this._storageKey}`);\n }\n\n _saveToCache(data) {\n return idb.set(`${CACHE_NAME}:${this._storageKey}`, data);\n }\n}\n\nmodule.exports = IdbSession;\n","function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(customStore, callback) {\n return customStore('readonly', (store) => {\n // This would be store.getAllKeys(), but it isn't supported by Edge or Safari.\n // And openKeyCursor isn't supported by Safari.\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push(cursor.key)).then(() => items);\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push(cursor.value)).then(() => items);\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push([cursor.key, cursor.value])).then(() => items);\n}\n\nexport { clear, createStore, del, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","const MemorySession = require('./Memory');\nconst AuthKey = require('../crypto/AuthKey');\nconst utils = require('../Utils');\n\nclass CallbackSession extends MemorySession {\n constructor(sessionData, callback) {\n super();\n\n this._sessionData = sessionData;\n this._callback = callback;\n\n this._authKeys = {};\n }\n\n get authKey() {\n throw new Error('Not supported');\n }\n\n set authKey(value) {\n throw new Error('Not supported');\n }\n\n async load() {\n if (!this._sessionData) {\n return;\n }\n\n const {\n mainDcId,\n keys,\n hashes,\n } = this._sessionData;\n const {\n ipAddress,\n port,\n } = utils.getDC(mainDcId);\n\n this.setDC(mainDcId, ipAddress, port, true);\n\n await Promise.all(Object.keys(keys)\n .map(async (dcId) => {\n const key = typeof keys[dcId] === 'string'\n ? Buffer.from(keys[dcId], 'hex')\n : Buffer.from(keys[dcId]);\n\n if (hashes[dcId]) {\n const hash = typeof hashes[dcId] === 'string'\n ? Buffer.from(hashes[dcId], 'hex')\n : Buffer.from(hashes[dcId]);\n\n this._authKeys[dcId] = new AuthKey(key, hash);\n } else {\n this._authKeys[dcId] = new AuthKey();\n await this._authKeys[dcId].setKey(key, true);\n }\n }));\n }\n\n setDC(dcId, serverAddress, port, skipOnUpdate = false) {\n this._dcId = dcId;\n this._serverAddress = serverAddress;\n this._port = port;\n\n delete this._authKeys[dcId];\n\n if (!skipOnUpdate) {\n void this._onUpdate();\n }\n }\n\n getAuthKey(dcId = this._dcId) {\n return this._authKeys[dcId];\n }\n\n setAuthKey(authKey, dcId = this._dcId) {\n this._authKeys[dcId] = authKey;\n\n void this._onUpdate();\n }\n\n getSessionData() {\n const sessionData = {\n mainDcId: this._dcId,\n keys: {},\n hashes: {},\n };\n\n Object\n .keys(this._authKeys)\n .forEach((dcId) => {\n const authKey = this._authKeys[dcId];\n if (!authKey || !authKey._key) return;\n\n sessionData.keys[dcId] = authKey._key.toString('hex');\n sessionData.hashes[dcId] = authKey._hash.toString('hex');\n });\n\n return sessionData;\n }\n\n _onUpdate() {\n this._callback(this.getSessionData());\n }\n\n delete() {\n this._callback(undefined);\n }\n}\n\nmodule.exports = CallbackSession;\n","import BigInt from 'big-integer';\nimport { Api as GramJs } from '../../../lib/gramjs';\nimport {\n OnApiUpdate, ApiUser, ApiChat, ApiPhoto,\n} from '../../types';\n\nimport { PROFILE_PHOTOS_LIMIT } from '../../../config';\nimport { invokeRequest } from './client';\nimport { searchMessagesLocal } from './messages';\nimport {\n buildInputEntity,\n calculateResultHash,\n buildInputPeer,\n buildInputContact,\n} from '../gramjsBuilders';\nimport { buildApiUser, buildApiUserFromFull } from '../apiBuilders/users';\nimport { buildApiChatFromPreview } from '../apiBuilders/chats';\nimport { buildApiPhoto } from '../apiBuilders/common';\nimport localDb from '../localDb';\nimport { addPhotoToLocalDb } from '../helpers';\n\nlet onUpdate: OnApiUpdate;\n\nexport function init(_onUpdate: OnApiUpdate) {\n onUpdate = _onUpdate;\n}\n\nexport async function fetchFullUser({\n id,\n accessHash,\n}: {\n id: number;\n accessHash?: string;\n}) {\n const input = buildInputEntity(id, accessHash);\n if (!(input instanceof GramJs.InputUser)) {\n return;\n }\n\n const fullInfo = await invokeRequest(new GramJs.users.GetFullUser({ id: input }));\n\n if (!fullInfo) {\n return;\n }\n\n const userWithFullInfo = buildApiUserFromFull(fullInfo);\n\n onUpdate({\n '@type': 'updateUser',\n id,\n user: {\n fullInfo: userWithFullInfo.fullInfo,\n },\n });\n}\n\nexport async function fetchNearestCountry() {\n const dcInfo = await invokeRequest(new GramJs.help.GetNearestDc());\n\n return dcInfo ? dcInfo.country : undefined;\n}\n\nexport async function fetchTopUsers({ hash = 0 }: { hash?: number }) {\n const topPeers = await invokeRequest(new GramJs.contacts.GetTopPeers({\n hash,\n correspondents: true,\n }));\n if (!(topPeers instanceof GramJs.contacts.TopPeers)) {\n return undefined;\n }\n\n const users = topPeers.users.map(buildApiUser).filter((user) => !!user && !user.isSelf) as ApiUser[];\n const ids = users.map(({ id }) => id);\n\n return {\n hash: calculateResultHash(ids),\n ids,\n users,\n };\n}\n\nexport async function fetchContactList({ hash = 0 }: { hash?: number }) {\n const result = await invokeRequest(new GramJs.contacts.GetContacts({ hash }));\n if (!result || result instanceof GramJs.contacts.ContactsNotModified) {\n return undefined;\n }\n\n result.users.forEach((user) => {\n if (user instanceof GramJs.User) {\n localDb.users[user.id] = user;\n }\n });\n\n return {\n hash: calculateResultHash([\n result.savedCount,\n ...result.contacts.map(({ userId }) => userId),\n ]),\n users: result.users.map(buildApiUser).filter(Boolean as any),\n chats: result.users.map((user) => buildApiChatFromPreview(user)).filter(Boolean as any),\n };\n}\n\nexport async function fetchUsers({ users }: { users: ApiUser[] }) {\n const result = await invokeRequest(new GramJs.users.GetUsers({\n id: users.map(({ id, accessHash }) => buildInputPeer(id, accessHash)),\n }));\n if (!result || !result.length) {\n return undefined;\n }\n\n result.forEach((user) => {\n if (user instanceof GramJs.User) {\n localDb.users[user.id] = user;\n }\n });\n\n return result.map(buildApiUser).filter(Boolean as any);\n}\n\nexport function updateContact({\n phone,\n firstName,\n lastName,\n}: {\n phone?: string;\n firstName?: string;\n lastName?: string;\n}) {\n return invokeRequest(new GramJs.contacts.ImportContacts({\n contacts: [buildInputContact({\n phone: phone || '',\n firstName: firstName || '',\n lastName: lastName || '',\n })],\n }));\n}\n\nexport async function deleteUser({\n id,\n accessHash,\n}: {\n id: number;\n accessHash?: string;\n}) {\n const input = buildInputEntity(id, accessHash);\n if (!(input instanceof GramJs.InputUser)) {\n return;\n }\n\n const result = await invokeRequest(new GramJs.contacts.DeleteContacts({ id: [input] }));\n\n if (!result) {\n return;\n }\n\n onUpdate({\n '@type': 'deleteUser',\n id,\n });\n}\n\nexport async function fetchProfilePhotos(user?: ApiUser, chat?: ApiChat) {\n if (user) {\n const { id, accessHash } = user;\n\n const result = await invokeRequest(new GramJs.photos.GetUserPhotos({\n userId: buildInputEntity(id, accessHash) as GramJs.InputUser,\n limit: PROFILE_PHOTOS_LIMIT,\n offset: 0,\n maxId: BigInt('0'),\n }));\n\n if (!result) {\n return undefined;\n }\n\n updateLocalDb(result);\n\n return {\n photos: result.photos\n .filter((photo): photo is GramJs.Photo => photo instanceof GramJs.Photo)\n .map(buildApiPhoto),\n };\n }\n\n const result = await searchMessagesLocal({\n chatOrUser: chat!,\n type: 'profilePhoto',\n limit: PROFILE_PHOTOS_LIMIT,\n });\n\n if (!result) {\n return undefined;\n }\n\n const { messages, users } = result;\n\n return {\n photos: messages.map((message) => message.content.action!.photo).filter(Boolean as any),\n users,\n };\n}\n\nfunction updateLocalDb(result: (GramJs.photos.Photos | GramJs.photos.PhotosSlice)) {\n result.photos.forEach(addPhotoToLocalDb);\n}\n","import { Api as GramJs } from '../../../lib/gramjs';\nimport { ApiSticker, ApiVideo, OnApiUpdate } from '../../types';\n\nimport { invokeRequest } from './client';\nimport { buildStickerFromDocument, buildStickerSet, buildStickerSetCovered } from '../apiBuilders/symbols';\nimport { buildInputStickerSet, buildInputDocument } from '../gramjsBuilders';\nimport { buildVideoFromDocument } from '../apiBuilders/messages';\nimport { RECENT_STICKERS_LIMIT } from '../../../config';\n\nimport localDb from '../localDb';\n\nlet onUpdate: OnApiUpdate;\n\nexport function init(_onUpdate: OnApiUpdate) {\n onUpdate = _onUpdate;\n}\n\nexport async function fetchStickerSets({ hash }: { hash: number }) {\n const allStickers = await invokeRequest(new GramJs.messages.GetAllStickers({ hash }));\n\n if (!allStickers || allStickers instanceof GramJs.messages.AllStickersNotModified) {\n return undefined;\n }\n\n allStickers.sets.forEach((stickerSet) => {\n if (stickerSet.thumbs && stickerSet.thumbs.length) {\n localDb.stickerSets[String(stickerSet.id)] = stickerSet;\n }\n });\n\n return {\n hash: allStickers.hash,\n sets: allStickers.sets.map(buildStickerSet),\n };\n}\n\nexport async function fetchRecentStickers({ hash }: { hash: number }) {\n const result = await invokeRequest(new GramJs.messages.GetRecentStickers({ hash }));\n\n if (!result || result instanceof GramJs.messages.RecentStickersNotModified) {\n return undefined;\n }\n\n return {\n hash: result.hash,\n stickers: processStickerResult(result.stickers.slice(0, RECENT_STICKERS_LIMIT)),\n };\n}\n\nexport async function fetchFavoriteStickers({ hash }: { hash: number }) {\n const result = await invokeRequest(new GramJs.messages.GetFavedStickers({ hash }));\n\n if (!result || result instanceof GramJs.messages.FavedStickersNotModified) {\n return undefined;\n }\n\n return {\n hash: result.hash,\n stickers: processStickerResult(result.stickers),\n };\n}\n\nexport async function fetchFeaturedStickers({ hash }: { hash: number }) {\n const result = await invokeRequest(new GramJs.messages.GetFeaturedStickers({ hash }));\n\n if (!result || result instanceof GramJs.messages.FeaturedStickersNotModified) {\n return undefined;\n }\n\n return {\n hash: result.hash,\n sets: result.sets.map(buildStickerSetCovered),\n };\n}\n\nexport async function faveSticker({\n sticker,\n unfave,\n}: {\n sticker: ApiSticker;\n unfave?: boolean;\n}) {\n const request = new GramJs.messages.FaveSticker({\n id: buildInputDocument(sticker),\n unfave,\n });\n\n const result = await invokeRequest(request);\n if (result) {\n onUpdate({\n '@type': 'updateFavoriteStickers',\n });\n }\n}\n\nexport async function fetchStickers({ stickerSetId, accessHash }: { stickerSetId: string; accessHash: string }) {\n const result = await invokeRequest(new GramJs.messages.GetStickerSet({\n stickerset: buildInputStickerSet(stickerSetId, accessHash),\n }));\n\n if (!result) {\n return undefined;\n }\n\n return {\n set: buildStickerSet(result.set),\n stickers: processStickerResult(result.documents),\n packs: processStickerPackResult(result.packs),\n };\n}\n\nexport async function fetchAnimatedEmojis() {\n const result = await invokeRequest(new GramJs.messages.GetStickerSet({\n stickerset: new GramJs.InputStickerSetAnimatedEmoji(),\n }));\n\n if (!result) {\n return undefined;\n }\n\n return {\n set: buildStickerSet(result.set),\n stickers: processStickerResult(result.documents),\n };\n}\n\nexport async function searchStickers({ query, hash }: { query: string; hash: number }) {\n const result = await invokeRequest(new GramJs.messages.SearchStickerSets({\n q: query,\n hash,\n }));\n\n if (!result || result instanceof GramJs.messages.FoundStickerSetsNotModified) {\n return undefined;\n }\n\n return {\n hash: result.hash,\n sets: result.sets.map(buildStickerSetCovered),\n };\n}\n\nexport async function fetchSavedGifs({ hash }: { hash: number }) {\n const result = await invokeRequest(new GramJs.messages.GetSavedGifs({ hash }));\n\n if (!result || result instanceof GramJs.messages.SavedGifsNotModified) {\n return undefined;\n }\n\n return {\n hash: result.hash,\n gifs: processGifResult(result.gifs),\n };\n}\n\nexport async function installStickerSet({ stickerSetId, accessHash }: { stickerSetId: string; accessHash: string }) {\n const result = await invokeRequest(new GramJs.messages.InstallStickerSet({\n stickerset: buildInputStickerSet(stickerSetId, accessHash),\n }));\n\n if (result) {\n onUpdate({\n '@type': 'updateStickerSet',\n id: stickerSetId,\n stickerSet: { installedDate: Date.now() },\n });\n }\n}\n\nexport async function uninstallStickerSet({ stickerSetId, accessHash }: { stickerSetId: string; accessHash: string }) {\n const result = await invokeRequest(new GramJs.messages.UninstallStickerSet({\n stickerset: buildInputStickerSet(stickerSetId, accessHash),\n }));\n\n if (result) {\n onUpdate({\n '@type': 'updateStickerSet',\n id: stickerSetId,\n stickerSet: { installedDate: undefined },\n });\n }\n}\n\nlet inputGifBot: GramJs.InputUser | undefined;\n\nexport async function searchGifs({ query, offset = '' }: { query: string; offset?: string }) {\n if (!inputGifBot) {\n const config = await invokeRequest(new GramJs.help.GetConfig());\n if (!config) {\n return undefined;\n }\n\n const resolvedPeer = await invokeRequest(new GramJs.contacts.ResolveUsername({\n username: config.gifSearchUsername,\n }));\n if (!resolvedPeer || !(resolvedPeer.users[0] instanceof GramJs.User)) {\n return undefined;\n }\n\n inputGifBot = new GramJs.InputUser({\n userId: (resolvedPeer.peer as GramJs.PeerUser).userId,\n accessHash: resolvedPeer.users[0].accessHash!,\n });\n }\n\n const result = await invokeRequest(new GramJs.messages.GetInlineBotResults({\n bot: inputGifBot,\n peer: new GramJs.InputPeerEmpty(),\n query,\n offset,\n }));\n if (!result) {\n return undefined;\n }\n\n const documents = result.results\n .map((foundGif) => {\n if (foundGif instanceof GramJs.BotInlineMediaResult) {\n return foundGif.document;\n }\n\n return undefined;\n })\n .filter(Boolean as any);\n\n return {\n nextOffset: result.nextOffset,\n gifs: processGifResult(documents),\n };\n}\n\nexport async function fetchStickersForEmoji({\n emoji, hash = 0,\n}: { emoji: string; hash?: number }) {\n const result = await invokeRequest(new GramJs.messages.GetStickers({\n emoticon: emoji,\n hash,\n }));\n\n if (!result || result instanceof GramJs.messages.StickersNotModified) {\n return undefined;\n }\n\n return {\n stickers: processStickerResult(result.stickers),\n hash: result.hash,\n };\n}\n\nexport async function fetchEmojiKeywords({ language, fromVersion }: {\n language: string;\n fromVersion?: number;\n}) {\n const result = await invokeRequest(new GramJs.messages.GetEmojiKeywordsDifference({\n langCode: language,\n fromVersion,\n }));\n\n if (!result) {\n return undefined;\n }\n\n return {\n language: result.langCode,\n version: result.version,\n keywords: result.keywords.reduce((acc, emojiKeyword) => {\n acc[emojiKeyword.keyword] = emojiKeyword.emoticons;\n\n return acc;\n }, {} as Record),\n };\n}\n\nfunction processStickerResult(stickers: GramJs.TypeDocument[]) {\n return stickers\n .map((document) => {\n if (document instanceof GramJs.Document) {\n const sticker = buildStickerFromDocument(document);\n if (sticker) {\n localDb.documents[String(document.id)] = document;\n\n return sticker;\n }\n }\n\n return undefined;\n })\n .filter(Boolean as any);\n}\n\nfunction processStickerPackResult(packs: GramJs.StickerPack[]) {\n return packs.reduce((acc, { emoticon, documents }) => {\n acc[emoticon] = documents.map((documentId) => buildStickerFromDocument(\n localDb.documents[String(documentId)],\n )).filter(Boolean as any);\n return acc;\n }, {} as Record);\n}\n\nfunction processGifResult(gifs: GramJs.TypeDocument[]) {\n return gifs\n .map((document) => {\n if (document instanceof GramJs.Document) {\n const gif = buildVideoFromDocument(document);\n if (gif) {\n localDb.documents[String(document.id)] = document;\n\n return gif;\n }\n }\n\n return undefined;\n })\n .filter(Boolean as any);\n}\n","import { Api as GramJs } from '../../../lib/gramjs';\n\nimport { invokeRequest } from './client';\nimport { buildInputEntity, buildInputPeer } from '../gramjsBuilders';\nimport { ApiChat, OnApiUpdate } from '../../types';\n\nlet onUpdate: OnApiUpdate;\n\nexport function init(_onUpdate: OnApiUpdate) {\n onUpdate = _onUpdate;\n}\n\nexport async function checkChatUsername(\n { username }: { username: string },\n) {\n try {\n const result = await invokeRequest(new GramJs.channels.CheckUsername({\n channel: new GramJs.InputChannelEmpty(),\n username,\n }), undefined, true);\n\n return result!;\n } catch (err) {\n return false;\n }\n}\n\nexport async function setChatUsername(\n { chat, username }: { chat: ApiChat; username: string },\n) {\n const result = await invokeRequest(new GramJs.channels.UpdateUsername({\n channel: buildInputEntity(chat.id, chat.accessHash) as GramJs.InputChannel,\n username,\n }));\n\n if (result) {\n onUpdate({\n '@type': 'updateChat',\n id: chat.id,\n chat: { username },\n });\n }\n}\n\nexport async function updatePrivateLink(\n { chat }: { chat: ApiChat },\n) {\n const result = await invokeRequest(new GramJs.messages.ExportChatInvite({\n peer: buildInputPeer(chat.id, chat.accessHash),\n }));\n\n if (!result || !(result instanceof GramJs.ChatInviteExported)) {\n return;\n }\n\n onUpdate({\n '@type': 'updateChatFullInfo',\n id: chat.id,\n fullInfo: {\n inviteLink: result.link,\n },\n });\n}\n","import { Api as GramJs, errors } from '../../../lib/gramjs';\n\nimport { OnApiUpdate } from '../../types';\n\nimport { DEBUG } from '../../../config';\nimport { invokeRequest, updateTwoFaSettings } from './client';\n\nconst ApiErrors: { [k: string]: string } = {\n EMAIL_UNCONFIRMED: 'Email unconfirmed',\n EMAIL_HASH_EXPIRED: 'Email hash expired',\n NEW_SALT_INVALID: 'The new salt is invalid',\n NEW_SETTINGS_INVALID: 'The new password settings are invalid',\n CODE_INVALID: 'Invalid Code',\n PASSWORD_HASH_INVALID: 'Invalid Password',\n};\n\nconst emailCodeController: {\n resolve?: Function;\n reject?: Function;\n} = {};\n\nlet onUpdate: OnApiUpdate;\n\nexport function init(_onUpdate: OnApiUpdate) {\n onUpdate = _onUpdate;\n}\n\nexport async function getPasswordInfo() {\n const result = await invokeRequest(new GramJs.account.GetPassword());\n if (!result) {\n return undefined;\n }\n\n const { hint, hasPassword } = result;\n\n return { hint, hasPassword };\n}\n\nfunction onRequestEmailCode(length: number) {\n onUpdate({\n '@type': 'updateTwoFaStateWaitCode',\n length,\n });\n\n return new Promise((resolve, reject) => {\n emailCodeController.resolve = resolve;\n emailCodeController.reject = reject;\n });\n}\n\nexport async function checkPassword(currentPassword: string) {\n try {\n await updateTwoFaSettings({ isCheckPassword: true, currentPassword });\n\n return true;\n } catch (err) {\n onError(err);\n\n return false;\n }\n}\n\nexport async function clearPassword(currentPassword: string) {\n try {\n await updateTwoFaSettings({ currentPassword });\n\n return true;\n } catch (err) {\n onError(err);\n\n return false;\n }\n}\n\nexport async function updatePassword(currentPassword: string, password: string, hint?: string, email?: string) {\n try {\n await updateTwoFaSettings({\n currentPassword,\n newPassword: password,\n hint,\n email,\n emailCodeCallback: onRequestEmailCode,\n onEmailCodeError: onError,\n });\n\n return true;\n } catch (err) {\n onError(err);\n\n return false;\n }\n}\n\nexport async function updateRecoveryEmail(currentPassword: string, email: string) {\n try {\n await updateTwoFaSettings({\n currentPassword,\n newPassword: currentPassword,\n email,\n emailCodeCallback: onRequestEmailCode,\n onEmailCodeError: onError,\n });\n\n return true;\n } catch (err) {\n onError(err);\n\n return false;\n }\n}\n\nexport function provideRecoveryEmailCode(code: string) {\n emailCodeController.resolve!(code);\n}\n\nfunction onError(err: Error) {\n let message: string;\n\n if (err instanceof errors.FloodWaitError) {\n const hours = Math.ceil(Number(err.seconds) / 60 / 60);\n message = `Too many attempts. Try again in ${hours > 1 ? `${hours} hours` : 'an hour'}`;\n } else {\n message = ApiErrors[err.message];\n }\n\n if (!message) {\n message = 'Unexpected Error';\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n }\n\n onUpdate({\n '@type': 'updateTwoFaError',\n message,\n });\n}\n","import BigInt from 'big-integer';\nimport { Api as GramJs } from '../../../lib/gramjs';\n\nimport {\n ApiChat, ApiLangString, ApiLanguage, ApiNotifyException, ApiUser, ApiWallpaper,\n} from '../../types';\nimport { ApiPrivacyKey, IInputPrivacyRules } from '../../../types';\n\nimport { BLOCKED_LIST_LIMIT, DEFAULT_LANG_PACK, LANG_PACKS } from '../../../config';\nimport {\n buildApiWallpaper, buildApiSession, buildPrivacyRules, buildApiNotifyException,\n} from '../apiBuilders/misc';\n\nimport { buildApiUser } from '../apiBuilders/users';\nimport { buildApiChatFromPreview, getApiChatIdFromMtpPeer } from '../apiBuilders/chats';\nimport { buildInputPrivacyKey, buildInputPeer } from '../gramjsBuilders';\nimport { invokeRequest, uploadFile, getClient } from './client';\nimport { omitVirtualClassFields } from '../apiBuilders/helpers';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport localDb from '../localDb';\n\nconst MAX_INT_32 = 2 ** 31 - 1;\nconst BETA_LANG_CODES = ['ar', 'fa', 'id', 'ko', 'uz'];\n\nexport function updateProfile({\n firstName,\n lastName,\n about,\n}: {\n firstName?: string;\n lastName?: string;\n about?: string;\n}) {\n return invokeRequest(new GramJs.account.UpdateProfile({\n firstName: firstName || '',\n lastName: lastName || '',\n about: about || '',\n }));\n}\n\nexport function checkUsername(username: string) {\n return invokeRequest(new GramJs.account.CheckUsername({ username }));\n}\n\nexport function updateUsername(username: string) {\n return invokeRequest(new GramJs.account.UpdateUsername({ username }));\n}\n\nexport async function updateProfilePhoto(file: File) {\n const inputFile = await uploadFile(file);\n return invokeRequest(new GramJs.photos.UploadProfilePhoto({\n file: inputFile,\n }));\n}\n\nexport async function uploadProfilePhoto(file: File) {\n const inputFile = await uploadFile(file);\n await invokeRequest(new GramJs.photos.UploadProfilePhoto({\n file: inputFile,\n }));\n}\n\nexport async function fetchWallpapers(hash: number) {\n const result = await invokeRequest(new GramJs.account.GetWallPapers({ hash }));\n\n if (!result || result instanceof GramJs.account.WallPapersNotModified) {\n return undefined;\n }\n\n const filteredWallpapers = result.wallpapers.filter((wallpaper) => {\n if (\n !(wallpaper instanceof GramJs.WallPaper)\n || !(wallpaper.document instanceof GramJs.Document)\n ) {\n return false;\n }\n\n return !wallpaper.pattern && wallpaper.document.mimeType !== 'application/x-tgwallpattern';\n }) as GramJs.WallPaper[];\n\n filteredWallpapers.forEach((wallpaper) => {\n localDb.documents[String(wallpaper.document.id)] = wallpaper.document as GramJs.Document;\n });\n\n return {\n hash: result.hash,\n wallpapers: filteredWallpapers.map(buildApiWallpaper).filter(Boolean as any),\n };\n}\n\nexport async function uploadWallpaper(file: File) {\n const inputFile = await uploadFile(file);\n\n const result = await invokeRequest(new GramJs.account.UploadWallPaper({\n file: inputFile,\n mimeType: file.type,\n settings: new GramJs.WallPaperSettings(),\n }));\n\n if (!result || !(result instanceof GramJs.WallPaper)) {\n return undefined;\n }\n\n const wallpaper = buildApiWallpaper(result);\n if (!wallpaper) {\n return undefined;\n }\n\n localDb.documents[String(result.document.id)] = result.document as GramJs.Document;\n\n return { wallpaper };\n}\n\nexport async function fetchBlockedContacts() {\n const result = await invokeRequest(new GramJs.contacts.GetBlocked({\n limit: BLOCKED_LIST_LIMIT,\n }));\n if (!result) {\n return undefined;\n }\n\n updateLocalDb(result);\n\n return {\n users: result.users.map(buildApiUser).filter(Boolean as any),\n chats: result.chats.map((chat) => buildApiChatFromPreview(chat, undefined, true)).filter(Boolean as any),\n blockedIds: result.blocked.map((blocked) => getApiChatIdFromMtpPeer(blocked.peerId)),\n totalCount: result instanceof GramJs.contacts.BlockedSlice ? result.count : result.blocked.length,\n };\n}\n\nexport function blockContact(chatOrUserId: number, accessHash?: string) {\n return invokeRequest(new GramJs.contacts.Block({\n id: buildInputPeer(chatOrUserId, accessHash),\n }));\n}\n\nexport function unblockContact(chatOrUserId: number, accessHash?: string) {\n return invokeRequest(new GramJs.contacts.Unblock({\n id: buildInputPeer(chatOrUserId, accessHash),\n }));\n}\n\nexport async function fetchAuthorizations() {\n const result = await invokeRequest(new GramJs.account.GetAuthorizations());\n if (!result) {\n return undefined;\n }\n\n return result.authorizations.map(buildApiSession);\n}\n\nexport function terminateAuthorization(hash: string) {\n return invokeRequest(new GramJs.account.ResetAuthorization({ hash: BigInt(hash) }));\n}\n\nexport function terminateAllAuthorizations() {\n return invokeRequest(new GramJs.auth.ResetAuthorizations());\n}\n\nexport async function fetchNotificationExceptions({\n serverTimeOffset,\n}: { serverTimeOffset: number }) {\n const result = await invokeRequest(new GramJs.account.GetNotifyExceptions({ compareSound: true }));\n\n if (!(result instanceof GramJs.Updates || result instanceof GramJs.UpdatesCombined)) {\n return undefined;\n }\n\n updateLocalDb(result);\n\n return result.updates.reduce((acc, update) => {\n if (!(update instanceof GramJs.UpdateNotifySettings && update.peer instanceof GramJs.NotifyPeer)) {\n return acc;\n }\n\n acc.push(buildApiNotifyException(update.notifySettings, update.peer.peer, serverTimeOffset));\n\n return acc;\n }, [] as ApiNotifyException[]);\n}\n\nexport async function fetchNotificationSettings({\n serverTimeOffset,\n}: { serverTimeOffset: number }) {\n const [\n isMutedContactSignUpNotification,\n privateContactNotificationsSettings,\n groupNotificationsSettings,\n broadcastNotificationsSettings,\n ] = await Promise.all([\n invokeRequest(new GramJs.account.GetContactSignUpNotification()),\n invokeRequest(new GramJs.account.GetNotifySettings({\n peer: new GramJs.InputNotifyUsers(),\n })),\n invokeRequest(new GramJs.account.GetNotifySettings({\n peer: new GramJs.InputNotifyChats(),\n })),\n invokeRequest(new GramJs.account.GetNotifySettings({\n peer: new GramJs.InputNotifyBroadcasts(),\n })),\n ]);\n\n if (!privateContactNotificationsSettings || !groupNotificationsSettings || !broadcastNotificationsSettings) {\n return false;\n }\n\n const {\n silent: privateSilent, muteUntil: privateMuteUntil, showPreviews: privateShowPreviews,\n } = privateContactNotificationsSettings;\n const {\n silent: groupSilent, muteUntil: groupMuteUntil, showPreviews: groupShowPreviews,\n } = groupNotificationsSettings;\n const {\n silent: broadcastSilent, muteUntil: broadcastMuteUntil, showPreviews: broadcastShowPreviews,\n } = broadcastNotificationsSettings;\n\n return {\n hasContactJoinedNotifications: !isMutedContactSignUpNotification,\n hasPrivateChatsNotifications: !(\n privateSilent\n || (typeof privateMuteUntil === 'number' && Date.now() + serverTimeOffset * 1000 < privateMuteUntil * 1000)\n ),\n hasPrivateChatsMessagePreview: privateShowPreviews,\n hasGroupNotifications: !(\n groupSilent || (typeof groupMuteUntil === 'number'\n && Date.now() + serverTimeOffset * 1000 < groupMuteUntil * 1000)\n ),\n hasGroupMessagePreview: groupShowPreviews,\n hasBroadcastNotifications: !(\n broadcastSilent || (typeof broadcastMuteUntil === 'number'\n && Date.now() + serverTimeOffset * 1000 < broadcastMuteUntil * 1000)\n ),\n hasBroadcastMessagePreview: broadcastShowPreviews,\n };\n}\n\nexport function updateContactSignUpNotification(isSilent: boolean) {\n return invokeRequest(new GramJs.account.SetContactSignUpNotification({ silent: isSilent }));\n}\n\nexport function updateNotificationSettings(peerType: 'contact' | 'group' | 'broadcast', {\n isSilent,\n shouldShowPreviews,\n}: {\n isSilent: boolean;\n shouldShowPreviews: boolean;\n}) {\n let peer: GramJs.TypeInputNotifyPeer;\n if (peerType === 'contact') {\n peer = new GramJs.InputNotifyUsers();\n } else if (peerType === 'group') {\n peer = new GramJs.InputNotifyChats();\n } else {\n peer = new GramJs.InputNotifyBroadcasts();\n }\n\n const settings = {\n showPreviews: shouldShowPreviews,\n silent: isSilent,\n muteUntil: isSilent ? MAX_INT_32 : 0,\n };\n\n return invokeRequest(new GramJs.account.UpdateNotifySettings({\n peer,\n settings: new GramJs.InputPeerNotifySettings(settings),\n }));\n}\n\nexport async function fetchLanguages(): Promise {\n const result = await invokeRequest(new GramJs.langpack.GetLanguages({\n langPack: DEFAULT_LANG_PACK,\n }));\n if (!result) {\n return undefined;\n }\n\n return result.map(omitVirtualClassFields);\n}\n\nexport async function fetchLangPack({ sourceLangPacks, langCode }: {\n sourceLangPacks: typeof LANG_PACKS;\n langCode: string;\n}) {\n const results = await Promise.all(sourceLangPacks.map((langPack) => {\n return invokeRequest(new GramJs.langpack.GetLangPack({\n langPack,\n langCode: BETA_LANG_CODES.includes(langCode) ? `${langCode}-raw` : langCode,\n }));\n }));\n\n const collections = results\n .filter(Boolean as any)\n .map((result) => {\n return buildCollectionByKey(result.strings.map(omitVirtualClassFields), 'key');\n });\n\n if (!collections.length) {\n return undefined;\n }\n\n return { langPack: Object.assign({}, ...collections.reverse()) };\n}\n\nexport async function fetchLangStrings({ langPack, langCode, keys }: {\n langPack: string; langCode: string; keys: string[];\n}) {\n const result = await invokeRequest(new GramJs.langpack.GetStrings({\n langPack,\n langCode: BETA_LANG_CODES.includes(langCode) ? `${langCode}-raw` : langCode,\n keys,\n }));\n\n if (!result) {\n return undefined;\n }\n\n return result.map(omitVirtualClassFields);\n}\n\nexport async function fetchPrivacySettings(privacyKey: ApiPrivacyKey) {\n const key = buildInputPrivacyKey(privacyKey);\n const result = await invokeRequest(new GramJs.account.GetPrivacy({ key }));\n\n if (!result) {\n return undefined;\n }\n\n updateLocalDb(result);\n\n return buildPrivacyRules(result.rules);\n}\n\nexport function registerDevice(token: string) {\n const client = getClient();\n const secret = client.session.getAuthKey().getKey();\n return invokeRequest(new GramJs.account.RegisterDevice({\n tokenType: 10,\n secret,\n appSandbox: false,\n otherUids: [],\n token,\n }));\n}\n\nexport function unregisterDevice(token: string) {\n return invokeRequest(new GramJs.account.UnregisterDevice({\n tokenType: 10,\n otherUids: [],\n token,\n }));\n}\n\nexport async function setPrivacySettings(\n privacyKey: ApiPrivacyKey, rules: IInputPrivacyRules,\n) {\n const key = buildInputPrivacyKey(privacyKey);\n const privacyRules: GramJs.TypeInputPrivacyRule[] = [];\n\n if (rules.allowedUsers) {\n privacyRules.push(new GramJs.InputPrivacyValueAllowUsers({\n users: rules.allowedUsers.map(({ id, accessHash }) => buildInputPeer(id, accessHash)),\n }));\n }\n if (rules.allowedChats) {\n privacyRules.push(new GramJs.InputPrivacyValueAllowChatParticipants({\n chats: rules.allowedChats.map(({ id }) => -id),\n }));\n }\n if (rules.blockedUsers) {\n privacyRules.push(new GramJs.InputPrivacyValueDisallowUsers({\n users: rules.blockedUsers.map(({ id, accessHash }) => buildInputPeer(id, accessHash)),\n }));\n }\n if (rules.blockedChats) {\n privacyRules.push(new GramJs.InputPrivacyValueDisallowChatParticipants({\n chats: rules.blockedChats.map(({ id }) => -id),\n }));\n }\n switch (rules.visibility) {\n case 'everybody':\n privacyRules.push(new GramJs.InputPrivacyValueAllowAll());\n break;\n\n case 'contacts':\n privacyRules.push(new GramJs.InputPrivacyValueAllowContacts());\n break;\n\n case 'nonContacts':\n privacyRules.push(new GramJs.InputPrivacyValueDisallowContacts());\n break;\n\n case 'nobody':\n privacyRules.push(new GramJs.InputPrivacyValueDisallowAll());\n break;\n }\n\n const result = await invokeRequest(new GramJs.account.SetPrivacy({ key, rules: privacyRules }));\n\n if (!result) {\n return undefined;\n }\n\n updateLocalDb(result);\n\n return buildPrivacyRules(result.rules);\n}\n\nexport async function updateIsOnline(isOnline: boolean) {\n await invokeRequest(new GramJs.account.UpdateStatus({ offline: !isOnline }));\n}\n\nexport async function fetchContentSettings() {\n const result = await invokeRequest(new GramJs.account.GetContentSettings());\n if (!result) {\n return undefined;\n }\n\n return {\n isSensitiveEnabled: Boolean(result.sensitiveEnabled),\n canChangeSensitive: Boolean(result.sensitiveCanChange),\n };\n}\n\nexport function updateContentSettings(isEnabled: boolean) {\n return invokeRequest(new GramJs.account.SetContentSettings({\n sensitiveEnabled: isEnabled || undefined,\n }));\n}\n\nfunction updateLocalDb(\n result: (\n GramJs.account.PrivacyRules | GramJs.contacts.Blocked | GramJs.contacts.BlockedSlice |\n GramJs.Updates | GramJs.UpdatesCombined\n ),\n) {\n result.users.forEach((user) => {\n if (user instanceof GramJs.User) {\n localDb.users[user.id] = user;\n }\n });\n\n result.chats.forEach((chat) => {\n if (chat instanceof GramJs.Chat || chat instanceof GramJs.Channel) {\n localDb.chats[chat.id] = chat;\n }\n });\n}\n","import { Api as GramJs } from '../../../lib/gramjs';\n\nexport function buildShippingOptions(shippingOptions: GramJs.ShippingOption[] | undefined) {\n if (!shippingOptions) {\n return undefined;\n }\n return Object.values(shippingOptions).map((option) => {\n return {\n id: option.id,\n title: option.title,\n amount: option.prices.reduce((ac, cur) => ac + Number((cur.amount as any).value), 0),\n prices: option.prices.map(({ label, amount }) => {\n return {\n label,\n amount: Number((amount as any).value),\n };\n }),\n };\n });\n}\n\nexport function buildReceipt(receipt: GramJs.payments.PaymentReceipt) {\n const {\n invoice,\n info,\n shipping,\n currency,\n totalAmount,\n credentialsTitle,\n } = receipt;\n\n const { shippingAddress, phone, name } = (info || {});\n\n const { prices } = invoice;\n const mapedPrices = prices.map(({ label, amount }) => ({\n label,\n amount: Number((amount as any).value),\n }));\n\n let shippingPrices;\n let shippingMethod;\n\n if (shipping) {\n shippingPrices = shipping.prices.map(({ label, amount }) => {\n return {\n label,\n amount: Number((amount as any).value),\n };\n });\n shippingMethod = shipping.title;\n }\n\n return {\n currency,\n prices: mapedPrices,\n info: { shippingAddress, phone, name },\n totalAmount: Number((totalAmount as any).value),\n credentialsTitle,\n shippingPrices,\n shippingMethod,\n };\n}\n\nexport function buildPaymentForm(form: GramJs.payments.PaymentForm) {\n const {\n canSaveCredentials,\n passwordMissing,\n providerId,\n nativeProvider,\n nativeParams,\n savedInfo,\n invoice,\n } = form;\n\n const {\n test,\n nameRequested,\n phoneRequested,\n emailRequested,\n shippingAddressRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices,\n } = invoice;\n\n const mapedPrices = prices.map(({ label, amount }) => ({\n label,\n amount: Number((amount as any).value),\n }));\n\n const nativeData = nativeParams ? JSON.parse(nativeParams.data) : {};\n return {\n canSaveCredentials,\n passwordMissing,\n providerId,\n nativeProvider,\n savedInfo,\n invoice: {\n test,\n nameRequested,\n phoneRequested,\n emailRequested,\n shippingAddressRequested,\n flexible,\n phoneToProvider,\n emailToProvider,\n currency,\n prices: mapedPrices,\n },\n nativeParams: {\n needCardholderName: nativeData.need_cardholder_name,\n needCountry: nativeData.need_country,\n needZip: nativeData.need_zip,\n publishableKey: nativeData.publishable_key,\n },\n };\n}\n","import { Api as GramJs } from '../../../lib/gramjs';\nimport { invokeRequest } from './client';\nimport { buildShippingInfo } from '../gramjsBuilders';\nimport { buildShippingOptions, buildPaymentForm, buildReceipt } from '../apiBuilders/payments';\n\nexport async function validateRequestedInfo({\n messageId,\n requestInfo,\n shouldSave,\n}: {\n messageId: number;\n requestInfo: GramJs.TypePaymentRequestedInfo;\n shouldSave?: boolean;\n}): Promise<{\n id: string;\n shippingOptions: any;\n } | undefined> {\n const result = await invokeRequest(new GramJs.payments.ValidateRequestedInfo({\n msgId: messageId,\n save: shouldSave || undefined,\n info: buildShippingInfo(requestInfo),\n }));\n if (!result) {\n return undefined;\n }\n const { id, shippingOptions } = result;\n if (!id) {\n return undefined;\n }\n return {\n id,\n shippingOptions: buildShippingOptions(shippingOptions),\n };\n}\n\nexport function sendPaymentForm({\n messageId,\n requestedInfoId,\n shippingOptionId,\n credentials,\n}: {\n messageId: number;\n credentials: any;\n requestedInfoId?: string;\n shippingOptionId?: string;\n}) {\n return invokeRequest(new GramJs.payments.SendPaymentForm({\n msgId: messageId,\n requestedInfoId,\n shippingOptionId,\n credentials: new GramJs.InputPaymentCredentials({\n save: credentials.save,\n data: new GramJs.DataJSON({ data: JSON.stringify(credentials.data) }),\n }),\n }), true);\n}\n\nexport async function getPaymentForm({\n messageId,\n}: {\n messageId: number;\n}) {\n const result = await invokeRequest(new GramJs.payments.GetPaymentForm({\n msgId: messageId,\n }));\n if (!result) {\n return undefined;\n }\n\n return buildPaymentForm(result);\n}\n\nexport async function getReceipt(msgId: number) {\n const result = await invokeRequest(new GramJs.payments.GetPaymentReceipt({ msgId }));\n if (!result) {\n return undefined;\n }\n return buildReceipt(result);\n}\n","import {\n OnApiUpdate,\n ApiInitialArgs,\n ApiUpdate,\n ApiOnProgress,\n} from '../types';\nimport { Methods, MethodArgs, MethodResponse } from './methods/types';\n\nimport { API_THROTTLE_RESET_UPDATES, API_UPDATE_THROTTLE } from '../../config';\nimport { throttle, throttleWithTickEnd } from '../../util/schedulers';\nimport { init as initUpdater } from './updater';\nimport { init as initAuth } from './methods/auth';\nimport { init as initChats } from './methods/chats';\nimport { init as initMessages } from './methods/messages';\nimport { init as initUsers } from './methods/users';\nimport { init as initClient } from './methods/client';\nimport { init as initStickers } from './methods/symbols';\nimport { init as initManagement } from './methods/management';\nimport { init as initTwoFaSettings } from './methods/twoFaSettings';\nimport * as methods from './methods';\n\nlet onUpdate: OnApiUpdate;\n\nexport async function initApi(_onUpdate: OnApiUpdate, initialArgs: ApiInitialArgs) {\n onUpdate = _onUpdate;\n\n initUpdater(handleUpdate);\n initAuth(handleUpdate);\n initChats(handleUpdate);\n initMessages(handleUpdate);\n initUsers(handleUpdate);\n initStickers(handleUpdate);\n initManagement(handleUpdate);\n initTwoFaSettings(handleUpdate);\n\n await initClient(handleUpdate, initialArgs);\n}\n\nexport function callApi(fnName: T, ...args: MethodArgs): MethodResponse {\n // @ts-ignore\n return methods[fnName](...args) as MethodResponse;\n}\n\nexport function cancelApiProgress(progressCallback: ApiOnProgress) {\n progressCallback.isCanceled = true;\n}\n\nconst flushUpdatesOnTickEnd = throttleWithTickEnd(flushUpdates);\n\nlet flushUpdatesThrottled: typeof flushUpdatesOnTickEnd | undefined;\nlet currentThrottleId: number | undefined;\n\nlet pendingUpdates: ApiUpdate[] | undefined;\n\nfunction handleUpdate(update: ApiUpdate) {\n if (!pendingUpdates) {\n pendingUpdates = [update];\n } else {\n pendingUpdates.push(update);\n }\n\n if (!flushUpdatesThrottled || API_THROTTLE_RESET_UPDATES.has(update['@type'])) {\n flushUpdatesThrottled = throttle(flushUpdatesOnTickEnd, API_UPDATE_THROTTLE, true);\n currentThrottleId = Math.random();\n }\n\n flushUpdatesThrottled(currentThrottleId!);\n}\n\nfunction flushUpdates(throttleId: number) {\n if (!pendingUpdates || throttleId !== currentThrottleId) {\n return;\n }\n\n const currentUpdates = pendingUpdates!;\n pendingUpdates = undefined;\n currentUpdates.forEach(onUpdate);\n}\n","import { ApiOnProgress, ApiUpdate } from '../../types';\nimport { OriginMessageEvent, WorkerMessageData } from './types';\n\nimport { DEBUG } from '../../../config';\nimport { initApi, callApi, cancelApiProgress } from '../provider';\n\ndeclare const self: WorkerGlobalScope;\n\nhandleErrors();\n\n// TODO Re-use `util/createWorkerInterface.ts`\n\nconst callbackState = new Map();\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH LOAD WORKER');\n}\n\nonmessage = async (message: OriginMessageEvent) => {\n const { data } = message;\n\n switch (data.type) {\n case 'initApi': {\n await initApi(onUpdate, data.args[0]);\n break;\n }\n case 'callMethod': {\n const { messageId, name, args } = data;\n try {\n if (messageId) {\n const callback = (...callbackArgs: any[]) => {\n const lastArg = callbackArgs[callbackArgs.length - 1];\n\n sendToOrigin({\n type: 'methodCallback',\n messageId,\n callbackArgs,\n }, lastArg instanceof ArrayBuffer ? lastArg : undefined);\n };\n\n callbackState.set(messageId, callback);\n\n args.push(callback as never);\n }\n\n const response = await callApi(name, ...args);\n const { arrayBuffer } = (typeof response === 'object' && 'arrayBuffer' in response && response) || {};\n\n if (messageId) {\n sendToOrigin({\n type: 'methodResponse',\n messageId,\n response,\n }, arrayBuffer);\n }\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n\n if (messageId) {\n sendToOrigin({\n type: 'methodResponse',\n messageId,\n error: { message: error.message },\n });\n }\n }\n\n if (messageId) {\n callbackState.delete(messageId);\n }\n\n break;\n }\n case 'cancelProgress': {\n const callback = callbackState.get(data.messageId);\n if (callback) {\n cancelApiProgress(callback);\n }\n\n break;\n }\n }\n};\n\nfunction handleErrors() {\n self.onerror = (e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n sendToOrigin({ type: 'unhandledError', error: { message: e.error.message || 'Uncaught exception in worker' } });\n };\n\n self.addEventListener('unhandledrejection', (e) => {\n // eslint-disable-next-line no-console\n console.error(e);\n sendToOrigin({ type: 'unhandledError', error: { message: e.reason.message || 'Uncaught rejection in worker' } });\n });\n}\n\nfunction onUpdate(update: ApiUpdate) {\n sendToOrigin({\n type: 'update',\n update,\n });\n}\n\nfunction sendToOrigin(data: WorkerMessageData, arrayBuffer?: ArrayBuffer) {\n if (arrayBuffer) {\n postMessage(data, [arrayBuffer]);\n } else {\n postMessage(data);\n }\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/6.77c58d7c5eb57719d840.css b/dist/6.f9e82031a240faaf8916.css similarity index 98% rename from dist/6.77c58d7c5eb57719d840.css rename to dist/6.f9e82031a240faaf8916.css index d18cc1073..af6b9f133 100644 --- a/dist/6.77c58d7c5eb57719d840.css +++ b/dist/6.f9e82031a240faaf8916.css @@ -247,4 +247,4 @@ background: #ccc; } -/*# sourceMappingURL=6.77c58d7c5eb57719d840.css.map*/ \ No newline at end of file +/*# sourceMappingURL=6.f9e82031a240faaf8916.css.map*/ \ No newline at end of file diff --git a/dist/6.77c58d7c5eb57719d840.css.map b/dist/6.f9e82031a240faaf8916.css.map similarity index 99% rename from dist/6.77c58d7c5eb57719d840.css.map rename to dist/6.f9e82031a240faaf8916.css.map index ca479d287..2ef9fcf6f 100644 --- a/dist/6.77c58d7c5eb57719d840.css.map +++ b/dist/6.f9e82031a240faaf8916.css.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./node_modules/croppie/croppie.css"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"6.77c58d7c5eb57719d840.css","sourcesContent":[".croppie-container {\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.croppie-container .cr-image {\r\n z-index: -1;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n transform-origin: 0 0;\r\n max-height: none;\r\n max-width: none;\r\n}\r\n\r\n.croppie-container .cr-boundary {\r\n position: relative;\r\n overflow: hidden;\r\n margin: 0 auto;\r\n z-index: 1;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.croppie-container .cr-viewport,\r\n.croppie-container .cr-resizer {\r\n position: absolute;\r\n border: 2px solid #fff;\r\n margin: auto;\r\n top: 0;\r\n bottom: 0;\r\n right: 0;\r\n left: 0;\r\n box-shadow: 0 0 2000px 2000px rgba(0, 0, 0, 0.5);\r\n z-index: 0;\r\n}\r\n\r\n.croppie-container .cr-resizer {\r\n z-index: 2;\r\n box-shadow: none;\r\n pointer-events: none;\r\n}\r\n\r\n.croppie-container .cr-resizer-vertical,\r\n.croppie-container .cr-resizer-horisontal {\r\n position: absolute;\r\n pointer-events: all;\r\n}\r\n\r\n.croppie-container .cr-resizer-vertical::after,\r\n.croppie-container .cr-resizer-horisontal::after {\r\n display: block;\r\n position: absolute;\r\n box-sizing: border-box;\r\n border: 1px solid black;\r\n background: #fff;\r\n width: 10px;\r\n height: 10px;\r\n content: '';\r\n}\r\n\r\n.croppie-container .cr-resizer-vertical {\r\n bottom: -5px;\r\n cursor: row-resize;\r\n width: 100%;\r\n height: 10px;\r\n}\r\n\r\n.croppie-container .cr-resizer-vertical::after {\r\n left: 50%;\r\n margin-left: -5px;\r\n}\r\n\r\n.croppie-container .cr-resizer-horisontal {\r\n right: -5px;\r\n cursor: col-resize;\r\n width: 10px;\r\n height: 100%;\r\n}\r\n\r\n.croppie-container .cr-resizer-horisontal::after {\r\n top: 50%;\r\n margin-top: -5px;\r\n}\r\n\r\n.croppie-container .cr-original-image {\r\n display: none;\r\n}\r\n\r\n.croppie-container .cr-vp-circle {\r\n border-radius: 50%;\r\n}\r\n\r\n.croppie-container .cr-overlay {\r\n z-index: 1;\r\n position: absolute;\r\n cursor: move;\r\n touch-action: none;\r\n}\r\n\r\n.croppie-container .cr-slider-wrap {\r\n width: 75%;\r\n margin: 15px auto;\r\n text-align: center;\r\n}\r\n\r\n.croppie-result {\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n\r\n.croppie-result img {\r\n position: absolute;\r\n}\r\n\r\n.croppie-container .cr-image,\r\n.croppie-container .cr-overlay,\r\n.croppie-container .cr-viewport {\r\n transform: translateZ(0);\r\n}\r\n\r\n/*************************************/\r\n/***** STYLING RANGE INPUT ***********/\r\n/*************************************/\r\n/*http://brennaobrien.com/blog/2014/05/style-input-type-range-in-every-browser.html */\r\n/*************************************/\r\n\r\n.cr-slider {\r\n -webkit-appearance: none;\r\n/*removes default webkit styles*/\r\n\t/*border: 1px solid white; *//*fix for FF unable to apply focus style bug */\r\n width: 300px;\r\n/*required for proper track sizing in FF*/\r\n max-width: 100%;\r\n padding-top: 8px;\r\n padding-bottom: 8px;\r\n background-color: transparent;\r\n}\r\n\r\n.cr-slider::-webkit-slider-runnable-track {\r\n width: 100%;\r\n height: 3px;\r\n background: rgba(0, 0, 0, 0.5);\r\n border: 0;\r\n border-radius: 3px;\r\n}\r\n\r\n.cr-slider::-webkit-slider-thumb {\r\n -webkit-appearance: none;\r\n border: none;\r\n height: 16px;\r\n width: 16px;\r\n border-radius: 50%;\r\n background: #ddd;\r\n margin-top: -6px;\r\n}\r\n\r\n.cr-slider:focus {\r\n outline: none;\r\n}\r\n/*\r\n.cr-slider:focus::-webkit-slider-runnable-track {\r\nbackground: #ccc;\r\n}\r\n*/\r\n\r\n.cr-slider::-moz-range-track {\r\n width: 100%;\r\n height: 3px;\r\n background: rgba(0, 0, 0, 0.5);\r\n border: 0;\r\n border-radius: 3px;\r\n}\r\n\r\n.cr-slider::-moz-range-thumb {\r\n border: none;\r\n height: 16px;\r\n width: 16px;\r\n border-radius: 50%;\r\n background: #ddd;\r\n margin-top: -6px;\r\n}\r\n\r\n/*hide the outline behind the border*/\r\n.cr-slider:-moz-focusring {\r\n outline: 1px solid white;\r\n outline-offset: -1px;\r\n}\r\n\r\n.cr-slider::-ms-track {\r\n width: 100%;\r\n height: 5px;\r\n background: transparent;\r\n/*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */\r\n\tborder-color: transparent;/*leave room for the larger thumb to overflow with a transparent border */\r\n\tborder-width: 6px 0;\r\n\tcolor: transparent;/*remove default tick marks*/\r\n}\r\n.cr-slider::-ms-fill-lower {\r\n\tbackground: rgba(0, 0, 0, 0.5);\r\n\tborder-radius: 10px;\r\n}\r\n.cr-slider::-ms-fill-upper {\r\n\tbackground: rgba(0, 0, 0, 0.5);\r\n\tborder-radius: 10px;\r\n}\r\n.cr-slider::-ms-thumb {\r\n\tborder: none;\r\n\theight: 16px;\r\n\twidth: 16px;\r\n\tborder-radius: 50%;\r\n\tbackground: #ddd;\r\n\tmargin-top:1px;\r\n}\r\n.cr-slider:focus::-ms-fill-lower {\r\n\tbackground: rgba(0, 0, 0, 0.5);\r\n}\r\n.cr-slider:focus::-ms-fill-upper {\r\n\tbackground: rgba(0, 0, 0, 0.5);\r\n}\r\n/*******************************************/\r\n\r\n/***********************************/\r\n/* Rotation Tools */\r\n/***********************************/\r\n.cr-rotate-controls {\r\n\tposition: absolute;\r\n\tbottom: 5px;\r\n\tleft: 5px;\r\n\tz-index: 1;\r\n}\r\n.cr-rotate-controls button {\r\n\tborder: 0;\r\n\tbackground: none;\r\n}\r\n.cr-rotate-controls i:before {\r\n\tdisplay: inline-block;\r\n\tfont-style: normal;\r\n\tfont-weight: 900;\r\n\tfont-size: 22px;\r\n}\r\n.cr-rotate-l i:before {\r\n\tcontent: '↺';\r\n}\r\n.cr-rotate-r i:before {\r\n\tcontent: '↻';\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./node_modules/croppie/croppie.css"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"6.f9e82031a240faaf8916.css","sourcesContent":[".croppie-container {\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.croppie-container .cr-image {\r\n z-index: -1;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n transform-origin: 0 0;\r\n max-height: none;\r\n max-width: none;\r\n}\r\n\r\n.croppie-container .cr-boundary {\r\n position: relative;\r\n overflow: hidden;\r\n margin: 0 auto;\r\n z-index: 1;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.croppie-container .cr-viewport,\r\n.croppie-container .cr-resizer {\r\n position: absolute;\r\n border: 2px solid #fff;\r\n margin: auto;\r\n top: 0;\r\n bottom: 0;\r\n right: 0;\r\n left: 0;\r\n box-shadow: 0 0 2000px 2000px rgba(0, 0, 0, 0.5);\r\n z-index: 0;\r\n}\r\n\r\n.croppie-container .cr-resizer {\r\n z-index: 2;\r\n box-shadow: none;\r\n pointer-events: none;\r\n}\r\n\r\n.croppie-container .cr-resizer-vertical,\r\n.croppie-container .cr-resizer-horisontal {\r\n position: absolute;\r\n pointer-events: all;\r\n}\r\n\r\n.croppie-container .cr-resizer-vertical::after,\r\n.croppie-container .cr-resizer-horisontal::after {\r\n display: block;\r\n position: absolute;\r\n box-sizing: border-box;\r\n border: 1px solid black;\r\n background: #fff;\r\n width: 10px;\r\n height: 10px;\r\n content: '';\r\n}\r\n\r\n.croppie-container .cr-resizer-vertical {\r\n bottom: -5px;\r\n cursor: row-resize;\r\n width: 100%;\r\n height: 10px;\r\n}\r\n\r\n.croppie-container .cr-resizer-vertical::after {\r\n left: 50%;\r\n margin-left: -5px;\r\n}\r\n\r\n.croppie-container .cr-resizer-horisontal {\r\n right: -5px;\r\n cursor: col-resize;\r\n width: 10px;\r\n height: 100%;\r\n}\r\n\r\n.croppie-container .cr-resizer-horisontal::after {\r\n top: 50%;\r\n margin-top: -5px;\r\n}\r\n\r\n.croppie-container .cr-original-image {\r\n display: none;\r\n}\r\n\r\n.croppie-container .cr-vp-circle {\r\n border-radius: 50%;\r\n}\r\n\r\n.croppie-container .cr-overlay {\r\n z-index: 1;\r\n position: absolute;\r\n cursor: move;\r\n touch-action: none;\r\n}\r\n\r\n.croppie-container .cr-slider-wrap {\r\n width: 75%;\r\n margin: 15px auto;\r\n text-align: center;\r\n}\r\n\r\n.croppie-result {\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n\r\n.croppie-result img {\r\n position: absolute;\r\n}\r\n\r\n.croppie-container .cr-image,\r\n.croppie-container .cr-overlay,\r\n.croppie-container .cr-viewport {\r\n transform: translateZ(0);\r\n}\r\n\r\n/*************************************/\r\n/***** STYLING RANGE INPUT ***********/\r\n/*************************************/\r\n/*http://brennaobrien.com/blog/2014/05/style-input-type-range-in-every-browser.html */\r\n/*************************************/\r\n\r\n.cr-slider {\r\n -webkit-appearance: none;\r\n/*removes default webkit styles*/\r\n\t/*border: 1px solid white; *//*fix for FF unable to apply focus style bug */\r\n width: 300px;\r\n/*required for proper track sizing in FF*/\r\n max-width: 100%;\r\n padding-top: 8px;\r\n padding-bottom: 8px;\r\n background-color: transparent;\r\n}\r\n\r\n.cr-slider::-webkit-slider-runnable-track {\r\n width: 100%;\r\n height: 3px;\r\n background: rgba(0, 0, 0, 0.5);\r\n border: 0;\r\n border-radius: 3px;\r\n}\r\n\r\n.cr-slider::-webkit-slider-thumb {\r\n -webkit-appearance: none;\r\n border: none;\r\n height: 16px;\r\n width: 16px;\r\n border-radius: 50%;\r\n background: #ddd;\r\n margin-top: -6px;\r\n}\r\n\r\n.cr-slider:focus {\r\n outline: none;\r\n}\r\n/*\r\n.cr-slider:focus::-webkit-slider-runnable-track {\r\nbackground: #ccc;\r\n}\r\n*/\r\n\r\n.cr-slider::-moz-range-track {\r\n width: 100%;\r\n height: 3px;\r\n background: rgba(0, 0, 0, 0.5);\r\n border: 0;\r\n border-radius: 3px;\r\n}\r\n\r\n.cr-slider::-moz-range-thumb {\r\n border: none;\r\n height: 16px;\r\n width: 16px;\r\n border-radius: 50%;\r\n background: #ddd;\r\n margin-top: -6px;\r\n}\r\n\r\n/*hide the outline behind the border*/\r\n.cr-slider:-moz-focusring {\r\n outline: 1px solid white;\r\n outline-offset: -1px;\r\n}\r\n\r\n.cr-slider::-ms-track {\r\n width: 100%;\r\n height: 5px;\r\n background: transparent;\r\n/*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */\r\n\tborder-color: transparent;/*leave room for the larger thumb to overflow with a transparent border */\r\n\tborder-width: 6px 0;\r\n\tcolor: transparent;/*remove default tick marks*/\r\n}\r\n.cr-slider::-ms-fill-lower {\r\n\tbackground: rgba(0, 0, 0, 0.5);\r\n\tborder-radius: 10px;\r\n}\r\n.cr-slider::-ms-fill-upper {\r\n\tbackground: rgba(0, 0, 0, 0.5);\r\n\tborder-radius: 10px;\r\n}\r\n.cr-slider::-ms-thumb {\r\n\tborder: none;\r\n\theight: 16px;\r\n\twidth: 16px;\r\n\tborder-radius: 50%;\r\n\tbackground: #ddd;\r\n\tmargin-top:1px;\r\n}\r\n.cr-slider:focus::-ms-fill-lower {\r\n\tbackground: rgba(0, 0, 0, 0.5);\r\n}\r\n.cr-slider:focus::-ms-fill-upper {\r\n\tbackground: rgba(0, 0, 0, 0.5);\r\n}\r\n/*******************************************/\r\n\r\n/***********************************/\r\n/* Rotation Tools */\r\n/***********************************/\r\n.cr-rotate-controls {\r\n\tposition: absolute;\r\n\tbottom: 5px;\r\n\tleft: 5px;\r\n\tz-index: 1;\r\n}\r\n.cr-rotate-controls button {\r\n\tborder: 0;\r\n\tbackground: none;\r\n}\r\n.cr-rotate-controls i:before {\r\n\tdisplay: inline-block;\r\n\tfont-style: normal;\r\n\tfont-weight: 900;\r\n\tfont-size: 22px;\r\n}\r\n.cr-rotate-l i:before {\r\n\tcontent: '↺';\r\n}\r\n.cr-rotate-r i:before {\r\n\tcontent: '↻';\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/6.77c58d7c5eb57719d840.js b/dist/6.f9e82031a240faaf8916.js similarity index 98% rename from dist/6.77c58d7c5eb57719d840.js rename to dist/6.f9e82031a240faaf8916.js index ae999d8d5..6be64b298 100644 --- a/dist/6.77c58d7c5eb57719d840.js +++ b/dist/6.f9e82031a240faaf8916.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{194:function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},320:function(e,t,n){(function(i){var o,r;"undefined"!=typeof self&&self,void 0===(r="function"==typeof(o=function(){"function"!=typeof Promise&&function(t){function n(e,t){return function(){e.apply(t,arguments)}}function o(e){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],h(e,n(a,this),n(s,this))}function r(e){var t=this;return null===this._state?void this._deferreds.push(e):void p((function(){var n=t._state?e.onFulfilled:e.onRejected;if(null!==n){var i;try{i=n(t._value)}catch(t){return void e.reject(t)}e.resolve(i)}else(t._state?e.resolve:e.reject)(t._value)}))}function a(e){try{if(e===this)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var t=e.then;if("function"==typeof t)return void h(n(t,e),n(a,this),n(s,this))}this._state=!0,this._value=e,l.call(this)}catch(e){s.call(this,e)}}function s(e){this._state=!1,this._value=e,l.call(this)}function l(){for(var e=0,t=this._deferreds.length;t>e;e++)r.call(this,this._deferreds[e]);this._deferreds=null}function c(e,t,n,i){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.resolve=n,this.reject=i}function h(e,t,n){var i=!1;try{e((function(e){i||(i=!0,t(e))}),(function(e){i||(i=!0,n(e))}))}catch(e){if(i)return;i=!0,n(e)}}var u=setTimeout,p="function"==typeof i&&i||function(e){u(e,1)},d=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)};o.prototype.catch=function(e){return this.then(null,e)},o.prototype.then=function(e,t){var n=this;return new o((function(i,o){r.call(n,new c(e,t,i,o))}))},o.all=function(){var e=Array.prototype.slice.call(1===arguments.length&&d(arguments[0])?arguments[0]:arguments);return new o((function(t,n){function i(r,a){try{if(a&&("object"==typeof a||"function"==typeof a)){var s=a.then;if("function"==typeof s)return void s.call(a,(function(e){i(r,e)}),n)}e[r]=a,0==--o&&t(e)}catch(e){n(e)}}if(0===e.length)return t([]);for(var o=e.length,r=0;ri;i++)e[i].then(t,n)}))},o._setImmediateFn=function(e){p=e},e.exports?e.exports=o:t.Promise||(t.Promise=o)}(this),"function"!=typeof window.CustomEvent&&function(){function e(e,t){t=t||{bubbles:!1,cancelable:!1,detail:void 0};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),n}e.prototype=window.Event.prototype,window.CustomEvent=e}(),HTMLCanvasElement.prototype.toBlob||Object.defineProperty(HTMLCanvasElement.prototype,"toBlob",{value:function(e,t,n){for(var i=atob(this.toDataURL(t,n).split(",")[1]),o=i.length,r=new Uint8Array(o),a=0;a=5){var r=n;n=i,i=r}return{width:n,height:i}}n=c("transform"),t=c("transformOrigin"),o=c("userSelect");var w={translate3d:{suffix:", 0px"},translate:{suffix:""}},y=function(e,t,n){this.x=parseFloat(e),this.y=parseFloat(t),this.scale=parseFloat(n)};y.parse=function(e){return e.style?y.parse(e.style[n]):e.indexOf("matrix")>-1||e.indexOf("none")>-1?y.fromMatrix(e):y.fromString(e)},y.fromMatrix=function(e){var t=e.substring(7).split(",");return t.length&&"none"!==e||(t=[1,0,0,1,0,0]),new y(v(t[4]),v(t[5]),parseFloat(t[0]))},y.fromString=function(e){var t=e.split(") "),n=t[0].substring(ae.globals.translate.length+1).split(","),i=t.length>1?t[1].substring(6):1,o=n.length>1?n[0]:0,r=n.length>1?n[1]:0;return new y(o,r,i)},y.prototype.toString=function(){var e=w[ae.globals.translate].suffix||"";return ae.globals.translate+"("+this.x+"px, "+this.y+"px"+e+") scale("+this.scale+")"};var b=function(e){if(!e||!e.style[t])return this.x=0,void(this.y=0);var n=e.style[t].split(" ");this.x=parseFloat(n[0]),this.y=parseFloat(n[1])};function x(e){return e.exifdata&&e.exifdata.Orientation?v(e.exifdata.Orientation):1}function C(e,t,n){var i=t.width,o=t.height,r=e.getContext("2d");switch(e.width=t.width,e.height=t.height,r.save(),n){case 2:r.translate(i,0),r.scale(-1,1);break;case 3:r.translate(i,o),r.rotate(180*Math.PI/180);break;case 4:r.translate(0,o),r.scale(1,-1);break;case 5:e.width=o,e.height=i,r.rotate(90*Math.PI/180),r.scale(1,-1);break;case 6:e.width=o,e.height=i,r.rotate(90*Math.PI/180),r.translate(0,-o);break;case 7:e.width=o,e.height=i,r.rotate(-90*Math.PI/180),r.translate(-i,o),r.scale(1,-1);break;case 8:e.width=o,e.height=i,r.translate(0,i),r.rotate(-90*Math.PI/180)}r.drawImage(t,0,0,i,o),r.restore()}function E(){var e,t,n,i,o,r,a=this.options.viewport.type?"cr-vp-"+this.options.viewport.type:null;this.options.useCanvas=this.options.enableOrientation||_.call(this),this.data={},this.elements={},e=this.elements.boundary=document.createElement("div"),n=this.elements.viewport=document.createElement("div"),t=this.elements.img=document.createElement("img"),i=this.elements.overlay=document.createElement("div"),this.options.useCanvas?(this.elements.canvas=document.createElement("canvas"),this.elements.preview=this.elements.canvas):this.elements.preview=t,m(e,"cr-boundary"),e.setAttribute("aria-dropeffect","none"),o=this.options.boundary.width,r=this.options.boundary.height,d(e,{width:o+(isNaN(o)?"":"px"),height:r+(isNaN(r)?"":"px")}),m(n,"cr-viewport"),a&&m(n,a),d(n,{width:this.options.viewport.width+"px",height:this.options.viewport.height+"px"}),n.setAttribute("tabindex",0),m(this.elements.preview,"cr-image"),f(this.elements.preview,{alt:"preview","aria-grabbed":"false"}),m(i,"cr-overlay"),this.element.appendChild(e),e.appendChild(this.elements.preview),e.appendChild(n),e.appendChild(i),m(this.element,"croppie-container"),this.options.customClass&&m(this.element,this.options.customClass),B.call(this),this.options.enableZoom&&I.call(this),this.options.enableResize&&T.call(this)}function _(){return this.options.enableExif&&window.EXIF}function T(){var e,t,n,i,r,a,s,l=this,c=document.createElement("div"),h=!1;function u(a){if((void 0===a.button||0===a.button)&&(a.preventDefault(),!h)){var s=l.elements.overlay.getBoundingClientRect();if(h=!0,t=a.pageX,n=a.pageY,e=-1!==a.currentTarget.className.indexOf("vertical")?"v":"h",i=s.width,r=s.height,a.touches){var c=a.touches[0];t=c.pageX,n=c.pageY}window.addEventListener("mousemove",p),window.addEventListener("touchmove",p),window.addEventListener("mouseup",f),window.addEventListener("touchend",f),document.body.style[o]="none"}}function p(o){var a=o.pageX,s=o.pageY;if(o.preventDefault(),o.touches){var h=o.touches[0];a=h.pageX,s=h.pageY}var u=a-t,p=s-n,m=l.options.viewport.height+p,f=l.options.viewport.width+u;"v"===e&&m>=50&&m<=r?(d(c,{height:m+"px"}),l.options.boundary.height+=p,d(l.elements.boundary,{height:l.options.boundary.height+"px"}),l.options.viewport.height+=p,d(l.elements.viewport,{height:l.options.viewport.height+"px"})):"h"===e&&f>=50&&f<=i&&(d(c,{width:f+"px"}),l.options.boundary.width+=u,d(l.elements.boundary,{width:l.options.boundary.width+"px"}),l.options.viewport.width+=u,d(l.elements.viewport,{width:l.options.viewport.width+"px"})),Z.call(l),S.call(l),k.call(l),Y.call(l),n=s,t=a}function f(){h=!1,window.removeEventListener("mousemove",p),window.removeEventListener("touchmove",p),window.removeEventListener("mouseup",f),window.removeEventListener("touchend",f),document.body.style[o]=""}m(c,"cr-resizer"),d(c,{width:this.options.viewport.width+"px",height:this.options.viewport.height+"px"}),this.options.resizeControls.height&&(m(a=document.createElement("div"),"cr-resizer-vertical"),c.appendChild(a)),this.options.resizeControls.width&&(m(s=document.createElement("div"),"cr-resizer-horisontal"),c.appendChild(s)),a&&(a.addEventListener("mousedown",u),a.addEventListener("touchstart",u)),s&&(s.addEventListener("mousedown",u),s.addEventListener("touchstart",u)),this.elements.boundary.appendChild(c)}function L(e){if(this.options.enableZoom){var t=this.elements.zoomer,n=Q(e,4);t.value=Math.max(parseFloat(t.min),Math.min(parseFloat(t.max),n)).toString()}}function I(){var e=this,t=e.elements.zoomerWrap=document.createElement("div"),n=e.elements.zoomer=document.createElement("input");function i(){M.call(e,{value:parseFloat(n.value),origin:new b(e.elements.preview),viewportRect:e.elements.viewport.getBoundingClientRect(),transform:y.parse(e.elements.preview)})}function o(t){var n,o;if("ctrl"===e.options.mouseWheelZoom&&!0!==t.ctrlKey)return 0;n=t.wheelDelta?t.wheelDelta/1200:t.deltaY?t.deltaY/1060:t.detail?t.detail/-60:0,o=e._currentZoom+n*e._currentZoom,t.preventDefault(),L.call(e,o),i.call(e)}m(t,"cr-slider-wrap"),m(n,"cr-slider"),n.type="range",n.step="0.0001",n.value="1",n.style.display=e.options.showZoomer?"":"none",n.setAttribute("aria-label","zoom"),e.element.appendChild(t),t.appendChild(n),e._currentZoom=1,e.elements.zoomer.addEventListener("input",i),e.elements.zoomer.addEventListener("change",i),e.options.mouseWheelZoom&&(e.elements.boundary.addEventListener("mousewheel",o),e.elements.boundary.addEventListener("DOMMouseScroll",o))}function M(e){var i=this,o=e?e.transform:y.parse(i.elements.preview),r=e?e.viewportRect:i.elements.viewport.getBoundingClientRect(),a=e?e.origin:new b(i.elements.preview);function s(){var e={};e[n]=o.toString(),e[t]=a.toString(),d(i.elements.preview,e)}if(i._currentZoom=e?e.value:i._currentZoom,o.scale=i._currentZoom,i.elements.zoomer.setAttribute("aria-valuenow",i._currentZoom),s(),i.options.enforceBoundary){var l=R.call(i,r),c=l.translate,h=l.origin;o.x>=c.maxX&&(a.x=h.minX,o.x=c.maxX),o.x<=c.minX&&(a.x=h.maxX,o.x=c.minX),o.y>=c.maxY&&(a.y=h.minY,o.y=c.maxY),o.y<=c.minY&&(a.y=h.maxY,o.y=c.minY)}s(),X.call(i),Y.call(i)}function R(e){var t=this._currentZoom,n=e.width,i=e.height,o=this.elements.boundary.clientWidth/2,r=this.elements.boundary.clientHeight/2,a=this.elements.preview.getBoundingClientRect(),s=a.width,l=a.height,c=n/2,h=i/2,u=-1*(c/t-o),p=-1*(h/t-r),d=1/t*c,m=1/t*h;return{translate:{maxX:u,minX:u-(s*(1/t)-n*(1/t)),maxY:p,minY:p-(l*(1/t)-i*(1/t))},origin:{maxX:s*(1/t)-d,minX:d,maxY:l*(1/t)-m,minY:m}}}function k(e){var i=this._currentZoom,o=this.elements.preview.getBoundingClientRect(),r=this.elements.viewport.getBoundingClientRect(),a=y.parse(this.elements.preview.style[n]),s=new b(this.elements.preview),l=r.top-o.top+r.height/2,c=r.left-o.left+r.width/2,h={},u={};if(e){var p=s.x,m=s.y,f=a.x,v=a.y;h.y=p,h.x=m,a.y=f,a.x=v}else h.y=l/i,h.x=c/i,u.y=(h.y-s.y)*(1-i),u.x=(h.x-s.x)*(1-i),a.x-=u.x,a.y-=u.y;var g={};g[t]=h.x+"px "+h.y+"px",g[n]=a.toString(),d(this.elements.preview,g)}function B(){var e,t,i,r,a,s=this,l=!1;function c(e,t){var n=s.elements.preview.getBoundingClientRect(),i=a.y+t,o=a.x+e;s.options.enforceBoundary?(r.top>n.top+t&&r.bottomn.left+e&&r.right1){var v=o.touches[0],g=o.touches[1],w=Math.sqrt((v.pageX-g.pageX)*(v.pageX-g.pageX)+(v.pageY-g.pageY)*(v.pageY-g.pageY));i||(i=w/s._currentZoom);var y=w/i;return L.call(s,y),void p(s.elements.zoomer)}c(u,m),f[n]=a.toString(),d(s.elements.preview,f),Z.call(s),t=l,e=r}function f(){h(l=!1),window.removeEventListener("mousemove",m),window.removeEventListener("touchmove",m),window.removeEventListener("mouseup",f),window.removeEventListener("touchend",f),document.body.style[o]="",k.call(s),Y.call(s),i=0}s.elements.overlay.addEventListener("mousedown",u),s.elements.viewport.addEventListener("keydown",(function(e){var t;if(!e.shiftKey||38!==e.keyCode&&40!==e.keyCode){if(s.options.enableKeyMovement&&e.keyCode>=37&&e.keyCode<=40){e.preventDefault();var l=function(e){switch(e){case 37:return[1,0];case 38:return[0,1];case 39:return[-1,0];case 40:return[0,-1]}}(e.keyCode);a=y.parse(s.elements.preview),document.body.style[o]="none",r=s.elements.viewport.getBoundingClientRect(),function(e){var t=e[0],r=e[1],l={};c(t,r),l[n]=a.toString(),d(s.elements.preview,l),Z.call(s),document.body.style[o]="",k.call(s),Y.call(s),i=0}(l)}}else t=38===e.keyCode?parseFloat(s.elements.zoomer.value)+parseFloat(s.elements.zoomer.step):parseFloat(s.elements.zoomer.value)-parseFloat(s.elements.zoomer.step),s.setZoom(t)})),s.elements.overlay.addEventListener("touchstart",u)}function Z(){if(this.elements){var e=this.elements.boundary.getBoundingClientRect(),t=this.elements.preview.getBoundingClientRect();d(this.elements.overlay,{width:t.width+"px",height:t.height+"px",top:t.top-e.top+"px",left:t.left-e.left+"px"})}}b.prototype.toString=function(){return this.x+"px "+this.y+"px"};var F,z,O,A,X=(F=Z,z=500,function(){var e=this,t=arguments,n=function(){A=null,O||F.apply(e,t)},i=O&&!A;clearTimeout(A),A=setTimeout(n,z),i&&F.apply(e,t)});function Y(){var e,t=this.get();j.call(this)&&(this.options.update.call(this,t),this.$&&"undefined"==typeof Prototype?this.$(this.element).trigger("update.croppie",t):(window.CustomEvent?e=new CustomEvent("update",{detail:t}):(e=document.createEvent("CustomEvent")).initCustomEvent("update",!0,!0,t),this.element.dispatchEvent(e)))}function j(){return this.elements.preview.offsetHeight>0&&this.elements.preview.offsetWidth>0}function W(){var e,i={},o=this.elements.preview,r=new y(0,0,1),a=new b;j.call(this)&&!this.data.bound&&(this.data.bound=!0,i[n]=r.toString(),i[t]=a.toString(),i.opacity=1,d(o,i),e=this.elements.preview.getBoundingClientRect(),this._originalImageWidth=e.width,this._originalImageHeight=e.height,this.data.orientation=x(this.elements.img),this.options.enableZoom?S.call(this,!0):this._currentZoom=1,r.scale=this._currentZoom,i[n]=r.toString(),d(o,i),this.data.points.length?H.call(this,this.data.points):N.call(this),k.call(this),Z.call(this))}function S(e){var t,n,i,o,r=Math.max(this.options.minZoom,0)||0,a=this.options.maxZoom||1.5,s=this.elements.zoomer,l=parseFloat(s.value),c=this.elements.boundary.getBoundingClientRect(),h=g(this.elements.img,this.data.orientation),u=this.elements.viewport.getBoundingClientRect();this.options.enforceBoundary&&(i=u.width/h.width,o=u.height/h.height,r=Math.max(i,o)),r>=a&&(a=r+1),s.min=Q(r,4),s.max=Q(a,4),!e&&(ls.max)?L.call(this,lthis._originalImageWidth&&(w=(d=this._originalImageWidth-u)/o*c),i<0&&(p=0,g=Math.abs(i)/r*h),m+p>this._originalImageHeight&&(y=(m=this._originalImageHeight-p)/r*h),l.drawImage(this.elements.preview,u,p,d,m,f,g,w,y),a&&(l.fillStyle="#fff",l.globalCompositeOperation="destination-in",l.beginPath(),l.arc(s.width/2,s.height/2,s.width/2,0,2*Math.PI,!0),l.closePath(),l.fill()),s}function q(e){var t=e.points,n=document.createElement("div"),i=document.createElement("img"),o=t[2]-t[0],r=t[3]-t[1];return m(n,"croppie-result"),n.appendChild(i),d(i,{left:-1*t[0]+"px",top:-1*t[1]+"px"}),i.src=e.url,d(n,{width:o+"px",height:r+"px"}),n}function $(e){return D.call(this,e).toDataURL(e.format,e.quality)}function K(e){var t=this;return new Promise((function(n){D.call(t,e).toBlob((function(e){n(e)}),e.format,e.quality)}))}function U(e){this.elements.img.parentNode&&(Array.prototype.forEach.call(this.elements.img.classList,(function(t){e.classList.add(t)})),this.elements.img.parentNode.replaceChild(e,this.elements.img),this.elements.preview=e),this.elements.img=e}function J(e,t){var n,i,o,r,a=this,s=[],l=null,c=_.call(a);if("string"==typeof e)n=e,e={};else if(Array.isArray(e))s=e.slice();else{if(void 0===e&&a.data.url)return W.call(a),Y.call(a),null;n=e.url,s=e.points||[],l=void 0===e.zoom?null:e.zoom}return a.data.bound=!1,a.data.url=n||a.data.url,a.data.boundZoom=l,(i=n,o=c,r=new Image,r.style.opacity="0",new Promise((function(e,t){function n(){r.style.opacity="1",setTimeout((function(){e(r)}),1)}r.removeAttribute("crossOrigin"),i.match(/^https?:\/\/|^\/\//)&&r.setAttribute("crossOrigin","anonymous"),r.onload=function(){o?EXIF.getData(r,(function(){n()})):n()},r.onerror=function(e){r.style.opacity=1,setTimeout((function(){t(e)}),1)},r.src=i}))).then((function(n){if(U.call(a,n),s.length)a.options.relative&&(s=[s[0]*n.naturalWidth/100,s[1]*n.naturalHeight/100,s[2]*n.naturalWidth/100,s[3]*n.naturalHeight/100]);else{var i,o,r=g(n),l=a.elements.viewport.getBoundingClientRect(),c=l.width/l.height;r.width/r.height>c?i=(o=r.height)*c:(i=r.width,o=r.height/c);var h=(r.width-i)/2,u=(r.height-o)/2,p=h+i,d=u+o;a.data.points=[h,u,p,d]}a.data.points=s.map((function(e){return parseFloat(e)})),a.options.useCanvas&&P.call(a,e.orientation),W.call(a),Y.call(a),t&&t()}))}function Q(e,t){return parseFloat(e).toFixed(t||0)}function G(){var e=this.elements.preview.getBoundingClientRect(),t=this.elements.viewport.getBoundingClientRect(),n=t.left-e.left,i=t.top-e.top,o=(t.width-this.elements.viewport.offsetWidth)/2,r=(t.height-this.elements.viewport.offsetHeight)/2,a=n+this.elements.viewport.offsetWidth+o,s=i+this.elements.viewport.offsetHeight+r,l=this._currentZoom;(l===1/0||isNaN(l))&&(l=1);var c=this.options.enforceBoundary?0:Number.NEGATIVE_INFINITY;return n=Math.max(c,n/l),i=Math.max(c,i/l),a=Math.max(c,a/l),s=Math.max(c,s/l),{points:[Q(n),Q(i),Q(a),Q(s)],zoom:l,orientation:this.data.orientation}}var V={type:"canvas",format:"png",quality:1},ee=["jpeg","webp","png"];function te(e){var t=this,n=G.call(t),i=h(u(V),u(e)),o="string"==typeof e?e:i.type||"base64",r=i.size||"viewport",a=i.format,s=i.quality,l=i.backgroundColor,c="boolean"==typeof i.circle?i.circle:"circle"===t.options.viewport.type,p=t.elements.viewport.getBoundingClientRect(),d=p.width/p.height;return"viewport"===r?(n.outputWidth=p.width,n.outputHeight=p.height):"object"==typeof r&&(r.width&&r.height?(n.outputWidth=r.width,n.outputHeight=r.height):r.width?(n.outputWidth=r.width,n.outputHeight=r.width/d):r.height&&(n.outputWidth=r.height*d,n.outputHeight=r.height)),ee.indexOf(a)>-1&&(n.format="image/"+a,n.quality=s),n.circle=c,n.url=t.data.url,n.backgroundColor=l,new Promise((function(e){switch(o.toLowerCase()){case"rawcanvas":e(D.call(t,n));break;case"canvas":case"base64":e($.call(t,n));break;case"blob":K.call(t,n).then(e);break;default:e(q.call(t,n))}}))}function ne(){W.call(this)}function ie(e){if(!this.options.useCanvas||!this.options.enableOrientation)throw"Croppie: Cannot rotate without enableOrientation && EXIF.js included";var t,n,i,o,r,a=this.elements.canvas;this.data.orientation=(t=this.data.orientation,n=e,i=s.indexOf(t)>-1?s:l,o=i.indexOf(t),r=n/90%i.length,i[(i.length+o+r%i.length)%i.length]),C(a,this.elements.img,this.data.orientation),k.call(this,!0),S.call(this)}function oe(){var e,t;this.element.removeChild(this.elements.boundary),e=this.element,t="croppie-container",e.classList?e.classList.remove(t):e.className=e.className.replace(t,""),this.options.enableZoom&&this.element.removeChild(this.elements.zoomerWrap),delete this.elements}if(window.jQuery){var re=window.jQuery;re.fn.croppie=function(e){var t=typeof e;if("string"===t){var n=Array.prototype.slice.call(arguments,1),i=re(this).data("croppie");return"get"===e?i.get():"result"===e?i.result.apply(i,n):"bind"===e?i.bind.apply(i,n):this.each((function(){var t=re(this).data("croppie");if(t){var i=t[e];if(!re.isFunction(i))throw"Croppie "+e+" method not found";i.apply(t,n),"destroy"===e&&re(this).removeData("croppie")}}))}return this.each((function(){var t=new ae(this,e);t.$=re,re(this).data("croppie",t)}))}}function ae(e,t){if(e.className.indexOf("croppie-container")>-1)throw new Error("Croppie: Can't initialize croppie more than once");if(this.element=e,this.options=h(u(ae.defaults),t),"img"===this.element.tagName.toLowerCase()){var n=this.element;m(n,"cr-original-image"),f(n,{"aria-hidden":"true",alt:""});var i=document.createElement("div");this.element.parentNode.appendChild(i),i.appendChild(n),this.element=i,this.options.url=this.options.url||n.src}if(E.call(this),this.options.url){var o={url:this.options.url,points:this.options.points};delete this.options.url,delete this.options.points,J.call(this,o)}}return ae.defaults={viewport:{width:100,height:100,type:"square"},boundary:{},orientationControls:{enabled:!0,leftClass:"",rightClass:""},resizeControls:{width:!0,height:!0},customClass:"",showZoomer:!0,enableZoom:!0,enableResize:!1,mouseWheelZoom:!0,enableExif:!1,enforceBoundary:!0,enableOrientation:!1,enableKeyMovement:!0,update:function(){}},ae.globals={translate:"translate3d"},h(ae.prototype,{bind:function(e,t){return J.call(this,e,t)},get:function(){var e=G.call(this),t=e.points;return this.options.relative&&(t[0]/=this.elements.img.naturalWidth/100,t[1]/=this.elements.img.naturalHeight/100,t[2]/=this.elements.img.naturalWidth/100,t[3]/=this.elements.img.naturalHeight/100),e},result:function(e){return te.call(this,e)},refresh:function(){return ne.call(this)},setZoom:function(e){L.call(this,e),p(this.elements.zoomer)},rotate:function(e){ie.call(this,e)},destroy:function(){return oe.call(this)}}),ae})?o.call(t,n,t,e):o)||(e.exports=r)}).call(this,n(321).setImmediate)},321:function(e,t,n){(function(e){var i=void 0!==e&&e||"undefined"!=typeof self&&self||window,o=Function.prototype.apply;function r(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new r(o.call(setTimeout,i,arguments),clearTimeout)},t.setInterval=function(){return new r(o.call(setInterval,i,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},r.prototype.unref=r.prototype.ref=function(){},r.prototype.close=function(){this._clearFn.call(i,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(322),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(194))},322:function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var i,o,r,a,s,l=1,c={},h=!1,u=e.document,p=Object.getPrototypeOf&&Object.getPrototypeOf(e);p=p&&p.setTimeout?p:e,"[object process]"==={}.toString.call(e.process)?i=function(e){t.nextTick((function(){m(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((r=new MessageChannel).port1.onmessage=function(e){m(e.data)},i=function(e){r.port2.postMessage(e)}):u&&"onreadystatechange"in u.createElement("script")?(o=u.documentElement,i=function(e){var t=u.createElement("script");t.onreadystatechange=function(){m(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):i=function(e){setTimeout(m,0,e)}:(a="setImmediate$"+Math.random()+"$",s=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(a)&&m(+t.data.slice(a.length))},e.addEventListener?e.addEventListener("message",s,!1):e.attachEvent("onmessage",s),i=function(t){e.postMessage(a+t,"*")}),p.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n1)for(var n=1;ne;e++)r.call(this,this._deferreds[e]);this._deferreds=null}function c(e,t,n,i){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.resolve=n,this.reject=i}function h(e,t,n){var i=!1;try{e((function(e){i||(i=!0,t(e))}),(function(e){i||(i=!0,n(e))}))}catch(e){if(i)return;i=!0,n(e)}}var u=setTimeout,p="function"==typeof i&&i||function(e){u(e,1)},d=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)};o.prototype.catch=function(e){return this.then(null,e)},o.prototype.then=function(e,t){var n=this;return new o((function(i,o){r.call(n,new c(e,t,i,o))}))},o.all=function(){var e=Array.prototype.slice.call(1===arguments.length&&d(arguments[0])?arguments[0]:arguments);return new o((function(t,n){function i(r,a){try{if(a&&("object"==typeof a||"function"==typeof a)){var s=a.then;if("function"==typeof s)return void s.call(a,(function(e){i(r,e)}),n)}e[r]=a,0==--o&&t(e)}catch(e){n(e)}}if(0===e.length)return t([]);for(var o=e.length,r=0;ri;i++)e[i].then(t,n)}))},o._setImmediateFn=function(e){p=e},e.exports?e.exports=o:t.Promise||(t.Promise=o)}(this),"function"!=typeof window.CustomEvent&&function(){function e(e,t){t=t||{bubbles:!1,cancelable:!1,detail:void 0};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),n}e.prototype=window.Event.prototype,window.CustomEvent=e}(),HTMLCanvasElement.prototype.toBlob||Object.defineProperty(HTMLCanvasElement.prototype,"toBlob",{value:function(e,t,n){for(var i=atob(this.toDataURL(t,n).split(",")[1]),o=i.length,r=new Uint8Array(o),a=0;a=5){var r=n;n=i,i=r}return{width:n,height:i}}n=c("transform"),t=c("transformOrigin"),o=c("userSelect");var w={translate3d:{suffix:", 0px"},translate:{suffix:""}},y=function(e,t,n){this.x=parseFloat(e),this.y=parseFloat(t),this.scale=parseFloat(n)};y.parse=function(e){return e.style?y.parse(e.style[n]):e.indexOf("matrix")>-1||e.indexOf("none")>-1?y.fromMatrix(e):y.fromString(e)},y.fromMatrix=function(e){var t=e.substring(7).split(",");return t.length&&"none"!==e||(t=[1,0,0,1,0,0]),new y(v(t[4]),v(t[5]),parseFloat(t[0]))},y.fromString=function(e){var t=e.split(") "),n=t[0].substring(ae.globals.translate.length+1).split(","),i=t.length>1?t[1].substring(6):1,o=n.length>1?n[0]:0,r=n.length>1?n[1]:0;return new y(o,r,i)},y.prototype.toString=function(){var e=w[ae.globals.translate].suffix||"";return ae.globals.translate+"("+this.x+"px, "+this.y+"px"+e+") scale("+this.scale+")"};var b=function(e){if(!e||!e.style[t])return this.x=0,void(this.y=0);var n=e.style[t].split(" ");this.x=parseFloat(n[0]),this.y=parseFloat(n[1])};function x(e){return e.exifdata&&e.exifdata.Orientation?v(e.exifdata.Orientation):1}function C(e,t,n){var i=t.width,o=t.height,r=e.getContext("2d");switch(e.width=t.width,e.height=t.height,r.save(),n){case 2:r.translate(i,0),r.scale(-1,1);break;case 3:r.translate(i,o),r.rotate(180*Math.PI/180);break;case 4:r.translate(0,o),r.scale(1,-1);break;case 5:e.width=o,e.height=i,r.rotate(90*Math.PI/180),r.scale(1,-1);break;case 6:e.width=o,e.height=i,r.rotate(90*Math.PI/180),r.translate(0,-o);break;case 7:e.width=o,e.height=i,r.rotate(-90*Math.PI/180),r.translate(-i,o),r.scale(1,-1);break;case 8:e.width=o,e.height=i,r.translate(0,i),r.rotate(-90*Math.PI/180)}r.drawImage(t,0,0,i,o),r.restore()}function E(){var e,t,n,i,o,r,a=this.options.viewport.type?"cr-vp-"+this.options.viewport.type:null;this.options.useCanvas=this.options.enableOrientation||_.call(this),this.data={},this.elements={},e=this.elements.boundary=document.createElement("div"),n=this.elements.viewport=document.createElement("div"),t=this.elements.img=document.createElement("img"),i=this.elements.overlay=document.createElement("div"),this.options.useCanvas?(this.elements.canvas=document.createElement("canvas"),this.elements.preview=this.elements.canvas):this.elements.preview=t,m(e,"cr-boundary"),e.setAttribute("aria-dropeffect","none"),o=this.options.boundary.width,r=this.options.boundary.height,d(e,{width:o+(isNaN(o)?"":"px"),height:r+(isNaN(r)?"":"px")}),m(n,"cr-viewport"),a&&m(n,a),d(n,{width:this.options.viewport.width+"px",height:this.options.viewport.height+"px"}),n.setAttribute("tabindex",0),m(this.elements.preview,"cr-image"),f(this.elements.preview,{alt:"preview","aria-grabbed":"false"}),m(i,"cr-overlay"),this.element.appendChild(e),e.appendChild(this.elements.preview),e.appendChild(n),e.appendChild(i),m(this.element,"croppie-container"),this.options.customClass&&m(this.element,this.options.customClass),B.call(this),this.options.enableZoom&&I.call(this),this.options.enableResize&&T.call(this)}function _(){return this.options.enableExif&&window.EXIF}function T(){var e,t,n,i,r,a,s,l=this,c=document.createElement("div"),h=!1;function u(a){if((void 0===a.button||0===a.button)&&(a.preventDefault(),!h)){var s=l.elements.overlay.getBoundingClientRect();if(h=!0,t=a.pageX,n=a.pageY,e=-1!==a.currentTarget.className.indexOf("vertical")?"v":"h",i=s.width,r=s.height,a.touches){var c=a.touches[0];t=c.pageX,n=c.pageY}window.addEventListener("mousemove",p),window.addEventListener("touchmove",p),window.addEventListener("mouseup",f),window.addEventListener("touchend",f),document.body.style[o]="none"}}function p(o){var a=o.pageX,s=o.pageY;if(o.preventDefault(),o.touches){var h=o.touches[0];a=h.pageX,s=h.pageY}var u=a-t,p=s-n,m=l.options.viewport.height+p,f=l.options.viewport.width+u;"v"===e&&m>=50&&m<=r?(d(c,{height:m+"px"}),l.options.boundary.height+=p,d(l.elements.boundary,{height:l.options.boundary.height+"px"}),l.options.viewport.height+=p,d(l.elements.viewport,{height:l.options.viewport.height+"px"})):"h"===e&&f>=50&&f<=i&&(d(c,{width:f+"px"}),l.options.boundary.width+=u,d(l.elements.boundary,{width:l.options.boundary.width+"px"}),l.options.viewport.width+=u,d(l.elements.viewport,{width:l.options.viewport.width+"px"})),Z.call(l),S.call(l),k.call(l),Y.call(l),n=s,t=a}function f(){h=!1,window.removeEventListener("mousemove",p),window.removeEventListener("touchmove",p),window.removeEventListener("mouseup",f),window.removeEventListener("touchend",f),document.body.style[o]=""}m(c,"cr-resizer"),d(c,{width:this.options.viewport.width+"px",height:this.options.viewport.height+"px"}),this.options.resizeControls.height&&(m(a=document.createElement("div"),"cr-resizer-vertical"),c.appendChild(a)),this.options.resizeControls.width&&(m(s=document.createElement("div"),"cr-resizer-horisontal"),c.appendChild(s)),a&&(a.addEventListener("mousedown",u),a.addEventListener("touchstart",u)),s&&(s.addEventListener("mousedown",u),s.addEventListener("touchstart",u)),this.elements.boundary.appendChild(c)}function L(e){if(this.options.enableZoom){var t=this.elements.zoomer,n=Q(e,4);t.value=Math.max(parseFloat(t.min),Math.min(parseFloat(t.max),n)).toString()}}function I(){var e=this,t=e.elements.zoomerWrap=document.createElement("div"),n=e.elements.zoomer=document.createElement("input");function i(){M.call(e,{value:parseFloat(n.value),origin:new b(e.elements.preview),viewportRect:e.elements.viewport.getBoundingClientRect(),transform:y.parse(e.elements.preview)})}function o(t){var n,o;if("ctrl"===e.options.mouseWheelZoom&&!0!==t.ctrlKey)return 0;n=t.wheelDelta?t.wheelDelta/1200:t.deltaY?t.deltaY/1060:t.detail?t.detail/-60:0,o=e._currentZoom+n*e._currentZoom,t.preventDefault(),L.call(e,o),i.call(e)}m(t,"cr-slider-wrap"),m(n,"cr-slider"),n.type="range",n.step="0.0001",n.value="1",n.style.display=e.options.showZoomer?"":"none",n.setAttribute("aria-label","zoom"),e.element.appendChild(t),t.appendChild(n),e._currentZoom=1,e.elements.zoomer.addEventListener("input",i),e.elements.zoomer.addEventListener("change",i),e.options.mouseWheelZoom&&(e.elements.boundary.addEventListener("mousewheel",o),e.elements.boundary.addEventListener("DOMMouseScroll",o))}function M(e){var i=this,o=e?e.transform:y.parse(i.elements.preview),r=e?e.viewportRect:i.elements.viewport.getBoundingClientRect(),a=e?e.origin:new b(i.elements.preview);function s(){var e={};e[n]=o.toString(),e[t]=a.toString(),d(i.elements.preview,e)}if(i._currentZoom=e?e.value:i._currentZoom,o.scale=i._currentZoom,i.elements.zoomer.setAttribute("aria-valuenow",i._currentZoom),s(),i.options.enforceBoundary){var l=R.call(i,r),c=l.translate,h=l.origin;o.x>=c.maxX&&(a.x=h.minX,o.x=c.maxX),o.x<=c.minX&&(a.x=h.maxX,o.x=c.minX),o.y>=c.maxY&&(a.y=h.minY,o.y=c.maxY),o.y<=c.minY&&(a.y=h.maxY,o.y=c.minY)}s(),X.call(i),Y.call(i)}function R(e){var t=this._currentZoom,n=e.width,i=e.height,o=this.elements.boundary.clientWidth/2,r=this.elements.boundary.clientHeight/2,a=this.elements.preview.getBoundingClientRect(),s=a.width,l=a.height,c=n/2,h=i/2,u=-1*(c/t-o),p=-1*(h/t-r),d=1/t*c,m=1/t*h;return{translate:{maxX:u,minX:u-(s*(1/t)-n*(1/t)),maxY:p,minY:p-(l*(1/t)-i*(1/t))},origin:{maxX:s*(1/t)-d,minX:d,maxY:l*(1/t)-m,minY:m}}}function k(e){var i=this._currentZoom,o=this.elements.preview.getBoundingClientRect(),r=this.elements.viewport.getBoundingClientRect(),a=y.parse(this.elements.preview.style[n]),s=new b(this.elements.preview),l=r.top-o.top+r.height/2,c=r.left-o.left+r.width/2,h={},u={};if(e){var p=s.x,m=s.y,f=a.x,v=a.y;h.y=p,h.x=m,a.y=f,a.x=v}else h.y=l/i,h.x=c/i,u.y=(h.y-s.y)*(1-i),u.x=(h.x-s.x)*(1-i),a.x-=u.x,a.y-=u.y;var g={};g[t]=h.x+"px "+h.y+"px",g[n]=a.toString(),d(this.elements.preview,g)}function B(){var e,t,i,r,a,s=this,l=!1;function c(e,t){var n=s.elements.preview.getBoundingClientRect(),i=a.y+t,o=a.x+e;s.options.enforceBoundary?(r.top>n.top+t&&r.bottomn.left+e&&r.right1){var v=o.touches[0],g=o.touches[1],w=Math.sqrt((v.pageX-g.pageX)*(v.pageX-g.pageX)+(v.pageY-g.pageY)*(v.pageY-g.pageY));i||(i=w/s._currentZoom);var y=w/i;return L.call(s,y),void p(s.elements.zoomer)}c(u,m),f[n]=a.toString(),d(s.elements.preview,f),Z.call(s),t=l,e=r}function f(){h(l=!1),window.removeEventListener("mousemove",m),window.removeEventListener("touchmove",m),window.removeEventListener("mouseup",f),window.removeEventListener("touchend",f),document.body.style[o]="",k.call(s),Y.call(s),i=0}s.elements.overlay.addEventListener("mousedown",u),s.elements.viewport.addEventListener("keydown",(function(e){var t;if(!e.shiftKey||38!==e.keyCode&&40!==e.keyCode){if(s.options.enableKeyMovement&&e.keyCode>=37&&e.keyCode<=40){e.preventDefault();var l=function(e){switch(e){case 37:return[1,0];case 38:return[0,1];case 39:return[-1,0];case 40:return[0,-1]}}(e.keyCode);a=y.parse(s.elements.preview),document.body.style[o]="none",r=s.elements.viewport.getBoundingClientRect(),function(e){var t=e[0],r=e[1],l={};c(t,r),l[n]=a.toString(),d(s.elements.preview,l),Z.call(s),document.body.style[o]="",k.call(s),Y.call(s),i=0}(l)}}else t=38===e.keyCode?parseFloat(s.elements.zoomer.value)+parseFloat(s.elements.zoomer.step):parseFloat(s.elements.zoomer.value)-parseFloat(s.elements.zoomer.step),s.setZoom(t)})),s.elements.overlay.addEventListener("touchstart",u)}function Z(){if(this.elements){var e=this.elements.boundary.getBoundingClientRect(),t=this.elements.preview.getBoundingClientRect();d(this.elements.overlay,{width:t.width+"px",height:t.height+"px",top:t.top-e.top+"px",left:t.left-e.left+"px"})}}b.prototype.toString=function(){return this.x+"px "+this.y+"px"};var F,z,O,A,X=(F=Z,z=500,function(){var e=this,t=arguments,n=function(){A=null,O||F.apply(e,t)},i=O&&!A;clearTimeout(A),A=setTimeout(n,z),i&&F.apply(e,t)});function Y(){var e,t=this.get();j.call(this)&&(this.options.update.call(this,t),this.$&&"undefined"==typeof Prototype?this.$(this.element).trigger("update.croppie",t):(window.CustomEvent?e=new CustomEvent("update",{detail:t}):(e=document.createEvent("CustomEvent")).initCustomEvent("update",!0,!0,t),this.element.dispatchEvent(e)))}function j(){return this.elements.preview.offsetHeight>0&&this.elements.preview.offsetWidth>0}function W(){var e,i={},o=this.elements.preview,r=new y(0,0,1),a=new b;j.call(this)&&!this.data.bound&&(this.data.bound=!0,i[n]=r.toString(),i[t]=a.toString(),i.opacity=1,d(o,i),e=this.elements.preview.getBoundingClientRect(),this._originalImageWidth=e.width,this._originalImageHeight=e.height,this.data.orientation=x(this.elements.img),this.options.enableZoom?S.call(this,!0):this._currentZoom=1,r.scale=this._currentZoom,i[n]=r.toString(),d(o,i),this.data.points.length?H.call(this,this.data.points):N.call(this),k.call(this),Z.call(this))}function S(e){var t,n,i,o,r=Math.max(this.options.minZoom,0)||0,a=this.options.maxZoom||1.5,s=this.elements.zoomer,l=parseFloat(s.value),c=this.elements.boundary.getBoundingClientRect(),h=g(this.elements.img,this.data.orientation),u=this.elements.viewport.getBoundingClientRect();this.options.enforceBoundary&&(i=u.width/h.width,o=u.height/h.height,r=Math.max(i,o)),r>=a&&(a=r+1),s.min=Q(r,4),s.max=Q(a,4),!e&&(ls.max)?L.call(this,lthis._originalImageWidth&&(w=(d=this._originalImageWidth-u)/o*c),i<0&&(p=0,g=Math.abs(i)/r*h),m+p>this._originalImageHeight&&(y=(m=this._originalImageHeight-p)/r*h),l.drawImage(this.elements.preview,u,p,d,m,f,g,w,y),a&&(l.fillStyle="#fff",l.globalCompositeOperation="destination-in",l.beginPath(),l.arc(s.width/2,s.height/2,s.width/2,0,2*Math.PI,!0),l.closePath(),l.fill()),s}function q(e){var t=e.points,n=document.createElement("div"),i=document.createElement("img"),o=t[2]-t[0],r=t[3]-t[1];return m(n,"croppie-result"),n.appendChild(i),d(i,{left:-1*t[0]+"px",top:-1*t[1]+"px"}),i.src=e.url,d(n,{width:o+"px",height:r+"px"}),n}function $(e){return D.call(this,e).toDataURL(e.format,e.quality)}function K(e){var t=this;return new Promise((function(n){D.call(t,e).toBlob((function(e){n(e)}),e.format,e.quality)}))}function U(e){this.elements.img.parentNode&&(Array.prototype.forEach.call(this.elements.img.classList,(function(t){e.classList.add(t)})),this.elements.img.parentNode.replaceChild(e,this.elements.img),this.elements.preview=e),this.elements.img=e}function J(e,t){var n,i,o,r,a=this,s=[],l=null,c=_.call(a);if("string"==typeof e)n=e,e={};else if(Array.isArray(e))s=e.slice();else{if(void 0===e&&a.data.url)return W.call(a),Y.call(a),null;n=e.url,s=e.points||[],l=void 0===e.zoom?null:e.zoom}return a.data.bound=!1,a.data.url=n||a.data.url,a.data.boundZoom=l,(i=n,o=c,r=new Image,r.style.opacity="0",new Promise((function(e,t){function n(){r.style.opacity="1",setTimeout((function(){e(r)}),1)}r.removeAttribute("crossOrigin"),i.match(/^https?:\/\/|^\/\//)&&r.setAttribute("crossOrigin","anonymous"),r.onload=function(){o?EXIF.getData(r,(function(){n()})):n()},r.onerror=function(e){r.style.opacity=1,setTimeout((function(){t(e)}),1)},r.src=i}))).then((function(n){if(U.call(a,n),s.length)a.options.relative&&(s=[s[0]*n.naturalWidth/100,s[1]*n.naturalHeight/100,s[2]*n.naturalWidth/100,s[3]*n.naturalHeight/100]);else{var i,o,r=g(n),l=a.elements.viewport.getBoundingClientRect(),c=l.width/l.height;r.width/r.height>c?i=(o=r.height)*c:(i=r.width,o=r.height/c);var h=(r.width-i)/2,u=(r.height-o)/2,p=h+i,d=u+o;a.data.points=[h,u,p,d]}a.data.points=s.map((function(e){return parseFloat(e)})),a.options.useCanvas&&P.call(a,e.orientation),W.call(a),Y.call(a),t&&t()}))}function Q(e,t){return parseFloat(e).toFixed(t||0)}function G(){var e=this.elements.preview.getBoundingClientRect(),t=this.elements.viewport.getBoundingClientRect(),n=t.left-e.left,i=t.top-e.top,o=(t.width-this.elements.viewport.offsetWidth)/2,r=(t.height-this.elements.viewport.offsetHeight)/2,a=n+this.elements.viewport.offsetWidth+o,s=i+this.elements.viewport.offsetHeight+r,l=this._currentZoom;(l===1/0||isNaN(l))&&(l=1);var c=this.options.enforceBoundary?0:Number.NEGATIVE_INFINITY;return n=Math.max(c,n/l),i=Math.max(c,i/l),a=Math.max(c,a/l),s=Math.max(c,s/l),{points:[Q(n),Q(i),Q(a),Q(s)],zoom:l,orientation:this.data.orientation}}var V={type:"canvas",format:"png",quality:1},ee=["jpeg","webp","png"];function te(e){var t=this,n=G.call(t),i=h(u(V),u(e)),o="string"==typeof e?e:i.type||"base64",r=i.size||"viewport",a=i.format,s=i.quality,l=i.backgroundColor,c="boolean"==typeof i.circle?i.circle:"circle"===t.options.viewport.type,p=t.elements.viewport.getBoundingClientRect(),d=p.width/p.height;return"viewport"===r?(n.outputWidth=p.width,n.outputHeight=p.height):"object"==typeof r&&(r.width&&r.height?(n.outputWidth=r.width,n.outputHeight=r.height):r.width?(n.outputWidth=r.width,n.outputHeight=r.width/d):r.height&&(n.outputWidth=r.height*d,n.outputHeight=r.height)),ee.indexOf(a)>-1&&(n.format="image/"+a,n.quality=s),n.circle=c,n.url=t.data.url,n.backgroundColor=l,new Promise((function(e){switch(o.toLowerCase()){case"rawcanvas":e(D.call(t,n));break;case"canvas":case"base64":e($.call(t,n));break;case"blob":K.call(t,n).then(e);break;default:e(q.call(t,n))}}))}function ne(){W.call(this)}function ie(e){if(!this.options.useCanvas||!this.options.enableOrientation)throw"Croppie: Cannot rotate without enableOrientation && EXIF.js included";var t,n,i,o,r,a=this.elements.canvas;this.data.orientation=(t=this.data.orientation,n=e,i=s.indexOf(t)>-1?s:l,o=i.indexOf(t),r=n/90%i.length,i[(i.length+o+r%i.length)%i.length]),C(a,this.elements.img,this.data.orientation),k.call(this,!0),S.call(this)}function oe(){var e,t;this.element.removeChild(this.elements.boundary),e=this.element,t="croppie-container",e.classList?e.classList.remove(t):e.className=e.className.replace(t,""),this.options.enableZoom&&this.element.removeChild(this.elements.zoomerWrap),delete this.elements}if(window.jQuery){var re=window.jQuery;re.fn.croppie=function(e){var t=typeof e;if("string"===t){var n=Array.prototype.slice.call(arguments,1),i=re(this).data("croppie");return"get"===e?i.get():"result"===e?i.result.apply(i,n):"bind"===e?i.bind.apply(i,n):this.each((function(){var t=re(this).data("croppie");if(t){var i=t[e];if(!re.isFunction(i))throw"Croppie "+e+" method not found";i.apply(t,n),"destroy"===e&&re(this).removeData("croppie")}}))}return this.each((function(){var t=new ae(this,e);t.$=re,re(this).data("croppie",t)}))}}function ae(e,t){if(e.className.indexOf("croppie-container")>-1)throw new Error("Croppie: Can't initialize croppie more than once");if(this.element=e,this.options=h(u(ae.defaults),t),"img"===this.element.tagName.toLowerCase()){var n=this.element;m(n,"cr-original-image"),f(n,{"aria-hidden":"true",alt:""});var i=document.createElement("div");this.element.parentNode.appendChild(i),i.appendChild(n),this.element=i,this.options.url=this.options.url||n.src}if(E.call(this),this.options.url){var o={url:this.options.url,points:this.options.points};delete this.options.url,delete this.options.points,J.call(this,o)}}return ae.defaults={viewport:{width:100,height:100,type:"square"},boundary:{},orientationControls:{enabled:!0,leftClass:"",rightClass:""},resizeControls:{width:!0,height:!0},customClass:"",showZoomer:!0,enableZoom:!0,enableResize:!1,mouseWheelZoom:!0,enableExif:!1,enforceBoundary:!0,enableOrientation:!1,enableKeyMovement:!0,update:function(){}},ae.globals={translate:"translate3d"},h(ae.prototype,{bind:function(e,t){return J.call(this,e,t)},get:function(){var e=G.call(this),t=e.points;return this.options.relative&&(t[0]/=this.elements.img.naturalWidth/100,t[1]/=this.elements.img.naturalHeight/100,t[2]/=this.elements.img.naturalWidth/100,t[3]/=this.elements.img.naturalHeight/100),e},result:function(e){return te.call(this,e)},refresh:function(){return ne.call(this)},setZoom:function(e){L.call(this,e),p(this.elements.zoomer)},rotate:function(e){ie.call(this,e)},destroy:function(){return oe.call(this)}}),ae})?o.call(t,n,t,e):o)||(e.exports=r)}).call(this,n(327).setImmediate)},327:function(e,t,n){(function(e){var i=void 0!==e&&e||"undefined"!=typeof self&&self||window,o=Function.prototype.apply;function r(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new r(o.call(setTimeout,i,arguments),clearTimeout)},t.setInterval=function(){return new r(o.call(setInterval,i,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},r.prototype.unref=r.prototype.ref=function(){},r.prototype.close=function(){this._clearFn.call(i,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(328),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(197))},328:function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var i,o,r,a,s,l=1,c={},h=!1,u=e.document,p=Object.getPrototypeOf&&Object.getPrototypeOf(e);p=p&&p.setTimeout?p:e,"[object process]"==={}.toString.call(e.process)?i=function(e){t.nextTick((function(){m(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((r=new MessageChannel).port1.onmessage=function(e){m(e.data)},i=function(e){r.port2.postMessage(e)}):u&&"onreadystatechange"in u.createElement("script")?(o=u.documentElement,i=function(e){var t=u.createElement("script");t.onreadystatechange=function(){m(e),t.onreadystatechange=null,o.removeChild(t),t=null},o.appendChild(t)}):i=function(e){setTimeout(m,0,e)}:(a="setImmediate$"+Math.random()+"$",s=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(a)&&m(+t.data.slice(a.length))},e.addEventListener?e.addEventListener("message",s,!1):e.attachEvent("onmessage",s),i=function(t){e.postMessage(a+t,"*")}),p.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n1)for(var n=1;na;a++)d.call(this,this._deferreds[a]);this._deferreds=null}function h(a,b,c,d){this.onFulfilled=\"function\"===typeof a?a:null,this.onRejected=\"function\"===typeof b?b:null,this.resolve=c,this.reject=d}function i(a,b,c){var d=!1;try{a(function(a){d||(d=!0,b(a))},function(a){d||(d=!0,c(a))})}catch(e){if(d)return;d=!0,c(e)}}var j=setTimeout,k=\"function\"===typeof setImmediate&&setImmediate||function(a){j(a,1)},l=Array.isArray||function(a){return\"[object Array]\"===Object.prototype.toString.call(a)};c.prototype[\"catch\"]=function(a){return this.then(null,a)},c.prototype.then=function(a,b){var e=this;return new c(function(c,f){d.call(e,new h(a,b,c,f))})},c.all=function(){var a=Array.prototype.slice.call(1===arguments.length&&l(arguments[0])?arguments[0]:arguments);return new c(function(b,c){function d(f,g){try{if(g&&(\"object\"===typeof g||\"function\"===typeof g)){var h=g.then;if(\"function\"===typeof h)return void h.call(g,function(a){d(f,a)},c)}a[f]=g,0===--e&&b(a)}catch(i){c(i)}}if(0===a.length)return b([]);for(var e=a.length,f=0;fd;d++)a[d].then(b,c)})},c._setImmediateFn=function(a){k=a},\"undefined\"!==typeof module&&module.exports?module.exports=c:a.Promise||(a.Promise=c)}(this);\r\n }\r\n\r\n if ( typeof window.CustomEvent !== \"function\" ) {\r\n (function(){\r\n function CustomEvent ( event, params ) {\r\n params = params || { bubbles: false, cancelable: false, detail: undefined };\r\n var evt = document.createEvent( 'CustomEvent' );\r\n evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );\r\n return evt;\r\n }\r\n CustomEvent.prototype = window.Event.prototype;\r\n window.CustomEvent = CustomEvent;\r\n }());\r\n }\r\n\r\n if (!HTMLCanvasElement.prototype.toBlob) {\r\n Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {\r\n value: function (callback, type, quality) {\r\n var binStr = atob( this.toDataURL(type, quality).split(',')[1] ),\r\n len = binStr.length,\r\n arr = new Uint8Array(len);\r\n\r\n for (var i=0; i -1 ? EXIF_NORM : EXIF_FLIP,\r\n index = arr.indexOf(ornt),\r\n offset = (rotate / 90) % arr.length;// 180 = 2%4 = 2 shift exif by 2 indexes\r\n\r\n return arr[(arr.length + index + (offset % arr.length)) % arr.length];\r\n }\r\n\r\n // Credits to : Andrew Dupont - http://andrewdupont.net/2009/08/28/deep-extending-objects-in-javascript/\r\n function deepExtend(destination, source) {\r\n destination = destination || {};\r\n for (var property in source) {\r\n if (source[property] && source[property].constructor && source[property].constructor === Object) {\r\n destination[property] = destination[property] || {};\r\n deepExtend(destination[property], source[property]);\r\n } else {\r\n destination[property] = source[property];\r\n }\r\n }\r\n return destination;\r\n }\r\n\r\n function clone(object) {\r\n return deepExtend({}, object);\r\n }\r\n\r\n function debounce(func, wait, immediate) {\r\n var timeout;\r\n return function () {\r\n var context = this, args = arguments;\r\n var later = function () {\r\n timeout = null;\r\n if (!immediate) func.apply(context, args);\r\n };\r\n var callNow = immediate && !timeout;\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n if (callNow) func.apply(context, args);\r\n };\r\n }\r\n\r\n function dispatchChange(element) {\r\n if (\"createEvent\" in document) {\r\n var evt = document.createEvent(\"HTMLEvents\");\r\n evt.initEvent(\"change\", false, true);\r\n element.dispatchEvent(evt);\r\n }\r\n else {\r\n element.fireEvent(\"onchange\");\r\n }\r\n }\r\n\r\n //http://jsperf.com/vanilla-css\r\n function css(el, styles, val) {\r\n if (typeof (styles) === 'string') {\r\n var tmp = styles;\r\n styles = {};\r\n styles[tmp] = val;\r\n }\r\n\r\n for (var prop in styles) {\r\n el.style[prop] = styles[prop];\r\n }\r\n }\r\n\r\n function addClass(el, c) {\r\n if (el.classList) {\r\n el.classList.add(c);\r\n }\r\n else {\r\n el.className += ' ' + c;\r\n }\r\n }\r\n\r\n function removeClass(el, c) {\r\n if (el.classList) {\r\n el.classList.remove(c);\r\n }\r\n else {\r\n el.className = el.className.replace(c, '');\r\n }\r\n }\r\n\r\n function setAttributes(el, attrs) {\r\n for (var key in attrs) {\r\n el.setAttribute(key, attrs[key]);\r\n }\r\n }\r\n\r\n function num(v) {\r\n return parseInt(v, 10);\r\n }\r\n\r\n /* Utilities */\r\n function loadImage(src, doExif) {\r\n var img = new Image();\r\n img.style.opacity = '0';\r\n return new Promise(function (resolve, reject) {\r\n function _resolve() {\r\n img.style.opacity = '1';\r\n setTimeout(function () {\r\n resolve(img);\r\n }, 1);\r\n }\r\n\r\n img.removeAttribute('crossOrigin');\r\n if (src.match(/^https?:\\/\\/|^\\/\\//)) {\r\n img.setAttribute('crossOrigin', 'anonymous');\r\n }\r\n\r\n img.onload = function () {\r\n if (doExif) {\r\n EXIF.getData(img, function () {\r\n _resolve();\r\n });\r\n }\r\n else {\r\n _resolve();\r\n }\r\n };\r\n img.onerror = function (ev) {\r\n img.style.opacity = 1;\r\n setTimeout(function () {\r\n reject(ev);\r\n }, 1);\r\n };\r\n img.src = src;\r\n });\r\n }\r\n\r\n function naturalImageDimensions(img, ornt) {\r\n var w = img.naturalWidth;\r\n var h = img.naturalHeight;\r\n var orient = ornt || getExifOrientation(img);\r\n if (orient && orient >= 5) {\r\n var x= w;\r\n w = h;\r\n h = x;\r\n }\r\n return { width: w, height: h };\r\n }\r\n\r\n /* CSS Transform Prototype */\r\n var TRANSLATE_OPTS = {\r\n 'translate3d': {\r\n suffix: ', 0px'\r\n },\r\n 'translate': {\r\n suffix: ''\r\n }\r\n };\r\n var Transform = function (x, y, scale) {\r\n this.x = parseFloat(x);\r\n this.y = parseFloat(y);\r\n this.scale = parseFloat(scale);\r\n };\r\n\r\n Transform.parse = function (v) {\r\n if (v.style) {\r\n return Transform.parse(v.style[CSS_TRANSFORM]);\r\n }\r\n else if (v.indexOf('matrix') > -1 || v.indexOf('none') > -1) {\r\n return Transform.fromMatrix(v);\r\n }\r\n else {\r\n return Transform.fromString(v);\r\n }\r\n };\r\n\r\n Transform.fromMatrix = function (v) {\r\n var vals = v.substring(7).split(',');\r\n if (!vals.length || v === 'none') {\r\n vals = [1, 0, 0, 1, 0, 0];\r\n }\r\n\r\n return new Transform(num(vals[4]), num(vals[5]), parseFloat(vals[0]));\r\n };\r\n\r\n Transform.fromString = function (v) {\r\n var values = v.split(') '),\r\n translate = values[0].substring(Croppie.globals.translate.length + 1).split(','),\r\n scale = values.length > 1 ? values[1].substring(6) : 1,\r\n x = translate.length > 1 ? translate[0] : 0,\r\n y = translate.length > 1 ? translate[1] : 0;\r\n\r\n return new Transform(x, y, scale);\r\n };\r\n\r\n Transform.prototype.toString = function () {\r\n var suffix = TRANSLATE_OPTS[Croppie.globals.translate].suffix || '';\r\n return Croppie.globals.translate + '(' + this.x + 'px, ' + this.y + 'px' + suffix + ') scale(' + this.scale + ')';\r\n };\r\n\r\n var TransformOrigin = function (el) {\r\n if (!el || !el.style[CSS_TRANS_ORG]) {\r\n this.x = 0;\r\n this.y = 0;\r\n return;\r\n }\r\n var css = el.style[CSS_TRANS_ORG].split(' ');\r\n this.x = parseFloat(css[0]);\r\n this.y = parseFloat(css[1]);\r\n };\r\n\r\n TransformOrigin.prototype.toString = function () {\r\n return this.x + 'px ' + this.y + 'px';\r\n };\r\n\r\n function getExifOrientation (img) {\r\n return img.exifdata && img.exifdata.Orientation ? num(img.exifdata.Orientation) : 1;\r\n }\r\n\r\n function drawCanvas(canvas, img, orientation) {\r\n var width = img.width,\r\n height = img.height,\r\n ctx = canvas.getContext('2d');\r\n\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n ctx.save();\r\n switch (orientation) {\r\n case 2:\r\n ctx.translate(width, 0);\r\n ctx.scale(-1, 1);\r\n break;\r\n\r\n case 3:\r\n ctx.translate(width, height);\r\n ctx.rotate(180*Math.PI/180);\r\n break;\r\n\r\n case 4:\r\n ctx.translate(0, height);\r\n ctx.scale(1, -1);\r\n break;\r\n\r\n case 5:\r\n canvas.width = height;\r\n canvas.height = width;\r\n ctx.rotate(90*Math.PI/180);\r\n ctx.scale(1, -1);\r\n break;\r\n\r\n case 6:\r\n canvas.width = height;\r\n canvas.height = width;\r\n ctx.rotate(90*Math.PI/180);\r\n ctx.translate(0, -height);\r\n break;\r\n\r\n case 7:\r\n canvas.width = height;\r\n canvas.height = width;\r\n ctx.rotate(-90*Math.PI/180);\r\n ctx.translate(-width, height);\r\n ctx.scale(1, -1);\r\n break;\r\n\r\n case 8:\r\n canvas.width = height;\r\n canvas.height = width;\r\n ctx.translate(0, width);\r\n ctx.rotate(-90*Math.PI/180);\r\n break;\r\n }\r\n ctx.drawImage(img, 0,0, width, height);\r\n ctx.restore();\r\n }\r\n\r\n /* Private Methods */\r\n function _create() {\r\n var self = this,\r\n contClass = 'croppie-container',\r\n customViewportClass = self.options.viewport.type ? 'cr-vp-' + self.options.viewport.type : null,\r\n boundary, img, viewport, overlay, bw, bh;\r\n\r\n self.options.useCanvas = self.options.enableOrientation || _hasExif.call(self);\r\n // Properties on class\r\n self.data = {};\r\n self.elements = {};\r\n\r\n boundary = self.elements.boundary = document.createElement('div');\r\n viewport = self.elements.viewport = document.createElement('div');\r\n img = self.elements.img = document.createElement('img');\r\n overlay = self.elements.overlay = document.createElement('div');\r\n\r\n if (self.options.useCanvas) {\r\n self.elements.canvas = document.createElement('canvas');\r\n self.elements.preview = self.elements.canvas;\r\n }\r\n else {\r\n self.elements.preview = img;\r\n }\r\n\r\n addClass(boundary, 'cr-boundary');\r\n boundary.setAttribute('aria-dropeffect', 'none');\r\n bw = self.options.boundary.width;\r\n bh = self.options.boundary.height;\r\n css(boundary, {\r\n width: (bw + (isNaN(bw) ? '' : 'px')),\r\n height: (bh + (isNaN(bh) ? '' : 'px'))\r\n });\r\n\r\n addClass(viewport, 'cr-viewport');\r\n if (customViewportClass) {\r\n addClass(viewport, customViewportClass);\r\n }\r\n css(viewport, {\r\n width: self.options.viewport.width + 'px',\r\n height: self.options.viewport.height + 'px'\r\n });\r\n viewport.setAttribute('tabindex', 0);\r\n\r\n addClass(self.elements.preview, 'cr-image');\r\n setAttributes(self.elements.preview, { 'alt': 'preview', 'aria-grabbed': 'false' });\r\n addClass(overlay, 'cr-overlay');\r\n\r\n self.element.appendChild(boundary);\r\n boundary.appendChild(self.elements.preview);\r\n boundary.appendChild(viewport);\r\n boundary.appendChild(overlay);\r\n\r\n addClass(self.element, contClass);\r\n if (self.options.customClass) {\r\n addClass(self.element, self.options.customClass);\r\n }\r\n\r\n _initDraggable.call(this);\r\n\r\n if (self.options.enableZoom) {\r\n _initializeZoom.call(self);\r\n }\r\n\r\n // if (self.options.enableOrientation) {\r\n // _initRotationControls.call(self);\r\n // }\r\n\r\n if (self.options.enableResize) {\r\n _initializeResize.call(self);\r\n }\r\n }\r\n\r\n // function _initRotationControls () {\r\n // var self = this,\r\n // wrap, btnLeft, btnRight, iLeft, iRight;\r\n\r\n // wrap = document.createElement('div');\r\n // self.elements.orientationBtnLeft = btnLeft = document.createElement('button');\r\n // self.elements.orientationBtnRight = btnRight = document.createElement('button');\r\n\r\n // wrap.appendChild(btnLeft);\r\n // wrap.appendChild(btnRight);\r\n\r\n // iLeft = document.createElement('i');\r\n // iRight = document.createElement('i');\r\n // btnLeft.appendChild(iLeft);\r\n // btnRight.appendChild(iRight);\r\n\r\n // addClass(wrap, 'cr-rotate-controls');\r\n // addClass(btnLeft, 'cr-rotate-l');\r\n // addClass(btnRight, 'cr-rotate-r');\r\n\r\n // self.elements.boundary.appendChild(wrap);\r\n\r\n // btnLeft.addEventListener('click', function () {\r\n // self.rotate(-90);\r\n // });\r\n // btnRight.addEventListener('click', function () {\r\n // self.rotate(90);\r\n // });\r\n // }\r\n\r\n function _hasExif() {\r\n return this.options.enableExif && window.EXIF;\r\n }\r\n\r\n function _initializeResize () {\r\n var self = this;\r\n var wrap = document.createElement('div');\r\n var isDragging = false;\r\n var direction;\r\n var originalX;\r\n var originalY;\r\n var minSize = 50;\r\n var maxWidth;\r\n var maxHeight;\r\n var vr;\r\n var hr;\r\n\r\n addClass(wrap, 'cr-resizer');\r\n css(wrap, {\r\n width: this.options.viewport.width + 'px',\r\n height: this.options.viewport.height + 'px'\r\n });\r\n\r\n if (this.options.resizeControls.height) {\r\n vr = document.createElement('div');\r\n addClass(vr, 'cr-resizer-vertical');\r\n wrap.appendChild(vr);\r\n }\r\n\r\n if (this.options.resizeControls.width) {\r\n hr = document.createElement('div');\r\n addClass(hr, 'cr-resizer-horisontal');\r\n wrap.appendChild(hr);\r\n }\r\n\r\n function mouseDown(ev) {\r\n if (ev.button !== undefined && ev.button !== 0) return;\r\n\r\n ev.preventDefault();\r\n if (isDragging) {\r\n return;\r\n }\r\n\r\n var overlayRect = self.elements.overlay.getBoundingClientRect();\r\n\r\n isDragging = true;\r\n originalX = ev.pageX;\r\n originalY = ev.pageY;\r\n direction = ev.currentTarget.className.indexOf('vertical') !== -1 ? 'v' : 'h';\r\n maxWidth = overlayRect.width;\r\n maxHeight = overlayRect.height;\r\n\r\n if (ev.touches) {\r\n var touches = ev.touches[0];\r\n originalX = touches.pageX;\r\n originalY = touches.pageY;\r\n }\r\n\r\n window.addEventListener('mousemove', mouseMove);\r\n window.addEventListener('touchmove', mouseMove);\r\n window.addEventListener('mouseup', mouseUp);\r\n window.addEventListener('touchend', mouseUp);\r\n document.body.style[CSS_USERSELECT] = 'none';\r\n }\r\n\r\n function mouseMove(ev) {\r\n var pageX = ev.pageX;\r\n var pageY = ev.pageY;\r\n\r\n ev.preventDefault();\r\n\r\n if (ev.touches) {\r\n var touches = ev.touches[0];\r\n pageX = touches.pageX;\r\n pageY = touches.pageY;\r\n }\r\n\r\n var deltaX = pageX - originalX;\r\n var deltaY = pageY - originalY;\r\n var newHeight = self.options.viewport.height + deltaY;\r\n var newWidth = self.options.viewport.width + deltaX;\r\n\r\n if (direction === 'v' && newHeight >= minSize && newHeight <= maxHeight) {\r\n css(wrap, {\r\n height: newHeight + 'px'\r\n });\r\n\r\n self.options.boundary.height += deltaY;\r\n css(self.elements.boundary, {\r\n height: self.options.boundary.height + 'px'\r\n });\r\n\r\n self.options.viewport.height += deltaY;\r\n css(self.elements.viewport, {\r\n height: self.options.viewport.height + 'px'\r\n });\r\n }\r\n else if (direction === 'h' && newWidth >= minSize && newWidth <= maxWidth) {\r\n css(wrap, {\r\n width: newWidth + 'px'\r\n });\r\n\r\n self.options.boundary.width += deltaX;\r\n css(self.elements.boundary, {\r\n width: self.options.boundary.width + 'px'\r\n });\r\n\r\n self.options.viewport.width += deltaX;\r\n css(self.elements.viewport, {\r\n width: self.options.viewport.width + 'px'\r\n });\r\n }\r\n\r\n _updateOverlay.call(self);\r\n _updateZoomLimits.call(self);\r\n _updateCenterPoint.call(self);\r\n _triggerUpdate.call(self);\r\n originalY = pageY;\r\n originalX = pageX;\r\n }\r\n\r\n function mouseUp() {\r\n isDragging = false;\r\n window.removeEventListener('mousemove', mouseMove);\r\n window.removeEventListener('touchmove', mouseMove);\r\n window.removeEventListener('mouseup', mouseUp);\r\n window.removeEventListener('touchend', mouseUp);\r\n document.body.style[CSS_USERSELECT] = '';\r\n }\r\n\r\n if (vr) {\r\n vr.addEventListener('mousedown', mouseDown);\r\n vr.addEventListener('touchstart', mouseDown);\r\n }\r\n\r\n if (hr) {\r\n hr.addEventListener('mousedown', mouseDown);\r\n hr.addEventListener('touchstart', mouseDown);\r\n }\r\n\r\n this.elements.boundary.appendChild(wrap);\r\n }\r\n\r\n function _setZoomerVal(v) {\r\n if (this.options.enableZoom) {\r\n var z = this.elements.zoomer,\r\n val = fix(v, 4);\r\n\r\n z.value = Math.max(parseFloat(z.min), Math.min(parseFloat(z.max), val)).toString();\r\n }\r\n }\r\n\r\n function _initializeZoom() {\r\n var self = this,\r\n wrap = self.elements.zoomerWrap = document.createElement('div'),\r\n zoomer = self.elements.zoomer = document.createElement('input');\r\n\r\n addClass(wrap, 'cr-slider-wrap');\r\n addClass(zoomer, 'cr-slider');\r\n zoomer.type = 'range';\r\n zoomer.step = '0.0001';\r\n zoomer.value = '1';\r\n zoomer.style.display = self.options.showZoomer ? '' : 'none';\r\n zoomer.setAttribute('aria-label', 'zoom');\r\n\r\n self.element.appendChild(wrap);\r\n wrap.appendChild(zoomer);\r\n\r\n self._currentZoom = 1;\r\n\r\n function change() {\r\n _onZoom.call(self, {\r\n value: parseFloat(zoomer.value),\r\n origin: new TransformOrigin(self.elements.preview),\r\n viewportRect: self.elements.viewport.getBoundingClientRect(),\r\n transform: Transform.parse(self.elements.preview)\r\n });\r\n }\r\n\r\n function scroll(ev) {\r\n var delta, targetZoom;\r\n\r\n if(self.options.mouseWheelZoom === 'ctrl' && ev.ctrlKey !== true){\r\n return 0; \r\n } else if (ev.wheelDelta) {\r\n delta = ev.wheelDelta / 1200; //wheelDelta min: -120 max: 120 // max x 10 x 2\r\n } else if (ev.deltaY) {\r\n delta = ev.deltaY / 1060; //deltaY min: -53 max: 53 // max x 10 x 2\r\n } else if (ev.detail) {\r\n delta = ev.detail / -60; //delta min: -3 max: 3 // max x 10 x 2\r\n } else {\r\n delta = 0;\r\n }\r\n\r\n targetZoom = self._currentZoom + (delta * self._currentZoom);\r\n\r\n ev.preventDefault();\r\n _setZoomerVal.call(self, targetZoom);\r\n change.call(self);\r\n }\r\n\r\n self.elements.zoomer.addEventListener('input', change);// this is being fired twice on keypress\r\n self.elements.zoomer.addEventListener('change', change);\r\n\r\n if (self.options.mouseWheelZoom) {\r\n self.elements.boundary.addEventListener('mousewheel', scroll);\r\n self.elements.boundary.addEventListener('DOMMouseScroll', scroll);\r\n }\r\n }\r\n\r\n function _onZoom(ui) {\r\n var self = this,\r\n transform = ui ? ui.transform : Transform.parse(self.elements.preview),\r\n vpRect = ui ? ui.viewportRect : self.elements.viewport.getBoundingClientRect(),\r\n origin = ui ? ui.origin : new TransformOrigin(self.elements.preview);\r\n\r\n function applyCss() {\r\n var transCss = {};\r\n transCss[CSS_TRANSFORM] = transform.toString();\r\n transCss[CSS_TRANS_ORG] = origin.toString();\r\n css(self.elements.preview, transCss);\r\n }\r\n\r\n self._currentZoom = ui ? ui.value : self._currentZoom;\r\n transform.scale = self._currentZoom;\r\n self.elements.zoomer.setAttribute('aria-valuenow', self._currentZoom);\r\n applyCss();\r\n\r\n if (self.options.enforceBoundary) {\r\n var boundaries = _getVirtualBoundaries.call(self, vpRect),\r\n transBoundaries = boundaries.translate,\r\n oBoundaries = boundaries.origin;\r\n\r\n if (transform.x >= transBoundaries.maxX) {\r\n origin.x = oBoundaries.minX;\r\n transform.x = transBoundaries.maxX;\r\n }\r\n\r\n if (transform.x <= transBoundaries.minX) {\r\n origin.x = oBoundaries.maxX;\r\n transform.x = transBoundaries.minX;\r\n }\r\n\r\n if (transform.y >= transBoundaries.maxY) {\r\n origin.y = oBoundaries.minY;\r\n transform.y = transBoundaries.maxY;\r\n }\r\n\r\n if (transform.y <= transBoundaries.minY) {\r\n origin.y = oBoundaries.maxY;\r\n transform.y = transBoundaries.minY;\r\n }\r\n }\r\n applyCss();\r\n _debouncedOverlay.call(self);\r\n _triggerUpdate.call(self);\r\n }\r\n\r\n function _getVirtualBoundaries(viewport) {\r\n var self = this,\r\n scale = self._currentZoom,\r\n vpWidth = viewport.width,\r\n vpHeight = viewport.height,\r\n centerFromBoundaryX = self.elements.boundary.clientWidth / 2,\r\n centerFromBoundaryY = self.elements.boundary.clientHeight / 2,\r\n imgRect = self.elements.preview.getBoundingClientRect(),\r\n curImgWidth = imgRect.width,\r\n curImgHeight = imgRect.height,\r\n halfWidth = vpWidth / 2,\r\n halfHeight = vpHeight / 2;\r\n\r\n var maxX = ((halfWidth / scale) - centerFromBoundaryX) * -1;\r\n var minX = maxX - ((curImgWidth * (1 / scale)) - (vpWidth * (1 / scale)));\r\n\r\n var maxY = ((halfHeight / scale) - centerFromBoundaryY) * -1;\r\n var minY = maxY - ((curImgHeight * (1 / scale)) - (vpHeight * (1 / scale)));\r\n\r\n var originMinX = (1 / scale) * halfWidth;\r\n var originMaxX = (curImgWidth * (1 / scale)) - originMinX;\r\n\r\n var originMinY = (1 / scale) * halfHeight;\r\n var originMaxY = (curImgHeight * (1 / scale)) - originMinY;\r\n\r\n return {\r\n translate: {\r\n maxX: maxX,\r\n minX: minX,\r\n maxY: maxY,\r\n minY: minY\r\n },\r\n origin: {\r\n maxX: originMaxX,\r\n minX: originMinX,\r\n maxY: originMaxY,\r\n minY: originMinY\r\n }\r\n };\r\n }\r\n\r\n function _updateCenterPoint(rotate) {\r\n var self = this,\r\n scale = self._currentZoom,\r\n data = self.elements.preview.getBoundingClientRect(),\r\n vpData = self.elements.viewport.getBoundingClientRect(),\r\n transform = Transform.parse(self.elements.preview.style[CSS_TRANSFORM]),\r\n pc = new TransformOrigin(self.elements.preview),\r\n top = (vpData.top - data.top) + (vpData.height / 2),\r\n left = (vpData.left - data.left) + (vpData.width / 2),\r\n center = {},\r\n adj = {};\r\n\r\n if (rotate) {\r\n var cx = pc.x;\r\n var cy = pc.y;\r\n var tx = transform.x;\r\n var ty = transform.y;\r\n\r\n center.y = cx;\r\n center.x = cy;\r\n transform.y = tx;\r\n transform.x = ty;\r\n }\r\n else {\r\n center.y = top / scale;\r\n center.x = left / scale;\r\n\r\n adj.y = (center.y - pc.y) * (1 - scale);\r\n adj.x = (center.x - pc.x) * (1 - scale);\r\n\r\n transform.x -= adj.x;\r\n transform.y -= adj.y;\r\n }\r\n\r\n var newCss = {};\r\n newCss[CSS_TRANS_ORG] = center.x + 'px ' + center.y + 'px';\r\n newCss[CSS_TRANSFORM] = transform.toString();\r\n css(self.elements.preview, newCss);\r\n }\r\n\r\n function _initDraggable() {\r\n var self = this,\r\n isDragging = false,\r\n originalX,\r\n originalY,\r\n originalDistance,\r\n vpRect,\r\n transform;\r\n\r\n function assignTransformCoordinates(deltaX, deltaY) {\r\n var imgRect = self.elements.preview.getBoundingClientRect(),\r\n top = transform.y + deltaY,\r\n left = transform.x + deltaX;\r\n\r\n if (self.options.enforceBoundary) {\r\n if (vpRect.top > imgRect.top + deltaY && vpRect.bottom < imgRect.bottom + deltaY) {\r\n transform.y = top;\r\n }\r\n\r\n if (vpRect.left > imgRect.left + deltaX && vpRect.right < imgRect.right + deltaX) {\r\n transform.x = left;\r\n }\r\n }\r\n else {\r\n transform.y = top;\r\n transform.x = left;\r\n }\r\n }\r\n\r\n function toggleGrabState(isDragging) {\r\n self.elements.preview.setAttribute('aria-grabbed', isDragging);\r\n self.elements.boundary.setAttribute('aria-dropeffect', isDragging? 'move': 'none');\r\n }\r\n\r\n function keyDown(ev) {\r\n var LEFT_ARROW = 37,\r\n UP_ARROW = 38,\r\n RIGHT_ARROW = 39,\r\n DOWN_ARROW = 40;\r\n\r\n if (ev.shiftKey && (ev.keyCode === UP_ARROW || ev.keyCode === DOWN_ARROW)) {\r\n var zoom;\r\n if (ev.keyCode === UP_ARROW) {\r\n zoom = parseFloat(self.elements.zoomer.value) + parseFloat(self.elements.zoomer.step)\r\n }\r\n else {\r\n zoom = parseFloat(self.elements.zoomer.value) - parseFloat(self.elements.zoomer.step)\r\n }\r\n self.setZoom(zoom);\r\n }\r\n else if (self.options.enableKeyMovement && (ev.keyCode >= 37 && ev.keyCode <= 40)) {\r\n ev.preventDefault();\r\n var movement = parseKeyDown(ev.keyCode);\r\n\r\n transform = Transform.parse(self.elements.preview);\r\n document.body.style[CSS_USERSELECT] = 'none';\r\n vpRect = self.elements.viewport.getBoundingClientRect();\r\n keyMove(movement);\r\n }\r\n\r\n function parseKeyDown(key) {\r\n switch (key) {\r\n case LEFT_ARROW:\r\n return [1, 0];\r\n case UP_ARROW:\r\n return [0, 1];\r\n case RIGHT_ARROW:\r\n return [-1, 0];\r\n case DOWN_ARROW:\r\n return [0, -1];\r\n }\r\n }\r\n }\r\n\r\n function keyMove(movement) {\r\n var deltaX = movement[0],\r\n deltaY = movement[1],\r\n newCss = {};\r\n\r\n assignTransformCoordinates(deltaX, deltaY);\r\n\r\n newCss[CSS_TRANSFORM] = transform.toString();\r\n css(self.elements.preview, newCss);\r\n _updateOverlay.call(self);\r\n document.body.style[CSS_USERSELECT] = '';\r\n _updateCenterPoint.call(self);\r\n _triggerUpdate.call(self);\r\n originalDistance = 0;\r\n }\r\n\r\n function mouseDown(ev) {\r\n if (ev.button !== undefined && ev.button !== 0) return;\r\n\r\n ev.preventDefault();\r\n if (isDragging) return;\r\n isDragging = true;\r\n originalX = ev.pageX;\r\n originalY = ev.pageY;\r\n\r\n if (ev.touches) {\r\n var touches = ev.touches[0];\r\n originalX = touches.pageX;\r\n originalY = touches.pageY;\r\n }\r\n toggleGrabState(isDragging);\r\n transform = Transform.parse(self.elements.preview);\r\n window.addEventListener('mousemove', mouseMove);\r\n window.addEventListener('touchmove', mouseMove);\r\n window.addEventListener('mouseup', mouseUp);\r\n window.addEventListener('touchend', mouseUp);\r\n document.body.style[CSS_USERSELECT] = 'none';\r\n vpRect = self.elements.viewport.getBoundingClientRect();\r\n }\r\n\r\n function mouseMove(ev) {\r\n ev.preventDefault();\r\n var pageX = ev.pageX,\r\n pageY = ev.pageY;\r\n\r\n if (ev.touches) {\r\n var touches = ev.touches[0];\r\n pageX = touches.pageX;\r\n pageY = touches.pageY;\r\n }\r\n\r\n var deltaX = pageX - originalX,\r\n deltaY = pageY - originalY,\r\n newCss = {};\r\n\r\n if (ev.type === 'touchmove') {\r\n if (ev.touches.length > 1) {\r\n var touch1 = ev.touches[0];\r\n var touch2 = ev.touches[1];\r\n var dist = Math.sqrt((touch1.pageX - touch2.pageX) * (touch1.pageX - touch2.pageX) + (touch1.pageY - touch2.pageY) * (touch1.pageY - touch2.pageY));\r\n\r\n if (!originalDistance) {\r\n originalDistance = dist / self._currentZoom;\r\n }\r\n\r\n var scale = dist / originalDistance;\r\n\r\n _setZoomerVal.call(self, scale);\r\n dispatchChange(self.elements.zoomer);\r\n return;\r\n }\r\n }\r\n\r\n assignTransformCoordinates(deltaX, deltaY);\r\n\r\n newCss[CSS_TRANSFORM] = transform.toString();\r\n css(self.elements.preview, newCss);\r\n _updateOverlay.call(self);\r\n originalY = pageY;\r\n originalX = pageX;\r\n }\r\n\r\n function mouseUp() {\r\n isDragging = false;\r\n toggleGrabState(isDragging);\r\n window.removeEventListener('mousemove', mouseMove);\r\n window.removeEventListener('touchmove', mouseMove);\r\n window.removeEventListener('mouseup', mouseUp);\r\n window.removeEventListener('touchend', mouseUp);\r\n document.body.style[CSS_USERSELECT] = '';\r\n _updateCenterPoint.call(self);\r\n _triggerUpdate.call(self);\r\n originalDistance = 0;\r\n }\r\n\r\n self.elements.overlay.addEventListener('mousedown', mouseDown);\r\n self.elements.viewport.addEventListener('keydown', keyDown);\r\n self.elements.overlay.addEventListener('touchstart', mouseDown);\r\n }\r\n\r\n function _updateOverlay() {\r\n if (!this.elements) return; // since this is debounced, it can be fired after destroy\r\n var self = this,\r\n boundRect = self.elements.boundary.getBoundingClientRect(),\r\n imgData = self.elements.preview.getBoundingClientRect();\r\n\r\n css(self.elements.overlay, {\r\n width: imgData.width + 'px',\r\n height: imgData.height + 'px',\r\n top: (imgData.top - boundRect.top) + 'px',\r\n left: (imgData.left - boundRect.left) + 'px'\r\n });\r\n }\r\n var _debouncedOverlay = debounce(_updateOverlay, 500);\r\n\r\n function _triggerUpdate() {\r\n var self = this,\r\n data = self.get();\r\n\r\n if (!_isVisible.call(self)) {\r\n return;\r\n }\r\n\r\n self.options.update.call(self, data);\r\n if (self.$ && typeof Prototype === 'undefined') {\r\n self.$(self.element).trigger('update.croppie', data);\r\n }\r\n else {\r\n var ev;\r\n if (window.CustomEvent) {\r\n ev = new CustomEvent('update', { detail: data });\r\n } else {\r\n ev = document.createEvent('CustomEvent');\r\n ev.initCustomEvent('update', true, true, data);\r\n }\r\n\r\n self.element.dispatchEvent(ev);\r\n }\r\n }\r\n\r\n function _isVisible() {\r\n return this.elements.preview.offsetHeight > 0 && this.elements.preview.offsetWidth > 0;\r\n }\r\n\r\n function _updatePropertiesFromImage() {\r\n var self = this,\r\n initialZoom = 1,\r\n cssReset = {},\r\n img = self.elements.preview,\r\n imgData,\r\n transformReset = new Transform(0, 0, initialZoom),\r\n originReset = new TransformOrigin(),\r\n isVisible = _isVisible.call(self);\r\n\r\n if (!isVisible || self.data.bound) {// if the croppie isn't visible or it doesn't need binding\r\n return;\r\n }\r\n\r\n self.data.bound = true;\r\n cssReset[CSS_TRANSFORM] = transformReset.toString();\r\n cssReset[CSS_TRANS_ORG] = originReset.toString();\r\n cssReset['opacity'] = 1;\r\n css(img, cssReset);\r\n\r\n imgData = self.elements.preview.getBoundingClientRect();\r\n\r\n self._originalImageWidth = imgData.width;\r\n self._originalImageHeight = imgData.height;\r\n self.data.orientation = getExifOrientation(self.elements.img);\r\n\r\n if (self.options.enableZoom) {\r\n _updateZoomLimits.call(self, true);\r\n }\r\n else {\r\n self._currentZoom = initialZoom;\r\n }\r\n\r\n transformReset.scale = self._currentZoom;\r\n cssReset[CSS_TRANSFORM] = transformReset.toString();\r\n css(img, cssReset);\r\n\r\n if (self.data.points.length) {\r\n _bindPoints.call(self, self.data.points);\r\n }\r\n else {\r\n _centerImage.call(self);\r\n }\r\n\r\n _updateCenterPoint.call(self);\r\n _updateOverlay.call(self);\r\n }\r\n\r\n function _updateZoomLimits (initial) {\r\n var self = this,\r\n minZoom = Math.max(self.options.minZoom, 0) || 0,\r\n maxZoom = self.options.maxZoom || 1.5,\r\n initialZoom,\r\n defaultInitialZoom,\r\n zoomer = self.elements.zoomer,\r\n scale = parseFloat(zoomer.value),\r\n boundaryData = self.elements.boundary.getBoundingClientRect(),\r\n imgData = naturalImageDimensions(self.elements.img, self.data.orientation),\r\n vpData = self.elements.viewport.getBoundingClientRect(),\r\n minW,\r\n minH;\r\n if (self.options.enforceBoundary) {\r\n minW = vpData.width / imgData.width;\r\n minH = vpData.height / imgData.height;\r\n minZoom = Math.max(minW, minH);\r\n }\r\n\r\n if (minZoom >= maxZoom) {\r\n maxZoom = minZoom + 1;\r\n }\r\n\r\n zoomer.min = fix(minZoom, 4);\r\n zoomer.max = fix(maxZoom, 4);\r\n \r\n if (!initial && (scale < zoomer.min || scale > zoomer.max)) {\r\n _setZoomerVal.call(self, scale < zoomer.min ? zoomer.min : zoomer.max);\r\n }\r\n else if (initial) {\r\n defaultInitialZoom = Math.max((boundaryData.width / imgData.width), (boundaryData.height / imgData.height));\r\n initialZoom = self.data.boundZoom !== null ? self.data.boundZoom : defaultInitialZoom;\r\n _setZoomerVal.call(self, initialZoom);\r\n }\r\n\r\n dispatchChange(zoomer);\r\n }\r\n\r\n function _bindPoints(points) {\r\n if (points.length !== 4) {\r\n throw \"Croppie - Invalid number of points supplied: \" + points;\r\n }\r\n var self = this,\r\n pointsWidth = points[2] - points[0],\r\n // pointsHeight = points[3] - points[1],\r\n vpData = self.elements.viewport.getBoundingClientRect(),\r\n boundRect = self.elements.boundary.getBoundingClientRect(),\r\n vpOffset = {\r\n left: vpData.left - boundRect.left,\r\n top: vpData.top - boundRect.top\r\n },\r\n scale = vpData.width / pointsWidth,\r\n originTop = points[1],\r\n originLeft = points[0],\r\n transformTop = (-1 * points[1]) + vpOffset.top,\r\n transformLeft = (-1 * points[0]) + vpOffset.left,\r\n newCss = {};\r\n\r\n newCss[CSS_TRANS_ORG] = originLeft + 'px ' + originTop + 'px';\r\n newCss[CSS_TRANSFORM] = new Transform(transformLeft, transformTop, scale).toString();\r\n css(self.elements.preview, newCss);\r\n\r\n _setZoomerVal.call(self, scale);\r\n self._currentZoom = scale;\r\n }\r\n\r\n function _centerImage() {\r\n var self = this,\r\n imgDim = self.elements.preview.getBoundingClientRect(),\r\n vpDim = self.elements.viewport.getBoundingClientRect(),\r\n boundDim = self.elements.boundary.getBoundingClientRect(),\r\n vpLeft = vpDim.left - boundDim.left,\r\n vpTop = vpDim.top - boundDim.top,\r\n w = vpLeft - ((imgDim.width - vpDim.width) / 2),\r\n h = vpTop - ((imgDim.height - vpDim.height) / 2),\r\n transform = new Transform(w, h, self._currentZoom);\r\n\r\n css(self.elements.preview, CSS_TRANSFORM, transform.toString());\r\n }\r\n\r\n function _transferImageToCanvas(customOrientation) {\r\n var self = this,\r\n canvas = self.elements.canvas,\r\n img = self.elements.img,\r\n ctx = canvas.getContext('2d');\r\n\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n\r\n var orientation = self.options.enableOrientation && customOrientation || getExifOrientation(img);\r\n drawCanvas(canvas, img, orientation);\r\n }\r\n\r\n function _getCanvas(data) {\r\n var self = this,\r\n points = data.points,\r\n left = num(points[0]),\r\n top = num(points[1]),\r\n right = num(points[2]),\r\n bottom = num(points[3]),\r\n width = right-left,\r\n height = bottom-top,\r\n circle = data.circle,\r\n canvas = document.createElement('canvas'),\r\n ctx = canvas.getContext('2d'),\r\n startX = 0,\r\n startY = 0,\r\n canvasWidth = data.outputWidth || width,\r\n canvasHeight = data.outputHeight || height;\r\n\r\n canvas.width = canvasWidth;\r\n canvas.height = canvasHeight;\r\n\r\n if (data.backgroundColor) {\r\n ctx.fillStyle = data.backgroundColor;\r\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\r\n }\r\n\r\n // By default assume we're going to draw the entire\r\n // source image onto the destination canvas.\r\n var sx = left,\r\n sy = top,\r\n sWidth = width,\r\n sHeight = height,\r\n dx = 0,\r\n dy = 0,\r\n dWidth = canvasWidth,\r\n dHeight = canvasHeight;\r\n\r\n //\r\n // Do not go outside of the original image's bounds along the x-axis.\r\n // Handle translations when projecting onto the destination canvas.\r\n //\r\n\r\n // The smallest possible source x-position is 0.\r\n if (left < 0) {\r\n sx = 0;\r\n dx = (Math.abs(left) / width) * canvasWidth;\r\n }\r\n\r\n // The largest possible source width is the original image's width.\r\n if (sWidth + sx > self._originalImageWidth) {\r\n sWidth = self._originalImageWidth - sx;\r\n dWidth = (sWidth / width) * canvasWidth;\r\n }\r\n\r\n //\r\n // Do not go outside of the original image's bounds along the y-axis.\r\n //\r\n\r\n // The smallest possible source y-position is 0.\r\n if (top < 0) {\r\n sy = 0;\r\n dy = (Math.abs(top) / height) * canvasHeight;\r\n }\r\n\r\n // The largest possible source height is the original image's height.\r\n if (sHeight + sy > self._originalImageHeight) {\r\n sHeight = self._originalImageHeight - sy;\r\n dHeight = (sHeight / height) * canvasHeight;\r\n }\r\n\r\n // console.table({ left, right, top, bottom, canvasWidth, canvasHeight, width, height, startX, startY, circle, sx, sy, dx, dy, sWidth, sHeight, dWidth, dHeight });\r\n\r\n ctx.drawImage(this.elements.preview, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);\r\n if (circle) {\r\n ctx.fillStyle = '#fff';\r\n ctx.globalCompositeOperation = 'destination-in';\r\n ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2, true);\r\n ctx.closePath();\r\n ctx.fill();\r\n }\r\n return canvas;\r\n }\r\n\r\n function _getHtmlResult(data) {\r\n var points = data.points,\r\n div = document.createElement('div'),\r\n img = document.createElement('img'),\r\n width = points[2] - points[0],\r\n height = points[3] - points[1];\r\n\r\n addClass(div, 'croppie-result');\r\n div.appendChild(img);\r\n css(img, {\r\n left: (-1 * points[0]) + 'px',\r\n top: (-1 * points[1]) + 'px'\r\n });\r\n img.src = data.url;\r\n css(div, {\r\n width: width + 'px',\r\n height: height + 'px'\r\n });\r\n\r\n return div;\r\n }\r\n\r\n function _getBase64Result(data) {\r\n return _getCanvas.call(this, data).toDataURL(data.format, data.quality);\r\n }\r\n\r\n function _getBlobResult(data) {\r\n var self = this;\r\n return new Promise(function (resolve) {\r\n _getCanvas.call(self, data).toBlob(function (blob) {\r\n resolve(blob);\r\n }, data.format, data.quality);\r\n });\r\n }\r\n\r\n function _replaceImage(img) {\r\n if (this.elements.img.parentNode) {\r\n Array.prototype.forEach.call(this.elements.img.classList, function(c) { img.classList.add(c); });\r\n this.elements.img.parentNode.replaceChild(img, this.elements.img);\r\n this.elements.preview = img; // if the img is attached to the DOM, they're not using the canvas\r\n }\r\n this.elements.img = img;\r\n }\r\n\r\n function _bind(options, cb) {\r\n var self = this,\r\n url,\r\n points = [],\r\n zoom = null,\r\n hasExif = _hasExif.call(self);\r\n\r\n if (typeof (options) === 'string') {\r\n url = options;\r\n options = {};\r\n }\r\n else if (Array.isArray(options)) {\r\n points = options.slice();\r\n }\r\n else if (typeof (options) === 'undefined' && self.data.url) { //refreshing\r\n _updatePropertiesFromImage.call(self);\r\n _triggerUpdate.call(self);\r\n return null;\r\n }\r\n else {\r\n url = options.url;\r\n points = options.points || [];\r\n zoom = typeof(options.zoom) === 'undefined' ? null : options.zoom;\r\n }\r\n\r\n self.data.bound = false;\r\n self.data.url = url || self.data.url;\r\n self.data.boundZoom = zoom;\r\n\r\n return loadImage(url, hasExif).then(function (img) {\r\n _replaceImage.call(self, img);\r\n if (!points.length) {\r\n var natDim = naturalImageDimensions(img);\r\n var rect = self.elements.viewport.getBoundingClientRect();\r\n var aspectRatio = rect.width / rect.height;\r\n var imgAspectRatio = natDim.width / natDim.height;\r\n var width, height;\r\n\r\n if (imgAspectRatio > aspectRatio) {\r\n height = natDim.height;\r\n width = height * aspectRatio;\r\n }\r\n else {\r\n width = natDim.width;\r\n height = natDim.height / aspectRatio;\r\n }\r\n\r\n var x0 = (natDim.width - width) / 2;\r\n var y0 = (natDim.height - height) / 2;\r\n var x1 = x0 + width;\r\n var y1 = y0 + height;\r\n self.data.points = [x0, y0, x1, y1];\r\n }\r\n else if (self.options.relative) {\r\n points = [\r\n points[0] * img.naturalWidth / 100,\r\n points[1] * img.naturalHeight / 100,\r\n points[2] * img.naturalWidth / 100,\r\n points[3] * img.naturalHeight / 100\r\n ];\r\n }\r\n\r\n self.data.points = points.map(function (p) {\r\n return parseFloat(p);\r\n });\r\n if (self.options.useCanvas) {\r\n _transferImageToCanvas.call(self, options.orientation);\r\n }\r\n _updatePropertiesFromImage.call(self);\r\n _triggerUpdate.call(self);\r\n cb && cb();\r\n });\r\n }\r\n\r\n function fix(v, decimalPoints) {\r\n return parseFloat(v).toFixed(decimalPoints || 0);\r\n }\r\n\r\n function _get() {\r\n var self = this,\r\n imgData = self.elements.preview.getBoundingClientRect(),\r\n vpData = self.elements.viewport.getBoundingClientRect(),\r\n x1 = vpData.left - imgData.left,\r\n y1 = vpData.top - imgData.top,\r\n widthDiff = (vpData.width - self.elements.viewport.offsetWidth) / 2, //border\r\n heightDiff = (vpData.height - self.elements.viewport.offsetHeight) / 2,\r\n x2 = x1 + self.elements.viewport.offsetWidth + widthDiff,\r\n y2 = y1 + self.elements.viewport.offsetHeight + heightDiff,\r\n scale = self._currentZoom;\r\n\r\n if (scale === Infinity || isNaN(scale)) {\r\n scale = 1;\r\n }\r\n\r\n var max = self.options.enforceBoundary ? 0 : Number.NEGATIVE_INFINITY;\r\n x1 = Math.max(max, x1 / scale);\r\n y1 = Math.max(max, y1 / scale);\r\n x2 = Math.max(max, x2 / scale);\r\n y2 = Math.max(max, y2 / scale);\r\n\r\n return {\r\n points: [fix(x1), fix(y1), fix(x2), fix(y2)],\r\n zoom: scale,\r\n orientation: self.data.orientation\r\n };\r\n }\r\n\r\n var RESULT_DEFAULTS = {\r\n type: 'canvas',\r\n format: 'png',\r\n quality: 1\r\n },\r\n RESULT_FORMATS = ['jpeg', 'webp', 'png'];\r\n\r\n function _result(options) {\r\n var self = this,\r\n data = _get.call(self),\r\n opts = deepExtend(clone(RESULT_DEFAULTS), clone(options)),\r\n resultType = (typeof (options) === 'string' ? options : (opts.type || 'base64')),\r\n size = opts.size || 'viewport',\r\n format = opts.format,\r\n quality = opts.quality,\r\n backgroundColor = opts.backgroundColor,\r\n circle = typeof opts.circle === 'boolean' ? opts.circle : (self.options.viewport.type === 'circle'),\r\n vpRect = self.elements.viewport.getBoundingClientRect(),\r\n ratio = vpRect.width / vpRect.height,\r\n prom;\r\n\r\n if (size === 'viewport') {\r\n data.outputWidth = vpRect.width;\r\n data.outputHeight = vpRect.height;\r\n } else if (typeof size === 'object') {\r\n if (size.width && size.height) {\r\n data.outputWidth = size.width;\r\n data.outputHeight = size.height;\r\n } else if (size.width) {\r\n data.outputWidth = size.width;\r\n data.outputHeight = size.width / ratio;\r\n } else if (size.height) {\r\n data.outputWidth = size.height * ratio;\r\n data.outputHeight = size.height;\r\n }\r\n }\r\n\r\n if (RESULT_FORMATS.indexOf(format) > -1) {\r\n data.format = 'image/' + format;\r\n data.quality = quality;\r\n }\r\n\r\n data.circle = circle;\r\n data.url = self.data.url;\r\n data.backgroundColor = backgroundColor;\r\n\r\n prom = new Promise(function (resolve) {\r\n switch(resultType.toLowerCase())\r\n {\r\n case 'rawcanvas':\r\n resolve(_getCanvas.call(self, data));\r\n break;\r\n case 'canvas':\r\n case 'base64':\r\n resolve(_getBase64Result.call(self, data));\r\n break;\r\n case 'blob':\r\n _getBlobResult.call(self, data).then(resolve);\r\n break;\r\n default:\r\n resolve(_getHtmlResult.call(self, data));\r\n break;\r\n }\r\n });\r\n return prom;\r\n }\r\n\r\n function _refresh() {\r\n _updatePropertiesFromImage.call(this);\r\n }\r\n\r\n function _rotate(deg) {\r\n if (!this.options.useCanvas || !this.options.enableOrientation) {\r\n throw 'Croppie: Cannot rotate without enableOrientation && EXIF.js included';\r\n }\r\n\r\n var self = this,\r\n canvas = self.elements.canvas;\r\n\r\n self.data.orientation = getExifOffset(self.data.orientation, deg);\r\n drawCanvas(canvas, self.elements.img, self.data.orientation);\r\n _updateCenterPoint.call(self, true);\r\n _updateZoomLimits.call(self);\r\n }\r\n\r\n function _destroy() {\r\n var self = this;\r\n self.element.removeChild(self.elements.boundary);\r\n removeClass(self.element, 'croppie-container');\r\n if (self.options.enableZoom) {\r\n self.element.removeChild(self.elements.zoomerWrap);\r\n }\r\n delete self.elements;\r\n }\r\n\r\n if (window.jQuery) {\r\n var $ = window.jQuery;\r\n $.fn.croppie = function (opts) {\r\n var ot = typeof opts;\r\n\r\n if (ot === 'string') {\r\n var args = Array.prototype.slice.call(arguments, 1);\r\n var singleInst = $(this).data('croppie');\r\n\r\n if (opts === 'get') {\r\n return singleInst.get();\r\n }\r\n else if (opts === 'result') {\r\n return singleInst.result.apply(singleInst, args);\r\n }\r\n else if (opts === 'bind') {\r\n return singleInst.bind.apply(singleInst, args);\r\n }\r\n\r\n return this.each(function () {\r\n var i = $(this).data('croppie');\r\n if (!i) return;\r\n\r\n var method = i[opts];\r\n if ($.isFunction(method)) {\r\n method.apply(i, args);\r\n if (opts === 'destroy') {\r\n $(this).removeData('croppie');\r\n }\r\n }\r\n else {\r\n throw 'Croppie ' + opts + ' method not found';\r\n }\r\n });\r\n }\r\n else {\r\n return this.each(function () {\r\n var i = new Croppie(this, opts);\r\n i.$ = $;\r\n $(this).data('croppie', i);\r\n });\r\n }\r\n };\r\n }\r\n\r\n function Croppie(element, opts) {\r\n if (element.className.indexOf('croppie-container') > -1) {\r\n throw new Error(\"Croppie: Can't initialize croppie more than once\");\r\n }\r\n this.element = element;\r\n this.options = deepExtend(clone(Croppie.defaults), opts);\r\n\r\n if (this.element.tagName.toLowerCase() === 'img') {\r\n var origImage = this.element;\r\n addClass(origImage, 'cr-original-image');\r\n setAttributes(origImage, {'aria-hidden' : 'true', 'alt' : '' });\r\n var replacementDiv = document.createElement('div');\r\n this.element.parentNode.appendChild(replacementDiv);\r\n replacementDiv.appendChild(origImage);\r\n this.element = replacementDiv;\r\n this.options.url = this.options.url || origImage.src;\r\n }\r\n\r\n _create.call(this);\r\n if (this.options.url) {\r\n var bindOpts = {\r\n url: this.options.url,\r\n points: this.options.points\r\n };\r\n delete this.options['url'];\r\n delete this.options['points'];\r\n _bind.call(this, bindOpts);\r\n }\r\n }\r\n\r\n Croppie.defaults = {\r\n viewport: {\r\n width: 100,\r\n height: 100,\r\n type: 'square'\r\n },\r\n boundary: { },\r\n orientationControls: {\r\n enabled: true,\r\n leftClass: '',\r\n rightClass: ''\r\n },\r\n resizeControls: {\r\n width: true,\r\n height: true\r\n },\r\n customClass: '',\r\n showZoomer: true,\r\n enableZoom: true,\r\n enableResize: false,\r\n mouseWheelZoom: true,\r\n enableExif: false,\r\n enforceBoundary: true,\r\n enableOrientation: false,\r\n enableKeyMovement: true,\r\n update: function () { }\r\n };\r\n\r\n Croppie.globals = {\r\n translate: 'translate3d'\r\n };\r\n\r\n deepExtend(Croppie.prototype, {\r\n bind: function (options, cb) {\r\n return _bind.call(this, options, cb);\r\n },\r\n get: function () {\r\n var data = _get.call(this);\r\n var points = data.points;\r\n if (this.options.relative) {\r\n points[0] /= this.elements.img.naturalWidth / 100;\r\n points[1] /= this.elements.img.naturalHeight / 100;\r\n points[2] /= this.elements.img.naturalWidth / 100;\r\n points[3] /= this.elements.img.naturalHeight / 100;\r\n }\r\n return data;\r\n },\r\n result: function (type) {\r\n return _result.call(this, type);\r\n },\r\n refresh: function () {\r\n return _refresh.call(this);\r\n },\r\n setZoom: function (v) {\r\n _setZoomerVal.call(this, v);\r\n dispatchChange(this.elements.zoomer);\r\n },\r\n rotate: function (deg) {\r\n _rotate.call(this, deg);\r\n },\r\n destroy: function () {\r\n return _destroy.call(this);\r\n }\r\n });\r\n return Croppie;\r\n}));\r\n","var scope = (typeof global !== \"undefined\" && global) ||\n (typeof self !== \"undefined\" && self) ||\n window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n if (timeout) {\n timeout.close();\n }\n};\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// setimmediate attaches itself to the global object\nrequire(\"setimmediate\");\n// On some exotic environments, it's not clear which object `setimmediate` was\n// able to install onto. Search each possibility in the same order as the\n// `setimmediate` library.\nexports.setImmediate = (typeof self !== \"undefined\" && self.setImmediate) ||\n (typeof global !== \"undefined\" && global.setImmediate) ||\n (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== \"undefined\" && self.clearImmediate) ||\n (typeof global !== \"undefined\" && global.clearImmediate) ||\n (this && this.clearImmediate);\n","(function (global, undefined) {\n \"use strict\";\n\n if (global.setImmediate) {\n return;\n }\n\n var nextHandle = 1; // Spec says greater than zero\n var tasksByHandle = {};\n var currentlyRunningATask = false;\n var doc = global.document;\n var registerImmediate;\n\n function setImmediate(callback) {\n // Callback can either be a function or a string\n if (typeof callback !== \"function\") {\n callback = new Function(\"\" + callback);\n }\n // Copy function arguments\n var args = new Array(arguments.length - 1);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i + 1];\n }\n // Store and register the task\n var task = { callback: callback, args: args };\n tasksByHandle[nextHandle] = task;\n registerImmediate(nextHandle);\n return nextHandle++;\n }\n\n function clearImmediate(handle) {\n delete tasksByHandle[handle];\n }\n\n function run(task) {\n var callback = task.callback;\n var args = task.args;\n switch (args.length) {\n case 0:\n callback();\n break;\n case 1:\n callback(args[0]);\n break;\n case 2:\n callback(args[0], args[1]);\n break;\n case 3:\n callback(args[0], args[1], args[2]);\n break;\n default:\n callback.apply(undefined, args);\n break;\n }\n }\n\n function runIfPresent(handle) {\n // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n // So if we're currently running a task, we'll need to delay this invocation.\n if (currentlyRunningATask) {\n // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n // \"too much recursion\" error.\n setTimeout(runIfPresent, 0, handle);\n } else {\n var task = tasksByHandle[handle];\n if (task) {\n currentlyRunningATask = true;\n try {\n run(task);\n } finally {\n clearImmediate(handle);\n currentlyRunningATask = false;\n }\n }\n }\n }\n\n function installNextTickImplementation() {\n registerImmediate = function(handle) {\n process.nextTick(function () { runIfPresent(handle); });\n };\n }\n\n function canUsePostMessage() {\n // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n // where `global.postMessage` means something completely different and can't be used for this purpose.\n if (global.postMessage && !global.importScripts) {\n var postMessageIsAsynchronous = true;\n var oldOnMessage = global.onmessage;\n global.onmessage = function() {\n postMessageIsAsynchronous = false;\n };\n global.postMessage(\"\", \"*\");\n global.onmessage = oldOnMessage;\n return postMessageIsAsynchronous;\n }\n }\n\n function installPostMessageImplementation() {\n // Installs an event handler on `global` for the `message` event: see\n // * https://developer.mozilla.org/en/DOM/window.postMessage\n // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n var onGlobalMessage = function(event) {\n if (event.source === global &&\n typeof event.data === \"string\" &&\n event.data.indexOf(messagePrefix) === 0) {\n runIfPresent(+event.data.slice(messagePrefix.length));\n }\n };\n\n if (global.addEventListener) {\n global.addEventListener(\"message\", onGlobalMessage, false);\n } else {\n global.attachEvent(\"onmessage\", onGlobalMessage);\n }\n\n registerImmediate = function(handle) {\n global.postMessage(messagePrefix + handle, \"*\");\n };\n }\n\n function installMessageChannelImplementation() {\n var channel = new MessageChannel();\n channel.port1.onmessage = function(event) {\n var handle = event.data;\n runIfPresent(handle);\n };\n\n registerImmediate = function(handle) {\n channel.port2.postMessage(handle);\n };\n }\n\n function installReadyStateChangeImplementation() {\n var html = doc.documentElement;\n registerImmediate = function(handle) {\n // Create a \ No newline at end of file +Telegram
\ No newline at end of file diff --git a/dist/main.27f9887240a2d5c046ba.js b/dist/main.27f9887240a2d5c046ba.js deleted file mode 100644 index fa21b7db3..000000000 --- a/dist/main.27f9887240a2d5c046ba.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(e){function t(t){for(var n,r,o=t[0],c=t[1],d=0,a=[];d=0&&O(e[t]);t--);return t+17&&console.warn(`[Teact] Slow component render: ${n}, ${Math.round(t)} ms`),w[n].renderTimes.push(t),w[n].renderCount++}}catch(t){Object(d.a)(t),u=e.renderedValue}if(e.isMounted&&u===e.renderedValue)return e.$element;e.renderedValue=u;const o=j(u);return e.$element=y(e,[o]),e.$element}function C(e,t){return typeof e!=typeof t||(e.type!==t.type||(b(e)&&b(t)?e.value!==t.value:h(e)&&h(t)?e.tag!==t.tag||e.props.key!==t.props.key:!(!m(e)||!m(t))&&(e.componentInstance.Component!==t.componentInstance.Component||e.props.key!==t.props.key)))}function E(e){p(e)&&(m(e)?function(e){if(!e.isMounted)return;e.hooks.memos.byCursor.forEach(e=>{e.current=null}),e.hooks.effects.byCursor.forEach(({cleanup:e})=>{if("function"==typeof e)try{e()}catch(e){Object(d.a)(e)}}),e.isMounted=!1,function(e){e.hooks.effects.byCursor.forEach(e=>{e.cleanup=null,e.effect=null,e.dependencies=null}),e.hooks.state.byCursor.forEach(e=>{e.value=null,e.nextValue=null,e.setter=null}),e.hooks.memos.byCursor.forEach(e=>{e.dependencies=null}),e.hooks=null,e.$element=null,e.renderedValue=null,e.Component=null,e.props=null,e.forceUpdate=null,e.onUpdate=null}(e)}(e.componentInstance):e.target&&(Object(a.b)(e.target),e.target=null),e.children.forEach(E))}function S(e){return I(e),e.isMounted=!0,e.$element}function M(e){if(!e.isMounted||!e.onUpdate)return;const t=e.$element;I(e),e.$element!==t&&e.onUpdate()}function A(e){return m(e)?A(e.children[0]):e.target}function k(e,t){m(e)?k(e.children[0],t):e.target=t}function T(e){const{cursor:t,byCursor:n}=f.hooks.state;var o;return void 0===n[t]&&(n[t]={value:e,nextValue:e,setter:(o=f,e=>{n[t].nextValue!==e&&(n[t].nextValue="function"==typeof e?e(n[t].value):e,o.prepareForFrame&&o.forceUpdate||(o.prepareForFrame=Object(u.i)(()=>function e(t){t.isMounted&&(t.hooks.state.byCursor.forEach(e=>{e.value=e.nextValue}),t.prepareForFrame=Object(u.i)(()=>e(t)),t.forceUpdate=Object(u.j)(()=>M(t)))}(o)),o.forceUpdate=Object(u.j)(()=>M(o))),o.prepareForFrame(),o.forceUpdate(),r.t&&"TeactNContainer"!==o.name&&console.log("[Teact.useState]",o.name,o.Component&&o.Component.DEBUG_contentComponentName?"> "+o.Component.DEBUG_contentComponentName:"",`Forced update at cursor #${t}, next value: `,n[t].nextValue))})}),f.hooks.state.cursor++,[n[t].value,n[t].setter]}function N(e,t,n,r){const{cursor:u,byCursor:o}=f.hooks.effects,c=f,a=()=>{if(!c.isMounted)return;const{cleanup:e}=o[u];if("function"==typeof e)try{e()}catch(e){Object(d.a)(e)}o[u].cleanup=t()};if(void 0!==o[u]&&n&&o[u].dependencies){if(n.some((e,t)=>e!==o[u].dependencies[t])){if(r){const e=n.reduce((e,t,n)=>{const r=o[u].dependencies[n];return t!==r&&e.push(`${n}: ${r} => ${t}`),e},[]);console.log("[Teact]",r,"Effect caused by dependencies.",e.join(", "))}e(a)}}else e(a);o[u]={effect:t,dependencies:n,cleanup:o[u]?o[u].cleanup:void 0},f.hooks.effects.cursor++}function P(e,t,n){return N(u.b,e,t,n)}function D(e,t,n){return N(u.e,e,t,n)}function L(e,t,n){const{cursor:u,byCursor:o}=f.hooks.memos;let{current:d}=o[u]||{};return(void 0===o[u]||t.some((e,t)=>e!==o[u].dependencies[t]))&&(r.r&&n&&console.log(`[Teact.useMemo] ${f.name} (${n}): Update is caused by:`,o[u]?Object(c.b)(t,o[u].dependencies).join(", "):"[first render]"),d=e()),o[u]={current:d,dependencies:t},f.hooks.memos.cursor++,d}function x(e,t){return L(()=>e,t)}function F(e){return L(()=>({current:e}),[])}function B(e,t=c.a,n){return function(u){const o=F(u),d=F();return(!d.current||o.current&&!t(o.current,u))&&(r.r&&n&&console.log(`[Teact.memo] ${e.name} (${n}): Update is caused by:`,Object(c.b)(o.current,u).join(", ")),o.current=u,d.current=g(e,u)),d.current}}document.addEventListener("dblclick",()=>{console.log("COMPONENTS",Object(o.k)(Object.values(w),"renderCount","desc"))}),t.a={createElement:g,Fragment:s}},function(e,t,n){"use strict";n.d(t,"g",(function(){return v})),n.d(t,"e",(function(){return O})),n.d(t,"d",(function(){return j})),n.d(t,"b",(function(){return w})),n.d(t,"a",(function(){return I})),n.d(t,"f",(function(){return C})),n.d(t,"h",(function(){return E}));var r=n(0),u=n(2),o=n(31),c=n(33),d=n(10),a=n(28),i=n(3),s=n(27);function f(){return(f=Object.assign||function(e){for(var t=1;t7&&console.warn(`[TeactN] Slow containers update: ${Math.round(t)} ms`)}}],m={},p=new Map;function g(){h.forEach(e=>e(l))}const y=Object(d.j)(g);function v(e,t=!1){"object"==typeof e&&e!==l&&(l=e,t?g():y())}function O(){return l}function j(){return m}function w(e,t){b[e]||(b[e]=[],m[e]=(t,n=!1)=>{!function(e,t,n){b[e]&&b[e].forEach(e=>{const r=e(l,m,t);r&&v(r,n)})}(e,t,n)}),b[e].push(t)}function I(e){h.push(e)}function C(e){const t=h.indexOf(e);-1!==t&&h.splice(t,1)}function E(e=(()=>({})),t=(()=>({}))){return n=>function u(d){u.DEBUG_contentComponentName=n.name;const[i]=Object(r.r)(Object(c.a)(p)),b=Object(o.a)();Object(r.n)(()=>()=>{p.delete(i)},[i]);let h=p.get(i);if(h||(h={mapStateToProps:e,mapReducersToProps:t,ownProps:d,areMappedPropsChanged:!1,forceUpdate:b,DEBUG_updates:0,DEBUG_componentName:n.name},p.set(i,h)),h.areMappedPropsChanged&&(h.areMappedPropsChanged=!1),!h.mappedProps||!Object(a.a)(h.ownProps,d)){h.ownProps=d;try{h.mappedProps={...e(l,d),...t(v,m)}}catch(e){Object(s.a)(e)}}return r.a.createElement(n,f({},h.mappedProps,d))}}u.r&&(window.getGlobal=O,document.addEventListener("dblclick",()=>{console.log("GLOBAL CONTAINERS",Object(i.k)(Array.from(p.values()).map(({DEBUG_componentName:e,DEBUG_updates:t})=>({DEBUG_componentName:e,DEBUG_updates:t})),"DEBUG_updates","desc"))}))},function(e,t,n){"use strict";n.d(t,"pb",(function(){return r})),n.d(t,"L",(function(){return u})),n.d(t,"g",(function(){return o})),n.d(t,"h",(function(){return c})),n.d(t,"r",(function(){return d})),n.d(t,"t",(function(){return a})),n.d(t,"N",(function(){return i})),n.d(t,"s",(function(){return s})),n.d(t,"zb",(function(){return f})),n.d(t,"Q",(function(){return l})),n.d(t,"I",(function(){return b})),n.d(t,"J",(function(){return h})),n.d(t,"H",(function(){return m})),n.d(t,"K",(function(){return p})),n.d(t,"X",(function(){return g})),n.d(t,"Y",(function(){return y})),n.d(t,"Z",(function(){return v})),n.d(t,"ab",(function(){return O})),n.d(t,"o",(function(){return j})),n.d(t,"O",(function(){return w})),n.d(t,"jb",(function(){return C})),n.d(t,"fb",(function(){return E})),n.d(t,"gb",(function(){return S})),n.d(t,"hb",(function(){return M})),n.d(t,"k",(function(){return A})),n.d(t,"m",(function(){return k})),n.d(t,"l",(function(){return T})),n.d(t,"Ab",(function(){return N})),n.d(t,"ib",(function(){return P})),n.d(t,"G",(function(){return D})),n.d(t,"cb",(function(){return L})),n.d(t,"bb",(function(){return x})),n.d(t,"qb",(function(){return F})),n.d(t,"Qb",(function(){return B})),n.d(t,"a",(function(){return R})),n.d(t,"f",(function(){return U})),n.d(t,"e",(function(){return _})),n.d(t,"d",(function(){return $})),n.d(t,"w",(function(){return G})),n.d(t,"M",(function(){return W})),n.d(t,"U",(function(){return H})),n.d(t,"y",(function(){return z})),n.d(t,"z",(function(){return K})),n.d(t,"A",(function(){return V})),n.d(t,"wb",(function(){return q})),n.d(t,"vb",(function(){return J})),n.d(t,"lb",(function(){return Q})),n.d(t,"kb",(function(){return Y})),n.d(t,"ob",(function(){return Z})),n.d(t,"nb",(function(){return X})),n.d(t,"mb",(function(){return ee})),n.d(t,"T",(function(){return te})),n.d(t,"c",(function(){return ne})),n.d(t,"B",(function(){return re})),n.d(t,"D",(function(){return ue})),n.d(t,"C",(function(){return oe})),n.d(t,"E",(function(){return ce})),n.d(t,"Ib",(function(){return de})),n.d(t,"Jb",(function(){return ae})),n.d(t,"Cb",(function(){return ie})),n.d(t,"Db",(function(){return se})),n.d(t,"Lb",(function(){return fe})),n.d(t,"Gb",(function(){return le})),n.d(t,"Mb",(function(){return be})),n.d(t,"Nb",(function(){return he})),n.d(t,"Kb",(function(){return me})),n.d(t,"Ob",(function(){return pe})),n.d(t,"Eb",(function(){return ge})),n.d(t,"Fb",(function(){return ye})),n.d(t,"Hb",(function(){return ve})),n.d(t,"db",(function(){return Oe})),n.d(t,"j",(function(){return je})),n.d(t,"eb",(function(){return we})),n.d(t,"Bb",(function(){return Ie})),n.d(t,"n",(function(){return Ce})),n.d(t,"rb",(function(){return Ee})),n.d(t,"sb",(function(){return Se})),n.d(t,"ub",(function(){return Me})),n.d(t,"tb",(function(){return Ae})),n.d(t,"yb",(function(){return ke})),n.d(t,"b",(function(){return Te})),n.d(t,"i",(function(){return Ne})),n.d(t,"W",(function(){return Pe})),n.d(t,"V",(function(){return De})),n.d(t,"xb",(function(){return Le})),n.d(t,"u",(function(){return xe})),n.d(t,"v",(function(){return Fe})),n.d(t,"P",(function(){return Be})),n.d(t,"Pb",(function(){return Re})),n.d(t,"S",(function(){return Ue})),n.d(t,"F",(function(){return _e})),n.d(t,"R",(function(){return $e})),n.d(t,"p",(function(){return Ge})),n.d(t,"q",(function(){return We})),n.d(t,"x",(function(){return He}));const r="Telegram",u=" [Inactive]",o="Telegram WebZ",c="1.8.6",d=!1,a=!1,i=!1,s="Shoot!\nSomething went wrong, please see the error details in Dev Tools Console.",f="user_auth",l="GramJs:sessionId",b=!1,h="tt-global-state",m=30,p=5e3,g=!1,y="tt-media",v="tt-media-avatars",O="tt-media-progressive",j="tt-custom-bg",w="tt-lang-packs-v5",I="undefined"!=typeof window&&window.innerHeight>=900,C=1,E=750,S=I?60:40,M=2*S,A=72,k=I?30:25,T=100,N=42,P=42,D=20,L=30,x=200,F=500,B=20,R=!1,U=0,_=2,$=_,G=16,W=17,H=15,z=1e4,K="editable-message-text",V="editable-message-text-modal",q=1440,J=1150,Q=1275,Y=925,Z=600,X=950,ee=450,te=1e9,ne=100,re=1500,ue=250,oe=600,ce=500,de=(Math.round((ue+oe)/2),new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]),13),ae=11,ie=160,se=120,fe=64,le=48,be=32,he=64,me=64,pe=160,ge=140,ye=80,ve=100,Oe="MEMOJI_STICKER",je="en",we=200,Ie=450,Ce=new Set(["image/png","image/gif","image/jpeg","video/mp4","video/avi","video/quicktime"]),Ee="((ftp|https?):\\/\\/)?((www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,63})\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)",Se="(@[\\w\\d_-]+)",Me=/^(?:https?:\/\/)?(?:t\.me\/)([\d\w_]+)(?:\/([\d]+))?(?:\/([\d]+))?$/gm,Ae=/^(?:https?:\/\/)?(?:t\.me\/joinchat\/)([\d\w_-]+)?$/gm,ke=777e3,Te=0,Ne=1,Pe=10,De=5,Le=2147483646,xe="en",Fe="android",Be=["android","ios","tdesktop","macos"],Re="TelegramTips",Ue=["ar","pt-br","id","it","ko","ms","pl","es","tr"],_e="https://bugs.telegram.org/?tag_ids=41&sort=time",$e="#A2AF8E",Ge="#0F0F0F",We="#0a0a0a8c",He="rgba(90, 110, 70, 0.6)"},function(e,t,n){"use strict";function r(e,t){return e.reduce((e,n)=>(e[n[t]]=n,e),{})}function u(e,t){return Object.keys(e).reduce((n,r,u)=>(n[r]=t(e[r],r,u,e),n),{})}function o(e,t){return t.reduce((t,n)=>(t[n]=e[n],t),{})}function c(e,t){return t.reduce((t,n)=>(e[n]&&(t[n]=e[n]),t),{})}function d(e,t){const n=new Set(t.map(String));return o(e,Object.keys(e).filter(e=>!n.has(e)))}function a(e,t,n="asc"){return e.sort((e,r)=>{if(Array.isArray(t)){const[u,o]=Array.isArray(n)?n:[n,n],[c,d]=t;let a,i;if("function"==typeof c?(a=c(e)||0,i=c(r)||0):"string"==typeof c&&(a=e[c]||0,i=r[c]||0),a!==i)return"asc"===u?a-i:i-a;{let t,n;return"function"==typeof d?(t=d(e)||0,n=d(r)||0):"string"==typeof d&&(t=e[d]||0,n=r[d]||0),"asc"===o?t-n:n-t}}let u,o;return"function"==typeof t?(u=t(e)||0,o=t(r)||0):"string"==typeof t&&(u=e[t]||0,o=r[t]||0),"asc"===n?u-o:o-u})}function i(e){return e.reduce((e,t)=>Array.isArray(t)?e.concat(t):(e.push(t),e),[])}function s(e){return Array.from(new Set(e))}function f(e){return e.filter(Boolean)}function l(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}function b(e,t){return e[0]<=t[t.length-1]&&e[e.length-1]>=t[0]}function h(e,t){return e.filter(e=>t.has(e))}function m(e,t){const n=[];for(let r=0;r(t[n]=p(e[n]),t),{})}function g(e,t){let n=e.length;for(;n--;)if(t(e[n],n,e))return e[n]}n.d(t,"c",(function(){return r})),n.d(t,"i",(function(){return u})),n.d(t,"l",(function(){return o})),n.d(t,"m",(function(){return c})),n.d(t,"j",(function(){return d})),n.d(t,"k",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"o",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"a",(function(){return l})),n.d(t,"b",(function(){return b})),n.d(t,"f",(function(){return h})),n.d(t,"n",(function(){return m})),n.d(t,"d",(function(){return p})),n.d(t,"g",(function(){return g}))},function(e,t,n){"use strict";n.d(t,"ab",(function(){return r.b})),n.d(t,"bb",(function(){return r.c})),n.d(t,"cb",(function(){return r.d})),n.d(t,"Cb",(function(){return r.g})),n.d(t,"sb",(function(){return r.e})),n.d(t,"Bb",(function(){return r.f})),n.d(t,"Jb",(function(){return r.h})),n.d(t,"Z",(function(){return r.a})),n.d(t,"ob",(function(){return u.w})),n.d(t,"nb",(function(){return u.v})),n.d(t,"lb",(function(){return u.t})),n.d(t,"qb",(function(){return u.y})),n.d(t,"mb",(function(){return u.u})),n.d(t,"rb",(function(){return u.z})),n.d(t,"l",(function(){return u.j})),n.d(t,"W",(function(){return u.p})),n.d(t,"k",(function(){return u.i})),n.d(t,"f",(function(){return u.e})),n.d(t,"g",(function(){return u.f})),n.d(t,"e",(function(){return u.d})),n.d(t,"pb",(function(){return u.x})),n.d(t,"jb",(function(){return u.r})),n.d(t,"p",(function(){return u.m})),n.d(t,"Db",(function(){return u.A})),n.d(t,"d",(function(){return u.c})),n.d(t,"b",(function(){return u.a})),n.d(t,"L",(function(){return u.o})),n.d(t,"j",(function(){return u.h})),n.d(t,"i",(function(){return u.g})),n.d(t,"kb",(function(){return u.s})),n.d(t,"Hb",(function(){return u.D})),n.d(t,"c",(function(){return u.b})),n.d(t,"Gb",(function(){return u.C})),n.d(t,"Fb",(function(){return u.B})),n.d(t,"o",(function(){return u.l})),n.d(t,"n",(function(){return u.k})),n.d(t,"ib",(function(){return u.q})),n.d(t,"K",(function(){return u.n})),n.d(t,"Ib",(function(){return u.E})),n.d(t,"C",(function(){return i})),n.d(t,"Eb",(function(){return s})),n.d(t,"G",(function(){return f})),n.d(t,"O",(function(){return l})),n.d(t,"P",(function(){return b})),n.d(t,"x",(function(){return h})),n.d(t,"M",(function(){return m})),n.d(t,"m",(function(){return p})),n.d(t,"yb",(function(){return g})),n.d(t,"zb",(function(){return y})),n.d(t,"tb",(function(){return v})),n.d(t,"gb",(function(){return O})),n.d(t,"Ab",(function(){return j})),n.d(t,"hb",(function(){return w})),n.d(t,"X",(function(){return I})),n.d(t,"Y",(function(){return C})),n.d(t,"xb",(function(){return E})),n.d(t,"ub",(function(){return S})),n.d(t,"u",(function(){return M})),n.d(t,"v",(function(){return T})),n.d(t,"fb",(function(){return N})),n.d(t,"H",(function(){return P})),n.d(t,"Q",(function(){return D})),n.d(t,"J",(function(){return L})),n.d(t,"s",(function(){return x})),n.d(t,"t",(function(){return F})),n.d(t,"N",(function(){return B})),n.d(t,"y",(function(){return R})),n.d(t,"vb",(function(){return U})),n.d(t,"wb",(function(){return _})),n.d(t,"I",(function(){return $})),n.d(t,"B",(function(){return G})),n.d(t,"R",(function(){return W})),n.d(t,"S",(function(){return H})),n.d(t,"T",(function(){return z})),n.d(t,"F",(function(){return K})),n.d(t,"E",(function(){return V})),n.d(t,"D",(function(){return J})),n.d(t,"z",(function(){return Q})),n.d(t,"A",(function(){return Y})),n.d(t,"eb",(function(){return Z})),n.d(t,"h",(function(){return X})),n.d(t,"U",(function(){return ee})),n.d(t,"V",(function(){return te})),n.d(t,"db",(function(){return ne})),n.d(t,"r",(function(){return re})),n.d(t,"w",(function(){return ue})),n.d(t,"q",(function(){return oe})),n.d(t,"a",(function(){return ce}));var r=n(35),u=n(36),o=n(8),c=n(2),d=n(65);const a=new RegExp(c.rb,"i");function i(e){const{chatId:t,id:n}=e;return`msg${t}-${n}`}function s(e){const t=e.match(/^msg(-?\d+)-(\d+)/);return{chatId:Number(t[1]),messageId:Number(t[2])}}function f(e){return e.previousLocalId||e.id}function l(e,t,n=!1){const{text:r,photo:u,video:o,audio:c,voice:d,document:a,sticker:i,contact:s,poll:f,invoice:l}=t.content,b=r&&r.text.substr(0,80);return t.groupedId?`${n?"":"🖼 "}${b||e("lng_in_dlg_album")}`:u?`${n?"":"🖼 "}${b||e("AttachPhoto")}`:o?`${n?"":"📹 "}${b||e(o.isGif?"AttachGif":"AttachVideo")}`:i?`${i.emoji||""} ${e("AttachSticker")}`.trim():c?`${n?"":"🎧 "}${M(t)||e("AttachMusic")}`:d?`${n?"":"🎤 "}${b||e("AttachAudio")}`:a?`${n?"":"📎 "}${b||a.fileName}`:s?e("AttachContact"):f?`${n?"":"📊 "}${f.summary.question}`:l?"Invoice":r?b:"The message is not supported on this version of Telegram"}function b(e){const{text:t,sticker:n,photo:r,video:u,audio:o,voice:c,document:d,poll:a,webPage:i,contact:s,invoice:f}=e.content;return t?t.text:n||r||u||o||c||d||s||a||i||f?void 0:"The message is not supported on this version of Telegram"}function h(e){const{text:t,sticker:n,photo:r,video:u,audio:o,voice:c,document:a,poll:i,webPage:s,contact:f}=e.content;return!!(n||u&&u.isRound)||!(!t||r||u||o||c||a||i||s||f)&&(Object(d.a)(t.text)||!1)}function m(e){const{text:t}=e.content;if(t&&t.text.length<=6&&1===h(e))return t.text}function p(e){const{text:t}=e.content;let n;if(t&&t.entities){let e=t.entities.find(e=>e.type===o.ApiMessageEntityTypes.TextUrl);if(e&&(n=e.url.match(a)),!n&&(e=t.entities.find(e=>e.type===o.ApiMessageEntityTypes.Url),e)){const{offset:r,length:u}=e;n=t.text.substring(r,r+u).match(a)}}if(!n&&t&&(n=t.text.match(a)),n)return{url:n[0],domain:n[3]}}function g(e){return e.isOutgoing}function y(e){return Boolean(e.replyToMessageId)}function v(e){return Boolean(e.forwardInfo)}function O(e){return!!e.content.action}function j(e){return e.chatId===c.yb&&E(e)}function w(e){return Boolean(e.senderId)&&e.senderId<0&&g(e)}function I(e,t){return t.id>0?Object(r.c)(t):Object(u.i)(e,t)}function C(e){return e.sendingState?"messageSendingStateFailed"===e.sendingState?"failed":"pending":"succeeded"}function E(e){return e.id>=c.T}function S(e){return e.content.action&&"historyClear"===e.content.action.type}function M(e){const{audio:t,text:n}=e.content;return t&&[t.title,t.performer].filter(Boolean).join(" — ")||n&&n.text}var A=n(6),k=n(60);function T(e){return e.content}function N(e){return Boolean(P(e)||D(e)||R(e)||B(e)||function(e){return e.content.contact}(e)||$(e)||x(e)||F(e)||function(e){return e.content.voice}(e))}function P(e){return e.content.photo}function D(e){return e.content.video}function L(e){const{video:t}=e.content;return t&&t.isRound?t:void 0}function x(e){return e.content.action}function F(e){return e.content.audio}function B(e){return e.content.sticker}function R(e){return e.content.document}function U(e){const t=R(e);return t?"photo"===t.mediaType:void 0}function _(e){const t=R(e);return t?"video"===t.mediaType:void 0}function $(e){return e.content.poll}function G(e){return e.content.invoice}function W(e){return e.content.webPage}function H(e){const t=W(e);return t?t.photo:void 0}function z(e){const t=W(e);if(t)return t.video}function K(e){const t=function(e){const t=P(e)||D(e)||R(e)||B(e)||H(e)||z(e);if(t)return t.thumbnail}(e);return t?t.dataUri:void 0}function V(e,t){const{photo:n,video:r,sticker:u,audio:o,voice:c,document:d}=e.content,a=H(e),s=z(e),f=r||s,l=n||a;if(!(l||f||u||o||c||d))return;const b=i(e);if(f)switch(t){case"micro":case"pictogram":return b+"?size=m";case"inline":return Z(e)?void 0:q(f,b);case"viewerPreview":return b+"?size=m";case"viewerFull":return q(f,b);case"download":return b+"?download"}if(l)switch(t){case"micro":case"pictogram":return b+"?size=m";case"inline":return Z(e)?void 0:b+"?size=x";case"viewerPreview":return b+"?size=x";case"viewerFull":return b+"?size=z"}if(d)switch(t){case"micro":case"pictogram":case"inline":case"viewerPreview":if(!Object(k.c)(d)||Z(e))return;return b+"?size=m";default:return b}if(u)switch(t){case"micro":return;case"pictogram":return b+"?size=m";default:return b}if(o)switch(t){case"micro":case"pictogram":return;case"download":return b+"?download";default:return q(o,b)}if(c)switch(t){case"micro":case"pictogram":return;default:return b}}function q(e,t){return A.h&&A.j?`${t}?fileSize=${e.size}&mimeType=${e.mimeType}`:t}function J(e,t){const{sticker:n,video:r,audio:u,voice:c}=e.content,d=r||z(e);return n&&"inline"===t&&n.isAnimated?o.ApiMediaFormat.Lottie:d&&A.h&&("viewerFull"===t||"inline"===t)?o.ApiMediaFormat.Progressive:u||c?c&&!A.g?o.ApiMediaFormat.BlobUrl:o.ApiMediaFormat.Progressive:o.ApiMediaFormat.BlobUrl}function Q(e){const{photo:t,video:n,document:r}=e.content,u=H(e),o=z(e);if(t||u)return`photo${e.date}.jpeg`;const{fileName:c}=n||o||r||{};return c}function Y(e){const{video:t,document:n}=e.content,r=z(e),{size:u}=t||r||n||{};return u}function Z(e){const{photo:t,video:n,document:r}=e.content;return t&&t.blobUrl||n&&n.blobUrl||r&&r.previewBlobUrl}function X(e,t,n=!1){const r=ue(e,t,n?"media":"inlineMedia");return n?r.reverse():r}function ee(e){return e.sizes.find(e=>"z"===e.type)||e.sizes.find(e=>"y"===e.type)||te(e)}function te(e){return e.sizes.find(e=>"x"===e.type)||e.sizes.find(e=>"m"===e.type)||e.sizes.find(e=>"s"===e.type)||e.thumbnail}function ne(e){if(e.width&&e.height)return e}function re(e,t,n=!1){const r=E(e);return{isUploading:r,isTransferring:r||n,transferProgress:Number(t)}}function ue(e,t,n){let r;switch(n){case"media":r=e=>{const t=D(e);return P(e)||t&&!t.isRound&&!t.isGif};break;case"documents":r=R;break;case"links":r=e=>W(e)||function(e){const{text:t}=e.content,n=t&&t.text.match(a);if(n)return{url:n[0],domain:n[3]}}(e);break;case"audio":r=F;break;case"inlineMedia":r=e=>{const t=D(e);return P(e)||t&&!t.isRound&&!t.isGif||U(e)||_(e)};break;default:return[]}return t.reduce((t,n)=>(e[n]&&r(e[n])&&t.push(n),t),[])}function oe(e){const{audio:t,voice:n,video:r}=T(e),u=t||n||r||z(e);if(u)return u.duration}function ce(e,t){return`${e}_${t}`}n(61)},function(e,t,n){"use strict";n.d(t,"c",(function(){return s})),n.d(t,"a",(function(){return f})),n.d(t,"b",(function(){return l}));var r=n(81),u=n.n(r),o=n(2),c=n(33);let d;const a=new Map,i=new Map;function s(e,t){return d||(o.r&&console.log(">>> START LOAD WORKER"),d=new u.a,function(e){d.addEventListener("message",({data:t})=>{if("update"===t.type)e(t.update);else if("methodResponse"===t.type){const e=a.get(t.messageId);e&&(t.error?e.reject(t.error):e.resolve(t.response))}else if("methodCallback"===t.type){const e=a.get(t.messageId);e&&e.callback&&e.callback(...t.callbackArgs)}else if("unhandledError"===t.type)throw t.error})}(e)),b({type:"initApi",args:[t]})}function f(e,...t){if(d)return b({type:"callMethod",name:e,args:t});o.r&&console.warn("API is not initialized")}function l(e){e.isCanceled=!0;const{messageId:t}=i.get(e)||{};t&&d.postMessage({type:"cancelProgress",messageId:t})}function b(e){const t=Object(c.a)(a),n={messageId:t,...e},r={messageId:t},u=new Promise((e,t)=>{Object.assign(r,{resolve:e,reject:t})});if("function"==typeof n.args[1]){const e=n.args.pop();r.callback=e,i.set(e,r)}return a.set(t,r),u.catch(()=>{}).finally(()=>{a.delete(t),r.callback&&i.delete(r.callback)}),d.postMessage(n),u}},function(e,t,n){"use strict";n.d(t,"t",(function(){return o})),n.d(t,"s",(function(){return d})),n.d(t,"r",(function(){return s})),n.d(t,"f",(function(){return f})),n.d(t,"e",(function(){return l})),n.d(t,"b",(function(){return b})),n.d(t,"j",(function(){return h})),n.d(t,"i",(function(){return m})),n.d(t,"n",(function(){return p})),n.d(t,"l",(function(){return g})),n.d(t,"m",(function(){return y})),n.d(t,"o",(function(){return v})),n.d(t,"d",(function(){return O})),n.d(t,"k",(function(){return j})),n.d(t,"h",(function(){return w})),n.d(t,"g",(function(){return I})),n.d(t,"c",(function(){return C})),n.d(t,"p",(function(){return E})),n.d(t,"a",(function(){return S})),n.d(t,"q",(function(){return M}));var r=n(2);let u;function o(){return Boolean(u)}new Promise(e=>{const t=new Image;t.src="data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA";const n=()=>{e(2===t.height)};t.onload=n,t.onerror=n}).then(e=>{u=e});let c=window&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";function d(){return c}function a(e){c=e.matches?"dark":"light"}const i=window.matchMedia("(prefers-color-scheme: dark)");"function"==typeof i.addEventListener?i.addEventListener("change",a):"function"==typeof i.addListener&&i.addListener(a);const s=function(){const{userAgent:e,platform:t}=window.navigator;let n;return-1!==["Macintosh","MacIntel","MacPPC","Mac68K"].indexOf(t)?n="macOS":-1!==["iPhone","iPad","iPod"].indexOf(t)?n="iOS":-1!==["Win32","Win64","Windows","WinCE"].indexOf(t)?n="Windows":/Android/.test(e)?n="Android":/Linux/.test(t)&&(n="Linux"),n}(),f="macOS"===s,l="iOS"===s,b="Android"===s,h=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),m=window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone||document.referrer.includes("android-app://"),p=window.matchMedia("(pointer: coarse)").matches,g=window.innerWidth<=r.ob||window.innerWidth<=r.nb&&window.innerHeight<=r.mb,y=!g&&window.innerWidth<=r.kb,v=navigator.mediaDevices&&"getUserMedia"in navigator.mediaDevices&&(window.AudioContext||window.webkitAudioContext),O=(document.documentElement.style,s&&(f||l)),j="serviceWorker"in navigator,w=j,I=(window,Boolean((new Audio).canPlayType("audio/ogg; codecs=opus"))),C=!r.N&&"filter"in(document.createElement("canvas").getContext("2d")||{}),E=b?"slide-fade":l?"slide-layers":"push-slide",S=window.devicePixelRatio||1,M=!0},function(e,t,n){"use strict";n.d(t,"T",(function(){return Fe})),n.d(t,"pb",(function(){return Be})),n.d(t,"W",(function(){return Re})),n.d(t,"Db",(function(){return Ue})),n.d(t,"Jb",(function(){return a})),n.d(t,"X",(function(){return i})),n.d(t,"g",(function(){return l})),n.d(t,"p",(function(){return b})),n.d(t,"P",(function(){return h})),n.d(t,"O",(function(){return m})),n.d(t,"Cb",(function(){return p})),n.d(t,"o",(function(){return g})),n.d(t,"h",(function(){return y})),n.d(t,"L",(function(){return v})),n.d(t,"d",(function(){return O})),n.d(t,"M",(function(){return j})),n.d(t,"k",(function(){return w})),n.d(t,"j",(function(){return I})),n.d(t,"N",(function(){return C})),n.d(t,"i",(function(){return E})),n.d(t,"r",(function(){return S})),n.d(t,"z",(function(){return D})),n.d(t,"s",(function(){return L})),n.d(t,"n",(function(){return x})),n.d(t,"sb",(function(){return F})),n.d(t,"Z",(function(){return R})),n.d(t,"hb",(function(){return U})),n.d(t,"y",(function(){return _})),n.d(t,"Kb",(function(){return $})),n.d(t,"kb",(function(){return G})),n.d(t,"qb",(function(){return W})),n.d(t,"tb",(function(){return H})),n.d(t,"ob",(function(){return z})),n.d(t,"D",(function(){return K})),n.d(t,"F",(function(){return V})),n.d(t,"C",(function(){return q})),n.d(t,"db",(function(){return J})),n.d(t,"Fb",(function(){return Q})),n.d(t,"G",(function(){return Y})),n.d(t,"nb",(function(){return Z})),n.d(t,"Gb",(function(){return X})),n.d(t,"Hb",(function(){return ee})),n.d(t,"Eb",(function(){return te})),n.d(t,"a",(function(){return ne})),n.d(t,"Y",(function(){return re})),n.d(t,"l",(function(){return ue})),n.d(t,"rb",(function(){return oe})),n.d(t,"E",(function(){return ce})),n.d(t,"m",(function(){return de})),n.d(t,"I",(function(){return ae})),n.d(t,"U",(function(){return ie})),n.d(t,"gb",(function(){return se})),n.d(t,"vb",(function(){return fe})),n.d(t,"K",(function(){return le})),n.d(t,"b",(function(){return be})),n.d(t,"e",(function(){return he})),n.d(t,"f",(function(){return me})),n.d(t,"Ib",(function(){return pe})),n.d(t,"mb",(function(){return ge})),n.d(t,"H",(function(){return ye})),n.d(t,"R",(function(){return ve})),n.d(t,"q",(function(){return Oe})),n.d(t,"S",(function(){return je})),n.d(t,"V",(function(){return we})),n.d(t,"J",(function(){return Ie})),n.d(t,"bb",(function(){return Ce})),n.d(t,"Q",(function(){return Ee})),n.d(t,"ub",(function(){return Se})),n.d(t,"cb",(function(){return Me})),n.d(t,"wb",(function(){return Ae})),n.d(t,"xb",(function(){return ke})),n.d(t,"yb",(function(){return Te})),n.d(t,"u",(function(){return _e})),n.d(t,"B",(function(){return Ne})),n.d(t,"x",(function(){return Pe})),n.d(t,"w",(function(){return De})),n.d(t,"ab",(function(){return Le})),n.d(t,"v",(function(){return xe})),n.d(t,"A",(function(){return A})),n.d(t,"t",(function(){return k})),n.d(t,"zb",(function(){return T})),n.d(t,"Ab",(function(){return N})),n.d(t,"c",(function(){return P})),n.d(t,"ib",(function(){return $e})),n.d(t,"jb",(function(){return Ge})),n.d(t,"lb",(function(){return We})),n.d(t,"Bb",(function(){return He})),n.d(t,"fb",(function(){return s})),n.d(t,"eb",(function(){return f}));var r=n(13),u=n(6),o=n(8),c=n(2),d=n(4);function a(e,t){return e.users.byId[t]}function i(e,t){const n=a(e,t);return n&&n.fullInfo&&n.fullInfo.isBlocked}function s(e){return e.settings.byKey}function f(e){return e.settings.notifyExceptions}function l(e,t){return e.chats.byId[t]}function b(e,t){const n=Object(d.W)(t);return!!n&&a(e,n)}function h(e,t){return t===e.currentUserId}function m(e,t){const n=b(e,t);return n&&Object(d.Bb)(n)}function p(e){return Object.values(e.chats.byId).find(({isSupport:e})=>e)}function g(e,t){if(!Object(d.ob)(t.id)&&!Object(d.mb)(t)&&t.fullInfo)return t.fullInfo.members&&t.fullInfo.members.length!==c.bb?t.fullInfo.members.reduce((t,{userId:n})=>e.users.byId[n]&&Object(d.Cb)(e.users.byId[n])&&n!==e.currentUserId?t+1:t,0):t.fullInfo.onlineCount}function y(e,t){const n=l(e,t),r=n&&Object(d.W)(n),u=r&&a(e,r);if(u&&Object(d.Bb)(u))return u}function v(e,t){const n=l(e,t),r=y(e,t);if(!n||!r)return!1;if(n.lastMessage&&Object(d.ub)(n.lastMessage))return!0;const u=e.messages.byChatId[t];if(!u)return!1;const{listedIds:c}=u.threadsById[o.MAIN_THREAD_ID]||{};return c&&!c.length}function O(e){return Boolean(e.chats.listIds.active)}function j(e,t,n){const{listIds:r}=e.chats;if(n){const e=r[n];return Boolean(e&&e.includes(t))}return Object.values(r).some(e=>e&&e.includes(t))}function w(e,t){const n=l(e,t);if(n&&j(e,t))return n.folderId===c.i?"archived":"active"}function I(e,t){return e.chatFolders.byId[t]}function C(e,t,n=c.b){const{active:r,archived:u}=e.chats.orderedPinnedIds;if(n===c.b)return!!r&&r.includes(t);if(n===c.i)return!!u&&u.includes(t);const{byId:o}=e.chatFolders,{pinnedChatIds:d}=o[n]||{};return!!d&&d.includes(t)}function E(e,t){const n=t.toLowerCase();return Object.values(e.chats.byId).find(e=>e.username&&e.username.toLowerCase()===n)}function S(e){const t=e.chats.listIds.active;if(!t)return 0;const n=e.chats.byId;return t.reduce((t,r)=>{const u=n[r];return u&&u.unreadCount&&!Object(d.Hb)(u,s(e),f(e))?t+u.unreadCount:t},0)}var M=n(3);function A(e){return e.stickers.search}function k(e){return e.gifs.search}function T(e,t){return e.stickers.setsById[t]}function N(e,t){const n=Object.values(e.stickers.setsById);let r=[];return n.forEach(({packs:e})=>{if(!e)return;const n=e[t];n&&(r=r.concat(n))}),r}function P(e,t){const{animatedEmojis:n}=e;if(!n||!n.stickers)return;const r=t.replace("️","");return n.stickers.find(e=>e.emoji===t||e.emoji===r)}function D(e){const{messageLists:t}=e.messages;if(t.length)return t[t.length-1]}function L(e){const{chatId:t}=D(e)||{};return t?l(e,t):void 0}function x(e,t){const n=e.messages.byChatId[t];return n?n.byId:void 0}function F(e,t){const n=e.scheduledMessages.byChatId[t];return n?n.byId:void 0}function B(e,t,n,r){const u=e.messages.byChatId[t];if(!u)return;const o=u.threadsById[n];return o?o[r]:void 0}function R(e,t,n){return B(e,t,n,"listedIds")}function U(e,t,n){return B(e,t,n,"outlyingIds")}function _(e,t,n,r){switch(r){case"thread":return $(e,t,n);case"pinned":return G(e,t);case"scheduled":return W(e,t)}}function $(e,t,n){return B(e,t,n,"viewportIds")}function G(e,t){return B(e,t,o.MAIN_THREAD_ID,"pinnedIds")}function W(e,t){return B(e,t,o.MAIN_THREAD_ID,"scheduledIds")}function H(e,t,n){return B(e,t,n,"scrollOffset")}function z(e,t,n){return B(e,t,n,"replyingToId")}function K(e,t,n){return B(e,t,n,"editingId")}function V(e,t){return B(e,t,o.MAIN_THREAD_ID,"editingScheduledId")}function q(e,t,n){return B(e,t,n,"draft")}function J(e,t,n){return B(e,t,n,"noWebPage")}function Q(e,t,n){return B(e,t,n,"threadInfo")}function Y(e,t,n){return B(e,t,n,"firstMessageId")}function Z(e,t,n){return B(e,t,n,"replyStack")}function X(e,t,n){if(n===o.MAIN_THREAD_ID)return l(e,t);const r=Q(e,t,n);return r?l(e,r.originChannelId||t):void 0}function ee(e,t,n){if(n===o.MAIN_THREAD_ID)return;const r=Q(e,t,n);return r?r.topMessageId:void 0}function te(e,t,n){const r=e.messages.byChatId[t];if(!r)return;const{replyToMessageId:u,replyToTopMessageId:o}=n;return u||o?Object.values(r.threadsById).find(e=>e.threadInfo&&(u&&u===e.threadInfo.topMessageId||o&&o===e.threadInfo.topMessageId)):void 0}function ne(e,t,n){const r=D(e);if(!r)return!1;const{threadInfo:u}=te(e,t,n)||{};return t===r.chatId&&(r.threadId===o.MAIN_THREAD_ID||u&&r.threadId===u.threadId)}function re(e,t,n){const r=$(e,t,n);if(!r||!r.length)return!0;let u;if(n===o.MAIN_THREAD_ID){const n=l(e,t);if(!n||!n.lastMessage)return!0;u=n.lastMessage.id}else{const r=Q(e,t,n);if(!r||!r.lastMessageId)return;u=r.lastMessageId}return u>=c.T&&!ue(e,t,u)||r[r.length-1]>=u}function ue(e,t,n){const r=x(e,t);return r?r[n]:void 0}function oe(e,t,n){const r=F(e,t);return r?r[n]:void 0}function ce(e,t,n,r){if("scheduled"===r){const n=V(e,t);return n?oe(e,t,n):void 0}{const r=K(e,t,n);return r?ue(e,t,r):void 0}}function de(e,t){let n;for(const r of Object.values(e.messages.byChatId)){const{byId:e}=r;if(n=Object.values(e).find(e=>e.content.poll&&e.content.poll.id===t),n)break}return n}function ae(e,t){const{chatId:n,messageId:r}=e.focusedMessage||{};return n===t?r:void 0}function ie(e,t){const n=ae(e,t.chatId);return!!n&&(n===t.id||n===t.previousLocalId)}function se(e,t,n=!1){return function(e,t){const{lastReadOutboxMessageId:n}=l(e,t.chatId)||{};return Object(d.xb)(t)||!n||n0?a(e,n):l(e,n)}function le(e,t){const{forwardInfo:n}=t;if(n)return n.isChannelPost&&n.fromChatId?l(e,n.fromChatId):n.senderUserId?a(e,n.senderUserId):void 0}function be(e,t,n){const{serverTimeOffset:r}=e,u=l(e,t.chatId);if(!u||u.isRestricted)return{};const o=Object(d.ob)(u.id),c=h(e,t.chatId),a=Object(d.lb)(u),i=Object(d.qb)(u),s=Object(d.mb)(u),f=Object(d.Ab)(t),b=Object(d.yb)(t),m=Object(d.gb)(t),{content:p}=t,g=(c||i&&Object(d.p)(u,"pinMessages")||s&&Object(d.p)(u,"editMessages")||Date.now()+1e3*r-1e3*t.date<1728e5)&&!(p.sticker||p.contact||p.poll||p.action||p.audio||p.video&&p.video.isRound)&&!Object(d.tb)(t)&&!t.viaBotId,y=Object(d.d)(u,n)&&!f,v=o||u.isCreator||!s&&!Object(d.Db)(u,"pinMessages")||Object(d.p)(u,"pinMessages");let O=!m&&v,j=!1;const w=G(e,u.id);O&&(j=Boolean(w&&w.includes(t.id)),O=!j);const I=o||b||a||u.isCreator||Object(d.p)(u,"deleteMessages"),C=!o&&!b,E=I&&!f&&(o&&!c||a&&(b||Object(d.p)(u,"deleteMessages")||u.isCreator)),S=!m&&g&&(b||s&&(u.isCreator||Object(d.p)(u,"editMessages"))),M=!m&&!f,A=Boolean(t.content.sticker),k=A&&function(e,t){const{stickers:n}=e.stickers.favorite;return n&&n.some(({id:e})=>e===t.id)}(e,t.content.sticker),T=!m&&A&&!k,N=!m&&k,P=!m,D=!m&&(s||i),L=!m;return{noOptions:[y,S,O,j,I,E,M,T,N,P,D,L].every(e=>!e),canReply:y,canEdit:S,canPin:O,canUnpin:j,canDelete:I,canReport:C,canDeleteForAll:E,canForward:M,canFaveSticker:T,canUnfaveSticker:N,canCopy:P,canCopyLink:D,canSelect:L}}function he(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=D(e)||{},u=n&&x(e,n);if(!u||!t||!r)return{};const o=t.map(t=>u[t]&&be(e,u[t],r)).filter(Boolean);return{canDelete:o.every(e=>e.canDelete),canDeleteForAll:o.every(e=>e.canDeleteForAll)}}function me(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=D(e)||{},u=n&&x(e,n);if(!u||!t||!r)return!1;return t.map(t=>u[t]&&be(e,u[t],r)).filter(Boolean).every(e=>e.canReport)}function pe(e,t){const n=e.fileUploads.byMessageLocalId[t.previousLocalId||t.id];return n?n.progress:void 0}function ge(e,t,n){if(n===o.MAIN_THREAD_ID){const n=l(e,t);if(!n)return;if(!n.lastReadInboxMessageId)return;return n.lastMessage?Object(d.xb)(n.lastMessage)?n.lastMessage.id:Math.min(n.lastMessage.id,n.lastReadInboxMessageId):n.lastReadInboxMessageId}{const r=Q(e,t,n);if(!r)return;return r.lastReadInboxMessageId?Math.min(r.lastReadInboxMessageId,r.lastMessageId||1/0):r.topMessageId}}function ye(e,t,n){const r=l(e,t);if(n===o.MAIN_THREAD_ID){if(!r)return}else{const r=Q(e,t,n);if(!r||r.lastMessageId===r.lastReadInboxMessageId)return}const u=U(e,t,n),c=R(e,t,n),d=x(e,t);if(!d||!u&&!c)return;const a=ge(e,t,n);if(a||!r||!r.isNotJoined){if(u){const e=a?u.find(e=>e>a&&d[e]&&(!d[e].isOutgoing||d[e].isFromScheduled)):u[0];if(e)return e}if(c){const e=a?c.find(e=>e>a&&d[e]&&(!d[e].isOutgoing||d[e].isFromScheduled)):c[0];if(e)return e}}}function ve(e){const{forwardMessages:t}=e;return Boolean(t.isModalShown)}function Oe(e,t){const n=Object.values(e.chats.byId).find(e=>Object(d.rb)(e)&&e.lastMessage&&e.lastMessage.id===t);if(n)return n.id;const{byChatId:r}=e.messages;return Number(Object.keys(r).find(n=>{const u=l(e,Number(n));return u&&Object(d.rb)(u)&&r[u.id].byId[t]}))}function je(e){const{selectedMessages:t}=e;return Boolean(t)}function we(e,t){const{messageIds:n}=e.selectedMessages||{};return!!n&&n.includes(t)}function Ie(e,t,n){const r=x(e,t);if(r)return Object.values(r).filter(e=>e.groupedId===n&&e.forwardInfo).map(({forwardInfo:e})=>e.fromMessageId)}function Ce(e,t,n){const r=x(e,t);if(r)return Object.keys(r).map(Number).filter(e=>r[e].groupedId===n)}function Ee(e,t,n){const{messageIds:r}=e.selectedMessages||{};if(!r)return!1;const u=Ce(e,t,n);return u&&u.every(e=>r.includes(e))}function Se(e){const{messageIds:t}=e.selectedMessages||{};return t?t.length:0}function Me(e,t){const n=l(e,t);if(!n)return;if(!m(e,n))return;const r=x(e,t),u=$(e,t,o.MAIN_THREAD_ID);if(!r||!u)return;const c=Object(M.g)(u,e=>!r[e].isOutgoing&&Boolean(r[e].keyboardButtons)),d=Object(M.g)(u,e=>Boolean(r[e].shouldHideKeyboardButtons));return c&&d&&d>c?void 0:c?r[c]:void 0}function Ae(e,t,n,r){const{shouldAutoDownloadMediaFromContacts:u,shouldAutoDownloadMediaInPrivateChats:o,shouldAutoDownloadMediaInGroups:c,shouldAutoDownloadMediaInChannels:a}=e.settings.byKey;return Boolean(o&&Object(d.ob)(n.id)||c&&Object(d.nb)(n)||a&&Object(d.mb)(n)||u&&r&&(r.id===e.currentUserId||function(e,t){return e.contactList&&e.contactList.userIds.includes(t.id)}(e,r)))}function ke(e,t){const n=Object(d.Q)(t)||Object(d.T)(t);if(!n)return;const{shouldAutoPlayVideos:r,shouldAutoPlayGifs:u}=e.settings.byKey,o=n.isGif||n.isRound;return r&&!o||u&&o}function Te(e){return e.settings.byKey.shouldLoopStickers}function Ne(e){const{chatId:t,threadId:n}=D(e)||{};if(!t||!n)return;const r=Object(d.a)(t,n),u=e.localTextSearch.byChatThreadKey[r];return u&&u.isActive?u:void 0}function Pe(e){const{byChatId:t}=e.localMediaSearch,{chatId:n}=D(e)||{},r=e.users.selectedId;return r&&t[r]?r:n}function De(e){const t=Pe(e);if(t)return e.localMediaSearch.byChatId[t]}function Le(e,t){return e.management.byChatId[t]}function xe(e){const{chatId:t,threadId:n}=D(e)||{};if(!t||!n)return;if(Object(d.ob)(t))return"user";const r=l(e,t);return r?Object(d.nb)(r)?"group":"channel":void 0}function Fe(e){const{mediaViewer:t}=e;return Boolean(t.messageId||t.avatarOwnerId)}function Be(e){const{users:t,isChatInfoShown:n,newChatMembersProgress:o}=e,c=o!==r.i.Closed,d=function(e){const{pollResults:t}=e;return Boolean(t.messageId)}(e),a=Boolean(!u.l&&Ne(e)),i=function(e){const{chatId:t,threadId:n}=D(e)||{};if(!t||!n)return;const r=e.management.byChatId[t];return r&&r.isActive?r:void 0}(e),s=void 0!==A(e).query,f=void 0!==k(e).query,{chatId:l}=D(e)||{},b=t.selectedId,h=O(e),m=Boolean(b&&h),p=Boolean(l&&h)&&n;return d?r.m.PollResults:a?r.m.Search:i?r.m.Management:s?r.m.StickerSearch:f?r.m.GifSearch:c?r.m.AddingMembers:m?r.m.UserInfo:p?r.m.ChatInfo:void 0}function Re(e){return void 0!==Be(e)}function Ue(e){const{theme:t,shouldUseSystemTheme:n}=e.settings.byKey;return n?Object(u.s)():t}function _e(e){return e.globalSearch.query}function $e(e){return e.payment.messageId}function Ge(e){return e.payment.formId}function We(e){return e.payment.nativeParams?e.payment.nativeParams.publishableKey:void 0}function He(e){return e.payment.stripeCredentials}},function(e,t,n){"use strict";var r=n(69);n.o(r,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return r.ApiMediaFormat})),n.o(r,"ApiMessageEntityTypes")&&n.d(t,"ApiMessageEntityTypes",(function(){return r.ApiMessageEntityTypes})),n.o(r,"MAIN_THREAD_ID")&&n.d(t,"MAIN_THREAD_ID",(function(){return r.MAIN_THREAD_ID})),n.o(r,"MESSAGE_DELETED")&&n.d(t,"MESSAGE_DELETED",(function(){return r.MESSAGE_DELETED}));var u=n(70);n.o(u,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return u.ApiMediaFormat})),n.o(u,"ApiMessageEntityTypes")&&n.d(t,"ApiMessageEntityTypes",(function(){return u.ApiMessageEntityTypes})),n.o(u,"MAIN_THREAD_ID")&&n.d(t,"MAIN_THREAD_ID",(function(){return u.MAIN_THREAD_ID})),n.o(u,"MESSAGE_DELETED")&&n.d(t,"MESSAGE_DELETED",(function(){return u.MESSAGE_DELETED}));var o=n(71);n.d(t,"ApiMessageEntityTypes",(function(){return o.a})),n.d(t,"MAIN_THREAD_ID",(function(){return o.b})),n.d(t,"MESSAGE_DELETED",(function(){return o.c}));var c=n(72);n.o(c,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return c.ApiMediaFormat}));var d=n(73);n.d(t,"ApiMediaFormat",(function(){return d.a}));n(74),n(75),n(76),n(77)},function(e,t,n){"use strict";t.a=(...e)=>e.filter(Boolean).join(" ")},function(e,t,n){"use strict";function r(e,t,n=!0,r=!0){let u;return(...o)=>{u?(clearTimeout(u),u=void 0):n&&e(...o),u=self.setTimeout(()=>{r&&e(...o),u=void 0},t)}}function u(e,t,n=!0){let r,u,o;return(...c)=>{u=!0,o=c,r||(n&&(u=!1,e(...o)),r=self.setInterval(()=>{if(!u)return self.clearInterval(r),void(r=void 0);u=!1,e(...o)},t))}}function o(e){return d(m,e)}function c(e){return d(p,e)}function d(e,t){let n,r=!1;return(...u)=>{n=u,r||(r=!0,e(()=>{r=!1,t(...n)}))}}function a(e){Promise.resolve().then(e)}function i(e){self.requestIdleCallback?self.requestIdleCallback(e):a(e)}n.d(t,"a",(function(){return r})),n.d(t,"h",(function(){return u})),n.d(t,"j",(function(){return o})),n.d(t,"i",(function(){return c})),n.d(t,"e",(function(){return a})),n.d(t,"d",(function(){return i})),n.d(t,"f",(function(){return s})),n.d(t,"g",(function(){return f})),n.d(t,"b",(function(){return m})),n.d(t,"c",(function(){return g}));const s=e=>new Promise(t=>{setTimeout(()=>t(),e)});function f(){return new Promise(e=>{m(e)})}let l,b,h;function m(e,t=!1){l?t?b.push(e):l.push(e):(l=t?[]:[e],b=t?[e]:[],requestAnimationFrame(()=>{const e=l,t=b;l=void 0,b=void 0,t.forEach(e=>e()),e.forEach(e=>e())}))}function p(e){m(e,!0)}function g(e,t=!1){return h||(h=[],self.addEventListener("beforeunload",()=>{h.forEach(e=>e())})),t?h.push(e):h.unshift(e),()=>{h=h.filter(t=>t!==e)}}},function(e,t,n){"use strict";n.d(t,"s",(function(){return o})),n.d(t,"J",(function(){return c})),n.d(t,"t",(function(){return d})),n.d(t,"I",(function(){return i})),n.d(t,"N",(function(){return s})),n.d(t,"c",(function(){return f})),n.d(t,"L",(function(){return l})),n.d(t,"K",(function(){return b})),n.d(t,"O",(function(){return p})),n.d(t,"y",(function(){return v})),n.d(t,"d",(function(){return O})),n.d(t,"b",(function(){return j})),n.d(t,"M",(function(){return w})),n.d(t,"fb",(function(){return I})),n.d(t,"k",(function(){return C})),n.d(t,"l",(function(){return E})),n.d(t,"W",(function(){return S})),n.d(t,"eb",(function(){return M})),n.d(t,"h",(function(){return k})),n.d(t,"A",(function(){return T})),n.d(t,"lb",(function(){return N})),n.d(t,"mb",(function(){return P})),n.d(t,"v",(function(){return D})),n.d(t,"Q",(function(){return L})),n.d(t,"P",(function(){return x})),n.d(t,"n",(function(){return F})),n.d(t,"H",(function(){return B})),n.d(t,"o",(function(){return R})),n.d(t,"jb",(function(){return U})),n.d(t,"ib",(function(){return _})),n.d(t,"R",(function(){return $})),n.d(t,"r",(function(){return G})),n.d(t,"kb",(function(){return W})),n.d(t,"p",(function(){return H})),n.d(t,"z",(function(){return K})),n.d(t,"ob",(function(){return J})),n.d(t,"rb",(function(){return Q})),n.d(t,"g",(function(){return Y})),n.d(t,"gb",(function(){return Z})),n.d(t,"m",(function(){return X})),n.d(t,"pb",(function(){return ee})),n.d(t,"qb",(function(){return te})),n.d(t,"S",(function(){return ue})),n.d(t,"T",(function(){return oe})),n.d(t,"V",(function(){return ce})),n.d(t,"U",(function(){return de})),n.d(t,"Z",(function(){return se})),n.d(t,"u",(function(){return fe})),n.d(t,"ab",(function(){return le})),n.d(t,"Y",(function(){return he})),n.d(t,"X",(function(){return me})),n.d(t,"cb",(function(){return ge})),n.d(t,"bb",(function(){return ye})),n.d(t,"w",(function(){return ve})),n.d(t,"x",(function(){return Oe})),n.d(t,"f",(function(){return je})),n.d(t,"e",(function(){return we})),n.d(t,"db",(function(){return Ie})),n.d(t,"a",(function(){return Ce})),n.d(t,"q",(function(){return Ee})),n.d(t,"nb",(function(){return Se})),n.d(t,"hb",(function(){return Me})),n.d(t,"F",(function(){return Ae})),n.d(t,"D",(function(){return ke})),n.d(t,"B",(function(){return Te})),n.d(t,"G",(function(){return Ne})),n.d(t,"C",(function(){return Pe})),n.d(t,"E",(function(){return De})),n.d(t,"i",(function(){return Le})),n.d(t,"j",(function(){return xe}));var r=n(2),u=n(3);function o(e,t,n){return{...e,chats:{...e.chats,listIds:{...e.chats.listIds,[t]:n}}}}function c(e,t,n){const{[t]:r}=e.chats.listIds,u=r&&r.length?n.filter(e=>!r.includes(e)):n;return r&&!u.length?e:o(e,t,[...r||[],...u])}function d(e,t){return{...e,chats:{...e.chats,byId:t}}}function a(e,t,n,r){const{byId:o}=e.chats,c=o[t],d=n.isMin&&c&&!c.isMin,a={...c,...d?Object(u.j)(n,["isMin","accessHash"]):n,...r&&{photos:[r,...c.photos||[]]}};return a.id&&a.type,a}function i(e,t,n,r){const{byId:u}=e.chats;return d(e,{...u,[t]:a(e,t,n,r)})}function s(e,t){const n=Object.keys(t).map(Number).reduce((n,r)=>{const u=a(e,r,t[r]);return u&&(n[r]=u),n},{});return e=d(e,{...e.chats.byId,...n})}function f(e,t){const{byId:n}=e.chats;let r=!1;const u=Object.keys(t).map(Number).reduce((u,o)=>{if(!n[o]||n[o].isMin&&!t[o].isMin){const n=a(e,o,t[o]);n&&(u[o]=n,r||(r=!0))}return u},{});return r&&(e=d(e,{...e.chats.byId,...u})),e}function l(e,t,n){const u=n===r.i?"archived":"active";let o=e.chats.listIds;return Object.keys(o).forEach(e=>{const n=o[e]||[];e!==u||n.includes(t)?e!==u&&n.includes(t)&&(o={...o,[e]:n.filter(e=>e!==t)}):o={...o,[e]:[...n,t]}}),e=i(e={...e,chats:{...e.chats,listIds:o}},t,{folderId:n||void 0})}function b(e,t,n){const r="active"===t?"all":"archived";return{...e,chats:{...e.chats,...n.orderedPinnedIds&&{orderedPinnedIds:{...e.chats.orderedPinnedIds,[t]:n.orderedPinnedIds}},totalCount:{...e.chats.totalCount,[r]:n.totalChatCount},isFullyLoaded:{...e.chats.isFullyLoaded,[t]:!1}}}}var h=n(8),m=n(7);function p(e,t,n=h.MAIN_THREAD_ID,u="thread",o){const{messageLists:c}=e.messages;let d=c;if(o||r.N)d=t?[{chatId:t,threadId:n,type:u}]:[];else if(t){const e=c[c.length-1];e&&e.chatId===t&&e.threadId===n&&e.type===u||(d=e&&-1===e.chatId?[...c.slice(0,-1),{chatId:t,threadId:n,type:u}]:[...c,{chatId:t,threadId:n,type:u}])}else d=c.slice(0,-1);return{...e,messages:{...e.messages,messageLists:d}}}function g(e,t,n){return y(e,t,{byId:n})}function y(e,t,n){const r=e.messages.byChatId[t]||{byId:{},threadsById:{}};return{...e,messages:{...e.messages,byChatId:{...e.messages.byChatId,[t]:{...r,...n}}}}}function v(e,t,n,r,u){return function(e,t,n,r){const u=e.messages.byChatId[t];return y(e,t,{threadsById:{...u&&u.threadsById,[n]:{...u&&u.threadsById[n],...r}}})}(e,t,n,{[r]:u})}function O(e,t){const n=t.reduce((e,t)=>(e[t.chatId]||(e[t.chatId]={}),e[t.chatId][t.id]=t,e),{});return Object.keys(n).map(Number).forEach(t=>{e=j(e,t,n[t])}),e}function j(e,t,n){const r=Object(m.n)(e,t);return r&&Object.keys(n).every(e=>Boolean(r[Number(e)]))?e:g(e,t,{...n,...r})}function w(e,t,n,r){const u=Object(m.n)(e,t)||{},o={...u[n],...r};return o.id?g(e,t,{...u,[n]:o}):e}function I(e,t,n,r){const u=Object(m.sb)(e,t)||{},o={...u[n],...r};return o.id?D(e,t,{...u,[n]:o},void 0):e}function C(e,t,n){const r=Object(m.n)(e,t);if(!r)return e;const o=Object(u.j)(r,n),c=Object.values(Object(u.m)(r,n)).filter(({forwardInfo:e})=>e&&e.isLinkedChannelPost);if(Object.keys(e.messages.byChatId[t].threadsById).map(Number).forEach(r=>{const u=Object(m.Fb)(e,t,r);let o=Object(m.Z)(e,t,r),c=Object(m.hb)(e,t,r),d=Object(m.Kb)(e,t,r),a=Object(m.kb)(e,t),i=u?u.messagesCount:void 0;n.forEach(e=>{o&&o.includes(e)&&(o=o.filter(t=>t!==e),void 0!==i&&(i-=1)),c&&c.includes(e)&&(c=c.filter(t=>t!==e)),d&&d.includes(e)&&(d=d.filter(t=>t!==e)),a&&a.includes(e)&&(a=a.filter(t=>t!==e))}),e=v(e,t,r,"listedIds",o),e=v(e,t,r,"outlyingIds",c),e=v(e,t,r,"viewportIds",d),e=v(e,t,r,"pinnedIds",a),u&&void 0!==i&&(e=v(e,t,r,"threadInfo",{...u,messagesCount:i}))}),c.length){const n=Object(m.z)(e),r=n&&n.chatId===t&&"thread"===n.type,u=n&&n.threadId;c.forEach(n=>{const{fromChatId:o,fromMessageId:c}=n.forwardInfo,d=Object(m.l)(e,o,c);r&&u===c&&(e=p(e,t)),d&&(e=w(e,o,c,{threadInfo:void 0}))})}return e=g(e,t,o)}function E(e,t,n){const r=Object(m.sb)(e,t);if(!r)return e;const o=Object(u.j)(r,n);let c=Object(m.qb)(e,t);return c&&(n.forEach(e=>{c.includes(e)&&(c=c.filter(t=>t!==e))}),e=v(e,t,h.MAIN_THREAD_ID,"scheduledIds",c)),e=D(e,t,o,void 0)}function S(e,t,n,r){const u=Object(m.Z)(e,t,n),o=u&&u.length?r.filter(e=>!u.includes(e)):r;return u&&!o.length?e:v(e,t,n,"listedIds",A([...u||[],...o]))}function M(e,t,n,r){const u=Object(m.hb)(e,t,n),o=u&&u.length?r.filter(e=>!u.includes(e)):r;return u&&!o.length?e:v(e,t,n,"outlyingIds",A([...u||[],...o]))}function A(e){return e.sort((e,t)=>e-t)}function k(e,t,n,u){const o=Object(m.Kb)(e,t,n)||[];if(o.includes(u))return e;return v(e,t,n,"viewportIds",A([...o.length{e=N(e,t.chatId,t.threadId,t)}),e}function D(e,t,n,r){return function(e,t,n){const r=e.scheduledMessages.byChatId[t]||{byId:{},hash:0};return{...e,scheduledMessages:{byChatId:{...e.scheduledMessages.byChatId,[t]:{...r,...n}}}}}(e,t,{byId:n,hash:r})}function L(e,t,n,r=!1){return{...e,focusedMessage:{...e.focusedMessage,chatId:t,messageId:n,noHighlight:r}}}function x(e,t){return{...e,focusedMessage:{...e.focusedMessage,direction:t}}}function F(e,t,n){return{...e,selectedMessages:{chatId:t,messageIds:n?Array.prototype.concat([],n):[]}}}function B(e,t,n,r,o,c,d,a=!1){const{selectedMessages:i}=e;c&&(d=Object(m.bb)(e,t,c));const s=d||[o];if(!i)return F(e,t,s);const{messageIds:f}=i;let l;const b=s.filter(e=>!f.includes(e));if(b&&!b.length)l=f.filter(e=>!s.includes(e));else if(a&&f.length){const c=Object(m.y)(e,t,n,r),d=c.indexOf(f[f.length-1]),a=c.indexOf(o),i=Math.min(d,a),s=Math.max(d,a),b=c.slice(i,s+1);l=Object(u.o)([...f,...b])}else l=[...f,...b];return l.length?{...e,selectedMessages:{...i,messageIds:l}}:R(e)}function R(e){return{...e,selectedMessages:void 0}}function U(e,t,n,r,o){const c=r.map(t=>{const n=e.stickers.setsById[t.id];return n?{...n,...t}:t});return{...e,stickers:{...e.stickers,setsById:{...e.stickers.setsById,...Object(u.c)(c,"id")},[t]:{...e.stickers[t],hash:n,..."search"===t?{resultIds:o}:{setIds:r.map(({id:e})=>e)}}}}}function _(e,t,n){const r=e.stickers.setsById[t]||{};return{...e,stickers:{...e.stickers,setsById:{...e.stickers.setsById,[t]:{...r,...n}}}}}function $(e,t,n,r){const{results:u}=e.gifs.search;let o;if(t||!u)o=n;else{const e=new Set(u.map(e=>e.id));o=[...u,...n.filter(t=>!e.has(t.id))]}return{...e,gifs:{...e.gifs,search:{...e.gifs.search,offset:r,results:o}}}}function G(e,t){return{...e,animatedEmojis:t}}function W(e,t,n,r){const o=[...Object(m.Ab)(e,t),...n||[]],c=Object(u.o)(o.map(({id:e})=>e)),d=Object(u.c)(o,"id"),a=c.map(e=>d[e]);return{...e,stickers:{...e.stickers,forEmoji:{emoji:t,stickers:a,hash:r}}}}function H(e){const{emoji:t,stickers:n,hash:r}=e.stickers.forEmoji||{};return t?W(e,t,n,r):e}var z=n(51);function K(e,t){return{...e,users:{...e.users,byId:t}}}function V(e,t,n){const{byId:r}=e.users,o=r[t],c=n.isMin&&o&&!o.isMin,d={...o,...c?Object(u.j)(n,["isMin","accessHash"]):n};return d.id&&d.type?d:o}function q(e,t){const{hash:n,userIds:r}=e.contactList||{};if(!r)return e;const u=t.filter(e=>e&&e.isContact&&!r.includes(e.id)).map(e=>e.id);return 0===u.length?e:{...e,contactList:{hash:n||0,userIds:[...u,...r]}}}function J(e,t,n){const{byId:r}=e.users,u=V(e,t,n);return K(e=q(e,[u]),{...r,[t]:u})}function Q(e,t){const n=Object.keys(t).map(Number).reduce((n,r)=>{const u=V(e,r,t[r]);return u&&(n[r]=u),n},{});return e=K(e=q(e,Object.values(n)),{...e.users.byId,...n})}function Y(e,t){const{byId:n}=e.users;let r=!1;const u=Object.keys(t).map(Number).reduce((u,o)=>{if(!n[o]||n[o].isMin&&!t[o].isMin){const n=V(e,o,t[o]);n&&(u[o]=n,r||(r=!0))}return u},{});return r&&(e=q(e=K(e,{...e.users.byId,...u}),Object.values(u))),e}function Z(e,t){return e.users.selectedId===t?e:{...e,users:{...e.users,selectedId:t}}}function X(e,t){const{byId:n}=e.users,{hash:r,userIds:u}=e.contactList||{};return delete n[t],K(e={...e,contactList:{hash:r||0,userIds:u?u.filter(e=>e!==t):z.a}},n)}function ee(e,t){return{...e,userSearch:{...e.userSearch,...t}}}function te(e,t){return ee(e,{fetchingStatus:t})}function ne(e,t,n){const{byId:r}=e.users,u=r[t];return u&&u.fullInfo?J(e,t,{...u,fullInfo:{...u.fullInfo,isBlocked:n}}):e}const re=e=>`${e.chatId}_${e.id}`;function ue(e,t){return{...e,globalSearch:{...e.globalSearch,...t}}}function oe(e,t){return ue(e,{currentContent:t})}function ce(e,t,n,r,o){const{resultsByType:c}=e.globalSearch||{},d=t.reduce((e,t)=>(e[re(t)]=t,e),{}),a=c&&c[r]?c[r].foundIds:void 0;if(void 0!==a&&Object.keys(d).every(e=>a.includes(re(d[e]))))return de(e,{messages:!1});const i=a||[],s=t.map(e=>re(e)),f=Array.prototype.concat(i,s),l=Object(u.a)(i,f)?i:f;return ue(e=de(e,{messages:!1}),{resultsByType:{...(e.globalSearch||{}).resultsByType,[r]:{totalCount:n,nextOffsetId:o,foundIds:l}}})}function de(e,t){return ue(e,{fetchingStatus:{...e.globalSearch.fetchingStatus,...t}})}var ae=n(4);function ie(e,t,n){return{...e,localTextSearch:{byChatThreadKey:{...e.localTextSearch.byChatThreadKey,[t]:n}}}}function se(e,t,n,r,u){const o=Object(ae.a)(t,n);return ie(e,o,{...e.localTextSearch.byChatThreadKey[o],isActive:r,query:u})}function fe(e,t,n,r,u,o){const c=Object(ae.a)(t,n);return ie(e,c,{...e.localTextSearch.byChatThreadKey[c],results:{foundIds:r,totalCount:u,nextOffsetId:o}})}function le(e,t,n,r,o,c){const d=Object(ae.a)(t,n),{results:a}=e.localTextSearch.byChatThreadKey[d]||{},i=a&&a.foundIds||[],s=pe(Object(u.o)(Array.prototype.concat(i,r)));return fe(e,t,n,Object(u.a)(i,s)?i:s,o,c)}function be(e,t,n){return{...e,localMediaSearch:{byChatId:{...e.localMediaSearch.byChatId,[t]:n}}}}function he(e,t,n){return be(e,t,{...e.localMediaSearch.byChatId[t],currentType:n})}function me(e,t,n,r,o,c){const{resultsByType:d}=e.localMediaSearch.byChatId[t]||{},a=d&&d[n]?d[n].foundIds:[],i=pe(Object(u.o)(Array.prototype.concat(a,r)));return function(e,t,n,r,u,o){return be(e,t,{...e.localMediaSearch.byChatId[t],resultsByType:{...(e.localMediaSearch.byChatId[t]||{}).resultsByType,[n]:{foundIds:r,totalCount:u,nextOffsetId:o}}})}(e,t,n,Object(u.a)(a,i)?a:i,o,c)}function pe(e){return e.sort((e,t)=>e-t)}function ge(e,t){return{...e,management:{...e.management,progress:t}}}function ye(e,t,n){return{...e,management:{...e.management,byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t]||{},...n}}}}}function ve(e,t){return{...e,settings:{...e.settings,byKey:{...e.settings.byKey,...t}}}}function Oe(e,t,n){return{...e,settings:{...e.settings,themes:{...e.settings.themes,[t]:{...e.settings.themes[t]||{},...n}}}}}function je(e,t){return t.forEach(t=>{const{chatId:n,...r}=t;e=we(e,n,r)}),e}function we(e,t,n){return{...e,settings:{...e.settings,notifyExceptions:{...e.settings.notifyExceptions,[t]:n}}}}function Ie(e,t,n,r){switch(t){case"contact":return ve(e,{...void 0!==n&&{hasPrivateChatsNotifications:!n},...void 0!==r&&{hasPrivateChatsMessagePreview:r}});case"group":return ve(e,{...void 0!==n&&{hasGroupNotifications:!n},...void 0!==r&&{hasGroupMessagePreview:r}});case"broadcast":return ve(e,{...void 0!==n&&{hasBroadcastNotifications:!n},...void 0!==r&&{hasBroadcastMessagePreview:r}});default:return}}function Ce(e,t){return e=ne(e,t,!0),{...e,blocked:{...e.blocked,ids:[t,...e.blocked.ids],totalCount:e.blocked.totalCount+1}}}function Ee(e,t){return e=ne(e,t,!1),{...e,blocked:{...e.blocked,ids:e.blocked.ids.filter(e=>e!==t),totalCount:e.blocked.totalCount-1}}}function Se(e,t){return{...e,twoFaSettings:{...e.twoFaSettings,...t}}}function Me(e,t){return{...e,payment:{...e.payment,shippingOptions:t}}}function Ae(e,t){return{...e,payment:{...e.payment,formId:t}}}function ke(e,t){return{...e,payment:{...e.payment,step:t}}}function Te(e,t){if(!t.content||!t.content.invoice)return e;const{title:n,text:r,description:u,photoUrl:o}=t.content.invoice;return{...e,payment:{...e.payment,invoiceContent:{title:n,text:r,description:u,photoUrl:o}}}}function Ne(e,t){return{...e,payment:{...e.payment,stripeCredentials:{...t}}}}function Pe(e,t){return{...e,payment:{...e.payment,...t}}}function De(e,t,n){if(!t||!n)return{...e,payment:{...e.payment,receipt:void 0}};const{invoice:r}=n.content,{photoUrl:u,text:o,title:c}=r||{};return{...e,payment:{...e.payment,receipt:{...t,photoUrl:u,text:o,title:c}}}}function Le(e){return{...e,payment:{}}}function xe(e){return{...e,payment:{...e.payment,isPaymentModalOpen:!1}}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"c",(function(){return o})),n.d(t,"d",(function(){return c})),n.d(t,"b",(function(){return d}));const r=self.caches;let u;async function o(e,t,n){if(r)try{const o=new Request(t.replace(/:/g,"_")),c=await r.open(e),d=await c.match(o);if(!d)return;switch(n){case u.Text:return await d.text();case u.Blob:{const e=await d.blob();if("sticker"===t.substr(0,7))return new Blob([e],{type:"image/webp"});if(!e.type){const t=d.headers.get("Content-Type");if(t)return new Blob([e],{type:t})}return e}case u.Json:return await d.json();default:return}}catch(e){return void console.warn(e)}}async function c(e,t,n){if(r)try{const u="string"==typeof n||n instanceof Blob?n:JSON.stringify(n),o=new Request(t.replace(/:/g,"_")),c=new Response(u),d=await r.open(e);return await d.put(o,c)}catch(e){return void console.warn(e)}}async function d(e){try{if(!r)return;return await r.delete(e)}catch(e){return void console.warn(e)}}!function(e){e[e.Text=0]="Text",e[e.Blob=1]="Blob",e[e.Json=2]="Json"}(u||(u={}))},function(e,t,n){"use strict";let r,u,o,c,d,a,i,s,f,l,b,h,m;n.d(t,"e",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"n",(function(){return o})),n.d(t,"d",(function(){return c})),n.d(t,"c",(function(){return d})),n.d(t,"m",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"a",(function(){return s})),n.d(t,"k",(function(){return f})),n.d(t,"f",(function(){return l})),n.d(t,"i",(function(){return b})),n.d(t,"l",(function(){return h})),n.d(t,"j",(function(){return m})),n.d(t,"o",(function(){return p})),n.d(t,"g",(function(){return g})),function(e){e[e.Backwards=0]="Backwards",e[e.Forwards=1]="Forwards",e[e.Around=2]="Around"}(r||(r={})),function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Static=2]="Static"}(u||(u={})),function(e){e[e.Main=0]="Main",e[e.EditProfile=1]="EditProfile",e[e.Notifications=2]="Notifications",e[e.Language=3]="Language",e[e.General=4]="General",e[e.GeneralChatBackground=5]="GeneralChatBackground",e[e.GeneralChatBackgroundColor=6]="GeneralChatBackgroundColor",e[e.Privacy=7]="Privacy",e[e.PrivacyPhoneNumber=8]="PrivacyPhoneNumber",e[e.PrivacyLastSeen=9]="PrivacyLastSeen",e[e.PrivacyProfilePhoto=10]="PrivacyProfilePhoto",e[e.PrivacyForwarding=11]="PrivacyForwarding",e[e.PrivacyGroupChats=12]="PrivacyGroupChats",e[e.PrivacyPhoneNumberAllowedContacts=13]="PrivacyPhoneNumberAllowedContacts",e[e.PrivacyPhoneNumberDeniedContacts=14]="PrivacyPhoneNumberDeniedContacts",e[e.PrivacyLastSeenAllowedContacts=15]="PrivacyLastSeenAllowedContacts",e[e.PrivacyLastSeenDeniedContacts=16]="PrivacyLastSeenDeniedContacts",e[e.PrivacyProfilePhotoAllowedContacts=17]="PrivacyProfilePhotoAllowedContacts",e[e.PrivacyProfilePhotoDeniedContacts=18]="PrivacyProfilePhotoDeniedContacts",e[e.PrivacyForwardingAllowedContacts=19]="PrivacyForwardingAllowedContacts",e[e.PrivacyForwardingDeniedContacts=20]="PrivacyForwardingDeniedContacts",e[e.PrivacyGroupChatsAllowedContacts=21]="PrivacyGroupChatsAllowedContacts",e[e.PrivacyGroupChatsDeniedContacts=22]="PrivacyGroupChatsDeniedContacts",e[e.PrivacyActiveSessions=23]="PrivacyActiveSessions",e[e.PrivacyBlockedUsers=24]="PrivacyBlockedUsers",e[e.Folders=25]="Folders",e[e.FoldersCreateFolder=26]="FoldersCreateFolder",e[e.FoldersEditFolder=27]="FoldersEditFolder",e[e.FoldersIncludedChats=28]="FoldersIncludedChats",e[e.FoldersExcludedChats=29]="FoldersExcludedChats",e[e.TwoFaDisabled=30]="TwoFaDisabled",e[e.TwoFaNewPassword=31]="TwoFaNewPassword",e[e.TwoFaNewPasswordConfirm=32]="TwoFaNewPasswordConfirm",e[e.TwoFaNewPasswordHint=33]="TwoFaNewPasswordHint",e[e.TwoFaNewPasswordEmail=34]="TwoFaNewPasswordEmail",e[e.TwoFaNewPasswordEmailCode=35]="TwoFaNewPasswordEmailCode",e[e.TwoFaEnabled=36]="TwoFaEnabled",e[e.TwoFaChangePasswordCurrent=37]="TwoFaChangePasswordCurrent",e[e.TwoFaChangePasswordNew=38]="TwoFaChangePasswordNew",e[e.TwoFaChangePasswordConfirm=39]="TwoFaChangePasswordConfirm",e[e.TwoFaChangePasswordHint=40]="TwoFaChangePasswordHint",e[e.TwoFaTurnOff=41]="TwoFaTurnOff",e[e.TwoFaRecoveryEmailCurrentPassword=42]="TwoFaRecoveryEmailCurrentPassword",e[e.TwoFaRecoveryEmail=43]="TwoFaRecoveryEmail",e[e.TwoFaRecoveryEmailCode=44]="TwoFaRecoveryEmailCode",e[e.TwoFaCongratulations=45]="TwoFaCongratulations"}(o||(o={})),function(e){e[e.ChatList=0]="ChatList",e[e.GlobalSearch=1]="GlobalSearch",e[e.Settings=2]="Settings",e[e.Contacts=3]="Contacts",e[e.Archived=4]="Archived",e[e.NewChannelStep1=5]="NewChannelStep1",e[e.NewChannelStep2=6]="NewChannelStep2",e[e.NewGroupStep1=7]="NewGroupStep1",e[e.NewGroupStep2=8]="NewGroupStep2"}(c||(c={})),function(e){e[e.ChatList=0]="ChatList",e[e.Media=1]="Media",e[e.Links=2]="Links",e[e.Files=3]="Files",e[e.Music=4]="Music",e[e.Voice=5]="Voice"}(d||(d={})),function(e){e[e.ChatInfo=0]="ChatInfo",e[e.UserInfo=1]="UserInfo",e[e.Search=2]="Search",e[e.Management=3]="Management",e[e.StickerSearch=4]="StickerSearch",e[e.GifSearch=5]="GifSearch",e[e.PollResults=6]="PollResults",e[e.AddingMembers=7]="AddingMembers"}(a||(a={})),function(e){e[e.Inline=0]="Inline",e[e.ScheduledInline=1]="ScheduledInline",e[e.SharedMedia=2]="SharedMedia",e[e.ProfileAvatar=3]="ProfileAvatar",e[e.MiddleHeaderAvatar=4]="MiddleHeaderAvatar",e[e.Album=5]="Album",e[e.ScheduledAlbum=6]="ScheduledAlbum",e[e.SearchResult=7]="SearchResult"}(i||(i={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(s||(s={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(f||(f={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(l||(l={})),function(e){e[e.Closed=0]="Closed",e[e.InProgress=1]="InProgress",e[e.Loading=2]="Loading"}(b||(b={})),function(e){e[e.Profile=0]="Profile",e[e.SharedMedia=1]="SharedMedia",e[e.MemberList=2]="MemberList"}(h||(h={})),function(e){e[e.ShippingInfo=0]="ShippingInfo",e[e.Shipping=1]="Shipping",e[e.PaymentInfo=2]="PaymentInfo",e[e.Checkout=3]="Checkout"}(m||(m={}));const p="UPLOADING_WALLPAPER_SLUG";let g;!function(e){e[e.Initial=0]="Initial",e[e.ChatPrivacyType=1]="ChatPrivacyType",e[e.Discussion=2]="Discussion",e[e.ChannelSubscribers=3]="ChannelSubscribers",e[e.GroupType=4]="GroupType",e[e.GroupPermissions=5]="GroupPermissions",e[e.GroupRemovedUsers=6]="GroupRemovedUsers",e[e.GroupUserPermissionsCreate=7]="GroupUserPermissionsCreate",e[e.GroupUserPermissions=8]="GroupUserPermissions",e[e.ChatAdministrators=9]="ChatAdministrators",e[e.GroupRecentActions=10]="GroupRecentActions",e[e.ChatAdminRights=11]="ChatAdminRights",e[e.GroupMembers=12]="GroupMembers"}(g||(g={}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return h})),n.d(t,"b",(function(){return y})),n.d(t,"c",(function(){return v})),n.d(t,"d",(function(){return O}));var r=n(2),u=n(12),o=n(5);var c=n(50),d=n(1);const a=/%\d?\$?[sdf@]/g,i=["value","zeroValue","oneValue","twoValue","fewValue","manyValue","otherValue"],s={en:e=>1!==e?6:2,ar:e=>0===e?1:1===e?2:2===e?3:e%100>=3&&e%100<=10?4:e%100>=11?5:6,ca:e=>1!==e?6:2,de:e=>1!==e?6:2,es:e=>1!==e?6:2,fa:e=>e>1?6:2,fr:e=>e>1?6:2,id:()=>0,it:e=>1!==e?6:2,ko:()=>0,ms:()=>0,nl:e=>1!==e?6:2,pl:e=>1===e?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,pt_BR:e=>e>1?6:2,ru:e=>e%10==1&&e%100!=11?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,tr:e=>e>1?6:2,uk:e=>e%10==1&&e%100!=11?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,uz:e=>e>1?6:2},f=new Map;let l,b;const{addCallback:h,removeCallback:m,runCallbacks:p}=function(){const e=[];function t(t){const n=e.indexOf(t);-1!==n&&e.splice(n,1)}return{runCallbacks:function(...t){e.forEach(e=>{e(...t)})},addCallback:function(n){return e.push(n),()=>{t(n)}},removeCallback:t}}();let g;const y=(e,t,n)=>{if(void 0!==t){const r=Array.isArray(t)?JSON.stringify(t):t,u=f.get(`${e}_${r}_${n}`);if(u)return u}if(!l&&!b)return e;const r=l&&l[e]||b&&b[e];return r?w(r,e,t,n):(b||j(),e)};async function v(e,t){let n=await u.c(r.O,`${r.v}_${e}_${t}`,u.a.Json);return n||(n=await async function(e,t,n){const c=await Object(o.a)("fetchLangStrings",{langPack:e,langCode:t,keys:[n]});if(c&&c.length)return await u.d(r.O,`${e}_${t}_${n}`,c[0]),c[0];return}(r.v,e,t)),w(n,t)}async function O(e,t,n=!1){if(l&&e===g)return void(t&&t());let c=await u.c(r.O,e,u.a.Json);if(!c&&(n&&await j(),c=await async function(e){const t=await Object(o.a)("fetchLangPack",{sourceLangPacks:r.P,langCode:e});if(t)return await u.d(r.O,e,t.langPack),t.langPack;return}(e),!c))return;f.clear(),g=e,l=c,document.documentElement.lang=e;const{languages:a}=Object(d.e)().settings.byKey,i=a?a.find(t=>t.langCode===e):void 0;y.isRtl=Boolean(i&&i.rtl),y.code=e,t&&t(),p()}async function j(){b||(b=(await n.e(9).then(n.bind(null,326))).default,p())}function w(e,t,n,u){const o=e?e["number"==typeof n?function(e){const t=g||r.u,n=s[t]?s[t](e):0;return i[n]}(n):"value"]:void 0;if(!o||!o.trim()){const e=t.split(".");return e[e.length-1]}if(void 0!==n){const e=function(e,t){t=Array.isArray(t)?t:[t];const n=e.split(a),r=n.shift();return n.reduce((e,n,r)=>`${e}${String(t[r]||"")}${n}`,r||"")}(o,"i"===u?Object(c.a)(n):n),r=Array.isArray(n)?JSON.stringify(n):n;return f.set(`${t}_${r}_${u}`,e),e}return o}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"d",(function(){return d})),n.d(t,"c",(function(){return a})),n.d(t,"b",(function(){return s}));var r=n(2);let u;!function(e){e[e.Auth=0]="Auth",e[e.Main=1]="Main",e[e.Extra=2]="Extra"}(u||(u={}));const o={},c={};async function d(e,t){if(!o[e]){switch(e){case u.Auth:o[u.Auth]=n.e(5).then(n.bind(null,107));break;case u.Main:r.r&&console.log(">>> START LOAD MAIN BUNDLE"),o[u.Main]=Promise.all([n.e(0),n.e(4)]).then(n.bind(null,105));break;case u.Extra:o[u.Extra]=Promise.all([n.e(0),n.e(3)]).then(n.bind(null,106))}o[e].then(f)}const d=await o[e];return c[e]||(c[e]=d),a(e,t)}function a(e,t){const n=c[e];if(n)return n[t]}const i=[];function s(e){i.includes(e)||i.push(e)}function f(){i.forEach(e=>{e()})}},function(e,t,n){"use strict";var r=n(14),u=n(31),o=n(52);t.a=()=>{const e=Object(u.a)();return Object(o.a)(()=>r.a(e),[e]),r.b}},function(e,t,n){"use strict";n.d(t,"d",(function(){return o})),n.d(t,"a",(function(){return c})),n.d(t,"b",(function(){return d})),n.d(t,"g",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"f",(function(){return l}));var r=n(10);function u(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}"undefined"==typeof File&&(self.File=class extends Blob{constructor(e,t,n){if(n){const{type:t,...r}=n;super(e,{type:t}),u(this,"name",void 0),Object.assign(this,r)}else super(e),u(this,"name",void 0);this.name=t}});function o(e){const t=e.split(","),n=t[0].match(/:(.*?);/)[1],r=atob(t[1]);let u=r.length;const o=new Uint8Array(u);for(;u--;)o[u]=r.charCodeAt(u);return new Blob([o],{type:n})}function c(e){return new Promise((t,n)=>{const r=new FileReader;r.onload=e=>{const{result:r}=e.target||{};"string"==typeof r&&t(r),n(new Error("Failed to read blob"))},r.onerror=n,r.readAsDataURL(e)})}function d(e,t){return new File([e],t,{lastModified:Date.now(),type:e.type})}function a(e){return new Promise((t,n)=>{const r=new Image;r.onload=()=>t(r),r.onerror=n,r.src=e})}function i(e){return new Promise((t,n)=>{const r=document.createElement("video");r.volume=0,r.onloadedmetadata=()=>t(r),r.onerror=n,r.src=e})}async function s(e){const t=await i(e);return Promise.race([Object(r.f)(2e3),new Promise((e,n)=>{t.onseeked=()=>{t.videoWidth&&t.videoHeight||e(void 0);const n=document.createElement("canvas");n.width=t.videoWidth,n.height=t.videoHeight;n.getContext("2d").drawImage(t,0,0),e(n.toDataURL("image/jpeg"))},t.onerror=n,t.currentTime=Math.min(t.duration,1)})])}async function f(e){return(await fetch(e)).blob()}function l(e){const t=document.createElement("canvas");t.width=e.width,t.height=e.height;return t.getContext("2d").drawImage(e,0,0),t}},function(e,t,n){"use strict";function r(e){return new Promise((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)})}let u;function o(){return u||(u=function(e,t){const n=indexedDB.open(e);n.onupgradeneeded=()=>n.result.createObjectStore(t);const u=r(n);return(e,n)=>u.then(r=>n(r.transaction(t,e).objectStore(t)))}("keyval-store","keyval")),u}function c(e,t){return e("readonly",e=>(e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},r(e.transaction)))}n.d(t,"c",(function(){return s})),n.d(t,"f",(function(){return f})),n.d(t,"b",(function(){return l})),n.d(t,"e",(function(){return b})),n.d(t,"d",(function(){return h})),n.d(t,"a",(function(){return m}));var d=n(2),a=n(12);const i=[1,2,3,4,5];function s(e=!1){if(e&&localStorage.getItem(d.Q))return!0;const t=localStorage.getItem(d.zb);if(!t)return!1;try{const e=JSON.parse(t);return Boolean(e&&e.id&&e.dcID)}catch(e){return!1}}function f(e,t){const{mainDcId:n,keys:r,hashes:u}=e;localStorage.setItem(d.zb,JSON.stringify({dcID:n,id:t})),localStorage.setItem("dc",String(n)),Object.keys(r).map(Number).forEach(e=>{localStorage.setItem(`dc${e}_auth_key`,JSON.stringify(r[e]))}),Object.keys(u).map(Number).forEach(e=>{localStorage.setItem(`dc${e}_hash`,JSON.stringify(u[e]))})}function l(){[d.zb,"dc",...i.map(e=>`dc${e}_auth_key`),...i.map(e=>`dc${e}_hash`)].forEach(e=>{localStorage.removeItem(e)})}function b(){if(!s())return;const e=JSON.parse(localStorage.getItem(d.zb)),t=Number(e.dcID),n={},r={};return i.forEach(e=>{try{const t=localStorage.getItem(`dc${e}_auth_key`);t&&(n[e]=JSON.parse(t));const u=localStorage.getItem(`dc${e}_hash`);u&&(r[e]=JSON.parse(u))}catch(e){d.r&&console.warn("Failed to load stored session",e)}}),Object.keys(n).length?{mainDcId:t,keys:n,hashes:r}:void 0}async function h(){const e=localStorage.getItem(d.Q);if(!e)return;const t=await function(e,t=o()){return t("readonly",t=>r(t.get(e)))}("GramJs:"+e);try{f(JSON.parse(t))}catch(e){d.r&&console.warn("Failed to load legacy session",e)}}async function m(){localStorage.removeItem(d.Q);const e=await function(e=o()){const t=[];return c(e,e=>t.push(e.key)).then(()=>t)}();await Promise.all([a.b("GramJs"),...e.filter(e=>"string"==typeof e&&e.startsWith("GramJs:GramJs-session-")).map(e=>function(e,t=o()){return t("readwrite",t=>(t.delete(e),r(t.transaction)))}(e))])}},function(e,t,n){"use strict";n.d(t,"b",(function(){return o}));const r=/\uFE0F/g,u=String.fromCharCode(8205);function o(e){return e.indexOf(u)<0?e.replace(r,""):e}t.a=/(?:\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d\udc8f\ud83c[\udffb-\udfff]|\ud83d\udc91\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91])|(?:\ud83d[\udc68\udc69]|\ud83e\uddd1)(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83d\ude36\u200d\ud83c\udf2b\ufe0f|\u2764\ufe0f\u200d\ud83d\udd25|\u2764\ufe0f\u200d\ud83e\ude79|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc15\u200d\ud83e\uddba|\ud83d\udc3b\u200d\u2744\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83d\ude2e\u200d\ud83d\udca8|\ud83d\ude35\u200d\ud83d\udcab|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f|\ud83d\udc08\u200d\u2b1b)|[#*0-9]\ufe0f?\u20e3|(?:[©®\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26a7\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g},function(e,t,n){"use strict";var r=n(0),u=n(26);n(96);t.a=Object(r.h)(({color:e="blue"})=>r.a.createElement("div",{className:"Loading"},r.a.createElement(u.a,{color:e,withBackground:"white"===e})))},function(e,t,n){"use strict";var r=n(0),u=n(9),o=n(26),c=n(44);n(94);t.a=({ref:e,type:t="button",onClick:n,onContextMenu:d,onMouseDown:a,onMouseEnter:i,onMouseLeave:s,onFocus:f,children:l,size:b="default",color:h="primary",className:m,round:p,pill:g,fluid:y,isText:v,isLoading:O,ariaLabel:j,href:w,download:I,disabled:C,ripple:E,faded:S,tabIndex:M,isRtl:A})=>{let k=Object(r.q)(null);e&&(k=e);const[T,N]=Object(r.r)(!1),P=Object(u.a)("Button",m,b,h,p&&"round",g&&"pill",y&&"fluid",C&&"disabled",v&&"text",O&&"loading",E&&"has-ripple",S&&"faded",T&&"clicked"),D=Object(r.m)(e=>{!C&&n&&n(e),N(!0),setTimeout(()=>{N(!1)},400)},[C,n]),L=Object(r.m)(e=>{e.preventDefault(),!C&&a&&a(e)},[a,C]);return w?r.a.createElement("a",{ref:k,className:P,href:w,title:j,download:I,tabIndex:M,dir:A?"rtl":void 0},l,!C&&E&&r.a.createElement(c.a,null)):r.a.createElement("button",{ref:k,type:t,className:P,onClick:D,onContextMenu:d,onMouseDown:L,onMouseEnter:i&&!C?i:void 0,onMouseLeave:s&&!C?s:void 0,onFocus:f&&!C?f:void 0,"aria-label":j,title:j,tabIndex:M,dir:A?"rtl":void 0},O?r.a.createElement("div",null,r.a.createElement("span",{dir:A?"auto":void 0},"Please wait.."),r.a.createElement(o.a,{color:v?"blue":"white"})):l,!C&&E&&r.a.createElement(c.a,null))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return b}));var r=n(0),u=n(19),o=n(2),c=n(6),d=n(66),a=n(9),i=n(78),s=n(59);const f=/^[\d\wа-яё]$/i,l=/(\*\*|__).+?\1/g;function b(e,t=["emoji"],n){return"string"!=typeof e?[e]:t.reduce((e,t)=>{switch(t){case"escape_html":return function(e){const t=document.createElement("div");return e.reduce((e,n)=>"string"!=typeof n?[...e,n]:(t.innerText=n,[...e,t.innerHTML]),[])}(e);case"hq_emoji":return u.a.lastIndex=0,h(e,"big","jsx");case"emoji":return u.a.lastIndex=0,h(e,"small","jsx");case"emoji_html":return u.a.lastIndex=0,h(e,"small","html");case"br":return m(e,"jsx");case"br_html":return m(e,"html");case"highlight":return o=e,c=n.highlight,o.reduce((e,t)=>{if("string"!=typeof t||!c)return[...e,t];const n=t.toLowerCase(),u=n.indexOf(c.toLowerCase()),o=n[u+c.length];if(u<0||o&&o.match(f))return[...e,t];const d=[];return d.push(t.substring(0,u)),d.push(r.a.createElement("span",{className:"matching-text-highlight"},t.substring(u,u+c.length))),d.push(t.substring(u+c.length)),[...e,...d]},[]);case"links":return function(e){return e.reduce((e,t)=>{if("string"!=typeof t)return[...e,t];const n=t.match(p);if(!n||!n.length)return[...e,t];const u=[];let o=n.shift(),c=0;for(;o;){const e=t.indexOf(o,c);u.push(t.substring(c,e)),o.startsWith("@")?u.push(r.a.createElement(i.a,{username:o},o)):(o.endsWith("?")&&(o=o.slice(0,o.length-1)),u.push(r.a.createElement(s.a,{text:o,url:o}))),c=e+o.length,o=n.shift()}return u.push(t.substring(c)),[...e,...u]},[])}(e);case"simple_markdown":return g(e,"jsx");case"simple_markdown_html":return g(e,"html")}var o,c;return e},[e])}function h(e,t,n){return c.d?e:e.reduce((e,o)=>{if("string"!=typeof o)return[...e,o];const c=o.split(u.a),i=o.match(u.a)||[];return e.push(c[0]),i.reduce((e,o,i)=>{const s=Object(d.a)(Object(u.b)(o)),f=Object(a.a)("emoji","small"===t&&"emoji-small");"jsx"===n&&e.push(r.a.createElement("img",{className:f,src:`./img-apple-${"big"===t?"160":"64"}/${s}.png`,alt:o})),"html"===n&&e.push(`${o}`);const l=2*i+2;return c[l]&&e.push(c[l]),e},e)},[])}function m(e,t){return e.reduce((e,n)=>"string"!=typeof n?[...e,n]:[...e,...n.split(/\r\n|\r|\n/g).reduce((e,n,u,o)=>{const c=n.trimLeft(),d=n.length-c.length;return e.push(String.fromCharCode(160).repeat(d)+c),u!==o.length-1&&e.push("jsx"===t?r.a.createElement("br",null):"
"),e},[])],[])}const p=new RegExp(`${o.rb}|${o.sb}`,"ig");function g(e,t){return e.reduce((e,n)=>{if("string"!=typeof n)return[...e,n];const u=n.split(l),o=n.match(l)||[];return e.push(u[0]),o.reduce((e,n,o)=>{"jsx"===t?e.push(n.startsWith("**")?r.a.createElement("b",null,n.replace(/\*\*/g,"")):r.a.createElement("i",null,n.replace(/__/g,""))):e.push(n.startsWith("**")?`${n.replace(/\*\*/g,"")}`:`${n.replace(/__/g,"")}`);const c=2*o+2;return u[c]&&e.push(u[c]),e},e)},[])}},function(e,t,n){"use strict";n.d(t,"d",(function(){return c})),n.d(t,"e",(function(){return d})),n.d(t,"b",(function(){return a})),n.d(t,"c",(function(){return i})),n.d(t,"a",(function(){return o}));const r={},u=/(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,3})?(\d{1,3})?/;var o="AF🇦🇫93Afghanistan333\nAO🇦🇴244Angola333\nAL🇦🇱355Albania234\nAD🇦🇩376Andorra222\nAE🇦🇪971United Arab Emirates234\nAI🇦🇮1264Anguilla34\nAR🇦🇷54Argentina\nAM🇦🇲374Armenia233\nAG🇦🇬1268Antigua and Barbuda34\nAU🇦🇺61Australia333\nAS🇦🇸1684American Samoa34\nAT🇦🇹43Austria\nAW🇦🇼297Aruba34\nAZ🇦🇿994Azerbaijan2322\nBI🇧🇮257Burundi224\nBE🇧🇪32Belgium3222\nBJ🇧🇯229Benin233\nBF🇧🇫226Burkina Faso2222\nBD🇧🇩880Bangladesh\nBG🇧🇬359Bulgaria\nBH🇧🇭973Bahrain44\nBS🇧🇸1242Bahamas34\nBA🇧🇦387Bosnia and Herzegovina\nBY🇧🇾375Belarus2322\nBZ🇧🇿501Belize\nBO🇧🇴591Bolivia134\nBR🇧🇷55Brazil254\nBB🇧🇧1246Barbados34\nBM🇧🇲1441Bermuda34\nBN🇧🇳673Brunei34\nBQ🇧🇶599Bonaire, Sint Eustatius and Saba\nBT🇧🇹975Bhutan\nBW🇧🇼267Botswana233\nCF🇨🇫236Central African Republic2222\nCA🇨🇦1Canada334\nCH🇨🇭41Switzerland234\nCK🇨🇰682Cook Islands\nCL🇨🇱56Chile144\nCN🇨🇳86China344\nCI🇨🇮225Côte d`Ivoire233\nCM🇨🇲237Cameroon44\nCD🇨🇩243DR Congo234\nCG🇨🇬242Republic of the Congo234\nCO🇨🇴57Colombia334\nKM🇰🇲269Comoros34\nCV🇨🇻238Cape Verde34\nCR🇨🇷506Costa Rica\nCU🇨🇺53Cuba44\nCY🇨🇾357Cyprus44\nCW🇨🇼599Curaçao\nCZ🇨🇿420Czech Republic\nDE🇩🇪49Germany38\nDJ🇩🇯253Djibouti2222\nDM🇩🇲1767Dominica34\nDK🇩🇰45Denmark44\nDO🇩🇴1Dominican Republic334\nDZ🇩🇿213Algeria3222\nEC🇪🇨593Ecuador\nEG🇪🇬20Egypt234\nER🇪🇷291Eritrea133\nES🇪🇸34Spain333\nEE🇪🇪372Estonia\nET🇪🇹251Ethiopia234\nFI🇫🇮358Finland\nFJ🇫🇯679Fiji\nFK🇫🇰500Falkland Islands\nFM🇫🇲691Micronesia\nFO🇫🇴298Faroe Islands33\nFR🇫🇷33France12222\nGA🇬🇦241Gabon1222\nGB🇬🇧44United Kingdom46\nGE🇬🇪995Georgia\nGF🇬🇫594French Guiana\nGH🇬🇭233Ghana\nGI🇬🇮350Gibraltar44\nGL🇬🇱299Greenland33\nGN🇬🇳224Guinea333\nGM🇬🇲220Gambia34\nGP🇬🇵590Guadeloupe\nGU🇬🇺1671Guam34\nGW🇬🇼245Guinea-Bissau34\nGQ🇬🇶240Equatorial Guinea333\nGR🇬🇷30Greece244\nGD🇬🇩1473Grenada34\nGT🇬🇹502Guatemala134\nGY🇬🇾592Guyana\nHK🇭🇰852Hong Kong\nHN🇭🇳504Honduras44\nHR🇭🇷385Croatia\nHT🇭🇹509Haiti\nHU🇭🇺36Hungary234\nID🇮🇩62Indonesia\nIN🇮🇳91India55\nIO🇩🇬246Diego Garcia34\nIE🇮🇪353Ireland234\nIR🇮🇷98Iran334\nIQ🇮🇶964Iraq334\nIS🇮🇸354Iceland34\nIL🇮🇱972Israel234\nIT🇮🇹39Italy334\nJM🇯🇲1876Jamaica34\nJO🇯🇴962Jordan144\nJP🇯🇵81Japan244\nKZ🇰🇿7Kazakhstan3322\nKE🇰🇪254Kenya333\nKG🇰🇬996Kyrgyzstan\nKH🇰🇭855Cambodia\nKI🇰🇮686Kiribati\nKN🇰🇳1869Saint Kitts and Nevis34\nKR🇰🇷82South Korea\nKW🇰🇼965Kuwait44\nKY🇰🇾1345Cayman Islands34\nLA🇱🇦856Laos\nLB🇱🇧961Lebanon\nLR🇱🇷231Liberia\nLY🇱🇾218Libya234\nLC🇱🇨1758Saint Lucia34\nLI🇱🇮423Liechtenstein\nLK🇱🇰94Sri Lanka234\nLS🇱🇸266Lesotho233\nLT🇱🇹370Lithuania35\nLU🇱🇺352Luxembourg\nLV🇱🇻371Latvia35\nMA🇲🇦212Morocco234\nMC🇲🇨377Monaco44\nMD🇲🇩373Moldova233\nMG🇲🇬261Madagascar2232\nMP🇲🇵1670Northern Mariana Islands34\nMO🇲🇴853Macau\nMS🇲🇸1664Montserrat34\nMV🇲🇻960Maldives\nMX🇲🇽52Mexico\nMH🇲🇭692Marshall Islands\nMK🇲🇰389Macedonia\nML🇲🇱223Mali44\nMT🇲🇹356Malta2222\nMM🇲🇲95Myanmar\nME🇲🇪382Montenegro\nMN🇲🇳976Mongolia\nMZ🇲🇿258Mozambique234\nMQ🇲🇶596Martinique\nMR🇲🇷222Mauritania44\nMU🇲🇺230Mauritius\nMW🇲🇼265Malawi\nMY🇲🇾60Malaysia\nNA🇳🇦264Namibia234\nNC🇳🇨687New Caledonia6\nNE🇳🇪227Niger2222\nNF🇳🇫672Norfolk Island\nNG🇳🇬234Nigeria\nNI🇳🇮505Nicaragua44\nNL🇳🇱31Netherlands12222\nNO🇳🇴47Norway44\nNP🇳🇵977Nepal\nNU🇳🇺683Niue\nNR🇳🇷674Nauru\nNZ🇳🇿64New Zealand\nOM🇴🇲968Oman44\nPK🇵🇰92Pakistan334\nPA🇵🇦507Panama44\nPE🇵🇪51Peru333\nPF🇵🇫689French Polynesia\nPH🇵🇭63Philippines334\nPM🇵🇲508Saint Pierre and Miquelon\nPR🇵🇷1Puerto Rico334\nPS🇵🇸970Palestine324\nPW🇵🇼680Palau\nPG🇵🇬675Papua New Guinea\nPL🇵🇱48Poland333\nKP🇰🇵850North Korea\nPT🇵🇹351Portugal144\nPY🇵🇾595Paraguay333\nQA🇶🇦974Qatar\nRE🇷🇪262Réunion333\nRO🇷🇴40Romania333\nRU🇷🇺7Russia3322\nRW🇷🇼250Rwanda333\nSA🇸🇦966Saudi Arabia\nSD🇸🇩249Sudan234\nSN🇸🇳221Senegal234\nSG🇸🇬65Singapore44\nSH🇸🇭290Saint Helena23\nSH🇸🇭247Saint Helena4\nSB🇸🇧677Solomon Islands\nSL🇸🇱232Sierra Leone233\nSV🇸🇻503El Salvador44\nSM🇸🇲378San Marino334\nSO🇸🇴252Somalia233\nRS🇷🇸381Serbia234\nSS🇸🇸211South Sudan234\nST🇸🇹239São Tomé and Príncipe25\nSR🇸🇷597Suriname34\nSK🇸🇰421Slovakia\nSI🇸🇮386Slovenia\nSE🇸🇪46Sweden234\nSZ🇸🇿268Swaziland44\nSC🇸🇨248Seychelles1222\nSX🇸🇽1721Sint Maarten34\nSY🇸🇾963Syria\nTC🇹🇨1649Turks and Caicos Islands34\nTD🇹🇩235Chad2222\nTG🇹🇬228Togo233\nTH🇹🇭66Thailand144\nTJ🇹🇯992Tajikistan\nTK🇹🇰690Tokelau\nTM🇹🇲993Turkmenistan26\nTL🇹🇱670Timor-Leste\nTO🇹🇴676Tonga\nTT🇹🇹1868Trinidad and Tobago34\nTN🇹🇳216Tunisia233\nTR🇹🇷90Turkey334\nTV🇹🇻688Tuvalu\nTW🇹🇼886Taiwan\nTZ🇹🇿255Tanzania234\nUG🇺🇬256Uganda234\nUA🇺🇦380Ukraine2322\nUY🇺🇾598Uruguay44\nUS🇺🇸1United States334\nUZ🇺🇿998Uzbekistan27\nVA🇻🇦3Vatican City\nVC🇻🇨1784Saint Vincent and the Grenadines34\nVE🇻🇪58Venezuela334\nVG🇻🇬1284British Virgin Islands34\nVI🇻🇮1340US Virgin Islands34\nVN🇻🇳84Vietnam\nVU🇻🇺678Vanuatu\nWF🇼🇫681Wallis and Futuna\nWS🇼🇸685Samoa\nXK🇽🇰383Kosovo44\nYE🇾🇪967Yemen333\nZA🇿🇦27South Africa234\nZM🇿🇲260Zambia234\nZW🇿🇼263Zimbabwe234".split("\n").map(e=>({id:e.substr(0,2),flag:e.substr(2,4),code:"+"+e.match(/\d+/)[0],name:e.split(/\d+/)[1],phoneFormat:function(e){if(!e)return u;const t=e[0];let n;if(!r[t]){const e=t.split("").map(Number);n=e.reduce((e,t,n)=>`${e}(\\d{1,${t}})${n>0?"?":""}`,""),r[t]=new RegExp(`${n}${"()?".repeat(5-e.length)}`)}return r[t]}(e.match(/\d+$/))}));function c(e){return o.find(t=>t.id===e)}function d(e){let t=e.replace(/[^\d+]+/g,"");t.startsWith("+")||(t="+"+t);const n=o.filter(e=>t.startsWith(e.code)).sort((e,t)=>e.code.length-t.code.length);return n[n.length-1]}function a(e,t){let n=e.replace(/[^\d]+/g,"");if(t)n=n.substr(t.code.length-1);else if(e.startsWith("+"))return e;return n=n.replace(function(e){return e?e.phoneFormat:u}(t),(e,n,r,u,o,c)=>{const d=t&&"GB"===t.id?" ":"-";let a="";return n&&(a=""+n),r&&(a+=" "+r),u&&(a+=`${d}${u}`),o&&(a+=`${d}${o}`),c&&(a+=`${d}${c}`),a}),n}function i(e){const t=e.startsWith("+")?e:"+"+e,n=d(t);return n?`${n.code} ${a(t,n)}`:t}},function(e,t,n){"use strict";var r=n(0),u=n(15),o=n(31);t.a=(e,t,n=!1,c=!1)=>{const d=Object(u.c)(e,t),a=Object(o.a)();return c&&Object(u.b)(a),Object(r.n)(()=>{n||d||Object(u.d)(e,t).then(a)},[e,a,d,t,n]),d}},function(e,t,n){"use strict";var r=n(0);t.a=(e=!1)=>{const[t,n]=Object(r.r)(e);return[t,Object(r.m)(()=>{n(!0)},[]),Object(r.m)(()=>{n(!1)},[])]}},function(e,t,n){"use strict";var r=n(0),u=n(9);n(92);t.a=({color:e="blue",withBackground:t})=>r.a.createElement("div",{className:Object(u.a)("Spinner",e,t&&"with-background")},r.a.createElement("div",null))},function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));n(2);var r=n(10);window.addEventListener("error",u),window.addEventListener("unhandledrejection",u);function u(e){e.preventDefault(),o(e instanceof ErrorEvent?e.error:e.reason)}Object(r.h)(window.alert,1e3);function o(e){console.error(e)}},function(e,t,n){"use strict";function r(e,t){if(e===t)return!0;const n=Object.keys(e),r=n.length;if(r!==Object.keys(t).length)return!1;if(0===r)return!0;for(let u=0;u(e[r]!==t[r]&&n.push(`${r}: ${e[r]} => ${t[r]}`),n),[])}n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return u}))},function(e,t,n){"use strict";var r=n(0);t.a=function(e,t){const n=Object(r.q)(),{current:u}=n;return t&&void 0===e||(n.current=e),u}},function(e,t,n){"use strict";n.d(t,"j",(function(){return c})),n.d(t,"k",(function(){return d})),n.d(t,"n",(function(){return a})),n.d(t,"h",(function(){return s})),n.d(t,"g",(function(){return f})),n.d(t,"b",(function(){return l})),n.d(t,"f",(function(){return b})),n.d(t,"c",(function(){return h})),n.d(t,"d",(function(){return p})),n.d(t,"e",(function(){return g})),n.d(t,"i",(function(){return y})),n.d(t,"a",(function(){return v})),n.d(t,"l",(function(){return j})),n.d(t,"m",(function(){return w}));const r=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],u=["January","February","March","April","May","June","July","August","September","October","November","December"],o=u.map(e=>e.toLowerCase());function c(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function d(e){return c(e).getTime()}function a(e){const t=new Date(1e3*e);return`${t.getFullYear()}-${t.getMonth()}`}function i(e){return`${e.getFullYear()}-${e.getMonth()+1}-${e.getDate()}`}function s(e){const t="number"==typeof e?new Date(e):e;return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}function f(e,t){const n="number"==typeof t?new Date(t):t,u=c(new Date);if(n>=u)return s(n);const o=new Date(u);if(o.setDate(u.getDate()-7),n>=o)return e("Weekday.Short"+r[n.getDay()]);const d=n.getFullYear()!==u.getFullYear(),a=e(d?"formatDateScheduleYear":"formatDateSchedule")||(d?"d MMM yyyy":"d MMM");return m(e,n,a)}function l(e,t){const n="number"==typeof t?new Date(t):t,r=e("formatterYearMax")||"dd.MM.yyyy";return m(e,n,r)}function b(e,t,n=!1){const r=e(n?"formatterMonthYear2":"formatterMonthYear")||"MMM yyyy";return m(e,t,r)}function h(e,t,n=!1,u=!1){const o="number"==typeof t?new Date(t):t,d=c(new Date);if(!u){if(i(o)===i(d))return(n?I:C)(e("Weekday.Today"));const t=new Date(d);if(t.setDate(d.getDate()-1),i(o)===i(t))return(n?I:C)(e("Weekday.Yesterday"));const u=new Date(d),c=new Date(d);if(u.setDate(d.getDate()-7),c.setDate(d.getDate()+7),o>=u&&o<=c){const t=r[o.getDay()];return n?I(e("Weekday.Short"+t)):C(e("Weekday."+t))}}const a=o.getFullYear()!==d.getFullYear(),s=e(n?a?"formatDateScheduleYear":"formatDateSchedule":a?"chatFullDate":"chatDate")||"d MMMM yyyy";return(n?I:C)(m(e,o,s))}function m(e,t,n){const r=t.getDate(),o=t.getMonth();return n.replace("LLLL",e(u[o])).replace("MMMM",e("Month.Gen"+u[o])).replace("MMM",e("Month.Short"+u[o])).replace("MM",String(o+1).padStart(2,"0")).replace("dd",String(r).padStart(2,"0")).replace("d",String(r)).replace("yyyy",String(t.getFullYear()))}function p(e,t){const n="number"==typeof t?new Date(t):t;return`${h(e,n,!0)}, ${s(n)}`}function g(e){const t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=Math.floor(e%3600%60);let u="";return t>0?(u+=String(t).padStart(2,"0")+":",u+=String(n).padStart(2,"0")+":"):u+=String(n)+":",u+=String(r).padStart(2,"0"),u}function y(e){const t=[];let n=e%1e3;e-=n,n=Math.floor(n/10);const r=(e=Math.floor(e/1e3))%60;e-=r;const u=(e=Math.floor(e/60))%60;e-=u;const o=(e=Math.floor(e/60))%60;return o>0&&t.push(String(o).padStart(2,"0")),t.push(String(u).padStart(o>0?2:1,"0")),t.push(String(r).padStart(2,"0")),`${t.join(":")},${String(n).padStart(2,"0")}`}function v(e,t="en-US"){return e.toLocaleString(t,{year:"numeric",month:"short",day:"numeric"})}function O(e,t,n=2021){if(t>11||e>31)return!1;const r=new Date(n,t,e);return!Number.isNaN(r.getTime())&&r.getDate()===e}function j(e=""){const t=e.match(/\d{1,2}\s[a-zA-Z]{3,}/),n=e.match(/[a-zA-Z]{3,}\s\d{1,2}/),r=e.match(/\d{1,2}[./-]\d{1,2}([./-]\d{2,4})?/);if(!t&&!r&&!n)return;if(r){const[t,n,r]=e.split(/[./-]/).map(Number);return r&&r<2015||!O(t,n-1,r||void 0)?void 0:`${r?r+"-":""}${String(n).padStart(2,"0")}-${String(t).padStart(2,"0")}`}const u=e.split(" "),c=t?u[0]:u[1],d=(t?u[1]:u[0]).toLowerCase(),a=o.findIndex(e=>e.startsWith(d));return-1!==a&&O(Number(c),a)?`${String(a+1).padStart(2,"0")}-${String(c).padStart(2,"0")}`:void 0}function w(e){return e+86400}function I(e){return`${e[0].toLowerCase()}${e.slice(1)}`}function C(e){return`${e[0].toUpperCase()}${e.slice(1)}`}},function(e,t,n){"use strict";var r=n(0);t.a=()=>{const[,e]=Object(r.r)(!1);return Object(r.m)(()=>{e(e=>!e)},[])}},function(e,t,n){"use strict";var r=n(0),u=n(9);n(90);t.a=({children:e,className:t,isRtl:n,onClick:o})=>{const c=Object(r.m)(e=>{e.preventDefault(),o(e)},[o]);return r.a.createElement("a",{href:"#",className:Object(u.a)("Link",t),dir:n?"rtl":"auto",onClick:o?c:void 0},e)}},function(e,t,n){"use strict";t.a=e=>{let t;do{t=String(Math.random()).replace("0.","id")}while(e.hasOwnProperty(t));return t}},function(e,t,n){"use strict";n.d(t,"d",(function(){return p})),n.d(t,"c",(function(){return y})),n.d(t,"b",(function(){return v})),n.d(t,"a",(function(){return O}));var r=n(5),u=n(68),o=n(2),c=n(1),d=n(4),a=n(14),i=n(11),s=n(7),f=n(6);function l(e){const t=e.toJSON();return JSON.stringify({endpoint:t.endpoint,keys:t.keys})}function b(){return!!f.k&&("showNotification"in ServiceWorkerRegistration.prototype?"denied"===Notification.permission?(o.r&&console.warn("[PUSH] The user has blocked push notifications."),!1):"PushManager"in window||(o.r&&console.warn("[PUSH] Push messaging isn't supported."),!1):(o.r&&console.warn("[PUSH] Push notifications aren't supported."),!1))}async function h(){"Notification"in window&&(["granted","denied"].includes(Notification.permission)||await Notification.requestPermission())}async function m(e){const t=Object(c.e)(),n=Object(c.d)();if(e)try{const t=l(e);return await Object(r.a)("unregisterDevice",t),await e.unsubscribe(),void n.deleteDeviceToken()}catch(e){o.r&&console.log("[PUSH] Unable to unsubscribe from push.",e)}t.push&&(await Object(r.a)("unregisterDevice",t.push.deviceToken),n.deleteDeviceToken())}async function p(){if(!b())return;const e=await navigator.serviceWorker.ready,t=await e.pushManager.getSubscription();await m(t)}let g=!1;async function y(){if(!b())return void await h();const e=await navigator.serviceWorker.ready;let t=await e.pushManager.getSubscription();if(function(e){const t=Object(c.e)();return!t.push||!e||(l(e)!==t.push.deviceToken||Date.now()-t.push.subscribedAt>432e5)}(t)){await m(t);try{t=await e.pushManager.subscribe({userVisibleOnly:!0});const n=l(t);o.r&&console.log("[PUSH] Received push subscription: ",n),await Object(r.a)("registerDevice",n),Object(c.d)().setDeviceToken(n)}catch(e){"denied"===Notification.permission?o.r&&console.warn("[PUSH] The user has blocked push notifications."):o.r&&(console.log("[PUSH] Unable to subscribe to push.",e),e.code===DOMException.ABORT_ERR&&await h())}}}async function v({chat:e,message:t,isActiveChat:n}){if(!("Notification"in window?"denied"!==Notification.permission||(o.r&&console.warn("[PUSH] The user has blocked push notifications."),0):(o.r&&console.warn("[PUSH] This browser does not support desktop notification"),0)))return;if(!t.id)return;if(await async function(){if(g)return;const[e,t]=await Promise.all([Object(r.a)("fetchNotificationSettings",{serverTimeOffset:Object(c.e)().serverTimeOffset}),Object(r.a)("fetchNotificationExceptions",{serverTimeOffset:Object(c.e)().serverTimeOffset})]);if(!e)return;let n=Object(i.w)(Object(c.e)(),e);t&&(n=Object(i.f)(n,t)),Object(c.g)(n),g=!0}(),!function(e,t){if(!g)return!1;const n=Object(c.e)();return!(Object(d.Hb)(e,Object(s.fb)(n),Object(s.eb)(n))||e.isNotJoined||!e.isListed)&&!(t&&document.hasFocus())}(e,n))return;const{title:f,body:l}=function(e,t){const n=Object(c.e)(),{senderId:r,replyToMessageId:o}=t,i=r?Object(s.Jb)(n,r):void 0,f=Object(d.s)(t),l=f&&o?Object(s.l)(n,e.id,o):void 0,{targetUserIds:b,targetChatId:h}=f||{},m=b?b.map(e=>Object(s.Jb)(n,e)).filter(Boolean):void 0,p=Object(d.W)(e),g=p?Object(s.Jb)(n,p):void 0;let y;if(Object(d.gb)(t)){const n=e&&(Object(d.mb)(e)||t.senderId===t.chatId)?e:i;y=Object(u.a)(a.b,t,n,m,l,h,{asPlain:!0})}else{const n=Object(d.K)(a.b,e.id,i),r=Object(d.O)(a.b,t);y=n?`${n}: ${r}`:r}return{title:Object(d.k)(a.b,e,g),body:y}}(e,t);if(b())navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage({type:"newMessageNotification",payload:{title:f,body:l,chatId:e.id,messageId:t.id}});else{const n=Object(c.d)(),r={body:l,icon:"icon-192x192.png",badge:"icon-192x192.png",tag:t.id.toString()};"vibrate"in navigator&&(r.vibrate=[200,100,200]);const u=new Notification(f,r);u.onclick=()=>{u.close(),n.focusMessage({chatId:e.id,messageId:t.id}),window.focus&&window.focus()}}}function O(){navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage({type:"clientReady"})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return d})),n.d(t,"c",(function(){return a})),n.d(t,"d",(function(){return i})),n.d(t,"g",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"f",(function(){return l})),n.d(t,"h",(function(){return b})),n.d(t,"a",(function(){return h}));var r=n(2),u=n(30),o=n(3);const c=[1,8,5,2,7,4,6];function d(e){if(e)switch(e.type){case"userTypeBot":case"userTypeRegular":return e.firstName||e.lastName;case"userTypeDeleted":case"userTypeUnknown":return"Deleted";default:return}}function a(e){if(e){if(f(e))return"Deleted account";switch(e.type){case"userTypeBot":case"userTypeRegular":if(e.firstName&&e.lastName)return`${e.firstName} ${e.lastName}`;if(e.firstName)return e.firstName;if(e.lastName)return e.lastName;break;case"userTypeDeleted":case"userTypeUnknown":return"Deleted account"}}}function i(e,t,n){if(t.id===r.yb)return e("ServiceNotifications").toLowerCase();if(t.type&&"userTypeBot"===t.type)return e("Bot");if(!t.status)return"";switch(t.status.type){case"userStatusEmpty":return e("ALongTimeAgo");case"userStatusLastMonth":return e("WithinAMonth");case"userStatusLastWeek":return e("WithinAWeek");case"userStatusOffline":{const{wasOnline:r}=t.status;if(!r)return e("LastSeen.Offline");const o=new Date((new Date).getTime()+1e3*n),c=new Date(1e3*r);if(c>=o)return e("LastSeen.JustNow");const d=new Date(o.getTime()-c.getTime());if(d.getTime()/1e3<60)return e("LastSeen.JustNow");if(d.getTime()/1e3<3600){return e("LastSeen.MinutesAgo",Math.floor(d.getTime()/1e3/60))}const a=new Date;a.setHours(0,0,0,0);if(c>new Date(a.getTime()+1e3*n)){if(d.getTime()/1e3<21600){return e("LastSeen.HoursAgo",Math.floor(d.getTime()/1e3/60/60))}return e("LastSeen.TodayAt",Object(u.h)(c))}const i=new Date;i.setDate(o.getDate()-1),i.setHours(0,0,0,0);return c>new Date(i.getTime()+1e3*n)?e("LastSeen.YesterdayAt",Object(u.h)(c)):e("LastSeen.AtDate",Object(u.b)(e,c))}case"userStatusOnline":return e("Online");case"userStatusRecently":return e("Lately");default:return}}function s(e){const{id:t,status:n,type:u}=e;return!!n&&(t!==r.yb&&("userStatusOnline"===n.type&&"userTypeBot"!==u))}function f(e){return!(!e.status||"userTypeBot"===e.type||e.id===r.yb)&&("userTypeDeleted"===e.type||"userTypeUnknown"===e.type)}function l(e){return"userTypeBot"===e.type}function b(e,t,n,r=0){return Object(o.k)(e,e=>{const u=Date.now()/1e3+r;if(n&&n.includes(e))return u+172800-(n.length-n.indexOf(e));const o=t[e];if(!o||!o.status)return 0;if("userStatusOnline"===o.status.type)return o.status.expires;if("userStatusOffline"===o.status.type&&o.status.wasOnline)return o.status.wasOnline;switch(o.status.type){case"userStatusRecently":return u-86400;case"userStatusLastWeek":return u-604800;case"userStatusLastMonth":return u-18144e3;default:return 0}},"desc")}function h(e){const t=e?Math.abs(e.id)%7:0;return c[t]}},function(e,t,n){"use strict";n.d(t,"w",(function(){return i})),n.d(t,"v",(function(){return s})),n.d(t,"t",(function(){return f})),n.d(t,"y",(function(){return l})),n.d(t,"u",(function(){return b})),n.d(t,"z",(function(){return h})),n.d(t,"j",(function(){return m})),n.d(t,"p",(function(){return p})),n.d(t,"i",(function(){return g})),n.d(t,"e",(function(){return y})),n.d(t,"f",(function(){return v})),n.d(t,"d",(function(){return O})),n.d(t,"x",(function(){return j})),n.d(t,"r",(function(){return w})),n.d(t,"m",(function(){return I})),n.d(t,"A",(function(){return C})),n.d(t,"c",(function(){return E})),n.d(t,"a",(function(){return S})),n.d(t,"o",(function(){return M})),n.d(t,"h",(function(){return A})),n.d(t,"g",(function(){return k})),n.d(t,"s",(function(){return T})),n.d(t,"D",(function(){return N})),n.d(t,"b",(function(){return P})),n.d(t,"C",(function(){return D})),n.d(t,"B",(function(){return L})),n.d(t,"l",(function(){return x})),n.d(t,"k",(function(){return F})),n.d(t,"q",(function(){return B})),n.d(t,"n",(function(){return R})),n.d(t,"E",(function(){return U}));var r=n(8),u=n(2),o=n(3),c=n(35),d=n(30);const a=Date.now()/1e3+31622400;function i(e){return e>0}function s(e){return f(e)||l(e)}function f(e){return"chatTypeBasicGroup"===e.type}function l(e){return"chatTypeSuperGroup"===e.type}function b(e){return"chatTypeChannel"===e.type}function h(e){return"chatTypePrivate"===e.type||"chatTypeBasicGroup"===e.type}function m(e){switch(e.type){case"chatTypePrivate":return"PrivateChat";case"chatTypeBasicGroup":case"chatTypeSuperGroup":return"AccDescrGroup";case"chatTypeChannel":return"AccDescrChannel";default:return"Chat"}}function p(e){if("chatTypePrivate"===e.type||"chatTypeSecret"===e.type)return e.id}function g(e,t,n,r=!1){return r||n&&t.id===n.id&&n.isSelf?e("SavedMessages"):t.title||e("HiddenName")}function y(e){if(e.fullInfo)return e.fullInfo.about}function v(e){const{username:t}=e;if(t)return"https://t.me/"+t;const{inviteLink:n}=e.fullInfo||{};return n}function O(e,t="normal"){if(e.avatarHash)switch(t){case"big":return`profile${e.id}?${e.avatarHash}`;default:return`avatar${e.id}?${e.avatarHash}`}}function j(e){return!e.lastMessage}function w(e){return Boolean(e.adminRights)}function I(e,t){return!!e.adminRights&&e.adminRights[t]}function C(e,t){return Boolean(e.currentUserBannedRights&&e.currentUserBannedRights[t]||e.defaultBannedRights&&e.defaultBannedRights[t])}function E(e,t){return t!==r.MAIN_THREAD_ID||!(e.isRestricted||e.migratedTo||e.isNotJoined)&&(!!e.isCreator||(!!i(e.id)||(b(e)?I(e,"postMessages"):w(e)||!C(e,"sendMessages"))))}function S(e,t=!1){if(!e)return{canAttachMedia:!1,canAttachPolls:!1,canSendStickers:!1,canSendGifs:!1,canAttachEmbedLinks:!1};const n=w(e);return{canAttachMedia:n||!C(e,"sendMedia"),canAttachPolls:(n||!C(e,"sendPolls"))&&(!i(e.id)||t),canSendStickers:n||!C(e,"sendStickers"),canSendGifs:n||!C(e,"sendGifs"),canAttachEmbedLinks:n||!C(e,"embedLinks")}}function M(e,t,n){if(t&&t.sendMessages){const{untilDate:n}=t;return n&&nfunction(e,t,n,r,u,o,c,d){if(!e.isListed)return!1;if(o&&o.has(e.id))return!1;if(c&&c.has(e.id))return!0;if(d&&d.has(e.id))return!0;if(T(e)&&t.excludeArchived)return!1;if(t.excludeMuted&&!e.unreadMentionsCount&&N(e,r,u))return!1;if(!e.unreadCount&&!e.unreadMentionsCount&&!e.hasUnreadMark&&t.excludeRead)return!1;if(i(e.id)){const r=n[e.id];if(r&&"userTypeBot"===r.type){if(t.bots)return!0}else{if(t.contacts&&r&&r.isContact)return!0;if(t.nonContacts&&r&&!r.isContact)return!0}}else{if(s(e))return!!t.groups;if(b(e))return!!t.channels}return!1}(e[o],n,t,r,u,c,d,a)),n.pinnedChatIds]}function L(e,t,n,r="all"){function u(e){if(!e||!e.lastMessage||e.migratedTo)return!1;switch(r){case"all":if(T(e))return!1;break;case"archived":if(!T(e))return!1}return!e.isRestricted&&!e.isNotJoined}const c=t.map(t=>e[t]).filter(u),d=new Set(t);return{pinnedChats:n?n.map(t=>e[t]).filter(u).filter(e=>d.has(e.id)):[],otherChats:Object(o.k)(n?c.filter(e=>!n.includes(e.id)):c,k,"desc")}}function x(e,t,n,r,u,o){const[c]=D(e,t,n,u,o,r),d=c.map(t=>e[t]).filter(e=>e&&e.lastMessage&&!e.isRestricted&&!e.isNotJoined);return{unreadDialogsCount:d.reduce((e,t)=>t.unreadCount||t.hasUnreadMark?e+1:e,0),hasActiveDialogs:d.some(e=>e.unreadMentionsCount||!N(e,u,o)&&(e.unreadCount||e.hasUnreadMark))}}function F(e,t,n,r,u,o,c){const{id:d,title:a,emoticon:i,description:s,pinnedChatIds:f,excludedChatIds:l,includedChatIds:b,excludeArchived:h,excludeMuted:m,excludeRead:p,...g}=r;if(Object.values(g).filter(Boolean).length>1||l&&l.length||b&&b.length){return e("Chats",function(e,t,n,r,u,o){const[c,d]=D(e,t,n,u,o,r),{pinnedChats:a,otherChats:i}=L(e,c,d,"folder");return a.length+i.length}(t,n,r,u,o,c))}return g.bots?e("FilterBots"):g.groups?e("FilterGroups"):g.channels?e("FilterChannels"):g.contacts?e("FilterContacts"):g.nonContacts?e("FilterNonContacts"):void 0}function B(e){return!!e&&e.id<0}function R(e,t,n){if(n&&!i(t))return n.isSelf?e("FromYou"):Object(c.b)(n)}function U(e,t,n=!1,r){return Object(o.k)(e,e=>{const u=t[e];if(!u)return 0;let o=0;return u.lastMessage&&(o+=u.lastMessage.date),n&&u.isVerified&&(o+=3e9),r&&r.includes(e)&&(o=Date.now()+3e8+(r.length-r.indexOf(e))),o},"desc")}},function(e,t,n){"use strict";n.d(t,"b",(function(){return u})),n.d(t,"a",(function(){return o})),n.d(t,"d",(function(){return a}));var r=n(0);const u="tt-event-heavy-animation-start",o="tt-event-heavy-animation-end";let c,d=!1;const a=e=>(d||(d=!0,document.dispatchEvent(new Event(u))),c&&(clearTimeout(c),c=void 0),e&&(c=window.setTimeout(()=>{d=!1,document.dispatchEvent(new Event(o)),c=void 0},e)),()=>{d=!1,document.dispatchEvent(new Event(o))});t.c=(e,t)=>{Object(r.n)(()=>(d&&e(),document.addEventListener(u,e),document.addEventListener(o,t),()=>{document.removeEventListener(o,t),document.removeEventListener(u,e)}),[t,e])}},function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"c",(function(){return i})),n.d(t,"b",(function(){return b}));var r=n(2);const u=new Set(["scroll","mouseenter","mouseleave"]),o={},c=new Map,d={};function a(e,t,n,r=!1){const u=s(t,e);f(u,e,r)?function(e,t,n){d[e]||(d[e]=0,document.addEventListener(e,h));(function(e){o[e]||(o[e]=new Map);return o[e]})(e).set(t,n),function(e){const t=c.get(e);if(t)return t;const n=new Set;return c.set(e,n),n}(t).add(e),d[e]++}(u,e,n):e.addEventListener(u,n,r)}function i(e,t,n,r=!1){const u=s(t,e);f(u,e,r)?l(u,e):e.removeEventListener(u,n,r)}function s(e,t){const n=e.replace(/^on/,"").replace(/Capture$/,"").toLowerCase();return"change"===n&&"SELECT"!==t.tagName?"input":"doubleclick"===n?"dblclick":"focus"===n?"focusin":"blur"===n?"focusout":n}function f(e,t,n){return!n&&!u.has(e)&&"VIDEO"!==t.tagName&&"IFRAME"!==t.tagName}function l(e,t){d[e]--,d[e]||document.removeEventListener(e,h),o[e].delete(t),c.get(t).delete(e)}function b(e){const t=c.get(e);t&&(t.forEach(t=>l(t,e)),c.delete(e))}function h(e){const t=o[e.type];if(t){let n=!1,r=e.target;const u=()=>{n=!0},o=()=>{e.preventDefault()},c=new Proxy(e,{get:(e,t)=>"currentTarget"===t?r:"stopPropagation"===t||"stopImmediatePropagation"===t?u:"preventDefault"===t?o:Reflect.get(e,t)});for(;r&&r!==document.body;){const e=t.get(r);if(e&&(e(c),n))return;r=r.parentNode}}}r.r&&document.addEventListener("dblclick",()=>{console.log("DELEGATED EVENTS",{delegationRegistry:o,delegatedEventsByElement:c,documentEventCounters:d})})},function(e,t,n){"use strict";n.d(t,"b",(function(){return i})),n.d(t,"a",(function(){return l}));var r=n(0),u=n(6),o=n(29),c=n(1),d=n(3);const a={currentIndex:0,nextStateIndexToReplace:-1,isHistoryAltered:!1,isDisabled:!1,isEdge:!1,currentIndexes:[]},i=()=>{a.isDisabled=!0},s=e=>{const t=e.touches[0].pageX;(t<=300||t>=window.innerWidth-300)&&(a.isEdge=!0)},f=()=>{a.isEdge&&setTimeout(()=>{a.isEdge=!1},350)};function l(e,t,n,u,i=!1,s){const f=Object(r.q)(-1),l=Object(r.q)(!1),b=Object(o.a)(e),h=Object(r.q)(!0),m=Object(r.q)([]),p=Object(o.a)(s),g=Object(r.q)(!1),y=Object(r.m)((t=!1)=>{if(s){const e=p||[];if(e.length0){const e=m.current[m.current.length-t-1];let n=t;if(e){const t=a.currentIndexes.findIndex(t=>t===e.index);n=a.currentIndexes.length-t-1}a.isHistoryAltered=!0,window.history.go(-n);m.current.splice(m.current.length-t-1,t).forEach(({index:e})=>{a.currentIndexes.splice(a.currentIndexes.indexOf(e),1)})}s.length>0&&setTimeout(()=>{const e=++a.currentIndex;a.currentIndexes[a.currentIndexes.length-1]=e,window.history.replaceState({index:e,state:u},"","#"+s[s.length-1]),m.current[m.current.length-1]={index:e,hash:s[s.length-1]}},0)}}}else e&&!t&&(h.current=!1,l.current?(l.current=!1,a.currentIndexes.push(f.current)):setTimeout(()=>{const e=++a.currentIndex;a.currentIndexes.push(e),window.history[a.currentIndexes.includes(a.nextStateIndexToReplace-1)&&0!==window.history.state.index&&a.nextStateIndexToReplace===e&&!i?"replaceState":"pushState"]({index:e,state:u},""),f.current=e,i&&(a.nextStateIndexToReplace=a.currentIndex+1)},0)),!t&&e||h.current||(f.current!==a.currentIndex&&i||(a.isHistoryAltered=!0,window.history.back(),setTimeout(()=>{a.nextStateIndexToReplace=-1},400)),a.currentIndexes.splice(a.currentIndexes.indexOf(f.current),1),h.current=!0)},[u,s,e,p,i]);return Object(r.n)(()=>{const r=e=>{if(a.isHistoryAltered)return void setTimeout(()=>{a.isHistoryAltered=!1},0);const{index:r}=e.state,u=r||0;try{const r=s?m.current[m.current.length-1].index:f.current,o=a.currentIndexes[a.currentIndexes.indexOf(r)-1];if(a.isDisabled)return;!h.current&&(0===u||u===o)||s&&(0===u||u===o)?(s&&(g.current=!0,m.current.pop()),a.currentIndexes.splice(a.currentIndexes.indexOf(r),1),t&&(a.isEdge&&Object(c.d)().disableHistoryAnimations(),t(!a.isEdge),h.current=!0)):u===r&&h.current&&n&&!s&&(l.current=!0,a.isEdge&&Object(c.d)().disableHistoryAnimations(),n(e.state.state))}catch(e){}},u=s?!p||!Object(d.a)(p,s):b!==e;return!a.isDisabled&&u&&y(),window.addEventListener("popstate",r),()=>window.removeEventListener("popstate",r)},[u,y,s,e,t,n,p,b,i]),{forceClose:()=>y(!0)}}u.e&&(window.addEventListener("touchstart",s),window.addEventListener("touchend",f),window.addEventListener("popstate",f)),window.history.replaceState({index:a.currentIndex},"")},function(e,t,n){"use strict";var r=n(0),u=n(9);t.a=(e=!1,t,n=!1,o="fast",c=!1)=>{const[d,a]=Object(r.r)(!e),i=Object(r.q)(),[s,f]=Object(r.r)(e&&n);e?(a(!1),f(!0),i.current&&(window.clearTimeout(i.current),i.current=void 0)):(f(!1),d||i.current||(i.current=window.setTimeout(()=>{a(!0),t&&t(),i.current=void 0},c?0:350)));const l=s&&!(c&&!e),b=Boolean(i.current),h=e||b;return{shouldRender:h,transitionClassNames:Object(u.a)(o&&"opacity-transition",o,l&&"open",h&&"shown",b&&"closing")}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));function r(e,t=30){return!e||e.length<=t?e:e.substr(0,t)+"..."}},function(e){e.exports=JSON.parse('{"--color-primary":["#50A2E9","#8378DB"],"--color-primary-opacity":["#50A2E980","#8378DB80"],"--color-primary-shade":["#4a95d6","#7b71c6"],"--color-background":["#FFFFFF","#212121"],"--color-background-secondary":["#f4f4f5","#121212"],"--color-background-secondary-accent":["#E4E4E5","#100f10"],"--color-background-own":["#EEFEDF","#8378DB"],"--color-background-own-apple":["#E7FDCC","#8378DB"],"--color-background-selected":["#F4F4F5","#2C2C2C"],"--color-background-own-selected":["#d4fcae","#7b71c6"],"--color-chat-hover":["#F4F4F5","#2C2C2C"],"--color-chat-active":["#4C90E6","#8378DB"],"--color-item-active":["#ededed","#292929"],"--color-text":["#000000","#FFFFFF"],"--color-text-secondary":["#707579","#AAAAAA"],"--color-text-secondary-apple":["#8E8E92","#AAAAAA"],"--color-borders":["#DADCE0","#100F10"],"--color-borders-input":["#DADCE0","#5B5B5A"],"--color-links":["#52A1EF","#868DF6"],"--color-links-hover":["#2d8dec","#6b5fcc"],"--color-gray":["#C4C9CC","#717579"],"--color-pinned":["#C4C9CC","#707579"],"--color-default-shadow":["#72727240","#1010109c"],"--color-light-shadow":["#7272722B","#00000040"],"--color-green":["#4DCD5E","#8378DB"],"--color-text-meta-colored":["#4DCD5E","#8378DB"],"--color-reply-hover":["#F4F4F4","#272727"],"--color-reply-active":["#E8E9E9","#2E2F2F"],"--color-reply-own-hover":["#DBF4CE","#6458bc"],"--color-reply-own-hover-apple":["#d9f9c1","#6458bc"],"--color-reply-own-active":["#C8EBBC","#4F4A9F"],"--color-reply-own-active-apple":["#d5edc2","#4F4A9F"],"--color-accent-own":["#4FAE4E","#FFFFFF"],"--color-message-meta-own":["#4FAE4EFF","#FFFFFF88"],"--color-own-links":["#52A1EF","#FFFFFF"],"--color-code":["#4a729a","#93c4ef"],"--color-code-own":["#3c7940","#FFFFFF"],"--color-code-bg":["#70757914","#ffffff26"],"--color-code-own-bg":["#70757914","#ffffff26"]}')},function(e,t,n){"use strict";var r=n(0),u=n(9),o=n(16);n(99);t.a=e=>{const{icon:t,className:n,children:c,onClick:d,href:a,download:i,disabled:s,destructive:f,ariaLabel:l}=e,b=Object(o.a)(),h=Object(r.m)(e=>{if(s||!d)return e.stopPropagation(),void e.preventDefault();d(e)},[s,d]),m=Object(r.m)(e=>{if(13===e.keyCode||32===e.keyCode)return s||!d?(e.stopPropagation(),void e.preventDefault()):void d(e)},[s,d]),p=Object(u.a)("MenuItem",n,s&&"disabled",f&&"destructive"),g=r.a.createElement(r.a.Fragment,null,t&&r.a.createElement("i",{className:"icon-"+t,"data-char":t.startsWith("char-")?t.replace("char-",""):void 0}),c);return a?r.a.createElement("a",{tabIndex:0,className:p,href:a,download:i,"aria-label":l,title:l,target:a.startsWith(window.location.origin)?"_self":"_blank",rel:"noopener noreferrer",dir:b.isRtl?"rtl":void 0,onClick:d},g):r.a.createElement("div",{role:"button",tabIndex:0,className:p,onClick:h,onKeyDown:m,"aria-label":l,title:l,dir:b.isRtl?"rtl":void 0},g)}},function(e,t,n){"use strict";var r=n(0),u=n(10);n(93);t.a=Object(r.h)(()=>{const[e,t]=Object(r.r)([]),n=Object(r.p)(()=>Object(u.a)(()=>{t([])},700,!1),[]),o=Object(r.m)(r=>{if(0!==r.button)return;const u=r.currentTarget,o=u.getBoundingClientRect(),c=u.offsetWidth/2;t([...e,{x:r.clientX-o.x-c/2,y:r.clientY-o.y-c/2,size:c}]),requestAnimationFrame(()=>{n()})},[e,n]);return r.a.createElement("div",{className:"ripple-container",onMouseDown:o},e.map(({x:e,y:t,size:n})=>r.a.createElement("span",{style:`left: ${e}px; top: ${t}px; width: ${n}px; height: ${n}px;`})))})},function(e,t,n){"use strict";var r=n(62),u=n(42);let o=!1;const c=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i,d=(e,t,n)=>(1-n)*e+n*t,a=Object.keys(u).map(e=>({property:e,colors:[i(u[e][0]),i(u[e][1])]}));function i(e){const t=c.exec(e);return{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16),a:void 0!==t[4]?parseInt(t[4],16):void 0}}function s(e,t,n=1){a.forEach(({property:r,colors:u})=>{const o=Math.round(d(u[e].r,u[t].r,n)),c=Math.round(d(u[e].g,u[t].g,n)),a=Math.round(d(u[e].b,u[t].b,n)),i=void 0!==u[e].a?Math.round(d(u[e].a,u[t].a,n)):void 0;document.documentElement.style.setProperty(r,void 0!==i?`rgba(${o},${c},${a},${i/255})`:`rgb(${o},${c},${a})`)})}t.a=(e,t)=>{const n="dark"===e,u=o&&t,c=n?0:1,d=n?1:0,a=Date.now(),i=document.querySelector('meta[name="theme-color"]');document.documentElement.classList.remove("theme-"+(n?"light":"dark")),o&&document.documentElement.classList.add("no-animations"),document.documentElement.classList.add("theme-"+e),i&&i.setAttribute("content",n?"#212121":"#fff"),setTimeout(()=>{document.documentElement.classList.remove("no-animations")},500),o=!0,u?Object(r.b)(()=>{const e=Math.min((Date.now()-a)/200,1);return s(c,d,function(e){return 1-(1-e)**3.5}(e)),e<1}):s(c,d)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"b",(function(){return f})),n.d(t,"c",(function(){return l}));var r=n(84),u=n.n(r),o=n(6),c=n(17),d=n(10);let a,i;const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";async function f(e,t){for(b();!i.wasmReady;)await Object(d.f)(2e3);const{result:n,width:r,height:u}=await function(e,t){return new Promise(n=>{i.requests=i.requests||new Map,i.requests.set(e,n),i.postMessage({id:e,blob:t})})}(e,t);if(r&&u)return function({result:e,width:t,height:n}){a||(a=document.createElement("canvas"));return new Promise(r=>{const u=new ImageData(e,t,n);a.width=t,a.height=n;a.getContext("2d").putImageData(u,0,0),a.toBlob(e=>{r(null!=e?e:void 0)},"image/png",1)})}({result:n,width:r,height:u})}async function l(e,t){if(Object(o.t)()||"data:image/webp"!==t.substr(0,15))return t;b();const n=await f(e,Object(c.d)(t));if(!n)throw new Error("Can't convert webp to png. Url: "+t);return Object(c.a)(n)}function b(){i||(i=new u.a,i.wasmReady=!1,i.onmessage=h)}function h(e){const{id:t}=e.data;switch(e.data.type){case"initialized":i.wasmReady=!0;break;case"result":if(i.requests.has(t)){const n=i.requests.get(t);i.requests.delete(t),n(e.data)}}}},function(e,t,n){"use strict";var r=n(0),u=n(9),o=n(16);t.a=Object(r.h)(({ref:e,id:t,className:n,value:c,label:d,error:a,success:i,disabled:s,readOnly:f,placeholder:l,autoComplete:b,inputMode:h,maxLength:m,onChange:p,onInput:g,onKeyPress:y,onKeyDown:v,onBlur:O,onPaste:j})=>{const w=Object(o.a)(),I=a||i||d,C=Object(u.a)("input-group",c&&"touched",a?"error":i&&"success",s&&"disabled",f&&"disabled",I&&"with-label",n);return r.a.createElement("div",{className:C,dir:w.isRtl?"rtl":void 0},r.a.createElement("input",{ref:e,className:"form-control",type:"text",id:t,dir:"auto",value:c||"",placeholder:l,maxLength:m,autoComplete:b,inputMode:h,disabled:s,readOnly:f,onChange:p,onInput:g,onKeyPress:y,onKeyDown:v,onBlur:O,onPaste:j}),I&&r.a.createElement("label",{htmlFor:t},I))})},function(e,t,n){"use strict";var r=n(0),u=n(9),o=n(16),c=n(26);n(95);t.a=Object(r.h)(({id:e,name:t,value:n,label:d,subLabel:a,checked:i,disabled:s,round:f,blocking:l,isLoading:b,onChange:h,onCheck:m})=>{const p=Object(o.a)(),g=Object(r.m)(e=>{h&&h(e),m&&m(e.currentTarget.checked)},[h,m]),y=Object(u.a)("Checkbox",s&&"disabled",f&&"round",b&&"loading",l&&"blocking");return r.a.createElement("label",{className:y,dir:p.isRtl?"rtl":void 0},r.a.createElement("input",{type:"checkbox",id:e,name:t,value:n,checked:i,disabled:s,onChange:g}),r.a.createElement("div",{className:"Checkbox-main"},r.a.createElement("span",{className:"label",dir:"auto"},d),a&&r.a.createElement("span",{className:"subLabel",dir:"auto"},a)),b&&r.a.createElement(c.a,null))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(56);function u(e){return Object(r.a)({onEsc:e})}},function(e,t,n){"use strict";function r(e){return String(e).replace(/\d(?=(\d{3})+$)/g,"$& ")}function u(e){return".0"===String(e.toFixed(1)).substr(-2)?Math.round(e):e.toFixed(1).replace(".",",")}function o(e){return e<1e3?e:e<1e6?u(e/1e3)+"K":u(e/1e6)+"M"}function c(e,t=2){return e.replace(/[.,!@#$%^&*()_+=\-`~[\]/\\{}:"|<>?]+/gi,"").trim().split(/\s+/).slice(0,t).map(e=>e.length&&e.match(/./u)[0].toUpperCase()).join("")}n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return c}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));const r=[]},function(e,t,n){"use strict";var r=n(29);t.a=(e,t)=>{const n=Object(r.a)(t);n&&!t.some((e,t)=>e!==n[t])||e(n||[])}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));const r=/[^\wа-яё]+/;function u(e,t){if(!e||!t)return!1;const n=e.toLowerCase().split(r);return t.toLowerCase().split(r).every(e=>n.some(t=>t.startsWith(e)))}},function(e,t,n){"use strict";n.d(t,"b",(function(){return f}));var r=n(10),u=n(2),o=n(6);const c=o.l&&l(),d=window.innerHeight;let a=f(),i=!1;const s=Object(r.h)(()=>{a=f(),!i&&((a.width<=u.ob||a.width<=u.nb&&a.height<=u.mb)!==o.l||o.l&&c!==l())&&window.location.reload()},250,!0);function f(){const e=.01*window.innerHeight;return document.documentElement.style.setProperty("--vh",e+"px"),{width:window.innerWidth,height:window.innerHeight}}function l(){return o.e?window.matchMedia("(orientation: landscape)").matches:window.matchMedia("screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)").matches}window.addEventListener("resize",s),window.addEventListener("orientationchange",s),t.a={get:()=>a,getIsKeyboardVisible:()=>d>a.height,disableRefresh:function(){i=!0},enableRefresh:function(){i=!1}}},function(e,t,n){"use strict";var r=n(0),u=n(40),o=n(64),c=n(80),d=n(58),a=n(49),i=n(9),s=n(37),f=n(39);n(97);t.a=({ref:e,containerRef:t,isOpen:n,className:l,style:b,children:h,positionX:m="left",positionY:p="top",autoClose:g=!1,footer:y,noCloseOnBackdrop:v=!1,onCloseAnimationEnd:O,onClose:j,onMouseEnter:w,onMouseLeave:I,shouldSkipTransition:C})=>{let E=Object(r.q)(null);e&&(E=e);const S=t||E,{transitionClassNames:M}=Object(u.a)(n,O,C,void 0,C);Object(r.n)(()=>n&&j?Object(a.a)(j):void 0,[n,j]),Object(f.a)(n,j,void 0,void 0,g),Object(d.a)(([e])=>{void 0!==e&&Object(s.d)(200)},[n]);const A=Object(o.a)(E,n,g?j:void 0,void 0,!0);Object(c.a)(n,S,v?void 0:j);const k=Object(i.a)("bubble menu-container custom-scroll",p,m,y&&"with-footer",M);return r.a.createElement("div",{className:Object(i.a)("Menu no-selection",l),onKeyDown:n?A:void 0,onMouseEnter:w,onMouseLeave:n?I:void 0,style:b},n&&r.a.createElement("div",{className:"backdrop"}),r.a.createElement("div",{ref:E,className:k,style:`transform-origin: ${p} ${m}`,onClick:g?j:void 0},h,y&&r.a.createElement("div",{className:"footer"},y)))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));const r={Enter:"onEnter",Backspace:"onBackspace",Delete:"onDelete",Esc:"onEsc",Escape:"onEsc",ArrowUp:"onUp",ArrowDown:"onDown",ArrowLeft:"onLeft",ArrowRight:"onRight",Tab:"onTab"},u={onEnter:[],onDelete:[],onBackspace:[],onEsc:[],onUp:[],onDown:[],onLeft:[],onRight:[],onTab:[]};function o(e){return c()||document.addEventListener("keydown",d,!0),Object.keys(e).forEach(t=>{const n=e[t];if(!n)return;const r=u[t];r&&r.push(n)}),()=>{!function(e){Object.keys(e).forEach(t=>{const n=e[t],r=u[t];if(r){const e=r.findIndex(e=>e===n);-1!==e&&r.splice(e,1)}}),c()||document.removeEventListener("keydown",d,!1)}(e)}}function c(){return Object.values(u).some(e=>Boolean(e.length))}function d(e){const t=r[e.key];if(!t)return;const{length:n}=u[t];if(!n)return;e.stopPropagation();(0,u[t][n-1])(e)}},function(e,t,n){"use strict";n.d(t,"b",(function(){return y})),n.d(t,"c",(function(){return v})),n.d(t,"a",(function(){return O}));var r=n(8),u=n(2),o=n(5),c=n(12),d=n(17),a=n(6),i=n(82),s=n.n(i),f=n(83),l=n.n(f);async function b(e){const t=await new Response(e).arrayBuffer();return new Promise(e=>{const n=new Uint8Array(t);let r=new s.a,u=new l.a;r.onmessage=e=>{null===e.data?u.postMessage({command:"done"}):u.postMessage({command:"encode",buffers:e.data},e.data.map(({buffer:e})=>e))},u.onmessage=t=>{"page"===t.data.message&&(e(new Blob([t.data.page],{type:"audio/wav"})),r.terminate(),r=void 0,u.terminate(),u=void 0)},u.postMessage({command:"init",wavBitDepth:16,wavSampleRate:48e3}),r.postMessage({command:"init",decoderSampleRate:48e3,outputBufferSampleRate:48e3}),r.postMessage({command:"decode",pages:n},[n.buffer])})}var h=n(46);const m={[r.ApiMediaFormat.DataUri]:c.a.Text,[r.ApiMediaFormat.BlobUrl]:c.a.Blob,[r.ApiMediaFormat.Lottie]:c.a.Json,[r.ApiMediaFormat.Progressive]:void 0,[r.ApiMediaFormat.Stream]:void 0},p=new Map,g=new Map;function y(e,t,n){if(t===r.ApiMediaFormat.Progressive)return a.h?function(e){const t="./progressive/"+e;return p.set(e,t),Promise.resolve(t)}(e):y(e,r.ApiMediaFormat.BlobUrl,n);if(!g.has(e)){const i=async function(e,t,n){if(!u.X){const n=e.startsWith("avatar")?u.Z:u.Y,r=await c.c(n,e,m[t]);if(r){let t=r;if("audio/ogg"!==r.type||a.g||(t=await b(t)),"image/webp"===r.type&&!Object(a.t)()&&t){const n=await Object(h.b)(e,t);n&&(t=n)}const n=j(t);return p.set(e,n),n}}if(t===r.ApiMediaFormat.Stream){const r=new MediaSource,u=URL.createObjectURL(r);let c=!1;return r.addEventListener("sourceopen",()=>{if(c)return;c=!0;const u=r.addSourceBuffer("audio/mpeg");Object(o.a)("downloadMedia",{url:e,mediaFormat:t},(e,t)=>{n&&n(e),1===e&&r.endOfStream(),t&&u.appendBuffer(t)})}),p.set(e,u),u}const i=await Object(o.a)("downloadMedia",{url:e,mediaFormat:t},n);if(!i)throw new Error("Failed to fetch media");let{prepared:s,mimeType:f}=i;if("audio/ogg"===f&&!a.g){const e=await Object(d.e)(s);URL.revokeObjectURL(s);const t=await b(e);s=j(t),f=e.type}if("image/webp"===f&&!Object(a.t)()){const t=await Object(d.e)(s);URL.revokeObjectURL(s);const n=await Object(h.b)(e,t);n&&(s=j(n))}return p.set(e,s),s}(e,t,n).catch(e=>{u.r&&console.warn(e)}).finally(()=>{g.delete(e)});g.set(e,i)}return g.get(e)}function v(e){return p.get(e)}function O(e){Object(o.b)(e)}function j(e){return e instanceof Blob?URL.createObjectURL(e):e}a.h&&navigator.serviceWorker.addEventListener("message",async e=>{const{type:t,messageId:n,params:u}=e.data;if("requestPart"!==t)return;const c=await Object(o.a)("downloadMedia",{mediaFormat:r.ApiMediaFormat.Progressive,...u});if(!c)return;const{arrayBuffer:d,mimeType:a,fullSize:i}=c;navigator.serviceWorker.controller.postMessage({type:"partResponse",messageId:n,result:{arrayBuffer:d,mimeType:a,fullSize:i}},[d])})},function(e,t,n){"use strict";var r=n(0),u=n(29);t.a=(e,t,n)=>{const o=Object(u.a)(t);return Object(r.n)(()=>e(o||[]),t,n)}},function(e,t,n){"use strict";var r=n(0),u=n(1);const o=e=>{const t=[];let n=0;const r=e.length;let u;for(;n65535&&(u-=65536,t.push(String.fromCharCode(u>>>10&1023|55296)),u=56320|1023&u),t.push(String.fromCharCode(u))}return t.join("")};function c(e,t,n){let r;for(e=n?Math.floor(e/700):e>>1,e+=Math.floor(e/t),r=0;e>455;r+=36)e=Math.floor(e/35);return Math.floor(r+36*e/(e+38))}function d(e,t){const n=[],r=[],u=e.length;let d,a,i,s,f,l,b,h,m,p,g,y,v;for(d=128,i=0,s=72,f=e.lastIndexOf("-"),f<0&&(f=0),l=0;l=128)throw new RangeError("Illegal input >= 0x80");n.push(e.charCodeAt(l))}for(b=f>0?f+1:0;b=u)throw RangeError("punycode_bad_input(1)");if(g=(O=e.charCodeAt(b++))-48<10?O-22:O-65<26?O-65:O-97<26?O-97:36,g>=36)throw RangeError("punycode_bad_input(2)");if(g>Math.floor((2147483647-i)/m))throw RangeError("punycode_overflow(1)");if(i+=g*m,y=p<=s?1:p>=s+26?26:p-s,gMath.floor(2147483647/(36-y)))throw RangeError("punycode_overflow(2)");m*=36-y}if(a=n.length+1,s=c(i-h,a,0===h),Math.floor(i/a)>2147483647-d)throw RangeError("punycode_overflow(3)");d+=Math.floor(i/a),i%=a,t&&r.splice(i,0,e.charCodeAt(b-1)-65<26),n.splice(i,0,d),i++}var O;if(t)for(i=0,v=n.length;i{const{toggleSafeLinkModal:d,openTelegramLink:a}=Object(u.d)(),b=o||t,h=e!==b,m=Object(r.m)(t=>t.ctrlKey||t.altKey||t.shiftKey||t.metaKey||!e||!e.match(i.ub)&&!e.match(i.tb)?!h||(d({url:e}),t.preventDefault(),!1):(t.preventDefault(),a({url:e}),!1),[h,a,d,e]);if(!e)return;const p=Object(s.a)(n||"text-entity-link",t.length>50&&"long-word-break-all");return r.a.createElement("a",{href:f(e),title:l(e),target:"_blank",rel:"noopener noreferrer",className:p,onClick:m,dir:c?"rtl":"auto"},b)})},function(e,t,n){"use strict";n.d(t,"e",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"d",(function(){return o})),n.d(t,"a",(function(){return c})),n.d(t,"c",(function(){return d}));function r(e){return e>536870912?(e/1073741824).toFixed(1)+" GB":e>524288?(e/1048576).toFixed(1)+" MB":(e/1024).toFixed(1)+" KB"}function u(e){const{fileName:t,mimeType:n}=e;return o(t,n)}function o(e,t){return e&&-1!==e.indexOf(".")?e.split(".").pop():t.split("/").pop()}function c(e){switch(e){case"apk":case"xls":case"xlsx":return"green";case"zip":case"rar":case"7z":case"tar":case"gz":case"ppt":case"pptx":return"orange";case"pdf":case"xps":return"red";default:return"default"}}function d(e){return Boolean(e.previewBlobUrl||e.thumbnail)}},function(e,t,n){"use strict";n.d(t,"b",(function(){return u})),n.d(t,"a",(function(){return c}));const r={missing_payment_information:{field:"cardNumber",fieldError:"Incorrect card number"},invalid_number:{field:"cardNumber",fieldError:"Incorrect card number"},number:{field:"cardNumber",fieldError:"Incorrect card number"},exp_year:{field:"expiry",fieldError:"Incorrect year"},exp_month:{field:"expiry",fieldError:"Incorrect month"},invalid_expiry_year:{field:"expiry",fieldError:"Incorrect year"},invalid_expiry_month:{field:"expiry",fieldError:"Incorrect month"},cvc:{field:"cvv",fieldError:"Incorrect CVV"},invalid_cvc:{field:"cvv",fieldError:"Incorrect CVV"}};function u(e){const{message:t,code:n,param:u}=e,{field:o,fieldError:c,description:d}=u?r[u]:r[n];return{field:o,fieldError:c,description:d||t}}const o={ADDRESS_STREET_LINE1_INVALID:{field:"streetLine1",fieldError:"Incorrect street address"},ADDRESS_STREET_LINE2_INVALID:{field:"streetLine2",fieldError:"Incorrect street address"},ADDRESS_CITY_INVALID:{field:"city",fieldError:"Incorrect city"},ADDRESS_COUNTRY_INVALID:{field:"countryIso2",fieldError:"Incorrect country"},ADDRESS_POSTCODE_INVALID:{field:"postCode",fieldError:"Incorrect post code"},ADDRESS_STATE_INVALID:{field:"state",fieldError:"Incorrect state"},REQ_INFO_NAME_INVALID:{field:"fullName",fieldError:"Incorrect name"},REQ_INFO_PHONE_INVALID:{field:"phone",fieldError:"Incorrect phone"},REQ_INFO_EMAIL_INVALID:{field:"email",fieldError:"Incorrect email"}};function c(e){return Object.values(e).reduce((e,t)=>{if(!("hasErrorKey"in t)||!t.hasErrorKey)return e;const n=o[t.message];return n&&(e={...e,[n.field]:n.fieldError}),e},{})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return o})),n.d(t,"a",(function(){return c}));var r=n(10);let u;function o(e,t){t||(u&&!u.isCancelled&&(u.isCancelled=!0),u=t={isCancelled:!1}),Object(r.b)(()=>{!t.isCancelled&&e()&&o(e,t)})}function c(e){Object(r.b)(()=>{e()&&c(e)})}},function(e,t,n){"use strict";var r=n(0),u=n(55);n(98);t.a=({trigger:e,className:t,children:n,positionX:o="left",positionY:c="top",footer:d,forceOpen:a,onOpen:i,onClose:s})=>{const f=Object(r.q)(null),l=Object(r.q)(null),[b,h]=Object(r.r)(!1);return r.a.createElement("div",{ref:l,className:"DropdownMenu "+(t||""),onKeyDown:e=>{const t=f.current;if(!b||40!==e.keyCode||!t)return;const n=document.activeElement,r=Array.from(t.children);n&&-1!==r.indexOf(n)||r[0].focus()}},e({onTrigger:()=>{h(!b),b?s&&s():i&&i()},isOpen:b}),r.a.createElement(u.a,{ref:f,containerRef:l,isOpen:b||!!a,className:t||"",positionX:o,positionY:c,footer:d,autoClose:!0,onClose:()=>{h(!1),s&&s()},shouldSkipTransition:a},n))}},function(e,t,n){"use strict";var r=n(0);t.a=(e,t,n,u,o)=>{const[c,d]=Object(r.r)(-1);Object(r.n)(()=>{d(-1);const n=e.current;t&&n&&!o&&(n.tabIndex=-1,n.focus())},[e,t,o]);return Object(r.m)(t=>{const r=e.current;if(!r)return;if(13===t.keyCode&&n)return void n(c);if(38!==t.keyCode&&40!==t.keyCode)return;const o=document.activeElement,a=Array.from(u?r.querySelectorAll(u):r.children);let i=o&&a.indexOf(o)||c;if(38===t.keyCode&&i>0)i--;else if(40===t.keyCode&&i{if(e.length>24)return!1;if(!Boolean(e.match(u)))return!1;let t=0;for(;r.a.exec(e);)if(t++,t>3)return r.a.lastIndex=0,!1;return t}},function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return c}));const r=["female_sign","male_sign","medical_symbol"];function u(e){const t=e.split("-").map(e=>parseInt(e,16));return String.fromCodePoint(...t)}function o(e){let t;if(1===e.length)t=e.charCodeAt(0).toString(16).padStart(4,"0");else{const n=[];for(let t=0;t=55296&&e.charCodeAt(t)<=56319?e.charCodeAt(t+1)>=56320&&e.charCodeAt(t+1)<=57343&&n.push(1024*(e.charCodeAt(t)-55296)+(e.charCodeAt(t+1)-56320)+65536):(e.charCodeAt(t)<55296||e.charCodeAt(t)>57343)&&n.push(e.charCodeAt(t));t=n.map(e=>e.toString(16).padStart(4,"0")).join("-")}return t}function c(e){const t={categories:[],emojis:{}};for(let n=0;n{void 0!==e.props[r]&&void 0===t.props[r]&&g(n,r,e.props[r])}),u.forEach(r=>{void 0!==t.props[r]&&e.props[r]!==t.props[r]&&(void 0===e.props[r]?p(n,r,t.props[r]):function(e,t,n,r){"value"===t?e.value=void 0!==r?r:"":(g(e,t,n),p(e,t,r))}(n,r,e.props[r],t.props[r]))})}(t,n,Object(r.b)(t)),n.children=function(e,t,n){if(t.props.teactFastList)return function(e,t,n){const u=new Set(t.children.map(e=>{const t="props"in e&&e.props.key;return o.r&&Object(r.f)(e)&&!t&&console.warn("Missing `key` in `teactFastList`"),t}));let c=0;const d=e.children.reduce((e,r,o)=>{let d="props"in r?r.props.key:void 0;if(d&&!u.has(d))return f(n,r,void 0,t,-1),e;if(!d){const u=t.children[o],c=u&&"props"in u?u.props.key:void 0;if(!u||c)return f(n,r,void 0,t,-1),e;d="__indexKey#"+o}return e[d]={$element:r,index:c++,order:"props"in r?r.props.teactOrderKey:void 0},e},{});let a,i,s=[],l=0;t.children.forEach((e,r)=>{const u="props"in e?e.props.key:"__indexKey#"+r,o=d[u];if(!o)return a||(a=[],i=r),void a.push(e);a&&(s=s.concat(m(a,i,n,t)),i=void 0,a=void 0);const c="props"in e?e.props.teactOrderKey:void 0,b=o.index!==l&&o.order!==c,h=b&&l>o.index;b&&!h||l++,s.push(f(n,o.$element,e,t,r,{forceIndex:!0,...b&&{moveDirection:h?"down":"up"}}))}),a&&(s=s.concat(m(a,i,n,t)));return s}(e,t,n);const u=Math.max(e.children.length,t.children.length),c=[],d=t.children.length>e.children.length+1?document.createDocumentFragment():void 0;for(let r=0;r=e.children.length?{fragment:d}:void 0);u&&c.push(u)}d&&n.appendChild(d);return c}(t,n,u?e:Object(r.b)(t))}}return n}function l(e,t,n,u){if(!Object(r.d)(e))return e;const{componentInstance:o}=e;if(!o.isMounted){b(e=Object(r.i)(o),t,n,u);const c=e.children[0];Object(r.d)(c)&&(e.children=[l(c,e,0,u)]),o.isMounted=!0}return e}function b(e,t,n,r){const{componentInstance:u}=e;u.onUpdate=()=>{t.children[n]=f(r,t.children[n],u.$element,t,n,{skipComponentUpdate:!0})}}function h(e){if(Object(r.e)(e))return document.createTextNode("");if(Object(r.g)(e))return document.createTextNode(e.value);if(Object(r.d)(e))return h(e.children[0]);const{tag:t,props:n,children:u=[]}=e,o=document.createElement(t);return"object"==typeof n.ref&&(n.ref.current=o),Object.keys(n).forEach(e=>{p(o,e,n[e])}),e.children=u.map((t,n)=>f(o,void 0,t,e,n)),o}function m(e,t,n,r){if(1===e.length)return[f(n,void 0,e[0],r,t,{forceIndex:!0})];if(e.length>1){const u=document.createDocumentFragment(),o=e.map(e=>f(n,void 0,e,r,t,{fragment:u}));return n.childNodes[t]?n.insertBefore(u,n.childNodes[t]):n.appendChild(u),o}throw new Error("Unexpected input")}function p(e,t,n){void 0!==n&&("className"===t?e.className=n:"value"===t?e.value=n:"style"===t?e.style.cssText=n:t.startsWith("on")?Object(c.a)(e,t,n,t.endsWith("Capture")):t.startsWith("data-")||a.has(t)?e.setAttribute(t,n):d.has(t)||(e[i[t]||t]=n))}function g(e,t,n){"className"===t?e.className="":"value"===t?e.value="":"style"===t?e.style.cssText="":t.startsWith("on")?Object(c.c)(e,t,n,t.endsWith("Capture")):t.startsWith("data-")||a.has(t)?e.removeAttribute(t):d.has(t)||delete e[i[t]||t]}t.a={render:function(e,t){if(!t)return;let n=t.getAttribute("data-teact-head-id");n||(n=Object(u.a)(s),s[n]={children:[]},t.setAttribute("data-teact-head-id",n));const r=s[n];r.children=[f(t,r.children[0],e,r,0)]}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return h}));var r=n(0),u=n(4),o=n(41),c=n(22),d=n(1),a=n(3),i=n(9),s=n(32);var f=Object(d.h)(void 0,(e,t)=>Object(a.l)(t,["openUserInfo"]))(({className:e,sender:t,openUserInfo:n,children:u})=>{const o=Object(r.m)(()=>{t&&n({id:t.id})},[t,n]);return t?r.a.createElement(s.a,{className:Object(i.a)("UserLink",e),onClick:o},u):u});var l=Object(d.h)(void 0,(e,t)=>Object(a.l)(t,["focusMessage"]))(({className:e,message:t,children:n,focusMessage:u})=>{const o=Object(r.m)(()=>{t&&u({chatId:t.chatId,messageId:t.id})},[u,t]);return t?r.a.createElement(s.a,{className:Object(i.a)("MessageLink",e),onClick:o},n):n});var b=Object(d.h)(void 0,(e,t)=>Object(a.l)(t,["openChat"]))(({className:e,chatId:t,openChat:n,children:u})=>{const o=Object(r.m)(()=>{t&&n({id:t})},[t,n]);return t?r.a.createElement(s.a,{className:Object(i.a)("ChatLink",e),onClick:o},u):u});function h(e,t,n,d,a,i,s={}){if(!t.content.action)return[];const{text:f,translationValues:h}=t.content.action,g=[],y={...s,maxTextLength:32};let v,O=p(e("Chat.Service.Group.UpdatedPinnedMessage1"!==f||a?f:"Message.PinnedGenericMessage",h&&h.length?h:void 0),"%action_origin%",n?!s.isEmbedded&&function(e,t,n){return Object(u.ib)(t)?function(e,t,n){const d=Object(o.a)(Object(u.k)(e,t));if(n)return d;return r.a.createElement(b,{className:"action-link",chatId:t.id},t&&Object(c.a)(d))}(e,t,n):m(t,n)}(e,n,s.asPlain)||" ":"User");return v=O.pop(),g.push(...O),O=p(v,"%target_user%",d?d.map(e=>m(e,s.asPlain)).filter(Boolean):"User"),v=O.pop(),g.push(...O),O=p(v,"%message%",a?function(e,t,n={}){const d=Object(u.O)(e,t),{photo:a,video:i,document:s,sticker:f}=Object(u.v)(t),{maxTextLength:b,isEmbedded:h,asPlain:m}=n,p=h&&d&&!a&&!i&&!s&&!f;let g=Object(o.a)(d,b);h&&(a?g="a photo":i?g=i.isGif?"a GIF":"a video":s?g="a document":f&&(g=d));if(m)return p?`«${g}»`:g;if(p)return r.a.createElement("span",null,"«",r.a.createElement(l,{className:"action-link",message:t},Object(c.a)(g)),"»");return r.a.createElement(l,{className:"action-link",message:t},Object(c.a)(g))}(e,a,y):"a message"),v=O.pop(),g.push(...O),O=p(v,"%product%",a?function(e){return e.content&&e.content.invoice?e.content.invoice.title:"a product"}(a):"a product"),v=O.pop(),g.push(...O),O=p(v,"%target_chat%",i?function(e,t){if(t)return"another chat";return r.a.createElement(b,{className:"action-link",chatId:e},"another chat")}(i,s.asPlain):"another chat"),g.push(...O),s.asPlain?g.join("").trim():g}function m(e,t){const n=Object(o.a)(Object(u.bb)(e));return t?n:r.a.createElement(f,{className:"action-link",sender:e},e&&Object(c.a)(n))}function p(e,t,n){const r=e.indexOf(t);if(r<0||!n)return[e];const u=[];return u.push(e.substring(0,r)),Array.isArray(n)?n.forEach((e,t)=>{u.push(e),t+1({userOrChat:t?Object(c.Jb)(e,t):void 0}),(e,t)=>Object(o.l)(t,["openChat","openChatByUsername"]))(({username:e,userOrChat:t,children:n,openChat:u,openChatByUsername:o})=>r.a.createElement("a",{onClick:()=>{t?u({id:t.id}):e&&o({username:e.substring(1)})},className:"text-entity-link",dir:"auto"},n))},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(2);function u(e){"function"==typeof window.navigator.setAppBadge&&window.navigator.setAppBadge(e).catch(e=>{r.r&&console.error(e)})}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(0);function u(e,t,n){Object(r.n)(()=>{const r=e=>{const r=t.current,u=e.target;r&&u&&(r.contains(e.target)&&!u.classList.contains("backdrop")||(e.preventDefault(),e.stopPropagation(),n&&n()))};return e&&n&&document.addEventListener("mousedown",r),()=>{document.removeEventListener("mousedown",r)}},[e,t,n])}},function(e,t,n){e.exports=function(){return new Worker(n.p+"5aa1e598c74b078112d5.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"5054ce745024de60a724.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"695e66b225ec96107343.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"4c9029ba18603b924ede.worker.js")}},function(e,t,n){"use strict";var r=n(1),u=n(2),o=n(6),c=n(14),d=n(45),a=n(7);!function(){function e(){const e=document.documentElement.className.match(/theme-(\w+)/),t=e?e[1]:"light",n=Object(r.e)(),o=Object(a.Db)(n),{animationLevel:c}=n.settings.byKey;o!==t&&(Object(d.a)(o,c===u.e),Object(r.g)({...n}))}const t=window.matchMedia("(prefers-color-scheme: dark)");"function"==typeof t.addEventListener?t.addEventListener("change",e):"function"==typeof t.addListener&&t.addListener(e)}(),Object(r.b)("init",e=>{const{animationLevel:t,messageTextSize:n,language:r}=e.settings.byKey,i=Object(a.Db)(e);Object(c.d)(r,void 0,!0),document.documentElement.style.setProperty("--composer-text-size",Math.max(n,o.e?16:15)+"px"),document.documentElement.style.setProperty("--message-text-size",n+"px"),document.body.classList.add("initial"),document.body.classList.add("animation-level-"+t),document.body.classList.add(o.n?"is-touch-env":"is-pointer-env"),Object(d.a)(i,t===u.e),o.j&&document.body.classList.add("is-safari"),o.e?document.body.classList.add("is-ios"):o.b?document.body.classList.add("is-android"):o.f&&document.body.classList.add("is-macos")}),Object(r.b)("setIsUiReady",(e,t,n)=>{const{uiReadyState:r}=n;return 2===r&&document.body.classList.remove("initial"),{...e,uiReadyState:r}}),Object(r.b)("setAuthPhoneNumber",(e,t,n)=>{const{phoneNumber:r}=n;return{...e,authPhoneNumber:r}}),Object(r.b)("setAuthRememberMe",(e,t,n)=>({...e,authRememberMe:Boolean(n)})),Object(r.b)("clearAuthError",e=>({...e,authError:void 0})),Object(r.b)("disableHistoryAnimations",()=>{setTimeout(()=>{Object(r.g)({...Object(r.e)(),shouldSkipHistoryAnimations:!1}),document.body.classList.remove("no-animate")},450),Object(r.g)({...Object(r.e)(),shouldSkipHistoryAnimations:!0},!0)})},function(e,t,n){"use strict";var r=n(1),u=n(11);Object(r.b)("setSettingOption",(e,t,n)=>Object(u.w)(e,n)),Object(r.b)("setThemeSettings",(e,t,n)=>{const{theme:r,...o}=n;return Object(u.x)(e,r,o)})},function(e,t,n){"use strict";var r=n(1),u=n(5),o=n(2),c=n(6),d=n(34),a=n(12),i=n(79),s=n(18);Object(r.b)("initApi",(e,t)=>{(async()=>{o.N||(await Object(s.d)(),Object(s.a)()),Object(u.c)(t.apiUpdate,{userAgent:navigator.userAgent,platform:c.r,sessionData:Object(s.e)()})})()}),Object(r.b)("setAuthPhoneNumber",(e,t,n)=>{const{phoneNumber:r}=n;return Object(u.a)("provideAuthPhoneNumber",r.replace(/[^\d]/g,"")),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("setAuthCode",(e,t,n)=>{const{code:r}=n;return Object(u.a)("provideAuthCode",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("setAuthPassword",(e,t,n)=>{const{password:r}=n;return Object(u.a)("provideAuthPassword",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("uploadProfilePhoto",(e,t,n)=>{const{file:r}=n;Object(u.a)("uploadProfilePhoto",r)}),Object(r.b)("signUp",(e,t,n)=>{const{firstName:r,lastName:o}=n;return Object(u.a)("provideAuthRegistration",{firstName:r,lastName:o}),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("returnToAuthPhoneNumber",e=>(Object(u.a)("restartAuth"),{...e,authError:void 0})),Object(r.b)("goToAuthQrCode",e=>(Object(u.a)("restartAuthWithQr"),{...e,authIsLoadingQrCode:!0,authError:void 0})),Object(r.b)("saveSession",(e,t,n)=>{const{sessionData:r}=n;r?Object(s.f)(n.sessionData,e.currentUserId):Object(s.b)()}),Object(r.b)("signOut",()=>{(async()=>{try{await Object(d.d)(),await Object(u.a)("destroy")}catch(e){}Object(r.d)().reset()})()}),Object(r.b)("reset",()=>{Object(s.b)(),a.b(o.Y),a.b(o.Z),a.b(o.ab),a.b(o.o);const e=o.O.replace(/\d+$/,""),t=(o.O.match(/\d+$/)||[0])[0];for(let n=0;n{(async()=>{await Object(u.a)("disconnect")})()}),Object(r.b)("loadNearestCountry",e=>{"connectionStateReady"===e.connectionState&&(async()=>{const e=await Object(u.a)("fetchNearestCountry");Object(r.g)({...Object(r.e)(),authNearestCountry:e})})()}),Object(r.b)("setDeviceToken",(e,t,n)=>{Object(r.g)({...e,push:{deviceToken:n,subscribedAt:Date.now()}})}),Object(r.b)("deleteDeviceToken",e=>{const t={...e};delete t.push,Object(r.g)(t)})},function(e,t,n){"use strict";var r=n(1),u=n(13),o=n(5),c=n(3),d=n(7),a=n(11),i=n(4);function s(e,{visibility:t,allowedIds:n,deniedIds:r}){const{users:{byId:u},chats:{byId:o}}=e,c={visibility:t};let d,a;const s=e=>{if(!Object(i.ob)(e))return;const{id:t,accessHash:n}=u[e]||{};return t?{id:t,accessHash:n}:void 0},f=e=>{if(Object(i.ob)(e))return;const t=o[e];return t?{id:t.id}:void 0};return"contacts"!==t&&"nobody"!==t||(d=n.map(s).filter(Boolean),a=n.map(f).filter(Boolean),d.length>0&&(c.allowedUsers=d),a.length>0&&(c.allowedChats=a)),"everybody"!==t&&"contacts"!==t||(d=r.map(s).filter(Boolean),a=r.map(f).filter(Boolean),d.length>0&&(c.blockedUsers=d),a.length>0&&(c.blockedChats=a)),c}Object(r.b)("updateProfile",(e,t,n)=>{const{photo:c,firstName:i,lastName:s,bio:f,username:l}=n;(async()=>{const{currentUserId:t}=e;if(t){if(Object(r.g)({...Object(r.e)(),profileEdit:{progress:u.k.InProgress}}),c&&await Object(o.a)("updateProfilePhoto",c),i||s||f){if(await Object(o.a)("updateProfile",{firstName:i,lastName:s,about:f})){e=Object(r.e)();const n=t&&Object(d.Jb)(e,t);n&&Object(r.g)(Object(a.ob)(e,n.id,{firstName:i,lastName:s,fullInfo:{...n.fullInfo,bio:f}}))}}if(l){await Object(o.a)("updateUsername",l)&&t&&Object(r.g)(Object(a.ob)(Object(r.e)(),t,{username:l}))}Object(r.g)({...Object(r.e)(),profileEdit:{progress:u.k.Complete}})}})()}),Object(r.b)("checkUsername",(e,t,n)=>{const{username:c}=n;(async()=>{if(e.profileEdit&&e.profileEdit.progress===u.k.InProgress)return;Object(r.g)({...e,profileEdit:{progress:e.profileEdit?e.profileEdit.progress:u.k.Idle,isUsernameAvailable:void 0}});const t=await Object(o.a)("checkUsername",c);e=Object(r.e)(),Object(r.g)({...e,profileEdit:{...e.profileEdit,isUsernameAvailable:t}})})()}),Object(r.b)("loadWallpapers",()=>{(async()=>{const e=await Object(o.a)("fetchWallpapers",0);if(!e)return;const t=Object(r.e)();Object(r.g)({...t,settings:{...t.settings,loadedWallpapers:e.wallpapers}})})()}),Object(r.b)("uploadWallpaper",(e,t,n)=>{const c=n,d=URL.createObjectURL(c);Object(r.g)({...e,settings:{...e.settings,loadedWallpapers:[{slug:u.o,document:{fileName:"",size:c.size,mimeType:c.type,previewBlobUrl:d}},...e.settings.loadedWallpapers||[]]}}),(async()=>{const t=await Object(o.a)("uploadWallpaper",c);if(!t)return;const{wallpaper:n}=t;if(!(e=Object(r.e)()).settings.loadedWallpapers)return;const a=e.settings.loadedWallpapers[0];if(!a||a.slug!==u.o)return;const i={...n,document:{...n.document,previewBlobUrl:d}};Object(r.g)({...e,settings:{...e.settings,loadedWallpapers:[i,...e.settings.loadedWallpapers.slice(1)]}})})()}),Object(r.b)("loadBlockedContacts",()=>{(async()=>{const e=await Object(o.a)("fetchBlockedContacts");if(!e)return;let t=Object(r.e)();e.users&&e.users.length&&(t=Object(a.g)(t,Object(c.c)(e.users,"id"))),e.chats&&e.chats.length&&(t=Object(a.N)(t,Object(c.c)(e.chats,"id"))),t={...t,blocked:{...t.blocked,ids:[...t.blocked.ids||[],...e.blockedIds],totalCount:e.totalCount}},Object(r.g)(t)})()}),Object(r.b)("blockContact",(e,t,n)=>{const{contactId:u,accessHash:c}=n;(async()=>{if(!await Object(o.a)("blockContact",u,c))return;const e=Object(r.e)();Object(r.g)(Object(a.a)(e,u))})()}),Object(r.b)("unblockContact",(e,t,n)=>{const{contactId:u}=n;let c;if(Object(i.ob)(u)){const t=Object(d.Jb)(e,u);if(!t)return;c=t.accessHash}(async()=>{if(!await Object(o.a)("unblockContact",u,c))return;const e=Object(r.e)();Object(r.g)(Object(a.q)(e,u))})()}),Object(r.b)("loadAuthorizations",()=>{(async()=>{const e=await Object(o.a)("fetchAuthorizations");e&&Object(r.g)({...Object(r.e)(),activeSessions:e})})()}),Object(r.b)("terminateAuthorization",(e,t,n)=>{const{hash:u}=n;(async()=>{if(!await Object(o.a)("terminateAuthorization",u))return;const e=Object(r.e)();Object(r.g)({...e,activeSessions:e.activeSessions.filter(e=>e.hash!==u)})})()}),Object(r.b)("terminateAllAuthorizations",()=>{(async()=>{if(!await Object(o.a)("terminateAllAuthorizations"))return;const e=Object(r.e)();Object(r.g)({...e,activeSessions:e.activeSessions.filter(e=>e.isCurrent)})})()}),Object(r.b)("loadNotificationExceptions",e=>{const{serverTimeOffset:t}=e;(async()=>{const e=await Object(o.a)("fetchNotificationExceptions",{serverTimeOffset:t});e&&Object(r.g)(Object(a.f)(Object(r.e)(),e))})()}),Object(r.b)("loadNotificationSettings",e=>{const{serverTimeOffset:t}=e;(async()=>{const e=await Object(o.a)("fetchNotificationSettings",{serverTimeOffset:t});e&&Object(r.g)(Object(a.w)(Object(r.e)(),e))})()}),Object(r.b)("updateNotificationSettings",(e,t,n)=>{const{peerType:u,isSilent:c,shouldShowPreviews:d}=n;(async()=>{await Object(o.a)("updateNotificationSettings",u,{isSilent:c,shouldShowPreviews:d})&&Object(r.g)(Object(a.db)(Object(r.e)(),u,c,d))})()}),Object(r.b)("updateContactSignUpNotification",(e,t,n)=>{const{isSilent:u}=n;(async()=>{await Object(o.a)("updateContactSignUpNotification",u)&&Object(r.g)(Object(a.w)(Object(r.e)(),{hasContactJoinedNotifications:!u}))})()}),Object(r.b)("loadLanguages",()=>{(async()=>{const e=await Object(o.a)("fetchLanguages");e&&Object(r.g)(Object(a.w)(Object(r.e)(),{languages:e}))})()}),Object(r.b)("loadPrivacySettings",()=>{(async()=>{const[e,t,n,u,c]=await Promise.all([Object(o.a)("fetchPrivacySettings","phoneNumber"),Object(o.a)("fetchPrivacySettings","lastSeen"),Object(o.a)("fetchPrivacySettings","profilePhoto"),Object(o.a)("fetchPrivacySettings","forwards"),Object(o.a)("fetchPrivacySettings","chatInvite")]);if(!(e&&t&&n&&u&&c))return;const d=Object(r.e)();d.settings.privacy.phoneNumber=e,d.settings.privacy.lastSeen=t,d.settings.privacy.profilePhoto=n,d.settings.privacy.forwards=u,d.settings.privacy.chatInvite=c,Object(r.g)(d)})()}),Object(r.b)("setPrivacyVisibility",(e,t,n)=>{const{privacyKey:u,visibility:c}=n,{privacy:{[u]:d}}=e.settings;if(!d)return;const a=s(e,{visibility:c,allowedIds:[...d.allowUserIds,...d.allowChatIds],deniedIds:[...d.blockUserIds,...d.blockChatIds]});(async()=>{const e=await Object(o.a)("setPrivacySettings",u,a);if(e){const t=Object(r.e)();t.settings.privacy[u]=e,Object(r.g)(t)}})()}),Object(r.b)("setPrivacySettings",(e,t,n)=>{const{privacyKey:u,isAllowList:c,contactsIds:d}=n,{privacy:{[u]:a}}=e.settings;if(!a)return;const i=s(e,{visibility:a.visibility,allowedIds:c?d:[...a.allowUserIds,...a.allowChatIds],deniedIds:c?[...a.blockUserIds,...a.blockChatIds]:d});(async()=>{const e=await Object(o.a)("setPrivacySettings",u,i);if(e){const t=Object(r.e)();t.settings.privacy[u]=e,Object(r.g)(t)}})()}),Object(r.b)("updateIsOnline",(e,t,n)=>{Object(o.a)("updateIsOnline",n)}),Object(r.b)("loadContentSettings",()=>{(async()=>{const e=await Object(o.a)("fetchContentSettings");e&&Object(r.g)(Object(a.w)(Object(r.e)(),e))})()}),Object(r.b)("updateContentSettings",(e,t,n)=>{(async()=>{Object(r.g)(Object(a.w)(Object(r.e)(),{isSensitiveEnabled:n}));await Object(o.a)("updateContentSettings",n)||Object(r.g)(Object(a.w)(Object(r.e)(),{isSensitiveEnabled:!n}))})()})},function(e,t,n){"use strict";var r=n(1),u=n(2),o=n(34),c=n(11),d=n(14);Object(r.b)("apiUpdate",(e,t,n)=>{switch(u.r&&"updateUserStatus"!==n["@type"]&&"updateServerTimeOffset"!==n["@type"]&&console.log("[GramJs] UPDATE",n["@type"],{update:n}),n["@type"]){case"updateApiReady":!function(e){Object(o.c)(),Object(d.d)(e.settings.byKey.language)}(e);break;case"updateAuthorizationState":!function(e){let t=Object(r.e)();const n="authorizationStateReady"===t.authState,u=e.authorizationState;switch(Object(r.g)({...t,authState:u,authIsLoading:!1}),t=Object(r.e)(),u){case"authorizationStateLoggingOut":Object(r.g)({...t,isLoggingOut:!0});break;case"authorizationStateWaitCode":Object(r.g)({...t,authIsCodeViaApp:e.isCodeViaApp});break;case"authorizationStateWaitPassword":Object(r.g)({...t,authHint:e.hint});break;case"authorizationStateWaitQrCode":Object(r.g)({...t,authIsLoadingQrCode:!1,authQrCode:e.qrCode});break;case"authorizationStateReady":if(n)break;Object(r.g)({...t,isLoggingOut:!1,lastSyncTime:Date.now()})}}(n);break;case"updateAuthorizationError":!function(e){Object(r.g)({...Object(r.e)(),authError:e.message})}(n);break;case"updateConnectionState":!function(e){const{connectionState:t}=e,n=Object(r.e)();Object(r.g)({...n,connectionState:t}),"connectionStateReady"===t&&"authorizationStateReady"===n.authState?Object(r.d)().sync():"connectionStateBroken"===t&&Object(r.d)().signOut()}(n);break;case"updateSession":!function(e){const{sessionData:t}=e,{authRememberMe:n,authState:u}=Object(r.e)(),o=!t||!t.mainDcId;if(!n||"authorizationStateReady"!==u||o)return;Object(r.d)().saveSession({sessionData:t})}(n);break;case"updateServerTimeOffset":!function(e){const t=Object(r.e)();if(t.serverTimeOffset===e.serverTimeOffset)return;Object(r.g)({...t,serverTimeOffset:e.serverTimeOffset})}(n);break;case"updateCurrentUser":!function(e){const{currentUser:t}=e;Object(r.g)({...Object(c.ob)(Object(r.e)(),t.id,t),currentUserId:t.id}),function(e){const t=localStorage.getItem(u.zb);if(!t)return;const n=JSON.parse(t);n.id=e,localStorage.setItem(u.zb,JSON.stringify(n))}(t.id)}(n);break;case"error":"SESSION_REVOKED"===n.error.message&&t.signOut(),t.showDialog&&t.showDialog({data:{...n.error,hasErrorKey:!0}})}})},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";n.r(t);n(27),function(){function e(){var t=Error.call(this,"ServiceWorker is not supported.");return Object.setPrototypeOf(t,e.prototype),t}e.prototype=Object.create(Error.prototype)}();var r=n.p+"serviceWorker.js";var u=n(2),o=n(1),c=n(6),d=n(34);function a(e){const t=e.data;if(!t.type)return;const n=Object(o.d)();switch(t.type){case"focusMessage":n.focusMessage(t.payload)}}function i(){navigator.serviceWorker.removeEventListener("message",a),navigator.serviceWorker.addEventListener("message",a),Object(d.a)()}c.k&&(window.addEventListener("load",async()=>{try{await navigator.serviceWorker.register(r),u.r&&console.log("[SW] ServiceWorker registered"),await navigator.serviceWorker.ready,navigator.serviceWorker.controller?(u.r&&console.log("[SW] ServiceWorker ready"),i()):(u.r&&console.error("[SW] ServiceWorker not available"),c.e||c.b||Object(o.d)().showDialog({data:{message:"SERVICE_WORKER_DISABLED",hasErrorKey:!0}}))}catch(e){u.r&&console.error("[SW] ServiceWorker registration failed: ",e)}}),window.addEventListener("focus",async()=>{await navigator.serviceWorker.ready,i()}));var s=n(67);const f={isLeftColumnShown:!0,isChatInfoShown:!1,newChatMembersProgress:n(13).i.Closed,uiReadyState:0,serverTimeOffset:0,authRememberMe:!0,blocked:{ids:[],totalCount:0},users:{byId:{}},chats:{listIds:{},isFullyLoaded:{},orderedPinnedIds:{},totalCount:{},byId:{}},messages:{byChatId:{},messageLists:[]},scheduledMessages:{byChatId:{}},chatFolders:{byId:{},activeChatFolder:0},fileUploads:{byMessageLocalId:{}},recentEmojis:["grinning","kissing_heart","christmas_tree","brain","trophy"],stickers:{setsById:{},added:{},recent:{stickers:[]},favorite:{stickers:[]},featured:{setIds:[]},search:{},forEmoji:{}},emojiKeywords:{},gifs:{saved:{},search:{}},inlineBots:{isLoading:!1,byUsername:{}},globalSearch:{},userSearch:{},localTextSearch:{byChatThreadKey:{}},localMediaSearch:{byChatId:{}},management:{byChatId:{}},topPeers:{},topInlineBots:{},mediaViewer:{},audioPlayer:{},forwardMessages:{},pollResults:{},payment:{},notifications:[],dialogs:[],activeSessions:[],settings:{byKey:{theme:"light",shouldUseSystemTheme:!0,messageTextSize:c.e?u.M:c.f?u.U:u.w,animationLevel:u.d,messageSendKeyCombo:"enter",shouldAutoDownloadMediaFromContacts:!0,shouldAutoDownloadMediaInPrivateChats:!0,shouldAutoDownloadMediaInGroups:!0,shouldAutoDownloadMediaInChannels:!0,shouldAutoPlayGifs:!0,shouldAutoPlayVideos:!0,shouldSuggestStickers:!0,shouldLoopStickers:!0,language:"en"},themes:{light:{isBlurred:!0,patternColor:u.x},dark:{isBlurred:!0,patternColor:u.q}},privacy:{},notifyExceptions:{}},twoFaSettings:{},shouldShowContextMenuHint:!0};var l=n(8),b=n(10),h=n(37),m=n(3),p=n(7),g=n(18);const y=Object(b.h)(()=>Object(b.d)(E),5e3,!1);let v,O=!1,j=!1;function w(e){if(!u.I)return Object(g.c)(!0)?(I(),function(e){u.r&&console.time("global-state-cache-read");const t=localStorage.getItem(u.J),n=t?JSON.parse(t):void 0;u.r&&console.timeEnd("global-state-cache-read");n&&(n.settings.byKey={...e.settings.byKey,...n.settings.byKey},n.settings.themes={...e.settings.themes,...n.settings.themes},n.chatFolders={...e.chatFolders,...n.chatFolders},n.messages.messageLists||(n.messages.messageLists=[]));return{...e,...n}}(e)):void C()}function I(){O=!0,v=Object(b.c)(E,!0),window.addEventListener("blur",E),Object(o.a)(y)}function C(){O=!1,Object(o.f)(y),window.removeEventListener("blur",E),v&&v()}function E(){if(!O||j)return;const e=Object(o.e)();if(e.isLoggingOut)return;const t={...f,...Object(m.l)(e,["authState","authPhoneNumber","authRememberMe","authNearestCountry","currentUserId","contactList","topPeers","topInlineBots","recentEmojis","push","shouldShowContextMenuHint"]),isChatInfoShown:S(e),users:M(e),chats:A(e),messages:k(e),globalSearch:{recentlyFoundChatIds:e.globalSearch.recentlyFoundChatIds},settings:T(e),chatFolders:N(e)},n=JSON.stringify(t);localStorage.setItem(u.J,n)}function S(e){return window.innerWidth>u.lb&&e.isChatInfoShown}function M(e){const{users:{byId:t,selectedId:n}}=e,r=[...(e.chats.listIds.active||[]).slice(0,u.H).filter(e=>e>0),...Object.keys(t)].slice(0,u.K);return{byId:Object(m.l)(t,r),selectedId:window.innerWidth>u.lb?n:void 0}}function A(e){const t=[...(e.chats.listIds.active||[]).slice(0,u.H)],{chatId:n}=Object(p.z)(e)||{};return{...e.chats,byId:Object(m.l)(e.chats.byId,n?[...t,n]:t),listIds:{active:t},isFullyLoaded:{},orderedPinnedIds:{active:e.chats.orderedPinnedIds.active}}}function k(e){const t={},{chatId:n}=Object(p.z)(e)||{};[...(e.chats.listIds.active||[]).slice(0,u.H),...n?[n]:[]].forEach(n=>{const r=e.messages.byChatId[n];if(!r)return;const u=r.threadsById[l.MAIN_THREAD_ID];u&&u.viewportIds&&(t[n]={byId:Object(m.l)(r.byId,u.viewportIds),threadsById:{[l.MAIN_THREAD_ID]:u}})});const r=Object(p.z)(e);return{byChatId:t,messageLists:!r||c.l?[]:[{...r,threadId:l.MAIN_THREAD_ID,type:"thread"}]}}function T(e){const{byKey:t,themes:n}=e.settings;return{byKey:t,themes:n,privacy:{},notifyExceptions:{}}}function N(e){return{...e.chatFolders,activeChatFolder:0}}document.addEventListener(h.b,()=>{j=!0}),document.addEventListener(h.a,()=>{j=!1}),u.I||(Object(o.b)("saveSession",()=>{O||I()}),Object(o.b)("reset",()=>{localStorage.removeItem(u.J),O&&C()})),Object(o.b)("init",()=>{const e=Object(m.d)(f);return w(e)||e});var P=n(0),D=n(54);const L=String(Date.now()+Math.random());let x;localStorage.setItem("tt-active-tab",L);const F=window.setInterval(()=>{x&&localStorage.getItem("tt-active-tab")!==L&&(x(),clearInterval(F))},2e3);var B=n(25),R=(n(85),n(86),n(87),n(88),n(89),n(39)),U=n(36),_=n(40),$=n(17);const G=["400 1em Roboto","500 1em Roboto"];function W(){if("fonts"in document)return Promise.all(G.map(e=>document.fonts.load(e)))}var H=n(57),z=n(15),K=n(9),V=(n(91),n.p+"telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg"),q=n.p+"monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg";function J(){const{listIds:e,byId:t}=Object(o.e)().chats;if(e.active)return Promise.all(e.active.slice(0,10).map(e=>{const n=t[e];if(!n)return;const r=Object(U.d)(n);return r?H.b(r,l.ApiMediaFormat.DataUri):void 0}))}const Q={main:()=>Promise.all([Object(z.d)(z.a.Main,"Main").then(W),J()]),authPhoneNumber:()=>Promise.all([W(),Object($.g)(V)]),authCode:()=>Object($.g)(q),authPassword:()=>Object($.g)(q),authQrCode:W};var Y=Object(o.h)(e=>{const t=Object(p.Db)(e),{background:n,backgroundColor:r}=e.settings.themes[t]||{};return{shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations,uiReadyState:e.uiReadyState,hasCustomBackground:Boolean(n),hasCustomBackgroundColor:Boolean(r),isRightColumnShown:Object(p.W)(e)}},(e,t)=>Object(m.l)(t,["setIsUiReady"]))(({page:e,children:t,hasCustomBackground:n,hasCustomBackgroundColor:r,isRightColumnShown:u,shouldSkipHistoryAnimations:o,setIsUiReady:c})=>{const[d,a]=Object(B.a)(),{shouldRender:i,transitionClassNames:s}=Object(_.a)(!d,void 0,!0);return Object(P.n)(()=>{let t;return Promise.race([Object(b.f)(700),(async()=>{try{await Q[e]()}catch(e){}})()]).then(()=>{a(),c({uiReadyState:1}),t=window.setTimeout(()=>{c({uiReadyState:2})},1e3)}),()=>{t&&(clearTimeout(t),t=void 0),c({uiReadyState:0})}},[]),P.a.createElement("div",{id:"UiLoader"},t,i&&!o&&P.a.createElement("div",{className:Object(K.a)("mask",s)},"main"===e?P.a.createElement(P.a.Fragment,null,P.a.createElement("div",{className:"left"}),P.a.createElement("div",{className:Object(K.a)("middle",n&&"custom-bg-image",r&&"custom-bg-color",u&&"with-right-column")}),u&&P.a.createElement("div",{className:"right"})):P.a.createElement("div",{className:"blank"})))}),Z=n(23),X=n(14),ee=n(16),te=(e,t)=>{const[n,r]=Object(P.r)();return e&&X.c(e,t).then(r),n};function ne(){let e=navigator.language;return e&&"pt-br"!==e&&(e=e.substr(0,2)),e}var re=n(21),ue=n(48),oe=n(47),ce=n(20),de=n(53),ae=n(22),ie=n(63),se=n(43),fe=n(26);n(100);const le=200+u.c;var be=Object(P.h)(({id:e,value:t,isLoading:n,onChange:r})=>{const u=Object(ee.a)(),o=Object(P.q)(null),[c,d]=Object(P.r)(),[a,i]=Object(P.r)(Z.a);function s(e){d(e),i(function(e=""){return e.length?Z.a.filter(t=>Object(de.a)(t.name,e)):Z.a}(e))}const f=Object(P.m)(e=>{const{countryId:t}=e.currentTarget.firstElementChild.dataset,n=Z.a.find(e=>e.id===t);n&&r(n),setTimeout(()=>s(void 0),le)},[r]),l=Object(P.m)(e=>{s(e.currentTarget.value)},[]),b=Object(P.m)(e=>{if(8!==e.keyCode)return;const n=e.currentTarget;t&&void 0===c&&(n.value=""),s(n.value)},[c,t]);return P.a.createElement(ie.a,{className:"CountryCodeInput",trigger:({onTrigger:r,isOpen:d})=>{const a=()=>{if(d)return;setTimeout(()=>{o.current.select()},50),r();const e=document.getElementById("auth-phone-number-form");e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},i=void 0!==c?c:t&&t.name||"";return P.a.createElement("div",{className:Object(K.a)("input-group",t&&"touched")},P.a.createElement("input",{ref:o,className:Object(K.a)("form-control",d&&"focus"),type:"text",id:e,value:i,autoComplete:"off",onClick:a,onFocus:a,onInput:l,onKeyDown:b}),P.a.createElement("label",null,u("Login.SelectCountry.Title")),n?P.a.createElement(fe.a,{color:"black"}):P.a.createElement("i",{onClick:a,className:Object(K.a)("css-icon-down",d&&"open")}))}},a.map(e=>P.a.createElement(se.a,{key:e.id,className:t&&e.id===t.id?"selected":"",onClick:f},P.a.createElement("span",{"data-country-id":e.id}),P.a.createElement("span",{className:"country-flag"},Object(ae.a)(e.flag,["hq_emoji"])),P.a.createElement("span",{className:"country-name"},e.name),P.a.createElement("span",{className:"country-code"},e.code))),!a.length&&P.a.createElement(se.a,{key:"no-results",className:"no-results",disabled:!0},P.a.createElement("span",null,u("lng_country_none"))))});let he=!1;var me=Object(P.h)(Object(o.h)(e=>{const{settings:{byKey:{language:t}}}=e;return{...Object(m.l)(e,["connectionState","authState","authPhoneNumber","authIsLoading","authIsLoadingQrCode","authError","authRememberMe","authNearestCountry"]),language:t}},(e,t)=>Object(m.l)(t,["setAuthPhoneNumber","setAuthRememberMe","clearAuthError","loadNearestCountry","goToAuthQrCode","setSettingOption"]))(({connectionState:e,authState:t,authPhoneNumber:n,authIsLoading:r,authIsLoadingQrCode:u,authError:o,authRememberMe:d,authNearestCountry:a,language:i,setAuthPhoneNumber:s,setAuthRememberMe:f,loadNearestCountry:l,clearAuthError:b,goToAuthQrCode:h,setSettingOption:m})=>{const p=Object(ee.a)(),g=Object(P.q)(null),y=ne(),v=te(y,"ContinueOnThisLanguage"),[O,j]=Object(P.r)(),[w,I]=Object(P.r)(),[C,E]=Object(P.r)(!1),[S,M]=Object(P.r)(),[A,k,T]=Object(B.a)(),N=O?`${O.code} ${w||""}`:w,D=N&&N.replace(/[^\d]+/g,"").length>=7;Object(P.n)(()=>{c.n||g.current.focus()},[O]),Object(P.n)(()=>{"connectionStateReady"!==e||a||l()},[e,a,l]),Object(P.n)(()=>{!a||O||C||j(Object(Z.d)(a))},[O,a,C]);const L=Object(P.m)(e=>{e.length||I("");const t=Object(Z.e)(e),n=!O||t&&t.id!==O.id||!t&&e.length?t:O;(!O||!n||n&&n.code!==O.code)&&j(n),I(Object(Z.b)(e,n))},[O]),x=Object(P.m)(()=>{k(),Object(X.d)(y,()=>{T(),m({language:y})})},[k,m,y,T]);Object(P.n)(()=>{void 0===w&&n&&L(n)},[n,w,L]),Object(P.o)(()=>{g.current&&S&&g.current.setSelectionRange(...S)},[S]);const F=Object(P.q)(!1),R=Object(P.m)(()=>{F.current=!0,requestAnimationFrame(()=>{F.current=!1})},[]),U=Object(P.m)(e=>{o&&b(),he||(he=!0,W(),Object($.g)(q));const{value:t,selectionStart:n,selectionEnd:r}=e.target;M(n&&r&&r1&&!F.current;L(u?`${O.code} ${t}`:t)},[o,b,O,N,L]),_=Object(P.m)(e=>{f(e.target.checked)},[f]);const G="authorizationStateWaitPhoneNumber"===t;return P.a.createElement("div",{id:"auth-phone-number-form",className:"custom-scroll"},P.a.createElement("div",{className:"auth-form"},P.a.createElement("div",{id:"logo"}),P.a.createElement("h2",null,"Telegram"),P.a.createElement("p",{className:"note"},p("StartText")),P.a.createElement("form",{action:"",onSubmit:function(e){e.preventDefault(),r||D&&s({phoneNumber:N})}},P.a.createElement(be,{id:"sign-in-phone-code",value:O,isLoading:!a&&!O,onChange:j}),P.a.createElement(oe.a,{ref:g,id:"sign-in-phone-number",label:p("Login.PhonePlaceholder"),value:N,error:o&&p(o),inputMode:"tel",onChange:U,onPaste:c.j?R:void 0}),P.a.createElement(ue.a,{id:"sign-in-keep-session",label:"Keep me signed in",checked:Boolean(d),onChange:_}),D&&(G?P.a.createElement(re.a,{type:"submit",ripple:!0,isLoading:r},p("Login.Next")):P.a.createElement(ce.a,null)),G&&P.a.createElement(re.a,{isText:!0,ripple:!0,isLoading:u,onClick:h},p("Login.QR.Login")),y&&y!==i&&v&&P.a.createElement(re.a,{isText:!0,isLoading:A,onClick:x},v))))})),pe=n(24);var ge=Object(P.h)(()=>{const e=Object(pe.a)(z.a.Auth,"AuthCode");return e?P.a.createElement(e,null):P.a.createElement(ce.a,null)});var ye=Object(P.h)(()=>{const e=Object(pe.a)(z.a.Auth,"AuthPassword");return e?P.a.createElement(e,null):P.a.createElement(ce.a,null)});var ve=Object(P.h)(()=>{const e=Object(pe.a)(z.a.Auth,"AuthRegister");return e?P.a.createElement(e,null):P.a.createElement(ce.a,null)});let Oe=null;class je{}je.render=function(e,t){Oe(e,t)},self.QrCreator=je,function(e){function t(t,n,r,u){var o={},c=e(r,n);c.u(t),c.J(),u=u||0;var d=c.h(),a=c.h()+2*u;return o.text=t,o.level=n,o.version=r,o.O=a,o.a=function(e,t){return t-=u,!(0>(e-=u)||e>=d||0>t||t>=d)&&c.a(e,t)},o}function n(e,t,n,r,u,o,c,d,a,i){function s(t,n,r,u,c,d,a){t?(e.lineTo(n+d,r+a),e.arcTo(n,r,u,c,o)):e.lineTo(n,r)}c?e.moveTo(t+o,n):e.moveTo(t,n),s(d,r,n,r,u,-o,0),s(a,r,u,t,u,0,-o),s(i,t,u,t,n,o,0),s(c,t,n,r,n,0,o)}function r(e,t,n,r,u,o,c,d,a,i){function s(t,n,r,u){e.moveTo(t+r,n),e.lineTo(t,n),e.lineTo(t,n+u),e.arcTo(t,n,t+r,n,o)}c&&s(t,n,o,o),d&&s(r,n,-o,o),a&&s(r,u,-o,-o),i&&s(t,u,o,-o)}function u(e,u){e:{var o=u.text,c=u.v,d=u.N,a=u.K,i=u.P;for(d=Math.max(1,d||1),a=Math.min(40,a||40);d<=a;d+=1)try{var s=t(o,c,d,i);break e}catch(e){}s=void 0}if(!s)return null;for(o=e.getContext("2d"),u.background&&(o.fillStyle=u.background,o.fillRect(u.left,u.top,u.size,u.size)),c=s.O,a=u.size/c,o.beginPath(),i=0;iMath.round(e*t.size)),"linear-gradient"===r)var o=e.createLinearGradient.apply(e,n);else{if("radial-gradient"!==r)throw Error("Unsupported fill");o=e.createRadialGradient.apply(e,n)}u.forEach(([e,t])=>{o.addColorStop(e,t)}),e.fillStyle=o}}(o,u),o.fill(),e}var o={minVersion:1,maxVersion:40,ecLevel:"L",left:0,top:0,size:200,fill:"#000",background:null,text:"no text",radius:.5,quiet:0};Oe=function(e,t){var n={};Object.assign(n,o,e),n.N=n.minVersion,n.K=n.maxVersion,n.v=n.ecLevel,n.left=n.left,n.top=n.top,n.size=n.size,n.fill=n.fill,n.background=n.background,n.text=n.text,n.R=n.radius,n.P=n.quiet,t instanceof HTMLCanvasElement?(t.width===n.size&&t.height===n.size||(t.width=n.size,t.height=n.size),t.getContext("2d").clearRect(0,0,t.width,t.height),u(t,n)):((e=document.createElement("canvas")).width=n.size,e.height=n.size,n=u(e,n),t.appendChild(n))}}(function(){function e(u,c){function d(e,t){for(var n=-1;7>=n;n+=1)if(!(-1>=e+n||f<=e+n))for(var r=-1;7>=r;r+=1)-1>=t+r||f<=t+r||(s[e+n][t+r]=0<=n&&6>=n&&(0==r||6==r)||0<=r&&6>=r&&(0==n||6==n)||2<=n&&4>=n&&2<=r&&4>=r)}function a(e,n){for(var c=f=4*u+17,a=Array(c),h=0;h=g;g+=1)for(var y=-2;2>=y;y+=1)s[m+g][p+y]=-2==g||2==g||-2==y||2==y||0==g&&0==y}for(c=8;ca;a+=1)h=!e&&1==(c>>a&1),s[6>a?a:8>a?a+1:f-15+a][8]=h,s[8][8>a?f-a-1:9>a?15-a:14-a]=h;if(s[f-8][8]=!e,7<=u){for(c=r.A(u),a=0;18>a;a+=1)h=!e&&1==(c>>a&1),s[Math.floor(a/3)][a%3+f-8-3]=h;for(a=0;18>a;a+=1)h=!e&&1==(c>>a&1),s[a%3+f-8-3][Math.floor(a/3)]=h}if(null==l){for(e=o.I(u,i),c=function(){var e=[],t=0,n={B:function(){return e},c:function(t){return 1==(e[Math.floor(t/8)]>>>7-t%8&1)},put:function(e,t){for(var r=0;r>>t-r-1&1))},f:function(){return t},m:function(n){var r=Math.floor(t/8);e.length<=r&&e.push(0),n&&(e[r]|=128>>>t%8),t+=1}};return n}(),a=0;a8*h)throw Error("code length overflow. ("+c.f()+">"+8*h+")");for(c.f()+4<=8*h&&c.put(0,4);0!=c.f()%8;)c.m(!1);for(;!(c.f()>=8*h)&&(c.put(236,8),!(c.f()>=8*h));)c.put(17,8);var v=0;for(h=a=0,m=Array(e.length),p=Array(e.length),g=0;gg;g+=1)null==s[a][p-g]&&(y=!1,m>>h&1)),n(a,p-g)&&(y=!y),s[a][p-g]=y,-1==--h&&(m+=1,h=7));if(0>(a+=c)||f<=a){a-=c,c=-c;break}}}var i=n[c],s=null,f=0,l=null,b=[],h={u:function(t){t=function(t){var n=e.s(t);return{S:function(){return 4},b:function(){return n.length},write:function(e){for(var t=0;te||f<=e||0>t||f<=t)throw Error(e+","+t);return s[e][t]},h:function(){return f},J:function(){for(var e=0,t=0,n=0;8>n;n+=1){a(!0,n);var u=r.D(h);(0==n||e>u)&&(e=u,t=n)}a(!1,t)}};return h}function t(e,n){if(void 0===e.length)throw Error(e.length+"/"+n);var r=function(){for(var t=0;to.b()-e.b())return o;for(var n=u.g(o.c(0))-u.g(e.c(0)),r=Array(o.b()),c=0;cr?t.push(r):2048>r?t.push(192|r>>6,128|63&r):55296>r||57344<=r?t.push(224|r>>12,128|r>>6&63,128|63&r):(n++,r=65536+((1023&r)<<10|1023&e.charCodeAt(n)),t.push(240|r>>18,128|r>>12&63,128|r>>6&63,128|63&r))}return t};var n={L:1,M:0,Q:3,H:2},r=function(){function e(e){for(var t=0;0!=e;)t+=1,e>>>=1;return t}var n=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]];return{w:function(t){for(var n=t<<10;0<=e(n)-e(1335);)n^=1335<t||40t?8:16},D:function(e){for(var t=e.h(),n=0,r=0;r=d;d+=1)if(!(0>r+d||t<=r+d))for(var a=-1;1>=a;a+=1)0>u+a||t<=u+a||(0!=d||0!=a)&&c==e.a(r+d,u+a)&&(o+=1);5n;n+=1)e[n]=1<n;n+=1)e[n]=e[n-4]^e[n-5]^e[n-6]^e[n-8];for(n=0;255>n;n+=1)t[e[n]]=n;return{g:function(e){if(1>e)throw Error("glog("+e+")");return t[e]},i:function(t){for(;0>t;)t+=255;for(;256<=t;)t-=255;return e[t]}}}(),o=function(){function e(e,r){switch(r){case n.L:return t[4*(e-1)];case n.M:return t[4*(e-1)+1];case n.Q:return t[4*(e-1)+2];case n.H:return t[4*(e-1)+3]}}var t=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];return{I:function(t,n){var r=e(t,n);if(void 0===r)throw Error("bad rs block @ typeNumber:"+t+"/errorCorrectLevel:"+n);t=r.length/3,n=[];for(var u=0;u{const{connectionState:t,authState:n,authQrCode:r,settings:{byKey:{language:u}}}=e;return{connectionState:t,authState:n,authQrCode:r,language:u}},(e,t)=>Object(m.l)(t,["returnToAuthPhoneNumber","setSettingOption"]))(({connectionState:e,authState:t,authQrCode:n,language:r,returnToAuthPhoneNumber:u,setSettingOption:o})=>{const c=ne(),d=Object(ee.a)(),a=Object(P.q)(null),i=te(c,"ContinueOnThisLanguage"),[s,f,l]=Object(B.a)();Object(P.n)(()=>{if(!n||"connectionStateReady"!==e)return;const t=a.current;t.innerHTML="",t.classList.remove("pre-animate"),we.render({text:"tg://login?token="+n.token,radius:.5,ecLevel:"M",fill:"#4E96D4",size:280},t)},[e,n]);const b=Object(P.m)(()=>{f(),Object(X.d)(c,()=>{l(),o({language:c})})},[f,o,c,l]),h="authorizationStateWaitQrCode"===t;return P.a.createElement("div",{id:"auth-qr-form",className:"custom-scroll"},P.a.createElement("div",{className:"auth-form qr"},n?P.a.createElement("div",{key:"qr-container",className:"qr-container pre-animate",ref:a}):P.a.createElement("div",{key:"qr-loading",className:"qr-loading"},P.a.createElement(ce.a,null)),P.a.createElement("h3",null,d("Login.QR.Title")),P.a.createElement("ol",null,P.a.createElement("li",null,P.a.createElement("span",null,d("Login.QR.Help1"))),P.a.createElement("li",null,P.a.createElement("span",null,Object(ae.a)(d("Login.QR.Help2"),["simple_markdown"]))),P.a.createElement("li",null,P.a.createElement("span",null,d("Login.QR.Help3")))),h&&P.a.createElement(re.a,{isText:!0,onClick:u},d("Login.QR.Cancel")),c&&c!==r&&i&&P.a.createElement(re.a,{isText:!0,isLoading:s,onClick:b},i)))}));n(101);var Ce=Object(P.h)(Object(o.h)(e=>Object(m.l)(e,["authState"]),(e,t)=>Object(m.l)(t,["reset","initApi","returnToAuthPhoneNumber","goToAuthQrCode"]))(({authState:e,reset:t,initApi:n,returnToAuthPhoneNumber:r,goToAuthQrCode:u})=>{Object(P.n)(()=>{t(),n()},[t,n]);const o="iOS"===c.r||"Android"===c.r;switch(Object(R.a)(!o&&"authorizationStateWaitPhoneNumber"===e||o&&"authorizationStateWaitQrCode"===e,()=>{o?r():u()}),e){case"authorizationStateWaitCode":return P.a.createElement(Y,{page:"authCode",key:"authCode"},P.a.createElement(ge,null));case"authorizationStateWaitPassword":return P.a.createElement(Y,{page:"authPassword",key:"authPassword"},P.a.createElement(ye,null));case"authorizationStateWaitRegistration":return P.a.createElement(ve,null);case"authorizationStateWaitPhoneNumber":return P.a.createElement(Y,{page:"authPhoneNumber",key:"authPhoneNumber"},P.a.createElement(me,null));case"authorizationStateWaitQrCode":return P.a.createElement(Y,{page:"authQrCode",key:"authQrCode"},P.a.createElement(Ie,null));default:return o?P.a.createElement(Y,{page:"authPhoneNumber",key:"authPhoneNumber"},P.a.createElement(me,null)):P.a.createElement(Y,{page:"authQrCode",key:"authQrCode"},P.a.createElement(Ie,null))}}));var Ee=Object(P.h)(()=>{const e=Object(pe.a)(z.a.Main,"Main");return e?P.a.createElement(e,null):void 0}),Se=n.p+"app-inactive.bc7953c2dfebcabce2c43ca7dc778a89.png";n(102);var Me=()=>P.a.createElement("div",{id:"AppInactive"},P.a.createElement("div",{className:"content"},P.a.createElement("img",{src:Se,alt:""}),P.a.createElement("h3",{className:"title"},"Such error, many tabs"),P.a.createElement("div",{className:"description"},"Telegram supports only one active tab with the app.",P.a.createElement("br",null),"Please reload this page to continue using this tab or close it."),P.a.createElement("div",{className:"actions"},P.a.createElement(re.a,{isText:!0,ripple:!0,onClick:()=>{window.location.reload()}},"Reload app"))));function Ae(){return o.c.createElement(Y,{page:"main",key:"main"},o.c.createElement(Ee,null))}var ke=Object(o.h)(e=>Object(m.l)(e,["authState"]),(e,t)=>Object(m.l)(t,["disconnect"]))(({authState:e,disconnect:t})=>{const[n,r]=Object(B.a)(!1);if(Object(P.n)(()=>{Object(D.b)(),x=()=>{t(),document.title=`${u.pb}${u.L}`,r()}},[t,r]),n)return o.c.createElement(Me,null);if(e)switch(e){case"authorizationStateWaitPhoneNumber":case"authorizationStateWaitCode":case"authorizationStateWaitPassword":case"authorizationStateWaitRegistration":case"authorizationStateWaitQrCode":return o.c.createElement(Ce,null);case"authorizationStateClosed":case"authorizationStateClosing":case"authorizationStateLoggingOut":case"authorizationStateReady":return Ae()}return Object(g.c)(!0)?Ae():o.c.createElement(Ce,null)});n(103);u.r&&console.log(">>> INIT"),Object(o.d)().init(),u.r&&console.log(">>> START INITIAL RENDER"),s.a.render(o.c.createElement(ke,null),document.getElementById("root")),u.r&&console.log(">>> FINISH INITIAL RENDER"),document.addEventListener("dblclick",()=>{console.log("GLOBAL STATE",Object(o.e)())})}]); -//# sourceMappingURL=main.27f9887240a2d5c046ba.js.map \ No newline at end of file diff --git a/dist/main.27f9887240a2d5c046ba.js.map b/dist/main.27f9887240a2d5c046ba.js.map deleted file mode 100644 index 9668378b1..000000000 --- a/dist/main.27f9887240a2d5c046ba.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/teact/teact.ts","webpack:///./src/lib/teact/teactn.tsx","webpack:///./src/config.ts","webpack:///./src/util/iteratees.ts","webpack:///./src/modules/helpers/messages.ts","webpack:///./src/modules/helpers/messageMedia.ts","webpack:///./src/modules/helpers/localSearch.ts","webpack:///./src/api/gramjs/worker/provider.ts","webpack:///./src/util/environmentWebp.ts","webpack:///./src/util/environmentSystemTheme.ts","webpack:///./src/util/environment.ts","webpack:///./src/modules/selectors/users.ts","webpack:///./src/modules/selectors/settings.ts","webpack:///./src/modules/selectors/chats.ts","webpack:///./src/modules/selectors/symbols.ts","webpack:///./src/modules/selectors/messages.ts","webpack:///./src/modules/selectors/localSearch.ts","webpack:///./src/modules/selectors/management.ts","webpack:///./src/modules/selectors/ui.ts","webpack:///./src/modules/selectors/globalSearch.ts","webpack:///./src/modules/selectors/payments.ts","webpack:///./src/api/types/index.ts","webpack:///./src/util/buildClassName.ts","webpack:///./src/util/schedulers.ts","webpack:///./src/modules/reducers/chats.ts","webpack:///./src/modules/reducers/messages.ts","webpack:///./src/modules/reducers/symbols.ts","webpack:///./src/modules/reducers/users.ts","webpack:///./src/modules/reducers/globalSearch.ts","webpack:///./src/modules/reducers/localSearch.ts","webpack:///./src/modules/reducers/management.ts","webpack:///./src/modules/reducers/settings.ts","webpack:///./src/modules/reducers/twoFaSettings.ts","webpack:///./src/modules/reducers/payments.ts","webpack:///./src/util/cacheApi.ts","webpack:///./src/types/index.ts","webpack:///./src/util/langProvider.ts","webpack:///./src/util/callbacks.ts","webpack:///./src/util/moduleLoader.ts","webpack:///./src/hooks/useLang.ts","webpack:///./src/util/files.ts","webpack:///./node_modules/idb-keyval/dist/esm/index.js","webpack:///./src/util/sessions.ts","webpack:///./src/lib/twemojiRegex.js","webpack:///./src/components/ui/Loading.tsx","webpack:///./src/components/ui/Button.tsx","webpack:///./src/components/common/helpers/renderText.tsx","webpack:///./src/util/countries.ts","webpack:///./src/util/phoneNumber.ts","webpack:///./src/hooks/useModuleLoader.ts","webpack:///./src/hooks/useFlag.ts","webpack:///./src/components/ui/Spinner.tsx","webpack:///./src/util/handleError.ts","webpack:///./src/util/arePropsShallowEqual.ts","webpack:///./src/hooks/usePrevious.ts","webpack:///./src/util/dateFormat.ts","webpack:///./src/hooks/useForceUpdate.ts","webpack:///./src/components/ui/Link.tsx","webpack:///./src/util/generateIdFor.ts","webpack:///./src/util/notifications.ts","webpack:///./src/modules/helpers/users.ts","webpack:///./src/modules/helpers/chats.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/lib/teact/dom-events.ts","webpack:///./src/hooks/useHistoryBack.ts","webpack:///./src/hooks/useShowTransition.ts","webpack:///./src/util/trimText.ts","webpack:///./src/components/ui/MenuItem.tsx","webpack:///./src/components/ui/RippleEffect.tsx","webpack:///./src/util/switchTheme.ts","webpack:///./src/util/webpToPng.ts","webpack:///./src/components/ui/InputText.tsx","webpack:///./src/components/ui/Checkbox.tsx","webpack:///./src/util/captureEscKeyListener.ts","webpack:///./src/util/textFormat.ts","webpack:///./src/util/memo.ts","webpack:///./src/hooks/useOnChange.ts","webpack:///./src/util/searchWords.ts","webpack:///./src/util/windowSize.ts","webpack:///./src/components/ui/Menu.tsx","webpack:///./src/util/captureKeyboardListeners.ts","webpack:///./src/util/oggToWav.ts","webpack:///./src/util/mediaLoader.ts","webpack:///./src/hooks/useEffectWithPrevDeps.ts","webpack:///./src/lib/punycode.js","webpack:///./src/components/common/SafeLink.tsx","webpack:///./src/components/common/helpers/documentInfo.ts","webpack:///./src/modules/helpers/payments.ts","webpack:///./src/util/animation.ts","webpack:///./src/components/ui/DropdownMenu.tsx","webpack:///./src/hooks/useKeyboardListNavigation.ts","webpack:///./src/components/common/helpers/parseEmojiOnlyString.ts","webpack:///./src/util/emoji.ts","webpack:///./src/lib/teact/teact-dom.ts","webpack:///./src/components/common/UserLink.tsx","webpack:///./src/components/common/MessageLink.tsx","webpack:///./src/components/common/ChatLink.tsx","webpack:///./src/components/common/helpers/renderActionMessageText.tsx","webpack:///./src/api/types/messages.ts","webpack:///./src/api/types/media.ts","webpack:///./src/components/middle/message/MentionLink.tsx","webpack:///./src/util/appBadge.ts","webpack:///./src/hooks/useVirtualBackdrop.ts","webpack:///./src/api/gramjs/worker/worker.ts","webpack:///./node_modules/opus-recorder/dist/decoderWorker.min.js","webpack:///./node_modules/opus-recorder/dist/waveWorker.min.js","webpack:///./src/lib/webp/webp_wasm.worker.js","webpack:///./src/modules/actions/ui/initial.ts","webpack:///./src/modules/actions/ui/settings.ts","webpack:///./src/modules/actions/api/initial.ts","webpack:///./src/modules/actions/api/settings.ts","webpack:///./src/modules/actions/apiUpdaters/initial.ts","webpack:///./src/serviceWorker.ts","webpack:///./src/util/setupServiceWorker.ts","webpack:///./src/global/initial.ts","webpack:///./src/global/cache.ts","webpack:///./src/global/index.ts","webpack:///./src/util/activeTabMonitor.ts","webpack:///./src/util/fonts.ts","webpack:///./src/assets/telegram-logo.svg","webpack:///./src/assets/monkey.svg","webpack:///./src/components/common/UiLoader.tsx","webpack:///./src/hooks/useLangString.ts","webpack:///./src/components/auth/helpers/getSuggestedLanguage.ts","webpack:///./src/components/auth/CountryCodeInput.tsx","webpack:///./src/components/auth/AuthPhoneNumber.tsx","webpack:///./src/components/auth/AuthCode.async.tsx","webpack:///./src/components/auth/AuthPassword.async.tsx","webpack:///./src/components/auth/AuthRegister.async.tsx","webpack:///./node_modules/qr-creator/dist/qr-creator.es6.min.js","webpack:///./src/components/auth/AuthQrCode.tsx","webpack:///./src/components/auth/Auth.tsx","webpack:///./src/components/main/Main.async.tsx","webpack:///./src/assets/app-inactive.png","webpack:///./src/components/main/AppInactive.tsx","webpack:///./src/App.tsx","webpack:///./src/index.tsx"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","installedCssChunks","2","__webpack_require__","exports","module","l","e","promises","Promise","resolve","reject","href","fullhref","p","existingLinkTags","document","getElementsByTagName","dataHref","tag","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","jsonpScriptSrc","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","head","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","s","VirtualElementTypesEnum","Fragment","renderingInstance","isEmptyElement","$element","Empty","isTextElement","Text","isTagElement","Tag","isComponentElement","Component","isRealElement","source","props","children","flatten","parsedChildren","componentInstance","isMounted","hooks","state","cursor","byCursor","effects","memos","buildComponentElement","createComponentInstance","dropEmptyTail","map","buildChildElement","buildTagElement","isEmptyPlaceholder","child","String","DEBUG_components","renderComponent","newRenderedValue","DEBUG_startAt","DEBUG","componentName","renderCount","renderTimes","DEBUG_MORE","log","performance","now","renderTime","warn","Math","round","handleError","renderedValue","newChild","hasElementChanged","$old","$new","unmountTree","forEach","hook","current","cleanup","effect","dependencies","nextValue","setter","forceUpdate","onUpdate","helpGc","unmountComponent","removeAllDelegatedListeners","mountComponent","forceUpdateComponent","currentElement","getTarget","setTarget","useState","initial","newValue","prepareForFrame","throttleWithPrimaryRaf","prepareComponentForFrame","throttleWithRaf","DEBUG_contentComponentName","useLayoutEffectBase","schedulerFn","debugKey","exec","some","dependency","causedBy","reduce","res","prevValue","join","useEffect","fastRaf","useLayoutEffect","onTickEnd","useMemo","resolver","getUnequalProps","useCallback","newCallback","useRef","memo","areEqual","arePropsShallowEqual","propsRef","renderedRef","addEventListener","orderBy","values","React","currentGlobal","reducers","callbacks","container","containers","mapStateToProps","mapReducersToProps","ownProps","mappedProps","newMappedProps","setGlobal","actions","Number","isNaN","DEBUG_componentName","keys","areMappedPropsChanged","DEBUG_updates","updateTime","Map","runCallbacks","cb","runCallbacksThrottled","newGlobal","noThrottle","getGlobal","getDispatch","addReducer","reducer","payload","onDispatch","addCallback","removeCallback","index","indexOf","splice","withGlobal","TeactNContainer","id","generateIdFor","useForceUpdate","delete","set","Array","from","PAGE_TITLE","INACTIVE_MARKER","APP_NAME","process","APP_VERSION","IS_TEST","DEBUG_ALERT_MSG","SESSION_USER_KEY","LEGACY_SESSION_KEY","GLOBAL_STATE_CACHE_DISABLED","GLOBAL_STATE_CACHE_KEY","GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT","GLOBAL_STATE_CACHE_USER_LIST_LIMIT","MEDIA_CACHE_DISABLED","MEDIA_CACHE_NAME","MEDIA_CACHE_NAME_AVATARS","MEDIA_PROGRESSIVE_CACHE_NAME","CUSTOM_BG_CACHE_NAME","LANG_CACHE_NAME","isBigScreen","innerHeight","MIN_PASSWORD_LENGTH","MESSAGE_LIST_SENSITIVE_AREA","MESSAGE_LIST_SLICE","MESSAGE_LIST_VIEWPORT_LIMIT","CHAT_HEIGHT_PX","CHAT_LIST_SLICE","CHAT_LIST_LOAD_SLICE","SHARED_MEDIA_SLICE","MESSAGE_SEARCH_SLICE","GLOBAL_SEARCH_SLICE","MEMBERS_SLICE","MEMBERS_LOAD_SLICE","PROFILE_SENSITIVE_AREA","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","ALL_CHATS_PRELOAD_DISABLED","ANIMATION_LEVEL_MIN","ANIMATION_LEVEL_MAX","ANIMATION_LEVEL_DEFAULT","DEFAULT_MESSAGE_TEXT_SIZE_PX","IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX","MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX","DRAFT_DEBOUNCE","EDITABLE_INPUT_ID","EDITABLE_INPUT_MODAL_ID","SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","SAFE_SCREEN_WIDTH_FOR_CHAT_INFO","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","MOBILE_SCREEN_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT","LOCAL_MESSAGE_ID_BASE","ANIMATION_END_DELAY","FAST_SMOOTH_MAX_DISTANCE","FAST_SMOOTH_MIN_DURATION","FAST_SMOOTH_MAX_DURATION","FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE","STICKER_SIZE_INLINE_DESKTOP_FACTOR","Set","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_AUTH","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_PICKER","STICKER_SIZE_GENERAL_SETTINGS","STICKER_SIZE_PICKER_HEADER","STICKER_SIZE_SEARCH","STICKER_SIZE_MODAL","STICKER_SIZE_TWO_FA","STICKER_SIZE_DISCUSSION_GROUPS","STICKER_SIZE_FOLDER_SETTINGS","STICKER_SIZE_INLINE_BOT_RESULT","MEMOJI_STICKER_ID","BASE_EMOJI_KEYWORD_LANG","MENU_TRANSITION_DURATION","SLIDE_TRANSITION_DURATION","CONTENT_TYPES_FOR_QUICK_UPLOAD","RE_LINK_TEMPLATE","RE_MENTION_TEMPLATE","RE_TME_LINK","RE_TME_INVITE_LINK","SERVICE_NOTIFICATIONS_USER_ID","ALL_FOLDER_ID","ARCHIVED_FOLDER_ID","MAX_MEDIA_FILES_FOR_ALBUM","MAX_ACTIVE_PINNED_CHATS","SCHEDULED_WHEN_ONLINE","DEFAULT_LANG_CODE","DEFAULT_LANG_PACK","LANG_PACKS","TIPS_USERNAME","LOCALIZED_TIPS","FEEDBACK_URL","LIGHT_THEME_BG_COLOR","DARK_THEME_BG_COLOR","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","buildCollectionByKey","collection","byKey","member","mapValues","callback","newByKey","pick","result","pickTruthy","omit","stringKeys","filter","has","orderKey","sort","a","b","isArray","mode1","mode2","orderKey1","orderKey2","aValue1","bValue1","aValue2","bValue2","aValue","bValue","array","concat","unique","compact","Boolean","areSortedArraysEqual","array1","array2","every","item","areSortedArraysIntersecting","findIntersectionWithSet","split","chunkSize","cloneDeep","acc","findLast","predicate","RE_LINK","RegExp","getMessageKey","chatId","parseMessageKey","match","messageId","getMessageOriginalId","previousLocalId","getMessageSummaryText","lang","noEmoji","text","photo","video","audio","voice","sticker","contact","poll","invoice","content","truncatedText","substr","groupedId","isGif","emoji","trim","getMessageAudioCaption","fileName","summary","question","getMessageText","webPage","getMessageCustomShape","isRound","parseEmojiOnlyString","getMessageSingleEmoji","getFirstLinkInMessage","entities","link","find","entity","ApiMessageEntityTypes","TextUrl","url","Url","offset","substring","domain","isOwnMessage","isOutgoing","isReplyMessage","replyToMessageId","isForwardedMessage","forwardInfo","isActionMessage","action","isServiceNotificationMessage","isMessageLocal","isAnonymousOwnMessage","senderId","getSenderTitle","sender","getUserFullName","getChatTitle","getSendingState","sendingState","isHistoryClearMessage","title","performer","getMessageContent","hasMessageMedia","getMessagePhoto","getMessageVideo","getMessageDocument","getMessageSticker","getMessageContact","getMessagePoll","getMessageAction","getMessageAudio","getMessageVoice","getMessageRoundVideo","isMessageDocumentPhoto","mediaType","isMessageDocumentVideo","getMessageInvoice","getMessageWebPage","getMessageWebPagePhoto","getMessageWebPageVideo","getMessageMediaThumbDataUri","thumbnail","media","getMessageMediaThumbnail","dataUri","getMessageMediaHash","webPagePhoto","webPageVideo","messageVideo","messagePhoto","base","hasMessageLocalBlobUrl","getVideoOrAudioBaseHash","getDocumentHasPreview","IS_PROGRESSIVE_SUPPORTED","IS_SAFARI","size","mimeType","getMessageMediaFormat","fullVideo","isAnimated","ApiMediaFormat","Lottie","Progressive","IS_OPUS_SUPPORTED","BlobUrl","getMessageFileName","date","getMessageFileSize","blobUrl","previewBlobUrl","getChatMediaMessageIds","messages","listedIds","isFromSharedMedia","ids","getMessageContentIds","reverse","getPhotoFullDimensions","sizes","getPhotoInlineDimensions","getVideoDimensions","width","height","getMediaTransferState","progress","isDownloadNeeded","isUploading","isTransferring","transferProgress","messageIds","contentType","validator","matchLinkInMessageText","getMediaDuration","duration","buildChatThreadKey","threadId","worker","requestStates","requestStatesByCallback","initApi","initialArgs","Worker","update","requestState","response","callbackArgs","subscribeToWorker","makeRequest","args","callApi","fnName","cancelApiProgress","progressCallback","isCanceled","postMessage","assign","pop","catch","finally","isWebpSupportedCache","isWebpSupported","webp","Image","handleLoadOrError","hasWebp","systemThemeCache","matchMedia","matches","getSystemTheme","handleSystemThemeChange","mql","addListener","PLATFORM_ENV","userAgent","platform","navigator","os","test","getPlatform","IS_MAC_OS","IS_IOS","IS_ANDROID","IS_PWA","standalone","referrer","includes","IS_TOUCH_ENV","IS_SINGLE_COLUMN_LAYOUT","innerWidth","IS_TABLET_COLUMN_LAYOUT","IS_VOICE_RECORDING_SUPPORTED","mediaDevices","AudioContext","webkitAudioContext","IS_EMOJI_SUPPORTED","documentElement","style","IS_SERVICE_WORKER_SUPPORTED","Audio","canPlayType","IS_CANVAS_FILTER_SUPPORTED","getContext","LAYERS_ANIMATION_NAME","DPR","devicePixelRatio","MASK_IMAGE_DISABLED","selectUser","global","userId","users","byId","selectIsUserBlocked","user","fullInfo","isBlocked","selectNotifySettings","settings","selectNotifyExceptions","notifyExceptions","selectChat","chats","selectChatUser","chat","getPrivateChatUserId","selectIsChatWithSelf","currentUserId","selectIsChatWithBot","isUserBot","selectSupportChat","isSupport","selectChatOnlineCount","isChatPrivate","isChatChannel","members","onlineCount","isUserOnline","selectChatBot","selectIsChatBotNotStarted","bot","lastMessage","messageInfo","byChatId","threadsById","MAIN_THREAD_ID","selectAreActiveChatsLoaded","listIds","active","selectIsChatListed","targetList","list","selectChatListType","folderId","selectChatFolder","chatFolders","selectIsChatPinned","archived","orderedPinnedIds","chatFoldersById","pinnedChatIds","selectChatByUsername","username","usernameLowered","toLowerCase","selectCountNotMutedUnread","activeChatIds","unreadCount","selectIsChatMuted","selectCurrentStickerSearch","stickers","search","selectCurrentGifSearch","gifs","selectStickerSet","setsById","selectStickersForEmoji","stickerSets","stickersForEmoji","packs","selectAnimatedEmoji","animatedEmojis","cleanedEmoji","replace","selectCurrentMessageList","messageLists","selectCurrentChat","selectChatMessages","selectScheduledMessages","scheduledMessages","selectThreadParam","thread","selectListedIds","selectOutlyingIds","selectCurrentMessageIds","messageListType","selectViewportIds","selectPinnedIds","selectScheduledIds","selectScrollOffset","selectReplyingToId","selectEditingId","selectEditingScheduledId","selectDraft","selectNoWebPage","selectThreadInfo","selectFirstMessageId","selectReplyStack","selectThreadOriginChat","threadInfo","originChannelId","selectThreadTopMessageId","topMessageId","selectThreadByMessage","replyToTopMessageId","isMessageInCurrentMessageList","currentMessageList","selectIsViewportNewest","viewportIds","lastMessageId","selectChatMessage","chatMessages","selectScheduledMessage","selectEditingMessage","selectChatMessageByPollId","pollId","messageWithPoll","selectFocusedMessageId","focusedChatId","focusedMessage","selectIsMessageFocused","focusedId","selectOutgoingStatus","isScheduledList","lastReadOutboxMessageId","selectIsMessageUnread","selectSender","selectForwardedSender","isChannelPost","fromChatId","senderUserId","selectAllowedMessageActions","serverTimeOffset","isRestricted","isPrivate","isChatWithSelf","isBasicGroup","isChatBasicGroup","isSuperGroup","isChatSuperGroup","isChannel","isServiceNotification","isOwn","isAction","isMessageEditable","getHasAdminRight","Date","viaBotId","canReply","getCanPostInChat","hasPinPermission","isCreator","isUserRightBanned","canPin","canUnpin","pinnedMessageIds","canDelete","canReport","canDeleteForAll","canEdit","canForward","hasSticker","hasFavoriteSticker","favorite","selectIsStickerFavorite","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","noOptions","ability","selectCanDeleteSelectedMessages","selectedMessageIds","selectedMessages","messageActions","selectCanReportSelectedMessages","selectUploadProgress","fileTransfer","fileUploads","byMessageLocalId","selectRealLastReadId","lastReadInboxMessageId","min","Infinity","selectFirstUnreadId","outlyingIds","lastReadId","isNotJoined","found","isFromScheduled","selectIsForwardModalOpen","forwardMessages","isModalShown","selectCommonBoxChatId","fromLastMessage","isCommonBoxChat","selectIsInSelectMode","selectIsMessageSelected","selectForwardedMessageIdsByGroupId","fromMessageId","selectMessageIdsByGroupId","selectIsDocumentGroupSelected","selectedIds","groupIds","selectSelectedMessagesCount","selectNewestMessageWithBotKeyboardButtons","keyboardButtons","replyHideMessageId","shouldHideKeyboardButtons","selectShouldAutoLoadMedia","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","isChatGroup","userOrChat","contactList","userIds","selectIsUserOrChatContact","selectShouldAutoPlayMedia","shouldAutoPlayVideos","shouldAutoPlayGifs","asGif","selectShouldLoopStickers","shouldLoopStickers","selectCurrentTextSearch","chatThreadKey","currentSearch","localTextSearch","byChatThreadKey","isActive","selectCurrentMediaSearchPeerId","localMediaSearch","currentProfileUserId","selectedId","selectCurrentMediaSearch","peerId","selectManagement","management","selectCurrentManagementType","selectIsMediaViewerOpen","mediaViewer","avatarOwnerId","selectRightColumnContentKey","isChatInfoShown","newChatMembersProgress","isAddingChatMembersShown","NewChatMembersProgress","Closed","isPollResults","pollResults","selectIsPollResultsOpen","isSearch","isManagement","currentManagement","selectCurrentManagement","isStickerSearch","query","isGifSearch","currentChatId","areActiveChatsLoaded","isUserInfo","isChatInfo","RightColumnContent","PollResults","Search","Management","StickerSearch","GifSearch","AddingMembers","UserInfo","ChatInfo","selectIsRightColumnShown","selectTheme","theme","shouldUseSystemTheme","selectCurrentGlobalSearchQuery","globalSearch","selectPaymentMessageId","payment","selectPaymentRequestId","formId","selectProviderPublishableKey","nativeParams","publishableKey","selectStripeCredentials","stripeCredentials","parts","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","self","throttle","interval","isPending","_args","setInterval","clearInterval","throttleWith","fastPrimaryRaf","waiting","onIdle","requestIdleCallback","pause","rafPromise","fastRafCallbacks","fastRafPrimaryCallbacks","beforeUnloadCallbacks","isPrimary","requestAnimationFrame","currentCallbacks","currentPrimaryCallbacks","onBeforeUnload","isLast","unshift","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","getUpdatedChat","chatUpdate","shouldOmitMinInfo","isMin","updatedChat","photos","updateChat","updateChats","updatedById","updatedChats","addChats","addedById","isAdded","addedChats","updateChatListType","listType","currentListIds","listTypeKey","currentFolderList","updateChatListSecondaryInfo","info","totalCountKey","totalCount","totalChatCount","isFullyLoaded","updateCurrentMessageList","shouldReplaceHistory","newMessageLists","last","replaceChatMessages","updateMessageStore","replaceThreadParam","paramName","threadUpdate","updateThread","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","newId","updateChatMessage","messageUpdate","updatedMessage","updateScheduledMessage","replaceScheduledMessages","deleteChatMessages","deletedForwardedPosts","isLinkedChannelPost","pinnedIds","newMessageCount","messagesCount","canDeleteCurrentThread","currentThreadId","originalPost","deleteChatScheduledMessages","scheduledIds","updateListedIds","orderHistoryIds","updateOutlyingIds","addViewportId","safeReplaceViewportIds","newViewportIds","updateThreadInfo","newThreadInfo","updateThreadInfos","updates","hash","updateScheduledMessages","updateFocusedMessage","noHighlight","updateFocusDirection","direction","enterMessageSelectMode","toggleMessageSelection","childMessageIds","withShift","oldSelectedMessages","newMessageIds","newSelectedMessageIds","prevIndex","currentIndex","to","max","exitMessageSelectMode","updateStickerSets","category","sets","resultIds","updatedSets","stickerSet","existing","setIds","updateStickerSet","stickerSetId","currentStickerSet","updateGifSearch","isNew","results","nextOffset","currentResults","newResults","currentIds","gif","replaceAnimatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","uniqueIds","forEmoji","rebuildStickersForEmoji","replaceUsers","getUpdatedUser","userUpdate","updatedUser","updateContactList","updatedUsers","contactUserIds","newContactUserIds","isContact","updateUser","updateUsers","addUsers","addedUsers","updateSelectedUserId","deleteUser","MEMO_EMPTY_ARRAY","updateUserSearch","searchStatePartial","userSearch","updateUserSearchFetchingStatus","newState","fetchingStatus","updateUserBlockedState","getComplexKey","updateGlobalSearch","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","foundOrPrevFoundIds","nextOffsetId","replaceLocalTextSearch","searchParams","updateLocalTextSearch","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","updateManagementProgress","updateManagement","replaceSettings","newSettings","replaceThemeSettings","themes","addNotifyExceptions","notifyException","exceptionData","addNotifyException","updateNotifySettings","peerType","isSilent","shouldShowPreviews","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","addBlockedContact","contactId","blocked","removeBlockedContact","updateTwoFaSettings","twoFaSettings","updateShippingOptions","shippingOptions","setRequestInfoId","setPaymentStep","step","setInvoiceMessageInfo","description","photoUrl","invoiceContent","setStripeCardInfo","cardInfo","setPaymentForm","form","setReceipt","receipt","messageInvoice","clearPayment","closeInvoice","isPaymentModalOpen","cacheApi","caches","Type","async","fetch","cacheName","Request","cache","open","Blob","blob","headers","Json","json","save","cacheData","JSON","stringify","Response","put","clear","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","ChatCreationProgress","ProfileEditProgress","ManagementProgress","ProfileState","PaymentStep","UPLOADING_WALLPAPER_SLUG","ManagementScreens","SUBSTITUTION_REGEX","PLURAL_OPTIONS","PLURAL_RULES","en","ar","ca","de","es","fa","fr","it","ko","nl","pl","pt_BR","ru","tr","uk","uz","langPack","fallbackLangPack","createCallbackManager","currentLangCode","getTranslation","format","cacheValue","cached","langString","processTranslation","importFallbackLangPack","getTranslationForLangString","langCode","translateString","remoteLangPack","remote","fetchRemoteString","setLanguage","withFallback","newLangPack","sourceLangPacks","fetchRemote","languages","langInfo","isRtl","rtl","default","template","amount","optionIndex","getPluralOption","translationSlices","initialValue","str","processTemplate","formatInteger","Bundles","LOAD_PROMISES","MEMORY_CACHE","loadModule","bundleName","moduleName","Auth","Main","Extra","handleBundleLoad","bundle","getModuleFromMemory","listeners","addLoadListener","listener","useOnChange","langProvider","File","constructor","fileBits","options","rest","super","this","dataUriToBlob","arr","mime","bstr","atob","u8arr","Uint8Array","charCodeAt","blobToDataUri","reader","FileReader","readAsDataURL","blobToFile","lastModified","preloadImage","img","preloadVideo","volume","onloadedmetadata","createPosterForVideo","race","onseeked","videoWidth","videoHeight","canvas","drawImage","toDataURL","currentTime","fetchBlob","imgToCanvas","promisifyRequest","oncomplete","onsuccess","onabort","defaultGetStoreFunc","defaultGetStore","dbName","storeName","indexedDB","onupgradeneeded","createObjectStore","dbp","txMode","db","transaction","objectStore","createStore","eachCursor","customStore","store","openCursor","continue","DC_IDS","hasStoredSession","withLegacy","localStorage","getItem","userAuthJson","userAuth","parse","dcID","storeSession","sessionData","mainDcId","hashes","setItem","dcId","clearStoredSession","removeItem","loadStoredSession","importLegacySession","sessionId","sessionJson","idb","clearLegacySessions","idbKeys","items","k","startsWith","vs16RegExp","zeroWidthJoiner","fromCharCode","removeVS16s","rawEmoji","color","className","withBackground","Button","ref","onClick","onContextMenu","onMouseDown","onMouseEnter","onMouseLeave","onFocus","pill","fluid","isText","isLoading","ariaLabel","download","disabled","ripple","faded","tabIndex","elementRef","isClicked","setIsClicked","fullClassName","buildClassName","handleClick","handleMouseDown","preventDefault","dir","aria-label","RE_LETTER_OR_DIGIT","SIMPLE_MARKDOWN_REGEX","renderText","part","filters","params","textParts","divEl","innerText","innerHTML","escapeHtml","EMOJI_REGEX","lastIndex","replaceEmojis","addLineBreaks","highlight","lowerCaseText","queryPosition","nextSymbol","newParts","links","nextLink","endsWith","addLinks","replaceSimpleMarkdown","emojis","emojiResult","nativeToUnfified","alt","line","trimmedLine","trimLeft","indentLength","repeat","entityResult","formatsCache","defaultPhoneNumberFormat","parsed","flag","phoneFormat","formatValue","phoneNumberFormat","phoneNumberGroups","count","getPhoneNumberFormat","getCountryById","countryList","getCountryFromPhoneNumber","input","phoneNumber","possibleCountries","country","formatPhoneNumber","_","p1","p2","p3","p4","p5","separator","output","formatPhoneNumberWithCode","numberWithPlus","noLoad","autoUpdate","setValue","Spinner","handleErrorEvent","ErrorEvent","reason","alert","currentProps","newProps","currentKeys","currentKeysLength","prop","usePrevious","next","shouldSkipUndefined","WEEKDAYS_FULL","MONTHS_FULL","MONTHS_FULL_LOWERCASE","month","getDayStart","datetime","setHours","getDayStartAt","getTime","toYearMonth","timestamp","getFullYear","getMonth","toIsoString","getDate","formatTime","getHours","padStart","getMinutes","formatPastTimeShort","today","weekAgo","setDate","getDay","withYear","formatDate","formatFullDate","formatMonthAndYear","isShort","formatHumanDate","noWeekdays","lowerFirst","upperFirst","yesterday","weekAhead","weekDay","day","monthIndex","formatMediaDateTime","formatMediaDuration","hours","floor","minutes","seconds","string","formatVoiceRecordDuration","durationInMs","milliseconds","formatDateToString","locale","toLocaleString","year","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","findIndex","timestampPlusDay","MILISECONDS_IN_DAY","toUpperCase","setTrigger","trigger","Link","random","getDeviceToken","subscription","toJSON","endpoint","checkIfPushSupported","ServiceWorkerRegistration","Notification","permission","requestPermission","unsubscribeFromPush","dispatch","deviceToken","unsubscribe","deleteDeviceToken","serviceWorkerRegistration","serviceWorker","ready","pushManager","getSubscription","areSettingsLoaded","subscribe","subscribedAt","checkIfShouldResubscribe","userVisibleOnly","setDeviceToken","DOMException","ABORT_ERR","showNewMessageNotification","isActiveChat","resultSettings","resultExceptions","loadNotificationSettings","isListed","hasFocus","checkIfShouldNotify","body","messageSender","messageAction","actionTargetMessage","targetUserIds","actionTargetUserIds","targetChatId","actionTargetChatId","actionTargetUsers","privateChatUserId","privateChatUser","actionOrigin","renderActionMessageText","asPlain","senderName","getMessageSenderName","getNotificationContent","controller","icon","badge","toString","vibrate","notification","onclick","close","focusMessage","focus","notifyClientReady","USER_COLOR_KEYS","getUserFirstOrLastName","firstName","lastName","isDeletedUser","getUserStatus","status","wasOnline","wasOnlineDate","diff","sortUserIds","usersById","priorityIds","expires","getUserColorKey","peer","abs","FOREVER_BANNED_DATE","getChatTypeString","isSelf","getChatDescription","about","getChatLink","inviteLink","getChatAvatarHash","owner","avatarHash","isChatSummaryOnly","isChatAdmin","adminRights","currentUserBannedRights","defaultBannedRights","migratedTo","getAllowedAttachmentOptions","isChatWithBot","canAttachMedia","canAttachPolls","canSendStickers","canSendGifs","canAttachEmbedLinks","isAdmin","getMessageSendingRestrictionReason","sendMessages","untilDate","getChatSlowModeOptions","slowMode","getChatOrder","joinDate","draftDate","isChatArchived","notifySettings","isMuted","getCanDeleteChat","prepareFolderListIds","chatsById","folder","chatIdsCache","excludedChatIds","includedChatIds","excludeArchived","excludeMuted","unreadMentionsCount","hasUnreadMark","excludeRead","bots","contacts","nonContacts","groups","channels","filterChatFolder","prepareChatList","folderType","chatFilter","listedChats","listIdsSet","pinnedChats","otherChats","getFolderUnreadDialogs","unreadDialogsCount","total","hasActiveDialogs","getFolderDescriptionText","emoticon","getFolderChatsCount","isChat","chatOrUser","sortChatIds","chatIds","shouldPrioritizeVerified","priority","isVerified","ANIMATION_START_EVENT","ANIMATION_END_EVENT","isAnimating","dispatchHeavyAnimationEvent","dispatchEvent","Event","handleAnimationStart","handleAnimationEnd","removeEventListener","NON_BUBBLEABLE_EVENTS","delegationRegistry","delegatedEventsByElement","documentEventCounters","element","propName","handler","asCapture","eventName","resolveEventName","canUseEventDelegation","handleEvent","resolveDelegationRegistryForName","newSet","resolveDelegatedEventsForElement","add","addDelegatedListener","removeDelegatedListener","tagName","realEventName","eventNames","realEvent","events","furtherCallsPrevented","stopPropagation","Proxy","Reflect","historyState","nextStateIndexToReplace","isHistoryAltered","isDisabled","isEdge","currentIndexes","disableHistoryBack","handleTouchStart","x","touches","pageX","handleTouchEnd","useHistoryBack","onBack","onForward","currentState","shouldReplaceNext","indexRef","isForward","prevIsActive","isClosed","indexHashRef","prevHashes","isHashChangedFromEvent","handleChange","isForceClose","prev","history","pushState","delta","realDelta","indexLast","go","replaceState","back","handlePopState","currIndex","disableHistoryAnimations","hasChanged","forceClose","isOpen","onCloseTransitionEnd","noOpenTransition","noCloseTransition","setIsClosed","closeTimeoutRef","hasOpenClassName","setHasOpenClassName","shouldHaveOpenClassName","isClosing","shouldRender","transitionClassNames","trimText","MenuItem","destructive","useLang","handleKeyDown","keyCode","data-char","location","origin","role","onKeyDown","ripples","setRipples","cleanUpDebounced","button","currentTarget","position","getBoundingClientRect","rippleSize","offsetWidth","clientX","y","clientY","isInitialized","HEX_COLOR_REGEX","lerp","start","end","interpolationRatio","colors","themeColors","hexToRgb","hex","parseInt","g","applyColorAnimationStep","startIndex","endIndex","propertyColors","setProperty","withAnimation","isDarkTheme","shouldAnimate","startAt","themeColorTag","querySelector","classList","remove","animateSingle","transition","EMPTY_IMAGE_DATA_URI","webpToPng","initWebpWorker","wasmReady","requests","getDecodePromise","ImageData","putImageData","toBlob","createPng","webpToPngBase64","pngBlob","WebpWorker","onmessage","handleLibWebpMessage","label","success","readOnly","placeholder","autoComplete","inputMode","maxLength","onChange","onInput","onKeyPress","onBlur","onPaste","labelText","htmlFor","subLabel","checked","blocking","onCheck","captureEscKeyListener","captureKeyboardListener","onEsc","formatFixedNumber","number","toFixed","formatIntegerCompact","views","getFirstLetters","phrase","word","prevDeps","RE_NOT_LETTER","searchWords","haystack","needle","haystackWords","needleWord","haystackWord","IS_LANDSCAPE","isLandscape","initialHeight","windowSize","updateSizes","isRefreshDisabled","handleResize","reload","vh","getIsKeyboardVisible","disableRefresh","enableRefresh","Menu","containerRef","positionX","positionY","autoClose","footer","noCloseOnBackdrop","onCloseAnimationEnd","onClose","shouldSkipTransition","menuRef","backdropContainerRef","useShowTransition","useEffectWithPrevDeps","prevIsOpen","useKeyboardListNavigation","useVirtualBackdrop","bubbleClassName","keyToHandlerName","Enter","Backspace","Delete","Esc","Escape","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Tab","handlers","onEnter","onDelete","onBackspace","onUp","onDown","onLeft","onRight","onTab","captureKeyboardListeners","hasActiveHandlers","handlerName","currentEventHandlers","releaseKeyboardListener","keyHandlers","oggToWav","opusData","arrayBuffer","typedArray","decoderWorker","DecoderWorker","wavWorker","WavWorker","command","buffers","buffer","page","terminate","wavBitDepth","wavSampleRate","decoderSampleRate","outputBufferSampleRate","pages","asCacheApiType","DataUri","Stream","memoryCache","fetchPromises","mediaFormat","onProgress","progressiveUrl","getProgressive","mediaPng","prepared","prepareMedia","mediaSource","MediaSource","streamUrl","URL","createObjectURL","sourceBuffer","addSourceBuffer","endOfStream","appendBuffer","revokeObjectURL","fetchFromCacheOrRemote","getFromMemory","cancelProgress","mediaData","fullSize","utf16","len","RangeError","adapt","numpoints","firsttime","decode","preserveCase","case_flags","input_length","out","bias","basic","j","ic","oldi","w","digit","lastIndexOf","cp","toUnicode","domain_array","ensureProtocol","getDomain","decodedHref","decodeURI","convertPunycode","toggleSafeLinkModal","openTelegramLink","isNotSafe","ctrlKey","altKey","shiftKey","metaKey","classNames","getFileSizeString","bytes","ONE_GIGABYTE","ONE_MEGABYTE","getDocumentExtension","getFileExtension","getColorFromExtension","extension","STRIPE_ERRORS","missing_payment_information","field","fieldError","invalid_number","exp_year","exp_month","invalid_expiry_year","invalid_expiry_month","cvc","invalid_cvc","getStripeError","param","SHIPPING_ERRORS","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_CITY_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_POSTCODE_INVALID","ADDRESS_STATE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_PHONE_INVALID","REQ_INFO_EMAIL_INVALID","getShippingErrors","dialogs","cur","hasErrorKey","currentInstance","tick","instance","isCancelled","animate","DropdownMenu","forceOpen","onOpen","dropdownRef","setIsOpen","menu","focusedElement","activeElement","elementChildren","onTrigger","onSelectWithEnter","itemSelector","noCaptureFocus","focusedIndex","setFocusedIndex","querySelectorAll","newIndex","RE_EMOJI_ONLY","twemojiRegex","DETECT_UP_TO","emojiCount","EXCLUDE_EMOJIS","unifiedToNative","unified","codePoints","fromCodePoint","pairs","uncompressEmoji","emojiData","categories","emojiRaw","names","native","image","FILTERED_ATTRIBUTES","HTML_ATTRIBUTES","MAPPED_ATTRIBUTES","autoPlay","headsByElement","renderWithVirtual","parentEl","$current","$parent","skipComponentUpdate","forceIndex","fragment","moveDirection","updateComponent","setupComponentUpdateListener","initComponent","node","createNode","childNodes","insertBefore","replaceChild","areComponents","nextSibling","newKeys","removeAttribute","addAttribute","oldValue","updateAttribute","updateAttributes","currentEl","teactFastList","$newChild","currentRemainingIndex","remainingByKey","$currentChild","newChildKey","order","teactOrderKey","fragmentQueue","fragmentIndex","newChildren","currentPreservedIndex","currentChildInfo","flushFragmentQueue","shouldMoveNode","isMovingDown","renderFastListChildren","createDocumentFragment","renderChildren","$firstChild","createTextNode","$child","$fragmentChild","cssText","render","headId","$head","openUserInfo","handleMessageClick","openChat","targetUsers","targetMessage","translationValues","textOptions","maxTextLength","unprocessed","processed","processPlaceholder","isEmbedded","renderChatContent","renderUserContent","renderOriginContent","showQuotes","messageText","renderMessageContent","renderProductContent","renderMigratedContent","replaceValue","placeholderPosition","MESSAGE_DELETED","openChatByUsername","updateAppBadge","setAppBadge","contains","currentThemeMatch","currentTheme","nextTheme","animationLevel","switchTheme","subscribeToSystemThemeChange","messageTextSize","language","uiReadyState","authPhoneNumber","authRememberMe","authError","shouldSkipHistoryAnimations","apiUpdate","authIsLoading","password","file","authIsLoadingQrCode","reset","langCachePrefix","langCacheVersion","init","connectionState","authNearestCountry","buildInputPrivacyRules","visibility","allowedIds","deniedIds","rules","collectUsers","accessHash","collectChats","allowedUsers","allowedChats","blockedUsers","blockedChats","bio","profileEdit","InProgress","currentUser","Complete","Idle","isUsernameAvailable","loadedWallpapers","wallpapers","slug","wallpaper","firstWallpaper","withLocalMedia","blockedIds","activeSessions","session","isCurrent","hasContactJoinedNotifications","phoneNumberSettings","lastSeenSettings","profilePhotoSettings","forwardsSettings","chatInviteSettings","privacy","lastSeen","profilePhoto","forwards","chatInvite","privacyKey","allowUserIds","allowChatIds","blockUserIds","blockChatIds","isAllowList","contactsIds","isSensitiveEnabled","onUpdateApiReady","wasAuthReady","authState","authorizationState","isLoggingOut","authIsCodeViaApp","isCodeViaApp","authHint","hint","authQrCode","qrCode","lastSyncTime","onUpdateAuthorizationState","onUpdateAuthorizationError","sync","signOut","onUpdateConnectionState","isEmpty","saveSession","onUpdateSession","onUpdateServerTimeOffset","sessionUserAuth","updateSessionUserId","onUpdateCurrentUser","showDialog","ServiceWorkerNoSupportError","setPrototypeOf","scriptUrl","handleWorkerMessage","register","INITIAL_STATE","isLeftColumnShown","activeChatFolder","recentEmojis","added","recent","featured","emojiKeywords","saved","inlineBots","byUsername","topPeers","topInlineBots","audioPlayer","notifications","messageSendKeyCombo","shouldSuggestStickers","light","isBlurred","patternColor","dark","shouldShowContextMenuHint","updateCacheThrottled","updateCache","unsubscribeFromBeforeUnload","isCaching","isHeavyAnimating","loadCache","initialState","setupCaching","time","timeEnd","readCache","clearCaching","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","reduceChatFolders","idsToSave","cid","chatIdsToSave","mainThread","tabKey","SITE_FONTS","preloadFonts","font","fonts","load","preloadAvatars","mediaLoader","preloadTasks","main","telegramLogoPath","authCode","monkeyPath","authPassword","background","backgroundColor","hasCustomBackground","hasCustomBackgroundColor","isRightColumnShown","setIsUiReady","isReady","markReady","useFlag","shouldRenderMask","safePreload","translation","setTranslation","getSuggestedLanguage","suggestedLanguage","MENU_HIDING_DURATION","inputRef","setFilter","filteredList","setFilteredList","updateFilter","filterValue","getFilteredList","countryId","firstElementChild","dataset","handleInput","handleInputKeyDown","handleTrigger","select","formEl","getElementById","scrollTo","top","scrollHeight","behavior","inputValue","data-country-id","isPreloadInitiated","setAuthPhoneNumber","setAuthRememberMe","loadNearestCountry","clearAuthError","goToAuthQrCode","setSettingOption","continueText","useLangString","setCountry","setPhoneNumber","isTouched","setIsTouched","lastSelection","setLastSelection","markIsLoading","unmarkIsLoading","fullNumber","canSubmit","parseFullNumber","newFullNumber","suggestedCountry","selectedCountry","handleLangChange","setSelectionRange","isJustPastedRef","handlePaste","handlePhoneNumberChange","selectionStart","selectionEnd","shouldFixSafariAutoComplete","handleKeepSessionChange","isAuthReady","onSubmit","InputText","Checkbox","Loading","AuthCode","useModuleLoader","AuthPassword","AuthRegister","G","H","B","QrCreator","h","u","J","level","version","O","C","f","lineTo","arcTo","moveTo","z","v","N","K","P","fillStyle","fillRect","left","beginPath","q","D","E","R","I","F","fill","colorStops","createLinearGradient","apply","createRadialGradient","addColorStop","A","minVersion","maxVersion","ecLevel","radius","quiet","HTMLCanvasElement","clearRect","write","S","multiply","L","M","Q","returnToAuthPhoneNumber","qrCodeRef","token","isMobile","AuthQrCode","AppInactive","appInactivePath","renderMain","disconnect","isInactive","markInactive","TeactDOM"],"mappings":"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C,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAClf,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GACnf,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EACrf,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAChf,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC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","file":"main.27f9887240a2d5c046ba.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t2: 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + chunkId + \".\" + {\"0\":\"e48232bc26b8d2aff6ea\",\"1\":\"db575d71a0009d78423e\",\"3\":\"c4d4bc793e11d4bb6728\",\"4\":\"f46a6915735f9deb48a8\",\"5\":\"3751c0b85336f64c5d01\",\"6\":\"77c58d7c5eb57719d840\",\"7\":\"fe92696749d312ea20ae\",\"8\":\"9786bdd67e960161780f\",\"9\":\"4c3e7b14c7a365900696\",\"10\":\"af7bed9ae098996acabc\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"0\":1,\"3\":1,\"4\":1,\"5\":1,\"6\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"\" + ({}[chunkId]||chunkId) + \".\" + {\"0\":\"e48232bc26b8d2aff6ea\",\"1\":\"db575d71a0009d78423e\",\"3\":\"c4d4bc793e11d4bb6728\",\"4\":\"f46a6915735f9deb48a8\",\"5\":\"3751c0b85336f64c5d01\",\"6\":\"77c58d7c5eb57719d840\",\"7\":\"fe92696749d312ea20ae\",\"8\":\"9786bdd67e960161780f\",\"9\":\"4c3e7b14c7a365900696\",\"10\":\"af7bed9ae098996acabc\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 104);\n","import { DEBUG, DEBUG_MORE } from '../../config';\nimport {\n fastRaf, onTickEnd, throttleWithPrimaryRaf, throttleWithRaf,\n} from '../../util/schedulers';\nimport { flatten, orderBy } from '../../util/iteratees';\nimport arePropsShallowEqual, { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { handleError } from '../../util/handleError';\nimport { removeAllDelegatedListeners } from './dom-events';\n\nexport type Props = AnyLiteral;\nexport type FC

= (props: P) => any;\nexport type FC_withDebug =\n FC\n & {\n DEBUG_contentComponentName?: string;\n};\n\nexport enum VirtualElementTypesEnum {\n Empty,\n Text,\n Tag,\n Component,\n}\n\ninterface VirtualElementEmpty {\n type: VirtualElementTypesEnum.Empty;\n target?: Node;\n}\n\ninterface VirtualElementText {\n type: VirtualElementTypesEnum.Text;\n target?: Node;\n value: string;\n}\n\nexport interface VirtualElementTag {\n type: VirtualElementTypesEnum.Tag;\n target?: Node;\n tag: string;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport interface VirtualElementComponent {\n type: VirtualElementTypesEnum.Component;\n componentInstance: ComponentInstance;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport type StateHookSetter = (newValue: ((current: T) => T) | T) => void;\n\ninterface ComponentInstance {\n $element: VirtualElementComponent;\n Component: FC;\n name: string;\n props: Props;\n renderedValue?: any;\n isMounted: boolean;\n hooks: {\n state: {\n cursor: number;\n byCursor: {\n value: any;\n nextValue: any;\n setter: StateHookSetter;\n }[];\n };\n effects: {\n cursor: number;\n byCursor: {\n effect: () => void;\n dependencies?: any[];\n cleanup?: Function;\n }[];\n };\n memos: {\n cursor: number;\n byCursor: {\n current: any;\n dependencies: any[];\n }[];\n };\n };\n prepareForFrame?: () => void;\n forceUpdate?: () => void;\n onUpdate?: () => void;\n}\n\nexport type VirtualElement =\n VirtualElementEmpty\n | VirtualElementText\n | VirtualElementTag\n | VirtualElementComponent;\nexport type VirtualRealElement =\n VirtualElementTag\n | VirtualElementComponent;\nexport type VirtualElementChildren = VirtualElement[];\n\nconst Fragment = Symbol('Fragment');\n\nlet renderingInstance: ComponentInstance;\n\nexport function isEmptyElement($element: VirtualElement): $element is VirtualElementEmpty {\n return $element.type === VirtualElementTypesEnum.Empty;\n}\n\nexport function isTextElement($element: VirtualElement): $element is VirtualElementText {\n return $element.type === VirtualElementTypesEnum.Text;\n}\n\nexport function isTagElement($element: VirtualElement): $element is VirtualElementTag {\n return $element.type === VirtualElementTypesEnum.Tag;\n}\n\nexport function isComponentElement($element: VirtualElement): $element is VirtualElementComponent {\n return $element.type === VirtualElementTypesEnum.Component;\n}\n\nexport function isRealElement($element: VirtualElement): $element is VirtualRealElement {\n return isTagElement($element) || isComponentElement($element);\n}\n\nfunction createElement(\n source: string | FC | typeof Fragment,\n props: Props,\n ...children: any[]\n): VirtualRealElement | VirtualElementChildren {\n if (!props) {\n props = {};\n }\n\n children = flatten(children);\n\n if (source === Fragment) {\n return children;\n } else if (typeof source === 'function') {\n return createComponentInstance(source, props, children);\n } else {\n return buildTagElement(source, props, children);\n }\n}\n\nfunction createComponentInstance(Component: FC, props: Props, children: any[]): VirtualElementComponent {\n let parsedChildren: any | any[] | undefined;\n if (children.length === 0) {\n parsedChildren = undefined;\n } else if (children.length === 1) {\n [parsedChildren] = children;\n } else {\n parsedChildren = children;\n }\n\n const componentInstance: ComponentInstance = {\n $element: {} as VirtualElementComponent,\n Component,\n name: Component.name,\n props: {\n ...props,\n ...(parsedChildren && { children: parsedChildren }),\n },\n isMounted: false,\n hooks: {\n state: {\n cursor: 0,\n byCursor: [],\n },\n effects: {\n cursor: 0,\n byCursor: [],\n },\n memos: {\n cursor: 0,\n byCursor: [],\n },\n },\n };\n\n componentInstance.$element = buildComponentElement(componentInstance);\n\n return componentInstance.$element;\n}\n\nfunction buildComponentElement(\n componentInstance: ComponentInstance,\n children: VirtualElementChildren = [],\n): VirtualElementComponent {\n const { props } = componentInstance;\n\n return {\n componentInstance,\n type: VirtualElementTypesEnum.Component,\n props,\n children,\n };\n}\n\nfunction buildTagElement(tag: string, props: Props, children: any[]): VirtualElementTag {\n return {\n type: VirtualElementTypesEnum.Tag,\n tag,\n props,\n children: dropEmptyTail(children).map(buildChildElement),\n };\n}\n\n// We only need placeholders in the middle of collection (to ensure other elements order).\nfunction dropEmptyTail(children: any[]) {\n let i = children.length - 1;\n\n for (; i >= 0; i--) {\n if (!isEmptyPlaceholder(children[i])) {\n break;\n }\n }\n\n return i + 1 < children.length ? children.slice(0, i + 1) : children;\n}\n\nfunction isEmptyPlaceholder(child: any) {\n // eslint-disable-next-line no-null/no-null\n return child === false || child === null || child === undefined;\n}\n\nfunction buildChildElement(child: any): VirtualElement {\n if (isEmptyPlaceholder(child)) {\n return buildEmptyElement();\n } else if (isRealElement(child)) {\n return child;\n } else {\n return buildTextElement(child);\n }\n}\n\nfunction buildTextElement(value: any): VirtualElementText {\n return {\n type: VirtualElementTypesEnum.Text,\n value: String(value),\n };\n}\n\nfunction buildEmptyElement(): VirtualElementEmpty {\n return { type: VirtualElementTypesEnum.Empty };\n}\n\nconst DEBUG_components: AnyLiteral = {};\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('COMPONENTS', orderBy(Object.values(DEBUG_components), 'renderCount', 'desc'));\n});\n\nexport function renderComponent(componentInstance: ComponentInstance) {\n renderingInstance = componentInstance;\n componentInstance.hooks.state.cursor = 0;\n componentInstance.hooks.effects.cursor = 0;\n componentInstance.hooks.memos.cursor = 0;\n\n const { Component, props } = componentInstance;\n let newRenderedValue;\n\n try {\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n const componentName = componentInstance.name;\n if (!DEBUG_components[componentName]) {\n DEBUG_components[componentName] = {\n componentName,\n renderCount: 0,\n renderTimes: [],\n };\n }\n\n if (DEBUG_MORE) {\n if (componentName !== 'TeactMemoWrapper' && componentName !== 'TeactNContainer') {\n // eslint-disable-next-line no-console\n console.log(`[Teact] Render ${componentName}`);\n }\n }\n\n DEBUG_startAt = performance.now();\n }\n\n newRenderedValue = Component(props);\n\n if (DEBUG) {\n const renderTime = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (renderTime > 7) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow component render: ${componentName}, ${Math.round(renderTime)} ms`);\n }\n DEBUG_components[componentName].renderTimes.push(renderTime);\n DEBUG_components[componentName].renderCount++;\n }\n } catch (err) {\n handleError(err);\n\n newRenderedValue = componentInstance.renderedValue;\n }\n\n if (componentInstance.isMounted && newRenderedValue === componentInstance.renderedValue) {\n return componentInstance.$element;\n }\n\n componentInstance.renderedValue = newRenderedValue;\n\n const newChild = buildChildElement(newRenderedValue);\n componentInstance.$element = buildComponentElement(componentInstance, [newChild]);\n\n return componentInstance.$element;\n}\n\nexport function hasElementChanged($old: VirtualElement, $new: VirtualElement) {\n if (typeof $old !== typeof $new) {\n return true;\n } else if ($old.type !== $new.type) {\n return true;\n } else if (isTextElement($old) && isTextElement($new)) {\n return $old.value !== $new.value;\n } else if (isTagElement($old) && isTagElement($new)) {\n return ($old.tag !== $new.tag) || ($old.props.key !== $new.props.key);\n } else if (isComponentElement($old) && isComponentElement($new)) {\n return (\n $old.componentInstance.Component !== $new.componentInstance.Component\n ) || (\n $old.props.key !== $new.props.key\n );\n }\n\n return false;\n}\n\nexport function unmountTree($element: VirtualElement) {\n if (!isRealElement($element)) {\n return;\n }\n\n if (isComponentElement($element)) {\n unmountComponent($element.componentInstance);\n } else if ($element.target) {\n removeAllDelegatedListeners($element.target as HTMLElement);\n // Trying to help GC\n // eslint-disable-next-line no-null/no-null\n $element.target = null as any;\n }\n\n $element.children.forEach(unmountTree);\n}\n\nexport function mountComponent(componentInstance: ComponentInstance) {\n renderComponent(componentInstance);\n componentInstance.isMounted = true;\n return componentInstance.$element;\n}\n\nfunction unmountComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n // eslint-disable-next-line no-null/no-null\n hook.current = null;\n });\n\n componentInstance.hooks.effects.byCursor.forEach(({ cleanup }) => {\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err) {\n handleError(err);\n }\n }\n });\n\n componentInstance.isMounted = false;\n\n helpGc(componentInstance);\n}\n\n// We need to remove all references to DOM objects. We also clean all other references, just in case.\nfunction helpGc(componentInstance: ComponentInstance) {\n /* eslint-disable no-null/no-null */\n\n componentInstance.hooks.effects.byCursor.forEach((hook) => {\n hook.cleanup = null as any;\n hook.effect = null as any;\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = null as any;\n hook.nextValue = null as any;\n hook.setter = null as any;\n });\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks = null as any;\n componentInstance.$element = null as any;\n componentInstance.renderedValue = null as any;\n componentInstance.Component = null as any;\n componentInstance.props = null as any;\n componentInstance.forceUpdate = null as any;\n componentInstance.onUpdate = null as any;\n\n /* eslint-enable no-null/no-null */\n}\n\nfunction prepareComponentForFrame(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = hook.nextValue;\n });\n\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(() => prepareComponentForFrame(componentInstance));\n componentInstance.forceUpdate = throttleWithRaf(() => forceUpdateComponent(componentInstance));\n}\n\nfunction forceUpdateComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted || !componentInstance.onUpdate) {\n return;\n }\n\n const currentElement = componentInstance.$element;\n\n renderComponent(componentInstance);\n\n if (componentInstance.$element !== currentElement) {\n componentInstance.onUpdate();\n }\n}\n\nexport function getTarget($element: VirtualElement): Node | undefined {\n if (isComponentElement($element)) {\n return getTarget($element.children[0]);\n } else {\n return $element.target;\n }\n}\n\nexport function setTarget($element: VirtualElement, target: Node) {\n if (isComponentElement($element)) {\n setTarget($element.children[0], target);\n } else {\n $element.target = target;\n }\n}\n\nexport function useState(initial?: T): [T, StateHookSetter] {\n const { cursor, byCursor } = renderingInstance.hooks.state;\n\n if (byCursor[cursor] === undefined) {\n byCursor[cursor] = {\n value: initial,\n nextValue: initial,\n setter: ((componentInstance) => (newValue: ((current: T) => T) | T) => {\n if (byCursor[cursor].nextValue !== newValue) {\n byCursor[cursor].nextValue = typeof newValue === 'function'\n ? (newValue as (current: T) => T)(byCursor[cursor].value)\n : newValue;\n\n if (!componentInstance.prepareForFrame || !componentInstance.forceUpdate) {\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(\n () => prepareComponentForFrame(componentInstance),\n );\n componentInstance.forceUpdate = throttleWithRaf(\n () => forceUpdateComponent(componentInstance),\n );\n }\n\n componentInstance.prepareForFrame();\n componentInstance.forceUpdate();\n\n if (DEBUG_MORE) {\n if (componentInstance.name !== 'TeactNContainer') {\n // eslint-disable-next-line no-console\n console.log(\n '[Teact.useState]',\n componentInstance.name,\n // `componentInstance.Component` may be set to `null` by GC helper\n componentInstance.Component && (componentInstance.Component as FC_withDebug).DEBUG_contentComponentName\n ? `> ${(componentInstance.Component as FC_withDebug).DEBUG_contentComponentName}`\n : '',\n `Forced update at cursor #${cursor}, next value: `,\n byCursor[cursor].nextValue,\n );\n }\n }\n }\n })(renderingInstance),\n };\n }\n\n renderingInstance.hooks.state.cursor++;\n\n return [\n byCursor[cursor].value,\n byCursor[cursor].setter,\n ];\n}\n\nfunction useLayoutEffectBase(\n schedulerFn: typeof onTickEnd | typeof requestAnimationFrame,\n effect: () => Function | void,\n dependencies?: any[],\n debugKey?: string,\n) {\n const { cursor, byCursor } = renderingInstance.hooks.effects;\n const componentInstance = renderingInstance;\n\n const exec = () => {\n if (!componentInstance.isMounted) {\n return;\n }\n\n const { cleanup } = byCursor[cursor];\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err) {\n handleError(err);\n }\n }\n\n byCursor[cursor].cleanup = effect() as Function;\n };\n\n if (byCursor[cursor] !== undefined && dependencies && byCursor[cursor].dependencies) {\n if (dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies![i])) {\n if (debugKey) {\n const causedBy = dependencies.reduce((res, newValue, i) => {\n const prevValue = byCursor[cursor].dependencies![i];\n if (newValue !== prevValue) {\n res.push(`${i}: ${prevValue} => ${newValue}`);\n }\n\n return res;\n }, []);\n\n // eslint-disable-next-line no-console\n console.log(\n '[Teact]',\n debugKey,\n 'Effect caused by dependencies.',\n causedBy.join(', '),\n );\n }\n\n schedulerFn(exec);\n }\n } else {\n schedulerFn(exec);\n }\n\n byCursor[cursor] = {\n effect,\n dependencies,\n cleanup: byCursor[cursor] ? byCursor[cursor].cleanup : undefined,\n };\n\n renderingInstance.hooks.effects.cursor++;\n}\n\nexport function useEffect(effect: () => Function | void, dependencies?: any[], debugKey?: string) {\n return useLayoutEffectBase(fastRaf, effect, dependencies, debugKey);\n}\n\nexport function useLayoutEffect(effect: () => Function | void, dependencies?: any[], debugKey?: string) {\n return useLayoutEffectBase(onTickEnd, effect, dependencies, debugKey);\n}\n\nexport function useMemo(resolver: () => T, dependencies: any[], debugKey?: string): T {\n const { cursor, byCursor } = renderingInstance.hooks.memos;\n let { current } = byCursor[cursor] || {};\n\n if (\n byCursor[cursor] === undefined\n || dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies[i])\n ) {\n if (DEBUG && debugKey) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.useMemo] ${renderingInstance.name} (${debugKey}): Update is caused by:`,\n byCursor[cursor]\n ? getUnequalProps(dependencies, byCursor[cursor].dependencies).join(', ')\n : '[first render]',\n );\n }\n\n current = resolver();\n }\n\n byCursor[cursor] = {\n current,\n dependencies,\n };\n\n renderingInstance.hooks.memos.cursor++;\n\n return current;\n}\n\nexport function useCallback(newCallback: F, dependencies: any[]): F {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => newCallback, dependencies);\n}\n\nexport function useRef(initial: T): { current: T };\nexport function useRef(): { current: T | undefined }; // TT way (empty is `undefined`)\nexport function useRef(initial: null): { current: T | null }; // React way (empty is `null`)\n// eslint-disable-next-line no-null/no-null\nexport function useRef(initial?: T | null) {\n return useMemo(() => ({\n current: initial,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), []);\n}\n\nexport function memo(Component: T, areEqual = arePropsShallowEqual, debugKey?: string) {\n return function TeactMemoWrapper(props: Props) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const propsRef = useRef(props);\n const renderedRef = useRef();\n\n if (!renderedRef.current || (propsRef.current && !areEqual(propsRef.current, props))) {\n if (DEBUG && debugKey) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.memo] ${Component.name} (${debugKey}): Update is caused by:`,\n getUnequalProps(propsRef.current!, props).join(', '),\n );\n }\n\n propsRef.current = props;\n renderedRef.current = createElement(Component, props) as VirtualElementComponent;\n }\n\n return renderedRef.current;\n } as T;\n}\n\n// We need to keep it here for JSX.\nexport default {\n createElement,\n Fragment,\n};\n","import React, {\n FC, FC_withDebug, Props, useEffect, useState,\n} from './teact';\n\nimport { DEBUG, DEBUG_MORE } from '../../config';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport generateIdFor from '../../util/generateIdFor';\nimport { throttleWithRaf } from '../../util/schedulers';\nimport arePropsShallowEqual, { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { orderBy } from '../../util/iteratees';\nimport { GlobalState, GlobalActions, ActionTypes } from '../../global/types';\nimport { handleError } from '../../util/handleError';\n\nexport default React;\n\ntype ActionPayload = AnyLiteral;\n\ntype Reducer = (\n global: GlobalState,\n actions: GlobalActions,\n payload: any,\n) => GlobalState | void;\n\ntype MapStateToProps = ((global: GlobalState, ownProps: OwnProps) => AnyLiteral | null);\ntype MapActionsToProps = ((setGlobal: Function, actions: GlobalActions) => Partial | null);\n\nlet currentGlobal = {} as GlobalState;\n\nconst reducers: Record = {};\nconst callbacks: Function[] = [updateContainers];\nconst actions = {} as GlobalActions;\nconst containers = new Map;\n mapReducersToProps: MapActionsToProps;\n ownProps: Props;\n mappedProps?: Props;\n forceUpdate: Function;\n areMappedPropsChanged: boolean;\n DEBUG_updates: number;\n DEBUG_componentName: string;\n}>();\n\nfunction runCallbacks() {\n callbacks.forEach((cb) => cb(currentGlobal));\n}\n\nconst runCallbacksThrottled = throttleWithRaf(runCallbacks);\n\n// `noThrottle = true` is used as a workaround for iOS gesture history navigation\nexport function setGlobal(newGlobal?: GlobalState, noThrottle = false) {\n if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) {\n currentGlobal = newGlobal;\n if (!noThrottle) {\n runCallbacksThrottled();\n } else {\n runCallbacks();\n }\n }\n}\n\nexport function getGlobal() {\n return currentGlobal;\n}\n\nexport function getDispatch() {\n return actions;\n}\n\nfunction onDispatch(name: string, payload?: ActionPayload, noThrottle?: boolean) {\n if (reducers[name]) {\n reducers[name].forEach((reducer) => {\n const newGlobal = reducer(currentGlobal, actions, payload);\n if (newGlobal) {\n setGlobal(newGlobal, noThrottle);\n }\n });\n }\n}\n\nfunction updateContainers() {\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n DEBUG_startAt = performance.now();\n }\n\n // eslint-disable-next-line no-restricted-syntax\n for (const container of containers.values()) {\n const {\n mapStateToProps, mapReducersToProps, ownProps, mappedProps, forceUpdate,\n } = container;\n\n let newMappedProps;\n\n try {\n newMappedProps = {\n ...mapStateToProps(currentGlobal, ownProps),\n ...mapReducersToProps(setGlobal, actions),\n };\n } catch (err) {\n handleError(err);\n\n return;\n }\n\n if (DEBUG) {\n if (Object.values(newMappedProps).some(Number.isNaN)) {\n // eslint-disable-next-line no-console\n console.warn(\n // eslint-disable-next-line max-len\n `[TeactN] Some of \\`${container.DEBUG_componentName}\\` mappers contain NaN values. This may cause redundant updates because of incorrect equality check.`,\n );\n }\n }\n\n if (Object.keys(newMappedProps).length && !arePropsShallowEqual(mappedProps!, newMappedProps)) {\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log(\n '[TeactN] Will update',\n container.DEBUG_componentName,\n 'caused by',\n getUnequalProps(mappedProps!, newMappedProps).join(', '),\n );\n }\n\n container.mappedProps = newMappedProps;\n container.areMappedPropsChanged = true;\n container.DEBUG_updates++;\n\n forceUpdate();\n }\n }\n\n if (DEBUG) {\n const updateTime = performance.now() - DEBUG_startAt!;\n if (updateTime > 7) {\n // eslint-disable-next-line no-console\n console.warn(`[TeactN] Slow containers update: ${Math.round(updateTime)} ms`);\n }\n }\n}\n\nexport function addReducer(name: ActionTypes, reducer: Reducer) {\n if (!reducers[name]) {\n reducers[name] = [];\n\n actions[name] = (payload?: ActionPayload, noThrottle = false) => {\n onDispatch(name, payload, noThrottle);\n };\n }\n\n reducers[name].push(reducer);\n}\n\nexport function addCallback(cb: Function) {\n callbacks.push(cb);\n}\n\nexport function removeCallback(cb: Function) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n}\n\nexport function withGlobal(\n mapStateToProps: MapStateToProps = () => ({}),\n mapReducersToProps: MapActionsToProps = () => ({}),\n) {\n return (Component: FC) => {\n return function TeactNContainer(props: OwnProps) {\n (TeactNContainer as FC_withDebug).DEBUG_contentComponentName = Component.name;\n\n const [id] = useState(generateIdFor(containers));\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n return () => {\n containers.delete(id);\n };\n }, [id]);\n\n let container = containers.get(id);\n if (!container) {\n container = {\n mapStateToProps,\n mapReducersToProps,\n ownProps: props,\n areMappedPropsChanged: false,\n forceUpdate,\n DEBUG_updates: 0,\n DEBUG_componentName: Component.name,\n };\n\n containers.set(id, container);\n }\n\n if (container.areMappedPropsChanged) {\n container.areMappedPropsChanged = false;\n }\n\n if (!container.mappedProps || !arePropsShallowEqual(container.ownProps, props)) {\n container.ownProps = props;\n\n try {\n container.mappedProps = {\n ...mapStateToProps(currentGlobal, props),\n ...mapReducersToProps(setGlobal, actions),\n };\n } catch (err) {\n handleError(err);\n }\n }\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ;\n };\n };\n}\n\nif (DEBUG) {\n (window as any).getGlobal = getGlobal;\n\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log(\n 'GLOBAL CONTAINERS',\n orderBy(\n Array.from(containers.values())\n .map(({ DEBUG_componentName, DEBUG_updates }) => ({ DEBUG_componentName, DEBUG_updates })),\n 'DEBUG_updates',\n 'desc',\n ),\n );\n });\n}\n","export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const APP_NAME = process.env.APP_NAME || 'Telegram WebZ';\nexport const APP_VERSION = process.env.APP_VERSION || 'dev';\n\nexport const DEBUG = (\n process.env.APP_ENV !== 'production' && process.env.APP_ENV !== 'perf' && process.env.APP_ENV !== 'test'\n);\nexport const DEBUG_MORE = false;\n\nexport const IS_TEST = process.env.APP_ENV === 'test';\nexport const IS_PERF = process.env.APP_ENV === 'perf';\n\nexport const DEBUG_ALERT_MSG = 'Shoot!\\nSomething went wrong, please see the error details in Dev Tools Console.';\nexport const DEBUG_GRAMJS = false;\n\nexport const SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_KEY = 'GramJs:sessionId';\n\nexport const GLOBAL_STATE_CACHE_DISABLED = false;\nexport const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';\nexport const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 30;\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 5000;\n\nexport const MEDIA_CACHE_DISABLED = false;\nexport const MEDIA_CACHE_NAME = 'tt-media';\nexport const MEDIA_CACHE_NAME_AVATARS = 'tt-media-avatars';\nexport const MEDIA_PROGRESSIVE_CACHE_DISABLED = false;\nexport const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive';\nexport const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB\nexport const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg';\nexport const LANG_CACHE_NAME = 'tt-lang-packs-v5';\nexport const ASSET_CACHE_NAME = 'tt-assets';\n\nexport const DOWNLOAD_WORKERS = 16;\nexport const UPLOAD_WORKERS = 16;\n\nconst isBigScreen = typeof window !== 'undefined' && window.innerHeight >= 900;\n\nexport const MIN_PASSWORD_LENGTH = 1;\n\nexport const MESSAGE_LIST_SENSITIVE_AREA = 750;\nexport const MESSAGE_LIST_SLICE = isBigScreen ? 60 : 40;\nexport const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2;\n\nexport const CHAT_HEIGHT_PX = 72;\nexport const CHAT_LIST_SLICE = isBigScreen ? 30 : 25;\nexport const CHAT_LIST_LOAD_SLICE = 100;\nexport const SHARED_MEDIA_SLICE = 42;\nexport const MESSAGE_SEARCH_SLICE = 42;\nexport const GLOBAL_SEARCH_SLICE = 20;\nexport const MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const ANIMATION_LEVEL_MIN = 0;\nexport const ANIMATION_LEVEL_MED = 1;\nexport const ANIMATION_LEVEL_MAX = 2;\nexport const ANIMATION_LEVEL_DEFAULT = ANIMATION_LEVEL_MAX;\n\nexport const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16;\nexport const IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 17;\nexport const MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 15;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\n\n// Screen width where Pinned Message / Audio Player in the Middle Header can be safely displayed\nexport const SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1440; // px\n// Screen width where Pinned Message / Audio Player in the Middle Header shouldn't collapse with ChatInfo\nexport const SAFE_SCREEN_WIDTH_FOR_CHAT_INFO = 1150; // px\n\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1275; // px\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN = 925; // px\nexport const MOBILE_SCREEN_MAX_WIDTH = 600; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH = 950; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT = 450; // px\n\nexport const LOCAL_MESSAGE_ID_BASE = 1e9;\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const FAST_SMOOTH_MAX_DISTANCE = 1500;\nexport const FAST_SMOOTH_MIN_DURATION = 250;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 500; // px\n\n// Average duration of message sending animation\nexport const API_UPDATE_THROTTLE = Math.round((FAST_SMOOTH_MIN_DURATION + FAST_SMOOTH_MAX_DURATION) / 2);\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\n\nexport const STICKER_SIZE_INLINE_DESKTOP_FACTOR = 13;\nexport const STICKER_SIZE_INLINE_MOBILE_FACTOR = 11;\nexport const STICKER_SIZE_AUTH = 160;\nexport const STICKER_SIZE_AUTH_MOBILE = 120;\nexport const STICKER_SIZE_PICKER = 64;\nexport const STICKER_SIZE_GENERAL_SETTINGS = 48;\nexport const STICKER_SIZE_PICKER_HEADER = 32;\nexport const STICKER_SIZE_SEARCH = 64;\nexport const STICKER_SIZE_MODAL = 64;\nexport const STICKER_SIZE_TWO_FA = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 80;\nexport const STICKER_SIZE_INLINE_BOT_RESULT = 100;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const BASE_EMOJI_KEYWORD_LANG = 'en';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = new Set([\n 'image/png', 'image/gif', 'image/jpeg', 'video/mp4', 'video/avi', 'video/quicktime',\n]);\n\n// eslint-disable-next-line max-len\nexport const RE_LINK_TEMPLATE = '((ftp|https?):\\\\/\\\\/)?((www\\\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,63})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_MENTION_TEMPLATE = '(@[\\\\w\\\\d_-]+)';\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)([\\d\\w_]+)(?:\\/([\\d]+))?(?:\\/([\\d]+))?$/gm;\nexport const RE_TME_INVITE_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/joinchat\\/)([\\d\\w_-]+)?$/gm;\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = 777000;\nexport const ALL_FOLDER_ID = 0;\nexport const ARCHIVED_FOLDER_ID = 1;\nexport const DELETED_COMMENTS_CHANNEL_ID = 777;\nexport const MAX_MEDIA_FILES_FOR_ALBUM = 10;\nexport const MAX_ACTIVE_PINNED_CHATS = 5;\nexport const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE;\nexport const DEFAULT_LANG_CODE = 'en';\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'] as const;\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const LOCALIZED_TIPS = ['ar', 'pt-br', 'id', 'it', 'ko', 'ms', 'pl', 'es', 'tr'];\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const LIGHT_THEME_BG_COLOR = '#A2AF8E';\nexport const DARK_THEME_BG_COLOR = '#0F0F0F';\nexport const DARK_THEME_PATTERN_COLOR = '#0a0a0a8c';\nexport const DEFAULT_PATTERN_COLOR = 'rgba(90, 110, 70, 0.6)';\n","type CollectionByKey = Record;\n\ntype OrderDirection = 'asc' | 'desc';\n\ninterface OrderCallback {\n (member: T): any;\n}\n\nexport function buildCollectionByKey(collection: T[], key: keyof T) {\n return collection.reduce((byKey: CollectionByKey, member: T) => {\n byKey[member[key]] = member;\n\n return byKey;\n }, {});\n}\n\nexport function mapValues(\n byKey: CollectionByKey,\n callback: (member: M, key: string, index: number, originalByKey: CollectionByKey) => R,\n): CollectionByKey {\n return Object.keys(byKey).reduce((newByKey: CollectionByKey, key, index) => {\n newByKey[key] = callback(byKey[key], key, index, byKey);\n return newByKey;\n }, {});\n}\n\nexport function pick(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n result[key] = object[key];\n return result;\n }, {} as Pick);\n}\n\nexport function pickTruthy(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n if (object[key]) {\n result[key] = object[key];\n }\n\n return result;\n }, {} as Pick);\n}\n\nexport function omit(object: T, keys: K[]) {\n const stringKeys = new Set(keys.map(String));\n const savedKeys = Object.keys(object)\n .filter((key) => !stringKeys.has(key)) as Array>;\n\n return pick(object, savedKeys);\n}\n\nexport function orderBy(\n collection: T[],\n orderKey: (keyof T) | OrderCallback | ((keyof T) | OrderCallback)[],\n mode: OrderDirection | [OrderDirection, OrderDirection] = 'asc',\n): T[] {\n return collection.sort((a, b) => {\n if (Array.isArray(orderKey)) {\n const [mode1, mode2] = Array.isArray(mode) ? mode : [mode, mode];\n const [orderKey1, orderKey2] = orderKey;\n\n let aValue1;\n let bValue1;\n\n if (typeof orderKey1 === 'function') {\n aValue1 = orderKey1(a) || 0;\n bValue1 = orderKey1(b) || 0;\n } else if (typeof orderKey1 === 'string') {\n aValue1 = a[orderKey1] || 0;\n bValue1 = b[orderKey1] || 0;\n }\n\n if (aValue1 !== bValue1) {\n return mode1 === 'asc' ? aValue1 - bValue1 : bValue1 - aValue1;\n } else {\n let aValue2;\n let bValue2;\n\n if (typeof orderKey2 === 'function') {\n aValue2 = orderKey2(a) || 0;\n bValue2 = orderKey2(b) || 0;\n } else if (typeof orderKey2 === 'string') {\n aValue2 = a[orderKey2] || 0;\n bValue2 = b[orderKey2] || 0;\n }\n\n return mode2 === 'asc' ? aValue2 - bValue2 : bValue2 - aValue2;\n }\n }\n\n let aValue;\n let bValue;\n\n if (typeof orderKey === 'function') {\n aValue = orderKey(a) || 0;\n bValue = orderKey(b) || 0;\n } else if (typeof orderKey === 'string') {\n aValue = a[orderKey] || 0;\n bValue = b[orderKey] || 0;\n }\n\n return mode === 'asc' ? aValue - bValue : bValue - aValue;\n });\n}\n\nexport function flatten(array: any[]) {\n return array.reduce((result, member) => {\n if (Array.isArray(member)) {\n return result.concat(member);\n } else {\n result.push(member);\n return result;\n }\n }, []);\n}\n\nexport function unique(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function compact(array: any[]) {\n return array.filter(Boolean);\n}\n\nexport function areSortedArraysEqual(array1: any[], array2: any[]) {\n if (array1.length !== array2.length) {\n return false;\n }\n\n return array1.every((item, i) => item === array2[i]);\n}\n\nexport function areSortedArraysIntersecting(array1: any[], array2: any[]) {\n return array1[0] <= array2[array2.length - 1] && array1[array1.length - 1] >= array2[0];\n}\n\nexport function findIntersectionWithSet(array: T[], set: Set): T[] {\n return array.filter((a) => set.has(a));\n}\n\nexport function split(array: any[], chunkSize: number) {\n const result = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n\n return result;\n}\n\nexport function cloneDeep(value: T): T {\n if (typeof value !== 'object') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(cloneDeep) as typeof value;\n }\n\n return Object.keys(value).reduce((acc, key) => {\n acc[key as keyof T] = cloneDeep(value[key as keyof T]);\n return acc;\n }, {} as T);\n}\n\n/**\n * Returns the index of the last element in the array where predicate is true, and -1 otherwise.\n *\n * @param array The source array to search in\n * @param predicate find calls predicate once for each element of the array, in descending\n * order, until it finds one where predicate returns true. If such an element is found,\n * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.\n */\nexport function findLast(array: Array, predicate: (value: T, index: number, obj: T[]) => boolean): T | undefined {\n let cursor = array.length;\n\n while (cursor--) {\n if (predicate(array[cursor], cursor, array)) {\n return array[cursor];\n }\n }\n\n return undefined;\n}\n","import {\n ApiChat, ApiMessage, ApiMessageEntityTypes, ApiUser,\n} from '../../api/types';\nimport { LangFn } from '../../hooks/useLang';\n\nimport { LOCAL_MESSAGE_ID_BASE, SERVICE_NOTIFICATIONS_USER_ID, RE_LINK_TEMPLATE } from '../../config';\nimport parseEmojiOnlyString from '../../components/common/helpers/parseEmojiOnlyString';\nimport { getUserFullName } from './users';\nimport { getChatTitle } from './chats';\n\nconst CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram';\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\nconst TRUNCATED_SUMMARY_LENGTH = 80;\n\nexport function getMessageKey(message: ApiMessage) {\n const { chatId, id } = message;\n\n return `msg${chatId}-${id}`;\n}\n\nexport function parseMessageKey(key: string) {\n const match = key.match(/^msg(-?\\d+)-(\\d+)/)!;\n\n return { chatId: Number(match[1]), messageId: Number(match[2]) };\n}\n\nexport function getMessageOriginalId(message: ApiMessage) {\n return message.previousLocalId || message.id;\n}\n\nexport function getMessageSummaryText(lang: LangFn, message: ApiMessage, noEmoji = false) {\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, invoice,\n } = message.content;\n\n const truncatedText = text && text.text.substr(0, TRUNCATED_SUMMARY_LENGTH);\n\n if (message.groupedId) {\n return `${noEmoji ? '' : '🖼 '}${truncatedText || lang('lng_in_dlg_album')}`;\n }\n\n if (photo) {\n return `${noEmoji ? '' : '🖼 '}${truncatedText || lang('AttachPhoto')}`;\n }\n\n if (video) {\n return `${noEmoji ? '' : '📹 '}${truncatedText || lang(video.isGif ? 'AttachGif' : 'AttachVideo')}`;\n }\n\n if (sticker) {\n return `${sticker.emoji || ''} ${lang('AttachSticker')}`.trim();\n }\n\n if (audio) {\n return `${noEmoji ? '' : '🎧 '}${getMessageAudioCaption(message) || lang('AttachMusic')}`;\n }\n\n if (voice) {\n return `${noEmoji ? '' : '🎤 '}${truncatedText || lang('AttachAudio')}`;\n }\n\n if (document) {\n return `${noEmoji ? '' : '📎 '}${truncatedText || document.fileName}`;\n }\n\n if (contact) {\n return lang('AttachContact');\n }\n\n if (poll) {\n return `${noEmoji ? '' : '📊 '}${poll.summary.question}`;\n }\n\n if (invoice) {\n return 'Invoice';\n }\n\n if (text) {\n return truncatedText;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function getMessageText(message: ApiMessage) {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact, invoice,\n } = message.content;\n\n if (text) {\n return text.text;\n }\n\n if (sticker || photo || video || audio || voice || document || contact || poll || webPage || invoice) {\n return undefined;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function getMessageCustomShape(message: ApiMessage): boolean | number {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact,\n } = message.content;\n\n if (sticker || (video && video.isRound)) {\n return true;\n }\n\n if (!text || photo || video || audio || voice || document || poll || webPage || contact) {\n return false;\n }\n\n // This is a \"dual-intent\" method used to limit calls of `parseEmojiOnlyString`.\n return parseEmojiOnlyString(text.text) || false;\n}\n\nexport function getMessageSingleEmoji(message: ApiMessage) {\n const { text } = message.content;\n if (!(text && text.text.length <= 6)) {\n return undefined;\n }\n\n if (getMessageCustomShape(message) !== 1) {\n return undefined;\n }\n\n return text.text;\n}\n\nexport function getFirstLinkInMessage(message: ApiMessage) {\n const { text } = message.content;\n\n let match: RegExpMatchArray | null | undefined;\n if (text && text.entities) {\n let link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.TextUrl);\n if (link) {\n match = link.url!.match(RE_LINK);\n }\n\n if (!match) {\n link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.Url);\n if (link) {\n const { offset, length } = link;\n match = text.text.substring(offset, offset + length).match(RE_LINK);\n }\n }\n }\n\n if (!match && text) {\n match = text.text.match(RE_LINK);\n }\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function matchLinkInMessageText(message: ApiMessage) {\n const { text } = message.content;\n const match = text && text.text.match(RE_LINK);\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function isOwnMessage(message: ApiMessage) {\n return message.isOutgoing;\n}\n\nexport function isReplyMessage(message: ApiMessage) {\n return Boolean(message.replyToMessageId);\n}\n\nexport function isForwardedMessage(message: ApiMessage) {\n return Boolean(message.forwardInfo);\n}\n\nexport function isActionMessage(message: ApiMessage) {\n return !!message.content.action;\n}\n\nexport function isServiceNotificationMessage(message: ApiMessage) {\n return message.chatId === SERVICE_NOTIFICATIONS_USER_ID && isMessageLocal(message);\n}\n\nexport function isAnonymousOwnMessage(message: ApiMessage) {\n return Boolean(message.senderId) && message.senderId! < 0 && isOwnMessage(message);\n}\n\nexport function getSenderTitle(lang: LangFn, sender: ApiUser | ApiChat) {\n return sender.id > 0 ? getUserFullName(sender as ApiUser) : getChatTitle(lang, sender as ApiChat);\n}\n\nexport function getSendingState(message: ApiMessage) {\n if (!message.sendingState) {\n return 'succeeded';\n }\n\n return message.sendingState === 'messageSendingStateFailed' ? 'failed' : 'pending';\n}\n\nexport function isMessageLocal(message: ApiMessage) {\n return message.id >= LOCAL_MESSAGE_ID_BASE;\n}\n\nexport function isHistoryClearMessage(message: ApiMessage) {\n return message.content.action && message.content.action.type === 'historyClear';\n}\n\nexport function getMessageAudioCaption(message: ApiMessage) {\n const { audio, text } = message.content;\n\n return (audio && [audio.title, audio.performer].filter(Boolean).join(' — ')) || (text && text.text);\n}\n","import {\n ApiAudio, ApiMediaFormat, ApiMessage, ApiMessageSearchType, ApiPhoto, ApiVideo, ApiDimensions,\n} from '../../api/types';\n\nimport { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, IS_SAFARI } from '../../util/environment';\nimport { getMessageKey, isMessageLocal, matchLinkInMessageText } from './messages';\nimport { getDocumentHasPreview } from '../../components/common/helpers/documentInfo';\n\ntype Target =\n 'micro'\n | 'pictogram'\n | 'inline'\n | 'viewerPreview'\n | 'viewerFull'\n | 'download';\n\n\nexport function getMessageContent(message: ApiMessage) {\n return message.content;\n}\n\nexport function hasMessageMedia(message: ApiMessage) {\n return Boolean((\n getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageContact(message)\n || getMessagePoll(message)\n || getMessageAction(message)\n || getMessageAudio(message)\n || getMessageVoice(message)\n ));\n}\n\nexport function getMessagePhoto(message: ApiMessage) {\n return message.content.photo;\n}\n\nexport function getMessageVideo(message: ApiMessage) {\n return message.content.video;\n}\n\nexport function getMessageRoundVideo(message: ApiMessage) {\n const { video } = message.content;\n\n return video && video.isRound ? video : undefined;\n}\n\nexport function getMessageAction(message: ApiMessage) {\n return message.content.action;\n}\n\nexport function getMessageAudio(message: ApiMessage) {\n return message.content.audio;\n}\n\nexport function getMessageVoice(message: ApiMessage) {\n return message.content.voice;\n}\n\nexport function getMessageSticker(message: ApiMessage) {\n return message.content.sticker;\n}\n\nexport function getMessageDocument(message: ApiMessage) {\n return message.content.document;\n}\n\nexport function isMessageDocumentPhoto(message: ApiMessage) {\n const document = getMessageDocument(message);\n return document ? document.mediaType === 'photo' : undefined;\n}\n\nexport function isMessageDocumentVideo(message: ApiMessage) {\n const document = getMessageDocument(message);\n return document ? document.mediaType === 'video' : undefined;\n}\n\nexport function getMessageContact(message: ApiMessage) {\n return message.content.contact;\n}\n\nexport function getMessagePoll(message: ApiMessage) {\n return message.content.poll;\n}\n\nexport function getMessageInvoice(message: ApiMessage) {\n return message.content.invoice;\n}\n\nexport function getMessageWebPage(message: ApiMessage) {\n return message.content.webPage;\n}\n\nexport function getMessageWebPagePhoto(message: ApiMessage) {\n const webPage = getMessageWebPage(message);\n return webPage ? webPage.photo : undefined;\n}\n\nexport function getMessageWebPageDocument(message: ApiMessage) {\n const webPage = getMessageWebPage(message);\n return webPage ? webPage.document : undefined;\n}\n\nexport function getMessageWebPageVideo(message: ApiMessage): ApiVideo | undefined {\n const webPage = getMessageWebPage(message);\n if (!webPage) return undefined;\n return webPage.video;\n}\n\nexport function getMessageMediaThumbnail(message: ApiMessage) {\n const media = getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageWebPagePhoto(message)\n || getMessageWebPageVideo(message);\n\n if (!media) {\n return undefined;\n }\n\n return media.thumbnail;\n}\n\nexport function getMessageMediaThumbDataUri(message: ApiMessage) {\n const thumbnail = getMessageMediaThumbnail(message);\n\n return thumbnail ? thumbnail.dataUri : undefined;\n}\n\nexport function getMessageMediaHash(\n message: ApiMessage,\n target: Target,\n) {\n const {\n photo, video, sticker, audio, voice, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n const webPageVideo = getMessageWebPageVideo(message);\n\n const messageVideo = video || webPageVideo;\n const messagePhoto = photo || webPagePhoto;\n\n if (!(messagePhoto || messageVideo || sticker || audio || voice || document)) {\n return undefined;\n }\n\n const base = getMessageKey(message);\n\n if (messageVideo) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n return !hasMessageLocalBlobUrl(message) ? getVideoOrAudioBaseHash(messageVideo, base) : undefined;\n case 'viewerPreview':\n return `${base}?size=m`;\n case 'viewerFull':\n return getVideoOrAudioBaseHash(messageVideo, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (messagePhoto) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n return !hasMessageLocalBlobUrl(message) ? `${base}?size=x` : undefined;\n case 'viewerPreview':\n return `${base}?size=x`;\n case 'viewerFull':\n return `${base}?size=z`;\n }\n }\n\n if (document) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n case 'inline':\n case 'viewerPreview':\n if (!getDocumentHasPreview(document) || hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=m`;\n default:\n return base;\n }\n }\n\n if (sticker) {\n switch (target) {\n case 'micro':\n return undefined;\n case 'pictogram':\n return `${base}?size=m`;\n default:\n return base;\n }\n }\n\n if (audio) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n case 'download':\n return `${base}?download`;\n default:\n return getVideoOrAudioBaseHash(audio, base);\n }\n }\n\n if (voice) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n default:\n return base;\n }\n }\n\n return undefined;\n}\n\nfunction getVideoOrAudioBaseHash(media: ApiAudio | ApiVideo, base: string) {\n if (IS_PROGRESSIVE_SUPPORTED && IS_SAFARI) {\n return `${base}?fileSize=${media.size}&mimeType=${media.mimeType}`;\n }\n\n return base;\n}\n\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): Exclude;\nexport function getMessageMediaFormat(message: ApiMessage, target: Target, canBeLottie: true): ApiMediaFormat;\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): ApiMediaFormat {\n const {\n sticker, video, audio, voice,\n } = message.content;\n\n const fullVideo = video || getMessageWebPageVideo(message);\n\n if (sticker && target === 'inline' && sticker.isAnimated) {\n return ApiMediaFormat.Lottie;\n } else if (fullVideo && IS_PROGRESSIVE_SUPPORTED && (\n target === 'viewerFull' || target === 'inline'\n )) {\n return ApiMediaFormat.Progressive;\n } else if (audio || voice) {\n // Safari\n if (voice && !IS_OPUS_SUPPORTED) {\n return ApiMediaFormat.BlobUrl;\n }\n\n return ApiMediaFormat.Progressive;\n }\n\n return ApiMediaFormat.BlobUrl;\n}\n\nexport function getMessageFileName(message: ApiMessage) {\n const {\n photo, video, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n const webPageVideo = getMessageWebPageVideo(message);\n\n if (photo || webPagePhoto) {\n return `photo${message.date}.jpeg`;\n }\n\n const { fileName } = video || webPageVideo || document || {};\n\n return fileName;\n}\n\nexport function getMessageFileSize(message: ApiMessage) {\n const { video, document } = message.content;\n const webPageVideo = getMessageWebPageVideo(message);\n const { size } = video || webPageVideo || document || {};\n\n return size;\n}\n\nexport function hasMessageLocalBlobUrl(message: ApiMessage) {\n const { photo, video, document } = message.content;\n\n return (photo && photo.blobUrl) || (video && video.blobUrl) || (document && document.previewBlobUrl);\n}\n\nexport function getChatMediaMessageIds(\n messages: Record, listedIds: number[], isFromSharedMedia = false,\n) {\n const ids = getMessageContentIds(messages, listedIds, isFromSharedMedia ? 'media' : 'inlineMedia');\n\n return isFromSharedMedia ? ids.reverse() : ids;\n}\n\nexport function getPhotoFullDimensions(photo: ApiPhoto): ApiDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'z')\n || photo.sizes.find((size) => size.type === 'y')\n || getPhotoInlineDimensions(photo)\n );\n}\n\nexport function getPhotoInlineDimensions(photo: ApiPhoto): ApiDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'x')\n || photo.sizes.find((size) => size.type === 'm')\n || photo.sizes.find((size) => size.type === 's')\n || photo.thumbnail\n );\n}\n\nexport function getVideoDimensions(video: ApiVideo): ApiDimensions | undefined {\n if (video.width && video.height) {\n return video as ApiDimensions;\n }\n\n return undefined;\n}\n\nexport function getMediaTransferState(message: ApiMessage, progress?: number, isDownloadNeeded = false) {\n const isUploading = isMessageLocal(message);\n const isTransferring = isUploading || isDownloadNeeded;\n const transferProgress = Number(progress);\n\n return {\n isUploading, isTransferring, transferProgress,\n };\n}\n\nexport function getMessageContentIds(\n messages: Record, messageIds: number[], contentType: ApiMessageSearchType | 'inlineMedia',\n) {\n let validator: Function;\n\n switch (contentType) {\n case 'media':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return getMessagePhoto(message) || (video && !video.isRound && !video.isGif);\n };\n break;\n\n case 'documents':\n validator = getMessageDocument;\n break;\n\n case 'links':\n validator = (message: ApiMessage) => getMessageWebPage(message) || matchLinkInMessageText(message);\n break;\n\n case 'audio':\n validator = getMessageAudio;\n break;\n\n case 'inlineMedia':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return (\n getMessagePhoto(message)\n || (video && !video.isRound && !video.isGif)\n || isMessageDocumentPhoto(message)\n || isMessageDocumentVideo(message)\n );\n };\n break;\n\n default:\n return [] as Array;\n }\n\n return messageIds.reduce((result, messageId) => {\n if (messages[messageId] && validator(messages[messageId])) {\n result.push(messageId);\n }\n\n return result;\n }, [] as Array);\n}\n\nexport function getMediaDuration(message: ApiMessage) {\n const { audio, voice, video } = getMessageContent(message);\n const media = audio || voice || video || getMessageWebPageVideo(message);\n if (!media) {\n return undefined;\n }\n\n return media.duration;\n}\n","export function buildChatThreadKey(chatId: number, threadId: number) {\n return `${chatId}_${threadId}`;\n}\n","import Worker from 'worker-loader!./worker';\n\nimport { ApiInitialArgs, ApiOnProgress, OnApiUpdate } from '../../types';\nimport { Methods, MethodArgs, MethodResponse } from '../methods/types';\nimport { WorkerMessageEvent, ThenArg, OriginRequest } from './types';\n\nimport { DEBUG } from '../../../config';\nimport generateIdFor from '../../../util/generateIdFor';\n\ntype RequestStates = {\n messageId: string;\n resolve: Function;\n reject: Function;\n callback?: AnyToVoidFunction;\n};\n\nlet worker: Worker;\nconst requestStates = new Map();\nconst requestStatesByCallback = new Map();\n\n// TODO Re-use `util/WorkerConnector.ts`\n\nexport function initApi(onUpdate: OnApiUpdate, initialArgs: ApiInitialArgs) {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD WORKER');\n }\n\n worker = new Worker();\n subscribeToWorker(onUpdate);\n }\n\n return makeRequest({\n type: 'initApi',\n args: [initialArgs],\n });\n}\n\nexport function callApi(fnName: T, ...args: MethodArgs) {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('API is not initialized');\n }\n\n return undefined;\n }\n\n return makeRequest({\n type: 'callMethod',\n name: fnName,\n args,\n }) as MethodResponse;\n}\n\nexport function cancelApiProgress(progressCallback: ApiOnProgress) {\n progressCallback.isCanceled = true;\n\n const { messageId } = requestStatesByCallback.get(progressCallback) || {};\n if (!messageId) {\n return;\n }\n\n worker.postMessage({\n type: 'cancelProgress',\n messageId,\n });\n}\n\nfunction subscribeToWorker(onUpdate: OnApiUpdate) {\n worker.addEventListener('message', ({ data }: WorkerMessageEvent) => {\n if (data.type === 'update') {\n onUpdate(data.update);\n } else if (data.type === 'methodResponse') {\n const requestState = requestStates.get(data.messageId);\n if (requestState) {\n if (data.error) {\n requestState.reject(data.error);\n } else {\n requestState.resolve(data.response);\n }\n }\n } else if (data.type === 'methodCallback') {\n const requestState = requestStates.get(data.messageId);\n if (requestState && requestState.callback) {\n requestState.callback(...data.callbackArgs);\n }\n } else if (data.type === 'unhandledError') {\n throw data.error;\n }\n });\n}\n\nfunction makeRequest(message: OriginRequest) {\n const messageId = generateIdFor(requestStates);\n const payload: OriginRequest = {\n messageId,\n ...message,\n };\n\n const requestState = { messageId } as RequestStates;\n\n // Re-wrap type because of `postMessage`\n const promise: Promise>> = new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n });\n\n if (typeof payload.args[1] === 'function') {\n const callback = payload.args.pop() as AnyToVoidFunction;\n requestState.callback = callback;\n requestStatesByCallback.set(callback, requestState);\n }\n\n requestStates.set(messageId, requestState);\n promise\n .catch(() => undefined)\n .finally(() => {\n requestStates.delete(messageId);\n\n if (requestState.callback) {\n requestStatesByCallback.delete(requestState.callback);\n }\n });\n\n worker.postMessage(payload);\n\n return promise;\n}\n","let isWebpSupportedCache: boolean | undefined;\n\nexport function isWebpSupported() {\n return Boolean(isWebpSupportedCache);\n}\n\nfunction testWebp(): Promise {\n return new Promise((resolve) => {\n const webp = new Image();\n // eslint-disable-next-line max-len\n webp.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n const handleLoadOrError = () => {\n resolve(webp.height === 2);\n };\n webp.onload = handleLoadOrError;\n webp.onerror = handleLoadOrError;\n });\n}\n\ntestWebp().then((hasWebp) => {\n isWebpSupportedCache = hasWebp;\n});\n","import { ThemeKey } from '../types';\n\nlet systemThemeCache: ThemeKey = (\n window && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches\n) ? 'dark' : 'light';\n\nexport function getSystemTheme() {\n return systemThemeCache;\n}\n\nfunction handleSystemThemeChange(e: MediaQueryListEventMap['change']) {\n systemThemeCache = e.matches ? 'dark' : 'light';\n}\n\nconst mql = window.matchMedia('(prefers-color-scheme: dark)');\nif (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handleSystemThemeChange);\n} else if (typeof mql.addListener === 'function') {\n mql.addListener(handleSystemThemeChange);\n}\n","import {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n IS_TEST,\n} from '../config';\n\nexport * from './environmentWebp';\n\nexport * from './environmentSystemTheme';\n\nexport function getPlatform() {\n const { userAgent, platform } = window.navigator;\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os: 'macOS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined;\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'macOS';\n } else if (iosPlatforms.indexOf(platform) !== -1) {\n os = 'iOS';\n } else if (windowsPlatforms.indexOf(platform) !== -1) {\n os = 'Windows';\n } else if (/Android/.test(userAgent)) {\n os = 'Android';\n } else if (/Linux/.test(platform)) {\n os = 'Linux';\n }\n\n return os;\n}\n\nexport const PLATFORM_ENV = getPlatform();\nexport const IS_MAC_OS = PLATFORM_ENV === 'macOS';\nexport const IS_IOS = PLATFORM_ENV === 'iOS';\nexport const IS_ANDROID = PLATFORM_ENV === 'Android';\nexport const IS_SAFARI = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\nexport const IS_PWA = window.matchMedia('(display-mode: standalone)').matches\n|| (window.navigator as any).standalone\n|| document.referrer.includes('android-app://');\n\nexport const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches;\n// Keep in mind the landscape orientation\nexport const IS_SINGLE_COLUMN_LAYOUT = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || (\n window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n);\n// Special layout, 1 column while chat opened, 2 columns while collapsed\nexport const IS_TABLET_COLUMN_LAYOUT = !IS_SINGLE_COLUMN_LAYOUT && (\n window.innerWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n);\nexport const IS_VOICE_RECORDING_SUPPORTED = (navigator.mediaDevices && 'getUserMedia' in navigator.mediaDevices && (\n window.AudioContext || (window as any).webkitAudioContext\n));\nexport const IS_SMOOTH_SCROLL_SUPPORTED = 'scrollBehavior' in document.documentElement.style;\nexport const IS_EMOJI_SUPPORTED = PLATFORM_ENV && (IS_MAC_OS || IS_IOS);\nexport const IS_SERVICE_WORKER_SUPPORTED = 'serviceWorker' in navigator;\n// TODO Consider failed service worker\nexport const IS_PROGRESSIVE_SUPPORTED = IS_SERVICE_WORKER_SUPPORTED;\nexport const IS_STREAMING_SUPPORTED = 'MediaSource' in window;\nexport const IS_OPUS_SUPPORTED = Boolean((new Audio()).canPlayType('audio/ogg; codecs=opus'));\nexport const IS_CANVAS_FILTER_SUPPORTED = (\n !IS_TEST && 'filter' in (document.createElement('canvas').getContext('2d') || {})\n);\nexport const LAYERS_ANIMATION_NAME = IS_ANDROID ? 'slide-fade' : IS_IOS ? 'slide-layers' : 'push-slide';\n\nexport const DPR = window.devicePixelRatio || 1;\n\nexport const MASK_IMAGE_DISABLED = true;\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nexport function selectUser(global: GlobalState, userId: number): ApiUser | undefined {\n return global.users.byId[userId];\n}\n\nexport function selectIsUserBlocked(global: GlobalState, userId: number) {\n const user = selectUser(global, userId);\n\n return user && user.fullInfo && user.fullInfo.isBlocked;\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectUserByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.users.byId).find(\n (user) => user.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectIsUserOrChatContact(global: GlobalState, userOrChat: ApiUser | ApiChat) {\n return global.contactList && global.contactList.userIds.includes(userOrChat.id);\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectNotifySettings(global: GlobalState) {\n return global.settings.byKey;\n}\n\nexport function selectNotifyExceptions(global: GlobalState) {\n return global.settings.notifyExceptions;\n}\n","import { ApiChat, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalState } from '../../global/types';\n\nimport {\n getPrivateChatUserId, isChatChannel, isChatPrivate, isHistoryClearMessage, isUserBot, isUserOnline, selectIsChatMuted,\n} from '../helpers';\nimport { selectUser } from './users';\nimport { ALL_FOLDER_ID, ARCHIVED_FOLDER_ID, MEMBERS_LOAD_SLICE } from '../../config';\nimport { selectNotifyExceptions, selectNotifySettings } from './settings';\n\nexport function selectChat(global: GlobalState, chatId: number): ApiChat | undefined {\n return global.chats.byId[chatId];\n}\n\nexport function selectChatUser(global: GlobalState, chat: ApiChat) {\n const userId = getPrivateChatUserId(chat);\n if (!userId) {\n return false;\n }\n\n return selectUser(global, userId);\n}\n\nexport function selectIsChatWithSelf(global: GlobalState, chatId: number) {\n return chatId === global.currentUserId;\n}\n\nexport function selectIsChatWithBot(global: GlobalState, chat: ApiChat) {\n const user = selectChatUser(global, chat);\n return user && isUserBot(user);\n}\n\nexport function selectSupportChat(global: GlobalState) {\n return Object.values(global.chats.byId).find(({ isSupport }: ApiChat) => isSupport);\n}\n\nexport function selectChatOnlineCount(global: GlobalState, chat: ApiChat) {\n if (isChatPrivate(chat.id) || isChatChannel(chat) || !chat.fullInfo) {\n return undefined;\n }\n\n if (!chat.fullInfo.members || chat.fullInfo.members.length === MEMBERS_LOAD_SLICE) {\n return chat.fullInfo.onlineCount;\n }\n\n return chat.fullInfo.members.reduce((onlineCount, { userId }) => {\n if (global.users.byId[userId] && isUserOnline(global.users.byId[userId]) && userId !== global.currentUserId) {\n return onlineCount + 1;\n }\n\n return onlineCount;\n }, 0);\n}\n\nexport function selectChatBot(global: GlobalState, chatId: number) {\n const chat = selectChat(global, chatId);\n const userId = chat && getPrivateChatUserId(chat);\n const user = userId && selectUser(global, userId);\n if (!user || !isUserBot(user)) {\n return undefined;\n }\n\n return user;\n}\n\nexport function selectIsChatBotNotStarted(global: GlobalState, chatId: number) {\n const chat = selectChat(global, chatId);\n const bot = selectChatBot(global, chatId);\n if (!chat || !bot) {\n return false;\n }\n\n if (chat.lastMessage && isHistoryClearMessage(chat.lastMessage)) {\n return true;\n }\n\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return false;\n }\n\n const { listedIds } = messageInfo.threadsById[MAIN_THREAD_ID] || {};\n return listedIds && !listedIds.length;\n}\n\nexport function selectAreActiveChatsLoaded(global: GlobalState): boolean {\n return Boolean(global.chats.listIds.active);\n}\n\nexport function selectIsChatListed(global: GlobalState, chatId: number, type?: 'active' | 'archived'): boolean {\n const { listIds } = global.chats;\n if (type) {\n const targetList = listIds[type];\n return Boolean(targetList && targetList.includes(chatId));\n }\n\n return Object.values(listIds).some((list) => list && list.includes(chatId));\n}\n\nexport function selectChatListType(global: GlobalState, chatId: number): 'active' | 'archived' | undefined {\n const chat = selectChat(global, chatId);\n if (!chat || !selectIsChatListed(global, chatId)) {\n return undefined;\n }\n\n return chat.folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n}\n\nexport function selectChatFolder(global: GlobalState, folderId: number) {\n return global.chatFolders.byId[folderId];\n}\n\nexport function selectTotalChatCount(global: GlobalState, listType: 'active' | 'archived'): number {\n const { totalCount } = global.chats;\n const allChatsCount = totalCount.all;\n const archivedChatsCount = totalCount.archived || 0;\n\n if (listType === 'archived') {\n return archivedChatsCount;\n }\n\n return allChatsCount ? allChatsCount - archivedChatsCount : 0;\n}\n\nexport function selectIsChatPinned(global: GlobalState, chatId: number, folderId = ALL_FOLDER_ID): boolean {\n const { active, archived } = global.chats.orderedPinnedIds;\n\n if (folderId === ALL_FOLDER_ID) {\n return !!active && active.includes(chatId);\n }\n\n if (folderId === ARCHIVED_FOLDER_ID) {\n return !!archived && archived.includes(chatId);\n }\n\n const { byId: chatFoldersById } = global.chatFolders;\n\n const { pinnedChatIds } = chatFoldersById[folderId] || {};\n return !!pinnedChatIds && pinnedChatIds.includes(chatId);\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectChatByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.chats.byId).find(\n (chat) => chat.username && chat.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectCountNotMutedUnread(global: GlobalState) {\n const activeChatIds = global.chats.listIds.active;\n if (!activeChatIds) {\n return 0;\n }\n\n const chats = global.chats.byId;\n\n return activeChatIds.reduce((acc, chatId) => {\n const chat = chats[chatId];\n\n if (\n chat\n && chat.unreadCount\n && !selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global))\n ) {\n return acc + chat.unreadCount;\n }\n\n return acc;\n }, 0);\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiSticker } from '../../api/types';\n\nexport function selectIsStickerFavorite(global: GlobalState, sticker: ApiSticker) {\n const { stickers } = global.stickers.favorite;\n return stickers && stickers.some(({ id }) => id === sticker.id);\n}\n\nexport function selectCurrentStickerSearch(global: GlobalState) {\n return global.stickers.search;\n}\n\nexport function selectCurrentGifSearch(global: GlobalState) {\n return global.gifs.search;\n}\n\nexport function selectStickerSet(global: GlobalState, id: string) {\n return global.stickers.setsById[id];\n}\n\nexport function selectStickersForEmoji(global: GlobalState, emoji: string) {\n const stickerSets = Object.values(global.stickers.setsById);\n let stickersForEmoji: ApiSticker[] = [];\n stickerSets.forEach(({ packs }) => {\n if (!packs) {\n return;\n }\n const stickers = packs[emoji];\n if (stickers) {\n stickersForEmoji = stickersForEmoji.concat(stickers);\n }\n });\n return stickersForEmoji;\n}\n\nexport function selectAnimatedEmoji(global: GlobalState, emoji: string) {\n const { animatedEmojis } = global;\n if (!animatedEmojis || !animatedEmojis.stickers) {\n return undefined;\n }\n\n // Some emojis (❤️ for example) with a service symbol 'VARIATION SELECTOR-16' are not recognized as animated\n const cleanedEmoji = emoji.replace('\\ufe0f', '');\n\n return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\n}\n","import { GlobalState, MessageListType, Thread } from '../../global/types';\nimport {\n ApiChat,\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { LOCAL_MESSAGE_ID_BASE } from '../../config';\nimport {\n selectChat, selectIsChatWithBot, selectIsChatWithSelf,\n} from './chats';\nimport { selectIsUserOrChatContact, selectUser } from './users';\nimport {\n getSendingState,\n isChatChannel,\n isMessageLocal,\n isChatPrivate,\n isForwardedMessage,\n getCanPostInChat,\n isUserRightBanned,\n getHasAdminRight,\n isChatBasicGroup,\n isCommonBoxChat,\n isServiceNotificationMessage,\n isOwnMessage,\n isActionMessage,\n isChatGroup,\n isChatSuperGroup,\n getMessageVideo,\n getMessageWebPageVideo,\n} from '../helpers';\nimport { findLast } from '../../util/iteratees';\nimport { selectIsStickerFavorite } from './symbols';\n\nconst MESSAGE_EDIT_ALLOWED_TIME_MS = 172800000; // 48 hours\n\nexport function selectCurrentMessageList(global: GlobalState) {\n const { messageLists } = global.messages;\n\n if (messageLists.length) {\n return messageLists[messageLists.length - 1];\n }\n\n return undefined;\n}\n\nexport function selectCurrentChat(global: GlobalState) {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n return chatId ? selectChat(global, chatId) : undefined;\n}\n\nexport function selectChatMessages(global: GlobalState, chatId: number) {\n const messages = global.messages.byChatId[chatId];\n\n return messages ? messages.byId : undefined;\n}\n\nexport function selectScheduledMessages(global: GlobalState, chatId: number) {\n const messages = global.scheduledMessages.byChatId[chatId];\n\n return messages ? messages.byId : undefined;\n}\n\nexport function selectThreadParam(\n global: GlobalState,\n chatId: number,\n threadId: number,\n key: K,\n) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const thread = messageInfo.threadsById[threadId];\n if (!thread) {\n return undefined;\n }\n\n return thread[key];\n}\n\nexport function selectListedIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'listedIds');\n}\n\nexport function selectOutlyingIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'outlyingIds');\n}\n\nexport function selectCurrentMessageIds(\n global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType,\n) {\n switch (messageListType) {\n case 'thread':\n return selectViewportIds(global, chatId, threadId);\n case 'pinned':\n return selectPinnedIds(global, chatId);\n case 'scheduled':\n return selectScheduledIds(global, chatId);\n }\n\n return undefined;\n}\n\nexport function selectViewportIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'viewportIds');\n}\n\nexport function selectPinnedIds(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds');\n}\n\nexport function selectScheduledIds(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds');\n}\n\nexport function selectScrollOffset(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'scrollOffset');\n}\n\nexport function selectReplyingToId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyingToId');\n}\n\nexport function selectEditingId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'editingId');\n}\n\nexport function selectEditingScheduledId(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'editingScheduledId');\n}\n\nexport function selectDraft(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'draft');\n}\n\nexport function selectNoWebPage(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'noWebPage');\n}\n\nexport function selectThreadInfo(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'threadInfo');\n}\n\nexport function selectFirstMessageId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'firstMessageId');\n}\n\nexport function selectReplyStack(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyStack');\n}\n\nexport function selectThreadOriginChat(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return selectChat(global, chatId);\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return selectChat(global, threadInfo.originChannelId || chatId);\n}\n\nexport function selectThreadTopMessageId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return undefined;\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return threadInfo.topMessageId;\n}\n\nexport function selectThreadByMessage(global: GlobalState, chatId: number, message: ApiMessage) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const { replyToMessageId, replyToTopMessageId } = message;\n if (!replyToMessageId && !replyToTopMessageId) {\n return undefined;\n }\n\n return Object.values(messageInfo.threadsById).find((thread) => {\n return thread.threadInfo && (\n (replyToMessageId && replyToMessageId === thread.threadInfo.topMessageId)\n || (replyToTopMessageId && replyToTopMessageId === thread.threadInfo.topMessageId)\n );\n });\n}\n\nexport function isMessageInCurrentMessageList(global: GlobalState, chatId: number, message: ApiMessage) {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return false;\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n return (\n chatId === currentMessageList.chatId\n && (\n (currentMessageList.threadId === MAIN_THREAD_ID)\n || (threadInfo && currentMessageList.threadId === threadInfo.threadId)\n )\n );\n}\n\nexport function selectIsViewportNewest(global: GlobalState, chatId: number, threadId: number) {\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!viewportIds || !viewportIds.length) {\n return true;\n }\n\n let lastMessageId: number;\n\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.lastMessage) {\n return true;\n }\n\n lastMessageId = chat.lastMessage.id;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo || !threadInfo.lastMessageId) {\n return undefined;\n }\n\n lastMessageId = threadInfo.lastMessageId;\n }\n\n // Edge case: outgoing `lastMessage` is updated with a delay to optimize animation\n if (lastMessageId >= LOCAL_MESSAGE_ID_BASE && !selectChatMessage(global, chatId, lastMessageId)) {\n return true;\n }\n\n return viewportIds[viewportIds.length - 1] >= lastMessageId;\n}\n\nexport function selectChatMessage(global: GlobalState, chatId: number, messageId: number) {\n const chatMessages = selectChatMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectScheduledMessage(global: GlobalState, chatId: number, messageId: number) {\n const chatMessages = selectScheduledMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectEditingMessage(\n global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType,\n) {\n if (messageListType === 'scheduled') {\n const messageId = selectEditingScheduledId(global, chatId);\n return messageId ? selectScheduledMessage(global, chatId, messageId) : undefined;\n } else {\n const messageId = selectEditingId(global, chatId, threadId);\n return messageId ? selectChatMessage(global, chatId, messageId) : undefined;\n }\n}\n\nexport function selectChatMessageByPollId(global: GlobalState, pollId: string) {\n let messageWithPoll: ApiMessage | undefined;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const chatMessages of Object.values(global.messages.byChatId)) {\n const { byId } = chatMessages;\n messageWithPoll = Object.values(byId).find((message) => {\n return message.content.poll && message.content.poll.id === pollId;\n });\n if (messageWithPoll) {\n break;\n }\n }\n\n return messageWithPoll;\n}\n\nexport function selectFocusedMessageId(global: GlobalState, chatId: number) {\n const { chatId: focusedChatId, messageId } = global.focusedMessage || {};\n\n return focusedChatId === chatId ? messageId : undefined;\n}\n\nexport function selectIsMessageFocused(global: GlobalState, message: ApiMessage) {\n const focusedId = selectFocusedMessageId(global, message.chatId);\n\n return focusedId ? focusedId === message.id || focusedId === message.previousLocalId : false;\n}\n\nexport function selectIsMessageUnread(global: GlobalState, message: ApiMessage) {\n const { lastReadOutboxMessageId } = selectChat(global, message.chatId) || {};\n return isMessageLocal(message) || !lastReadOutboxMessageId || lastReadOutboxMessageId < message.id;\n}\n\nexport function selectOutgoingStatus(\n global: GlobalState, message: ApiMessage, isScheduledList = false,\n): ApiMessageOutgoingStatus {\n if (!selectIsMessageUnread(global, message) && !isScheduledList) {\n return 'read';\n }\n\n return getSendingState(message);\n}\n\nexport function selectSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n return senderId > 0 ? selectUser(global, senderId) : selectChat(global, senderId);\n}\n\nexport function selectForwardedSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { forwardInfo } = message;\n if (!forwardInfo) {\n return undefined;\n }\n\n if (forwardInfo.isChannelPost && forwardInfo.fromChatId) {\n return selectChat(global, forwardInfo.fromChatId);\n } else if (forwardInfo.senderUserId) {\n return selectUser(global, forwardInfo.senderUserId);\n }\n\n return undefined;\n}\n\nexport function selectAllowedMessageActions(global: GlobalState, message: ApiMessage, threadId: number) {\n const { serverTimeOffset } = global;\n const chat = selectChat(global, message.chatId);\n if (!chat || chat.isRestricted) {\n return {};\n }\n\n const isPrivate = isChatPrivate(chat.id);\n const isChatWithSelf = selectIsChatWithSelf(global, message.chatId);\n const isBasicGroup = isChatBasicGroup(chat);\n const isSuperGroup = isChatSuperGroup(chat);\n const isChannel = isChatChannel(chat);\n const isServiceNotification = isServiceNotificationMessage(message);\n\n const isOwn = isOwnMessage(message);\n const isAction = isActionMessage(message);\n const { content } = message;\n const canEditMessagesIndefinitely = isChatWithSelf\n || (isSuperGroup && getHasAdminRight(chat, 'pinMessages'))\n || (isChannel && getHasAdminRight(chat, 'editMessages'));\n const isMessageEditable = (\n (canEditMessagesIndefinitely\n || Date.now() + serverTimeOffset * 1000 - message.date * 1000 < MESSAGE_EDIT_ALLOWED_TIME_MS)\n && !(\n content.sticker || content.contact || content.poll || content.action || content.audio\n || (content.video && content.video.isRound)\n )\n && !isForwardedMessage(message)\n && !message.viaBotId\n );\n\n const canReply = getCanPostInChat(chat, threadId) && !isServiceNotification;\n\n const hasPinPermission = isPrivate || (\n chat.isCreator\n || (!isChannel && !isUserRightBanned(chat, 'pinMessages'))\n || getHasAdminRight(chat, 'pinMessages')\n );\n\n let canPin = !isAction && hasPinPermission;\n let canUnpin = false;\n\n const pinnedMessageIds = selectPinnedIds(global, chat.id);\n\n if (canPin) {\n canUnpin = Boolean(pinnedMessageIds && pinnedMessageIds.includes(message.id));\n canPin = !canUnpin;\n }\n\n const canDelete = isPrivate\n || isOwn\n || isBasicGroup\n || chat.isCreator\n || getHasAdminRight(chat, 'deleteMessages');\n\n const canReport = !isPrivate && !isOwn;\n\n const canDeleteForAll = canDelete && !isServiceNotification && (\n (isPrivate && !isChatWithSelf)\n || (isBasicGroup && (\n isOwn || getHasAdminRight(chat, 'deleteMessages') || chat.isCreator\n ))\n );\n\n const canEdit = !isAction && isMessageEditable && (\n isOwn\n || (isChannel && (chat.isCreator || getHasAdminRight(chat, 'editMessages')))\n );\n\n const canForward = !isAction && !isServiceNotification;\n\n const hasSticker = Boolean(message.content.sticker);\n const hasFavoriteSticker = hasSticker && selectIsStickerFavorite(global, message.content.sticker!);\n const canFaveSticker = !isAction && hasSticker && !hasFavoriteSticker;\n const canUnfaveSticker = !isAction && hasFavoriteSticker;\n const canCopy = !isAction;\n const canCopyLink = !isAction && (isChannel || isSuperGroup);\n const canSelect = !isAction;\n const noOptions = [\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n ].every((ability) => !ability);\n\n return {\n noOptions,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n };\n}\n\n// This selector always returns a new object which can not be safely used in shallow-equal checks\nexport function selectCanDeleteSelectedMessages(global: GlobalState) {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chatMessages = chatId && selectChatMessages(global, chatId);\n if (!chatMessages || !selectedMessageIds || !threadId) {\n return {};\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return {\n canDelete: messageActions.every((actions) => actions.canDelete),\n canDeleteForAll: messageActions.every((actions) => actions.canDeleteForAll),\n };\n}\n\nexport function selectCanReportSelectedMessages(global: GlobalState) {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chatMessages = chatId && selectChatMessages(global, chatId);\n if (!chatMessages || !selectedMessageIds || !threadId) {\n return false;\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return messageActions.every((actions) => actions.canReport);\n}\n\nexport function selectUploadProgress(global: GlobalState, message: ApiMessage) {\n const fileTransfer = global.fileUploads.byMessageLocalId[message.previousLocalId || message.id];\n\n return fileTransfer ? fileTransfer.progress : undefined;\n}\n\nexport function selectRealLastReadId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n // `lastReadInboxMessageId` is empty for new chats\n if (!chat.lastReadInboxMessageId) {\n return undefined;\n }\n\n if (!chat.lastMessage) {\n return chat.lastReadInboxMessageId;\n }\n\n if (isMessageLocal(chat.lastMessage)) {\n return chat.lastMessage.id;\n }\n\n // Some previously read messages may be deleted\n return Math.min(chat.lastMessage.id, chat.lastReadInboxMessageId);\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n if (!threadInfo.lastReadInboxMessageId) {\n return threadInfo.topMessageId;\n }\n\n // Some previously read messages may be deleted\n return Math.min(threadInfo.lastReadInboxMessageId, threadInfo.lastMessageId || Infinity);\n }\n}\n\nexport function selectFirstUnreadId(global: GlobalState, chatId: number, threadId: number) {\n const chat = selectChat(global, chatId);\n\n if (threadId === MAIN_THREAD_ID) {\n if (!chat) {\n return undefined;\n }\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo || threadInfo.lastMessageId === threadInfo.lastReadInboxMessageId) {\n return undefined;\n }\n }\n\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const listedIds = selectListedIds(global, chatId, threadId);\n const byId = selectChatMessages(global, chatId);\n if (!byId || !(outlyingIds || listedIds)) {\n return undefined;\n }\n\n const lastReadId = selectRealLastReadId(global, chatId, threadId);\n if (!lastReadId && chat && chat.isNotJoined) {\n return undefined;\n }\n\n if (outlyingIds) {\n const found = !lastReadId ? outlyingIds[0] : outlyingIds.find((id) => {\n return id > lastReadId && byId[id] && (!byId[id].isOutgoing || byId[id].isFromScheduled);\n });\n if (found) {\n return found;\n }\n }\n\n if (listedIds) {\n const found = !lastReadId ? listedIds[0] : listedIds.find((id) => {\n return id > lastReadId && byId[id] && (!byId[id].isOutgoing || byId[id].isFromScheduled);\n });\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nexport function selectIsPollResultsOpen(global: GlobalState) {\n const { pollResults } = global;\n return Boolean(pollResults.messageId);\n}\n\nexport function selectIsForwardModalOpen(global: GlobalState) {\n const { forwardMessages } = global;\n return Boolean(forwardMessages.isModalShown);\n}\n\nexport function selectCommonBoxChatId(global: GlobalState, messageId: number) {\n const fromLastMessage = Object.values(global.chats.byId).find((chat) => (\n isCommonBoxChat(chat) && chat.lastMessage && chat.lastMessage.id === messageId\n ));\n if (fromLastMessage) {\n return fromLastMessage.id;\n }\n\n const { byChatId } = global.messages;\n return Number(Object.keys(byChatId).find((chatId) => {\n const chat = selectChat(global, Number(chatId));\n return chat && isCommonBoxChat(chat) && byChatId[chat.id].byId[messageId];\n }));\n}\n\nexport function selectIsInSelectMode(global: GlobalState) {\n const { selectedMessages } = global;\n\n return Boolean(selectedMessages);\n}\n\nexport function selectIsMessageSelected(global: GlobalState, messageId: number) {\n const { messageIds } = global.selectedMessages || {};\n if (!messageIds) {\n return false;\n }\n\n return messageIds.includes(messageId);\n}\n\nexport function selectForwardedMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.values(chatMessages)\n .filter((message) => message.groupedId === groupedId && message.forwardInfo)\n .map(({ forwardInfo }) => forwardInfo!.fromMessageId);\n}\n\nexport function selectMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.keys(chatMessages)\n .map(Number)\n .filter((id) => chatMessages[id].groupedId === groupedId);\n}\n\nexport function selectIsDocumentGroupSelected(global: GlobalState, chatId: number, groupedId: string) {\n const { messageIds: selectedIds } = global.selectedMessages || {};\n if (!selectedIds) {\n return false;\n }\n\n const groupIds = selectMessageIdsByGroupId(global, chatId, groupedId);\n return groupIds && groupIds.every((id) => selectedIds.includes(id));\n}\n\nexport function selectSelectedMessagesCount(global: GlobalState) {\n const { messageIds } = global.selectedMessages || {};\n\n return messageIds ? messageIds.length : 0;\n}\n\nexport function selectNewestMessageWithBotKeyboardButtons(\n global: GlobalState, chatId: number,\n): ApiMessage | undefined {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (!selectIsChatWithBot(global, chat)) {\n return undefined;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, MAIN_THREAD_ID);\n if (!chatMessages || !viewportIds) {\n return undefined;\n }\n\n const messageId = findLast(viewportIds, (id) => {\n return !chatMessages[id].isOutgoing && Boolean(chatMessages[id].keyboardButtons);\n });\n\n const replyHideMessageId = findLast(viewportIds, (id) => {\n return Boolean(chatMessages[id].shouldHideKeyboardButtons);\n });\n\n if (messageId && replyHideMessageId && replyHideMessageId > messageId) {\n return undefined;\n }\n\n return messageId ? chatMessages[messageId] : undefined;\n}\n\nexport function selectShouldAutoLoadMedia(\n global: GlobalState, message: ApiMessage, chat: ApiChat, sender?: ApiChat | ApiUser,\n) {\n const {\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n } = global.settings.byKey;\n\n return Boolean(\n (shouldAutoDownloadMediaInPrivateChats && isChatPrivate(chat.id))\n || (shouldAutoDownloadMediaInGroups && isChatGroup(chat))\n || (shouldAutoDownloadMediaInChannels && isChatChannel(chat))\n || (shouldAutoDownloadMediaFromContacts && sender && (\n sender.id === global.currentUserId\n || selectIsUserOrChatContact(global, sender)\n )),\n );\n}\n\nexport function selectShouldAutoPlayMedia(global: GlobalState, message: ApiMessage) {\n const video = getMessageVideo(message) || getMessageWebPageVideo(message);\n if (!video) {\n return undefined;\n }\n\n const {\n shouldAutoPlayVideos,\n shouldAutoPlayGifs,\n } = global.settings.byKey;\n\n const asGif = video.isGif || video.isRound;\n\n return (shouldAutoPlayVideos && !asGif) || (shouldAutoPlayGifs && asGif);\n}\n\nexport function selectShouldLoopStickers(global: GlobalState) {\n return global.settings.byKey.shouldLoopStickers;\n}\n","import { GlobalState } from '../../global/types';\nimport { selectCurrentMessageList } from './messages';\nimport { buildChatThreadKey } from '../helpers';\n\nexport function selectCurrentTextSearch(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const currentSearch = global.localTextSearch.byChatThreadKey[chatThreadKey];\n if (!currentSearch || !currentSearch.isActive) {\n return undefined;\n }\n\n return currentSearch;\n}\n\nexport function selectCurrentMediaSearchPeerId(global: GlobalState) {\n const { byChatId } = global.localMediaSearch;\n const { chatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = global.users.selectedId;\n\n return currentProfileUserId && byChatId[currentProfileUserId] ? currentProfileUserId : chatId;\n}\n\nexport function selectCurrentMediaSearch(global: GlobalState) {\n const peerId = selectCurrentMediaSearchPeerId(global);\n if (!peerId) {\n return undefined;\n }\n\n return global.localMediaSearch.byChatId[peerId];\n}\n","import { GlobalState } from '../../global/types';\n\nimport { selectCurrentMessageList } from './messages';\nimport { selectChat } from './chats';\nimport { isChatGroup, isChatPrivate } from '../helpers';\n\nexport function selectManagement(global: GlobalState, chatId: number) {\n return global.management.byChatId[chatId];\n}\n\nexport function selectCurrentManagement(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const currentManagement = global.management.byChatId[chatId];\n if (!currentManagement || !currentManagement.isActive) {\n return undefined;\n }\n\n return currentManagement;\n}\n\nexport function selectCurrentManagementType(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n if (isChatPrivate(chatId)) {\n return 'user';\n }\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (isChatGroup(chat)) {\n return 'group';\n }\n\n return 'channel';\n}\n","import { GlobalState } from '../../global/types';\nimport { NewChatMembersProgress, RightColumnContent } from '../../types';\n\nimport { getSystemTheme, IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { selectCurrentMessageList, selectIsPollResultsOpen } from './messages';\nimport { selectCurrentTextSearch } from './localSearch';\nimport { selectCurrentStickerSearch, selectCurrentGifSearch } from './symbols';\nimport { selectAreActiveChatsLoaded } from './chats';\nimport { selectCurrentManagement } from './management';\n\nexport function selectIsMediaViewerOpen(global: GlobalState) {\n const { mediaViewer } = global;\n return Boolean(mediaViewer.messageId || mediaViewer.avatarOwnerId);\n}\n\nexport function selectRightColumnContentKey(global: GlobalState) {\n const {\n users,\n isChatInfoShown,\n newChatMembersProgress,\n } = global;\n\n const isAddingChatMembersShown = newChatMembersProgress !== NewChatMembersProgress.Closed;\n const isPollResults = selectIsPollResultsOpen(global);\n const isSearch = Boolean(!IS_SINGLE_COLUMN_LAYOUT && selectCurrentTextSearch(global));\n const isManagement = selectCurrentManagement(global);\n const stickerSearch = selectCurrentStickerSearch(global);\n const isStickerSearch = stickerSearch.query !== undefined;\n const gifSearch = selectCurrentGifSearch(global);\n const isGifSearch = gifSearch.query !== undefined;\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = users.selectedId;\n const areActiveChatsLoaded = selectAreActiveChatsLoaded(global);\n const isUserInfo = Boolean(currentProfileUserId && areActiveChatsLoaded);\n const isChatShown = Boolean(currentChatId && areActiveChatsLoaded);\n const isChatInfo = isChatShown && isChatInfoShown;\n\n return isPollResults ? (\n RightColumnContent.PollResults\n ) : isSearch ? (\n RightColumnContent.Search\n ) : isManagement ? (\n RightColumnContent.Management\n ) : isStickerSearch ? (\n RightColumnContent.StickerSearch\n ) : isGifSearch ? (\n RightColumnContent.GifSearch\n ) : isAddingChatMembersShown ? (\n RightColumnContent.AddingMembers\n ) : isUserInfo ? (\n RightColumnContent.UserInfo\n ) : isChatInfo ? (\n RightColumnContent.ChatInfo\n ) : undefined;\n}\n\nexport function selectIsRightColumnShown(global: GlobalState) {\n return selectRightColumnContentKey(global) !== undefined;\n}\n\nexport function selectTheme(global: GlobalState) {\n const { theme, shouldUseSystemTheme } = global.settings.byKey;\n\n return shouldUseSystemTheme ? getSystemTheme() : theme;\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectCurrentGlobalSearchQuery(global: GlobalState) {\n return global.globalSearch.query;\n}\n","\nimport { GlobalState } from '../../global/types';\n\nexport function selectPaymentMessageId(global: GlobalState) {\n return global.payment.messageId;\n}\n\nexport function selectPaymentRequestId(global: GlobalState) {\n return global.payment.formId;\n}\n\nexport function selectProviderPublishableKey(global: GlobalState) {\n return global.payment.nativeParams ? global.payment.nativeParams.publishableKey : undefined;\n}\n\nexport function selectStripeCredentials(global: GlobalState) {\n return global.payment.stripeCredentials;\n}\n","export * from './users';\nexport * from './chats';\nexport * from './messages';\nexport * from './updates';\nexport * from './media';\nexport * from './payments';\nexport * from './settings';\nexport * from './bots';\nexport * from './misc';\n","type Parts = (string | false | undefined)[];\n\nexport default (...parts: Parts) => {\n return parts.filter(Boolean).join(' ');\n};\n","type Scheduler =\n typeof requestAnimationFrame\n | typeof onTickEnd\n | typeof runNow;\n\nexport function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true,\n) {\n let waitingTimeout: number | undefined;\n\n return (...args: Parameters) => {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = undefined;\n } else if (shouldRunFirst) {\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\n // @ts-ignore\n fn(...args);\n }\n\n waitingTimeout = undefined;\n }, ms);\n };\n}\n\nexport function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n) {\n let interval: number | undefined;\n let isPending: boolean;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n interval = self.setInterval(() => {\n if (!isPending) {\n // eslint-disable-next-line no-restricted-globals\n self.clearInterval(interval!);\n interval = undefined;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n\nexport function throttleWithPrimaryRaf(fn: F) {\n return throttleWith(fastPrimaryRaf, fn);\n}\n\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function throttleWith(schedulerFn: Scheduler, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nexport function onIdle(cb: NoneToVoidFunction) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb);\n } else {\n onTickEnd(cb);\n }\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n}\n\nexport const pause = (ms: number) => new Promise((resolve) => {\n setTimeout(() => resolve(), ms);\n});\n\nexport function rafPromise() {\n return new Promise((resolve) => {\n fastRaf(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nlet fastRafPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\n// May result in an immediate execution if called from another `requestAnimationFrame` callback\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = isPrimary ? [] : [callback];\n fastRafPrimaryCallbacks = isPrimary ? [callback] : [];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n const currentPrimaryCallbacks = fastRafPrimaryCallbacks!;\n fastRafCallbacks = undefined;\n fastRafPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafPrimaryCallbacks!.push(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastPrimaryRaf(callback: NoneToVoidFunction) {\n fastRaf(callback, true);\n}\n\nlet beforeUnloadCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onBeforeUnload(callback: NoneToVoidFunction, isLast = false) {\n if (!beforeUnloadCallbacks) {\n beforeUnloadCallbacks = [];\n // eslint-disable-next-line no-restricted-globals\n self.addEventListener('beforeunload', () => {\n beforeUnloadCallbacks!.forEach((cb) => cb());\n });\n }\n\n if (isLast) {\n beforeUnloadCallbacks.push(callback);\n } else {\n beforeUnloadCallbacks.unshift(callback);\n }\n\n return () => {\n beforeUnloadCallbacks = beforeUnloadCallbacks!.filter((cb) => cb !== callback);\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiPhoto } from '../../api/types';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { omit } from '../../util/iteratees';\n\nexport function replaceChatListIds(\n global: GlobalState,\n type: 'active' | 'archived',\n newIds: number[] | undefined,\n): GlobalState {\n return {\n ...global,\n chats: {\n ...global.chats,\n listIds: {\n ...global.chats.listIds,\n [type]: newIds,\n },\n },\n };\n}\n\nexport function updateChatListIds(global: GlobalState, type: 'active' | 'archived', idsUpdate: number[]): GlobalState {\n const { [type]: listIds } = global.chats.listIds;\n const newIds = listIds && listIds.length\n ? idsUpdate.filter((id) => !listIds.includes(id))\n : idsUpdate;\n\n if (listIds && !newIds.length) {\n return global;\n }\n\n return replaceChatListIds(global, type, [\n ...(listIds || []),\n ...newIds,\n ]);\n}\n\nexport function replaceChats(global: GlobalState, newById: Record): GlobalState {\n return {\n ...global,\n chats: {\n ...global.chats,\n byId: newById,\n },\n };\n}\n\n// @optimization Don't spread/unspread global for each element, do it in a batch\nfunction getUpdatedChat(\n global: GlobalState, chatId: number, chatUpdate: Partial, photo?: ApiPhoto,\n): ApiChat {\n const { byId } = global.chats;\n const chat = byId[chatId];\n const shouldOmitMinInfo = chatUpdate.isMin && chat && !chat.isMin;\n const updatedChat = {\n ...chat,\n ...(shouldOmitMinInfo ? omit(chatUpdate, ['isMin', 'accessHash']) : chatUpdate),\n ...(photo && { photos: [photo, ...(chat.photos || [])] }),\n };\n\n if (!updatedChat.id || !updatedChat.type) {\n return updatedChat;\n }\n\n return updatedChat;\n}\n\nexport function updateChat(\n global: GlobalState, chatId: number, chatUpdate: Partial, photo?: ApiPhoto,\n): GlobalState {\n const { byId } = global.chats;\n\n const updatedChat = getUpdatedChat(global, chatId, chatUpdate, photo);\n\n return replaceChats(global, {\n ...byId,\n [chatId]: updatedChat,\n });\n}\n\nexport function updateChats(global: GlobalState, updatedById: Record): GlobalState {\n const updatedChats = Object.keys(updatedById).map(Number).reduce>((acc, id) => {\n const updatedChat = getUpdatedChat(global, id, updatedById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n }\n return acc;\n }, {});\n\n global = replaceChats(global, {\n ...global.chats.byId,\n ...updatedChats,\n });\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addChats(global: GlobalState, addedById: Record): GlobalState {\n const { byId } = global.chats;\n let isAdded = false;\n\n const addedChats = Object.keys(addedById).map(Number).reduce>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n const updatedChat = getUpdatedChat(global, id, addedById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n\n if (!isAdded) {\n isAdded = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (isAdded) {\n global = replaceChats(global, {\n ...global.chats.byId,\n ...addedChats,\n });\n }\n\n return global;\n}\n\nexport function updateChatListType(\n global: GlobalState,\n chatId: number,\n folderId?: number,\n): GlobalState {\n const listType = folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n\n let currentListIds = global.chats.listIds;\n (Object.keys(currentListIds) as Array).forEach((listTypeKey) => {\n const currentFolderList = currentListIds[listTypeKey] || [];\n if (listTypeKey === listType && !currentFolderList.includes(chatId)) {\n currentListIds = {\n ...currentListIds,\n [listTypeKey]: [...currentFolderList, chatId],\n };\n } else if (listTypeKey !== listType && currentFolderList.includes(chatId)) {\n currentListIds = {\n ...currentListIds,\n [listTypeKey]: currentFolderList.filter((id) => id !== chatId),\n };\n }\n });\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n listIds: currentListIds,\n },\n };\n\n global = updateChat(global, chatId, { folderId: folderId || undefined });\n\n return global;\n}\n\nexport function updateChatListSecondaryInfo(\n global: GlobalState,\n type: 'active' | 'archived',\n info: {\n orderedPinnedIds?: number[];\n totalChatCount: number;\n },\n): GlobalState {\n const totalCountKey = type === 'active' ? 'all' : 'archived';\n\n return {\n ...global,\n chats: {\n ...global.chats,\n ...(info.orderedPinnedIds && {\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [type]: info.orderedPinnedIds,\n },\n }),\n totalCount: {\n ...global.chats.totalCount,\n [totalCountKey]: info.totalChatCount,\n },\n isFullyLoaded: {\n ...global.chats.isFullyLoaded,\n [type]: false,\n },\n },\n };\n}\n","import {\n GlobalState, MessageList, MessageListType, Thread,\n} from '../../global/types';\nimport { ApiMessage, ApiThreadInfo, MAIN_THREAD_ID } from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport { IS_TEST, MESSAGE_LIST_SLICE, MESSAGE_LIST_VIEWPORT_LIMIT } from '../../config';\nimport {\n selectListedIds,\n selectChatMessages,\n selectViewportIds,\n selectOutlyingIds,\n selectPinnedIds,\n selectThreadInfo,\n selectMessageIdsByGroupId,\n selectScheduledMessages,\n selectScheduledIds,\n selectCurrentMessageIds,\n selectChatMessage,\n selectCurrentMessageList,\n} from '../selectors';\nimport {\n areSortedArraysEqual, omit, pickTruthy, unique,\n} from '../../util/iteratees';\n\nconst TMP_CHAT_ID = -1;\n\ntype MessageStoreSections = {\n byId: Record;\n threadsById: Record;\n};\n\nexport function updateCurrentMessageList(\n global: GlobalState,\n chatId: number | undefined,\n threadId: number = MAIN_THREAD_ID,\n type: MessageListType = 'thread',\n shouldReplaceHistory?: boolean,\n): GlobalState {\n const { messageLists } = global.messages;\n let newMessageLists: MessageList[] = messageLists;\n if (shouldReplaceHistory || IS_TEST) {\n newMessageLists = chatId ? [{ chatId, threadId, type }] : [];\n } else if (chatId) {\n const last = messageLists[messageLists.length - 1];\n if (!last || last.chatId !== chatId || last.threadId !== threadId || last.type !== type) {\n if (last && last.chatId === TMP_CHAT_ID) {\n newMessageLists = [...messageLists.slice(0, -1), { chatId, threadId, type }];\n } else {\n newMessageLists = [...messageLists, { chatId, threadId, type }];\n }\n }\n } else {\n newMessageLists = messageLists.slice(0, -1);\n }\n\n return {\n ...global,\n messages: {\n ...global.messages,\n messageLists: newMessageLists,\n },\n };\n}\n\nfunction replaceChatMessages(global: GlobalState, chatId: number, newById: Record): GlobalState {\n return updateMessageStore(global, chatId, {\n byId: newById,\n });\n}\n\nfunction updateThread(\n global: GlobalState, chatId: number, threadId: number, threadUpdate: Partial,\n): GlobalState {\n const current = global.messages.byChatId[chatId];\n\n return updateMessageStore(global, chatId, {\n threadsById: {\n ...(current && current.threadsById),\n [threadId]: {\n ...(current && current.threadsById[threadId]),\n ...threadUpdate,\n },\n },\n });\n}\n\nfunction updateMessageStore(\n global: GlobalState, chatId: number, update: Partial,\n): GlobalState {\n const current = global.messages.byChatId[chatId] || { byId: {}, threadsById: {} };\n\n return {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n ...global.messages.byChatId,\n [chatId]: {\n ...current,\n ...update,\n },\n },\n },\n };\n}\n\nexport function replaceThreadParam(\n global: GlobalState, chatId: number, threadId: number, paramName: T, newValue: Thread[T] | undefined,\n) {\n return updateThread(global, chatId, threadId, { [paramName]: newValue });\n}\n\nexport function addMessages(\n global: GlobalState, messages: ApiMessage[],\n): GlobalState {\n const addedByChatId = messages.reduce((messagesByChatId, message: ApiMessage) => {\n if (!messagesByChatId[message.chatId]) {\n messagesByChatId[message.chatId] = {};\n }\n messagesByChatId[message.chatId][message.id] = message;\n\n return messagesByChatId;\n }, {} as Record>);\n\n Object.keys(addedByChatId).map(Number).forEach((chatId) => {\n global = addChatMessagesById(global, chatId, addedByChatId[chatId]);\n });\n\n return global;\n}\n\nexport function addChatMessagesById(\n global: GlobalState, chatId: number, newById: Record,\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n\n if (byId && Object.keys(newById).every((newId) => Boolean(byId[Number(newId)]))) {\n return global;\n }\n\n return replaceChatMessages(global, chatId, {\n ...newById,\n ...byId,\n });\n}\n\nexport function updateChatMessage(\n global: GlobalState, chatId: number, messageId: number, messageUpdate: Partial,\n): GlobalState {\n const byId = selectChatMessages(global, chatId) || {};\n const message = byId[messageId];\n const updatedMessage = {\n ...message,\n ...messageUpdate,\n };\n\n if (!updatedMessage.id) {\n return global;\n }\n\n return replaceChatMessages(global, chatId, {\n ...byId,\n [messageId]: updatedMessage,\n });\n}\n\nexport function updateScheduledMessage(\n global: GlobalState, chatId: number, messageId: number, messageUpdate: Partial,\n): GlobalState {\n const byId = selectScheduledMessages(global, chatId) || {};\n const message = byId[messageId];\n const updatedMessage = {\n ...message,\n ...messageUpdate,\n };\n\n if (!updatedMessage.id) {\n return global;\n }\n\n return replaceScheduledMessages(global, chatId, {\n ...byId,\n [messageId]: updatedMessage,\n }, undefined);\n}\n\nexport function deleteChatMessages(\n global: GlobalState,\n chatId: number,\n messageIds: number[],\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n if (!byId) {\n return global;\n }\n const newById = omit(byId, messageIds);\n const deletedForwardedPosts = Object.values(pickTruthy(byId, messageIds)).filter(\n ({ forwardInfo }) => forwardInfo && forwardInfo.isLinkedChannelPost,\n );\n\n const threadIds = Object.keys(global.messages.byChatId[chatId].threadsById).map(Number);\n threadIds.forEach((threadId) => {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n let listedIds = selectListedIds(global, chatId, threadId);\n let outlyingIds = selectOutlyingIds(global, chatId, threadId);\n let viewportIds = selectViewportIds(global, chatId, threadId);\n let pinnedIds = selectPinnedIds(global, chatId);\n let newMessageCount = threadInfo ? threadInfo.messagesCount : undefined;\n\n messageIds.forEach((messageId) => {\n if (listedIds && listedIds.includes(messageId)) {\n listedIds = listedIds.filter((id) => id !== messageId);\n if (newMessageCount !== undefined) newMessageCount -= 1;\n }\n\n if (outlyingIds && outlyingIds.includes(messageId)) {\n outlyingIds = outlyingIds.filter((id) => id !== messageId);\n }\n\n if (viewportIds && viewportIds.includes(messageId)) {\n viewportIds = viewportIds.filter((id) => id !== messageId);\n }\n\n if (pinnedIds && pinnedIds.includes(messageId)) {\n pinnedIds = pinnedIds.filter((id) => id !== messageId);\n }\n });\n\n\n global = replaceThreadParam(global, chatId, threadId, 'listedIds', listedIds);\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', outlyingIds);\n global = replaceThreadParam(global, chatId, threadId, 'viewportIds', viewportIds);\n global = replaceThreadParam(global, chatId, threadId, 'pinnedIds', pinnedIds);\n\n if (threadInfo && newMessageCount !== undefined) {\n global = replaceThreadParam(global, chatId, threadId, 'threadInfo', {\n ...threadInfo,\n messagesCount: newMessageCount,\n });\n }\n });\n\n if (deletedForwardedPosts.length) {\n const currentMessageList = selectCurrentMessageList(global);\n const canDeleteCurrentThread = currentMessageList && currentMessageList.chatId === chatId\n && currentMessageList.type === 'thread';\n const currentThreadId = currentMessageList && currentMessageList.threadId;\n\n deletedForwardedPosts.forEach((message) => {\n const { fromChatId, fromMessageId } = message.forwardInfo!;\n const originalPost = selectChatMessage(global, fromChatId!, fromMessageId!);\n\n if (canDeleteCurrentThread && currentThreadId === fromMessageId) {\n global = updateCurrentMessageList(global, chatId);\n }\n if (originalPost) {\n global = updateChatMessage(global, fromChatId!, fromMessageId!, { threadInfo: undefined });\n }\n });\n }\n\n global = replaceChatMessages(global, chatId, newById);\n\n return global;\n}\n\nexport function deleteChatScheduledMessages(\n global: GlobalState,\n chatId: number,\n messageIds: number[],\n): GlobalState {\n const byId = selectScheduledMessages(global, chatId);\n if (!byId) {\n return global;\n }\n const newById = omit(byId, messageIds);\n\n let scheduledIds = selectScheduledIds(global, chatId);\n if (scheduledIds) {\n messageIds.forEach((messageId) => {\n if (scheduledIds!.includes(messageId)) {\n scheduledIds = scheduledIds!.filter((id) => id !== messageId);\n }\n });\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', scheduledIds);\n }\n\n global = replaceScheduledMessages(global, chatId, newById, undefined);\n\n return global;\n}\n\nexport function updateListedIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const listedIds = selectListedIds(global, chatId, threadId);\n const newIds = listedIds && listedIds.length\n ? idsUpdate.filter((id) => !listedIds.includes(id))\n : idsUpdate;\n\n if (listedIds && !newIds.length) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'listedIds', orderHistoryIds([\n ...(listedIds || []),\n ...newIds,\n ]));\n}\n\nexport function updateOutlyingIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const newIds = outlyingIds && outlyingIds.length\n ? idsUpdate.filter((id) => !outlyingIds.includes(id))\n : idsUpdate;\n\n if (outlyingIds && !newIds.length) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'outlyingIds', orderHistoryIds([\n ...(outlyingIds || []),\n ...newIds,\n ]));\n}\n\nfunction orderHistoryIds(listedIds: number[]) {\n return listedIds.sort((a, b) => a - b);\n}\n\nexport function addViewportId(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newId: number,\n): GlobalState {\n const viewportIds = selectViewportIds(global, chatId, threadId) || [];\n if (viewportIds.includes(newId)) {\n return global;\n }\n\n const newIds = orderHistoryIds([\n ...(\n viewportIds.length < MESSAGE_LIST_VIEWPORT_LIMIT\n ? viewportIds\n : viewportIds.slice(-(MESSAGE_LIST_SLICE / 2))\n ),\n newId,\n ]);\n\n return replaceThreadParam(global, chatId, threadId, 'viewportIds', newIds);\n}\n\nexport function safeReplaceViewportIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newViewportIds: number[],\n): GlobalState {\n const viewportIds = selectViewportIds(global, chatId, threadId) || [];\n\n return replaceThreadParam(\n global,\n chatId,\n threadId,\n 'viewportIds',\n areSortedArraysEqual(viewportIds, newViewportIds) ? viewportIds : newViewportIds,\n );\n}\n\nexport function updateThreadInfo(\n global: GlobalState, chatId: number, threadId: number, update: Partial | undefined,\n): GlobalState {\n const newThreadInfo = {\n ...(selectThreadInfo(global, chatId, threadId) as ApiThreadInfo),\n ...update,\n };\n\n if (!newThreadInfo.threadId) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'threadInfo', newThreadInfo);\n}\n\nexport function updateThreadInfos(\n global: GlobalState, chatId: number, updates: Partial[],\n): GlobalState {\n updates.forEach((update) => {\n global = updateThreadInfo(global, update.chatId!, update.threadId!, update);\n });\n\n return global;\n}\n\nexport function replaceScheduledMessages(\n global: GlobalState, chatId: number, newById: Record, hash: number | undefined,\n): GlobalState {\n return updateScheduledMessages(global, chatId, {\n byId: newById,\n hash,\n });\n}\n\nfunction updateScheduledMessages(\n global: GlobalState, chatId: number, update: Partial<{ byId: Record; hash: number }>,\n): GlobalState {\n const current = global.scheduledMessages.byChatId[chatId] || { byId: {}, hash: 0 };\n\n return {\n ...global,\n scheduledMessages: {\n byChatId: {\n ...global.scheduledMessages.byChatId,\n [chatId]: {\n ...current,\n ...update,\n },\n },\n },\n };\n}\n\nexport function updateFocusedMessage(\n global: GlobalState, chatId?: number, messageId?: number, noHighlight = false,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n chatId,\n messageId,\n noHighlight,\n },\n };\n}\n\nexport function updateFocusDirection(\n global: GlobalState, direction?: FocusDirection,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n direction,\n },\n };\n}\n\nexport function enterMessageSelectMode(\n global: GlobalState,\n chatId: number,\n messageId?: number | number[],\n): GlobalState {\n const messageIds = messageId ? Array.prototype.concat([], messageId) : [];\n return {\n ...global,\n selectedMessages: {\n chatId,\n messageIds,\n },\n };\n}\n\nexport function toggleMessageSelection(\n global: GlobalState,\n chatId: number,\n threadId: number,\n messageListType: MessageListType,\n messageId: number,\n groupedId?: string,\n childMessageIds?: number[],\n withShift = false,\n): GlobalState {\n const { selectedMessages: oldSelectedMessages } = global;\n if (groupedId) {\n childMessageIds = selectMessageIdsByGroupId(global, chatId, groupedId);\n }\n const selectedMessageIds = childMessageIds || [messageId];\n if (!oldSelectedMessages) {\n return enterMessageSelectMode(global, chatId, selectedMessageIds);\n }\n\n const { messageIds } = oldSelectedMessages;\n\n let newMessageIds;\n const newSelectedMessageIds = selectedMessageIds.filter((id) => !messageIds.includes(id));\n if (newSelectedMessageIds && !newSelectedMessageIds.length) {\n newMessageIds = messageIds.filter((id) => !selectedMessageIds.includes(id));\n } else if (withShift && messageIds.length) {\n const viewportIds = selectCurrentMessageIds(global, chatId, threadId, messageListType)!;\n const prevIndex = viewportIds.indexOf(messageIds[messageIds.length - 1]);\n const currentIndex = viewportIds.indexOf(messageId);\n const from = Math.min(prevIndex, currentIndex);\n const to = Math.max(prevIndex, currentIndex);\n const slice = viewportIds.slice(from, to + 1);\n newMessageIds = unique([...messageIds, ...slice]);\n } else {\n newMessageIds = [...messageIds, ...newSelectedMessageIds];\n }\n\n if (!newMessageIds.length) {\n return exitMessageSelectMode(global);\n }\n\n return {\n ...global,\n selectedMessages: {\n ...oldSelectedMessages,\n messageIds: newMessageIds,\n },\n };\n}\n\nexport function exitMessageSelectMode(global: GlobalState): GlobalState {\n return {\n ...global,\n selectedMessages: undefined,\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiSticker, ApiStickerSet, ApiVideo } from '../../api/types';\nimport { buildCollectionByKey, unique } from '../../util/iteratees';\nimport { selectStickersForEmoji } from '../selectors';\n\nexport function updateStickerSets(\n global: GlobalState,\n category: 'added' | 'featured' | 'search',\n hash: number,\n sets: ApiStickerSet[],\n resultIds?: string[],\n): GlobalState {\n const updatedSets = sets.map((stickerSet) => {\n const existing = global.stickers.setsById[stickerSet.id];\n if (!existing) {\n return stickerSet;\n }\n\n return {\n ...existing,\n ...stickerSet,\n };\n });\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n setsById: {\n ...global.stickers.setsById,\n ...buildCollectionByKey(updatedSets, 'id'),\n },\n [category]: {\n ...global.stickers[category],\n hash,\n ...(\n category === 'search'\n ? { resultIds }\n : { setIds: sets.map(({ id }) => id) }\n ),\n },\n },\n };\n}\n\nexport function updateStickerSet(\n global: GlobalState, stickerSetId: string, update: Partial,\n): GlobalState {\n const currentStickerSet = global.stickers.setsById[stickerSetId] || {};\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n setsById: {\n ...global.stickers.setsById,\n [stickerSetId]: {\n ...currentStickerSet,\n ...update,\n },\n },\n },\n };\n}\n\nexport function updateGifSearch(\n global: GlobalState, isNew: boolean, results: ApiVideo[], nextOffset?: string,\n): GlobalState {\n const { results: currentResults } = global.gifs.search;\n\n let newResults!: ApiVideo[];\n if (isNew || !currentResults) {\n newResults = results;\n } else {\n const currentIds = new Set(currentResults.map((gif) => gif.id));\n newResults = [\n ...currentResults,\n ...results.filter((gif) => !currentIds.has(gif.id)),\n ];\n }\n\n return {\n ...global,\n gifs: {\n ...global.gifs,\n search: {\n ...global.gifs.search,\n offset: nextOffset,\n results: newResults,\n },\n },\n };\n}\n\nexport function replaceAnimatedEmojis(global: GlobalState, stickerSet: ApiStickerSet): GlobalState {\n return {\n ...global,\n animatedEmojis: stickerSet,\n };\n}\n\nexport function updateStickersForEmoji(\n global: GlobalState, emoji: string, remoteStickers?: ApiSticker[], hash?: number,\n): GlobalState {\n const localStickers = selectStickersForEmoji(global, emoji);\n const allStickers = [...localStickers, ...(remoteStickers || [])];\n const uniqueIds = unique(allStickers.map(({ id }) => id));\n const byId = buildCollectionByKey(allStickers, 'id');\n const stickers = uniqueIds.map((id) => byId[id]);\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {\n emoji,\n stickers,\n hash,\n },\n },\n };\n}\n\nexport function rebuildStickersForEmoji(global: GlobalState): GlobalState {\n const { emoji, stickers, hash } = global.stickers.forEmoji || {};\n if (!emoji) {\n return global;\n }\n\n return updateStickersForEmoji(global, emoji, stickers, hash);\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiUser } from '../../api/types';\n\nimport { omit } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\n\nexport function replaceUsers(global: GlobalState, newById: Record): GlobalState {\n return {\n ...global,\n users: {\n ...global.users,\n byId: newById,\n },\n };\n}\n\n// @optimization Don't spread/unspread global for each element, do it in a batch\nfunction getUpdatedUser(global: GlobalState, userId: number, userUpdate: Partial): ApiUser {\n const { byId } = global.users;\n const user = byId[userId];\n const shouldOmitMinInfo = userUpdate.isMin && user && !user.isMin;\n\n const updatedUser = {\n ...user,\n ...(shouldOmitMinInfo ? omit(userUpdate, ['isMin', 'accessHash']) : userUpdate),\n };\n\n if (!updatedUser.id || !updatedUser.type) {\n return user;\n }\n\n return updatedUser;\n}\n\nfunction updateContactList(global: GlobalState, updatedUsers: ApiUser[]): GlobalState {\n const { hash, userIds: contactUserIds } = global.contactList || {};\n\n if (!contactUserIds) return global;\n\n const newContactUserIds = updatedUsers\n .filter((user) => user && user.isContact && !contactUserIds.includes(user.id))\n .map((user) => user.id);\n\n if (newContactUserIds.length === 0) return global;\n\n return {\n ...global,\n contactList: {\n hash: hash || 0,\n userIds: [\n ...newContactUserIds,\n ...contactUserIds,\n ],\n },\n };\n}\n\nexport function updateUser(global: GlobalState, userId: number, userUpdate: Partial): GlobalState {\n const { byId } = global.users;\n\n const updatedUser = getUpdatedUser(global, userId, userUpdate);\n\n global = updateContactList(global, [updatedUser]);\n\n return replaceUsers(global, {\n ...byId,\n [userId]: updatedUser,\n });\n}\n\n\nexport function updateUsers(global: GlobalState, updatedById: Record): GlobalState {\n const updatedUsers = Object.keys(updatedById).map(Number).reduce>((acc, id) => {\n const updatedUser = getUpdatedUser(global, id, updatedById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n }\n return acc;\n }, {});\n\n global = updateContactList(global, Object.values(updatedUsers));\n\n global = replaceUsers(global, {\n ...global.users.byId,\n ...updatedUsers,\n });\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addUsers(global: GlobalState, addedById: Record): GlobalState {\n const { byId } = global.users;\n let isAdded = false;\n\n const addedUsers = Object.keys(addedById).map(Number).reduce>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n const updatedUser = getUpdatedUser(global, id, addedById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n\n if (!isAdded) {\n isAdded = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (isAdded) {\n global = replaceUsers(global, {\n ...global.users.byId,\n ...addedUsers,\n });\n\n global = updateContactList(global, Object.values(addedUsers));\n }\n\n return global;\n}\n\nexport function updateSelectedUserId(global: GlobalState, selectedId?: number): GlobalState {\n if (global.users.selectedId === selectedId) {\n return global;\n }\n\n return {\n ...global,\n users: {\n ...global.users,\n selectedId,\n },\n };\n}\n\nexport function deleteUser(global: GlobalState, userId: number): GlobalState {\n const { byId } = global.users;\n const { hash, userIds } = global.contactList || {};\n delete byId[userId];\n\n global = {\n ...global,\n contactList: {\n hash: hash || 0,\n userIds: userIds ? userIds.filter((id) => id !== userId) : MEMO_EMPTY_ARRAY,\n },\n };\n\n return replaceUsers(global, byId);\n}\n\nexport function updateUserSearch(\n global: GlobalState,\n searchStatePartial: Partial,\n) {\n return {\n ...global,\n userSearch: {\n ...global.userSearch,\n ...searchStatePartial,\n },\n };\n}\n\nexport function updateUserSearchFetchingStatus(\n global: GlobalState, newState: boolean,\n) {\n return updateUserSearch(global, {\n fetchingStatus: newState,\n });\n}\n\nexport function updateUserBlockedState(global: GlobalState, userId: number, isBlocked: boolean) {\n const { byId } = global.users;\n const user = byId[userId];\n if (!user || !user.fullInfo) {\n return global;\n }\n\n return updateUser(global, userId, {\n ...user,\n fullInfo: {\n ...user.fullInfo,\n isBlocked,\n },\n });\n}\n","import { GlobalState } from '../../global/types';\nimport { GlobalSearchContent } from '../../types';\nimport { ApiGlobalMessageSearchType, ApiMessage } from '../../api/types';\nimport { areSortedArraysEqual } from '../../util/iteratees';\n\nconst getComplexKey = (message: ApiMessage) => `${message.chatId}_${message.id}`;\n\nexport function updateGlobalSearch(\n global: GlobalState,\n searchStatePartial: Partial,\n) {\n return {\n ...global,\n globalSearch: {\n ...global.globalSearch,\n ...searchStatePartial,\n },\n };\n}\n\nexport function updateGlobalSearchContent(\n global: GlobalState,\n currentContent: GlobalSearchContent | undefined,\n): GlobalState {\n return updateGlobalSearch(global, { currentContent });\n}\n\nexport function updateGlobalSearchResults(\n global: GlobalState,\n newFoundMessages: ApiMessage[],\n totalCount: number,\n type: ApiGlobalMessageSearchType,\n nextRate?: number,\n): GlobalState {\n const { resultsByType } = global.globalSearch || {};\n const newFoundMessagesById = newFoundMessages.reduce((result, message) => {\n result[getComplexKey(message)] = message;\n\n return result;\n }, {} as Record);\n const foundIdsForType = resultsByType && resultsByType[type] ? resultsByType[type]!.foundIds : undefined;\n\n if (foundIdsForType !== undefined\n && Object.keys(newFoundMessagesById).every(\n (newId) => foundIdsForType.includes(getComplexKey(newFoundMessagesById[newId])),\n )\n ) {\n return updateGlobalSearchFetchingStatus(global, { messages: false });\n }\n\n const prevFoundIds = foundIdsForType || [];\n const newFoundIds = newFoundMessages.map((message) => getComplexKey(message));\n const foundIds = Array.prototype.concat(prevFoundIds, newFoundIds);\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n global = updateGlobalSearchFetchingStatus(global, { messages: false });\n\n return updateGlobalSearch(global, {\n resultsByType: {\n ...(global.globalSearch || {}).resultsByType,\n [type]: {\n totalCount,\n nextOffsetId: nextRate,\n foundIds: foundOrPrevFoundIds,\n },\n },\n });\n}\n\nexport function updateGlobalSearchFetchingStatus(\n global: GlobalState, newState: { chats?: boolean; messages?: boolean },\n) {\n return updateGlobalSearch(global, {\n fetchingStatus: {\n ...global.globalSearch.fetchingStatus,\n ...newState,\n },\n });\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiMessageSearchType } from '../../api/types';\n\nimport { areSortedArraysEqual, unique } from '../../util/iteratees';\nimport { SharedMediaType } from '../../types';\nimport { buildChatThreadKey } from '../helpers';\n\ninterface TextSearchParams {\n isActive: boolean;\n query?: string;\n results?: {\n totalCount?: number;\n nextOffsetId?: number;\n foundIds?: number[];\n };\n}\n\ninterface MediaSearchParams {\n currentType?: SharedMediaType;\n resultsByType?: Partial>;\n}\n\nfunction replaceLocalTextSearch(\n global: GlobalState,\n chatThreadKey: string,\n searchParams: TextSearchParams,\n): GlobalState {\n return {\n ...global,\n localTextSearch: {\n byChatThreadKey: {\n ...global.localTextSearch.byChatThreadKey,\n [chatThreadKey]: searchParams,\n },\n },\n };\n}\n\nexport function updateLocalTextSearch(\n global: GlobalState,\n chatId: number,\n threadId: number,\n isActive: boolean,\n query?: string,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n\n return replaceLocalTextSearch(global, chatThreadKey, {\n ...global.localTextSearch.byChatThreadKey[chatThreadKey],\n isActive,\n query,\n });\n}\n\nexport function replaceLocalTextSearchResults(\n global: GlobalState,\n chatId: number,\n threadId: number,\n foundIds?: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n\n return replaceLocalTextSearch(global, chatThreadKey, {\n ...global.localTextSearch.byChatThreadKey[chatThreadKey],\n results: {\n foundIds,\n totalCount,\n nextOffsetId,\n },\n });\n}\n\nexport function updateLocalTextSearchResults(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newFoundIds: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const { results } = global.localTextSearch.byChatThreadKey[chatThreadKey] || {};\n const prevFoundIds = (results && results.foundIds) || [];\n const foundIds = orderFoundIds(unique(Array.prototype.concat(prevFoundIds, newFoundIds)));\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n return replaceLocalTextSearchResults(global, chatId, threadId, foundOrPrevFoundIds, totalCount, nextOffsetId);\n}\n\nfunction replaceLocalMediaSearch(\n global: GlobalState,\n chatId: number,\n searchParams: MediaSearchParams,\n): GlobalState {\n return {\n ...global,\n localMediaSearch: {\n byChatId: {\n ...global.localMediaSearch.byChatId,\n [chatId]: searchParams,\n },\n },\n };\n}\n\nexport function updateLocalMediaSearchType(\n global: GlobalState,\n chatId: number,\n currentType: SharedMediaType | undefined,\n): GlobalState {\n return replaceLocalMediaSearch(global, chatId, {\n ...global.localMediaSearch.byChatId[chatId],\n currentType,\n });\n}\n\nexport function replaceLocalMediaSearchResults(\n global: GlobalState,\n chatId: number,\n type: ApiMessageSearchType,\n foundIds?: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n return replaceLocalMediaSearch(global, chatId, {\n ...global.localMediaSearch.byChatId[chatId],\n resultsByType: {\n ...(global.localMediaSearch.byChatId[chatId] || {}).resultsByType,\n [type]: {\n foundIds,\n totalCount,\n nextOffsetId,\n },\n },\n });\n}\n\nexport function updateLocalMediaSearchResults(\n global: GlobalState,\n chatId: number,\n type: SharedMediaType,\n newFoundIds: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const { resultsByType } = global.localMediaSearch.byChatId[chatId] || {};\n const prevFoundIds = resultsByType && resultsByType[type] ? resultsByType[type]!.foundIds : [];\n const foundIds = orderFoundIds(unique(Array.prototype.concat(prevFoundIds, newFoundIds)));\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n return replaceLocalMediaSearchResults(global, chatId, type, foundOrPrevFoundIds, totalCount, nextOffsetId);\n}\n\nfunction orderFoundIds(listedIds: number[]) {\n return listedIds.sort((a, b) => a - b);\n}\n","import { GlobalState } from '../../global/types';\nimport { ManagementProgress } from '../../types';\n\ninterface ManagementState {\n isActive: boolean;\n isUsernameAvailable?: boolean;\n error?: string;\n}\n\nexport function updateManagementProgress(global: GlobalState, progress: ManagementProgress): GlobalState {\n return {\n ...global,\n management: {\n ...global.management,\n progress,\n },\n };\n}\n\nexport function updateManagement(global: GlobalState, chatId: number, update: Partial): GlobalState {\n return {\n ...global,\n management: {\n ...global.management,\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...(global.management.byChatId[chatId] || {}),\n ...update,\n },\n },\n },\n };\n}\n","import { GlobalState } from '../../global/types';\nimport {\n ISettings, IThemeSettings, ThemeKey, NotifyException,\n} from '../../types';\nimport { ApiNotifyException } from '../../api/types';\nimport { updateUserBlockedState } from './users';\n\nexport function replaceSettings(global: GlobalState, newSettings?: Partial): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n byKey: {\n ...global.settings.byKey,\n ...newSettings,\n },\n },\n };\n}\n\nexport function replaceThemeSettings(\n global: GlobalState, theme: ThemeKey, newSettings?: Partial,\n): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n themes: {\n ...global.settings.themes,\n [theme]: {\n ...(global.settings.themes[theme] || {}),\n ...newSettings,\n },\n },\n },\n };\n}\n\nexport function addNotifyExceptions(\n global: GlobalState, notifyExceptions: ApiNotifyException[],\n): GlobalState {\n notifyExceptions.forEach((notifyException) => {\n const { chatId, ...exceptionData } = notifyException;\n global = addNotifyException(global, chatId, exceptionData);\n });\n\n return global;\n}\n\nexport function addNotifyException(\n global: GlobalState, id: number, notifyException: NotifyException,\n): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n notifyExceptions: {\n ...global.settings.notifyExceptions,\n [id]: notifyException,\n },\n },\n };\n}\n\nexport function updateNotifySettings(\n global: GlobalState, peerType: 'contact' | 'group' | 'broadcast', isSilent?: boolean, shouldShowPreviews?: boolean,\n) {\n switch (peerType) {\n case 'contact':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasPrivateChatsNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasPrivateChatsMessagePreview: shouldShowPreviews }),\n });\n case 'group':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasGroupNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasGroupMessagePreview: shouldShowPreviews }),\n });\n case 'broadcast':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasBroadcastNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasBroadcastMessagePreview: shouldShowPreviews }),\n });\n\n default:\n return undefined;\n }\n}\n\nexport function addBlockedContact(global: GlobalState, contactId: number): GlobalState {\n global = updateUserBlockedState(global, contactId, true);\n\n return {\n ...global,\n blocked: {\n ...global.blocked,\n ids: [contactId, ...global.blocked.ids],\n totalCount: global.blocked.totalCount + 1,\n },\n };\n}\n\nexport function removeBlockedContact(global: GlobalState, contactId: number): GlobalState {\n global = updateUserBlockedState(global, contactId, false);\n\n return {\n ...global,\n blocked: {\n ...global.blocked,\n ids: global.blocked.ids.filter((id) => id !== contactId),\n totalCount: global.blocked.totalCount - 1,\n },\n };\n}\n","import { GlobalState } from '../../global/types';\n\nexport function updateTwoFaSettings(\n global: GlobalState,\n update: GlobalState['twoFaSettings'],\n): GlobalState {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n ...update,\n },\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ShippingOption, PaymentStep } from '../../types';\nimport { ApiMessage, ApiPaymentForm, ApiReceipt } from '../../api/types';\n\nexport function updateShippingOptions(\n global: GlobalState,\n shippingOptions: ShippingOption[],\n): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n shippingOptions,\n },\n };\n}\n\nexport function setRequestInfoId(global: GlobalState, id: string): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n formId: id,\n },\n };\n}\n\nexport function setPaymentStep(global: GlobalState, step: PaymentStep): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n step,\n },\n };\n}\n\nexport function setInvoiceMessageInfo(global: GlobalState, message: ApiMessage): GlobalState {\n if (!message.content || !message.content.invoice) {\n return global;\n }\n const {\n title,\n text,\n description,\n photoUrl,\n } = message.content.invoice;\n return {\n ...global,\n payment: {\n ...global.payment,\n invoiceContent: {\n title,\n text,\n description,\n photoUrl,\n },\n },\n };\n}\n\nexport function setStripeCardInfo(global: GlobalState, cardInfo: { type: string; id: string }): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n stripeCredentials: {\n ...cardInfo,\n },\n },\n };\n}\n\nexport function setPaymentForm(global: GlobalState, form: ApiPaymentForm): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n ...form,\n },\n };\n}\n\nexport function setReceipt(\n global: GlobalState,\n receipt?: ApiReceipt,\n message?: ApiMessage,\n): GlobalState {\n if (!receipt || !message) {\n return {\n ...global,\n payment: {\n ...global.payment,\n receipt: undefined,\n },\n };\n }\n\n const { invoice: messageInvoice } = message.content;\n const { photoUrl, text, title } = (messageInvoice || {});\n\n return {\n ...global,\n payment: {\n ...global.payment,\n receipt: {\n ...receipt,\n photoUrl,\n text,\n title,\n },\n },\n };\n}\n\nexport function clearPayment(global: GlobalState): GlobalState {\n return {\n ...global,\n payment: {},\n };\n}\n\nexport function closeInvoice(global: GlobalState): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n isPaymentModalOpen: false,\n },\n };\n}\n","// eslint-disable-next-line no-restricted-globals\nconst cacheApi = self.caches;\n\nexport enum Type {\n Text,\n Blob,\n Json,\n}\n\nexport async function fetch(cacheName: string, key: string, type: Type) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\n const cache = await cacheApi.open(cacheName);\n const response = await cache.match(request);\n if (!response) {\n return undefined;\n }\n\n switch (type) {\n case Type.Text:\n return await response.text();\n case Type.Blob: {\n const blob = await response.blob();\n\n // Safari does not return correct Content-Type header for webp images.\n if (key.substr(0, 7) === 'sticker') {\n return new Blob([blob], { type: 'image/webp' });\n }\n\n // iOS Safari fails to preserve `type` in cache\n if (!blob.type) {\n const contentType = response.headers.get('Content-Type');\n if (contentType) {\n return new Blob([blob], { type: contentType });\n }\n }\n\n return blob;\n }\n case Type.Json:\n return await response.json();\n default:\n return undefined;\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function save(cacheName: string, key: string, data: AnyLiteral | Blob | string) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n const cacheData = typeof data === 'string' || data instanceof Blob ? data : JSON.stringify(data);\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\n const response = new Response(cacheData);\n const cache = await cacheApi.open(cacheName);\n return await cache.put(request, response);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function clear(cacheName: string) {\n try {\n if (!cacheApi) {\n return undefined;\n }\n\n return await cacheApi.delete(cacheName);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n","import {\n ApiBotInlineMediaResult, ApiBotInlineResult, ApiBotInlineSwitchPm,\n ApiLanguage, ApiMessage, ApiShippingAddress, ApiStickerSet,\n} from '../api/types';\n\nexport enum LoadMoreDirection {\n Backwards,\n Forwards,\n Around,\n}\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n}\n\nexport interface IAlbum {\n albumId: string;\n messages: ApiMessage[];\n mainMessage: ApiMessage;\n}\n\nexport type ThemeKey = 'light' | 'dark';\n\nexport interface IThemeSettings {\n background?: string;\n backgroundColor?: string;\n patternColor?: string;\n isBlurred?: boolean;\n}\n\nexport type NotifySettings = {\n hasPrivateChatsNotifications?: boolean;\n hasPrivateChatsMessagePreview?: boolean;\n hasGroupNotifications?: boolean;\n hasGroupMessagePreview?: boolean;\n hasBroadcastNotifications?: boolean;\n hasBroadcastMessagePreview?: boolean;\n hasContactJoinedNotifications?: boolean;\n};\n\nexport type LangCode = (\n 'en' | 'ar' | 'be' | 'ca' | 'nl' | 'fr' | 'de' | 'id' | 'it' | 'ko' | 'ms' | 'fa' | 'pl' | 'pt-br' | 'ru' | 'es'\n | 'tr' | 'uk' | 'uz'\n);\n\nexport interface ISettings extends NotifySettings, Record {\n theme: ThemeKey;\n shouldUseSystemTheme: boolean;\n messageTextSize: number;\n animationLevel: 0 | 1 | 2;\n messageSendKeyCombo: 'enter' | 'ctrl-enter';\n shouldAutoDownloadMediaFromContacts: boolean;\n shouldAutoDownloadMediaInPrivateChats: boolean;\n shouldAutoDownloadMediaInGroups: boolean;\n shouldAutoDownloadMediaInChannels: boolean;\n shouldAutoPlayGifs: boolean;\n shouldAutoPlayVideos: boolean;\n shouldSuggestStickers: boolean;\n shouldLoopStickers: boolean;\n hasPassword?: boolean;\n languages?: ApiLanguage[];\n language: LangCode;\n isSensitiveEnabled?: boolean;\n canChangeSensitive?: boolean;\n}\n\nexport interface ApiPrivacySettings {\n visibility: PrivacyVisibility;\n allowUserIds: number[];\n allowChatIds: number[];\n blockUserIds: number[];\n blockChatIds: number[];\n}\n\nexport interface IInputPrivacyContact {\n id: number;\n accessHash?: string;\n}\n\nexport interface IInputPrivacyRules {\n visibility: PrivacyVisibility;\n allowedUsers?: IInputPrivacyContact[];\n allowedChats?: IInputPrivacyContact[];\n blockedUsers?: IInputPrivacyContact[];\n blockedChats?: IInputPrivacyContact[];\n}\n\nexport type IAnchorPosition = {\n x: number;\n y: number;\n};\n\nexport interface ShippingOption {\n id: string;\n title: string;\n amount: number;\n prices: Price[];\n}\n\nexport interface Price {\n label: string;\n amount: number;\n}\n\nexport interface Invoice {\n currency?: string;\n emailRequested?: boolean;\n emailToProvider?: boolean;\n flexible?: boolean;\n nameRequested?: boolean;\n phoneRequested?: boolean;\n phoneToProvider?: boolean;\n prices?: Price[];\n shippingAddressRequested?: boolean;\n test?: boolean;\n}\n\nexport interface Receipt {\n currency: string;\n prices: Price[];\n info?: {\n shippingAddress?: ApiShippingAddress;\n phone?: string;\n name?: string;\n };\n totalAmount: number;\n credentialsTitle: string;\n shippingPrices?: Price[];\n shippingMethod?: string;\n photoUrl?: string;\n text?: string;\n title?: string;\n}\n\nexport enum SettingsScreens {\n Main,\n EditProfile,\n Notifications,\n Language,\n General,\n GeneralChatBackground,\n GeneralChatBackgroundColor,\n Privacy,\n PrivacyPhoneNumber,\n PrivacyLastSeen,\n PrivacyProfilePhoto,\n PrivacyForwarding,\n PrivacyGroupChats,\n PrivacyPhoneNumberAllowedContacts,\n PrivacyPhoneNumberDeniedContacts,\n PrivacyLastSeenAllowedContacts,\n PrivacyLastSeenDeniedContacts,\n PrivacyProfilePhotoAllowedContacts,\n PrivacyProfilePhotoDeniedContacts,\n PrivacyForwardingAllowedContacts,\n PrivacyForwardingDeniedContacts,\n PrivacyGroupChatsAllowedContacts,\n PrivacyGroupChatsDeniedContacts,\n PrivacyActiveSessions,\n PrivacyBlockedUsers,\n Folders,\n FoldersCreateFolder,\n FoldersEditFolder,\n FoldersIncludedChats,\n FoldersExcludedChats,\n TwoFaDisabled,\n TwoFaNewPassword,\n TwoFaNewPasswordConfirm,\n TwoFaNewPasswordHint,\n TwoFaNewPasswordEmail,\n TwoFaNewPasswordEmailCode,\n TwoFaEnabled,\n TwoFaChangePasswordCurrent,\n TwoFaChangePasswordNew,\n TwoFaChangePasswordConfirm,\n TwoFaChangePasswordHint,\n TwoFaTurnOff,\n TwoFaRecoveryEmailCurrentPassword,\n TwoFaRecoveryEmail,\n TwoFaRecoveryEmailCode,\n TwoFaCongratulations,\n}\n\nexport type StickerSetOrRecent = Pick;\n\nexport enum LeftColumnContent {\n ChatList,\n GlobalSearch,\n Settings,\n Contacts,\n Archived,\n NewChannelStep1,\n NewChannelStep2,\n NewGroupStep1,\n NewGroupStep2,\n}\n\nexport enum GlobalSearchContent {\n ChatList,\n Media,\n Links,\n Files,\n Music,\n Voice,\n}\n\nexport enum RightColumnContent {\n ChatInfo,\n UserInfo,\n Search,\n Management,\n StickerSearch,\n GifSearch,\n PollResults,\n AddingMembers,\n}\n\nexport enum MediaViewerOrigin {\n Inline,\n ScheduledInline,\n SharedMedia,\n ProfileAvatar,\n MiddleHeaderAvatar,\n Album,\n ScheduledAlbum,\n SearchResult,\n}\n\nexport enum ChatCreationProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport enum ProfileEditProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport enum ManagementProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport enum NewChatMembersProgress {\n Closed,\n InProgress,\n Loading,\n}\n\nexport type ProfileTabType = 'members' | 'media' | 'documents' | 'links' | 'audio';\nexport type SharedMediaType = 'media' | 'documents' | 'links' | 'audio';\nexport type ApiPrivacyKey = 'phoneNumber' | 'lastSeen' | 'profilePhoto' | 'forwards' | 'chatInvite';\nexport type PrivacyVisibility = 'everybody' | 'contacts' | 'nonContacts' | 'nobody';\n\nexport enum ProfileState {\n Profile,\n SharedMedia,\n MemberList,\n}\n\nexport enum PaymentStep {\n ShippingInfo,\n Shipping,\n PaymentInfo,\n Checkout\n}\n\nexport const UPLOADING_WALLPAPER_SLUG = 'UPLOADING_WALLPAPER_SLUG';\n\nexport enum ManagementScreens {\n Initial,\n ChatPrivacyType,\n Discussion,\n ChannelSubscribers,\n GroupType,\n GroupPermissions,\n GroupRemovedUsers,\n GroupUserPermissionsCreate,\n GroupUserPermissions,\n ChatAdministrators,\n GroupRecentActions,\n ChatAdminRights,\n GroupMembers,\n}\n\nexport type ManagementType = 'user' | 'group' | 'channel';\n\nexport type NotifyException = {\n isMuted: boolean;\n isSilent?: boolean;\n shouldShowPreviews?: boolean;\n};\n\nexport type EmojiKeywords = {\n isLoading?: boolean;\n version: number;\n keywords: Record;\n};\n\nexport type InlineBotSettings = {\n id: number;\n help?: string;\n query?: string;\n offset?: string;\n canLoadMore?: boolean;\n results?: (ApiBotInlineResult | ApiBotInlineMediaResult)[];\n isGallery?: boolean;\n switchPm?: ApiBotInlineSwitchPm;\n};\n","import { ApiLangPack, ApiLangString } from '../api/types';\n\nimport {\n DEFAULT_LANG_CODE, DEFAULT_LANG_PACK, LANG_CACHE_NAME, LANG_PACKS,\n} from '../config';\nimport * as cacheApi from './cacheApi';\nimport { callApi } from '../api/gramjs';\nimport { createCallbackManager } from './callbacks';\nimport { formatInteger } from './textFormat';\nimport { getGlobal } from '../lib/teact/teactn';\n\ninterface LangFn {\n (key: string, value?: any, format?: 'i'): any;\n\n isRtl?: boolean;\n code?: string;\n}\n\nconst SUBSTITUTION_REGEX = /%\\d?\\$?[sdf@]/g;\nconst PLURAL_OPTIONS = ['value', 'zeroValue', 'oneValue', 'twoValue', 'fewValue', 'manyValue', 'otherValue'] as const;\nconst PLURAL_RULES = {\n /* eslint-disable max-len */\n en: (n: number) => (n !== 1 ? 6 : 2),\n ar: (n: number) => (n === 0 ? 1 : n === 1 ? 2 : n === 2 ? 3 : n % 100 >= 3 && n % 100 <= 10 ? 4 : n % 100 >= 11 ? 5 : 6),\n ca: (n: number) => (n !== 1 ? 6 : 2),\n de: (n: number) => (n !== 1 ? 6 : 2),\n es: (n: number) => (n !== 1 ? 6 : 2),\n fa: (n: number) => (n > 1 ? 6 : 2),\n fr: (n: number) => (n > 1 ? 6 : 2),\n id: () => 0,\n it: (n: number) => (n !== 1 ? 6 : 2),\n ko: () => 0,\n ms: () => 0,\n nl: (n: number) => (n !== 1 ? 6 : 2),\n pl: (n: number) => (n === 1 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n pt_BR: (n: number) => (n > 1 ? 6 : 2),\n ru: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n tr: (n: number) => (n > 1 ? 6 : 2),\n uk: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n uz: (n: number) => (n > 1 ? 6 : 2),\n /* eslint-enable max-len */\n};\n\nconst cache = new Map();\n\nlet langPack: ApiLangPack | undefined;\nlet fallbackLangPack: ApiLangPack | undefined;\n\nconst {\n addCallback,\n removeCallback,\n runCallbacks,\n} = createCallbackManager();\n\nexport { addCallback, removeCallback };\n\nlet currentLangCode: string | undefined;\n\nexport const getTranslation: LangFn = (key: string, value?: any, format?: 'i') => {\n if (value !== undefined) {\n const cacheValue = Array.isArray(value) ? JSON.stringify(value) : value;\n const cached = cache.get(`${key}_${cacheValue}_${format}`);\n if (cached) {\n return cached;\n }\n }\n\n if (!langPack && !fallbackLangPack) {\n return key;\n }\n\n const langString = (langPack && langPack[key]) || (fallbackLangPack && fallbackLangPack[key]);\n if (!langString) {\n if (!fallbackLangPack) {\n void importFallbackLangPack();\n }\n\n return key;\n }\n\n return processTranslation(langString, key, value, format);\n};\n\nexport async function getTranslationForLangString(langCode: string, key: string) {\n let translateString = await cacheApi.fetch(\n LANG_CACHE_NAME,\n `${DEFAULT_LANG_PACK}_${langCode}_${key}`,\n cacheApi.Type.Json,\n );\n\n if (!translateString) {\n translateString = await fetchRemoteString(DEFAULT_LANG_PACK, langCode, key);\n }\n\n return processTranslation(translateString, key);\n}\n\nexport async function setLanguage(langCode: string, callback?: NoneToVoidFunction, withFallback = false) {\n if (langPack && langCode === currentLangCode) {\n if (callback) {\n callback();\n }\n\n return;\n }\n\n let newLangPack = await cacheApi.fetch(LANG_CACHE_NAME, langCode, cacheApi.Type.Json);\n if (!newLangPack) {\n if (withFallback) {\n await importFallbackLangPack();\n }\n\n newLangPack = await fetchRemote(langCode);\n if (!newLangPack) {\n return;\n }\n }\n\n cache.clear();\n\n currentLangCode = langCode;\n langPack = newLangPack;\n document.documentElement.lang = langCode;\n\n const { languages } = getGlobal().settings.byKey;\n const langInfo = languages ? languages.find((l) => l.langCode === langCode) : undefined;\n getTranslation.isRtl = Boolean(langInfo && langInfo.rtl);\n getTranslation.code = langCode;\n\n if (callback) {\n callback();\n }\n\n runCallbacks();\n}\n\nasync function importFallbackLangPack() {\n if (fallbackLangPack) {\n return;\n }\n\n fallbackLangPack = (await import('./fallbackLangPack')).default;\n runCallbacks();\n}\n\nasync function fetchRemote(langCode: string): Promise {\n const remote = await callApi('fetchLangPack', { sourceLangPacks: LANG_PACKS, langCode });\n if (remote) {\n await cacheApi.save(LANG_CACHE_NAME, langCode, remote.langPack);\n return remote.langPack;\n }\n\n return undefined;\n}\n\nasync function fetchRemoteString(\n remoteLangPack: typeof LANG_PACKS[number], langCode: string, key: string,\n): Promise {\n const remote = await callApi('fetchLangStrings', {\n langPack: remoteLangPack,\n langCode,\n keys: [key],\n });\n\n if (remote && remote.length) {\n await cacheApi.save(LANG_CACHE_NAME, `${remoteLangPack}_${langCode}_${key}`, remote[0]);\n\n return remote[0];\n }\n\n return undefined;\n}\n\nfunction getPluralOption(amount: number) {\n const langCode = currentLangCode || DEFAULT_LANG_CODE;\n const optionIndex = PLURAL_RULES[langCode as keyof typeof PLURAL_RULES]\n ? PLURAL_RULES[langCode as keyof typeof PLURAL_RULES](amount)\n : 0;\n\n return PLURAL_OPTIONS[optionIndex];\n}\n\nfunction processTemplate(template: string, value: any) {\n value = Array.isArray(value) ? value : [value];\n const translationSlices = template.split(SUBSTITUTION_REGEX);\n const initialValue = translationSlices.shift();\n\n return translationSlices.reduce((result, str, index) => {\n return `${result}${String(value[index] || '')}${str}`;\n }, initialValue || '');\n}\n\nfunction processTranslation(langString: ApiLangString | undefined, key: string, value?: any, format?: 'i') {\n const template = langString ? langString[typeof value === 'number' ? getPluralOption(value) : 'value'] : undefined;\n if (!template || !template.trim()) {\n const parts = key.split('.');\n\n return parts[parts.length - 1];\n }\n\n if (value !== undefined) {\n const formattedValue = format === 'i' ? formatInteger(value) : value;\n const result = processTemplate(template, formattedValue);\n const cacheValue = Array.isArray(value) ? JSON.stringify(value) : value;\n cache.set(`${key}_${cacheValue}_${format}`, result);\n return result;\n }\n\n return template;\n}\n","export function createCallbackManager() {\n const callbacks: AnyToVoidFunction[] = [];\n\n function addCallback(cb: AnyToVoidFunction) {\n callbacks.push(cb);\n\n return () => {\n removeCallback(cb);\n };\n }\n\n function removeCallback(cb: AnyToVoidFunction) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n }\n\n function runCallbacks(...args: any[]) {\n callbacks.forEach((callback) => {\n callback(...args);\n });\n }\n\n return {\n runCallbacks,\n addCallback,\n removeCallback,\n };\n}\n","import { DEBUG } from '../config';\n\nexport enum Bundles {\n Auth,\n Main,\n Extra\n}\n\ninterface ImportedBundles {\n [Bundles.Auth]: typeof import('../bundles/auth');\n [Bundles.Main]: typeof import('../bundles/main');\n [Bundles.Extra]: typeof import('../bundles/extra');\n}\n\ntype BundlePromises = {\n [K in keyof ImportedBundles]: Promise\n};\n\nexport type BundleModules = keyof ImportedBundles[B];\n\nconst LOAD_PROMISES: Partial = {};\nconst MEMORY_CACHE: Partial = {};\n\nexport async function loadModule>(bundleName: B, moduleName: M) {\n if (!LOAD_PROMISES[bundleName]) {\n switch (bundleName) {\n case Bundles.Auth:\n LOAD_PROMISES[Bundles.Auth] = import('../bundles/auth');\n break;\n case Bundles.Main:\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD MAIN BUNDLE');\n }\n\n LOAD_PROMISES[Bundles.Main] = import('../bundles/main');\n break;\n case Bundles.Extra:\n LOAD_PROMISES[Bundles.Extra] = import('../bundles/extra');\n break;\n }\n\n (LOAD_PROMISES[bundleName] as Promise).then(handleBundleLoad);\n }\n\n const bundle = (await LOAD_PROMISES[bundleName]) as unknown as ImportedBundles[B];\n\n if (!MEMORY_CACHE[bundleName]) {\n MEMORY_CACHE[bundleName] = bundle;\n }\n\n return getModuleFromMemory(bundleName, moduleName);\n}\n\nexport function getModuleFromMemory>(bundleName: B, moduleName: M) {\n const bundle = MEMORY_CACHE[bundleName] as ImportedBundles[B];\n\n if (!bundle) {\n return undefined;\n }\n\n return bundle[moduleName];\n}\n\nconst listeners: NoneToVoidFunction[] = [];\n\nexport function addLoadListener(listener: NoneToVoidFunction) {\n if (!listeners.includes(listener)) {\n listeners.push(listener);\n }\n}\n\nfunction handleBundleLoad() {\n listeners.forEach((listener) => {\n listener();\n });\n}\n","import { ApiMediaFormat } from '../api/types';\n\nimport * as langProvider from '../util/langProvider';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport type LangFn = typeof langProvider.getTranslation;\n\nexport default (): LangFn => {\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n return langProvider.addCallback(forceUpdate);\n }, [forceUpdate]);\n\n return langProvider.getTranslation;\n};\n","import { pause } from './schedulers';\n\n// Polyfill for Safari: `File` is not available in web worker\nif (typeof File === 'undefined') {\n // eslint-disable-next-line no-global-assign, no-restricted-globals, func-names\n self.File = class extends Blob {\n name: string;\n\n constructor(fileBits: BlobPart[], fileName: string, options?: FilePropertyBag) {\n if (options) {\n const { type, ...rest } = options;\n super(fileBits, { type });\n Object.assign(this, rest);\n } else {\n super(fileBits);\n }\n\n this.name = fileName;\n }\n } as typeof File;\n}\n\nexport function dataUriToBlob(dataUri: string) {\n const arr = dataUri.split(',');\n const mime = arr[0].match(/:(.*?);/)![1];\n const bstr = atob(arr[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n\n return new Blob([u8arr], { type: mime });\n}\n\nexport function blobToDataUri(blob: Blob): Promise {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e: ProgressEvent) => {\n const { result } = e.target || {};\n if (typeof result === 'string') {\n resolve(result);\n }\n\n reject(new Error('Failed to read blob'));\n };\n\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport function blobToFile(blob: Blob, fileName: string) {\n return new File([blob], fileName, {\n lastModified: Date.now(),\n type: blob.type,\n });\n}\n\nexport function preloadImage(url: string): Promise {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = url;\n });\n}\n\nexport function preloadVideo(url: string): Promise {\n return new Promise((resolve, reject) => {\n const video = document.createElement('video');\n video.volume = 0;\n video.onloadedmetadata = () => resolve(video);\n video.onerror = reject;\n video.src = url;\n });\n}\n\nexport async function createPosterForVideo(url: string): Promise {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise,\n new Promise((resolve, reject) => {\n video.onseeked = () => {\n if (!video.videoWidth || !video.videoHeight) {\n resolve(undefined);\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(video, 0, 0);\n resolve(canvas.toDataURL('image/jpeg'));\n };\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n }),\n ]);\n}\n\nexport async function fetchBlob(blobUrl: string) {\n const response = await fetch(blobUrl);\n return response.blob();\n}\n\nexport async function fetchFile(blobUrl: string, fileName: string) {\n const blob = await fetchBlob(blobUrl);\n return blobToFile(blob, fileName);\n}\n\nexport function imgToCanvas(img: HTMLImageElement) {\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0);\n\n return canvas;\n}\n","function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(customStore, callback) {\n return customStore('readonly', (store) => {\n // This would be store.getAllKeys(), but it isn't supported by Edge or Safari.\n // And openKeyCursor isn't supported by Safari.\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push(cursor.key)).then(() => items);\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push(cursor.value)).then(() => items);\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push([cursor.key, cursor.value])).then(() => items);\n}\n\nexport { clear, createStore, del, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","import * as idb from 'idb-keyval';\n\nimport { ApiSessionData } from '../api/types';\n\nimport { DEBUG, LEGACY_SESSION_KEY, SESSION_USER_KEY } from '../config';\nimport * as cacheApi from './cacheApi';\n\nconst DC_IDS = [1, 2, 3, 4, 5];\n\nexport function hasStoredSession(withLegacy = false) {\n if (withLegacy && localStorage.getItem(LEGACY_SESSION_KEY)) {\n return true;\n }\n\n const userAuthJson = localStorage.getItem(SESSION_USER_KEY);\n if (!userAuthJson) return false;\n\n try {\n const userAuth = JSON.parse(userAuthJson);\n return Boolean(userAuth && userAuth.id && userAuth.dcID);\n } catch (err) {\n // Do nothing.\n return false;\n }\n}\n\nexport function storeSession(sessionData: ApiSessionData, currentUserId?: number) {\n const { mainDcId, keys, hashes } = sessionData;\n\n localStorage.setItem(SESSION_USER_KEY, JSON.stringify({ dcID: mainDcId, id: currentUserId }));\n localStorage.setItem('dc', String(mainDcId));\n Object.keys(keys).map(Number).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_auth_key`, JSON.stringify(keys[dcId]));\n });\n Object.keys(hashes).map(Number).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_hash`, JSON.stringify(hashes[dcId]));\n });\n}\n\nexport function clearStoredSession() {\n [\n SESSION_USER_KEY,\n 'dc',\n ...DC_IDS.map((dcId) => `dc${dcId}_auth_key`),\n ...DC_IDS.map((dcId) => `dc${dcId}_hash`),\n ].forEach((key) => {\n localStorage.removeItem(key);\n });\n}\n\nexport function loadStoredSession(): ApiSessionData | undefined {\n if (!hasStoredSession()) {\n return undefined;\n }\n\n const userAuth = JSON.parse(localStorage.getItem(SESSION_USER_KEY)!);\n const mainDcId = Number(userAuth.dcID);\n const keys: Record = {};\n const hashes: Record = {};\n\n DC_IDS.forEach((dcId) => {\n try {\n const key = localStorage.getItem(`dc${dcId}_auth_key`);\n if (key) {\n keys[dcId] = JSON.parse(key);\n }\n\n const hash = localStorage.getItem(`dc${dcId}_hash`);\n if (hash) {\n hashes[dcId] = JSON.parse(hash);\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load stored session', err);\n }\n // Do nothing.\n }\n });\n\n if (!Object.keys(keys).length) return undefined;\n\n return {\n mainDcId,\n keys,\n hashes,\n };\n}\n\nexport async function importLegacySession() {\n const sessionId = localStorage.getItem(LEGACY_SESSION_KEY);\n if (!sessionId) return;\n\n const sessionJson = await idb.get(`GramJs:${sessionId}`);\n try {\n const sessionData = JSON.parse(sessionJson) as ApiSessionData;\n storeSession(sessionData);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load legacy session', err);\n }\n // Do nothing.\n }\n}\n\n// Remove previously created IndexedDB and cache API sessions\nexport async function clearLegacySessions() {\n localStorage.removeItem(LEGACY_SESSION_KEY);\n\n const idbKeys = await idb.keys();\n\n await Promise.all>([\n cacheApi.clear('GramJs'),\n ...idbKeys\n .filter((k) => typeof k === 'string' && k.startsWith('GramJs:GramJs-session-'))\n .map((k) => idb.del(k)),\n ]);\n}\n\nexport function importTestSession() {\n const sessionJson = process.env.TEST_SESSION!;\n try {\n const sessionData = JSON.parse(sessionJson) as ApiSessionData & { userId: number };\n storeSession(sessionData, sessionData.userId);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load test session', err);\n }\n // Do nothing.\n }\n}\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n// Version 2c193ce 28.05.2021\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nexport function removeVS16s(rawEmoji) {\n return rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji;\n}\n\n// This file is generated by source/emoji/scripts/generate.sh\n// eslint-disable-next-line max-len\nexport default /(?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91])|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f|\\u2696\\ufe0f|\\u2708\\ufe0f|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)((?:\\ud83c[\\udffb-\\udfff]|\\ufe0f)\\u200d[\\u2640\\u2642]\\ufe0f)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f\\u200d\\u26a7\\ufe0f|\\ud83c\\udff3\\ufe0f\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f|\\u2764\\ufe0f\\u200d\\ud83d\\udd25|\\u2764\\ufe0f\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f|\\ud83e\\uddde\\u200d\\u2640\\ufe0f|\\ud83e\\uddde\\u200d\\u2642\\ufe0f|\\ud83e\\udddf\\u200d\\u2640\\ufe0f|\\ud83e\\udddf\\u200d\\u2642\\ufe0f|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f?\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd1d\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78\\udd7a-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcb\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7a\\ude80-\\ude86\\ude90-\\udea8\\udeb0-\\udeb6\\udec0-\\udec2\\uded0-\\uded6]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f/g;\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport Spinner from './Spinner';\n\nimport './Loading.scss';\n\ntype OwnProps = {\n color?: 'blue' | 'white' | 'black';\n};\n\nconst Loading: FC = ({ color = 'blue' }) => {\n return (\n

\n \n
\n );\n};\n\nexport default memo(Loading);\n","import { MouseEvent as ReactMouseEvent, RefObject } from 'react';\n\nimport React, {\n FC, useRef, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Spinner from './Spinner';\nimport RippleEffect from './RippleEffect';\n\nimport './Button.scss';\n\nexport type OwnProps = {\n ref?: RefObject;\n type?: 'button' | 'submit' | 'reset';\n children: any;\n size?: 'default' | 'smaller' | 'tiny';\n color?: 'primary' | 'secondary' | 'gray' | 'danger' | 'translucent' | 'translucent-white' | 'dark';\n className?: string;\n round?: boolean;\n pill?: boolean;\n fluid?: boolean;\n isText?: boolean;\n isLoading?: boolean;\n ariaLabel?: string;\n href?: string;\n download?: string;\n disabled?: boolean;\n ripple?: boolean;\n faded?: boolean;\n tabIndex?: number;\n isRtl?: boolean;\n onClick?: (e: ReactMouseEvent) => void;\n onContextMenu?: (e: ReactMouseEvent) => void;\n onMouseDown?: (e: ReactMouseEvent) => void;\n onMouseEnter?: NoneToVoidFunction;\n onMouseLeave?: NoneToVoidFunction;\n onFocus?: NoneToVoidFunction;\n};\n\n// Longest animation duration;\nconst CLICKED_TIMEOUT = 400;\n\nconst Button: FC = ({\n ref,\n type = 'button',\n onClick,\n onContextMenu,\n onMouseDown,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n children,\n size = 'default',\n color = 'primary',\n className,\n round,\n pill,\n fluid,\n isText,\n isLoading,\n ariaLabel,\n href,\n download,\n disabled,\n ripple,\n faded,\n tabIndex,\n isRtl,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef(null);\n if (ref) {\n elementRef = ref;\n }\n\n const [isClicked, setIsClicked] = useState(false);\n\n const fullClassName = buildClassName(\n 'Button',\n className,\n size,\n color,\n round && 'round',\n pill && 'pill',\n fluid && 'fluid',\n disabled && 'disabled',\n isText && 'text',\n isLoading && 'loading',\n ripple && 'has-ripple',\n faded && 'faded',\n isClicked && 'clicked',\n );\n\n const handleClick = useCallback((e: ReactMouseEvent) => {\n if (!disabled && onClick) {\n onClick(e);\n }\n\n setIsClicked(true);\n setTimeout(() => {\n setIsClicked(false);\n }, CLICKED_TIMEOUT);\n }, [disabled, onClick]);\n\n const handleMouseDown = useCallback((e: ReactMouseEvent) => {\n e.preventDefault();\n if (!disabled && onMouseDown) {\n onMouseDown(e);\n }\n }, [onMouseDown, disabled]);\n\n if (href) {\n return (\n }\n className={fullClassName}\n href={href}\n title={ariaLabel}\n download={download}\n tabIndex={tabIndex}\n dir={isRtl ? 'rtl' : undefined}\n >\n {children}\n {!disabled && ripple && (\n \n )}\n \n );\n }\n\n return (\n // eslint-disable-next-line react/button-has-type\n }\n type={type}\n className={fullClassName}\n onClick={handleClick}\n onContextMenu={onContextMenu}\n onMouseDown={handleMouseDown}\n onMouseEnter={onMouseEnter && !disabled ? onMouseEnter : undefined}\n onMouseLeave={onMouseLeave && !disabled ? onMouseLeave : undefined}\n onFocus={onFocus && !disabled ? onFocus : undefined}\n aria-label={ariaLabel}\n title={ariaLabel}\n tabIndex={tabIndex}\n dir={isRtl ? 'rtl' : undefined}\n >\n {isLoading ? (\n
\n Please wait..\n \n
\n ) : children}\n {!disabled && ripple && (\n \n )}\n \n );\n};\n\nexport default Button;\n","import React from '../../../lib/teact/teact';\nimport EMOJI_REGEX, { removeVS16s } from '../../../lib/twemojiRegex';\n\nimport { RE_LINK_TEMPLATE, RE_MENTION_TEMPLATE } from '../../../config';\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\nimport { nativeToUnfified } from '../../../util/emoji';\nimport buildClassName from '../../../util/buildClassName';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\n\ntype TextPart = string | Element;\n\nconst RE_LETTER_OR_DIGIT = /^[\\d\\wа-яё]$/i;\nconst SIMPLE_MARKDOWN_REGEX = /(\\*\\*|__).+?\\1/g;\n\nexport default function renderText(\n part: TextPart,\n filters: Array<(\n 'escape_html' | 'hq_emoji' | 'emoji' | 'emoji_html' | 'br' | 'br_html' | 'highlight' | 'links' |\n 'simple_markdown' | 'simple_markdown_html'\n )> = ['emoji'],\n params?: { highlight: string | undefined },\n): TextPart[] {\n if (typeof part !== 'string') {\n return [part];\n }\n\n return filters.reduce((text, filter) => {\n switch (filter) {\n case 'escape_html':\n return escapeHtml(text);\n\n case 'hq_emoji':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'big', 'jsx');\n\n case 'emoji':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'small', 'jsx');\n\n case 'emoji_html':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'small', 'html');\n\n case 'br':\n return addLineBreaks(text, 'jsx');\n\n case 'br_html':\n return addLineBreaks(text, 'html');\n\n case 'highlight':\n return addHighlight(text, params!.highlight);\n\n case 'links':\n return addLinks(text);\n\n case 'simple_markdown':\n return replaceSimpleMarkdown(text, 'jsx');\n\n case 'simple_markdown_html':\n return replaceSimpleMarkdown(text, 'html');\n }\n\n return text;\n }, [part] as TextPart[]);\n}\n\nfunction escapeHtml(textParts: TextPart[]): TextPart[] {\n const divEl = document.createElement('div');\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n divEl.innerText = part;\n\n return [...result, divEl.innerHTML];\n }, [] as TextPart[]);\n}\n\nfunction replaceEmojis(textParts: TextPart[], size: 'big' | 'small', type: 'jsx' | 'html'): TextPart[] {\n if (IS_EMOJI_SUPPORTED) {\n return textParts;\n }\n\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const parts = part.split(EMOJI_REGEX);\n const emojis = part.match(EMOJI_REGEX) || [];\n result.push(parts[0]);\n\n return emojis.reduce((emojiResult: TextPart[], emoji, i) => {\n const code = nativeToUnfified(removeVS16s(emoji));\n const className = buildClassName(\n 'emoji',\n size === 'small' && 'emoji-small',\n );\n if (type === 'jsx') {\n emojiResult.push(\n ,\n );\n }\n if (type === 'html') {\n emojiResult.push(\n // For preventing extra spaces in html\n // eslint-disable-next-line max-len\n `\"${emoji}\"`,\n );\n }\n\n const index = i * 2 + 2;\n if (parts[index]) {\n emojiResult.push(parts[index]);\n }\n\n return emojiResult;\n }, result);\n }, [] as TextPart[]);\n}\n\nfunction addLineBreaks(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n return [...result, ...part\n .split(/\\r\\n|\\r|\\n/g)\n .reduce((parts: TextPart[], line: string, i, source) => {\n // This adds non-breaking space if line was indented with spaces, to preserve the indentation\n const trimmedLine = line.trimLeft();\n const indentLength = line.length - trimmedLine.length;\n parts.push(String.fromCharCode(160).repeat(indentLength) + trimmedLine);\n\n if (i !== source.length - 1) {\n parts.push(\n type === 'jsx' ?
: '
',\n );\n }\n\n return parts;\n }, [])];\n }, [] as TextPart[]);\n}\n\nfunction addHighlight(textParts: TextPart[], highlight: string | undefined): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string' || !highlight) {\n return [...result, part];\n }\n\n const lowerCaseText = part.toLowerCase();\n const queryPosition = lowerCaseText.indexOf(highlight.toLowerCase());\n const nextSymbol = lowerCaseText[queryPosition + highlight.length];\n if (queryPosition < 0 || (nextSymbol && nextSymbol.match(RE_LETTER_OR_DIGIT))) {\n return [...result, part];\n }\n\n const newParts: TextPart[] = [];\n newParts.push(part.substring(0, queryPosition));\n newParts.push(\n \n {part.substring(queryPosition, queryPosition + highlight.length)}\n ,\n );\n newParts.push(part.substring(queryPosition + highlight.length));\n\n return [...result, ...newParts];\n }, [] as TextPart[]);\n}\n\nconst RE_LINK = new RegExp(`${RE_LINK_TEMPLATE}|${RE_MENTION_TEMPLATE}`, 'ig');\n\nfunction addLinks(textParts: TextPart[]): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const links = part.match(RE_LINK);\n if (!links || !links.length) {\n return [...result, part];\n }\n\n const content: TextPart[] = [];\n\n let nextLink = links.shift();\n let lastIndex = 0;\n while (nextLink) {\n const index = part.indexOf(nextLink, lastIndex);\n content.push(part.substring(lastIndex, index));\n if (nextLink.startsWith('@')) {\n content.push(\n \n {nextLink}\n ,\n );\n } else {\n if (nextLink.endsWith('?')) {\n nextLink = nextLink.slice(0, nextLink.length - 1);\n }\n\n content.push(\n ,\n );\n }\n lastIndex = index + nextLink.length;\n nextLink = links.shift();\n }\n content.push(part.substring(lastIndex));\n\n return [...result, ...content];\n }, [] as TextPart[]);\n}\n\nfunction replaceSimpleMarkdown(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const parts = part.split(SIMPLE_MARKDOWN_REGEX);\n const entities = part.match(SIMPLE_MARKDOWN_REGEX) || [];\n result.push(parts[0]);\n\n return entities.reduce((entityResult: TextPart[], entity, i) => {\n if (type === 'jsx') {\n entityResult.push(\n entity.startsWith('**')\n ? {entity.replace(/\\*\\*/g, '')}\n : {entity.replace(/__/g, '')},\n );\n } else {\n entityResult.push(\n entity.startsWith('**')\n ? `${entity.replace(/\\*\\*/g, '')}`\n : `${entity.replace(/__/g, '')}`,\n );\n }\n\n const index = i * 2 + 2;\n if (parts[index]) {\n entityResult.push(parts[index]);\n }\n\n return entityResult;\n }, result);\n }, [] as TextPart[]);\n}\n","// This data was received from Telegram Desktop (Telegram/Resources/numbers.txt)\nconst DATA = `AF🇦🇫93Afghanistan333\nAO🇦🇴244Angola333\nAL🇦🇱355Albania234\nAD🇦🇩376Andorra222\nAE🇦🇪971United Arab Emirates234\nAI🇦🇮1264Anguilla34\nAR🇦🇷54Argentina\nAM🇦🇲374Armenia233\nAG🇦🇬1268Antigua and Barbuda34\nAU🇦🇺61Australia333\nAS🇦🇸1684American Samoa34\nAT🇦🇹43Austria\nAW🇦🇼297Aruba34\nAZ🇦🇿994Azerbaijan2322\nBI🇧🇮257Burundi224\nBE🇧🇪32Belgium3222\nBJ🇧🇯229Benin233\nBF🇧🇫226Burkina Faso2222\nBD🇧🇩880Bangladesh\nBG🇧🇬359Bulgaria\nBH🇧🇭973Bahrain44\nBS🇧🇸1242Bahamas34\nBA🇧🇦387Bosnia and Herzegovina\nBY🇧🇾375Belarus2322\nBZ🇧🇿501Belize\nBO🇧🇴591Bolivia134\nBR🇧🇷55Brazil254\nBB🇧🇧1246Barbados34\nBM🇧🇲1441Bermuda34\nBN🇧🇳673Brunei34\nBQ🇧🇶599Bonaire, Sint Eustatius and Saba\nBT🇧🇹975Bhutan\nBW🇧🇼267Botswana233\nCF🇨🇫236Central African Republic2222\nCA🇨🇦1Canada334\nCH🇨🇭41Switzerland234\nCK🇨🇰682Cook Islands\nCL🇨🇱56Chile144\nCN🇨🇳86China344\nCI🇨🇮225Côte d\\`Ivoire233\nCM🇨🇲237Cameroon44\nCD🇨🇩243DR Congo234\nCG🇨🇬242Republic of the Congo234\nCO🇨🇴57Colombia334\nKM🇰🇲269Comoros34\nCV🇨🇻238Cape Verde34\nCR🇨🇷506Costa Rica\nCU🇨🇺53Cuba44\nCY🇨🇾357Cyprus44\nCW🇨🇼599Curaçao\nCZ🇨🇿420Czech Republic\nDE🇩🇪49Germany38\nDJ🇩🇯253Djibouti2222\nDM🇩🇲1767Dominica34\nDK🇩🇰45Denmark44\nDO🇩🇴1Dominican Republic334\nDZ🇩🇿213Algeria3222\nEC🇪🇨593Ecuador\nEG🇪🇬20Egypt234\nER🇪🇷291Eritrea133\nES🇪🇸34Spain333\nEE🇪🇪372Estonia\nET🇪🇹251Ethiopia234\nFI🇫🇮358Finland\nFJ🇫🇯679Fiji\nFK🇫🇰500Falkland Islands\nFM🇫🇲691Micronesia\nFO🇫🇴298Faroe Islands33\nFR🇫🇷33France12222\nGA🇬🇦241Gabon1222\nGB🇬🇧44United Kingdom46\nGE🇬🇪995Georgia\nGF🇬🇫594French Guiana\nGH🇬🇭233Ghana\nGI🇬🇮350Gibraltar44\nGL🇬🇱299Greenland33\nGN🇬🇳224Guinea333\nGM🇬🇲220Gambia34\nGP🇬🇵590Guadeloupe\nGU🇬🇺1671Guam34\nGW🇬🇼245Guinea-Bissau34\nGQ🇬🇶240Equatorial Guinea333\nGR🇬🇷30Greece244\nGD🇬🇩1473Grenada34\nGT🇬🇹502Guatemala134\nGY🇬🇾592Guyana\nHK🇭🇰852Hong Kong\nHN🇭🇳504Honduras44\nHR🇭🇷385Croatia\nHT🇭🇹509Haiti\nHU🇭🇺36Hungary234\nID🇮🇩62Indonesia\nIN🇮🇳91India55\nIO🇩🇬246Diego Garcia34\nIE🇮🇪353Ireland234\nIR🇮🇷98Iran334\nIQ🇮🇶964Iraq334\nIS🇮🇸354Iceland34\nIL🇮🇱972Israel234\nIT🇮🇹39Italy334\nJM🇯🇲1876Jamaica34\nJO🇯🇴962Jordan144\nJP🇯🇵81Japan244\nKZ🇰🇿7Kazakhstan3322\nKE🇰🇪254Kenya333\nKG🇰🇬996Kyrgyzstan\nKH🇰🇭855Cambodia\nKI🇰🇮686Kiribati\nKN🇰🇳1869Saint Kitts and Nevis34\nKR🇰🇷82South Korea\nKW🇰🇼965Kuwait44\nKY🇰🇾1345Cayman Islands34\nLA🇱🇦856Laos\nLB🇱🇧961Lebanon\nLR🇱🇷231Liberia\nLY🇱🇾218Libya234\nLC🇱🇨1758Saint Lucia34\nLI🇱🇮423Liechtenstein\nLK🇱🇰94Sri Lanka234\nLS🇱🇸266Lesotho233\nLT🇱🇹370Lithuania35\nLU🇱🇺352Luxembourg\nLV🇱🇻371Latvia35\nMA🇲🇦212Morocco234\nMC🇲🇨377Monaco44\nMD🇲🇩373Moldova233\nMG🇲🇬261Madagascar2232\nMP🇲🇵1670Northern Mariana Islands34\nMO🇲🇴853Macau\nMS🇲🇸1664Montserrat34\nMV🇲🇻960Maldives\nMX🇲🇽52Mexico\nMH🇲🇭692Marshall Islands\nMK🇲🇰389Macedonia\nML🇲🇱223Mali44\nMT🇲🇹356Malta2222\nMM🇲🇲95Myanmar\nME🇲🇪382Montenegro\nMN🇲🇳976Mongolia\nMZ🇲🇿258Mozambique234\nMQ🇲🇶596Martinique\nMR🇲🇷222Mauritania44\nMU🇲🇺230Mauritius\nMW🇲🇼265Malawi\nMY🇲🇾60Malaysia\nNA🇳🇦264Namibia234\nNC🇳🇨687New Caledonia6\nNE🇳🇪227Niger2222\nNF🇳🇫672Norfolk Island\nNG🇳🇬234Nigeria\nNI🇳🇮505Nicaragua44\nNL🇳🇱31Netherlands12222\nNO🇳🇴47Norway44\nNP🇳🇵977Nepal\nNU🇳🇺683Niue\nNR🇳🇷674Nauru\nNZ🇳🇿64New Zealand\nOM🇴🇲968Oman44\nPK🇵🇰92Pakistan334\nPA🇵🇦507Panama44\nPE🇵🇪51Peru333\nPF🇵🇫689French Polynesia\nPH🇵🇭63Philippines334\nPM🇵🇲508Saint Pierre and Miquelon\nPR🇵🇷1Puerto Rico334\nPS🇵🇸970Palestine324\nPW🇵🇼680Palau\nPG🇵🇬675Papua New Guinea\nPL🇵🇱48Poland333\nKP🇰🇵850North Korea\nPT🇵🇹351Portugal144\nPY🇵🇾595Paraguay333\nQA🇶🇦974Qatar\nRE🇷🇪262Réunion333\nRO🇷🇴40Romania333\nRU🇷🇺7Russia3322\nRW🇷🇼250Rwanda333\nSA🇸🇦966Saudi Arabia\nSD🇸🇩249Sudan234\nSN🇸🇳221Senegal234\nSG🇸🇬65Singapore44\nSH🇸🇭290Saint Helena23\nSH🇸🇭247Saint Helena4\nSB🇸🇧677Solomon Islands\nSL🇸🇱232Sierra Leone233\nSV🇸🇻503El Salvador44\nSM🇸🇲378San Marino334\nSO🇸🇴252Somalia233\nRS🇷🇸381Serbia234\nSS🇸🇸211South Sudan234\nST🇸🇹239São Tomé and Príncipe25\nSR🇸🇷597Suriname34\nSK🇸🇰421Slovakia\nSI🇸🇮386Slovenia\nSE🇸🇪46Sweden234\nSZ🇸🇿268Swaziland44\nSC🇸🇨248Seychelles1222\nSX🇸🇽1721Sint Maarten34\nSY🇸🇾963Syria\nTC🇹🇨1649Turks and Caicos Islands34\nTD🇹🇩235Chad2222\nTG🇹🇬228Togo233\nTH🇹🇭66Thailand144\nTJ🇹🇯992Tajikistan\nTK🇹🇰690Tokelau\nTM🇹🇲993Turkmenistan26\nTL🇹🇱670Timor-Leste\nTO🇹🇴676Tonga\nTT🇹🇹1868Trinidad and Tobago34\nTN🇹🇳216Tunisia233\nTR🇹🇷90Turkey334\nTV🇹🇻688Tuvalu\nTW🇹🇼886Taiwan\nTZ🇹🇿255Tanzania234\nUG🇺🇬256Uganda234\nUA🇺🇦380Ukraine2322\nUY🇺🇾598Uruguay44\nUS🇺🇸1United States334\nUZ🇺🇿998Uzbekistan27\nVA🇻🇦3Vatican City\nVC🇻🇨1784Saint Vincent and the Grenadines34\nVE🇻🇪58Venezuela334\nVG🇻🇬1284British Virgin Islands34\nVI🇻🇮1340US Virgin Islands34\nVN🇻🇳84Vietnam\nVU🇻🇺678Vanuatu\nWF🇼🇫681Wallis and Futuna\nWS🇼🇸685Samoa\nXK🇽🇰383Kosovo44\nYE🇾🇪967Yemen333\nZA🇿🇦27South Africa234\nZM🇿🇲260Zambia234\nZW🇿🇼263Zimbabwe234`;\n\nconst formatsCache: Record = {};\nexport const defaultPhoneNumberFormat = /(\\d{1,3})(\\d{1,3})?(\\d{1,3})?(\\d{1,3})?(\\d{1,3})?/;\n\nconst parsed = DATA\n .split('\\n')\n .map((str) => {\n const id = str.substr(0, 2);\n const flag = str.substr(2, 4);\n const code = `+${str.match(/\\d+/)![0]}`;\n const name = str.split(/\\d+/)[1];\n const format = str.match(/\\d+$/);\n const phoneFormat = getPhoneNumberFormat(format);\n\n return {\n id, flag, code, name, phoneFormat,\n };\n });\n\nfunction getPhoneNumberFormat(format: RegExpMatchArray | null) {\n if (!format) {\n return defaultPhoneNumberFormat;\n }\n\n const formatValue = format[0] as string;\n let phoneNumberFormat;\n\n if (!formatsCache[formatValue]) {\n const phoneNumberGroups = formatValue.split('').map(Number);\n phoneNumberFormat = phoneNumberGroups.reduce((result, count, i) => {\n return `${result}(\\\\d{1,${count}})${i > 0 ? '?' : ''}`;\n }, '');\n formatsCache[formatValue] = new RegExp(`${phoneNumberFormat}${'()?'.repeat(5 - phoneNumberGroups.length)}`);\n }\n\n return formatsCache[formatValue];\n}\n\nexport default parsed;\n","import countryList, { defaultPhoneNumberFormat } from './countries';\n\nexport function getCountryById(id: string) {\n return countryList.find((c) => c.id === id) as Country;\n}\n\n// Empty groups are used to preserve 5 callback arguments for `replace` method\nfunction getPhoneNumberFormat(country?: Country) {\n return country ? country.phoneFormat : defaultPhoneNumberFormat;\n}\n\nexport function getCountryFromPhoneNumber(input: string) {\n let phoneNumber = input.replace(/[^\\d+]+/g, '');\n if (!phoneNumber.startsWith('+')) {\n phoneNumber = `+${phoneNumber}`;\n }\n\n const possibleCountries = countryList\n .filter((country: Country) => phoneNumber.startsWith(country.code))\n .sort((a, b) => a.code.length - b.code.length);\n\n return possibleCountries[possibleCountries.length - 1];\n}\n\nexport function formatPhoneNumber(input: string, country?: Country) {\n let phoneNumber = input.replace(/[^\\d]+/g, '');\n if (country) {\n phoneNumber = phoneNumber.substr(country.code.length - 1);\n } else if (input.startsWith('+')) {\n return input;\n }\n\n phoneNumber = phoneNumber.replace(getPhoneNumberFormat(country), (_, p1, p2, p3, p4, p5) => {\n const separator = country && country.id === 'GB' ? ' ' : '-';\n\n let output = '';\n if (p1) output = `${p1}`;\n if (p2) output += ` ${p2}`;\n if (p3) output += `${separator}${p3}`;\n if (p4) output += `${separator}${p4}`;\n if (p5) output += `${separator}${p5}`;\n return output;\n });\n\n return phoneNumber;\n}\n\nexport function formatPhoneNumberWithCode(phoneNumber: string) {\n const numberWithPlus = phoneNumber.startsWith('+') ? phoneNumber : `+${phoneNumber}`;\n const country = getCountryFromPhoneNumber(numberWithPlus);\n if (!country) {\n return numberWithPlus;\n }\n return `${country.code} ${formatPhoneNumber(numberWithPlus, country)}`;\n}\n\nexport { countryList };\n","import { useEffect } from '../lib/teact/teact';\n\nimport {\n BundleModules, Bundles, getModuleFromMemory, loadModule, addLoadListener,\n} from '../util/moduleLoader';\n\nimport useForceUpdate from './useForceUpdate';\n\nexport default >(\n bundleName: B, moduleName: M, noLoad = false, autoUpdate = false,\n) => {\n const module = getModuleFromMemory(bundleName, moduleName);\n const forceUpdate = useForceUpdate();\n\n if (autoUpdate) {\n // Use effect and cleanup for listener removal\n addLoadListener(forceUpdate);\n }\n\n useEffect(() => {\n if (!noLoad && !module) {\n loadModule(bundleName, moduleName).then(forceUpdate);\n }\n }, [bundleName, forceUpdate, module, moduleName, noLoad]);\n\n return module;\n};\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default (initial = false): [boolean, AnyToVoidFunction, AnyToVoidFunction] => {\n const [value, setValue] = useState(initial);\n\n const setTrue = useCallback(() => {\n setValue(true);\n }, []);\n\n const setFalse = useCallback(() => {\n setValue(false);\n }, []);\n\n return [value, setTrue, setFalse];\n};\n","import React, { FC } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Spinner.scss';\n\nconst Spinner: FC<{\n color?: 'blue' | 'white' | 'black' | 'green' | 'gray';\n withBackground?: boolean;\n}> = ({\n color = 'blue',\n withBackground,\n}) => {\n return (\n
\n
\n
\n );\n};\n\nexport default Spinner;\n","import { DEBUG_ALERT_MSG } from '../config';\nimport { throttle } from './schedulers';\n\nwindow.addEventListener('error', handleErrorEvent);\nwindow.addEventListener('unhandledrejection', handleErrorEvent);\n\n// eslint-disable-next-line prefer-destructuring\nconst APP_ENV = process.env.APP_ENV;\n\nfunction handleErrorEvent(e: ErrorEvent | PromiseRejectionEvent) {\n e.preventDefault();\n\n handleError(e instanceof ErrorEvent ? e.error : e.reason);\n}\n\nconst throttledAlert = throttle(window.alert, 1000);\n\nexport function handleError(err: Error) {\n // eslint-disable-next-line no-console\n console.error(err);\n\n if (APP_ENV === 'development' || APP_ENV === 'staging') {\n throttledAlert(`${DEBUG_ALERT_MSG}\\n\\n${(err && err.message) || err}\\n${err && err.stack}`);\n }\n}\n","export default function arePropsShallowEqual(currentProps: AnyLiteral, newProps: AnyLiteral) {\n if (currentProps === newProps) {\n return true;\n }\n\n const currentKeys = Object.keys(currentProps);\n const currentKeysLength = currentKeys.length;\n const newKeysLength = Object.keys(newProps).length;\n\n if (currentKeysLength !== newKeysLength) {\n return false;\n }\n\n if (currentKeysLength === 0) {\n return true;\n }\n\n for (let i = 0; i < currentKeysLength; i++) {\n const prop = currentKeys[i];\n if (currentProps[prop] !== newProps[prop]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function getUnequalProps(currentProps: AnyLiteral, newProps: AnyLiteral) {\n const currentKeys = Object.keys(currentProps);\n const currentKeysLength = currentKeys.length;\n const newKeysLength = Object.keys(newProps).length;\n\n if (currentKeysLength !== newKeysLength) {\n return ['%LENGTH%'];\n }\n\n return currentKeys.reduce((res, prop) => {\n if (currentProps[prop] !== newProps[prop]) {\n res.push(`${prop}: ${currentProps[prop]} => ${newProps[prop]}`);\n }\n\n return res;\n }, [] as string[]);\n}\n","import { useRef } from '../lib/teact/teact';\n\nfunction usePrevious(next: T): T | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined: true): Exclude | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined?: boolean): Exclude | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined?: boolean) {\n const ref = useRef();\n const { current } = ref;\n if (!shouldSkipUndefined || next !== undefined) {\n ref.current = next;\n }\n\n return current;\n}\n\nexport default usePrevious;\n","import { LangFn } from '../hooks/useLang';\n\nconst WEEKDAYS_FULL = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst MONTHS_FULL = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n];\n\nconst MONTHS_FULL_LOWERCASE = MONTHS_FULL.map((month) => month.toLowerCase());\nconst MIN_SEARCH_YEAR = 2015;\nconst MAX_DAY_IN_MONTH = 31;\nconst MAX_MONTH_IN_YEAR = 12;\nexport const MILISECONDS_IN_DAY = 24 * 60 * 60 * 1000;\n\nexport function getDayStart(datetime: number | Date) {\n const date = new Date(datetime);\n date.setHours(0, 0, 0, 0);\n return date;\n}\n\nexport function getDayStartAt(datetime: number | Date) {\n return getDayStart(datetime).getTime();\n}\n\nexport function toYearMonth(timestamp: number) {\n const date = new Date(timestamp * 1000);\n return `${date.getFullYear()}-${date.getMonth()}`;\n}\n\nfunction toIsoString(date: Date) {\n return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;\n}\n\nexport function formatTime(datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n\n return `${hours}:${minutes}`;\n}\n\nexport function formatPastTimeShort(lang: LangFn, datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n const today = getDayStart(new Date());\n if (date >= today) {\n return formatTime(date);\n }\n\n const weekAgo = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n if (date >= weekAgo) {\n return lang(`Weekday.Short${WEEKDAYS_FULL[date.getDay()]}`);\n }\n\n const withYear = date.getFullYear() !== today.getFullYear();\n const format = (\n lang(withYear ? 'formatDateScheduleYear' : 'formatDateSchedule')\n || (withYear ? 'd MMM yyyy' : 'd MMM')\n );\n\n return formatDate(lang, date, format);\n}\n\nexport function formatFullDate(lang: LangFn, datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const format = lang('formatterYearMax') || 'dd.MM.yyyy';\n\n return formatDate(lang, date, format);\n}\n\nexport function formatMonthAndYear(lang: LangFn, date: Date, isShort = false) {\n const format = lang(isShort ? 'formatterMonthYear2' : 'formatterMonthYear') || 'MMM yyyy';\n\n return formatDate(lang, date, format);\n}\n\nexport function formatHumanDate(lang: LangFn, datetime: number | Date, isShort = false, noWeekdays = false) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n const today = getDayStart(new Date());\n\n if (!noWeekdays) {\n if (toIsoString(date) === toIsoString(today)) {\n return (isShort ? lowerFirst : upperFirst)(lang('Weekday.Today'));\n }\n\n const yesterday = new Date(today);\n yesterday.setDate(today.getDate() - 1);\n if (toIsoString(date) === toIsoString(yesterday)) {\n return (isShort ? lowerFirst : upperFirst)(lang('Weekday.Yesterday'));\n }\n\n const weekAgo = new Date(today);\n const weekAhead = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n weekAhead.setDate(today.getDate() + 7);\n if (date >= weekAgo && date <= weekAhead) {\n const weekDay = WEEKDAYS_FULL[date.getDay()];\n return isShort\n ? lowerFirst(lang(`Weekday.Short${weekDay}`))\n : upperFirst(lang(`Weekday.${weekDay}`));\n }\n }\n\n const withYear = date.getFullYear() !== today.getFullYear();\n const formatKey = isShort\n ? (withYear ? 'formatDateScheduleYear' : 'formatDateSchedule')\n : (withYear ? 'chatFullDate' : 'chatDate');\n const format = lang(formatKey) || 'd MMMM yyyy';\n\n return (isShort ? lowerFirst : upperFirst)(formatDate(lang, date, format));\n}\n\nfunction formatDate(lang: LangFn, date: Date, format: string) {\n const day = date.getDate();\n const monthIndex = date.getMonth();\n\n return format\n .replace('LLLL', lang(MONTHS_FULL[monthIndex]))\n .replace('MMMM', lang(`Month.Gen${MONTHS_FULL[monthIndex]}`))\n .replace('MMM', lang(`Month.Short${MONTHS_FULL[monthIndex]}`))\n .replace('MM', String(monthIndex + 1).padStart(2, '0'))\n .replace('dd', String(day).padStart(2, '0'))\n .replace('d', String(day))\n .replace('yyyy', String(date.getFullYear()));\n}\n\nexport function formatMediaDateTime(lang: LangFn, datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n return `${formatHumanDate(lang, date, true)}, ${formatTime(date)}`;\n}\n\nexport function formatMediaDuration(duration: number) {\n const hours = Math.floor(duration / 3600);\n const minutes = Math.floor((duration % 3600) / 60);\n const seconds = Math.floor(duration % 3600 % 60);\n\n let string = '';\n if (hours > 0) {\n string += `${String(hours).padStart(2, '0')}:`;\n string += `${String(minutes).padStart(2, '0')}:`;\n } else {\n string += `${String(minutes)}:`;\n }\n string += String(seconds).padStart(2, '0');\n\n return string;\n}\n\nexport function formatVoiceRecordDuration(durationInMs: number) {\n const parts = [];\n\n let milliseconds = durationInMs % 1000;\n durationInMs -= milliseconds;\n milliseconds = Math.floor(milliseconds / 10);\n\n durationInMs = Math.floor(durationInMs / 1000);\n const seconds = durationInMs % 60;\n durationInMs -= seconds;\n\n durationInMs = Math.floor(durationInMs / 60);\n const minutes = durationInMs % 60;\n durationInMs -= minutes;\n\n durationInMs = Math.floor(durationInMs / 60);\n const hours = durationInMs % 60;\n\n if (hours > 0) {\n parts.push(String(hours).padStart(2, '0'));\n }\n parts.push(String(minutes).padStart(hours > 0 ? 2 : 1, '0'));\n parts.push(String(seconds).padStart(2, '0'));\n\n return `${parts.join(':')},${String(milliseconds).padStart(2, '0')}`;\n}\n\nexport function formatDateToString(date: Date, locale = 'en-US') {\n return date.toLocaleString(\n locale,\n {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n },\n );\n}\n\nfunction isValidDate(day: number, month: number, year = 2021): boolean {\n if (month > (MAX_MONTH_IN_YEAR - 1) || day > MAX_DAY_IN_MONTH) {\n return false;\n }\n const date = new Date(year, month, day);\n return !Number.isNaN(date.getTime()) && date.getDate() === day;\n}\n\nexport function parseDateString(query = ''): string | undefined {\n const matchStringDate = query.match(/\\d{1,2}\\s[a-zA-Z]{3,}/);\n const matchEuropeStringDate = query.match(/[a-zA-Z]{3,}\\s\\d{1,2}/);\n const matchNumberDate = query.match(/\\d{1,2}[./-]\\d{1,2}([./-]\\d{2,4})?/);\n if (!matchStringDate && !matchNumberDate && !matchEuropeStringDate) {\n return undefined;\n }\n\n if (matchNumberDate) {\n const [date, month, year] = query.split(/[./-]/).map(Number);\n return !(year && year < MIN_SEARCH_YEAR) && isValidDate(date, month - 1, year || undefined)\n ? `${year ? `${year}-` : ''}${String(month).padStart(2, '0')}-${String(date).padStart(2, '0')}`\n : undefined;\n }\n\n const dateParts = query.split(' ');\n const date = matchStringDate ? dateParts[0] : dateParts[1];\n const month = (matchStringDate ? dateParts[1] : dateParts[0]).toLowerCase();\n const monthIndex = MONTHS_FULL_LOWERCASE.findIndex((item) => item.startsWith(month));\n\n return monthIndex !== -1 && isValidDate(Number(date), monthIndex)\n ? `${String(monthIndex + 1).padStart(2, '0')}-${String(date).padStart(2, '0')}`\n : undefined;\n}\n\nexport function timestampPlusDay(timestamp: number) {\n return timestamp + MILISECONDS_IN_DAY / 1000;\n}\n\nfunction lowerFirst(str: string) {\n return `${str[0].toLowerCase()}${str.slice(1)}`;\n}\n\nfunction upperFirst(str: string) {\n return `${str[0].toUpperCase()}${str.slice(1)}`;\n}\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default () => {\n const [, setTrigger] = useState(false);\n\n return useCallback(() => {\n setTrigger((trigger) => !trigger);\n }, []);\n};\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Link.scss';\n\ntype OwnProps = {\n children: any;\n className?: string;\n isRtl?: boolean;\n onClick?: (e: React.MouseEvent) => void;\n};\n\nconst Link: FC = ({\n children, className, isRtl, onClick,\n}) => {\n const handleClick = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n onClick!(e);\n }, [onClick]);\n\n return (\n \n {children}\n \n );\n};\n\nexport default Link;\n","export default (store: AnyLiteral) => {\n let id;\n\n do {\n id = String(Math.random()).replace('0.', 'id');\n } while (store.hasOwnProperty(id));\n\n return id;\n};\n","import { callApi } from '../api/gramjs';\nimport { ApiChat, ApiMessage, ApiUser } from '../api/types';\nimport { renderActionMessageText } from '../components/common/helpers/renderActionMessageText';\nimport { DEBUG } from '../config';\nimport { getDispatch, getGlobal, setGlobal } from '../lib/teact/teactn';\nimport {\n getChatTitle,\n getMessageAction,\n getMessageSenderName,\n getMessageSummaryText,\n getPrivateChatUserId,\n isActionMessage,\n isChatChannel,\n selectIsChatMuted,\n} from '../modules/helpers';\nimport { getTranslation } from './langProvider';\nimport { addNotifyExceptions, replaceSettings } from '../modules/reducers';\nimport {\n selectChatMessage, selectNotifyExceptions, selectNotifySettings, selectUser,\n} from '../modules/selectors';\nimport { IS_SERVICE_WORKER_SUPPORTED } from './environment';\n\nfunction getDeviceToken(subscription: PushSubscription) {\n const data = subscription.toJSON();\n return JSON.stringify({\n endpoint: data.endpoint,\n keys: data.keys,\n });\n}\n\nfunction checkIfPushSupported() {\n if (!IS_SERVICE_WORKER_SUPPORTED) return false;\n if (!('showNotification' in ServiceWorkerRegistration.prototype)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] Push notifications aren\\'t supported.');\n }\n return false;\n }\n\n // Check the current Notification permission.\n // If its denied, it's a permanent block until the\n // user changes the permission\n if (Notification.permission === 'denied') {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n return false;\n }\n\n // Check if push messaging is supported\n if (!('PushManager' in window)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] Push messaging isn\\'t supported.');\n }\n return false;\n }\n return true;\n}\n\nfunction checkIfNotificationsSupported() {\n // Let's check if the browser supports notifications\n if (!('Notification' in window)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] This browser does not support desktop notification');\n }\n return false;\n }\n\n if (Notification.permission === 'denied' as NotificationPermission) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n return false;\n }\n return true;\n}\n\nconst expirationTime = 12 * 60 * 60 * 1000; // 12 hours\n\nfunction checkIfShouldResubscribe(subscription: PushSubscription | null) {\n const global = getGlobal();\n if (!global.push || !subscription) return true;\n if (getDeviceToken(subscription) !== global.push.deviceToken) return true;\n return Date.now() - global.push.subscribedAt > expirationTime;\n}\n\nasync function requestPermission() {\n if (!('Notification' in window)) return;\n if (!['granted', 'denied'].includes(Notification.permission)) {\n await Notification.requestPermission();\n }\n}\n\nasync function unsubscribeFromPush(subscription: PushSubscription | null) {\n const global = getGlobal();\n const dispatch = getDispatch();\n if (subscription) {\n try {\n const deviceToken = getDeviceToken(subscription);\n await callApi('unregisterDevice', deviceToken);\n await subscription.unsubscribe();\n dispatch.deleteDeviceToken();\n return;\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unable to unsubscribe from push.', error);\n }\n }\n }\n if (global.push) {\n await callApi('unregisterDevice', global.push.deviceToken);\n dispatch.deleteDeviceToken();\n }\n}\n\nexport async function unsubscribe() {\n if (!checkIfPushSupported()) return;\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n const subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n await unsubscribeFromPush(subscription);\n}\n\n// Indicates if notification settings are loaded from the api\nlet areSettingsLoaded = false;\n\n// Load notification settings from the api\nasync function loadNotificationSettings() {\n if (areSettingsLoaded) return;\n const [resultSettings, resultExceptions] = await Promise.all([\n callApi('fetchNotificationSettings', {\n serverTimeOffset: getGlobal().serverTimeOffset,\n }),\n callApi('fetchNotificationExceptions', {\n serverTimeOffset: getGlobal().serverTimeOffset,\n }),\n ]);\n if (!resultSettings) return;\n\n let global = replaceSettings(getGlobal(), resultSettings);\n if (resultExceptions) {\n global = addNotifyExceptions(global, resultExceptions);\n }\n setGlobal(global);\n areSettingsLoaded = true;\n}\n\nexport async function subscribe() {\n if (!checkIfPushSupported()) {\n // Ask for notification permissions only if service worker notifications are not supported\n // As pushManager.subscribe automatically triggers permission popup\n await requestPermission();\n return;\n }\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n let subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n if (!checkIfShouldResubscribe(subscription)) return;\n await unsubscribeFromPush(subscription);\n try {\n subscription = await serviceWorkerRegistration.pushManager.subscribe({\n userVisibleOnly: true,\n });\n const deviceToken = getDeviceToken(subscription);\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Received push subscription: ', deviceToken);\n }\n await callApi('registerDevice', deviceToken);\n getDispatch()\n .setDeviceToken(deviceToken);\n } catch (error) {\n if (Notification.permission === 'denied' as NotificationPermission) {\n // The user denied the notification permission which\n // means we failed to subscribe and the user will need\n // to manually change the notification permission to\n // subscribe to push messages\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n } else if (DEBUG) {\n // A problem occurred with the subscription, this can\n // often be down to an issue or lack of the gcm_sender_id\n // and / or gcm_user_visible_only\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unable to subscribe to push.', error);\n\n // Request permissions and fall back to local notifications\n // if pushManager.subscribe was aborted due to invalid VAPID key.\n if (error.code === DOMException.ABORT_ERR) {\n await requestPermission();\n }\n }\n }\n}\n\nfunction checkIfShouldNotify(chat: ApiChat, isActive: boolean) {\n if (!areSettingsLoaded) return false;\n const global = getGlobal();\n if (selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)) || chat.isNotJoined\n || !chat.isListed) {\n return false;\n }\n // Dont show notification for active chat if client has focus\n return !(isActive && document.hasFocus());\n}\n\nfunction getNotificationContent(chat: ApiChat, message: ApiMessage) {\n const global = getGlobal();\n const {\n senderId,\n replyToMessageId,\n } = message;\n const messageSender = senderId ? selectUser(global, senderId) : undefined;\n const messageAction = getMessageAction(message as ApiMessage);\n const actionTargetMessage = messageAction && replyToMessageId\n ? selectChatMessage(global, chat.id, replyToMessageId)\n : undefined;\n const {\n targetUserIds: actionTargetUserIds,\n targetChatId: actionTargetChatId,\n } = messageAction || {};\n\n const actionTargetUsers = actionTargetUserIds\n ? actionTargetUserIds.map((userId) => selectUser(global, userId)).filter(Boolean as any)\n : undefined;\n const privateChatUserId = getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n let body: string;\n if (isActionMessage(message)) {\n const actionOrigin = chat && (isChatChannel(chat) || message.senderId === message.chatId)\n ? chat\n : messageSender;\n body = renderActionMessageText(\n getTranslation,\n message,\n actionOrigin,\n actionTargetUsers,\n actionTargetMessage,\n actionTargetChatId,\n { asPlain: true },\n ) as string;\n } else {\n const senderName = getMessageSenderName(getTranslation, chat.id, messageSender);\n const summary = getMessageSummaryText(getTranslation, message);\n\n body = senderName ? `${senderName}: ${summary}` : summary;\n }\n\n return {\n title: getChatTitle(getTranslation, chat, privateChatUser),\n body,\n };\n}\n\nexport async function showNewMessageNotification({\n chat,\n message,\n isActiveChat,\n}: { chat: ApiChat; message: Partial; isActiveChat: boolean}) {\n if (!checkIfNotificationsSupported()) return;\n if (!message.id) return;\n\n await loadNotificationSettings();\n if (!checkIfShouldNotify(chat, isActiveChat)) return;\n\n const {\n title,\n body,\n } = getNotificationContent(chat, message as ApiMessage);\n\n if (checkIfPushSupported()) {\n if (navigator.serviceWorker.controller) {\n // notify service worker about new message notification\n navigator.serviceWorker.controller.postMessage({\n type: 'newMessageNotification',\n payload: {\n title,\n body,\n chatId: chat.id,\n messageId: message.id,\n },\n });\n }\n } else {\n const dispatch = getDispatch();\n const options: NotificationOptions = {\n body,\n icon: 'icon-192x192.png',\n badge: 'icon-192x192.png',\n tag: message.id.toString(),\n };\n\n if ('vibrate' in navigator) {\n options.vibrate = [200, 100, 200];\n }\n\n const notification = new Notification(title, options);\n\n notification.onclick = () => {\n notification.close();\n dispatch.focusMessage({\n chatId: chat.id,\n messageId: message.id,\n });\n if (window.focus) {\n window.focus();\n }\n };\n }\n}\n\n// Notify service worker that client is fully loaded\nexport function notifyClientReady() {\n if (!navigator.serviceWorker.controller) return;\n navigator.serviceWorker.controller.postMessage({\n type: 'clientReady',\n });\n}\n","import { ApiChat, ApiUser } from '../../api/types';\n\nimport { SERVICE_NOTIFICATIONS_USER_ID } from '../../config';\nimport { formatFullDate, formatTime } from '../../util/dateFormat';\nimport { orderBy } from '../../util/iteratees';\nimport { LangFn } from '../../hooks/useLang';\n\nconst USER_COLOR_KEYS = [1, 8, 5, 2, 7, 4, 6];\n\nexport function getUserFirstOrLastName(user?: ApiUser) {\n if (!user) {\n return undefined;\n }\n\n switch (user.type) {\n case 'userTypeBot':\n case 'userTypeRegular': {\n return user.firstName || user.lastName;\n }\n\n case 'userTypeDeleted':\n case 'userTypeUnknown': {\n return 'Deleted';\n }\n\n default:\n return undefined;\n }\n}\n\nexport function getUserFullName(user?: ApiUser) {\n if (!user) {\n return undefined;\n }\n\n if (isDeletedUser(user)) {\n return 'Deleted account';\n }\n\n switch (user.type) {\n case 'userTypeBot':\n case 'userTypeRegular': {\n if (user.firstName && user.lastName) {\n return `${user.firstName} ${user.lastName}`;\n }\n\n if (user.firstName) {\n return user.firstName;\n }\n\n if (user.lastName) {\n return user.lastName;\n }\n\n break;\n }\n\n case 'userTypeDeleted':\n case 'userTypeUnknown': {\n return 'Deleted account';\n }\n }\n\n return undefined;\n}\n\nexport function getUserStatus(lang: LangFn, user: ApiUser, serverTimeOffset: number) {\n if (user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return lang('ServiceNotifications').toLowerCase();\n }\n\n if (user.type && user.type === 'userTypeBot') {\n return lang('Bot');\n }\n\n if (!user.status) {\n return '';\n }\n\n switch (user.status.type) {\n case 'userStatusEmpty': {\n return lang('ALongTimeAgo');\n }\n\n case 'userStatusLastMonth': {\n return lang('WithinAMonth');\n }\n\n case 'userStatusLastWeek': {\n return lang('WithinAWeek');\n }\n\n case 'userStatusOffline': {\n const { wasOnline } = user.status;\n\n if (!wasOnline) return lang('LastSeen.Offline');\n\n const now = new Date(new Date().getTime() + serverTimeOffset * 1000);\n const wasOnlineDate = new Date(wasOnline * 1000);\n\n if (wasOnlineDate >= now) {\n return lang('LastSeen.JustNow');\n }\n\n const diff = new Date(now.getTime() - wasOnlineDate.getTime());\n\n // within a minute\n if (diff.getTime() / 1000 < 60) {\n return lang('LastSeen.JustNow');\n }\n\n // within an hour\n if (diff.getTime() / 1000 < 60 * 60) {\n const minutes = Math.floor(diff.getTime() / 1000 / 60);\n return lang('LastSeen.MinutesAgo', minutes);\n }\n\n // today\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const serverToday = new Date(today.getTime() + serverTimeOffset * 1000);\n if (wasOnlineDate > serverToday) {\n // up to 6 hours ago\n if (diff.getTime() / 1000 < 6 * 60 * 60) {\n const hours = Math.floor(diff.getTime() / 1000 / 60 / 60);\n return lang('LastSeen.HoursAgo', hours);\n }\n\n // other\n return lang('LastSeen.TodayAt', formatTime(wasOnlineDate));\n }\n\n // yesterday\n const yesterday = new Date();\n yesterday.setDate(now.getDate() - 1);\n yesterday.setHours(0, 0, 0, 0);\n const serverYesterday = new Date(yesterday.getTime() + serverTimeOffset * 1000);\n if (wasOnlineDate > serverYesterday) {\n return lang('LastSeen.YesterdayAt', formatTime(wasOnlineDate));\n }\n\n return lang('LastSeen.AtDate', formatFullDate(lang, wasOnlineDate));\n }\n\n case 'userStatusOnline': {\n return lang('Online');\n }\n\n case 'userStatusRecently': {\n return lang('Lately');\n }\n\n default:\n return undefined;\n }\n}\n\nexport function isUserOnline(user: ApiUser) {\n const { id, status, type } = user;\n\n if (!status) {\n return false;\n }\n\n if (id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return status.type === 'userStatusOnline' && type !== 'userTypeBot';\n}\n\nexport function isDeletedUser(user: ApiUser) {\n if (!user.status || user.type === 'userTypeBot' || user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return user.type === 'userTypeDeleted'\n || user.type === 'userTypeUnknown';\n}\n\nexport function isUserBot(user: ApiUser) {\n return user.type === 'userTypeBot';\n}\n\nexport function sortUserIds(\n userIds: number[],\n usersById: Record,\n priorityIds?: number[],\n serverTimeOffset = 0,\n) {\n return orderBy(userIds, (id) => {\n const now = Date.now() / 1000 + serverTimeOffset;\n\n if (priorityIds && priorityIds.includes(id)) {\n // Assuming that online status expiration date can't be as far as two days from now,\n // this should place prioritized on top of the list.\n // Then we subtract index of `id` in `priorityIds` to preserve selected order\n return now + (48 * 60 * 60) - (priorityIds.length - priorityIds.indexOf(id));\n }\n\n const user = usersById[id];\n if (!user || !user.status) {\n return 0;\n }\n\n if (user.status.type === 'userStatusOnline') {\n return user.status.expires;\n } else if (user.status.type === 'userStatusOffline' && user.status.wasOnline) {\n return user.status.wasOnline;\n }\n\n switch (user.status.type) {\n case 'userStatusRecently':\n return now - 60 * 60 * 24;\n case 'userStatusLastWeek':\n return now - 60 * 60 * 24 * 7;\n case 'userStatusLastMonth':\n return now - 60 * 60 * 24 * 7 * 30;\n default:\n return 0;\n }\n }, 'desc');\n}\n\n// eslint-disable-next-line max-len\n// https://github.com/telegramdesktop/tdesktop/blob/371510cfe23b0bd226de8c076bc49248fbe40c26/Telegram/SourceFiles/data/data_peer.cpp#L53\nexport function getUserColorKey(peer: ApiUser | ApiChat | undefined) {\n const index = peer ? Math.abs(peer.id) % 7 : 0;\n\n return USER_COLOR_KEYS[index];\n}\n","import {\n ApiChat,\n ApiUser,\n ApiChatBannedRights,\n ApiChatAdminRights,\n ApiChatFolder,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { NotifyException, NotifySettings } from '../../types';\nimport { LangFn } from '../../hooks/useLang';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { orderBy } from '../../util/iteratees';\nimport { getUserFirstOrLastName } from './users';\nimport { formatDateToString, formatTime } from '../../util/dateFormat';\n\nconst FOREVER_BANNED_DATE = Date.now() / 1000 + 31622400; // 366 days\n\nconst VERIFIED_PRIORITY_BASE = 3e9;\nconst PINNED_PRIORITY_BASE = 3e8;\n\nexport function isChatPrivate(chatId: number) {\n return chatId > 0;\n}\n\nexport function isChatGroup(chat: ApiChat) {\n return isChatBasicGroup(chat) || isChatSuperGroup(chat);\n}\n\nexport function isChatBasicGroup(chat: ApiChat) {\n return chat.type === 'chatTypeBasicGroup';\n}\n\nexport function isChatSuperGroup(chat: ApiChat) {\n return chat.type === 'chatTypeSuperGroup';\n}\n\nexport function isChatChannel(chat: ApiChat) {\n return chat.type === 'chatTypeChannel';\n}\n\nexport function isCommonBoxChat(chat: ApiChat) {\n return chat.type === 'chatTypePrivate' || chat.type === 'chatTypeBasicGroup';\n}\n\nexport function getChatTypeString(chat: ApiChat) {\n switch (chat.type) {\n case 'chatTypePrivate':\n return 'PrivateChat';\n case 'chatTypeBasicGroup':\n case 'chatTypeSuperGroup':\n return 'AccDescrGroup';\n case 'chatTypeChannel':\n return 'AccDescrChannel';\n default:\n return 'Chat';\n }\n}\n\nexport function getPrivateChatUserId(chat: ApiChat) {\n if (chat.type !== 'chatTypePrivate' && chat.type !== 'chatTypeSecret') {\n return undefined;\n }\n return chat.id;\n}\n\n// TODO Get rid of `user`\nexport function getChatTitle(lang: LangFn, chat: ApiChat, user?: ApiUser, isSelf = false) {\n if (isSelf || (user && chat.id === user.id && user.isSelf)) {\n return lang('SavedMessages');\n }\n return chat.title || lang('HiddenName');\n}\n\nexport function getChatDescription(chat: ApiChat) {\n if (!chat.fullInfo) {\n return undefined;\n }\n return chat.fullInfo.about;\n}\n\nexport function getChatLink(chat: ApiChat) {\n const { username } = chat;\n if (username) {\n return `https://t.me/${username}`;\n }\n\n const { inviteLink } = chat.fullInfo || {};\n\n return inviteLink;\n}\n\nexport function getChatAvatarHash(\n owner: ApiChat | ApiUser,\n size: 'normal' | 'big' = 'normal',\n) {\n if (!owner.avatarHash) {\n return undefined;\n }\n\n switch (size) {\n case 'big':\n return `profile${owner.id}?${owner.avatarHash}`;\n default:\n return `avatar${owner.id}?${owner.avatarHash}`;\n }\n}\n\nexport function isChatSummaryOnly(chat: ApiChat) {\n return !chat.lastMessage;\n}\n\nexport function isChatAdmin(chat: ApiChat) {\n return Boolean(chat.adminRights);\n}\n\nexport function getHasAdminRight(chat: ApiChat, key: keyof ApiChatAdminRights) {\n return chat.adminRights ? chat.adminRights[key] : false;\n}\n\nexport function isUserRightBanned(chat: ApiChat, key: keyof ApiChatBannedRights) {\n return Boolean(\n (chat.currentUserBannedRights && chat.currentUserBannedRights[key])\n || (chat.defaultBannedRights && chat.defaultBannedRights[key]),\n );\n}\n\nexport function getCanPostInChat(chat: ApiChat, threadId: number) {\n if (threadId !== MAIN_THREAD_ID) {\n return true;\n }\n\n if (chat.isRestricted || chat.migratedTo || chat.isNotJoined) {\n return false;\n }\n\n if (chat.isCreator) {\n return true;\n }\n\n if (isChatPrivate(chat.id)) {\n return true;\n }\n\n if (isChatChannel(chat)) {\n return getHasAdminRight(chat, 'postMessages');\n }\n\n return isChatAdmin(chat) || !isUserRightBanned(chat, 'sendMessages');\n}\n\nexport interface IAllowedAttachmentOptions {\n canAttachMedia: boolean;\n canAttachPolls: boolean;\n canSendStickers: boolean;\n canSendGifs: boolean;\n canAttachEmbedLinks: boolean;\n}\n\nexport function getAllowedAttachmentOptions(chat?: ApiChat, isChatWithBot = false): IAllowedAttachmentOptions {\n if (!chat) {\n return {\n canAttachMedia: false,\n canAttachPolls: false,\n canSendStickers: false,\n canSendGifs: false,\n canAttachEmbedLinks: false,\n };\n }\n\n const isAdmin = isChatAdmin(chat);\n\n return {\n canAttachMedia: isAdmin || !isUserRightBanned(chat, 'sendMedia'),\n canAttachPolls: (isAdmin || !isUserRightBanned(chat, 'sendPolls')) && (!isChatPrivate(chat.id) || isChatWithBot),\n canSendStickers: isAdmin || !isUserRightBanned(chat, 'sendStickers'),\n canSendGifs: isAdmin || !isUserRightBanned(chat, 'sendGifs'),\n canAttachEmbedLinks: isAdmin || !isUserRightBanned(chat, 'embedLinks'),\n };\n}\n\nexport function getMessageSendingRestrictionReason(\n lang: LangFn, currentUserBannedRights?: ApiChatBannedRights, defaultBannedRights?: ApiChatBannedRights,\n) {\n if (currentUserBannedRights && currentUserBannedRights.sendMessages) {\n const { untilDate } = currentUserBannedRights;\n return untilDate && untilDate < FOREVER_BANNED_DATE\n ? lang(\n 'Channel.Persmission.Denied.SendMessages.Until',\n lang(\n 'formatDateAtTime',\n [formatDateToString(new Date(untilDate * 1000), lang.code), formatTime(untilDate * 1000)],\n ),\n )\n : lang('Channel.Persmission.Denied.SendMessages.Forever');\n }\n\n if (defaultBannedRights && defaultBannedRights.sendMessages) {\n return lang('Channel.Persmission.Denied.SendMessages.DefaultRestrictedText');\n }\n\n return undefined;\n}\n\nexport function getChatSlowModeOptions(chat?: ApiChat) {\n if (!chat || !chat.fullInfo) {\n return undefined;\n }\n\n return chat.fullInfo.slowMode;\n}\n\n\nexport function getChatOrder(chat: ApiChat) {\n return Math.max(\n chat.joinDate || 0,\n chat.draftDate || 0,\n chat.lastMessage ? chat.lastMessage.date : 0,\n );\n}\n\nexport function isChatArchived(chat: ApiChat) {\n return chat.folderId === ARCHIVED_FOLDER_ID;\n}\n\nexport function selectIsChatMuted(\n chat: ApiChat, notifySettings: NotifySettings, notifyExceptions?: Record,\n) {\n return !(notifyExceptions && notifyExceptions[chat.id] && !notifyExceptions[chat.id].isMuted) && (\n chat.isMuted\n || (isChatPrivate(chat.id) && !notifySettings.hasPrivateChatsNotifications)\n || (isChatChannel(chat) && !notifySettings.hasBroadcastNotifications)\n || (isChatGroup(chat) && !notifySettings.hasGroupNotifications)\n );\n}\n\nexport function getCanDeleteChat(chat: ApiChat) {\n return isChatBasicGroup(chat) || ((isChatSuperGroup(chat) || isChatChannel(chat)) && chat.isCreator);\n}\n\nexport function prepareFolderListIds(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n chatIdsCache?: number[],\n) {\n const excludedChatIds = folder.excludedChatIds ? new Set(folder.excludedChatIds) : undefined;\n const includedChatIds = folder.excludedChatIds ? new Set(folder.includedChatIds) : undefined;\n const pinnedChatIds = folder.excludedChatIds ? new Set(folder.pinnedChatIds) : undefined;\n const listIds = (chatIdsCache || Object.keys(chatsById).map(Number))\n .filter((id) => {\n return filterChatFolder(\n chatsById[id],\n folder,\n usersById,\n notifySettings,\n notifyExceptions,\n excludedChatIds,\n includedChatIds,\n pinnedChatIds,\n );\n });\n\n return [listIds, folder.pinnedChatIds] as const;\n}\n\nfunction filterChatFolder(\n chat: ApiChat,\n folder: ApiChatFolder,\n usersById: Record,\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n excludedChatIds?: Set,\n includedChatIds?: Set,\n pinnedChatIds?: Set,\n) {\n if (!chat.isListed) {\n return false;\n }\n\n if (excludedChatIds && excludedChatIds.has(chat.id)) {\n return false;\n }\n\n if (includedChatIds && includedChatIds.has(chat.id)) {\n return true;\n }\n\n if (pinnedChatIds && pinnedChatIds.has(chat.id)) {\n return true;\n }\n\n if (isChatArchived(chat) && folder.excludeArchived) {\n return false;\n }\n\n if (folder.excludeMuted && !chat.unreadMentionsCount && selectIsChatMuted(chat, notifySettings, notifyExceptions)) {\n return false;\n }\n\n if (!chat.unreadCount && !chat.unreadMentionsCount && !chat.hasUnreadMark && folder.excludeRead) {\n return false;\n }\n\n if (isChatPrivate(chat.id)) {\n const privateChatUser = usersById[chat.id];\n\n const isChatWithBot = privateChatUser && privateChatUser.type === 'userTypeBot';\n if (isChatWithBot) {\n if (folder.bots) {\n return true;\n }\n } else {\n if (folder.contacts && privateChatUser && privateChatUser.isContact) {\n return true;\n }\n\n if (folder.nonContacts && privateChatUser && !privateChatUser.isContact) {\n return true;\n }\n }\n } else if (isChatGroup(chat)) {\n return !!folder.groups;\n } else if (isChatChannel(chat)) {\n return !!folder.channels;\n }\n\n return false;\n}\n\nexport function prepareChatList(\n chatsById: Record,\n listIds: number[],\n orderedPinnedIds?: number[],\n folderType: 'all' | 'archived' | 'folder' = 'all',\n) {\n function chatFilter(chat?: ApiChat) {\n if (!chat || !chat.lastMessage || chat.migratedTo) {\n return false;\n }\n\n switch (folderType) {\n case 'all':\n if (isChatArchived(chat)) {\n return false;\n }\n break;\n case 'archived':\n if (!isChatArchived(chat)) {\n return false;\n }\n break;\n }\n\n return !chat.isRestricted && !chat.isNotJoined;\n }\n\n const listedChats = listIds\n .map((id) => chatsById[id])\n .filter(chatFilter);\n\n const listIdsSet = new Set(listIds);\n const pinnedChats = orderedPinnedIds\n ? (\n orderedPinnedIds\n .map((id) => chatsById[id])\n .filter(chatFilter)\n .filter((chat) => listIdsSet.has(chat.id))\n )\n : [];\n\n const otherChats = orderBy(\n orderedPinnedIds\n ? listedChats.filter((chat) => !orderedPinnedIds.includes(chat.id))\n : listedChats,\n getChatOrder,\n 'desc',\n );\n\n return {\n pinnedChats,\n otherChats,\n };\n}\n\nexport function getFolderUnreadDialogs(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n) {\n const [listIds] = prepareFolderListIds(chatsById, usersById, folder, notifySettings, notifyExceptions, chatIdsCache);\n\n const listedChats = listIds\n .map((id) => chatsById[id])\n .filter((chat) => (chat && chat.lastMessage && !chat.isRestricted && !chat.isNotJoined));\n\n const unreadDialogsCount = listedChats\n .reduce((total, chat) => (chat.unreadCount || chat.hasUnreadMark ? total + 1 : total), 0);\n\n const hasActiveDialogs = listedChats.some((chat) => (\n chat.unreadMentionsCount\n || (!selectIsChatMuted(chat, notifySettings, notifyExceptions) && (chat.unreadCount || chat.hasUnreadMark))\n ));\n\n return {\n unreadDialogsCount,\n hasActiveDialogs,\n };\n}\n\nexport function getFolderDescriptionText(\n lang: LangFn,\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n) {\n const {\n id, title, emoticon, description, pinnedChatIds,\n excludedChatIds, includedChatIds,\n excludeArchived, excludeMuted, excludeRead,\n ...filters\n } = folder;\n\n // If folder has multiple additive filters or uses include/exclude lists,\n // we display folder chats count\n if (\n Object.values(filters).filter(Boolean).length > 1\n || (excludedChatIds && excludedChatIds.length)\n || (includedChatIds && includedChatIds.length)\n ) {\n const length = getFolderChatsCount(chatsById, usersById, folder, chatIdsCache, notifySettings, notifyExceptions);\n return lang('Chats', length);\n }\n\n // Otherwise, we return a short description of a single filter\n if (filters.bots) {\n return lang('FilterBots');\n } else if (filters.groups) {\n return lang('FilterGroups');\n } else if (filters.channels) {\n return lang('FilterChannels');\n } else if (filters.contacts) {\n return lang('FilterContacts');\n } else if (filters.nonContacts) {\n return lang('FilterNonContacts');\n } else {\n return undefined;\n }\n}\n\nfunction getFolderChatsCount(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n) {\n const [listIds, pinnedIds] = prepareFolderListIds(\n chatsById, usersById, folder, notifySettings, notifyExceptions, chatIdsCache,\n );\n const { pinnedChats, otherChats } = prepareChatList(chatsById, listIds, pinnedIds, 'folder');\n return pinnedChats.length + otherChats.length;\n}\n\nexport function isChat(chatOrUser?: ApiUser | ApiChat): chatOrUser is ApiChat {\n if (!chatOrUser) {\n return false;\n }\n\n return chatOrUser.id < 0;\n}\n\nexport function getMessageSenderName(lang: LangFn, chatId: number, sender?: ApiUser) {\n if (!sender || isChatPrivate(chatId)) {\n return undefined;\n }\n\n if (sender.isSelf) {\n return lang('FromYou');\n }\n\n return getUserFirstOrLastName(sender);\n}\n\nexport function sortChatIds(\n chatIds: number[],\n chatsById: Record,\n shouldPrioritizeVerified = false,\n priorityIds?: number[],\n) {\n return orderBy(chatIds, (id) => {\n const chat = chatsById[id];\n if (!chat) {\n return 0;\n }\n\n let priority = 0;\n\n if (chat.lastMessage) {\n priority += chat.lastMessage.date;\n }\n\n if (shouldPrioritizeVerified && chat.isVerified) {\n priority += VERIFIED_PRIORITY_BASE; // ~100 years in seconds\n }\n\n if (priorityIds && priorityIds.includes(id)) {\n priority = Date.now() + PINNED_PRIORITY_BASE + (priorityIds.length - priorityIds.indexOf(id));\n }\n\n return priority;\n }, 'desc');\n}\n","import { useEffect } from '../lib/teact/teact';\n\nexport const ANIMATION_START_EVENT = 'tt-event-heavy-animation-start';\nexport const ANIMATION_END_EVENT = 'tt-event-heavy-animation-end';\n\nlet timeout: number | undefined;\nlet isAnimating = false;\n\nexport const dispatchHeavyAnimationEvent = (duration?: number) => {\n if (!isAnimating) {\n isAnimating = true;\n document.dispatchEvent(new Event(ANIMATION_START_EVENT));\n }\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n if (duration) {\n timeout = window.setTimeout(() => {\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n timeout = undefined;\n }, duration);\n }\n\n return () => {\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n };\n};\n\nexport default (\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (isAnimating) {\n handleAnimationStart();\n }\n\n document.addEventListener(ANIMATION_START_EVENT, handleAnimationStart);\n document.addEventListener(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n document.removeEventListener(ANIMATION_END_EVENT, handleAnimationEnd);\n document.removeEventListener(ANIMATION_START_EVENT, handleAnimationStart);\n };\n }, [handleAnimationEnd, handleAnimationStart]);\n};\n","import { DEBUG } from '../../config';\n\ntype Handler = (e: Event) => void;\n\nconst NON_BUBBLEABLE_EVENTS = new Set(['scroll', 'mouseenter', 'mouseleave']);\n\nconst delegationRegistry: Record> = {};\nconst delegatedEventsByElement = new Map>();\nconst documentEventCounters: Record = {};\n\nexport function addEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element, asCapture)) {\n addDelegatedListener(eventName, element, handler);\n } else {\n element.addEventListener(eventName, handler, asCapture);\n }\n}\n\nexport function removeEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element, asCapture)) {\n removeDelegatedListener(eventName, element);\n } else {\n element.removeEventListener(eventName, handler, asCapture);\n }\n}\n\nfunction resolveEventName(propName: string, element: HTMLElement) {\n const eventName = propName\n .replace(/^on/, '')\n .replace(/Capture$/, '').toLowerCase();\n\n if (eventName === 'change' && element.tagName !== 'SELECT') {\n // React behavior repeated here.\n // https://stackoverflow.com/questions/38256332/in-react-whats-the-difference-between-onchange-and-oninput\n return 'input';\n }\n\n if (eventName === 'doubleclick') {\n return 'dblclick';\n }\n\n // Replace focus/blur by their \"bubbleable\" versions\n if (eventName === 'focus') {\n return 'focusin';\n }\n\n if (eventName === 'blur') {\n return 'focusout';\n }\n\n return eventName;\n}\n\nfunction canUseEventDelegation(realEventName: string, element: HTMLElement, asCapture: boolean) {\n return (\n !asCapture\n && !NON_BUBBLEABLE_EVENTS.has(realEventName)\n && element.tagName !== 'VIDEO'\n && element.tagName !== 'IFRAME'\n );\n}\n\nfunction addDelegatedListener(eventName: string, element: HTMLElement, handler: Handler) {\n if (!documentEventCounters[eventName]) {\n documentEventCounters[eventName] = 0;\n document.addEventListener(eventName, handleEvent);\n }\n\n resolveDelegationRegistryForName(eventName).set(element, handler);\n resolveDelegatedEventsForElement(element).add(eventName);\n documentEventCounters[eventName]++;\n}\n\nfunction removeDelegatedListener(eventName: string, element: HTMLElement) {\n documentEventCounters[eventName]--;\n if (!documentEventCounters[eventName]) {\n // Synchronous deletion on 0 will cause perf degradation in the case of 1 element\n // which is not a real case, so it's ok to do it this way\n document.removeEventListener(eventName, handleEvent);\n }\n\n delegationRegistry[eventName].delete(element);\n delegatedEventsByElement.get(element)!.delete(eventName);\n}\n\nexport function removeAllDelegatedListeners(element: HTMLElement) {\n const eventNames = delegatedEventsByElement.get(element);\n if (!eventNames) {\n return;\n }\n\n eventNames.forEach((eventName) => removeDelegatedListener(eventName, element));\n delegatedEventsByElement.delete(element);\n}\n\nfunction handleEvent(realEvent: Event) {\n const events = delegationRegistry[realEvent.type];\n\n if (events) {\n let furtherCallsPrevented = false;\n let current: HTMLElement = realEvent.target as HTMLElement;\n\n const stopPropagation = () => {\n furtherCallsPrevented = true;\n };\n\n const preventDefault = () => {\n realEvent.preventDefault();\n };\n\n // Proxy is a simplest way to provide an access to the event property\n const event = new Proxy(realEvent, {\n get(target, p) {\n if (p === 'currentTarget') {\n return current;\n }\n if (p === 'stopPropagation' || p === 'stopImmediatePropagation') {\n return stopPropagation;\n }\n if (p === 'preventDefault') {\n // \"this\" is changed to proxy and one can't call methods via it\n return preventDefault;\n }\n return Reflect.get(target, p);\n },\n });\n\n // This can also be limited by teact root\n while (current && current !== document.body) {\n const handler = events.get(current);\n if (handler) {\n handler(event);\n if (furtherCallsPrevented) {\n return;\n }\n }\n\n current = current.parentNode as HTMLElement;\n }\n }\n}\n\nfunction resolveDelegationRegistryForName(eventName: string) {\n if (!delegationRegistry[eventName]) {\n delegationRegistry[eventName] = new Map();\n }\n\n return delegationRegistry[eventName];\n}\n\nfunction resolveDelegatedEventsForElement(element: HTMLElement) {\n const existing = delegatedEventsByElement.get(element);\n if (existing) {\n return existing;\n }\n\n const newSet = new Set();\n delegatedEventsByElement.set(element, newSet);\n\n return newSet;\n}\n\nif (DEBUG) {\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('DELEGATED EVENTS', { delegationRegistry, delegatedEventsByElement, documentEventCounters });\n });\n}\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nimport { IS_IOS } from '../util/environment';\nimport usePrevious from './usePrevious';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { areSortedArraysEqual } from '../util/iteratees';\n\n// Carefully selected by swiping and observing visual changes\n// TODO: may be different on other devices such as iPad, maybe take dpi into account?\nconst SAFARI_EDGE_BACK_GESTURE_LIMIT = 300;\nconst SAFARI_EDGE_BACK_GESTURE_DURATION = 350;\n\ntype HistoryState = {\n currentIndex: number;\n nextStateIndexToReplace: number;\n isHistoryAltered: boolean;\n isDisabled: boolean;\n isEdge: boolean;\n currentIndexes: number[];\n};\n\nconst historyState: HistoryState = {\n currentIndex: 0,\n nextStateIndexToReplace: -1,\n isHistoryAltered: false,\n isDisabled: false,\n isEdge: false,\n currentIndexes: [],\n};\n\nexport const disableHistoryBack = () => {\n historyState.isDisabled = true;\n};\n\nconst handleTouchStart = (event: TouchEvent) => {\n const x = event.touches[0].pageX;\n\n if (x <= SAFARI_EDGE_BACK_GESTURE_LIMIT || x >= window.innerWidth - SAFARI_EDGE_BACK_GESTURE_LIMIT) {\n historyState.isEdge = true;\n }\n};\n\nconst handleTouchEnd = () => {\n if (historyState.isEdge) {\n setTimeout(() => {\n historyState.isEdge = false;\n }, SAFARI_EDGE_BACK_GESTURE_DURATION);\n }\n};\n\nif (IS_IOS) {\n window.addEventListener('touchstart', handleTouchStart);\n window.addEventListener('touchend', handleTouchEnd);\n window.addEventListener('popstate', handleTouchEnd);\n}\n\nwindow.history.replaceState({ index: historyState.currentIndex }, '');\n\nexport default function useHistoryBack(\n isActive: boolean | undefined,\n onBack: ((noDisableAnimation: boolean) => void) | undefined,\n onForward?: (state: any) => void,\n currentState?: any,\n shouldReplaceNext = false,\n hashes?: string[],\n) {\n const indexRef = useRef(-1);\n const isForward = useRef(false);\n const prevIsActive = usePrevious(isActive);\n const isClosed = useRef(true);\n const indexHashRef = useRef<{ index: number; hash: string }[]>([]);\n const prevHashes = usePrevious(hashes);\n const isHashChangedFromEvent = useRef(false);\n\n const handleChange = useCallback((isForceClose = false) => {\n if (!hashes) {\n if (isActive && !isForceClose) {\n isClosed.current = false;\n\n if (isForward.current) {\n isForward.current = false;\n historyState.currentIndexes.push(indexRef.current);\n } else {\n setTimeout(() => {\n const index = ++historyState.currentIndex;\n\n historyState.currentIndexes.push(index);\n\n window.history[\n (historyState.currentIndexes.includes(historyState.nextStateIndexToReplace - 1)\n && window.history.state.index !== 0\n && historyState.nextStateIndexToReplace === index\n && !shouldReplaceNext)\n ? 'replaceState'\n : 'pushState'\n ]({\n index,\n state: currentState,\n }, '');\n\n\n indexRef.current = index;\n\n if (shouldReplaceNext) {\n historyState.nextStateIndexToReplace = historyState.currentIndex + 1;\n }\n }, 0);\n }\n }\n\n if ((isForceClose || !isActive) && !isClosed.current) {\n if ((indexRef.current === historyState.currentIndex || !shouldReplaceNext)) {\n historyState.isHistoryAltered = true;\n window.history.back();\n\n setTimeout(() => {\n historyState.nextStateIndexToReplace = -1;\n }, 400);\n }\n historyState.currentIndexes.splice(historyState.currentIndexes.indexOf(indexRef.current), 1);\n\n isClosed.current = true;\n }\n } else {\n const prev = prevHashes || [];\n if (prev.length < hashes.length) {\n const index = ++historyState.currentIndex;\n historyState.currentIndexes.push(index);\n\n window.history.pushState({\n index,\n state: currentState,\n }, '', `#${hashes[hashes.length - 1]}`);\n\n indexHashRef.current.push({\n index,\n hash: hashes[hashes.length - 1],\n });\n } else {\n const delta = prev.length - hashes.length;\n if (isHashChangedFromEvent.current) {\n isHashChangedFromEvent.current = false;\n } else {\n if (hashes.length !== indexHashRef.current.length) {\n if (delta > 0) {\n const last = indexHashRef.current[indexHashRef.current.length - delta - 1];\n let realDelta = delta;\n if (last) {\n const indexLast = historyState.currentIndexes.findIndex(\n (l) => l === last.index,\n );\n realDelta = historyState.currentIndexes.length - indexLast - 1;\n }\n historyState.isHistoryAltered = true;\n window.history.go(-realDelta);\n const removed = indexHashRef.current.splice(indexHashRef.current.length - delta - 1, delta);\n removed.forEach(({ index }) => {\n historyState.currentIndexes.splice(historyState.currentIndexes.indexOf(index), 1);\n });\n }\n }\n\n if (hashes.length > 0) {\n setTimeout(() => {\n const index = ++historyState.currentIndex;\n historyState.currentIndexes[historyState.currentIndexes.length - 1] = index;\n\n window.history.replaceState({\n index,\n state: currentState,\n }, '', `#${hashes[hashes.length - 1]}`);\n\n indexHashRef.current[indexHashRef.current.length - 1] = {\n index,\n hash: hashes[hashes.length - 1],\n };\n }, 0);\n }\n }\n }\n }\n }, [currentState, hashes, isActive, prevHashes, shouldReplaceNext]);\n\n useEffect(() => {\n const handlePopState = (event: PopStateEvent) => {\n if (historyState.isHistoryAltered) {\n setTimeout(() => {\n historyState.isHistoryAltered = false;\n }, 0);\n return;\n }\n const { index: i } = event.state;\n const index = i || 0;\n try {\n const currIndex = hashes ? indexHashRef.current[indexHashRef.current.length - 1].index : indexRef.current;\n\n const prev = historyState.currentIndexes[historyState.currentIndexes.indexOf(currIndex) - 1];\n\n if (historyState.isDisabled) return;\n\n if ((!isClosed.current && (index === 0 || index === prev)) || (hashes && (index === 0 || index === prev))) {\n if (hashes) {\n isHashChangedFromEvent.current = true;\n indexHashRef.current.pop();\n }\n\n historyState.currentIndexes.splice(historyState.currentIndexes.indexOf(currIndex), 1);\n\n if (onBack) {\n if (historyState.isEdge) {\n getDispatch()\n .disableHistoryAnimations();\n }\n onBack(!historyState.isEdge);\n isClosed.current = true;\n }\n } else if (index === currIndex && isClosed.current && onForward && !hashes) {\n isForward.current = true;\n if (historyState.isEdge) {\n getDispatch()\n .disableHistoryAnimations();\n }\n onForward(event.state.state);\n }\n } catch (e) {\n // Forward navigation for hashed is not supported\n }\n };\n\n const hasChanged = hashes\n ? (!prevHashes || !areSortedArraysEqual(prevHashes, hashes))\n : prevIsActive !== isActive;\n\n if (!historyState.isDisabled && hasChanged) {\n handleChange();\n }\n\n window.addEventListener('popstate', handlePopState);\n return () => window.removeEventListener('popstate', handlePopState);\n }, [\n currentState, handleChange, hashes, isActive, onBack, onForward, prevHashes, prevIsActive, shouldReplaceNext,\n ]);\n\n return {\n forceClose: () => handleChange(true),\n };\n}\n","import { useRef, useState } from '../lib/teact/teact';\nimport buildClassName from '../util/buildClassName';\n\nconst CLOSE_DURATION = 350;\n\nexport default (\n isOpen = false,\n onCloseTransitionEnd?: () => void,\n noOpenTransition = false,\n className: string | false = 'fast',\n noCloseTransition = false,\n) => {\n const [isClosed, setIsClosed] = useState(!isOpen);\n const closeTimeoutRef = useRef();\n // СSS class should be added in a separate tick to turn on CSS transition.\n const [hasOpenClassName, setHasOpenClassName] = useState(isOpen && noOpenTransition);\n\n\n if (isOpen) {\n setIsClosed(false);\n setHasOpenClassName(true);\n\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = undefined;\n }\n } else {\n setHasOpenClassName(false);\n\n if (!isClosed && !closeTimeoutRef.current) {\n closeTimeoutRef.current = window.setTimeout(() => {\n setIsClosed(true);\n\n if (onCloseTransitionEnd) {\n onCloseTransitionEnd();\n }\n\n closeTimeoutRef.current = undefined;\n }, noCloseTransition ? 0 : CLOSE_DURATION);\n }\n }\n\n // `noCloseTransition`, when set to true, should remove the open class immediately\n const shouldHaveOpenClassName = hasOpenClassName && !(noCloseTransition && !isOpen);\n const isClosing = Boolean(closeTimeoutRef.current);\n const shouldRender = isOpen || isClosing;\n const transitionClassNames = buildClassName(\n className && 'opacity-transition',\n className,\n shouldHaveOpenClassName && 'open',\n shouldRender && 'shown',\n isClosing && 'closing',\n );\n\n return {\n shouldRender,\n transitionClassNames,\n };\n};\n","const DEFAULT_MAX_TEXT_LENGTH = 30;\n\nexport default function trimText(text: string | undefined, length = DEFAULT_MAX_TEXT_LENGTH) {\n if (!text || text.length <= length) {\n return text;\n }\n\n return `${text.substr(0, length)}...`;\n}\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport './MenuItem.scss';\n\ntype OnClickHandler = (e: React.SyntheticEvent) => void;\n\ntype OwnProps = {\n icon?: string;\n className?: string;\n children: any;\n onClick?: OnClickHandler;\n href?: string;\n download?: string;\n disabled?: boolean;\n destructive?: boolean;\n ariaLabel?: string;\n};\n\nconst MenuItem: FC = (props) => {\n const {\n icon,\n className,\n children,\n onClick,\n href,\n download,\n disabled,\n destructive,\n ariaLabel,\n } = props;\n\n const lang = useLang();\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || !onClick) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n\n onClick(e);\n }, [disabled, onClick]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode !== 13 && e.keyCode !== 32) {\n return;\n }\n\n if (disabled || !onClick) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n\n onClick(e);\n }, [disabled, onClick]);\n\n const fullClassName = buildClassName(\n 'MenuItem',\n className,\n disabled && 'disabled',\n destructive && 'destructive',\n );\n\n const content = (\n <>\n {icon && (\n \n )}\n {children}\n \n );\n\n if (href) {\n return (\n \n {content}\n \n );\n }\n\n return (\n \n {content}\n
\n );\n};\n\nexport default MenuItem;\n","import React, {\n FC, useCallback, useMemo, useState, memo,\n} from '../../lib/teact/teact';\nimport { debounce } from '../../util/schedulers';\n\nimport './RippleEffect.scss';\n\ninterface Ripple {\n x: number;\n y: number;\n size: number;\n}\n\nconst ANIMATION_DURATION_MS = 700;\n\nconst RippleEffect: FC = () => {\n const [ripples, setRipples] = useState([]);\n\n const cleanUpDebounced = useMemo(() => {\n return debounce(() => {\n setRipples([]);\n }, ANIMATION_DURATION_MS, false);\n }, []);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (e.button !== 0) {\n return;\n }\n\n const container = e.currentTarget as HTMLDivElement;\n const position = container.getBoundingClientRect() as DOMRect;\n\n const rippleSize = container.offsetWidth / 2;\n\n setRipples([\n ...ripples,\n {\n x: e.clientX - position.x - (rippleSize / 2),\n y: e.clientY - position.y - (rippleSize / 2),\n size: rippleSize,\n },\n ]);\n\n requestAnimationFrame(() => {\n cleanUpDebounced();\n });\n }, [ripples, cleanUpDebounced]);\n\n return (\n
\n {ripples.map(({ x, y, size }: Ripple) => (\n \n ))}\n
\n );\n};\n\nexport default memo(RippleEffect);\n","import { ISettings } from '../types';\n\nimport { animateSingle } from './animation';\n\nimport themeColors from '../styles/themes.json';\n\ntype RGBAColor = {\n r: number;\n g: number;\n b: number;\n a?: number;\n};\n\nlet isInitialized = false;\n\nconst HEX_COLOR_REGEX = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})?$/i;\nconst DURATION_MS = 200;\nconst ENABLE_ANIMATION_DELAY_MS = 500;\n\nconst lerp = (start: number, end: number, interpolationRatio: number) => {\n return (1 - interpolationRatio) * start + interpolationRatio * end;\n};\n\nconst colors = (Object.keys(themeColors) as Array).map((property) => ({\n property,\n colors: [hexToRgb(themeColors[property][0]), hexToRgb(themeColors[property][1])],\n}));\n\nexport default (theme: ISettings['theme'], withAnimation: boolean) => {\n const isDarkTheme = theme === 'dark';\n const shouldAnimate = isInitialized && withAnimation;\n const startIndex = isDarkTheme ? 0 : 1;\n const endIndex = isDarkTheme ? 1 : 0;\n const startAt = Date.now();\n const themeColorTag = document.querySelector('meta[name=\"theme-color\"]');\n\n document.documentElement.classList.remove(`theme-${isDarkTheme ? 'light' : 'dark'}`);\n if (isInitialized) {\n document.documentElement.classList.add('no-animations');\n }\n document.documentElement.classList.add(`theme-${theme}`);\n if (themeColorTag) {\n themeColorTag.setAttribute('content', isDarkTheme ? '#212121' : '#fff');\n }\n\n setTimeout(() => {\n document.documentElement.classList.remove('no-animations');\n }, ENABLE_ANIMATION_DELAY_MS);\n\n isInitialized = true;\n\n if (shouldAnimate) {\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / DURATION_MS, 1);\n\n applyColorAnimationStep(startIndex, endIndex, transition(t));\n\n return t < 1;\n });\n } else {\n applyColorAnimationStep(startIndex, endIndex);\n }\n};\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n\nfunction hexToRgb(hex: string): RGBAColor {\n const result = HEX_COLOR_REGEX.exec(hex)!;\n\n return {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n a: result[4] !== undefined ? parseInt(result[4], 16) : undefined,\n };\n}\n\nfunction applyColorAnimationStep(startIndex: number, endIndex: number, interpolationRatio: number = 1) {\n colors.forEach(({ property, colors: propertyColors }) => {\n const r = Math.round(lerp(propertyColors[startIndex].r, propertyColors[endIndex].r, interpolationRatio));\n const g = Math.round(lerp(propertyColors[startIndex].g, propertyColors[endIndex].g, interpolationRatio));\n const b = Math.round(lerp(propertyColors[startIndex].b, propertyColors[endIndex].b, interpolationRatio));\n const a = propertyColors[startIndex].a !== undefined\n ? Math.round(lerp(propertyColors[startIndex].a!, propertyColors[endIndex].a!, interpolationRatio))\n : undefined;\n\n document.documentElement.style.setProperty(property, a !== undefined\n ? `rgba(${r},${g},${b},${a / 255})`\n : `rgb(${r},${g},${b})`);\n });\n}\n","import WebpWorker from 'worker-loader!../lib/webp/webp_wasm.worker';\nimport { isWebpSupported } from './environment';\nimport { dataUriToBlob, blobToDataUri } from './files';\nimport { pause } from './schedulers';\n\ntype TEncodedImage = {\n result: Uint8ClampedArray;\n width: number;\n height: number;\n};\n\nconst WORKER_INITIALIZATION_TIMEOUT = 2000;\n\nlet canvas: HTMLCanvasElement;\nlet worker: IWebpWorker;\n\nexport const EMPTY_IMAGE_DATA_URI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk'\n + 'YAAAAAYAAjCB0C8AAAAASUVORK5CYII=';\n\nexport async function webpToPng(url: string, blob: Blob): Promise {\n initWebpWorker();\n\n while (!worker.wasmReady) {\n await pause(WORKER_INITIALIZATION_TIMEOUT);\n }\n\n const { result, width, height } = await getDecodePromise(url, blob);\n if (!width || !height) {\n return undefined;\n }\n\n return createPng({ result, width, height });\n}\n\nexport async function webpToPngBase64(key: string, url: string): Promise {\n if (isWebpSupported() || url.substr(0, 15) !== 'data:image/webp') {\n return url;\n }\n\n initWebpWorker();\n\n const pngBlob = await webpToPng(key, dataUriToBlob(url));\n\n if (!pngBlob) {\n throw new Error(`Can't convert webp to png. Url: ${url}`);\n }\n\n return blobToDataUri(pngBlob);\n}\n\nfunction initWebpWorker() {\n if (!worker) {\n worker = new WebpWorker() as IWebpWorker;\n worker.wasmReady = false;\n worker.onmessage = handleLibWebpMessage;\n }\n}\n\nfunction createPng({ result, width, height }: TEncodedImage): Promise {\n if (!canvas) {\n canvas = document.createElement('canvas');\n }\n\n return new Promise((resolve) => {\n const img = new ImageData(result, width, height);\n\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d')!;\n ctx.putImageData(img, 0, 0);\n\n canvas.toBlob((blob) => {\n resolve(blob ?? undefined);\n }, 'image/png', 1);\n });\n}\n\nfunction handleLibWebpMessage(e: MessageEvent) {\n const { id } = e.data;\n switch (e.data.type) {\n case 'initialized': {\n worker.wasmReady = true;\n break;\n }\n\n case 'result': {\n if (worker.requests.has(id)) {\n const resolve = worker.requests.get(id)!;\n\n worker.requests.delete(id);\n resolve(e.data!);\n }\n break;\n }\n }\n}\n\nfunction getDecodePromise(url: string, blob: Blob): Promise {\n return new Promise((resolve) => {\n worker.requests = worker.requests || new Map();\n worker.requests.set(url, resolve);\n worker.postMessage({ id: url, blob });\n });\n}\n","import { ChangeEvent, FormEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\ntype OwnProps = {\n ref?: RefObject;\n id?: string;\n className?: string;\n value?: string;\n label?: string;\n error?: string;\n success?: string;\n disabled?: boolean;\n readOnly?: boolean;\n placeholder?: string;\n autoComplete?: string;\n maxLength?: number;\n inputMode?: 'text' | 'none' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search';\n onChange?: (e: ChangeEvent) => void;\n onInput?: (e: FormEvent) => void;\n onKeyPress?: (e: React.KeyboardEvent) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n onBlur?: (e: React.FocusEvent) => void;\n onPaste?: (e: React.ClipboardEvent) => void;\n};\n\nconst InputText: FC = ({\n ref,\n id,\n className,\n value,\n label,\n error,\n success,\n disabled,\n readOnly,\n placeholder,\n autoComplete,\n inputMode,\n maxLength,\n onChange,\n onInput,\n onKeyPress,\n onKeyDown,\n onBlur,\n onPaste,\n}) => {\n const lang = useLang();\n const labelText = error || success || label;\n const fullClassName = buildClassName(\n 'input-group',\n value && 'touched',\n error ? 'error' : success && 'success',\n disabled && 'disabled',\n readOnly && 'disabled',\n labelText && 'with-label',\n className,\n );\n\n return (\n
\n \n {labelText && (\n \n )}\n
\n );\n};\n\nexport default memo(InputText);\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from './Spinner';\n\nimport './Checkbox.scss';\n\ntype OwnProps = {\n id?: string;\n name?: string;\n value?: string;\n label: string;\n subLabel?: string;\n checked: boolean;\n disabled?: boolean;\n round?: boolean;\n blocking?: boolean;\n isLoading?: boolean;\n withCheckedCallback?: boolean;\n onChange?: (e: ChangeEvent) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Checkbox: FC = ({\n id,\n name,\n value,\n label,\n subLabel,\n checked,\n disabled,\n round,\n blocking,\n isLoading,\n onChange,\n onCheck,\n}) => {\n const lang = useLang();\n const handleChange = useCallback((event: ChangeEvent) => {\n if (onChange) {\n onChange(event);\n }\n\n if (onCheck) {\n onCheck(event.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const className = buildClassName(\n 'Checkbox',\n disabled && 'disabled',\n round && 'round',\n isLoading && 'loading',\n blocking && 'blocking',\n );\n\n return (\n \n );\n};\n\nexport default memo(Checkbox);\n","import captureKeyboardListener from './captureKeyboardListeners';\n\ntype IHandlerFunction = () => void;\n\nexport default function captureEscKeyListener(handler: IHandlerFunction) {\n return captureKeyboardListener({ onEsc: handler });\n}\n","export function formatInteger(value: number) {\n return String(value).replace(/\\d(?=(\\d{3})+$)/g, '$& ');\n}\n\nfunction formatFixedNumber(number: number) {\n const fixed = String(number.toFixed(1));\n if (fixed.substr(-2) === '.0') {\n return Math.round(number);\n }\n\n return number.toFixed(1).replace('.', ',');\n}\n\nexport function formatIntegerCompact(views: number) {\n if (views < 1e3) {\n return views;\n }\n\n if (views < 1e6) {\n return `${formatFixedNumber(views / 1e3)}K`;\n }\n\n return `${formatFixedNumber(views / 1e6)}M`;\n}\n\nexport function getFirstLetters(phrase: string, count = 2) {\n return phrase\n .replace(/[.,!@#$%^&*()_+=\\-`~[\\]/\\\\{}:\"|<>?]+/gi, '')\n .trim()\n .split(/\\s+/)\n .slice(0, count)\n .map((word: string) => word.length && word.match(/./u)![0].toUpperCase())\n .join('');\n}\n","export const MEMO_EMPTY_ARRAY = [];\n","import usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T) => {\n const prevDeps = usePrevious(dependencies);\n if (!prevDeps || dependencies.some((d, i) => d !== prevDeps[i])) {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n cb(prevDeps || []);\n }\n};\n","const RE_NOT_LETTER = /[^\\wа-яё]+/;\n\nexport default function searchWords(haystack: string, needle: string) {\n if (!haystack || !needle) {\n return false;\n }\n\n const haystackWords = haystack.toLowerCase().split(RE_NOT_LETTER);\n const needleWords = needle.toLowerCase().split(RE_NOT_LETTER);\n\n return needleWords.every((needleWord) => (\n haystackWords.some((haystackWord) => haystackWord.startsWith(needleWord))\n ));\n}\n","import { throttle } from './schedulers';\nimport {\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n MOBILE_SCREEN_MAX_WIDTH,\n} from '../config';\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT } from './environment';\n\ntype IDimensions = {\n width: number;\n height: number;\n};\n\nconst IS_LANDSCAPE = IS_SINGLE_COLUMN_LAYOUT && isLandscape();\n\nconst initialHeight = window.innerHeight;\nlet windowSize = updateSizes();\nlet isRefreshDisabled = false;\n\nfunction disableRefresh() {\n isRefreshDisabled = true;\n}\n\nfunction enableRefresh() {\n isRefreshDisabled = false;\n}\n\nconst handleResize = throttle(() => {\n windowSize = updateSizes();\n\n if (!isRefreshDisabled && (\n isMobileScreen() !== IS_SINGLE_COLUMN_LAYOUT\n || (IS_SINGLE_COLUMN_LAYOUT && IS_LANDSCAPE !== isLandscape())\n )) {\n window.location.reload();\n }\n}, 250, true);\n\nwindow.addEventListener('resize', handleResize);\nwindow.addEventListener('orientationchange', handleResize);\n\nexport function updateSizes(): IDimensions {\n const vh = window.innerHeight * 0.01;\n\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n}\n\nfunction isMobileScreen() {\n return windowSize.width <= MOBILE_SCREEN_MAX_WIDTH || (\n windowSize.width <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && windowSize.height <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n );\n}\n\nfunction isLandscape() {\n if (IS_IOS) {\n return window.matchMedia('(orientation: landscape)').matches;\n }\n\n // eslint-disable-next-line max-len\n // Source: https://web.archive.org/web/20160509220835/http://blog.abouthalf.com/development/orientation-media-query-challenges-in-android-browsers/\n // Feature is marked as deprecated now, but it is still supported\n // https://developer.mozilla.org/en-US/docs/Web/CSS/@media/device-aspect-ratio#browser_compatibility\n return window.matchMedia('screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)').matches;\n}\n\nexport default {\n get: () => windowSize,\n getIsKeyboardVisible: () => initialHeight > windowSize.height,\n disableRefresh,\n enableRefresh,\n};\n","import { RefObject } from 'react';\nimport React, { FC, useEffect, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\nimport useVirtualBackdrop from '../../hooks/useVirtualBackdrop';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport './Menu.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n containerRef?: RefObject;\n isOpen: boolean;\n className?: string;\n style?: string;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n autoClose?: boolean;\n shouldSkipTransition?: boolean;\n footer?: string;\n noCloseOnBackdrop?: boolean;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n onCloseAnimationEnd?: () => void;\n onClose?: () => void;\n onMouseEnter?: (e: React.MouseEvent) => void;\n onMouseLeave?: (e: React.MouseEvent) => void;\n children: any;\n};\n\nconst ANIMATION_DURATION = 200;\n\nconst Menu: FC = ({\n ref,\n containerRef,\n isOpen,\n className,\n style,\n children,\n positionX = 'left',\n positionY = 'top',\n autoClose = false,\n footer,\n noCloseOnBackdrop = false,\n onCloseAnimationEnd,\n onClose,\n onMouseEnter,\n onMouseLeave,\n shouldSkipTransition,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let menuRef = useRef(null);\n if (ref) {\n menuRef = ref;\n }\n const backdropContainerRef = containerRef || menuRef;\n\n const {\n transitionClassNames,\n } = useShowTransition(\n isOpen,\n onCloseAnimationEnd,\n shouldSkipTransition,\n undefined,\n shouldSkipTransition,\n );\n\n useEffect(\n () => (isOpen && onClose ? captureEscKeyListener(onClose) : undefined),\n [isOpen, onClose],\n );\n\n useHistoryBack(isOpen, onClose, undefined, undefined, autoClose);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n if (prevIsOpen !== undefined) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n }, [isOpen]);\n\n const handleKeyDown = useKeyboardListNavigation(menuRef, isOpen, autoClose ? onClose : undefined, undefined, true);\n\n useVirtualBackdrop(\n isOpen,\n backdropContainerRef,\n noCloseOnBackdrop ? undefined : onClose,\n );\n\n const bubbleClassName = buildClassName(\n 'bubble menu-container custom-scroll',\n positionY,\n positionX,\n footer && 'with-footer',\n transitionClassNames,\n );\n\n return (\n \n {isOpen && (\n // This only prevents click events triggering on underlying elements\n
\n )}\n \n {children}\n {footer &&
{footer}
}\n
\n \n );\n};\n\nexport default Menu;\n","type HandlerName = 'onEnter' | 'onBackspace' | 'onDelete' | 'onEsc' | 'onUp' | 'onDown' | 'onLeft' | 'onRight'\n| 'onTab';\ntype Handler = (e: KeyboardEvent) => void;\ntype CaptureOptions = Partial>;\n\nconst keyToHandlerName: Record = {\n Enter: 'onEnter',\n Backspace: 'onBackspace',\n Delete: 'onDelete',\n Esc: 'onEsc',\n Escape: 'onEsc',\n ArrowUp: 'onUp',\n ArrowDown: 'onDown',\n ArrowLeft: 'onLeft',\n ArrowRight: 'onRight',\n Tab: 'onTab',\n};\n\nconst handlers: Record = {\n onEnter: [],\n onDelete: [],\n onBackspace: [],\n onEsc: [],\n onUp: [],\n onDown: [],\n onLeft: [],\n onRight: [],\n onTab: [],\n};\n\nexport default function captureKeyboardListeners(options: CaptureOptions) {\n if (!hasActiveHandlers()) {\n document.addEventListener('keydown', handleKeyDown, true);\n }\n\n (Object.keys(options) as Array).forEach((handlerName) => {\n const handler = options[handlerName];\n if (!handler) {\n return;\n }\n\n const currentEventHandlers = handlers[handlerName];\n if (currentEventHandlers) {\n currentEventHandlers.push(handler);\n }\n });\n\n return () => {\n releaseKeyboardListener(options);\n };\n}\n\nfunction hasActiveHandlers() {\n return Object.values(handlers).some((keyHandlers) => Boolean(keyHandlers.length));\n}\n\nfunction handleKeyDown(e: KeyboardEvent) {\n const handlerName = keyToHandlerName[e.key];\n if (!handlerName) {\n return;\n }\n\n const { length } = handlers[handlerName];\n if (!length) {\n return;\n }\n e.stopPropagation();\n\n const handler = handlers[handlerName][length - 1];\n handler!(e);\n}\n\nfunction releaseKeyboardListener(options: CaptureOptions) {\n (Object.keys(options) as Array).forEach((handlerName) => {\n const handler = options[handlerName];\n const currentEventHandlers = handlers[handlerName];\n if (currentEventHandlers) {\n const index = currentEventHandlers.findIndex((cb) => cb === handler);\n if (index !== -1) {\n currentEventHandlers.splice(index, 1);\n }\n }\n });\n\n if (!hasActiveHandlers()) {\n document.removeEventListener('keydown', handleKeyDown, false);\n }\n}\n","import DecoderWorker from 'worker-loader!opus-recorder/dist/decoderWorker.min';\nimport WavWorker from 'worker-loader!opus-recorder/dist/waveWorker.min';\n\nconst SAMPLE_RATE = 48000;\nconst BIT_DEPTH = 16;\n\nexport async function oggToWav(opusData: Blob): Promise {\n const arrayBuffer = await new Response(opusData).arrayBuffer();\n\n return new Promise((resolve) => {\n const typedArray = new Uint8Array(arrayBuffer);\n\n let decoderWorker: DecoderWorker | undefined = new DecoderWorker();\n let wavWorker: WavWorker | undefined = new WavWorker();\n\n decoderWorker.onmessage = (e) => {\n // eslint-disable-next-line no-null/no-null\n if (e.data === null) {\n // `null` means decoder is finished\n wavWorker!.postMessage({ command: 'done' });\n } else {\n // `e.data` contains decoded buffers as float32 values\n wavWorker!.postMessage(\n {\n command: 'encode',\n buffers: e.data,\n },\n e.data.map(({ buffer }: Float32Array) => buffer),\n );\n }\n };\n\n wavWorker.onmessage = (e) => {\n if (e.data.message === 'page') {\n resolve(new Blob([e.data.page], { type: 'audio/wav' }));\n\n decoderWorker!.terminate();\n decoderWorker = undefined;\n wavWorker!.terminate();\n wavWorker = undefined;\n }\n };\n\n wavWorker.postMessage({\n command: 'init',\n wavBitDepth: BIT_DEPTH,\n wavSampleRate: SAMPLE_RATE,\n });\n\n decoderWorker.postMessage({\n command: 'init',\n decoderSampleRate: SAMPLE_RATE,\n outputBufferSampleRate: SAMPLE_RATE,\n });\n\n decoderWorker.postMessage({\n command: 'decode',\n pages: typedArray,\n }, [typedArray.buffer]);\n });\n}\n","import {\n ApiMediaFormat,\n ApiMediaFormatToPrepared,\n ApiOnProgress,\n ApiParsedMedia,\n ApiPreparedMedia,\n} from '../api/types';\n\nimport {\n DEBUG, MEDIA_CACHE_DISABLED, MEDIA_CACHE_NAME, MEDIA_CACHE_NAME_AVATARS,\n} from '../config';\nimport { callApi, cancelApiProgress } from '../api/gramjs';\nimport * as cacheApi from './cacheApi';\nimport { fetchBlob } from './files';\nimport { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, isWebpSupported } from './environment';\nimport { oggToWav } from './oggToWav';\nimport { webpToPng } from './webpToPng';\n\nconst asCacheApiType = {\n [ApiMediaFormat.DataUri]: cacheApi.Type.Text,\n [ApiMediaFormat.BlobUrl]: cacheApi.Type.Blob,\n [ApiMediaFormat.Lottie]: cacheApi.Type.Json,\n [ApiMediaFormat.Progressive]: undefined,\n [ApiMediaFormat.Stream]: undefined,\n};\n\nconst PROGRESSIVE_URL_PREFIX = './progressive/';\n\nconst memoryCache = new Map();\nconst fetchPromises = new Map>();\n\nexport function fetch(\n url: string, mediaFormat: T, onProgress?: ApiOnProgress,\n): Promise> {\n if (mediaFormat === ApiMediaFormat.Progressive) {\n return (\n IS_PROGRESSIVE_SUPPORTED\n ? getProgressive(url)\n : fetch(url, ApiMediaFormat.BlobUrl, onProgress)\n ) as Promise>;\n }\n\n if (!fetchPromises.has(url)) {\n const promise = fetchFromCacheOrRemote(url, mediaFormat, onProgress)\n .catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err);\n }\n\n return undefined;\n })\n .finally(() => {\n fetchPromises.delete(url);\n });\n\n fetchPromises.set(url, promise);\n }\n\n return fetchPromises.get(url) as Promise>;\n}\n\nexport function getFromMemory(url: string) {\n return memoryCache.get(url) as ApiMediaFormatToPrepared;\n}\n\nexport function cancelProgress(progressCallback: ApiOnProgress) {\n cancelApiProgress(progressCallback);\n}\n\nfunction getProgressive(url: string) {\n const progressiveUrl = `${PROGRESSIVE_URL_PREFIX}${url}`;\n\n memoryCache.set(url, progressiveUrl);\n\n return Promise.resolve(progressiveUrl);\n}\n\nasync function fetchFromCacheOrRemote(url: string, mediaFormat: ApiMediaFormat, onProgress?: ApiOnProgress) {\n if (!MEDIA_CACHE_DISABLED) {\n const cacheName = url.startsWith('avatar') ? MEDIA_CACHE_NAME_AVATARS : MEDIA_CACHE_NAME;\n const cached = await cacheApi.fetch(cacheName, url, asCacheApiType[mediaFormat]!);\n if (cached) {\n let media = cached;\n\n if (cached.type === 'audio/ogg' && !IS_OPUS_SUPPORTED) {\n media = await oggToWav(media);\n }\n\n if (cached.type === 'image/webp' && !isWebpSupported() && media) {\n const mediaPng = await webpToPng(url, media);\n if (mediaPng) {\n media = mediaPng;\n }\n }\n\n const prepared = prepareMedia(media);\n\n memoryCache.set(url, prepared);\n\n return prepared;\n }\n }\n\n if (mediaFormat === ApiMediaFormat.Stream) {\n const mediaSource = new MediaSource();\n const streamUrl = URL.createObjectURL(mediaSource);\n let isOpen = false;\n\n mediaSource.addEventListener('sourceopen', () => {\n if (isOpen) {\n return;\n }\n isOpen = true;\n\n const sourceBuffer = mediaSource.addSourceBuffer('audio/mpeg');\n\n void callApi('downloadMedia', { url, mediaFormat }, (progress: number, arrayBuffer: ArrayBuffer) => {\n if (onProgress) {\n onProgress(progress);\n }\n\n if (progress === 1) {\n mediaSource.endOfStream();\n }\n\n if (!arrayBuffer) {\n return;\n }\n\n sourceBuffer.appendBuffer(arrayBuffer!);\n });\n });\n\n memoryCache.set(url, streamUrl);\n return streamUrl;\n }\n\n const remote = await callApi('downloadMedia', { url, mediaFormat }, onProgress);\n if (!remote) {\n throw new Error('Failed to fetch media');\n }\n\n let { prepared, mimeType } = remote;\n\n if (mimeType === 'audio/ogg' && !IS_OPUS_SUPPORTED) {\n const blob = await fetchBlob(prepared as string);\n URL.revokeObjectURL(prepared as string);\n const media = await oggToWav(blob);\n prepared = prepareMedia(media);\n mimeType = blob.type;\n }\n\n if (mimeType === 'image/webp' && !isWebpSupported()) {\n const blob = await fetchBlob(prepared as string);\n URL.revokeObjectURL(prepared as string);\n const media = await webpToPng(url, blob);\n if (media) {\n prepared = prepareMedia(media);\n }\n }\n\n memoryCache.set(url, prepared);\n\n return prepared;\n}\n\nfunction prepareMedia(mediaData: ApiParsedMedia): ApiPreparedMedia {\n if (mediaData instanceof Blob) {\n return URL.createObjectURL(mediaData);\n }\n\n return mediaData;\n}\n\nif (IS_PROGRESSIVE_SUPPORTED) {\n navigator.serviceWorker.addEventListener('message', async (e) => {\n const { type, messageId, params } = e.data as {\n type: string;\n messageId: string;\n params: { url: string; start: number; end: number };\n };\n\n if (type !== 'requestPart') {\n return;\n }\n\n const result = await callApi('downloadMedia', { mediaFormat: ApiMediaFormat.Progressive, ...params });\n if (!result) {\n return;\n }\n\n const { arrayBuffer, mimeType, fullSize } = result;\n\n navigator.serviceWorker.controller!.postMessage({\n type: 'partResponse',\n messageId,\n result: {\n arrayBuffer,\n mimeType,\n fullSize,\n },\n }, [arrayBuffer!]);\n });\n}\n","import { useEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T, debugKey?: string) => {\n const prevDeps = usePrevious(dependencies);\n return useEffect(() => {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n return cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies, debugKey);\n};\n","/* eslint-disable no-nested-ternary */\n/* eslint-disable no-bitwise */\n\nconst utf16 = {\n // The utf16-class is necessary to convert from javascripts internal character representation to unicode and back.\n decode: (input) => {\n const output = [];\n let i = 0;\n const len = input.length;\n let value;\n let extra;\n\n while (i < len) {\n value = input.charCodeAt(i++);\n if ((value & 0xf800) === 0xd800) {\n extra = input.charCodeAt(i++);\n if ((value & 0xfc00) !== 0xd800 || (extra & 0xfc00) !== 0xdc00) {\n throw new RangeError('UTF-16(decode): Illegal UTF-16 sequence');\n }\n value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;\n }\n output.push(value);\n }\n return output;\n },\n encode: (input) => {\n const output = [];\n let i = 0;\n const len = input.length;\n let value;\n\n while (i < len) {\n value = input[i++];\n if ((value & 0xf800) === 0xd800) {\n throw new RangeError('UTF-16(encode): Illegal UTF-16 value');\n }\n if (value > 0xffff) {\n value -= 0x10000;\n output.push(String.fromCharCode(((value >>> 10) & 0x3ff) | 0xd800));\n value = 0xdc00 | (value & 0x3ff);\n }\n output.push(String.fromCharCode(value));\n }\n return output.join('');\n },\n};\n\n// Default parameters\nconst initial_n = 0x80;\nconst initial_bias = 72;\nconst delimiter = '\\x2D';\nconst base = 36;\nconst damp = 700;\nconst tmin = 1;\nconst tmax = 26;\nconst skew = 38;\nconst maxint = 0x7fffffff;\n\n// decode_digit(cp) returns the numeric value of a basic code\n// point (for use in representing integers) in the range 0 to\n// base-1, or base if cp is does not represent a value.\n\nfunction decode_digit(cp) {\n return cp - 48 < 10 ? cp - 22 : cp - 65 < 26 ? cp - 65 : cp - 97 < 26 ? cp - 97 : base;\n}\n\n// ** Bias adaptation function **\nfunction adapt(delta, numpoints, firsttime) {\n let k;\n delta = firsttime ? Math.floor(delta / damp) : delta >> 1;\n delta += Math.floor(delta / numpoints);\n\n for (k = 0; delta > ((base - tmin) * tmax) >> 1; k += base) {\n delta = Math.floor(delta / (base - tmin));\n }\n return Math.floor(k + ((base - tmin + 1) * delta) / (delta + skew));\n}\n\n// Main decode\nfunction decode(input, preserveCase) {\n // Dont use utf16\n const output = [];\n const case_flags = [];\n const input_length = input.length;\n\n let n; let out; let i; let bias; let basic; let j; let ic; let oldi; let w; let k; let digit; let t; let len;\n\n // Initialize the state:\n\n n = initial_n;\n i = 0;\n bias = initial_bias;\n\n // Handle the basic code points: Let basic be the number of input code\n // points before the last delimiter, or 0 if there is none, then\n // copy the first basic code points to the output.\n\n basic = input.lastIndexOf(delimiter);\n if (basic < 0) basic = 0;\n\n for (j = 0; j < basic; ++j) {\n if (preserveCase) case_flags[output.length] = input.charCodeAt(j) - 65 < 26;\n if (input.charCodeAt(j) >= 0x80) {\n throw new RangeError('Illegal input >= 0x80');\n }\n output.push(input.charCodeAt(j));\n }\n\n // Main decoding loop: Start just after the last delimiter if any\n // basic code points were copied; start at the beginning otherwise.\n\n for (ic = basic > 0 ? basic + 1 : 0; ic < input_length;) {\n // ic is the index of the next character to be consumed,\n\n // Decode a generalized variable-length integer into delta,\n // which gets added to i. The overflow checking is easier\n // if we increase i as we go, then subtract off its starting\n // value at the end to obtain delta.\n for (oldi = i, w = 1, k = base; ; k += base) {\n if (ic >= input_length) {\n throw RangeError('punycode_bad_input(1)');\n }\n digit = decode_digit(input.charCodeAt(ic++));\n\n if (digit >= base) {\n throw RangeError('punycode_bad_input(2)');\n }\n if (digit > Math.floor((maxint - i) / w)) {\n throw RangeError('punycode_overflow(1)');\n }\n i += digit * w;\n t = k <= bias ? tmin : k >= bias + tmax ? tmax : k - bias;\n if (digit < t) {\n break;\n }\n if (w > Math.floor(maxint / (base - t))) {\n throw RangeError('punycode_overflow(2)');\n }\n w *= base - t;\n }\n\n out = output.length + 1;\n bias = adapt(i - oldi, out, oldi === 0);\n\n // i was supposed to wrap around from out to 0,\n // incrementing n each time, so we'll fix that now:\n if (Math.floor(i / out) > maxint - n) {\n throw RangeError('punycode_overflow(3)');\n }\n n += Math.floor(i / out);\n i %= out;\n\n // Insert n at position i of the output:\n // Case of last character determines uppercase flag:\n if (preserveCase) {\n case_flags.splice(i, 0, input.charCodeAt(ic - 1) - 65 < 26);\n }\n\n output.splice(i, 0, n);\n i++;\n }\n if (preserveCase) {\n for (i = 0, len = output.length; i < len; i++) {\n if (case_flags[i]) {\n output[i] = String.fromCharCode(output[i])\n .toUpperCase()\n .charCodeAt(0);\n }\n }\n }\n return utf16.encode(output);\n}\n\nfunction toUnicode(domain) {\n const domain_array = domain.split('.');\n const out = [];\n for (let i = 0; i < domain_array.length; ++i) {\n const s = domain_array[i];\n out.push(s.match(/^xn--/) ? decode(s.slice(4)) : s);\n }\n return out.join('.');\n}\n\nexport default toUnicode;\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\nimport convertPunycode from '../../lib/punycode';\n\nimport { DEBUG, RE_TME_INVITE_LINK, RE_TME_LINK } from '../../config';\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n url?: string;\n text: string;\n className?: string;\n children?: any;\n isRtl?: boolean;\n};\n\nconst SafeLink: FC = ({\n url,\n text,\n className,\n children,\n isRtl,\n}) => {\n const { toggleSafeLinkModal, openTelegramLink } = getDispatch();\n\n const content = children || text;\n const isNotSafe = url !== content;\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (\n e.ctrlKey || e.altKey || e.shiftKey || e.metaKey\n || !url || (!url.match(RE_TME_LINK) && !url.match(RE_TME_INVITE_LINK))\n ) {\n if (isNotSafe) {\n toggleSafeLinkModal({ url });\n\n e.preventDefault();\n return false;\n }\n\n return true;\n }\n\n e.preventDefault();\n openTelegramLink({ url });\n\n return false;\n }, [isNotSafe, openTelegramLink, toggleSafeLinkModal, url]);\n\n if (!url) {\n return undefined;\n }\n\n const classNames = buildClassName(\n className || 'text-entity-link',\n text.length > 50 && 'long-word-break-all',\n );\n\n return (\n \n {content}\n \n );\n};\n\nfunction ensureProtocol(url?: string) {\n if (!url) {\n return undefined;\n }\n\n return url.includes('://') ? url : `https://${url}`;\n}\n\nfunction getDomain(url?: string) {\n if (!url) {\n return undefined;\n }\n\n const href = ensureProtocol(url);\n if (!href) {\n return undefined;\n }\n\n try {\n let decodedHref = decodeURI(href);\n\n const match = decodedHref.match(/^https?:\\/\\/([^/:?#]+)(?:[/:?#]|$)/i);\n if (!match) {\n return undefined;\n }\n const domain = match[1];\n decodedHref = decodedHref.replace(domain, convertPunycode(domain));\n\n return decodedHref;\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('SafeLink.getDecodedUrl error ', url, error);\n }\n }\n\n return undefined;\n}\n\nexport default memo(SafeLink);\n","import { ApiDocument } from '../../../api/types';\n\nconst ONE_GIGABYTE = 1024 * 1024 * 1024;\nconst ONE_MEGABYTE = 1024 * 1024;\n\nexport function getFileSizeString(bytes: number) {\n if (bytes > (ONE_GIGABYTE / 2)) {\n return `${(bytes / ONE_GIGABYTE).toFixed(1)} GB`;\n }\n if (bytes > (ONE_MEGABYTE / 2)) {\n return `${(bytes / ONE_MEGABYTE).toFixed(1)} MB`;\n }\n return `${(bytes / (1024)).toFixed(1)} KB`;\n}\n\nexport function getDocumentExtension(document: ApiDocument) {\n const { fileName, mimeType } = document;\n\n return getFileExtension(fileName, mimeType);\n}\n\nexport function getFileExtension(fileName: string, mimeType: string) {\n if (fileName && fileName.indexOf('.') !== -1) {\n return fileName.split('.').pop();\n } else {\n return mimeType.split('/').pop();\n }\n}\n\nexport function getColorFromExtension(extension: string) {\n switch (extension) {\n case 'apk':\n case 'xls':\n case 'xlsx':\n return 'green';\n case 'zip':\n case 'rar':\n case '7z':\n case 'tar':\n case 'gz':\n case 'ppt':\n case 'pptx':\n return 'orange';\n case 'pdf':\n case 'xps':\n return 'red';\n default:\n return 'default';\n }\n}\n\nexport function getDocumentHasPreview(document: ApiDocument) {\n return Boolean(document.previewBlobUrl || document.thumbnail);\n}\n","import { ApiError, ApiInviteInfo } from '../../api/types';\n\nconst STRIPE_ERRORS: Record> = {\n missing_payment_information: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n invalid_number: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n number: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n exp_year: {\n field: 'expiry',\n fieldError: 'Incorrect year',\n },\n exp_month: {\n field: 'expiry',\n fieldError: 'Incorrect month',\n },\n invalid_expiry_year: {\n field: 'expiry',\n fieldError: 'Incorrect year',\n },\n invalid_expiry_month: {\n field: 'expiry',\n fieldError: 'Incorrect month',\n },\n cvc: {\n field: 'cvv',\n fieldError: 'Incorrect CVV',\n },\n invalid_cvc: {\n field: 'cvv',\n fieldError: 'Incorrect CVV',\n },\n};\n\nexport function getStripeError(error: {\n code: string;\n message: string;\n param?: string;\n}) {\n const { message, code, param } = error;\n const { field, fieldError, description } = param ? STRIPE_ERRORS[param] : STRIPE_ERRORS[code];\n return {\n field,\n fieldError,\n description: description || message,\n };\n}\n\nconst SHIPPING_ERRORS: Record> = {\n ADDRESS_STREET_LINE1_INVALID: {\n field: 'streetLine1',\n fieldError: 'Incorrect street address',\n },\n ADDRESS_STREET_LINE2_INVALID: {\n field: 'streetLine2',\n fieldError: 'Incorrect street address',\n },\n ADDRESS_CITY_INVALID: {\n field: 'city',\n fieldError: 'Incorrect city',\n },\n ADDRESS_COUNTRY_INVALID: {\n field: 'countryIso2',\n fieldError: 'Incorrect country',\n },\n ADDRESS_POSTCODE_INVALID: {\n field: 'postCode',\n fieldError: 'Incorrect post code',\n },\n ADDRESS_STATE_INVALID: {\n field: 'state',\n fieldError: 'Incorrect state',\n },\n REQ_INFO_NAME_INVALID: {\n field: 'fullName',\n fieldError: 'Incorrect name',\n },\n REQ_INFO_PHONE_INVALID: {\n field: 'phone',\n fieldError: 'Incorrect phone',\n },\n REQ_INFO_EMAIL_INVALID: {\n field: 'email',\n fieldError: 'Incorrect email',\n },\n};\n\n\nexport function getShippingErrors(dialogs: (ApiError | ApiInviteInfo)[]) {\n return Object.values(dialogs).reduce((acc, cur) => {\n if (!('hasErrorKey' in cur) || !cur.hasErrorKey) return acc;\n const error = SHIPPING_ERRORS[cur.message];\n if (error) {\n acc = {\n ...acc,\n [error.field]: error.fieldError,\n };\n }\n return acc;\n }, {});\n}\n","import { fastRaf } from './schedulers';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n}\n\nlet currentInstance: AnimationInstance | undefined;\n\nexport function animateSingle(tick: Function, instance?: AnimationInstance) {\n if (!instance) {\n if (currentInstance && !currentInstance.isCancelled) {\n currentInstance.isCancelled = true;\n }\n\n instance = { isCancelled: false };\n currentInstance = instance;\n }\n\n fastRaf(() => {\n if (!instance!.isCancelled && tick()) {\n animateSingle(tick, instance);\n }\n });\n}\n\nexport function animate(tick: Function) {\n fastRaf(() => {\n if (tick()) {\n animate(tick);\n }\n });\n}\n","import React, { FC, useState, useRef } from '../../lib/teact/teact';\n\nimport Menu from './Menu';\n\nimport './DropdownMenu.scss';\n\ntype OwnProps = {\n className?: string;\n trigger: FC<{ onTrigger: () => void; isOpen?: boolean }>;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n footer?: string;\n forceOpen?: boolean;\n onOpen?: NoneToVoidFunction;\n onClose?: NoneToVoidFunction;\n children: any;\n};\n\nconst DropdownMenu: FC = ({\n trigger,\n className,\n children,\n positionX = 'left',\n positionY = 'top',\n footer,\n forceOpen,\n onOpen,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const dropdownRef = useRef(null);\n const [isOpen, setIsOpen] = useState(false);\n\n const toggleIsOpen = () => {\n setIsOpen(!isOpen);\n if (isOpen) {\n if (onClose) onClose();\n } else if (onOpen) onOpen();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n const menu = menuRef.current;\n\n if (!isOpen || e.keyCode !== 40 || !menu) {\n return;\n }\n\n const focusedElement = document.activeElement;\n const elementChildren = Array.from(menu.children);\n\n if (!focusedElement || elementChildren.indexOf(focusedElement) === -1) {\n (elementChildren[0] as HTMLElement).focus();\n }\n };\n\n const handleClose = () => {\n setIsOpen(false);\n if (onClose) onClose();\n };\n\n return (\n \n {trigger({ onTrigger: toggleIsOpen, isOpen })}\n\n \n {children}\n \n \n );\n};\n\nexport default DropdownMenu;\n","import { RefObject } from 'react';\nimport { useState, useCallback, useEffect } from '../lib/teact/teact';\n\nexport default (\n elementRef: RefObject,\n isOpen: boolean,\n onSelectWithEnter?: (index: number) => void,\n itemSelector?: string,\n noCaptureFocus?: boolean,\n) => {\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n useEffect(() => {\n setFocusedIndex(-1);\n\n const element = elementRef.current;\n if (isOpen && element && !noCaptureFocus) {\n element.tabIndex = -1;\n element.focus();\n }\n }, [elementRef, isOpen, noCaptureFocus]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n const element = elementRef.current;\n\n if (!element) {\n return;\n }\n\n if (e.keyCode === 13 && onSelectWithEnter) {\n onSelectWithEnter(focusedIndex);\n return;\n }\n\n if (e.keyCode !== 38 && e.keyCode !== 40) {\n return;\n }\n\n const focusedElement = document.activeElement;\n const elementChildren = Array.from(itemSelector ? element.querySelectorAll(itemSelector) : element.children);\n\n let newIndex = (focusedElement && elementChildren.indexOf(focusedElement)) || focusedIndex;\n\n if (e.keyCode === 38 && newIndex > 0) {\n newIndex--;\n } else if (e.keyCode === 40 && newIndex < elementChildren.length - 1) {\n newIndex++;\n } else if (elementChildren.length === 1) {\n newIndex = 0;\n } else {\n return;\n }\n\n const item = elementChildren[newIndex] as HTMLElement;\n if (item) {\n setFocusedIndex(newIndex);\n item.focus();\n }\n }, [elementRef, onSelectWithEnter, itemSelector, focusedIndex]);\n\n return handleKeyDown;\n};\n","// @ts-ignore\nimport twemojiRegex from '../../../lib/twemojiRegex';\n\nconst DETECT_UP_TO = 3;\nconst MAX_LENGTH = DETECT_UP_TO * 8; // Maximum 8 per one emoji.\nconst RE_EMOJI_ONLY = new RegExp(`^(?:${twemojiRegex.source})+$`, '');\n\nexport default (text: string): number | false => {\n if (text.length > MAX_LENGTH) {\n return false;\n }\n\n const isEmojiOnly = Boolean(text.match(RE_EMOJI_ONLY));\n if (!isEmojiOnly) {\n return false;\n }\n\n let emojiCount = 0;\n while (twemojiRegex.exec(text)) {\n emojiCount++;\n\n if (emojiCount > DETECT_UP_TO) {\n twemojiRegex.lastIndex = 0;\n return false;\n }\n }\n\n return emojiCount;\n};\n","// Due to the fact that emoji from Apple do not contain some characters, it is necessary to remove them from emoji-data\n// https://github.com/iamcal/emoji-data/issues/136\nconst EXCLUDE_EMOJIS = ['female_sign', 'male_sign', 'medical_symbol'];\n\nexport type EmojiRawData = typeof import('emoji-data-ios/emoji-data.json');\nexport type EmojiModule = { default: EmojiRawData };\n\nexport type EmojiData = {\n categories: Array;\n emojis: Record;\n};\n\nfunction unifiedToNative(unified: string) {\n const unicodes = unified.split('-');\n const codePoints = unicodes.map((i) => parseInt(i, 16));\n\n return String.fromCodePoint(...codePoints);\n}\n\nexport function nativeToUnfified(emoji: string) {\n let code;\n\n if (emoji.length === 1) {\n code = emoji.charCodeAt(0).toString(16).padStart(4, '0');\n } else {\n const pairs = [];\n for (let i = 0; i < emoji.length; i++) {\n if (emoji.charCodeAt(i) >= 0xd800 && emoji.charCodeAt(i) <= 0xdbff) {\n if (emoji.charCodeAt(i + 1) >= 0xdc00 && emoji.charCodeAt(i + 1) <= 0xdfff) {\n pairs.push(\n (emoji.charCodeAt(i) - 0xd800) * 0x400\n + (emoji.charCodeAt(i + 1) - 0xdc00) + 0x10000,\n );\n }\n } else if (emoji.charCodeAt(i) < 0xd800 || emoji.charCodeAt(i) > 0xdfff) {\n pairs.push(emoji.charCodeAt(i));\n }\n }\n\n code = pairs.map((x) => x.toString(16).padStart(4, '0')).join('-');\n }\n\n return code;\n}\n\nexport function uncompressEmoji(data: EmojiRawData): EmojiData {\n const emojiData: EmojiData = { categories: [], emojis: {} };\n\n for (let i = 0; i < data.length; i += 2) {\n const category = {\n id: data[i][0],\n name: data[i][1],\n emojis: [],\n } as EmojiCategory;\n\n for (let j = 0; j < data[i + 1].length; j++) {\n const emojiRaw = data[i + 1][j];\n if (!EXCLUDE_EMOJIS.includes(emojiRaw[1][0])) {\n category.emojis.push(emojiRaw[1][0]);\n emojiData.emojis[emojiRaw[1][0]] = {\n id: emojiRaw[1][0],\n names: emojiRaw[1] as string[],\n native: unifiedToNative(emojiRaw[0] as string),\n image: (emojiRaw[0] as string).toLowerCase(),\n };\n }\n }\n\n emojiData.categories.push(category);\n }\n\n return emojiData;\n}\n","import {\n hasElementChanged,\n isComponentElement,\n isEmptyElement,\n isRealElement,\n isTextElement,\n mountComponent,\n renderComponent,\n unmountTree,\n getTarget,\n setTarget,\n VirtualElement,\n VirtualElementComponent,\n VirtualRealElement,\n} from './teact';\nimport generateIdFor from '../../util/generateIdFor';\nimport { DEBUG } from '../../config';\nimport { addEventListener, removeEventListener } from './dom-events';\n\ntype VirtualDomHead = {\n children: [VirtualElement] | [];\n};\n\nconst FILTERED_ATTRIBUTES = new Set(['key', 'ref', 'teactFastList', 'teactOrderKey']);\nconst HTML_ATTRIBUTES = new Set(['dir']);\nconst MAPPED_ATTRIBUTES: { [k: string]: string } = {\n autoPlay: 'autoplay',\n autoComplete: 'autocomplete',\n};\nconst INDEX_KEY_PREFIX = '__indexKey#';\n\nconst headsByElement: Record = {};\nlet DEBUG_virtualTreeSize = 1;\n\nfunction render($element?: VirtualElement, parentEl?: HTMLElement | null) {\n if (!parentEl) {\n return undefined;\n }\n\n let headId = parentEl.getAttribute('data-teact-head-id');\n if (!headId) {\n headId = generateIdFor(headsByElement);\n headsByElement[headId] = { children: [] };\n parentEl.setAttribute('data-teact-head-id', headId);\n }\n\n const $head = headsByElement[headId];\n $head.children = [renderWithVirtual(parentEl, $head.children[0], $element, $head, 0) as VirtualElement];\n\n if (process.env.APP_ENV === 'perf') {\n DEBUG_virtualTreeSize = 0;\n DEBUG_addToVirtualTreeSize($head);\n\n return DEBUG_virtualTreeSize;\n }\n\n return undefined;\n}\n\nfunction renderWithVirtual(\n parentEl: HTMLElement,\n $current: VirtualElement | undefined,\n $new: VirtualElement | undefined,\n $parent: VirtualRealElement | VirtualDomHead,\n index: number,\n {\n skipComponentUpdate = false,\n forceIndex = false,\n fragment,\n moveDirection,\n }: {\n skipComponentUpdate?: boolean;\n forceIndex?: boolean;\n fragment?: DocumentFragment;\n moveDirection?: 'up' | 'down';\n } = {},\n) {\n if (\n !skipComponentUpdate\n && $current && $new\n && isComponentElement($current) && isComponentElement($new)\n && !hasElementChanged($current, $new)\n ) {\n $new = updateComponent($current, $new);\n }\n\n // Parent element may have changed, so we need to update the listener closure.\n if (!skipComponentUpdate && $new && isComponentElement($new) && $new.componentInstance.isMounted) {\n setupComponentUpdateListener($new, $parent, index, parentEl);\n }\n\n if ($current === $new) {\n return $new;\n }\n\n if (!$current && $new) {\n if (isComponentElement($new)) {\n $new = initComponent($new, $parent, index, parentEl);\n }\n\n const node = createNode($new);\n setTarget($new, node);\n\n if (forceIndex && parentEl.childNodes[index]) {\n parentEl.insertBefore(node, parentEl.childNodes[index]);\n } else {\n (fragment || parentEl).appendChild(node);\n }\n } else if ($current && !$new) {\n parentEl.removeChild(getTarget($current)!);\n unmountTree($current);\n } else if ($current && $new) {\n if (hasElementChanged($current, $new)) {\n if (isComponentElement($new)) {\n $new = initComponent($new, $parent, index, parentEl);\n }\n\n const node = createNode($new);\n setTarget($new, node);\n parentEl.replaceChild(node, getTarget($current)!);\n unmountTree($current);\n } else {\n const areComponents = isComponentElement($current) && isComponentElement($new);\n\n if (!areComponents) {\n setTarget($new, getTarget($current)!);\n }\n\n if (isRealElement($current) && isRealElement($new)) {\n if (moveDirection) {\n const node = getTarget($current)!;\n const nextSibling = parentEl.childNodes[moveDirection === 'up' ? index : index + 1];\n\n if (nextSibling) {\n parentEl.insertBefore(node, nextSibling);\n } else {\n (fragment || parentEl).appendChild(node);\n }\n }\n\n if (!areComponents) {\n updateAttributes($current, $new, getTarget($current) as HTMLElement);\n }\n\n $new.children = renderChildren(\n $current,\n $new,\n areComponents ? parentEl : getTarget($current) as HTMLElement,\n );\n }\n }\n }\n\n return $new;\n}\n\nfunction initComponent(\n $element: VirtualElementComponent, $parent: VirtualRealElement | VirtualDomHead, index: number, parentEl: HTMLElement,\n) {\n if (!isComponentElement($element)) {\n return $element;\n }\n\n const { componentInstance } = $element;\n\n if (!componentInstance.isMounted) {\n $element = mountComponent(componentInstance);\n setupComponentUpdateListener($element, $parent, index, parentEl);\n\n const $firstChild = $element.children[0];\n if (isComponentElement($firstChild)) {\n $element.children = [initComponent($firstChild, $element, 0, parentEl)];\n }\n\n componentInstance.isMounted = true;\n }\n\n return $element;\n}\n\nfunction updateComponent($current: VirtualElementComponent, $new: VirtualElementComponent) {\n $current.componentInstance.props = $new.componentInstance.props;\n\n return renderComponent($current.componentInstance);\n}\n\nfunction setupComponentUpdateListener(\n $element: VirtualElementComponent, $parent: VirtualRealElement | VirtualDomHead, index: number, parentEl: HTMLElement,\n) {\n const { componentInstance } = $element;\n\n componentInstance.onUpdate = () => {\n $parent.children[index] = renderWithVirtual(\n parentEl,\n $parent.children[index],\n componentInstance.$element,\n $parent,\n index,\n { skipComponentUpdate: true },\n ) as VirtualElementComponent;\n };\n}\n\nfunction createNode($element: VirtualElement): Node {\n if (isEmptyElement($element)) {\n return document.createTextNode('');\n }\n\n if (isTextElement($element)) {\n return document.createTextNode($element.value);\n }\n\n if (isComponentElement($element)) {\n return createNode($element.children[0] as VirtualElement);\n }\n\n const { tag, props, children = [] } = $element;\n const element = document.createElement(tag);\n\n if (typeof props.ref === 'object') {\n props.ref.current = element;\n }\n\n Object.keys(props).forEach((key) => {\n addAttribute(element, key, props[key]);\n });\n\n $element.children = children.map(($child, i) => (\n renderWithVirtual(element, undefined, $child, $element, i) as VirtualElement\n ));\n\n return element;\n}\n\nfunction renderChildren(\n $current: VirtualRealElement, $new: VirtualRealElement, currentEl: HTMLElement,\n) {\n if ($new.props.teactFastList) {\n return renderFastListChildren($current, $new, currentEl);\n }\n\n const maxLength = Math.max($current.children.length, $new.children.length);\n const newChildren = [];\n const fragment = $new.children.length > $current.children.length + 1 ? document.createDocumentFragment() : undefined;\n\n for (let i = 0; i < maxLength; i++) {\n const $newChild = renderWithVirtual(\n currentEl,\n $current.children[i],\n $new.children[i],\n $new,\n i,\n i >= $current.children.length ? { fragment } : undefined,\n );\n\n if ($newChild) {\n newChildren.push($newChild);\n }\n }\n\n if (fragment) {\n currentEl.appendChild(fragment);\n }\n\n return newChildren;\n}\n\nfunction renderFastListChildren($current: VirtualRealElement, $new: VirtualRealElement, currentEl: HTMLElement) {\n const newKeys = new Set(\n $new.children.map(($newChild) => {\n const key = 'props' in $newChild && $newChild.props.key;\n\n if (DEBUG && isRealElement($newChild) && !key) {\n // eslint-disable-next-line no-console\n console.warn('Missing `key` in `teactFastList`');\n }\n\n return key;\n }),\n );\n\n let currentRemainingIndex = 0;\n const remainingByKey = $current.children\n .reduce((acc, $currentChild, i) => {\n let key = 'props' in $currentChild ? $currentChild.props.key : undefined;\n\n // First we handle removed children\n if (key && !newKeys.has(key)) {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n } else if (!key) {\n const $newChild = $new.children[i];\n const newChildKey = ($newChild && 'props' in $newChild) ? $newChild.props.key : undefined;\n // If a non-key element remains at the same index we preserve it with a virtual `key`\n if ($newChild && !newChildKey) {\n key = `${INDEX_KEY_PREFIX}${i}`;\n } else {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n }\n }\n\n // Then we build up info about remaining children\n acc[key] = {\n $element: $currentChild,\n index: currentRemainingIndex++,\n order: 'props' in $currentChild ? $currentChild.props.teactOrderKey : undefined,\n };\n return acc;\n }, {} as Record);\n\n let newChildren: VirtualElement[] = [];\n\n let fragmentQueue: VirtualElement[] | undefined;\n let fragmentIndex: number | undefined;\n\n let currentPreservedIndex = 0;\n\n $new.children.forEach(($newChild, i) => {\n const key = 'props' in $newChild ? $newChild.props.key : `${INDEX_KEY_PREFIX}${i}`;\n const currentChildInfo = remainingByKey[key];\n\n if (!currentChildInfo) {\n // All new nodes are queued to be inserted with fragments if possible.\n if (!fragmentQueue) {\n fragmentQueue = [];\n fragmentIndex = i;\n }\n\n fragmentQueue.push($newChild);\n return;\n }\n\n if (fragmentQueue) {\n newChildren = newChildren.concat(flushFragmentQueue(fragmentQueue, fragmentIndex!, currentEl, $new));\n fragmentIndex = undefined;\n fragmentQueue = undefined;\n }\n\n // This is a \"magic\" `teactOrderKey` property that tells us the element is updated\n const order = 'props' in $newChild ? $newChild.props.teactOrderKey : undefined;\n const shouldMoveNode = currentChildInfo.index !== currentPreservedIndex && currentChildInfo.order !== order;\n const isMovingDown = shouldMoveNode && currentPreservedIndex > currentChildInfo.index;\n\n // When the node goes down, preserved indexing actually breaks, so the \"magic\" should help.\n if (!shouldMoveNode || isMovingDown) {\n currentPreservedIndex++;\n }\n\n newChildren.push(\n renderWithVirtual(currentEl, currentChildInfo.$element, $newChild, $new, i, {\n forceIndex: true,\n ...(shouldMoveNode && {\n moveDirection: isMovingDown ? 'down' : 'up',\n }),\n })!,\n );\n });\n\n if (fragmentQueue) {\n newChildren = newChildren.concat(flushFragmentQueue(fragmentQueue, fragmentIndex!, currentEl, $new));\n }\n\n return newChildren;\n}\n\nfunction flushFragmentQueue(\n fragmentQueue: VirtualElement[], fragmentIndex: number, parentEl: HTMLElement, $parent: VirtualRealElement,\n) {\n if (fragmentQueue.length === 1) {\n return [renderWithVirtual(parentEl, undefined, fragmentQueue[0], $parent, fragmentIndex, { forceIndex: true })!];\n } else if (fragmentQueue.length > 1) {\n const fragment = document.createDocumentFragment();\n const newChildren = fragmentQueue.map(($fragmentChild) => (\n renderWithVirtual(parentEl, undefined, $fragmentChild, $parent, fragmentIndex!, { fragment })!\n ));\n\n if (parentEl.childNodes[fragmentIndex]) {\n parentEl.insertBefore(fragment, parentEl.childNodes[fragmentIndex]);\n } else {\n parentEl.appendChild(fragment);\n }\n\n return newChildren;\n }\n\n throw new Error('Unexpected input');\n}\n\nfunction updateAttributes($current: VirtualRealElement, $new: VirtualRealElement, element: HTMLElement) {\n const currentKeys = Object.keys($current.props);\n const newKeys = Object.keys($new.props);\n\n currentKeys.forEach((key) => {\n if ($current.props[key] !== undefined && $new.props[key] === undefined) {\n removeAttribute(element, key, $current.props[key]);\n }\n });\n\n newKeys.forEach((key) => {\n if ($new.props[key] === undefined) {\n return;\n }\n\n if ($current.props[key] !== $new.props[key]) {\n if ($current.props[key] === undefined) {\n addAttribute(element, key, $new.props[key]);\n } else {\n updateAttribute(element, key, $current.props[key], $new.props[key]);\n }\n }\n });\n}\n\nfunction addAttribute(element: HTMLElement, key: string, value: any) {\n if (value === undefined) {\n return;\n }\n\n // An optimization attempt\n if (key === 'className') {\n element.className = value;\n // An optimization attempt\n } else if (key === 'value') {\n (element as HTMLInputElement).value = value;\n } else if (key === 'style') {\n element.style.cssText = value;\n } else if (key.startsWith('on')) {\n addEventListener(element, key, value, key.endsWith('Capture'));\n } else if (key.startsWith('data-') || HTML_ATTRIBUTES.has(key)) {\n element.setAttribute(key, value);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n (element as any)[MAPPED_ATTRIBUTES[key] || key] = value;\n }\n}\n\nfunction removeAttribute(element: HTMLElement, key: string, value: any) {\n if (key === 'className') {\n element.className = '';\n } else if (key === 'value') {\n (element as HTMLInputElement).value = '';\n } else if (key === 'style') {\n element.style.cssText = '';\n } else if (key.startsWith('on')) {\n removeEventListener(element, key, value, key.endsWith('Capture'));\n } else if (key.startsWith('data-') || HTML_ATTRIBUTES.has(key)) {\n element.removeAttribute(key);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n delete (element as any)[MAPPED_ATTRIBUTES[key] || key];\n }\n}\n\nfunction updateAttribute(element: HTMLElement, key: string, oldValue: any, newValue: any) {\n if (key === 'value') {\n // Removing and adding value causes a cursor jump\n (element as HTMLInputElement).value = newValue !== undefined ? newValue : '';\n } else {\n removeAttribute(element, key, oldValue);\n addAttribute(element, key, newValue);\n }\n}\n\nfunction DEBUG_addToVirtualTreeSize($current: VirtualRealElement | VirtualDomHead) {\n DEBUG_virtualTreeSize += $current.children.length;\n\n $current.children.forEach(($child) => {\n if (isRealElement($child)) {\n DEBUG_addToVirtualTreeSize($child);\n }\n });\n}\n\nexport default { render };\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n sender?: ApiUser | ApiChat;\n children: any;\n};\n\ntype DispatchProps = Pick;\n\nconst UserLink: FC = ({\n className, sender, openUserInfo, children,\n}) => {\n const handleClick = useCallback(() => {\n if (sender) {\n openUserInfo({ id: sender.id });\n }\n }, [sender, openUserInfo]);\n\n if (!sender) {\n return children;\n }\n\n return (\n {children}\n );\n};\n\nexport default withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['openUserInfo']),\n)(UserLink);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n message?: ApiMessage;\n children: any;\n};\n\ntype DispatchProps = Pick;\n\nconst MessageLink: FC = ({\n className, message, children, focusMessage,\n}) => {\n const handleMessageClick = useCallback((): void => {\n if (message) {\n focusMessage({ chatId: message.chatId, messageId: message.id });\n }\n }, [focusMessage, message]);\n\n if (!message) {\n return children;\n }\n\n return (\n {children}\n );\n};\n\nexport default withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['focusMessage']),\n)(MessageLink);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n chatId?: number;\n children: any;\n};\n\ntype DispatchProps = Pick;\n\nconst ChatLink: FC = ({\n className, chatId, openChat, children,\n}) => {\n const handleClick = useCallback(() => {\n if (chatId) {\n openChat({ id: chatId });\n }\n }, [chatId, openChat]);\n\n if (!chatId) {\n return children;\n }\n\n return (\n {children}\n );\n};\n\nexport default withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['openChat']),\n)(ChatLink);\n","import React from '../../../lib/teact/teact';\n\nimport { ApiChat, ApiMessage, ApiUser } from '../../../api/types';\nimport { LangFn } from '../../../hooks/useLang';\nimport {\n getChatTitle,\n getMessageContent,\n getMessageSummaryText,\n getUserFullName,\n isChat,\n} from '../../../modules/helpers';\nimport trimText from '../../../util/trimText';\nimport { TextPart } from './renderMessageText';\nimport renderText from './renderText';\n\nimport UserLink from '../UserLink';\nimport MessageLink from '../MessageLink';\nimport ChatLink from '../ChatLink';\n\ninterface ActionMessageTextOptions {\n maxTextLength?: number;\n asPlain?: boolean;\n isEmbedded?: boolean;\n}\n\nconst NBSP = '\\u00A0';\n\nexport function renderActionMessageText(\n lang: LangFn,\n message: ApiMessage,\n actionOrigin?: ApiUser | ApiChat,\n targetUsers?: ApiUser[],\n targetMessage?: ApiMessage,\n targetChatId?: number,\n options: ActionMessageTextOptions = {},\n) {\n if (!message.content.action) {\n return [];\n }\n const { text, translationValues } = message.content.action;\n const content: TextPart[] = [];\n const textOptions: ActionMessageTextOptions = { ...options, maxTextLength: 32 };\n const translationKey = text === 'Chat.Service.Group.UpdatedPinnedMessage1' && !targetMessage\n ? 'Message.PinnedGenericMessage'\n : text;\n\n let unprocessed: string;\n let processed = processPlaceholder(\n lang(translationKey, translationValues && translationValues.length ? translationValues : undefined),\n '%action_origin%',\n actionOrigin\n ? (!options.isEmbedded && renderOriginContent(lang, actionOrigin, options.asPlain)) || NBSP\n : 'User',\n );\n\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%target_user%',\n targetUsers\n ? targetUsers.map((user) => renderUserContent(user, options.asPlain)).filter(Boolean as any)\n : 'User',\n );\n\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%message%',\n targetMessage\n ? renderMessageContent(lang, targetMessage, textOptions)\n : 'a message',\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%product%',\n targetMessage\n ? renderProductContent(targetMessage)\n : 'a product',\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%target_chat%',\n targetChatId\n ? renderMigratedContent(targetChatId, options.asPlain)\n : 'another chat',\n );\n content.push(...processed);\n\n if (options.asPlain) {\n return content.join('').trim();\n }\n\n return content;\n}\n\nfunction renderProductContent(message: ApiMessage) {\n return message.content && message.content.invoice\n ? message.content.invoice.title\n : 'a product';\n}\n\nfunction renderMessageContent(lang: LangFn, message: ApiMessage, options: ActionMessageTextOptions = {}) {\n const text = getMessageSummaryText(lang, message);\n const {\n photo, video, document, sticker,\n } = getMessageContent(message);\n\n const { maxTextLength, isEmbedded, asPlain } = options;\n\n const showQuotes = isEmbedded && text && !photo && !video && !document && !sticker;\n let messageText = trimText(text as string, maxTextLength)!;\n\n if (isEmbedded) {\n if (photo) {\n messageText = 'a photo';\n } else if (video) {\n messageText = video.isGif ? 'a GIF' : 'a video';\n } else if (document) {\n messageText = 'a document';\n } else if (sticker) {\n messageText = text;\n }\n }\n\n if (asPlain) {\n return showQuotes ? `«${messageText}»` : messageText;\n }\n\n if (showQuotes) {\n return (\n \n «\n {renderText(messageText)}\n »\n \n );\n }\n\n return (\n {renderText(messageText)}\n );\n}\n\nfunction renderOriginContent(lang: LangFn, origin: ApiUser | ApiChat, asPlain?: boolean) {\n return isChat(origin)\n ? renderChatContent(lang, origin, asPlain)\n : renderUserContent(origin, asPlain);\n}\n\nfunction renderUserContent(sender: ApiUser, asPlain?: boolean): string | TextPart | undefined {\n const text = trimText(getUserFullName(sender));\n\n if (asPlain) {\n return text;\n }\n\n return {sender && renderText(text!)};\n}\n\nfunction renderChatContent(lang: LangFn, chat: ApiChat, asPlain?: boolean): string | TextPart | undefined {\n const text = trimText(getChatTitle(lang, chat));\n\n if (asPlain) {\n return text;\n }\n\n return {chat && renderText(text!)};\n}\n\nfunction renderMigratedContent(chatId: number, asPlain?: boolean): string | TextPart | undefined {\n const text = 'another chat';\n\n if (asPlain) {\n return text;\n }\n\n return {text};\n}\n\nfunction processPlaceholder(text: string, placeholder: string, replaceValue?: TextPart | TextPart[]): TextPart[] {\n const placeholderPosition = text.indexOf(placeholder);\n if (placeholderPosition < 0 || !replaceValue) {\n return [text];\n }\n\n const content: TextPart[] = [];\n content.push(text.substring(0, placeholderPosition));\n if (Array.isArray(replaceValue)) {\n replaceValue.forEach((value, index) => {\n content.push(value);\n if (index + 1 < replaceValue.length) {\n content.push(', ');\n }\n });\n } else {\n content.push(replaceValue);\n }\n content.push(text.substring(placeholderPosition + placeholder.length));\n\n return content;\n}\n","export interface ApiDimensions {\n width: number;\n height: number;\n}\n\nexport interface ApiPhotoSize extends ApiDimensions {\n type: 's' | 'm' | 'x' | 'y' | 'z';\n}\n\nexport interface ApiThumbnail extends ApiDimensions {\n dataUri: string;\n}\n\nexport interface ApiPhoto {\n id: string;\n thumbnail?: ApiThumbnail;\n sizes: ApiPhotoSize[];\n blobUrl?: string;\n}\n\nexport interface ApiSticker {\n id: string;\n stickerSetId: string;\n stickerSetAccessHash?: string;\n emoji?: string;\n isAnimated: boolean;\n width?: number;\n height?: number;\n thumbnail?: ApiThumbnail;\n isPreloadedGlobally?: boolean;\n}\n\nexport interface ApiStickerSet {\n archived?: true;\n isAnimated?: true;\n installedDate?: number;\n id: string;\n accessHash: string;\n title: string;\n hasThumbnail?: boolean;\n count: number;\n hash: number;\n stickers?: ApiSticker[];\n packs?: Record;\n covers?: ApiSticker[];\n}\n\nexport interface ApiVideo {\n id: string;\n mimeType: string;\n duration: number;\n fileName: string;\n width?: number;\n height?: number;\n supportsStreaming?: boolean;\n isRound?: boolean;\n isGif?: boolean;\n thumbnail?: ApiThumbnail;\n blobUrl?: string;\n size: number;\n}\n\nexport interface ApiAudio {\n size: number;\n mimeType: string;\n fileName: string;\n duration: number;\n performer?: string;\n title?: string;\n}\n\nexport interface ApiVoice {\n duration: number;\n waveform?: number[];\n}\n\nexport interface ApiDocument {\n id?: string;\n fileName: string;\n size: number;\n timestamp?: number;\n mimeType: string;\n thumbnail?: ApiThumbnail;\n previewBlobUrl?: string;\n mediaType?: 'photo' | 'video';\n mediaSize?: ApiDimensions;\n}\n\nexport interface ApiContact {\n firstName: string;\n lastName: string;\n phoneNumber: string;\n userId: number;\n}\n\nexport interface ApiPollAnswer {\n text: string;\n option: string;\n}\n\nexport interface ApiPollResult {\n isChosen?: true;\n isCorrect?: true;\n option: string;\n votersCount: number;\n}\n\nexport interface ApiPoll {\n id: string;\n summary: {\n closed?: true;\n isPublic?: true;\n multipleChoice?: true;\n quiz?: true;\n question: string;\n answers: ApiPollAnswer[];\n closePeriod?: number;\n closeDate?: number;\n };\n results: {\n results?: ApiPollResult[];\n totalVoters?: number;\n recentVoterIds?: number[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n}\n\nexport interface ApiInvoice {\n text: string;\n title: string;\n photoUrl?: string;\n description?: string;\n receiptMsgId?: number;\n}\n\nexport type ApiNewPoll = {\n summary: ApiPoll['summary'];\n quiz?: {\n correctAnswers: string[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n};\n\nexport interface ApiAction {\n text: string;\n targetUserIds?: number[];\n targetChatId?: number;\n type: 'historyClear' | 'other';\n photo?: ApiPhoto;\n translationValues: string[];\n}\n\nexport interface ApiWebPage {\n id: number;\n url: string;\n displayUrl: string;\n type?: string;\n siteName?: string;\n title?: string;\n description?: string;\n photo?: ApiPhoto;\n duration?: number;\n document?: ApiDocument;\n video?: ApiVideo;\n}\n\nexport interface ApiMessageForwardInfo {\n isChannelPost: boolean;\n isLinkedChannelPost?: boolean;\n fromChatId?: number;\n senderUserId?: number;\n fromMessageId?: number;\n hiddenUserName?: string;\n adminTitle?: string;\n}\n\nexport interface ApiMessageEntity {\n type: string;\n offset: number;\n length: number;\n userId?: number;\n url?: string;\n}\n\nexport enum ApiMessageEntityTypes {\n Bold = 'MessageEntityBold',\n Blockquote = 'MessageEntityBlockquote',\n BotCommand = 'MessageEntityBotCommand',\n Cashtag = 'MessageEntityCashtag',\n Code = 'MessageEntityCode',\n Email = 'MessageEntityEmail',\n Hashtag = 'MessageEntityHashtag',\n Italic = 'MessageEntityItalic',\n MentionName = 'MessageEntityMentionName',\n Mention = 'MessageEntityMention',\n Phone = 'MessageEntityPhone',\n Pre = 'MessageEntityPre',\n Strike = 'MessageEntityStrike',\n TextUrl = 'MessageEntityTextUrl',\n Url = 'MessageEntityUrl',\n Underline = 'MessageEntityUnderline',\n Unknown = 'MessageEntityUnknown',\n}\n\nexport interface ApiFormattedText {\n text: string;\n entities?: ApiMessageEntity[];\n}\n\nexport interface ApiMessage {\n id: number;\n chatId: number;\n content: {\n text?: ApiFormattedText;\n photo?: ApiPhoto;\n video?: ApiVideo;\n document?: ApiDocument;\n sticker?: ApiSticker;\n contact?: ApiContact;\n poll?: ApiPoll;\n action?: ApiAction;\n webPage?: ApiWebPage;\n audio?: ApiAudio;\n voice?: ApiVoice;\n invoice?: ApiInvoice;\n };\n date: number;\n isOutgoing: boolean;\n senderId?: number;\n replyToMessageId?: number;\n replyToTopMessageId?: number;\n sendingState?: 'messageSendingStatePending' | 'messageSendingStateFailed';\n forwardInfo?: ApiMessageForwardInfo;\n isDeleting?: boolean;\n previousLocalId?: number;\n views?: number;\n isEdited?: boolean;\n isMediaUnread?: boolean;\n groupedId?: string;\n isInAlbum?: boolean;\n hasUnreadMention?: boolean;\n inlineButtons?: ApiKeyboardButtons;\n keyboardButtons?: ApiKeyboardButtons;\n viaBotId?: number;\n threadInfo?: ApiThreadInfo;\n adminTitle?: string;\n isScheduled?: boolean;\n shouldHideKeyboardButtons?: boolean;\n isFromScheduled?: boolean;\n}\n\nexport interface ApiThreadInfo {\n threadId: number;\n chatId: number;\n topMessageId?: number;\n originChannelId?: number;\n messagesCount: number;\n lastMessageId?: number;\n lastReadInboxMessageId?: number;\n recentReplierIds?: number[];\n}\n\nexport type ApiMessageOutgoingStatus = 'read' | 'succeeded' | 'pending' | 'failed';\n\nexport interface ApiKeyboardButton {\n type: 'command' | 'url' | 'callback' | 'requestPoll' | 'buy' | 'NOT_SUPPORTED';\n text: string;\n messageId: number;\n value?: string;\n}\n\nexport type ApiKeyboardButtons = ApiKeyboardButton[][];\n\nexport type ApiMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'profilePhoto';\nexport type ApiGlobalMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\n\nexport type ApiReportReason = 'spam' | 'violence' | 'pornography' | 'childAbuse'\n| 'copyright' | 'geoIrrelevant' | 'fake' | 'other';\n\nexport const MAIN_THREAD_ID = -1;\n\n// `Symbol` can not be transferred from worker\nexport const MESSAGE_DELETED = 'MESSAGE_DELETED';\n","// We cache avatars as Data URI for faster initial load\n// and messages media as Blob for smaller size.\n\nexport enum ApiMediaFormat {\n DataUri,\n BlobUrl,\n Lottie,\n Progressive,\n Stream,\n}\n\nexport type ApiParsedMedia = string | Blob | AnyLiteral | ArrayBuffer;\nexport type ApiPreparedMedia = string | AnyLiteral;\nexport type ApiMediaFormatToPrepared = T extends ApiMediaFormat.Lottie ? AnyLiteral : string;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectUser } from '../../../modules/selectors';\n\ntype OwnProps = {\n userId?: number;\n username?: string;\n children: any;\n};\n\ntype StateProps = {\n userOrChat?: ApiUser | ApiChat;\n};\n\ntype DispatchProps = Pick;\n\nconst MentionLink: FC = ({\n username,\n userOrChat,\n children,\n openChat,\n openChatByUsername,\n}) => {\n const handleClick = () => {\n if (userOrChat) {\n openChat({ id: userOrChat.id });\n } else if (username) {\n openChatByUsername({ username: username.substring(1) });\n }\n };\n\n return (\n \n {children}\n \n );\n};\n\nexport default withGlobal(\n (global, { userId }): StateProps => {\n return {\n userOrChat: userId ? selectUser(global, userId) : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['openChat', 'openChatByUsername']),\n)(MentionLink);\n","import { DEBUG } from '../config';\n\nexport function updateAppBadge(unreadCount: number) {\n if (typeof window.navigator.setAppBadge !== 'function') {\n return;\n }\n\n window.navigator.setAppBadge(unreadCount).catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n });\n}\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\n\nconst BACKDROP_CLASSNAME = 'backdrop';\n\n// This effect implements closing menus by clicking outside of them\n// without adding extra elements to the DOM\nexport default function useVirtualBackdrop(\n isOpen: boolean,\n menuRef: RefObject,\n onClose?: () => void | undefined,\n) {\n useEffect(() => {\n const handleEvent = (e: Event) => {\n const menu = menuRef.current;\n const target = e.target as HTMLElement | null;\n if (!menu || !target) {\n return;\n }\n\n if (\n !menu.contains(e.target as Node | null)\n || target.classList.contains(BACKDROP_CLASSNAME)\n ) {\n e.preventDefault();\n e.stopPropagation();\n if (onClose) {\n onClose();\n }\n }\n };\n\n if (isOpen && onClose) {\n document.addEventListener('mousedown', handleEvent);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleEvent);\n };\n }, [isOpen, menuRef, onClose]);\n}\n","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"5aa1e598c74b078112d5.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"5054ce745024de60a724.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"695e66b225ec96107343.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"4c9029ba18603b924ede.worker.js\");\n};","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ANIMATION_LEVEL_MAX } from '../../../config';\nimport {\n IS_ANDROID, IS_IOS, IS_MAC_OS, IS_SAFARI, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport { setLanguage } from '../../../util/langProvider';\nimport switchTheme from '../../../util/switchTheme';\nimport { selectTheme } from '../../selectors';\n\nconst HISTORY_ANIMATION_DURATION = 450;\n\nsubscribeToSystemThemeChange();\n\naddReducer('init', (global) => {\n const { animationLevel, messageTextSize, language } = global.settings.byKey;\n const theme = selectTheme(global);\n\n setLanguage(language, undefined, true);\n\n document.documentElement.style.setProperty(\n '--composer-text-size', `${Math.max(messageTextSize, IS_IOS ? 16 : 15)}px`,\n );\n document.documentElement.style.setProperty('--message-text-size', `${messageTextSize}px`);\n document.body.classList.add('initial');\n document.body.classList.add(`animation-level-${animationLevel}`);\n document.body.classList.add(IS_TOUCH_ENV ? 'is-touch-env' : 'is-pointer-env');\n switchTheme(theme, animationLevel === ANIMATION_LEVEL_MAX);\n\n if (IS_SAFARI) {\n document.body.classList.add('is-safari');\n }\n if (IS_IOS) {\n document.body.classList.add('is-ios');\n } else if (IS_ANDROID) {\n document.body.classList.add('is-android');\n } else if (IS_MAC_OS) {\n document.body.classList.add('is-macos');\n }\n});\n\naddReducer('setIsUiReady', (global, actions, payload) => {\n const { uiReadyState } = payload!;\n\n if (uiReadyState === 2) {\n document.body.classList.remove('initial');\n }\n\n return {\n ...global,\n uiReadyState,\n };\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n return {\n ...global,\n authPhoneNumber: phoneNumber,\n };\n});\n\naddReducer('setAuthRememberMe', (global, actions, payload) => {\n return {\n ...global,\n authRememberMe: Boolean(payload),\n };\n});\n\naddReducer('clearAuthError', (global) => {\n return {\n ...global,\n authError: undefined,\n };\n});\n\naddReducer('disableHistoryAnimations', () => {\n setTimeout(() => {\n setGlobal({\n ...getGlobal(),\n shouldSkipHistoryAnimations: false,\n });\n document.body.classList.remove('no-animate');\n }, HISTORY_ANIMATION_DURATION);\n\n setGlobal({\n ...getGlobal(),\n shouldSkipHistoryAnimations: true,\n }, true);\n});\n\nfunction subscribeToSystemThemeChange() {\n function handleSystemThemeChange() {\n const currentThemeMatch = document.documentElement.className.match(/theme-(\\w+)/);\n const currentTheme = currentThemeMatch ? currentThemeMatch[1] : 'light';\n const global = getGlobal();\n const nextTheme = selectTheme(global);\n const { animationLevel } = global.settings.byKey;\n\n if (nextTheme !== currentTheme) {\n switchTheme(nextTheme, animationLevel === ANIMATION_LEVEL_MAX);\n // Force-update component containers\n setGlobal({ ...global });\n }\n }\n\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handleSystemThemeChange);\n } else if (typeof mql.addListener === 'function') {\n mql.addListener(handleSystemThemeChange);\n }\n}\n","import { addReducer } from '../../../lib/teact/teactn';\nimport { ISettings, IThemeSettings, ThemeKey } from '../../../types';\nimport { replaceSettings, replaceThemeSettings } from '../../reducers';\n\naddReducer('setSettingOption', (global, actions, payload?: Partial) => {\n return replaceSettings(global, payload);\n});\n\naddReducer('setThemeSettings', (global, actions, payload: { theme: ThemeKey } & Partial) => {\n const { theme, ...settings } = payload;\n\n return replaceThemeSettings(global, theme, settings);\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { initApi, callApi } from '../../../api/gramjs';\nimport { GlobalState } from '../../../global/types';\n\nimport {\n LANG_CACHE_NAME,\n CUSTOM_BG_CACHE_NAME,\n MEDIA_CACHE_NAME,\n MEDIA_CACHE_NAME_AVATARS,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n IS_TEST,\n} from '../../../config';\nimport { PLATFORM_ENV } from '../../../util/environment';\nimport { unsubscribe } from '../../../util/notifications';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { updateAppBadge } from '../../../util/appBadge';\nimport {\n storeSession,\n loadStoredSession,\n clearStoredSession,\n importLegacySession,\n clearLegacySessions,\n} from '../../../util/sessions';\n\naddReducer('initApi', (global: GlobalState, actions) => {\n (async () => {\n if (!IS_TEST) {\n await importLegacySession();\n void clearLegacySessions();\n }\n\n void initApi(actions.apiUpdate, {\n userAgent: navigator.userAgent,\n platform: PLATFORM_ENV,\n sessionData: loadStoredSession(),\n });\n })();\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n void callApi('provideAuthPhoneNumber', phoneNumber.replace(/[^\\d]/g, ''));\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('setAuthCode', (global, actions, payload) => {\n const { code } = payload!;\n\n void callApi('provideAuthCode', code);\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('setAuthPassword', (global, actions, payload) => {\n const { password } = payload!;\n\n void callApi('provideAuthPassword', password);\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('uploadProfilePhoto', (global, actions, payload) => {\n const { file } = payload!;\n\n void callApi('uploadProfilePhoto', file);\n});\n\naddReducer('signUp', (global, actions, payload) => {\n const { firstName, lastName } = payload!;\n\n void callApi('provideAuthRegistration', { firstName, lastName });\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('returnToAuthPhoneNumber', (global) => {\n void callApi('restartAuth');\n\n return {\n ...global,\n authError: undefined,\n };\n});\n\naddReducer('goToAuthQrCode', (global) => {\n void callApi('restartAuthWithQr');\n\n return {\n ...global,\n authIsLoadingQrCode: true,\n authError: undefined,\n };\n});\n\naddReducer('saveSession', (global, actions, payload) => {\n const { sessionData } = payload;\n\n if (sessionData) {\n storeSession(payload.sessionData, global.currentUserId);\n } else {\n clearStoredSession();\n }\n});\n\naddReducer('signOut', () => {\n (async () => {\n try {\n await unsubscribe();\n await callApi('destroy');\n } catch (err) {\n // Do nothing\n }\n\n getDispatch().reset();\n })();\n});\n\naddReducer('reset', () => {\n clearStoredSession();\n\n void cacheApi.clear(MEDIA_CACHE_NAME);\n void cacheApi.clear(MEDIA_CACHE_NAME_AVATARS);\n void cacheApi.clear(MEDIA_PROGRESSIVE_CACHE_NAME);\n void cacheApi.clear(CUSTOM_BG_CACHE_NAME);\n\n const langCachePrefix = LANG_CACHE_NAME.replace(/\\d+$/, '');\n const langCacheVersion = (LANG_CACHE_NAME.match(/\\d+$/) || [0])[0];\n for (let i = 0; i < langCacheVersion; i++) {\n void cacheApi.clear(`${langCachePrefix}${i === 0 ? '' : i}`);\n }\n\n void clearLegacySessions();\n\n updateAppBadge(0);\n\n getDispatch().init();\n});\n\naddReducer('disconnect', () => {\n (async () => {\n await callApi('disconnect');\n })();\n});\n\naddReducer('loadNearestCountry', (global) => {\n if (global.connectionState !== 'connectionStateReady') {\n return;\n }\n\n (async () => {\n const authNearestCountry = await callApi('fetchNearestCountry');\n\n setGlobal({\n ...getGlobal(),\n authNearestCountry,\n });\n })();\n});\n\naddReducer('setDeviceToken', (global, actions, deviceToken) => {\n setGlobal({\n ...global,\n push: {\n deviceToken,\n subscribedAt: Date.now(),\n },\n });\n});\n\naddReducer('deleteDeviceToken', (global) => {\n const newGlobal = { ...global };\n delete newGlobal.push;\n setGlobal(newGlobal);\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport {\n ApiPrivacyKey, PrivacyVisibility, ProfileEditProgress, IInputPrivacyRules, IInputPrivacyContact,\n UPLOADING_WALLPAPER_SLUG, LangCode,\n} from '../../../types';\n\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { selectUser } from '../../selectors';\nimport {\n addUsers, addBlockedContact, updateChats, updateUser, removeBlockedContact, replaceSettings, updateNotifySettings,\n addNotifyExceptions,\n} from '../../reducers';\nimport { isChatPrivate } from '../../helpers';\n\naddReducer('updateProfile', (global, actions, payload) => {\n const {\n photo, firstName, lastName, bio: about, username,\n } = payload!;\n\n (async () => {\n const { currentUserId } = global;\n if (!currentUserId) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.InProgress,\n },\n });\n\n if (photo) {\n await callApi('updateProfilePhoto', photo);\n }\n\n if (firstName || lastName || about) {\n const result = await callApi('updateProfile', { firstName, lastName, about });\n if (result) {\n global = getGlobal();\n const currentUser = currentUserId && selectUser(global, currentUserId);\n\n if (currentUser) {\n setGlobal(updateUser(\n global,\n currentUser.id,\n {\n firstName,\n lastName,\n fullInfo: {\n ...currentUser.fullInfo,\n bio: about,\n },\n },\n ));\n }\n }\n }\n\n if (username) {\n const result = await callApi('updateUsername', username);\n if (result && currentUserId) {\n setGlobal(updateUser(getGlobal(), currentUserId, { username }));\n }\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.Complete,\n },\n });\n })();\n});\n\naddReducer('checkUsername', (global, actions, payload) => {\n const { username } = payload!;\n\n (async () => {\n // No need to check the username if profile update is already in progress\n if (global.profileEdit && global.profileEdit.progress === ProfileEditProgress.InProgress) {\n return;\n }\n\n setGlobal({\n ...global,\n profileEdit: {\n progress: global.profileEdit ? global.profileEdit.progress : ProfileEditProgress.Idle,\n isUsernameAvailable: undefined,\n },\n });\n\n const isUsernameAvailable = await callApi('checkUsername', username);\n\n global = getGlobal();\n setGlobal({\n ...global,\n profileEdit: {\n ...global.profileEdit!,\n isUsernameAvailable,\n },\n });\n })();\n});\n\naddReducer('loadWallpapers', () => {\n (async () => {\n const result = await callApi('fetchWallpapers', 0);\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: result.wallpapers,\n },\n });\n })();\n});\n\naddReducer('uploadWallpaper', (global, actions, payload) => {\n const file = payload;\n const previewBlobUrl = URL.createObjectURL(file);\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n {\n slug: UPLOADING_WALLPAPER_SLUG,\n document: {\n fileName: '',\n size: file.size,\n mimeType: file.type,\n previewBlobUrl,\n },\n },\n ...(global.settings.loadedWallpapers || []),\n ],\n },\n });\n\n (async () => {\n const result = await callApi('uploadWallpaper', file);\n if (!result) {\n return;\n }\n\n const { wallpaper } = result;\n\n global = getGlobal();\n if (!global.settings.loadedWallpapers) {\n return;\n }\n\n const firstWallpaper = global.settings.loadedWallpapers[0];\n if (!firstWallpaper || firstWallpaper.slug !== UPLOADING_WALLPAPER_SLUG) {\n return;\n }\n\n const withLocalMedia = {\n ...wallpaper,\n document: {\n ...wallpaper.document,\n previewBlobUrl,\n },\n };\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n withLocalMedia,\n ...global.settings.loadedWallpapers.slice(1),\n ],\n },\n });\n })();\n});\n\naddReducer('loadBlockedContacts', () => {\n (async () => {\n const result = await callApi('fetchBlockedContacts');\n\n if (!result) {\n return;\n }\n\n let newGlobal = getGlobal();\n\n if (result.users && result.users.length) {\n newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users, 'id'));\n }\n if (result.chats && result.chats.length) {\n newGlobal = updateChats(newGlobal, buildCollectionByKey(result.chats, 'id'));\n }\n\n newGlobal = {\n ...newGlobal,\n blocked: {\n ...newGlobal.blocked,\n ids: [...(newGlobal.blocked.ids || []), ...result.blockedIds],\n totalCount: result.totalCount,\n },\n };\n\n setGlobal(newGlobal);\n })();\n});\n\naddReducer('blockContact', (global, actions, payload) => {\n const { contactId, accessHash } = payload!;\n\n (async () => {\n const result = await callApi('blockContact', contactId, accessHash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal(addBlockedContact(newGlobal, contactId));\n })();\n});\n\naddReducer('unblockContact', (global, actions, payload) => {\n const { contactId } = payload!;\n let accessHash: string | undefined;\n const isPrivate = isChatPrivate(contactId);\n\n if (isPrivate) {\n const user = selectUser(global, contactId);\n if (!user) {\n return;\n }\n\n accessHash = user.accessHash;\n }\n\n (async () => {\n const result = await callApi('unblockContact', contactId, accessHash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal(removeBlockedContact(newGlobal, contactId));\n })();\n});\n\naddReducer('loadAuthorizations', () => {\n (async () => {\n const result = await callApi('fetchAuthorizations');\n if (!result) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n activeSessions: result,\n });\n })();\n});\n\naddReducer('terminateAuthorization', (global, actions, payload) => {\n const { hash } = payload!;\n\n (async () => {\n const result = await callApi('terminateAuthorization', hash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n activeSessions: newGlobal.activeSessions.filter((session) => session.hash !== hash),\n });\n })();\n});\n\naddReducer('terminateAllAuthorizations', () => {\n (async () => {\n const result = await callApi('terminateAllAuthorizations');\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n activeSessions: global.activeSessions.filter((session) => session.isCurrent),\n });\n })();\n});\n\naddReducer('loadNotificationExceptions', (global) => {\n const { serverTimeOffset } = global;\n\n (async () => {\n const result = await callApi('fetchNotificationExceptions', { serverTimeOffset });\n if (!result) {\n return;\n }\n\n setGlobal(addNotifyExceptions(getGlobal(), result));\n })();\n});\n\naddReducer('loadNotificationSettings', (global) => {\n const { serverTimeOffset } = global;\n (async () => {\n const result = await callApi('fetchNotificationSettings', {\n serverTimeOffset,\n });\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), result));\n })();\n});\n\naddReducer('updateNotificationSettings', (global, actions, payload) => {\n const { peerType, isSilent, shouldShowPreviews } = payload!;\n\n (async () => {\n const result = await callApi('updateNotificationSettings', peerType, { isSilent, shouldShowPreviews });\n\n if (!result) {\n return;\n }\n\n setGlobal(updateNotifySettings(getGlobal(), peerType, isSilent, shouldShowPreviews));\n })();\n});\n\naddReducer('updateContactSignUpNotification', (global, actions, payload) => {\n const { isSilent } = payload!;\n\n (async () => {\n const result = await callApi('updateContactSignUpNotification', isSilent);\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { hasContactJoinedNotifications: !isSilent }));\n })();\n});\n\naddReducer('loadLanguages', () => {\n (async () => {\n const result = await callApi('fetchLanguages');\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { languages: result }));\n })();\n});\n\naddReducer('loadPrivacySettings', () => {\n (async () => {\n const [\n phoneNumberSettings, lastSeenSettings, profilePhotoSettings, forwardsSettings, chatInviteSettings,\n ] = await Promise.all([\n callApi('fetchPrivacySettings', 'phoneNumber'),\n callApi('fetchPrivacySettings', 'lastSeen'),\n callApi('fetchPrivacySettings', 'profilePhoto'),\n callApi('fetchPrivacySettings', 'forwards'),\n callApi('fetchPrivacySettings', 'chatInvite'),\n ]);\n\n if (\n !phoneNumberSettings || !lastSeenSettings || !profilePhotoSettings || !forwardsSettings || !chatInviteSettings\n ) {\n return;\n }\n\n const global = getGlobal();\n\n global.settings.privacy.phoneNumber = phoneNumberSettings;\n global.settings.privacy.lastSeen = lastSeenSettings;\n global.settings.privacy.profilePhoto = profilePhotoSettings;\n global.settings.privacy.forwards = forwardsSettings;\n global.settings.privacy.chatInvite = chatInviteSettings;\n\n setGlobal(global);\n })();\n});\n\naddReducer('setPrivacyVisibility', (global, actions, payload) => {\n const { privacyKey, visibility } = payload!;\n\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility,\n allowedIds: [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n (async () => {\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n\n if (result) {\n const newGlobal = getGlobal();\n\n newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result;\n\n setGlobal(newGlobal);\n }\n })();\n});\n\naddReducer('setPrivacySettings', (global, actions, payload) => {\n const { privacyKey, isAllowList, contactsIds } = payload!;\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility: settings.visibility,\n allowedIds: isAllowList ? contactsIds : [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: !isAllowList ? contactsIds : [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n (async () => {\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n\n if (result) {\n const newGlobal = getGlobal();\n\n newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result;\n\n setGlobal(newGlobal);\n }\n })();\n});\n\nfunction buildInputPrivacyRules(global: GlobalState, {\n visibility,\n allowedIds,\n deniedIds,\n}: {\n visibility: PrivacyVisibility;\n allowedIds: number[];\n deniedIds: number[];\n}): IInputPrivacyRules {\n const {\n users: { byId: usersById },\n chats: { byId: chatsById },\n } = global;\n\n const rules: IInputPrivacyRules = {\n visibility,\n };\n let users: IInputPrivacyContact[];\n let chats: IInputPrivacyContact[];\n\n const collectUsers = (userId: number) => {\n if (!isChatPrivate(userId)) {\n return undefined;\n }\n const { id, accessHash } = usersById[userId] || {};\n if (!id) {\n return undefined;\n }\n\n return { id, accessHash };\n };\n\n const collectChats = (userId: number) => {\n if (isChatPrivate(userId)) {\n return undefined;\n }\n const chat = chatsById[userId];\n\n return chat ? { id: chat.id } : undefined;\n };\n\n if (visibility === 'contacts' || visibility === 'nobody') {\n users = allowedIds.map(collectUsers).filter(Boolean) as IInputPrivacyContact[];\n chats = allowedIds.map(collectChats).filter(Boolean) as IInputPrivacyContact[];\n\n if (users.length > 0) {\n rules.allowedUsers = users;\n }\n if (chats.length > 0) {\n rules.allowedChats = chats;\n }\n }\n\n if (visibility === 'everybody' || visibility === 'contacts') {\n users = deniedIds.map(collectUsers).filter(Boolean) as IInputPrivacyContact[];\n chats = deniedIds.map(collectChats).filter(Boolean) as IInputPrivacyContact[];\n\n if (users.length > 0) {\n rules.blockedUsers = users;\n }\n if (chats.length > 0) {\n rules.blockedChats = chats;\n }\n }\n\n return rules;\n}\n\naddReducer('updateIsOnline', (global, actions, payload) => {\n callApi('updateIsOnline', payload);\n});\n\naddReducer('loadContentSettings', () => {\n (async () => {\n const result = await callApi('fetchContentSettings');\n if (!result) return;\n\n setGlobal(replaceSettings(getGlobal(), result));\n })();\n});\n\naddReducer('updateContentSettings', (global, actions, payload) => {\n (async () => {\n setGlobal(replaceSettings(getGlobal(), { isSensitiveEnabled: payload }));\n\n const result = await callApi('updateContentSettings', payload);\n if (!result) {\n setGlobal(replaceSettings(getGlobal(), { isSensitiveEnabled: !payload }));\n }\n })();\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport {\n ApiUpdate,\n ApiUpdateAuthorizationState,\n ApiUpdateAuthorizationError,\n ApiUpdateConnectionState,\n ApiUpdateSession,\n ApiUpdateCurrentUser, ApiUpdateServerTimeOffset,\n} from '../../../api/types';\nimport { DEBUG, SESSION_USER_KEY } from '../../../config';\nimport { subscribe } from '../../../util/notifications';\nimport { updateUser } from '../../reducers';\nimport { setLanguage } from '../../../util/langProvider';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n if (DEBUG) {\n if (update['@type'] !== 'updateUserStatus' && update['@type'] !== 'updateServerTimeOffset') {\n // eslint-disable-next-line no-console\n console.log('[GramJs] UPDATE', update['@type'], { update });\n }\n }\n\n switch (update['@type']) {\n case 'updateApiReady':\n onUpdateApiReady(global);\n break;\n\n case 'updateAuthorizationState':\n onUpdateAuthorizationState(update);\n break;\n\n case 'updateAuthorizationError':\n onUpdateAuthorizationError(update);\n break;\n\n case 'updateConnectionState':\n onUpdateConnectionState(update);\n break;\n\n case 'updateSession':\n onUpdateSession(update);\n break;\n\n case 'updateServerTimeOffset':\n onUpdateServerTimeOffset(update);\n break;\n\n case 'updateCurrentUser':\n onUpdateCurrentUser(update);\n break;\n\n case 'error':\n if (update.error.message === 'SESSION_REVOKED') {\n actions.signOut();\n }\n\n if (actions.showDialog) {\n actions.showDialog({ data: { ...update.error, hasErrorKey: true } });\n }\n\n break;\n }\n});\n\nfunction onUpdateApiReady(global: GlobalState) {\n subscribe();\n setLanguage(global.settings.byKey.language);\n}\n\nfunction onUpdateAuthorizationState(update: ApiUpdateAuthorizationState) {\n let global = getGlobal();\n\n const wasAuthReady = global.authState === 'authorizationStateReady';\n const authState = update.authorizationState;\n\n setGlobal({\n ...global,\n authState,\n authIsLoading: false,\n });\n\n global = getGlobal();\n\n switch (authState) {\n case 'authorizationStateLoggingOut':\n setGlobal({\n ...global,\n isLoggingOut: true,\n });\n break;\n case 'authorizationStateWaitCode':\n setGlobal({\n ...global,\n authIsCodeViaApp: update.isCodeViaApp,\n });\n break;\n case 'authorizationStateWaitPassword':\n setGlobal({\n ...global,\n authHint: update.hint,\n });\n break;\n case 'authorizationStateWaitQrCode':\n setGlobal({\n ...global,\n authIsLoadingQrCode: false,\n authQrCode: update.qrCode,\n });\n break;\n case 'authorizationStateReady': {\n if (wasAuthReady) {\n break;\n }\n\n setGlobal({\n ...global,\n isLoggingOut: false,\n lastSyncTime: Date.now(),\n });\n\n break;\n }\n }\n}\n\nfunction onUpdateAuthorizationError(update: ApiUpdateAuthorizationError) {\n setGlobal({\n ...getGlobal(),\n authError: update.message,\n });\n}\n\nfunction onUpdateConnectionState(update: ApiUpdateConnectionState) {\n const { connectionState } = update;\n const global = getGlobal();\n\n setGlobal({\n ...global,\n connectionState,\n });\n\n if (connectionState === 'connectionStateReady' && global.authState === 'authorizationStateReady') {\n getDispatch().sync();\n } else if (connectionState === 'connectionStateBroken') {\n getDispatch().signOut();\n }\n}\n\nfunction onUpdateSession(update: ApiUpdateSession) {\n const { sessionData } = update;\n const { authRememberMe, authState } = getGlobal();\n const isEmpty = !sessionData || !sessionData.mainDcId;\n\n if (!authRememberMe || authState !== 'authorizationStateReady' || isEmpty) {\n return;\n }\n\n getDispatch().saveSession({ sessionData });\n}\n\nfunction onUpdateServerTimeOffset(update: ApiUpdateServerTimeOffset) {\n const global = getGlobal();\n\n if (global.serverTimeOffset === update.serverTimeOffset) {\n return;\n }\n\n setGlobal({\n ...global,\n serverTimeOffset: update.serverTimeOffset,\n });\n}\n\nfunction onUpdateCurrentUser(update: ApiUpdateCurrentUser) {\n const { currentUser } = update;\n\n setGlobal({\n ...updateUser(getGlobal(), currentUser.id, currentUser),\n currentUserId: currentUser.id,\n });\n\n updateSessionUserId(currentUser.id);\n}\n\nfunction updateSessionUserId(currentUserId: number) {\n const sessionUserAuth = localStorage.getItem(SESSION_USER_KEY);\n if (!sessionUserAuth) return;\n\n const userAuth = JSON.parse(sessionUserAuth);\n userAuth.id = currentUserId;\n\n localStorage.setItem(SESSION_USER_KEY, JSON.stringify(userAuth));\n}\n","export var ServiceWorkerNoSupportError = (function() {\n\n\tfunction ServiceWorkerNoSupportError() {\n\t\tvar err = Error.call(this, 'ServiceWorker is not supported.');\n\t\tObject.setPrototypeOf(err, ServiceWorkerNoSupportError.prototype);\n\t\treturn err;\n\t}\n\n\tServiceWorkerNoSupportError.prototype = Object.create(Error.prototype);\n\n\treturn ServiceWorkerNoSupportError;\n})();\n\nexport var scriptUrl = __webpack_public_path__ + \"serviceWorker.js\";\n\nexport default function registerServiceWorkerIfSupported(mapScriptUrlOrOptions, maybeOptions) {\n\n\tvar targetScriptUrl = scriptUrl;\n\tvar options = maybeOptions;\n\n\tif (typeof mapScriptUrlOrOptions === 'function') {\n\t\ttargetScriptUrl = mapScriptUrlOrOptions(targetScriptUrl);\n\t} else {\n\t\toptions = mapScriptUrlOrOptions;\n\t}\n\n\tif ('serviceWorker' in navigator) {\n\t\treturn navigator.serviceWorker.register(targetScriptUrl, options);\n\t}\n\n\treturn Promise.reject(new ServiceWorkerNoSupportError());\n}\n","import { scriptUrl } from 'service-worker-loader!../serviceWorker';\n\nimport { DEBUG } from '../config';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { IS_ANDROID, IS_IOS, IS_SERVICE_WORKER_SUPPORTED } from './environment';\nimport { notifyClientReady } from './notifications';\n\ntype WorkerAction = {\n type: string;\n payload: Record;\n};\n\nfunction handleWorkerMessage(e: MessageEvent) {\n const action: WorkerAction = e.data;\n if (!action.type) return;\n const dispatch = getDispatch();\n switch (action.type) {\n case 'focusMessage':\n dispatch.focusMessage(action.payload);\n break;\n }\n}\n\nfunction subscribeToWorker() {\n navigator.serviceWorker.removeEventListener('message', handleWorkerMessage);\n navigator.serviceWorker.addEventListener('message', handleWorkerMessage);\n // Notify web worker that client is ready to receive messages\n notifyClientReady();\n}\n\nif (IS_SERVICE_WORKER_SUPPORTED) {\n window.addEventListener('load', async () => {\n try {\n await navigator.serviceWorker.register(scriptUrl);\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] ServiceWorker registered');\n }\n\n await navigator.serviceWorker.ready;\n\n if (navigator.serviceWorker.controller) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] ServiceWorker ready');\n }\n subscribeToWorker();\n } else {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('[SW] ServiceWorker not available');\n }\n\n if (!IS_IOS && !IS_ANDROID) {\n getDispatch().showDialog({ data: { message: 'SERVICE_WORKER_DISABLED', hasErrorKey: true } });\n }\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('[SW] ServiceWorker registration failed: ', err);\n }\n }\n });\n window.addEventListener('focus', async () => {\n await navigator.serviceWorker.ready;\n subscribeToWorker();\n });\n}\n","import { GlobalState } from './types';\nimport { NewChatMembersProgress } from '../types';\n\nimport {\n ANIMATION_LEVEL_DEFAULT, DARK_THEME_PATTERN_COLOR, DEFAULT_MESSAGE_TEXT_SIZE_PX, DEFAULT_PATTERN_COLOR,\n IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX, MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX,\n} from '../config';\nimport { IS_IOS, IS_MAC_OS } from '../util/environment';\n\nexport const INITIAL_STATE: GlobalState = {\n isLeftColumnShown: true,\n isChatInfoShown: false,\n newChatMembersProgress: NewChatMembersProgress.Closed,\n uiReadyState: 0,\n serverTimeOffset: 0,\n\n authRememberMe: true,\n\n blocked: {\n ids: [],\n totalCount: 0,\n },\n\n users: {\n byId: {},\n },\n\n chats: {\n listIds: {},\n isFullyLoaded: {},\n orderedPinnedIds: {},\n totalCount: {},\n byId: {},\n },\n\n messages: {\n byChatId: {},\n messageLists: [],\n },\n\n scheduledMessages: {\n byChatId: {},\n },\n\n chatFolders: {\n byId: {},\n activeChatFolder: 0,\n },\n\n fileUploads: {\n byMessageLocalId: {},\n },\n\n recentEmojis: ['grinning', 'kissing_heart', 'christmas_tree', 'brain', 'trophy'],\n\n stickers: {\n setsById: {},\n added: {},\n recent: {\n stickers: [],\n },\n favorite: {\n stickers: [],\n },\n featured: {\n setIds: [],\n },\n search: {},\n forEmoji: {},\n },\n\n emojiKeywords: {},\n\n gifs: {\n saved: {},\n search: {},\n },\n\n inlineBots: {\n isLoading: false,\n byUsername: {},\n },\n\n globalSearch: {},\n\n userSearch: {},\n\n localTextSearch: {\n byChatThreadKey: {},\n },\n\n localMediaSearch: {\n byChatId: {},\n },\n\n management: {\n byChatId: {},\n },\n\n topPeers: {},\n\n topInlineBots: {},\n\n mediaViewer: {},\n\n audioPlayer: {},\n\n forwardMessages: {},\n\n pollResults: {},\n\n payment: {},\n\n notifications: [],\n\n dialogs: [],\n\n activeSessions: [],\n\n settings: {\n byKey: {\n theme: 'light',\n shouldUseSystemTheme: true,\n messageTextSize: IS_IOS\n ? IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX\n : (IS_MAC_OS ? MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX : DEFAULT_MESSAGE_TEXT_SIZE_PX),\n animationLevel: ANIMATION_LEVEL_DEFAULT,\n messageSendKeyCombo: 'enter',\n shouldAutoDownloadMediaFromContacts: true,\n shouldAutoDownloadMediaInPrivateChats: true,\n shouldAutoDownloadMediaInGroups: true,\n shouldAutoDownloadMediaInChannels: true,\n shouldAutoPlayGifs: true,\n shouldAutoPlayVideos: true,\n shouldSuggestStickers: true,\n shouldLoopStickers: true,\n language: 'en',\n },\n themes: {\n light: {\n isBlurred: true,\n patternColor: DEFAULT_PATTERN_COLOR,\n },\n dark: {\n isBlurred: true,\n patternColor: DARK_THEME_PATTERN_COLOR,\n },\n },\n privacy: {},\n notifyExceptions: {},\n },\n\n twoFaSettings: {},\n\n shouldShowContextMenuHint: true,\n};\n","import {\n addCallback, addReducer, getGlobal, removeCallback,\n} from '../lib/teact/teactn';\n\nimport { GlobalState } from './types';\nimport { MAIN_THREAD_ID } from '../api/types';\n\nimport { onBeforeUnload, onIdle, throttle } from '../util/schedulers';\nimport {\n DEBUG,\n GLOBAL_STATE_CACHE_DISABLED,\n GLOBAL_STATE_CACHE_KEY,\n GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n GLOBAL_STATE_CACHE_USER_LIST_LIMIT,\n} from '../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../util/environment';\nimport { ANIMATION_END_EVENT, ANIMATION_START_EVENT } from '../hooks/useHeavyAnimationCheck';\nimport { pick } from '../util/iteratees';\nimport { selectCurrentMessageList } from '../modules/selectors';\nimport { hasStoredSession } from '../util/sessions';\nimport { INITIAL_STATE } from './initial';\n\nconst UPDATE_THROTTLE = 5000;\n\nconst updateCacheThrottled = throttle(() => onIdle(updateCache), UPDATE_THROTTLE, false);\n\nlet isCaching = false;\nlet isHeavyAnimating = false;\nlet unsubscribeFromBeforeUnload: NoneToVoidFunction | undefined;\n\nsetupHeavyAnimationListeners();\n\nexport function initCache() {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return;\n }\n\n addReducer('saveSession', () => {\n if (isCaching) {\n return;\n }\n\n setupCaching();\n });\n\n addReducer('reset', () => {\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n\n if (!isCaching) {\n return;\n }\n\n clearCaching();\n });\n}\n\nexport function loadCache(initialState: GlobalState) {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return undefined;\n }\n\n if (hasStoredSession(true)) {\n setupCaching();\n\n return readCache(initialState);\n } else {\n clearCaching();\n\n return undefined;\n }\n}\n\nfunction setupCaching() {\n isCaching = true;\n unsubscribeFromBeforeUnload = onBeforeUnload(updateCache, true);\n window.addEventListener('blur', updateCache);\n addCallback(updateCacheThrottled);\n}\n\nfunction clearCaching() {\n isCaching = false;\n removeCallback(updateCacheThrottled);\n window.removeEventListener('blur', updateCache);\n if (unsubscribeFromBeforeUnload) {\n unsubscribeFromBeforeUnload();\n }\n}\n\nfunction readCache(initialState: GlobalState) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.time('global-state-cache-read');\n }\n\n const json = localStorage.getItem(GLOBAL_STATE_CACHE_KEY);\n const cached = json ? JSON.parse(json) as GlobalState : undefined;\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.timeEnd('global-state-cache-read');\n }\n\n if (cached) {\n // Pre-fill defaults in nested objects which may be missing in older cache\n cached.settings.byKey = {\n ...initialState.settings.byKey,\n ...cached.settings.byKey,\n };\n cached.settings.themes = {\n ...initialState.settings.themes,\n ...cached.settings.themes,\n };\n cached.chatFolders = {\n ...initialState.chatFolders,\n ...cached.chatFolders,\n };\n\n if (!cached.messages.messageLists) {\n cached.messages.messageLists = [];\n }\n }\n\n return {\n ...initialState,\n ...cached,\n };\n}\n\nfunction updateCache() {\n if (!isCaching || isHeavyAnimating) {\n return;\n }\n\n const global = getGlobal();\n\n if (global.isLoggingOut) {\n return;\n }\n\n const reducedGlobal: GlobalState = {\n ...INITIAL_STATE,\n ...pick(global, [\n 'authState',\n 'authPhoneNumber',\n 'authRememberMe',\n 'authNearestCountry',\n 'currentUserId',\n 'contactList',\n 'topPeers',\n 'topInlineBots',\n 'recentEmojis',\n 'push',\n 'shouldShowContextMenuHint',\n ]),\n isChatInfoShown: reduceShowChatInfo(global),\n users: reduceUsers(global),\n chats: reduceChats(global),\n messages: reduceMessages(global),\n globalSearch: {\n recentlyFoundChatIds: global.globalSearch.recentlyFoundChatIds,\n },\n settings: reduceSettings(global),\n chatFolders: reduceChatFolders(global),\n };\n\n const json = JSON.stringify(reducedGlobal);\n localStorage.setItem(GLOBAL_STATE_CACHE_KEY, json);\n}\n\nfunction reduceShowChatInfo(global: GlobalState): boolean {\n return window.innerWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n ? global.isChatInfoShown\n : false;\n}\n\nfunction reduceUsers(global: GlobalState): GlobalState['users'] {\n const { users: { byId, selectedId } } = global;\n const idsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT).filter((cid) => cid > 0),\n ...Object.keys(byId),\n ].slice(0, GLOBAL_STATE_CACHE_USER_LIST_LIMIT);\n\n return {\n byId: pick(byId, idsToSave as number[]),\n selectedId: window.innerWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN ? selectedId : undefined,\n };\n}\n\nfunction reduceChats(global: GlobalState): GlobalState['chats'] {\n const chatIdsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT),\n ];\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n return {\n ...global.chats,\n byId: pick(global.chats.byId, currentChatId ? [...chatIdsToSave, currentChatId] : chatIdsToSave),\n listIds: {\n active: chatIdsToSave,\n },\n isFullyLoaded: {},\n orderedPinnedIds: {\n active: global.chats.orderedPinnedIds.active,\n },\n };\n}\n\nfunction reduceMessages(global: GlobalState): GlobalState['messages'] {\n const byChatId: GlobalState['messages']['byChatId'] = {};\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n const chatIdsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT),\n ...(currentChatId ? [currentChatId] : []),\n ];\n chatIdsToSave.forEach((chatId) => {\n const current = global.messages.byChatId[chatId];\n if (!current) {\n return;\n }\n\n const mainThread = current.threadsById[MAIN_THREAD_ID];\n if (!mainThread || !mainThread.viewportIds) {\n return;\n }\n\n byChatId[chatId] = {\n byId: pick(current.byId, mainThread.viewportIds),\n threadsById: {\n [MAIN_THREAD_ID]: mainThread,\n },\n };\n });\n\n const currentMessageList = selectCurrentMessageList(global);\n\n return {\n byChatId,\n messageLists: !currentMessageList || IS_SINGLE_COLUMN_LAYOUT ? [] : [{\n ...currentMessageList,\n threadId: MAIN_THREAD_ID,\n type: 'thread',\n }],\n };\n}\n\nfunction reduceSettings(global: GlobalState): GlobalState['settings'] {\n const { byKey, themes } = global.settings;\n\n return {\n byKey,\n themes,\n privacy: {},\n notifyExceptions: {},\n };\n}\n\nfunction reduceChatFolders(global: GlobalState): GlobalState['chatFolders'] {\n return {\n ...global.chatFolders,\n activeChatFolder: 0,\n };\n}\n\nfunction setupHeavyAnimationListeners() {\n document.addEventListener(ANIMATION_START_EVENT, () => {\n isHeavyAnimating = true;\n });\n document.addEventListener(ANIMATION_END_EVENT, () => {\n isHeavyAnimating = false;\n });\n}\n","import { addReducer } from '../lib/teact/teactn';\n\nimport { INITIAL_STATE } from './initial';\nimport { initCache, loadCache } from './cache';\nimport { cloneDeep } from '../util/iteratees';\n\ninitCache();\n\naddReducer('init', () => {\n const initial = cloneDeep(INITIAL_STATE);\n return loadCache(initial) || initial;\n});\n","const STORAGE_KEY = 'tt-active-tab';\nconst INTERVAL = 2000;\n\nconst tabKey = String(Date.now() + Math.random());\n\nlocalStorage.setItem(STORAGE_KEY, tabKey);\n\nlet callback: NoneToVoidFunction;\n\nconst interval = window.setInterval(() => {\n if (callback && localStorage.getItem(STORAGE_KEY) !== tabKey) {\n callback();\n clearInterval(interval);\n }\n}, INTERVAL);\n\nexport function addActiveTabChangeListener(_callback: NoneToVoidFunction) {\n callback = _callback;\n}\n","const SITE_FONTS = ['400 1em Roboto', '500 1em Roboto'];\n\nexport default function preloadFonts() {\n if ('fonts' in document) {\n return Promise.all(SITE_FONTS.map((font) => document.fonts.load(font)));\n }\n\n return undefined;\n}\n","export default __webpack_public_path__ + \"telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg\";","export default __webpack_public_path__ + \"monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg\";","import React, { FC, useEffect } from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\n\nimport { getChatAvatarHash } from '../../modules/helpers/chats'; // Direct import for better module splitting\nimport useFlag from '../../hooks/useFlag';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport { pause } from '../../util/schedulers';\nimport { preloadImage } from '../../util/files';\nimport preloadFonts from '../../util/fonts';\nimport * as mediaLoader from '../../util/mediaLoader';\nimport { Bundles, loadModule } from '../../util/moduleLoader';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport './UiLoader.scss';\n\n// @ts-ignore\nimport telegramLogoPath from '../../assets/telegram-logo.svg';\n// @ts-ignore\nimport monkeyPath from '../../assets/monkey.svg';\nimport { selectIsRightColumnShown, selectTheme } from '../../modules/selectors';\n\ntype OwnProps = {\n page: 'main' | 'authCode' | 'authPassword' | 'authPhoneNumber' | 'authQrCode';\n children: any;\n};\n\ntype StateProps = Pick & {\n hasCustomBackground?: boolean;\n hasCustomBackgroundColor: boolean;\n isRightColumnShown?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst MAX_PRELOAD_DELAY = 700;\nconst SECOND_STATE_DELAY = 1000;\nconst AVATARS_TO_PRELOAD = 10;\n\nfunction preloadAvatars() {\n const { listIds, byId } = getGlobal().chats;\n if (!listIds.active) {\n return undefined;\n }\n\n return Promise.all(listIds.active.slice(0, AVATARS_TO_PRELOAD).map((chatId) => {\n const chat = byId[chatId];\n if (!chat) {\n return undefined;\n }\n\n const avatarHash = getChatAvatarHash(chat);\n if (!avatarHash) {\n return undefined;\n }\n\n return mediaLoader.fetch(avatarHash, ApiMediaFormat.DataUri);\n }));\n}\n\nconst preloadTasks = {\n main: () => Promise.all([\n loadModule(Bundles.Main, 'Main')\n .then(preloadFonts),\n preloadAvatars(),\n ]),\n authPhoneNumber: () => Promise.all([\n preloadFonts(),\n preloadImage(telegramLogoPath),\n ]),\n authCode: () => preloadImage(monkeyPath),\n authPassword: () => preloadImage(monkeyPath),\n authQrCode: preloadFonts,\n};\n\nconst UiLoader: FC = ({\n page,\n children,\n hasCustomBackground,\n hasCustomBackgroundColor,\n isRightColumnShown,\n shouldSkipHistoryAnimations,\n setIsUiReady,\n}) => {\n const [isReady, markReady] = useFlag();\n const {\n shouldRender: shouldRenderMask, transitionClassNames,\n } = useShowTransition(!isReady, undefined, true);\n\n useEffect(() => {\n let timeout: number | undefined;\n\n const safePreload = async () => {\n try {\n await preloadTasks[page]();\n } catch (err) {\n // Do nothing\n }\n };\n\n Promise.race([\n pause(MAX_PRELOAD_DELAY),\n safePreload(),\n ]).then(() => {\n markReady();\n setIsUiReady({ uiReadyState: 1 });\n\n timeout = window.setTimeout(() => {\n setIsUiReady({ uiReadyState: 2 });\n }, SECOND_STATE_DELAY);\n });\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n setIsUiReady({ uiReadyState: 0 });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n
\n {children}\n {shouldRenderMask && !shouldSkipHistoryAnimations && (\n
\n {page === 'main' ? (\n <>\n
\n \n {isRightColumnShown &&
}\n \n ) : (\n
\n )}\n
\n )}\n
\n );\n};\n\nexport default withGlobal(\n (global): StateProps => {\n const theme = selectTheme(global);\n const { background, backgroundColor } = global.settings.themes[theme] || {};\n\n return {\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n uiReadyState: global.uiReadyState,\n hasCustomBackground: Boolean(background),\n hasCustomBackgroundColor: Boolean(backgroundColor),\n isRightColumnShown: selectIsRightColumnShown(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setIsUiReady']),\n)(UiLoader);\n","import * as langProvider from '../util/langProvider';\nimport { useState } from '../lib/teact/teact';\n\nexport default (langCode: string | undefined, key: string): string | undefined => {\n const [translation, setTranslation] = useState();\n\n if (langCode) {\n langProvider\n .getTranslationForLangString(langCode, key)\n .then(setTranslation);\n }\n\n return translation;\n};\n","export function getSuggestedLanguage() {\n let suggestedLanguage = navigator.language;\n\n if (suggestedLanguage && suggestedLanguage !== 'pt-br') {\n suggestedLanguage = suggestedLanguage.substr(0, 2);\n }\n\n return suggestedLanguage;\n}\n","import React, {\n FC, useState, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { countryList } from '../../util/phoneNumber';\nimport searchWords from '../../util/searchWords';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport Spinner from '../ui/Spinner';\n\nimport './CountryCodeInput.scss';\n\ntype OwnProps = {\n id: string;\n value?: Country;\n isLoading?: boolean;\n onChange: (value: Country) => void;\n};\n\nconst MENU_HIDING_DURATION = 200 + ANIMATION_END_DELAY;\nconst SELECT_TIMEOUT = 50;\n\nconst CountryCodeInput: FC = ({\n id,\n value,\n isLoading,\n onChange,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [filter, setFilter] = useState();\n const [filteredList, setFilteredList] = useState(countryList);\n\n function updateFilter(filterValue?: string) {\n setFilter(filterValue);\n setFilteredList(getFilteredList(filterValue));\n }\n\n const handleChange = useCallback((e: React.SyntheticEvent) => {\n const { countryId } = (e.currentTarget.firstElementChild as HTMLDivElement).dataset;\n const country = countryList.find((c) => c.id === countryId);\n\n if (country) {\n onChange(country);\n }\n\n setTimeout(() => updateFilter(undefined), MENU_HIDING_DURATION);\n }, [onChange]);\n\n const handleInput = useCallback((e: React.FormEvent) => {\n updateFilter(e.currentTarget.value);\n }, []);\n\n const handleInputKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode !== 8) {\n return;\n }\n\n const target = e.currentTarget;\n if (value && filter === undefined) {\n target.value = '';\n }\n\n updateFilter(target.value);\n }, [filter, value]);\n\n const CodeInput: FC<{ onTrigger: () => void; isOpen?: boolean }> = ({ onTrigger, isOpen }) => {\n const handleTrigger = () => {\n if (isOpen) {\n return;\n }\n\n setTimeout(() => {\n inputRef.current!.select();\n }, SELECT_TIMEOUT);\n\n onTrigger();\n\n const formEl = document.getElementById('auth-phone-number-form')!;\n formEl.scrollTo({ top: formEl.scrollHeight, behavior: 'smooth' });\n };\n\n const inputValue = filter !== undefined\n ? filter\n : (value && value.name) || '';\n\n return (\n
\n \n \n {isLoading ? (\n \n ) : (\n \n )}\n
\n );\n };\n\n return (\n \n {filteredList.map((country: Country) => (\n \n \n {renderText(country.flag, ['hq_emoji'])}\n {country.name}\n {country.code}\n \n ))}\n {!filteredList.length && (\n \n {lang('lng_country_none')}\n \n )}\n \n );\n};\n\nfunction getFilteredList(filter = ''): Country[] {\n return filter.length\n ? countryList.filter((country) => searchWords(country.name, filter))\n : countryList;\n}\n\nexport default memo(CountryCodeInput);\n","import { ChangeEvent } from 'react';\n\n// @ts-ignore\nimport monkeyPath from '../../assets/monkey.svg';\n\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { LangCode } from '../../types';\n\nimport { IS_SAFARI, IS_TOUCH_ENV } from '../../util/environment';\nimport { preloadImage } from '../../util/files';\nimport preloadFonts from '../../util/fonts';\nimport { pick } from '../../util/iteratees';\nimport { formatPhoneNumber, getCountryById, getCountryFromPhoneNumber } from '../../util/phoneNumber';\nimport { setLanguage } from '../../util/langProvider';\nimport useLang from '../../hooks/useLang';\nimport useFlag from '../../hooks/useFlag';\nimport useLangString from '../../hooks/useLangString';\nimport { getSuggestedLanguage } from './helpers/getSuggestedLanguage';\n\nimport Button from '../ui/Button';\nimport Checkbox from '../ui/Checkbox';\nimport InputText from '../ui/InputText';\nimport Loading from '../ui/Loading';\nimport CountryCodeInput from './CountryCodeInput';\n\ntype StateProps = Pick & {\n language?: LangCode;\n};\ntype DispatchProps = Pick;\n\nconst MIN_NUMBER_LENGTH = 7;\n\nlet isPreloadInitiated = false;\n\nconst AuthPhoneNumber: FC = ({\n connectionState,\n authState,\n authPhoneNumber,\n authIsLoading,\n authIsLoadingQrCode,\n authError,\n authRememberMe,\n authNearestCountry,\n language,\n setAuthPhoneNumber,\n setAuthRememberMe,\n loadNearestCountry,\n clearAuthError,\n goToAuthQrCode,\n setSettingOption,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const suggestedLanguage = getSuggestedLanguage();\n\n const continueText = useLangString(suggestedLanguage, 'ContinueOnThisLanguage');\n const [country, setCountry] = useState();\n const [phoneNumber, setPhoneNumber] = useState();\n const [isTouched, setIsTouched] = useState(false);\n const [lastSelection, setLastSelection] = useState<[number, number] | undefined>();\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n const fullNumber = country ? `${country.code} ${phoneNumber || ''}` : phoneNumber;\n const canSubmit = fullNumber && fullNumber.replace(/[^\\d]+/g, '').length >= MIN_NUMBER_LENGTH;\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n inputRef.current!.focus();\n }\n }, [country]);\n\n useEffect(() => {\n if (connectionState === 'connectionStateReady' && !authNearestCountry) {\n loadNearestCountry();\n }\n }, [connectionState, authNearestCountry, loadNearestCountry]);\n\n useEffect(() => {\n if (authNearestCountry && !country && !isTouched) {\n setCountry(getCountryById(authNearestCountry));\n }\n }, [country, authNearestCountry, isTouched]);\n\n const parseFullNumber = useCallback((newFullNumber: string) => {\n if (!newFullNumber.length) {\n setPhoneNumber('');\n }\n\n const suggestedCountry = getCountryFromPhoneNumber(newFullNumber);\n\n // Any phone numbers should be allowed, in some cases ignoring formatting\n const selectedCountry = !country\n || (suggestedCountry && suggestedCountry.id !== country.id)\n || (!suggestedCountry && newFullNumber.length)\n ? suggestedCountry\n : country;\n\n if (!country || !selectedCountry || (selectedCountry && selectedCountry.code !== country.code)) {\n setCountry(selectedCountry);\n }\n\n setPhoneNumber(formatPhoneNumber(newFullNumber, selectedCountry));\n }, [country]);\n\n const handleLangChange = useCallback(() => {\n markIsLoading();\n\n setLanguage(suggestedLanguage!, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: suggestedLanguage });\n });\n }, [markIsLoading, setSettingOption, suggestedLanguage, unmarkIsLoading]);\n\n useEffect(() => {\n if (phoneNumber === undefined && authPhoneNumber) {\n parseFullNumber(authPhoneNumber);\n }\n }, [authPhoneNumber, phoneNumber, parseFullNumber]);\n\n useLayoutEffect(() => {\n if (inputRef.current && lastSelection) {\n inputRef.current.setSelectionRange(...lastSelection);\n }\n }, [lastSelection]);\n\n const isJustPastedRef = useRef(false);\n const handlePaste = useCallback(() => {\n isJustPastedRef.current = true;\n requestAnimationFrame(() => {\n isJustPastedRef.current = false;\n });\n }, []);\n\n const handlePhoneNumberChange = useCallback((e: ChangeEvent) => {\n if (authError) {\n clearAuthError();\n }\n\n // This is for further screens. We delay it until user input to speed up the initial loading.\n if (!isPreloadInitiated) {\n isPreloadInitiated = true;\n preloadFonts();\n preloadImage(monkeyPath);\n }\n\n const { value, selectionStart, selectionEnd } = e.target;\n setLastSelection(\n selectionStart && selectionEnd && selectionEnd < value.length\n ? [selectionStart, selectionEnd]\n : undefined,\n );\n\n setIsTouched(true);\n\n const shouldFixSafariAutoComplete = (\n IS_SAFARI && country && fullNumber !== undefined\n && value.length - fullNumber.length > 1 && !isJustPastedRef.current\n );\n parseFullNumber(shouldFixSafariAutoComplete ? `${country!.code} ${value}` : value);\n }, [authError, clearAuthError, country, fullNumber, parseFullNumber]);\n\n const handleKeepSessionChange = useCallback((e: ChangeEvent) => {\n setAuthRememberMe(e.target.checked);\n }, [setAuthRememberMe]);\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (authIsLoading) {\n return;\n }\n\n if (canSubmit) {\n setAuthPhoneNumber({ phoneNumber: fullNumber });\n }\n }\n\n const isAuthReady = authState === 'authorizationStateWaitPhoneNumber';\n\n return (\n
\n
\n
\n

Telegram

\n

{lang('StartText')}

\n
\n \n \n \n {canSubmit && (\n isAuthReady ? (\n \n ) : (\n \n )\n )}\n {isAuthReady && (\n \n )}\n {suggestedLanguage && suggestedLanguage !== language && continueText && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: { byKey: { language } },\n } = global;\n\n return {\n ...pick(global, [\n 'connectionState',\n 'authState',\n 'authPhoneNumber',\n 'authIsLoading',\n 'authIsLoadingQrCode',\n 'authError',\n 'authRememberMe',\n 'authNearestCountry',\n ]),\n language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setAuthPhoneNumber',\n 'setAuthRememberMe',\n 'clearAuthError',\n 'loadNearestCountry',\n 'goToAuthQrCode',\n 'setSettingOption',\n ]),\n)(AuthPhoneNumber));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthCodeAsync: FC = () => {\n const AuthCode = useModuleLoader(Bundles.Auth, 'AuthCode');\n\n return AuthCode ? : ;\n};\n\nexport default memo(AuthCodeAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthPasswordAsync: FC = () => {\n const AuthPassword = useModuleLoader(Bundles.Auth, 'AuthPassword');\n\n return AuthPassword ? : ;\n};\n\nexport default memo(AuthPasswordAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthRegisterAsync: FC = () => {\n const AuthRegister = useModuleLoader(Bundles.Auth, 'AuthRegister');\n\n return AuthRegister ? : ;\n};\n\nexport default memo(AuthRegisterAsync);\n","/*\n jquery-qrcode v0.14.0 - https://larsjung.de/jquery-qrcode/ */\n'use strict';let G=null;class H{}H.render=function(w,B){G(w,B)};self.QrCreator=H;\n(function(w){function B(t,c,a,e){var b={},h=w(a,c);h.u(t);h.J();e=e||0;var r=h.h(),d=h.h()+2*e;b.text=t;b.level=c;b.version=a;b.O=d;b.a=function(b,a){b-=e;a-=e;return 0>b||b>=r||0>a||a>=r?!1:h.a(b,a)};return b}function C(t,c,a,e,b,h,r,d,g,x){function u(b,a,f,c,d,r,g){b?(t.lineTo(a+r,f+g),t.arcTo(a,f,c,d,h)):t.lineTo(a,f)}r?t.moveTo(c+h,a):t.moveTo(c,a);u(d,e,a,e,b,-h,0);u(g,e,b,c,b,0,-h);u(x,c,b,c,a,h,0);u(r,c,a,e,a,0,h)}function z(t,c,a,e,b,h,r,d,g,x){function u(b,a,c,d){t.moveTo(b+c,a);t.lineTo(b,\na);t.lineTo(b,a+d);t.arcTo(b,a,b+c,a,h)}r&&u(c,a,h,h);d&&u(e,a,-h,h);g&&u(e,b,-h,-h);x&&u(c,b,h,-h)}function A(t,c){var a=c.fill;if(\"string\"===typeof a)t.fillStyle=a;else{var e=a.type,b=a.colorStops;a=a.position.map((b)=>Math.round(b*c.size));if(\"linear-gradient\"===e)var h=t.createLinearGradient.apply(t,a);else if(\"radial-gradient\"===e)h=t.createRadialGradient.apply(t,a);else throw Error(\"Unsupported fill\");b.forEach(([b,a])=>{h.addColorStop(b,a)});t.fillStyle=h}}function y(t,c){a:{var a=c.text,e=\nc.v,b=c.N,h=c.K,r=c.P;b=Math.max(1,b||1);for(h=Math.min(40,h||40);b<=h;b+=1)try{var d=B(a,e,b,r);break a}catch(J){}d=void 0}if(!d)return null;a=t.getContext(\"2d\");c.background&&(a.fillStyle=c.background,a.fillRect(c.left,c.top,c.size,c.size));e=d.O;h=c.size/e;a.beginPath();for(r=0;r>>7-b%8&1)},put:function(b,h){for(var a=0;a>>h-a-1&1))},f:function(){return a},m:function(b){var h=Math.floor(a/8);c.length<=h&&c.push(0);b&&(c[h]|=128>>>a%8);a+=1}};return e}function C(c,a){function e(b,h){for(var a=-1;7>=a;a+=1)if(!(-1>=b+a||d<=b+a))for(var c=-1;7>=c;c+=1)-1>=h+c||d<=h+c||(r[b+a][h+c]=0<=a&&6>=a&&(0==c||6==c)||0<=c&&6>=c&&(0==a||6==a)||2<=a&&4>=a&&2<=c&&4>=c?!0:!1)}function b(b,a){for(var f=d=4*c+17,k=Array(f),m=0;m<\nf;m+=1){k[m]=Array(f);for(var p=0;p=n;n+=1)for(var l=-2;2>=l;l+=1)r[p+n][q+l]=-2==n||2==n||-2==l||2==l||0==n&&0==l}for(f=8;fk;k+=1)m=!b&&1==(f>>k&1),r[6>k?k:8>k?k+1:d-15+k][8]=m,r[8][8>k?d-k-1:9>k?15-k:14-k]=m;r[d-8][8]=!b;if(7<=\nc){f=y.A(c);for(k=0;18>k;k+=1)m=!b&&1==(f>>k&1),r[Math.floor(k/3)][k%3+d-8-3]=m;for(k=0;18>k;k+=1)m=!b&&1==(f>>k&1),r[k%3+d-8-3][Math.floor(k/3)]=m}if(null==g){b=t.I(c,h);f=B();for(k=0;k8*m)throw Error(\"code length overflow. (\"+f.f()+\">\"+8*m+\")\");for(f.f()+4<=8*m&&f.put(0,4);0!=f.f()%8;)f.m(!1);for(;!(f.f()>=8*m);){f.put(236,8);if(f.f()>=8*m)break;f.put(17,8)}var u=0;m=k=0;p=Array(b.length);\nq=Array(b.length);for(n=0;nn;n+=1)null==r[k][q-n]&&(l=!1,p>>m&1)),a(k,q-n)&&(l=!l),r[k][q-n]=l,--m,-1==m&&(p+=1,m=7));k+=f;if(0>k||d<=k){k-=f;f=-f;break}}}var h=A[a],r=null,d=0,g=null,x=[],u={u:function(b){b=w(b);x.push(b);g=null},a:function(b,a){if(0>b||d<=b||0>a||d<=a)throw Error(b+\",\"+a);return r[b][a]},h:function(){return d},J:function(){for(var a=0,h=0,c=0;8>c;c+=1){b(!0,c);var d=y.D(u);if(0==c||a>d)a=d,h=c}b(!1,h)}};return u}\nfunction z(c,a){if(\"undefined\"==typeof c.length)throw Error(c.length+\"/\"+a);var e=function(){for(var b=0;bb.b()-a.b())return b;for(var c=v.g(b.c(0))-v.g(a.c(0)),h=Array(b.b()),\ng=0;gb?a.push(b):2048>b?a.push(192|b>>6,128|b&63):55296>b||57344<=b?a.push(224|b>>12,128|b>>6&63,128|b&63):(e++,b=65536+((b&1023)<<10|c.charCodeAt(e)&1023),a.push(240|b>>18,128|b>>12&63,128|b>>6&63,128|b&63))}return a};var A={L:1,M:0,Q:3,H:2},y=function(){function c(b){for(var a=0;0!=b;)a+=1,b>>>=1;return a}var a=[[],[6,18],\n[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],\n[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],e={w:function(b){for(var a=b<<10;0<=c(a)-c(1335);)a^=1335<a||40a?8:16},D:function(b){for(var a=b.h(),c=0,\nd=0;d=p;p+=1)if(!(0>d+p||a<=d+p))for(var q=-1;1>=q;q+=1)0>g+q||a<=g+q||(0!=p||0!=q)&&t==b.a(d+p,g+q)&&(e+=1);5e;e+=1)c[e]=1<e;e+=1)c[e]=c[e-4]^c[e-5]^c[e-6]^c[e-8];for(e=0;255>e;e+=1)a[c[e]]=e;return{g:function(b){if(1>b)throw Error(\"glog(\"+b+\")\");return a[b]},i:function(b){for(;0>b;)b+=255;for(;256<=b;)b-=255;return c[b]}}}(),t=function(){function c(b,c){switch(c){case A.L:return a[4*\n(b-1)];case A.M:return a[4*(b-1)+1];case A.Q:return a[4*(b-1)+2];case A.H:return a[4*(b-1)+3]}}var a=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,\n2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,\n45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,\n151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],\n[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],\n[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],e={I:function(b,a){var e=c(b,a);if(\"undefined\"==\ntypeof e)throw Error(\"bad rs block @ typeNumber:\"+b+\"/errorCorrectLevel:\"+a);b=e.length/3;a=[];for(var d=0;d & {\n language?: LangCode;\n};\ntype DispatchProps = Pick;\n\nconst DATA_PREFIX = 'tg://login?token=';\n\nconst AuthCode: FC = ({\n connectionState,\n authState,\n authQrCode,\n language,\n returnToAuthPhoneNumber,\n setSettingOption,\n}) => {\n const suggestedLanguage = getSuggestedLanguage();\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const qrCodeRef = useRef(null);\n const continueText = useLangString(suggestedLanguage, 'ContinueOnThisLanguage');\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n useEffect(() => {\n if (!authQrCode || connectionState !== 'connectionStateReady') {\n return;\n }\n\n const container = qrCodeRef.current!;\n\n container.innerHTML = '';\n container.classList.remove('pre-animate');\n\n QrCreator.render({\n text: `${DATA_PREFIX}${authQrCode.token}`,\n radius: 0.5,\n ecLevel: 'M',\n fill: '#4E96D4',\n size: 280,\n }, container);\n }, [connectionState, authQrCode]);\n\n const handleLangChange = useCallback(() => {\n markIsLoading();\n\n setLanguage(suggestedLanguage!, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: suggestedLanguage });\n });\n }, [markIsLoading, setSettingOption, suggestedLanguage, unmarkIsLoading]);\n\n const isAuthReady = authState === 'authorizationStateWaitQrCode';\n\n return (\n
\n
\n {authQrCode ? (\n
\n ) : (\n
\n )}\n

{lang('Login.QR.Title')}

\n
    \n
  1. {lang('Login.QR.Help1')}
  2. \n
  3. {renderText(lang('Login.QR.Help2'), ['simple_markdown'])}
  4. \n
  5. {lang('Login.QR.Help3')}
  6. \n
\n {isAuthReady && (\n \n )}\n {suggestedLanguage && suggestedLanguage !== language && continueText && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n connectionState, authState, authQrCode, settings: { byKey: { language } },\n } = global;\n\n return {\n connectionState,\n authState,\n authQrCode,\n language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'returnToAuthPhoneNumber', 'setSettingOption',\n ]),\n)(AuthCode));\n","import React, { FC, useEffect, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\n\nimport '../../modules/actions/initial';\nimport { pick } from '../../util/iteratees';\nimport { PLATFORM_ENV } from '../../util/environment';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport UiLoader from '../common/UiLoader';\nimport AuthPhoneNumber from './AuthPhoneNumber';\nimport AuthCode from './AuthCode.async';\nimport AuthPassword from './AuthPassword.async';\nimport AuthRegister from './AuthRegister.async';\nimport AuthQrCode from './AuthQrCode';\n\nimport './Auth.scss';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst Auth: FC = ({\n authState, reset, initApi, returnToAuthPhoneNumber, goToAuthQrCode,\n}) => {\n useEffect(() => {\n reset();\n initApi();\n }, [reset, initApi]);\n\n const isMobile = PLATFORM_ENV === 'iOS' || PLATFORM_ENV === 'Android';\n\n const handleChangeAuthorizationMethod = () => {\n if (!isMobile) {\n goToAuthQrCode();\n } else {\n returnToAuthPhoneNumber();\n }\n };\n\n useHistoryBack(\n (!isMobile && authState === 'authorizationStateWaitPhoneNumber')\n || (isMobile && authState === 'authorizationStateWaitQrCode'), handleChangeAuthorizationMethod,\n );\n\n switch (authState) {\n case 'authorizationStateWaitCode':\n return ;\n case 'authorizationStateWaitPassword':\n return ;\n case 'authorizationStateWaitRegistration':\n return ;\n case 'authorizationStateWaitPhoneNumber':\n return ;\n case 'authorizationStateWaitQrCode':\n return ;\n default:\n return isMobile\n ? \n : ;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (global, actions): DispatchProps => pick(actions, ['reset', 'initApi', 'returnToAuthPhoneNumber', 'goToAuthQrCode']),\n)(Auth));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MainAsync: FC = () => {\n const Main = useModuleLoader(Bundles.Main, 'Main');\n\n return Main ?
: undefined;\n};\n\nexport default memo(MainAsync);\n","export default __webpack_public_path__ + \"app-inactive.bc7953c2dfebcabce2c43ca7dc778a89.png\";","import React, { FC } from '../../lib/teact/teact';\n\nimport Button from '../ui/Button';\n\nimport appInactivePath from '../../assets/app-inactive.png';\nimport './AppInactive.scss';\n\nconst AppInactive: FC = () => {\n const handleReload = () => {\n window.location.reload();\n };\n\n return (\n
\n
\n \"\"\n

Such error, many tabs

\n
\n Telegram supports only one active tab with the app.\n
\n Please reload this page to continue using this tab or close it.\n
\n
\n \n
\n
\n
\n );\n};\n\nexport default AppInactive;\n","import { FC, useEffect } from './lib/teact/teact';\nimport React, { withGlobal } from './lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from './global/types';\n\nimport { INACTIVE_MARKER, PAGE_TITLE } from './config';\nimport { pick } from './util/iteratees';\nimport { updateSizes } from './util/windowSize';\nimport { addActiveTabChangeListener } from './util/activeTabMonitor';\nimport useFlag from './hooks/useFlag';\n\nimport Auth from './components/auth/Auth';\nimport UiLoader from './components/common/UiLoader';\nimport Main from './components/main/Main.async';\nimport AppInactive from './components/main/AppInactive';\nimport { hasStoredSession } from './util/sessions';\n// import Test from './components/test/TestNoRedundancy';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst App: FC = ({ authState, disconnect }) => {\n const [isInactive, markInactive] = useFlag(false);\n\n useEffect(() => {\n updateSizes();\n addActiveTabChangeListener(() => {\n disconnect();\n document.title = `${PAGE_TITLE}${INACTIVE_MARKER}`;\n\n markInactive();\n });\n }, [disconnect, markInactive]);\n\n // return ;\n\n if (isInactive) {\n return ;\n }\n\n if (authState) {\n switch (authState) {\n case 'authorizationStateWaitPhoneNumber':\n case 'authorizationStateWaitCode':\n case 'authorizationStateWaitPassword':\n case 'authorizationStateWaitRegistration':\n case 'authorizationStateWaitQrCode':\n return ;\n case 'authorizationStateClosed':\n case 'authorizationStateClosing':\n case 'authorizationStateLoggingOut':\n case 'authorizationStateReady':\n return renderMain();\n }\n }\n\n return hasStoredSession(true) ? renderMain() : ;\n};\n\nfunction renderMain() {\n return (\n \n
\n \n );\n}\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (setGlobal, actions): DispatchProps => pick(actions, ['disconnect']),\n)(App);\n","import './util/handleError';\nimport './util/setupServiceWorker';\n\nimport React, { getDispatch, getGlobal } from './lib/teact/teactn';\nimport TeactDOM from './lib/teact/teact-dom';\n\nimport './global';\n\nimport { DEBUG } from './config';\n\nimport App from './App';\n\nimport './styles/index.scss';\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> INIT');\n}\n\ngetDispatch().init();\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START INITIAL RENDER');\n}\n\nTeactDOM.render(\n ,\n document.getElementById('root'),\n);\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH INITIAL RENDER');\n}\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('GLOBAL STATE', getGlobal());\n});\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/main.9cbfb7726cae6e685678.js b/dist/main.9cbfb7726cae6e685678.js new file mode 100644 index 000000000..ab7dc75ec --- /dev/null +++ b/dist/main.9cbfb7726cae6e685678.js @@ -0,0 +1,2 @@ +!function(e){function t(t){for(var n,r,o=t[0],d=t[1],c=0,a=[];c=0&&O(e[t]);t--);return t+17&&console.warn(`[Teact] Slow component render: ${n}, ${Math.round(t)} ms`),w[n].renderTimes.push(t),w[n].renderCount++}}catch(t){Object(c.a)(t),u=e.renderedValue}if(e.isMounted&&u===e.renderedValue)return e.$element;e.renderedValue=u;const o=j(u);return e.$element=y(e,[o]),e.$element}function C(e,t){return typeof e!=typeof t||(e.type!==t.type||(b(e)&&b(t)?e.value!==t.value:h(e)&&h(t)?e.tag!==t.tag||e.props.key!==t.props.key:!(!m(e)||!m(t))&&(e.componentInstance.Component!==t.componentInstance.Component||e.props.key!==t.props.key)))}function E(e){p(e)&&(m(e)?function(e){if(!e.isMounted)return;e.hooks.memos.byCursor.forEach(e=>{e.current=null}),e.hooks.effects.byCursor.forEach(({cleanup:e})=>{if("function"==typeof e)try{e()}catch(e){Object(c.a)(e)}}),e.isMounted=!1,function(e){e.hooks.effects.byCursor.forEach(e=>{e.cleanup=null,e.effect=null,e.dependencies=null}),e.hooks.state.byCursor.forEach(e=>{e.value=null,e.nextValue=null,e.setter=null}),e.hooks.memos.byCursor.forEach(e=>{e.dependencies=null}),e.hooks=null,e.$element=null,e.renderedValue=null,e.Component=null,e.props=null,e.forceUpdate=null,e.onUpdate=null}(e)}(e.componentInstance):e.target&&(Object(a.b)(e.target),e.target=null),e.children.forEach(E))}function S(e){return I(e),e.isMounted=!0,e.$element}function M(e){if(!e.isMounted||!e.onUpdate)return;const t=e.$element;I(e),e.$element!==t&&e.onUpdate()}function A(e){return m(e)?A(e.children[0]):e.target}function k(e,t){m(e)?k(e.children[0],t):e.target=t}function T(e){const{cursor:t,byCursor:n}=f.hooks.state;var o;return void 0===n[t]&&(n[t]={value:e,nextValue:e,setter:(o=f,e=>{n[t].nextValue!==e&&(n[t].nextValue="function"==typeof e?e(n[t].value):e,o.prepareForFrame&&o.forceUpdate||(o.prepareForFrame=Object(u.i)(()=>function e(t){t.isMounted&&(t.hooks.state.byCursor.forEach(e=>{e.value=e.nextValue}),t.prepareForFrame=Object(u.i)(()=>e(t)),t.forceUpdate=Object(u.j)(()=>M(t)))}(o)),o.forceUpdate=Object(u.j)(()=>M(o))),o.prepareForFrame(),o.forceUpdate(),r.t&&"TeactNContainer"!==o.name&&console.log("[Teact.useState]",o.name,o.Component&&o.Component.DEBUG_contentComponentName?"> "+o.Component.DEBUG_contentComponentName:"",`Forced update at cursor #${t}, next value: `,n[t].nextValue))})}),f.hooks.state.cursor++,[n[t].value,n[t].setter]}function N(e,t,n,r){const{cursor:u,byCursor:o}=f.hooks.effects,d=f,a=()=>{if(!d.isMounted)return;const{cleanup:e}=o[u];if("function"==typeof e)try{e()}catch(e){Object(c.a)(e)}o[u].cleanup=t()};if(void 0!==o[u]&&n&&o[u].dependencies){if(n.some((e,t)=>e!==o[u].dependencies[t])){if(r){const e=n.reduce((e,t,n)=>{const r=o[u].dependencies[n];return t!==r&&e.push(`${n}: ${r} => ${t}`),e},[]);console.log("[Teact]",r,"Effect caused by dependencies.",e.join(", "))}e(a)}}else e(a);o[u]={effect:t,dependencies:n,cleanup:o[u]?o[u].cleanup:void 0},f.hooks.effects.cursor++}function P(e,t,n){return N(u.b,e,t,n)}function D(e,t,n){return N(u.e,e,t,n)}function L(e,t,n){const{cursor:u,byCursor:o}=f.hooks.memos;let{current:c}=o[u]||{};return(void 0===o[u]||t.some((e,t)=>e!==o[u].dependencies[t]))&&(r.r&&n&&console.log(`[Teact.useMemo] ${f.name} (${n}): Update is caused by:`,o[u]?Object(d.b)(t,o[u].dependencies).join(", "):"[first render]"),c=e()),o[u]={current:c,dependencies:t},f.hooks.memos.cursor++,c}function x(e,t){return L(()=>e,t)}function F(e){return L(()=>({current:e}),[])}function B(e,t=d.a,n){return function(u){const o=F(u),c=F();return(!c.current||o.current&&!t(o.current,u))&&(r.r&&n&&console.log(`[Teact.memo] ${e.name} (${n}): Update is caused by:`,Object(d.b)(o.current,u).join(", ")),o.current=u,c.current=g(e,u)),c.current}}document.addEventListener("dblclick",()=>{console.log("COMPONENTS",Object(o.k)(Object.values(w),"renderCount","desc"))}),t.a={createElement:g,Fragment:s}},function(e,t,n){"use strict";n.d(t,"g",(function(){return v})),n.d(t,"e",(function(){return O})),n.d(t,"d",(function(){return j})),n.d(t,"b",(function(){return w})),n.d(t,"a",(function(){return I})),n.d(t,"f",(function(){return C})),n.d(t,"h",(function(){return E}));var r=n(0),u=n(2),o=n(31),d=n(33),c=n(10),a=n(28),i=n(3),s=n(27);function f(){return(f=Object.assign||function(e){for(var t=1;t7&&console.warn(`[TeactN] Slow containers update: ${Math.round(t)} ms`)}}],m={},p=new Map;function g(){h.forEach(e=>e(l))}const y=Object(c.j)(g);function v(e,t=!1){"object"==typeof e&&e!==l&&(l=e,t?g():y())}function O(){return l}function j(){return m}function w(e,t){b[e]||(b[e]=[],m[e]=(t,n=!1)=>{!function(e,t,n){b[e]&&b[e].forEach(e=>{const r=e(l,m,t);r&&v(r,n)})}(e,t,n)}),b[e].push(t)}function I(e){h.push(e)}function C(e){const t=h.indexOf(e);-1!==t&&h.splice(t,1)}function E(e=(()=>({})),t=(()=>({}))){return n=>function u(c){u.DEBUG_contentComponentName=n.name;const[i]=Object(r.r)(Object(d.a)(p)),b=Object(o.a)();Object(r.n)(()=>()=>{p.delete(i)},[i]);let h=p.get(i);if(h||(h={mapStateToProps:e,mapReducersToProps:t,ownProps:c,areMappedPropsChanged:!1,forceUpdate:b,DEBUG_updates:0,DEBUG_componentName:n.name},p.set(i,h)),h.areMappedPropsChanged&&(h.areMappedPropsChanged=!1),!h.mappedProps||!Object(a.a)(h.ownProps,c)){h.ownProps=c;try{h.mappedProps={...e(l,c),...t(v,m)}}catch(e){Object(s.a)(e)}}return r.a.createElement(n,f({},h.mappedProps,c))}}u.r&&(window.getGlobal=O,document.addEventListener("dblclick",()=>{console.log("GLOBAL CONTAINERS",Object(i.k)(Array.from(p.values()).map(({DEBUG_componentName:e,DEBUG_updates:t})=>({DEBUG_componentName:e,DEBUG_updates:t})),"DEBUG_updates","desc"))}))},function(e,t,n){"use strict";n.d(t,"pb",(function(){return r})),n.d(t,"L",(function(){return u})),n.d(t,"g",(function(){return o})),n.d(t,"h",(function(){return d})),n.d(t,"r",(function(){return c})),n.d(t,"t",(function(){return a})),n.d(t,"N",(function(){return i})),n.d(t,"s",(function(){return s})),n.d(t,"zb",(function(){return f})),n.d(t,"Q",(function(){return l})),n.d(t,"I",(function(){return b})),n.d(t,"J",(function(){return h})),n.d(t,"H",(function(){return m})),n.d(t,"K",(function(){return p})),n.d(t,"X",(function(){return g})),n.d(t,"Y",(function(){return y})),n.d(t,"Z",(function(){return v})),n.d(t,"ab",(function(){return O})),n.d(t,"o",(function(){return j})),n.d(t,"O",(function(){return w})),n.d(t,"jb",(function(){return C})),n.d(t,"fb",(function(){return E})),n.d(t,"gb",(function(){return S})),n.d(t,"hb",(function(){return M})),n.d(t,"k",(function(){return A})),n.d(t,"m",(function(){return k})),n.d(t,"l",(function(){return T})),n.d(t,"Ab",(function(){return N})),n.d(t,"ib",(function(){return P})),n.d(t,"G",(function(){return D})),n.d(t,"cb",(function(){return L})),n.d(t,"bb",(function(){return x})),n.d(t,"qb",(function(){return F})),n.d(t,"Qb",(function(){return B})),n.d(t,"a",(function(){return R})),n.d(t,"f",(function(){return U})),n.d(t,"e",(function(){return _})),n.d(t,"d",(function(){return $})),n.d(t,"w",(function(){return G})),n.d(t,"M",(function(){return W})),n.d(t,"U",(function(){return H})),n.d(t,"y",(function(){return z})),n.d(t,"z",(function(){return K})),n.d(t,"A",(function(){return V})),n.d(t,"wb",(function(){return q})),n.d(t,"vb",(function(){return J})),n.d(t,"lb",(function(){return Q})),n.d(t,"kb",(function(){return Y})),n.d(t,"ob",(function(){return Z})),n.d(t,"nb",(function(){return X})),n.d(t,"mb",(function(){return ee})),n.d(t,"T",(function(){return te})),n.d(t,"c",(function(){return ne})),n.d(t,"B",(function(){return re})),n.d(t,"D",(function(){return ue})),n.d(t,"C",(function(){return oe})),n.d(t,"E",(function(){return de})),n.d(t,"Ib",(function(){return ce})),n.d(t,"Jb",(function(){return ae})),n.d(t,"Cb",(function(){return ie})),n.d(t,"Db",(function(){return se})),n.d(t,"Lb",(function(){return fe})),n.d(t,"Gb",(function(){return le})),n.d(t,"Mb",(function(){return be})),n.d(t,"Nb",(function(){return he})),n.d(t,"Kb",(function(){return me})),n.d(t,"Ob",(function(){return pe})),n.d(t,"Eb",(function(){return ge})),n.d(t,"Fb",(function(){return ye})),n.d(t,"Hb",(function(){return ve})),n.d(t,"db",(function(){return Oe})),n.d(t,"j",(function(){return je})),n.d(t,"eb",(function(){return we})),n.d(t,"Bb",(function(){return Ie})),n.d(t,"n",(function(){return Ce})),n.d(t,"rb",(function(){return Ee})),n.d(t,"sb",(function(){return Se})),n.d(t,"ub",(function(){return Me})),n.d(t,"tb",(function(){return Ae})),n.d(t,"yb",(function(){return ke})),n.d(t,"b",(function(){return Te})),n.d(t,"i",(function(){return Ne})),n.d(t,"W",(function(){return Pe})),n.d(t,"V",(function(){return De})),n.d(t,"xb",(function(){return Le})),n.d(t,"u",(function(){return xe})),n.d(t,"v",(function(){return Fe})),n.d(t,"P",(function(){return Be})),n.d(t,"Pb",(function(){return Re})),n.d(t,"S",(function(){return Ue})),n.d(t,"F",(function(){return _e})),n.d(t,"R",(function(){return $e})),n.d(t,"p",(function(){return Ge})),n.d(t,"q",(function(){return We})),n.d(t,"x",(function(){return He}));const r="Telegram",u=" [Inactive]",o="Telegram WebZ",d="1.8.7",c=!1,a=!1,i=!1,s="Shoot!\nSomething went wrong, please see the error details in Dev Tools Console.",f="user_auth",l="GramJs:sessionId",b=!1,h="tt-global-state",m=30,p=5e3,g=!1,y="tt-media",v="tt-media-avatars",O="tt-media-progressive",j="tt-custom-bg",w="tt-lang-packs-v5",I="undefined"!=typeof window&&window.innerHeight>=900,C=1,E=750,S=I?60:40,M=2*S,A=72,k=I?30:25,T=100,N=42,P=42,D=20,L=30,x=200,F=500,B=20,R=!1,U=0,_=2,$=_,G=16,W=17,H=15,z=1e4,K="editable-message-text",V="editable-message-text-modal",q=1440,J=1150,Q=1275,Y=925,Z=600,X=950,ee=450,te=1e9,ne=100,re=1500,ue=250,oe=600,de=500,ce=(Math.round((ue+oe)/2),new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]),13),ae=11,ie=160,se=120,fe=64,le=48,be=32,he=64,me=64,pe=160,ge=140,ye=80,ve=100,Oe="MEMOJI_STICKER",je="en",we=200,Ie=450,Ce=new Set(["image/png","image/gif","image/jpeg","video/mp4","video/avi","video/quicktime"]),Ee="((ftp|https?):\\/\\/)?((www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,63})\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)",Se="(@[\\w\\d_-]+)",Me=/^(?:https?:\/\/)?(?:t\.me\/)([\d\w_]+)(?:\/([\d]+))?(?:\/([\d]+))?$/gm,Ae=/^(?:https?:\/\/)?(?:t\.me\/joinchat\/)([\d\w_-]+)?$/gm,ke=777e3,Te=0,Ne=1,Pe=10,De=5,Le=2147483646,xe="en",Fe="android",Be=["android","ios","tdesktop","macos"],Re="TelegramTips",Ue=["ar","pt-br","id","it","ko","ms","pl","es","tr"],_e="https://bugs.telegram.org/?tag_ids=41&sort=time",$e="#A2AF8E",Ge="#0F0F0F",We="#0a0a0a8c",He="rgba(90, 110, 70, 0.6)"},function(e,t,n){"use strict";function r(e,t){return e.reduce((e,n)=>(e[n[t]]=n,e),{})}function u(e,t){return Object.keys(e).reduce((n,r,u)=>(n[r]=t(e[r],r,u,e),n),{})}function o(e,t){return t.reduce((t,n)=>(t[n]=e[n],t),{})}function d(e,t){return t.reduce((t,n)=>(e[n]&&(t[n]=e[n]),t),{})}function c(e,t){const n=new Set(t.map(String));return o(e,Object.keys(e).filter(e=>!n.has(e)))}function a(e,t,n="asc"){return e.sort((e,r)=>{if(Array.isArray(t)){const[u,o]=Array.isArray(n)?n:[n,n],[d,c]=t;let a,i;if("function"==typeof d?(a=d(e)||0,i=d(r)||0):"string"==typeof d&&(a=e[d]||0,i=r[d]||0),a!==i)return"asc"===u?a-i:i-a;{let t,n;return"function"==typeof c?(t=c(e)||0,n=c(r)||0):"string"==typeof c&&(t=e[c]||0,n=r[c]||0),"asc"===o?t-n:n-t}}let u,o;return"function"==typeof t?(u=t(e)||0,o=t(r)||0):"string"==typeof t&&(u=e[t]||0,o=r[t]||0),"asc"===n?u-o:o-u})}function i(e){return e.reduce((e,t)=>Array.isArray(t)?e.concat(t):(e.push(t),e),[])}function s(e){return Array.from(new Set(e))}function f(e){return e.filter(Boolean)}function l(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}function b(e,t){return e[0]<=t[t.length-1]&&e[e.length-1]>=t[0]}function h(e,t){return e.filter(e=>t.has(e))}function m(e,t){const n=[];for(let r=0;r(t[n]=p(e[n]),t),{})}function g(e,t){let n=e.length;for(;n--;)if(t(e[n],n,e))return e[n]}n.d(t,"c",(function(){return r})),n.d(t,"i",(function(){return u})),n.d(t,"l",(function(){return o})),n.d(t,"m",(function(){return d})),n.d(t,"j",(function(){return c})),n.d(t,"k",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"o",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"a",(function(){return l})),n.d(t,"b",(function(){return b})),n.d(t,"f",(function(){return h})),n.d(t,"n",(function(){return m})),n.d(t,"d",(function(){return p})),n.d(t,"g",(function(){return g}))},function(e,t,n){"use strict";n.d(t,"ab",(function(){return r.b})),n.d(t,"bb",(function(){return r.c})),n.d(t,"cb",(function(){return r.d})),n.d(t,"Cb",(function(){return r.g})),n.d(t,"sb",(function(){return r.e})),n.d(t,"Bb",(function(){return r.f})),n.d(t,"Jb",(function(){return r.h})),n.d(t,"Z",(function(){return r.a})),n.d(t,"ob",(function(){return u.w})),n.d(t,"nb",(function(){return u.v})),n.d(t,"lb",(function(){return u.t})),n.d(t,"qb",(function(){return u.y})),n.d(t,"mb",(function(){return u.u})),n.d(t,"rb",(function(){return u.z})),n.d(t,"l",(function(){return u.j})),n.d(t,"W",(function(){return u.p})),n.d(t,"k",(function(){return u.i})),n.d(t,"f",(function(){return u.e})),n.d(t,"g",(function(){return u.f})),n.d(t,"e",(function(){return u.d})),n.d(t,"pb",(function(){return u.x})),n.d(t,"jb",(function(){return u.r})),n.d(t,"p",(function(){return u.m})),n.d(t,"Db",(function(){return u.A})),n.d(t,"d",(function(){return u.c})),n.d(t,"b",(function(){return u.a})),n.d(t,"L",(function(){return u.o})),n.d(t,"j",(function(){return u.h})),n.d(t,"i",(function(){return u.g})),n.d(t,"kb",(function(){return u.s})),n.d(t,"Hb",(function(){return u.D})),n.d(t,"c",(function(){return u.b})),n.d(t,"Gb",(function(){return u.C})),n.d(t,"Fb",(function(){return u.B})),n.d(t,"o",(function(){return u.l})),n.d(t,"n",(function(){return u.k})),n.d(t,"ib",(function(){return u.q})),n.d(t,"K",(function(){return u.n})),n.d(t,"Ib",(function(){return u.E})),n.d(t,"C",(function(){return i})),n.d(t,"Eb",(function(){return s})),n.d(t,"G",(function(){return f})),n.d(t,"O",(function(){return l})),n.d(t,"P",(function(){return b})),n.d(t,"x",(function(){return h})),n.d(t,"M",(function(){return m})),n.d(t,"m",(function(){return p})),n.d(t,"yb",(function(){return g})),n.d(t,"zb",(function(){return y})),n.d(t,"tb",(function(){return v})),n.d(t,"gb",(function(){return O})),n.d(t,"Ab",(function(){return j})),n.d(t,"hb",(function(){return w})),n.d(t,"X",(function(){return I})),n.d(t,"Y",(function(){return C})),n.d(t,"xb",(function(){return E})),n.d(t,"ub",(function(){return S})),n.d(t,"u",(function(){return M})),n.d(t,"v",(function(){return T})),n.d(t,"fb",(function(){return N})),n.d(t,"H",(function(){return P})),n.d(t,"Q",(function(){return D})),n.d(t,"J",(function(){return L})),n.d(t,"s",(function(){return x})),n.d(t,"t",(function(){return F})),n.d(t,"N",(function(){return B})),n.d(t,"y",(function(){return R})),n.d(t,"vb",(function(){return U})),n.d(t,"wb",(function(){return _})),n.d(t,"I",(function(){return $})),n.d(t,"B",(function(){return G})),n.d(t,"R",(function(){return W})),n.d(t,"S",(function(){return H})),n.d(t,"T",(function(){return z})),n.d(t,"F",(function(){return K})),n.d(t,"E",(function(){return V})),n.d(t,"D",(function(){return J})),n.d(t,"z",(function(){return Q})),n.d(t,"A",(function(){return Y})),n.d(t,"eb",(function(){return Z})),n.d(t,"h",(function(){return X})),n.d(t,"U",(function(){return ee})),n.d(t,"V",(function(){return te})),n.d(t,"db",(function(){return ne})),n.d(t,"r",(function(){return re})),n.d(t,"w",(function(){return ue})),n.d(t,"q",(function(){return oe})),n.d(t,"a",(function(){return de}));var r=n(35),u=n(36),o=n(8),d=n(2),c=n(65);const a=new RegExp(d.rb,"i");function i(e){const{chatId:t,id:n}=e;return`msg${t}-${n}`}function s(e){const t=e.match(/^msg(-?\d+)-(\d+)/);return{chatId:Number(t[1]),messageId:Number(t[2])}}function f(e){return e.previousLocalId||e.id}function l(e,t,n=!1){const{text:r,photo:u,video:o,audio:d,voice:c,document:a,sticker:i,contact:s,poll:f,invoice:l}=t.content,b=r&&r.text.substr(0,80);return t.groupedId?`${n?"":"🖼 "}${b||e("lng_in_dlg_album")}`:u?`${n?"":"🖼 "}${b||e("AttachPhoto")}`:o?`${n?"":"📹 "}${b||e(o.isGif?"AttachGif":"AttachVideo")}`:i?`${i.emoji||""} ${e("AttachSticker")}`.trim():d?`${n?"":"🎧 "}${M(t)||e("AttachMusic")}`:c?`${n?"":"🎤 "}${b||e("AttachAudio")}`:a?`${n?"":"📎 "}${b||a.fileName}`:s?e("AttachContact"):f?`${n?"":"📊 "}${f.summary.question}`:l?"Invoice":r?b:"The message is not supported on this version of Telegram"}function b(e){const{text:t,sticker:n,photo:r,video:u,audio:o,voice:d,document:c,poll:a,webPage:i,contact:s,invoice:f}=e.content;return t?t.text:n||r||u||o||d||c||s||a||i||f?void 0:"The message is not supported on this version of Telegram"}function h(e){const{text:t,sticker:n,photo:r,video:u,audio:o,voice:d,document:a,poll:i,webPage:s,contact:f}=e.content;return!!(n||u&&u.isRound)||!(!t||r||u||o||d||a||i||s||f)&&(Object(c.a)(t.text)||!1)}function m(e){const{text:t}=e.content;if(t&&t.text.length<=6&&1===h(e))return t.text}function p(e){const{text:t}=e.content;let n;if(t&&t.entities){let e=t.entities.find(e=>e.type===o.ApiMessageEntityTypes.TextUrl);if(e&&(n=e.url.match(a)),!n&&(e=t.entities.find(e=>e.type===o.ApiMessageEntityTypes.Url),e)){const{offset:r,length:u}=e;n=t.text.substring(r,r+u).match(a)}}if(!n&&t&&(n=t.text.match(a)),n)return{url:n[0],domain:n[3]}}function g(e){return e.isOutgoing}function y(e){return Boolean(e.replyToMessageId)}function v(e){return Boolean(e.forwardInfo)}function O(e){return!!e.content.action}function j(e){return e.chatId===d.yb&&E(e)}function w(e){return Boolean(e.senderId)&&e.senderId<0&&g(e)}function I(e,t){return t.id>0?Object(r.c)(t):Object(u.i)(e,t)}function C(e){return e.sendingState?"messageSendingStateFailed"===e.sendingState?"failed":"pending":"succeeded"}function E(e){return e.id>=d.T}function S(e){return e.content.action&&"historyClear"===e.content.action.type}function M(e){const{audio:t,text:n}=e.content;return t&&[t.title,t.performer].filter(Boolean).join(" — ")||n&&n.text}var A=n(6),k=n(60);function T(e){return e.content}function N(e){return Boolean(P(e)||D(e)||R(e)||B(e)||function(e){return e.content.contact}(e)||$(e)||x(e)||F(e)||function(e){return e.content.voice}(e))}function P(e){return e.content.photo}function D(e){return e.content.video}function L(e){const{video:t}=e.content;return t&&t.isRound?t:void 0}function x(e){return e.content.action}function F(e){return e.content.audio}function B(e){return e.content.sticker}function R(e){return e.content.document}function U(e){const t=R(e);return t?"photo"===t.mediaType:void 0}function _(e){const t=R(e);return t?"video"===t.mediaType:void 0}function $(e){return e.content.poll}function G(e){return e.content.invoice}function W(e){return e.content.webPage}function H(e){const t=W(e);return t?t.photo:void 0}function z(e){const t=W(e);if(t)return t.video}function K(e){const t=function(e){const t=P(e)||D(e)||R(e)||B(e)||H(e)||z(e);if(t)return t.thumbnail}(e);return t?t.dataUri:void 0}function V(e,t){const{photo:n,video:r,sticker:u,audio:o,voice:d,document:c}=e.content,a=H(e),s=z(e),f=r||s,l=n||a;if(!(l||f||u||o||d||c))return;const b=i(e);if(f)switch(t){case"micro":case"pictogram":return b+"?size=m";case"inline":return Z(e)?void 0:q(f,b);case"viewerPreview":return b+"?size=m";case"viewerFull":return q(f,b);case"download":return b+"?download"}if(l)switch(t){case"micro":case"pictogram":return b+"?size=m";case"inline":return Z(e)?void 0:b+"?size=x";case"viewerPreview":return b+"?size=x";case"viewerFull":return b+"?size=z"}if(c)switch(t){case"micro":case"pictogram":case"inline":case"viewerPreview":if(!Object(k.c)(c)||Z(e))return;return b+"?size=m";default:return b}if(u)switch(t){case"micro":return;case"pictogram":return b+"?size=m";default:return b}if(o)switch(t){case"micro":case"pictogram":return;case"download":return b+"?download";default:return q(o,b)}if(d)switch(t){case"micro":case"pictogram":return;default:return b}}function q(e,t){return A.h&&A.j?`${t}?fileSize=${e.size}&mimeType=${e.mimeType}`:t}function J(e,t){const{sticker:n,video:r,audio:u,voice:d}=e.content,c=r||z(e);return n&&"inline"===t&&n.isAnimated?o.ApiMediaFormat.Lottie:c&&A.h&&("viewerFull"===t||"inline"===t)?o.ApiMediaFormat.Progressive:u||d?d&&!A.g?o.ApiMediaFormat.BlobUrl:o.ApiMediaFormat.Progressive:o.ApiMediaFormat.BlobUrl}function Q(e){const{photo:t,video:n,document:r}=e.content,u=H(e),o=z(e);if(t||u)return`photo${e.date}.jpeg`;const{fileName:d}=n||o||r||{};return d}function Y(e){const{video:t,document:n}=e.content,r=z(e),{size:u}=t||r||n||{};return u}function Z(e){const{photo:t,video:n,document:r}=e.content;return t&&t.blobUrl||n&&n.blobUrl||r&&r.previewBlobUrl}function X(e,t,n=!1){const r=ue(e,t,n?"media":"inlineMedia");return n?r.reverse():r}function ee(e){return e.sizes.find(e=>"z"===e.type)||e.sizes.find(e=>"y"===e.type)||te(e)}function te(e){return e.sizes.find(e=>"x"===e.type)||e.sizes.find(e=>"m"===e.type)||e.sizes.find(e=>"s"===e.type)||e.thumbnail}function ne(e){if(e.width&&e.height)return e}function re(e,t,n=!1){const r=E(e);return{isUploading:r,isTransferring:r||n,transferProgress:Number(t)}}function ue(e,t,n){let r;switch(n){case"media":r=e=>{const t=D(e);return P(e)||t&&!t.isRound&&!t.isGif};break;case"documents":r=R;break;case"links":r=e=>W(e)||function(e){const{text:t}=e.content,n=t&&t.text.match(a);if(n)return{url:n[0],domain:n[3]}}(e);break;case"audio":r=F;break;case"inlineMedia":r=e=>{const t=D(e);return P(e)||t&&!t.isRound&&!t.isGif||U(e)||_(e)};break;default:return[]}return t.reduce((t,n)=>(e[n]&&r(e[n])&&t.push(n),t),[])}function oe(e){const{audio:t,voice:n,video:r}=T(e),u=t||n||r||z(e);if(u)return u.duration}function de(e,t){return`${e}_${t}`}n(61)},function(e,t,n){"use strict";n.d(t,"c",(function(){return s})),n.d(t,"a",(function(){return f})),n.d(t,"b",(function(){return l}));var r=n(81),u=n.n(r),o=n(2),d=n(33);let c;const a=new Map,i=new Map;function s(e,t){return c||(o.r&&console.log(">>> START LOAD WORKER"),c=new u.a,function(e){c.addEventListener("message",({data:t})=>{if("update"===t.type)e(t.update);else if("methodResponse"===t.type){const e=a.get(t.messageId);e&&(t.error?e.reject(t.error):e.resolve(t.response))}else if("methodCallback"===t.type){const e=a.get(t.messageId);e&&e.callback&&e.callback(...t.callbackArgs)}else if("unhandledError"===t.type)throw t.error})}(e)),b({type:"initApi",args:[t]})}function f(e,...t){if(c)return b({type:"callMethod",name:e,args:t});o.r&&console.warn("API is not initialized")}function l(e){e.isCanceled=!0;const{messageId:t}=i.get(e)||{};t&&c.postMessage({type:"cancelProgress",messageId:t})}function b(e){const t=Object(d.a)(a),n={messageId:t,...e},r={messageId:t},u=new Promise((e,t)=>{Object.assign(r,{resolve:e,reject:t})});if("function"==typeof n.args[1]){const e=n.args.pop();r.callback=e,i.set(e,r)}return a.set(t,r),u.catch(()=>{}).finally(()=>{a.delete(t),r.callback&&i.delete(r.callback)}),c.postMessage(n),u}},function(e,t,n){"use strict";n.d(t,"t",(function(){return o})),n.d(t,"s",(function(){return c})),n.d(t,"r",(function(){return s})),n.d(t,"f",(function(){return f})),n.d(t,"e",(function(){return l})),n.d(t,"b",(function(){return b})),n.d(t,"j",(function(){return h})),n.d(t,"i",(function(){return m})),n.d(t,"n",(function(){return p})),n.d(t,"l",(function(){return g})),n.d(t,"m",(function(){return y})),n.d(t,"o",(function(){return v})),n.d(t,"d",(function(){return O})),n.d(t,"k",(function(){return j})),n.d(t,"h",(function(){return w})),n.d(t,"g",(function(){return I})),n.d(t,"c",(function(){return C})),n.d(t,"p",(function(){return E})),n.d(t,"a",(function(){return S})),n.d(t,"q",(function(){return M}));var r=n(2);let u;function o(){return Boolean(u)}new Promise(e=>{const t=new Image;t.src="data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA";const n=()=>{e(2===t.height)};t.onload=n,t.onerror=n}).then(e=>{u=e});let d=window&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";function c(){return d}function a(e){d=e.matches?"dark":"light"}const i=window.matchMedia("(prefers-color-scheme: dark)");"function"==typeof i.addEventListener?i.addEventListener("change",a):"function"==typeof i.addListener&&i.addListener(a);const s=function(){const{userAgent:e,platform:t}=window.navigator;let n;return-1!==["Macintosh","MacIntel","MacPPC","Mac68K"].indexOf(t)?n="macOS":-1!==["iPhone","iPad","iPod"].indexOf(t)?n="iOS":-1!==["Win32","Win64","Windows","WinCE"].indexOf(t)?n="Windows":/Android/.test(e)?n="Android":/Linux/.test(t)&&(n="Linux"),n}(),f="macOS"===s,l="iOS"===s,b="Android"===s,h=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),m=window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone||document.referrer.includes("android-app://"),p=window.matchMedia("(pointer: coarse)").matches,g=window.innerWidth<=r.ob||window.innerWidth<=r.nb&&window.innerHeight<=r.mb,y=!g&&window.innerWidth<=r.kb,v=navigator.mediaDevices&&"getUserMedia"in navigator.mediaDevices&&(window.AudioContext||window.webkitAudioContext),O=(document.documentElement.style,s&&(f||l)),j="serviceWorker"in navigator,w=j,I=(window,Boolean((new Audio).canPlayType("audio/ogg; codecs=opus"))),C=!r.N&&"filter"in(document.createElement("canvas").getContext("2d")||{}),E=b?"slide-fade":l?"slide-layers":"push-slide",S=window.devicePixelRatio||1,M=!0},function(e,t,n){"use strict";n.d(t,"T",(function(){return Fe})),n.d(t,"pb",(function(){return Be})),n.d(t,"W",(function(){return Re})),n.d(t,"Db",(function(){return Ue})),n.d(t,"Jb",(function(){return a})),n.d(t,"X",(function(){return i})),n.d(t,"g",(function(){return l})),n.d(t,"p",(function(){return b})),n.d(t,"P",(function(){return h})),n.d(t,"O",(function(){return m})),n.d(t,"Cb",(function(){return p})),n.d(t,"o",(function(){return g})),n.d(t,"h",(function(){return y})),n.d(t,"L",(function(){return v})),n.d(t,"d",(function(){return O})),n.d(t,"M",(function(){return j})),n.d(t,"k",(function(){return w})),n.d(t,"j",(function(){return I})),n.d(t,"N",(function(){return C})),n.d(t,"i",(function(){return E})),n.d(t,"r",(function(){return S})),n.d(t,"z",(function(){return D})),n.d(t,"s",(function(){return L})),n.d(t,"n",(function(){return x})),n.d(t,"sb",(function(){return F})),n.d(t,"Z",(function(){return R})),n.d(t,"hb",(function(){return U})),n.d(t,"y",(function(){return _})),n.d(t,"Kb",(function(){return $})),n.d(t,"kb",(function(){return G})),n.d(t,"qb",(function(){return W})),n.d(t,"tb",(function(){return H})),n.d(t,"ob",(function(){return z})),n.d(t,"D",(function(){return K})),n.d(t,"F",(function(){return V})),n.d(t,"C",(function(){return q})),n.d(t,"db",(function(){return J})),n.d(t,"Fb",(function(){return Q})),n.d(t,"G",(function(){return Y})),n.d(t,"nb",(function(){return Z})),n.d(t,"Gb",(function(){return X})),n.d(t,"Hb",(function(){return ee})),n.d(t,"Eb",(function(){return te})),n.d(t,"a",(function(){return ne})),n.d(t,"Y",(function(){return re})),n.d(t,"l",(function(){return ue})),n.d(t,"rb",(function(){return oe})),n.d(t,"E",(function(){return de})),n.d(t,"m",(function(){return ce})),n.d(t,"I",(function(){return ae})),n.d(t,"U",(function(){return ie})),n.d(t,"gb",(function(){return se})),n.d(t,"vb",(function(){return fe})),n.d(t,"K",(function(){return le})),n.d(t,"b",(function(){return be})),n.d(t,"e",(function(){return he})),n.d(t,"f",(function(){return me})),n.d(t,"Ib",(function(){return pe})),n.d(t,"mb",(function(){return ge})),n.d(t,"H",(function(){return ye})),n.d(t,"R",(function(){return ve})),n.d(t,"q",(function(){return Oe})),n.d(t,"S",(function(){return je})),n.d(t,"V",(function(){return we})),n.d(t,"J",(function(){return Ie})),n.d(t,"bb",(function(){return Ce})),n.d(t,"Q",(function(){return Ee})),n.d(t,"ub",(function(){return Se})),n.d(t,"cb",(function(){return Me})),n.d(t,"wb",(function(){return Ae})),n.d(t,"xb",(function(){return ke})),n.d(t,"yb",(function(){return Te})),n.d(t,"u",(function(){return _e})),n.d(t,"B",(function(){return Ne})),n.d(t,"x",(function(){return Pe})),n.d(t,"w",(function(){return De})),n.d(t,"ab",(function(){return Le})),n.d(t,"v",(function(){return xe})),n.d(t,"A",(function(){return A})),n.d(t,"t",(function(){return k})),n.d(t,"zb",(function(){return T})),n.d(t,"Ab",(function(){return N})),n.d(t,"c",(function(){return P})),n.d(t,"ib",(function(){return $e})),n.d(t,"jb",(function(){return Ge})),n.d(t,"lb",(function(){return We})),n.d(t,"Bb",(function(){return He})),n.d(t,"fb",(function(){return s})),n.d(t,"eb",(function(){return f}));var r=n(13),u=n(6),o=n(8),d=n(2),c=n(4);function a(e,t){return e.users.byId[t]}function i(e,t){const n=a(e,t);return n&&n.fullInfo&&n.fullInfo.isBlocked}function s(e){return e.settings.byKey}function f(e){return e.settings.notifyExceptions}function l(e,t){return e.chats.byId[t]}function b(e,t){const n=Object(c.W)(t);return!!n&&a(e,n)}function h(e,t){return t===e.currentUserId}function m(e,t){const n=b(e,t);return n&&Object(c.Bb)(n)}function p(e){return Object.values(e.chats.byId).find(({isSupport:e})=>e)}function g(e,t){if(!Object(c.ob)(t.id)&&!Object(c.mb)(t)&&t.fullInfo)return t.fullInfo.members&&t.fullInfo.members.length!==d.bb?t.fullInfo.members.reduce((t,{userId:n})=>e.users.byId[n]&&Object(c.Cb)(e.users.byId[n])&&n!==e.currentUserId?t+1:t,0):t.fullInfo.onlineCount}function y(e,t){const n=l(e,t),r=n&&Object(c.W)(n),u=r&&a(e,r);if(u&&Object(c.Bb)(u))return u}function v(e,t){const n=l(e,t),r=y(e,t);if(!n||!r)return!1;if(n.lastMessage&&Object(c.ub)(n.lastMessage))return!0;const u=e.messages.byChatId[t];if(!u)return!1;const{listedIds:d}=u.threadsById[o.MAIN_THREAD_ID]||{};return d&&!d.length}function O(e){return Boolean(e.chats.listIds.active)}function j(e,t,n){const{listIds:r}=e.chats;if(n){const e=r[n];return Boolean(e&&e.includes(t))}return Object.values(r).some(e=>e&&e.includes(t))}function w(e,t){const n=l(e,t);if(n&&j(e,t))return n.folderId===d.i?"archived":"active"}function I(e,t){return e.chatFolders.byId[t]}function C(e,t,n=d.b){const{active:r,archived:u}=e.chats.orderedPinnedIds;if(n===d.b)return!!r&&r.includes(t);if(n===d.i)return!!u&&u.includes(t);const{byId:o}=e.chatFolders,{pinnedChatIds:c}=o[n]||{};return!!c&&c.includes(t)}function E(e,t){const n=t.toLowerCase();return Object.values(e.chats.byId).find(e=>e.username&&e.username.toLowerCase()===n)}function S(e){const t=e.chats.listIds.active;if(!t)return 0;const n=e.chats.byId;return t.reduce((t,r)=>{const u=n[r];return u&&u.unreadCount&&!Object(c.Hb)(u,s(e),f(e))?t+u.unreadCount:t},0)}var M=n(3);function A(e){return e.stickers.search}function k(e){return e.gifs.search}function T(e,t){return e.stickers.setsById[t]}function N(e,t){const n=Object.values(e.stickers.setsById);let r=[];return n.forEach(({packs:e})=>{if(!e)return;const n=e[t];n&&(r=r.concat(n))}),r}function P(e,t){const{animatedEmojis:n}=e;if(!n||!n.stickers)return;const r=t.replace("️","");return n.stickers.find(e=>e.emoji===t||e.emoji===r)}function D(e){const{messageLists:t}=e.messages;if(t.length)return t[t.length-1]}function L(e){const{chatId:t}=D(e)||{};return t?l(e,t):void 0}function x(e,t){const n=e.messages.byChatId[t];return n?n.byId:void 0}function F(e,t){const n=e.scheduledMessages.byChatId[t];return n?n.byId:void 0}function B(e,t,n,r){const u=e.messages.byChatId[t];if(!u)return;const o=u.threadsById[n];return o?o[r]:void 0}function R(e,t,n){return B(e,t,n,"listedIds")}function U(e,t,n){return B(e,t,n,"outlyingIds")}function _(e,t,n,r){switch(r){case"thread":return $(e,t,n);case"pinned":return G(e,t);case"scheduled":return W(e,t)}}function $(e,t,n){return B(e,t,n,"viewportIds")}function G(e,t){return B(e,t,o.MAIN_THREAD_ID,"pinnedIds")}function W(e,t){return B(e,t,o.MAIN_THREAD_ID,"scheduledIds")}function H(e,t,n){return B(e,t,n,"scrollOffset")}function z(e,t,n){return B(e,t,n,"replyingToId")}function K(e,t,n){return B(e,t,n,"editingId")}function V(e,t){return B(e,t,o.MAIN_THREAD_ID,"editingScheduledId")}function q(e,t,n){return B(e,t,n,"draft")}function J(e,t,n){return B(e,t,n,"noWebPage")}function Q(e,t,n){return B(e,t,n,"threadInfo")}function Y(e,t,n){return B(e,t,n,"firstMessageId")}function Z(e,t,n){return B(e,t,n,"replyStack")}function X(e,t,n){if(n===o.MAIN_THREAD_ID)return l(e,t);const r=Q(e,t,n);return r?l(e,r.originChannelId||t):void 0}function ee(e,t,n){if(n===o.MAIN_THREAD_ID)return;const r=Q(e,t,n);return r?r.topMessageId:void 0}function te(e,t,n){const r=e.messages.byChatId[t];if(!r)return;const{replyToMessageId:u,replyToTopMessageId:o}=n;return u||o?Object.values(r.threadsById).find(e=>e.threadInfo&&(u&&u===e.threadInfo.topMessageId||o&&o===e.threadInfo.topMessageId)):void 0}function ne(e,t,n){const r=D(e);if(!r)return!1;const{threadInfo:u}=te(e,t,n)||{};return t===r.chatId&&(r.threadId===o.MAIN_THREAD_ID||u&&r.threadId===u.threadId)}function re(e,t,n){const r=$(e,t,n);if(!r||!r.length)return!0;let u;if(n===o.MAIN_THREAD_ID){const n=l(e,t);if(!n||!n.lastMessage)return!0;u=n.lastMessage.id}else{const r=Q(e,t,n);if(!r||!r.lastMessageId)return;u=r.lastMessageId}return u>=d.T&&!ue(e,t,u)||r[r.length-1]>=u}function ue(e,t,n){const r=x(e,t);return r?r[n]:void 0}function oe(e,t,n){const r=F(e,t);return r?r[n]:void 0}function de(e,t,n,r){if("scheduled"===r){const n=V(e,t);return n?oe(e,t,n):void 0}{const r=K(e,t,n);return r?ue(e,t,r):void 0}}function ce(e,t){let n;for(const r of Object.values(e.messages.byChatId)){const{byId:e}=r;if(n=Object.values(e).find(e=>e.content.poll&&e.content.poll.id===t),n)break}return n}function ae(e,t){const{chatId:n,messageId:r}=e.focusedMessage||{};return n===t?r:void 0}function ie(e,t){const n=ae(e,t.chatId);return!!n&&(n===t.id||n===t.previousLocalId)}function se(e,t,n=!1){return function(e,t){const{lastReadOutboxMessageId:n}=l(e,t.chatId)||{};return Object(c.xb)(t)||!n||n0?a(e,n):l(e,n)}function le(e,t){const{forwardInfo:n}=t;if(n)return n.isChannelPost&&n.fromChatId?l(e,n.fromChatId):n.senderUserId?a(e,n.senderUserId):void 0}function be(e,t,n){const{serverTimeOffset:r}=e,u=l(e,t.chatId);if(!u||u.isRestricted)return{};const o=Object(c.ob)(u.id),d=h(e,t.chatId),a=Object(c.lb)(u),i=Object(c.qb)(u),s=Object(c.mb)(u),f=Object(c.Ab)(t),b=Object(c.yb)(t),m=Object(c.gb)(t),{content:p}=t,g=(d||i&&Object(c.p)(u,"pinMessages")||s&&Object(c.p)(u,"editMessages")||Date.now()+1e3*r-1e3*t.date<1728e5)&&!(p.sticker||p.contact||p.poll||p.action||p.audio||p.video&&p.video.isRound)&&!Object(c.tb)(t)&&!t.viaBotId,y=Object(c.d)(u,n)&&!f,v=o||u.isCreator||!s&&!Object(c.Db)(u,"pinMessages")||Object(c.p)(u,"pinMessages");let O=!m&&v,j=!1;const w=G(e,u.id);O&&(j=Boolean(w&&w.includes(t.id)),O=!j);const I=o||b||a||u.isCreator||Object(c.p)(u,"deleteMessages"),C=!o&&!b,E=I&&!f&&(o&&!d||a&&(b||Object(c.p)(u,"deleteMessages")||u.isCreator)),S=!m&&g&&(b||s&&(u.isCreator||Object(c.p)(u,"editMessages"))),M=!m&&!f,A=Boolean(t.content.sticker),k=A&&function(e,t){const{stickers:n}=e.stickers.favorite;return n&&n.some(({id:e})=>e===t.id)}(e,t.content.sticker),T=!m&&A&&!k,N=!m&&k,P=!m,D=!m&&(s||i),L=!m;return{noOptions:[y,S,O,j,I,E,M,T,N,P,D,L].every(e=>!e),canReply:y,canEdit:S,canPin:O,canUnpin:j,canDelete:I,canReport:C,canDeleteForAll:E,canForward:M,canFaveSticker:T,canUnfaveSticker:N,canCopy:P,canCopyLink:D,canSelect:L}}function he(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=D(e)||{},u=n&&x(e,n);if(!u||!t||!r)return{};const o=t.map(t=>u[t]&&be(e,u[t],r)).filter(Boolean);return{canDelete:o.every(e=>e.canDelete),canDeleteForAll:o.every(e=>e.canDeleteForAll)}}function me(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=D(e)||{},u=n&&x(e,n);if(!u||!t||!r)return!1;return t.map(t=>u[t]&&be(e,u[t],r)).filter(Boolean).every(e=>e.canReport)}function pe(e,t){const n=e.fileUploads.byMessageLocalId[t.previousLocalId||t.id];return n?n.progress:void 0}function ge(e,t,n){if(n===o.MAIN_THREAD_ID){const n=l(e,t);if(!n)return;if(!n.lastReadInboxMessageId)return;return n.lastMessage?Object(c.xb)(n.lastMessage)?n.lastMessage.id:Math.min(n.lastMessage.id,n.lastReadInboxMessageId):n.lastReadInboxMessageId}{const r=Q(e,t,n);if(!r)return;return r.lastReadInboxMessageId?Math.min(r.lastReadInboxMessageId,r.lastMessageId||1/0):r.topMessageId}}function ye(e,t,n){const r=l(e,t);if(n===o.MAIN_THREAD_ID){if(!r)return}else{const r=Q(e,t,n);if(!r||r.lastMessageId===r.lastReadInboxMessageId)return}const u=U(e,t,n),d=R(e,t,n),c=x(e,t);if(!c||!u&&!d)return;const a=ge(e,t,n);if(a||!r||!r.isNotJoined){if(u){const e=a?u.find(e=>e>a&&c[e]&&(!c[e].isOutgoing||c[e].isFromScheduled)):u[0];if(e)return e}if(d){const e=a?d.find(e=>e>a&&c[e]&&(!c[e].isOutgoing||c[e].isFromScheduled)):d[0];if(e)return e}}}function ve(e){const{forwardMessages:t}=e;return Boolean(t.isModalShown)}function Oe(e,t){const n=Object.values(e.chats.byId).find(e=>Object(c.rb)(e)&&e.lastMessage&&e.lastMessage.id===t);if(n)return n.id;const{byChatId:r}=e.messages;return Number(Object.keys(r).find(n=>{const u=l(e,Number(n));return u&&Object(c.rb)(u)&&r[u.id].byId[t]}))}function je(e){const{selectedMessages:t}=e;return Boolean(t)}function we(e,t){const{messageIds:n}=e.selectedMessages||{};return!!n&&n.includes(t)}function Ie(e,t,n){const r=x(e,t);if(r)return Object.values(r).filter(e=>e.groupedId===n&&e.forwardInfo).map(({forwardInfo:e})=>e.fromMessageId)}function Ce(e,t,n){const r=x(e,t);if(r)return Object.keys(r).map(Number).filter(e=>r[e].groupedId===n)}function Ee(e,t,n){const{messageIds:r}=e.selectedMessages||{};if(!r)return!1;const u=Ce(e,t,n);return u&&u.every(e=>r.includes(e))}function Se(e){const{messageIds:t}=e.selectedMessages||{};return t?t.length:0}function Me(e,t){const n=l(e,t);if(!n)return;if(!m(e,n))return;const r=x(e,t),u=$(e,t,o.MAIN_THREAD_ID);if(!r||!u)return;const d=Object(M.g)(u,e=>!r[e].isOutgoing&&Boolean(r[e].keyboardButtons)),c=Object(M.g)(u,e=>Boolean(r[e].shouldHideKeyboardButtons));return d&&c&&c>d?void 0:d?r[d]:void 0}function Ae(e,t,n,r){const{shouldAutoDownloadMediaFromContacts:u,shouldAutoDownloadMediaInPrivateChats:o,shouldAutoDownloadMediaInGroups:d,shouldAutoDownloadMediaInChannels:a}=e.settings.byKey;return Boolean(o&&Object(c.ob)(n.id)||d&&Object(c.nb)(n)||a&&Object(c.mb)(n)||u&&r&&(r.id===e.currentUserId||function(e,t){return e.contactList&&e.contactList.userIds.includes(t.id)}(e,r)))}function ke(e,t){const n=Object(c.Q)(t)||Object(c.T)(t);if(!n)return;const{shouldAutoPlayVideos:r,shouldAutoPlayGifs:u}=e.settings.byKey,o=n.isGif||n.isRound;return r&&!o||u&&o}function Te(e){return e.settings.byKey.shouldLoopStickers}function Ne(e){const{chatId:t,threadId:n}=D(e)||{};if(!t||!n)return;const r=Object(c.a)(t,n),u=e.localTextSearch.byChatThreadKey[r];return u&&u.isActive?u:void 0}function Pe(e){const{byChatId:t}=e.localMediaSearch,{chatId:n}=D(e)||{},r=e.users.selectedId;return r&&t[r]?r:n}function De(e){const t=Pe(e);if(t)return e.localMediaSearch.byChatId[t]}function Le(e,t){return e.management.byChatId[t]}function xe(e){const{chatId:t,threadId:n}=D(e)||{};if(!t||!n)return;if(Object(c.ob)(t))return"user";const r=l(e,t);return r?Object(c.nb)(r)?"group":"channel":void 0}function Fe(e){const{mediaViewer:t}=e;return Boolean(t.messageId||t.avatarOwnerId)}function Be(e){const{users:t,isChatInfoShown:n,newChatMembersProgress:o}=e,d=o!==r.i.Closed,c=function(e){const{pollResults:t}=e;return Boolean(t.messageId)}(e),a=Boolean(!u.l&&Ne(e)),i=function(e){const{chatId:t,threadId:n}=D(e)||{};if(!t||!n)return;const r=e.management.byChatId[t];return r&&r.isActive?r:void 0}(e),s=void 0!==A(e).query,f=void 0!==k(e).query,{chatId:l}=D(e)||{},b=t.selectedId,h=O(e),m=Boolean(b&&h),p=Boolean(l&&h)&&n;return c?r.m.PollResults:a?r.m.Search:i?r.m.Management:s?r.m.StickerSearch:f?r.m.GifSearch:d?r.m.AddingMembers:m?r.m.UserInfo:p?r.m.ChatInfo:void 0}function Re(e){return void 0!==Be(e)}function Ue(e){const{theme:t,shouldUseSystemTheme:n}=e.settings.byKey;return n?Object(u.s)():t}function _e(e){return e.globalSearch.query}function $e(e){return e.payment.messageId}function Ge(e){return e.payment.formId}function We(e){return e.payment.nativeParams?e.payment.nativeParams.publishableKey:void 0}function He(e){return e.payment.stripeCredentials}},function(e,t,n){"use strict";var r=n(69);n.o(r,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return r.ApiMediaFormat})),n.o(r,"ApiMessageEntityTypes")&&n.d(t,"ApiMessageEntityTypes",(function(){return r.ApiMessageEntityTypes})),n.o(r,"MAIN_THREAD_ID")&&n.d(t,"MAIN_THREAD_ID",(function(){return r.MAIN_THREAD_ID})),n.o(r,"MESSAGE_DELETED")&&n.d(t,"MESSAGE_DELETED",(function(){return r.MESSAGE_DELETED}));var u=n(70);n.o(u,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return u.ApiMediaFormat})),n.o(u,"ApiMessageEntityTypes")&&n.d(t,"ApiMessageEntityTypes",(function(){return u.ApiMessageEntityTypes})),n.o(u,"MAIN_THREAD_ID")&&n.d(t,"MAIN_THREAD_ID",(function(){return u.MAIN_THREAD_ID})),n.o(u,"MESSAGE_DELETED")&&n.d(t,"MESSAGE_DELETED",(function(){return u.MESSAGE_DELETED}));var o=n(71);n.d(t,"ApiMessageEntityTypes",(function(){return o.a})),n.d(t,"MAIN_THREAD_ID",(function(){return o.b})),n.d(t,"MESSAGE_DELETED",(function(){return o.c}));var d=n(72);n.o(d,"ApiMediaFormat")&&n.d(t,"ApiMediaFormat",(function(){return d.ApiMediaFormat}));var c=n(73);n.d(t,"ApiMediaFormat",(function(){return c.a}));n(74),n(75),n(76),n(77)},function(e,t,n){"use strict";t.a=(...e)=>e.filter(Boolean).join(" ")},function(e,t,n){"use strict";function r(e,t,n=!0,r=!0){let u;return(...o)=>{u?(clearTimeout(u),u=void 0):n&&e(...o),u=self.setTimeout(()=>{r&&e(...o),u=void 0},t)}}function u(e,t,n=!0){let r,u,o;return(...d)=>{u=!0,o=d,r||(n&&(u=!1,e(...o)),r=self.setInterval(()=>{if(!u)return self.clearInterval(r),void(r=void 0);u=!1,e(...o)},t))}}function o(e){return c(m,e)}function d(e){return c(p,e)}function c(e,t){let n,r=!1;return(...u)=>{n=u,r||(r=!0,e(()=>{r=!1,t(...n)}))}}function a(e){Promise.resolve().then(e)}function i(e){self.requestIdleCallback?self.requestIdleCallback(e):a(e)}n.d(t,"a",(function(){return r})),n.d(t,"h",(function(){return u})),n.d(t,"j",(function(){return o})),n.d(t,"i",(function(){return d})),n.d(t,"e",(function(){return a})),n.d(t,"d",(function(){return i})),n.d(t,"f",(function(){return s})),n.d(t,"g",(function(){return f})),n.d(t,"b",(function(){return m})),n.d(t,"c",(function(){return g}));const s=e=>new Promise(t=>{setTimeout(()=>t(),e)});function f(){return new Promise(e=>{m(e)})}let l,b,h;function m(e,t=!1){l?t?b.push(e):l.push(e):(l=t?[]:[e],b=t?[e]:[],requestAnimationFrame(()=>{const e=l,t=b;l=void 0,b=void 0,t.forEach(e=>e()),e.forEach(e=>e())}))}function p(e){m(e,!0)}function g(e,t=!1){return h||(h=[],self.addEventListener("beforeunload",()=>{h.forEach(e=>e())})),t?h.push(e):h.unshift(e),()=>{h=h.filter(t=>t!==e)}}},function(e,t,n){"use strict";n.d(t,"s",(function(){return o})),n.d(t,"J",(function(){return d})),n.d(t,"t",(function(){return c})),n.d(t,"I",(function(){return i})),n.d(t,"N",(function(){return s})),n.d(t,"c",(function(){return f})),n.d(t,"L",(function(){return l})),n.d(t,"K",(function(){return b})),n.d(t,"O",(function(){return p})),n.d(t,"y",(function(){return v})),n.d(t,"d",(function(){return O})),n.d(t,"b",(function(){return j})),n.d(t,"M",(function(){return w})),n.d(t,"fb",(function(){return I})),n.d(t,"k",(function(){return C})),n.d(t,"l",(function(){return E})),n.d(t,"W",(function(){return S})),n.d(t,"eb",(function(){return M})),n.d(t,"h",(function(){return k})),n.d(t,"A",(function(){return T})),n.d(t,"lb",(function(){return N})),n.d(t,"mb",(function(){return P})),n.d(t,"v",(function(){return D})),n.d(t,"Q",(function(){return L})),n.d(t,"P",(function(){return x})),n.d(t,"n",(function(){return F})),n.d(t,"H",(function(){return B})),n.d(t,"o",(function(){return R})),n.d(t,"jb",(function(){return U})),n.d(t,"ib",(function(){return _})),n.d(t,"R",(function(){return $})),n.d(t,"r",(function(){return G})),n.d(t,"kb",(function(){return W})),n.d(t,"p",(function(){return H})),n.d(t,"z",(function(){return K})),n.d(t,"ob",(function(){return J})),n.d(t,"rb",(function(){return Q})),n.d(t,"g",(function(){return Y})),n.d(t,"gb",(function(){return Z})),n.d(t,"m",(function(){return X})),n.d(t,"pb",(function(){return ee})),n.d(t,"qb",(function(){return te})),n.d(t,"S",(function(){return ue})),n.d(t,"T",(function(){return oe})),n.d(t,"V",(function(){return de})),n.d(t,"U",(function(){return ce})),n.d(t,"Z",(function(){return se})),n.d(t,"u",(function(){return fe})),n.d(t,"ab",(function(){return le})),n.d(t,"Y",(function(){return he})),n.d(t,"X",(function(){return me})),n.d(t,"cb",(function(){return ge})),n.d(t,"bb",(function(){return ye})),n.d(t,"w",(function(){return ve})),n.d(t,"x",(function(){return Oe})),n.d(t,"f",(function(){return je})),n.d(t,"e",(function(){return we})),n.d(t,"db",(function(){return Ie})),n.d(t,"a",(function(){return Ce})),n.d(t,"q",(function(){return Ee})),n.d(t,"nb",(function(){return Se})),n.d(t,"hb",(function(){return Me})),n.d(t,"F",(function(){return Ae})),n.d(t,"D",(function(){return ke})),n.d(t,"B",(function(){return Te})),n.d(t,"G",(function(){return Ne})),n.d(t,"C",(function(){return Pe})),n.d(t,"E",(function(){return De})),n.d(t,"i",(function(){return Le})),n.d(t,"j",(function(){return xe}));var r=n(2),u=n(3);function o(e,t,n){return{...e,chats:{...e.chats,listIds:{...e.chats.listIds,[t]:n}}}}function d(e,t,n){const{[t]:r}=e.chats.listIds,u=r&&r.length?n.filter(e=>!r.includes(e)):n;return r&&!u.length?e:o(e,t,[...r||[],...u])}function c(e,t){return{...e,chats:{...e.chats,byId:t}}}function a(e,t,n,r){const{byId:o}=e.chats,d=o[t],c=n.isMin&&d&&!d.isMin,a={...d,...c?Object(u.j)(n,["isMin","accessHash"]):n,...r&&{photos:[r,...d.photos||[]]}};return a.id&&a.type,a}function i(e,t,n,r){const{byId:u}=e.chats;return c(e,{...u,[t]:a(e,t,n,r)})}function s(e,t){const n=Object.keys(t).map(Number).reduce((n,r)=>{const u=a(e,r,t[r]);return u&&(n[r]=u),n},{});return e=c(e,{...e.chats.byId,...n})}function f(e,t){const{byId:n}=e.chats;let r=!1;const u=Object.keys(t).map(Number).reduce((u,o)=>{if(!n[o]||n[o].isMin&&!t[o].isMin){const n=a(e,o,t[o]);n&&(u[o]=n,r||(r=!0))}return u},{});return r&&(e=c(e,{...e.chats.byId,...u})),e}function l(e,t,n){const u=n===r.i?"archived":"active";let o=e.chats.listIds;return Object.keys(o).forEach(e=>{const n=o[e]||[];e!==u||n.includes(t)?e!==u&&n.includes(t)&&(o={...o,[e]:n.filter(e=>e!==t)}):o={...o,[e]:[...n,t]}}),e=i(e={...e,chats:{...e.chats,listIds:o}},t,{folderId:n||void 0})}function b(e,t,n){const r="active"===t?"all":"archived";return{...e,chats:{...e.chats,...n.orderedPinnedIds&&{orderedPinnedIds:{...e.chats.orderedPinnedIds,[t]:n.orderedPinnedIds}},totalCount:{...e.chats.totalCount,[r]:n.totalChatCount},isFullyLoaded:{...e.chats.isFullyLoaded,[t]:!1}}}}var h=n(8),m=n(7);function p(e,t,n=h.MAIN_THREAD_ID,u="thread",o){const{messageLists:d}=e.messages;let c=d;if(o||r.N)c=t?[{chatId:t,threadId:n,type:u}]:[];else if(t){const e=d[d.length-1];e&&e.chatId===t&&e.threadId===n&&e.type===u||(c=e&&-1===e.chatId?[...d.slice(0,-1),{chatId:t,threadId:n,type:u}]:[...d,{chatId:t,threadId:n,type:u}])}else c=d.slice(0,-1);return{...e,messages:{...e.messages,messageLists:c}}}function g(e,t,n){return y(e,t,{byId:n})}function y(e,t,n){const r=e.messages.byChatId[t]||{byId:{},threadsById:{}};return{...e,messages:{...e.messages,byChatId:{...e.messages.byChatId,[t]:{...r,...n}}}}}function v(e,t,n,r,u){return function(e,t,n,r){const u=e.messages.byChatId[t];return y(e,t,{threadsById:{...u&&u.threadsById,[n]:{...u&&u.threadsById[n],...r}}})}(e,t,n,{[r]:u})}function O(e,t){const n=t.reduce((e,t)=>(e[t.chatId]||(e[t.chatId]={}),e[t.chatId][t.id]=t,e),{});return Object.keys(n).map(Number).forEach(t=>{e=j(e,t,n[t])}),e}function j(e,t,n){const r=Object(m.n)(e,t);return r&&Object.keys(n).every(e=>Boolean(r[Number(e)]))?e:g(e,t,{...n,...r})}function w(e,t,n,r){const u=Object(m.n)(e,t)||{},o={...u[n],...r};return o.id?g(e,t,{...u,[n]:o}):e}function I(e,t,n,r){const u=Object(m.sb)(e,t)||{},o={...u[n],...r};return o.id?D(e,t,{...u,[n]:o},void 0):e}function C(e,t,n){const r=Object(m.n)(e,t);if(!r)return e;const o=Object(u.j)(r,n),d=Object.values(Object(u.m)(r,n)).filter(({forwardInfo:e})=>e&&e.isLinkedChannelPost);if(Object.keys(e.messages.byChatId[t].threadsById).map(Number).forEach(r=>{const u=Object(m.Fb)(e,t,r);let o=Object(m.Z)(e,t,r),d=Object(m.hb)(e,t,r),c=Object(m.Kb)(e,t,r),a=Object(m.kb)(e,t),i=u?u.messagesCount:void 0;n.forEach(e=>{o&&o.includes(e)&&(o=o.filter(t=>t!==e),void 0!==i&&(i-=1)),d&&d.includes(e)&&(d=d.filter(t=>t!==e)),c&&c.includes(e)&&(c=c.filter(t=>t!==e)),a&&a.includes(e)&&(a=a.filter(t=>t!==e))}),e=v(e,t,r,"listedIds",o),e=v(e,t,r,"outlyingIds",d),e=v(e,t,r,"viewportIds",c),e=v(e,t,r,"pinnedIds",a),u&&void 0!==i&&(e=v(e,t,r,"threadInfo",{...u,messagesCount:i}))}),d.length){const n=Object(m.z)(e),r=n&&n.chatId===t&&"thread"===n.type,u=n&&n.threadId;d.forEach(n=>{const{fromChatId:o,fromMessageId:d}=n.forwardInfo,c=Object(m.l)(e,o,d);r&&u===d&&(e=p(e,t)),c&&(e=w(e,o,d,{threadInfo:void 0}))})}return e=g(e,t,o)}function E(e,t,n){const r=Object(m.sb)(e,t);if(!r)return e;const o=Object(u.j)(r,n);let d=Object(m.qb)(e,t);return d&&(n.forEach(e=>{d.includes(e)&&(d=d.filter(t=>t!==e))}),e=v(e,t,h.MAIN_THREAD_ID,"scheduledIds",d)),e=D(e,t,o,void 0)}function S(e,t,n,r){const u=Object(m.Z)(e,t,n),o=u&&u.length?r.filter(e=>!u.includes(e)):r;return u&&!o.length?e:v(e,t,n,"listedIds",A([...u||[],...o]))}function M(e,t,n,r){const u=Object(m.hb)(e,t,n),o=u&&u.length?r.filter(e=>!u.includes(e)):r;return u&&!o.length?e:v(e,t,n,"outlyingIds",A([...u||[],...o]))}function A(e){return e.sort((e,t)=>e-t)}function k(e,t,n,u){const o=Object(m.Kb)(e,t,n)||[];if(o.includes(u))return e;return v(e,t,n,"viewportIds",A([...o.length{e=N(e,t.chatId,t.threadId,t)}),e}function D(e,t,n,r){return function(e,t,n){const r=e.scheduledMessages.byChatId[t]||{byId:{},hash:0};return{...e,scheduledMessages:{byChatId:{...e.scheduledMessages.byChatId,[t]:{...r,...n}}}}}(e,t,{byId:n,hash:r})}function L(e,t,n,r=!1){return{...e,focusedMessage:{...e.focusedMessage,chatId:t,messageId:n,noHighlight:r}}}function x(e,t){return{...e,focusedMessage:{...e.focusedMessage,direction:t}}}function F(e,t,n){return{...e,selectedMessages:{chatId:t,messageIds:n?Array.prototype.concat([],n):[]}}}function B(e,t,n,r,o,d,c,a=!1){const{selectedMessages:i}=e;d&&(c=Object(m.bb)(e,t,d));const s=c||[o];if(!i)return F(e,t,s);const{messageIds:f}=i;let l;const b=s.filter(e=>!f.includes(e));if(b&&!b.length)l=f.filter(e=>!s.includes(e));else if(a&&f.length){const d=Object(m.y)(e,t,n,r),c=d.indexOf(f[f.length-1]),a=d.indexOf(o),i=Math.min(c,a),s=Math.max(c,a),b=d.slice(i,s+1);l=Object(u.o)([...f,...b])}else l=[...f,...b];return l.length?{...e,selectedMessages:{...i,messageIds:l}}:R(e)}function R(e){return{...e,selectedMessages:void 0}}function U(e,t,n,r,o){const d=r.map(t=>{const n=e.stickers.setsById[t.id];return n?{...n,...t}:t});return{...e,stickers:{...e.stickers,setsById:{...e.stickers.setsById,...Object(u.c)(d,"id")},[t]:{...e.stickers[t],hash:n,..."search"===t?{resultIds:o}:{setIds:r.map(({id:e})=>e)}}}}}function _(e,t,n){const r=e.stickers.setsById[t]||{};return{...e,stickers:{...e.stickers,setsById:{...e.stickers.setsById,[t]:{...r,...n}}}}}function $(e,t,n,r){const{results:u}=e.gifs.search;let o;if(t||!u)o=n;else{const e=new Set(u.map(e=>e.id));o=[...u,...n.filter(t=>!e.has(t.id))]}return{...e,gifs:{...e.gifs,search:{...e.gifs.search,offset:r,results:o}}}}function G(e,t){return{...e,animatedEmojis:t}}function W(e,t,n,r){const o=[...Object(m.Ab)(e,t),...n||[]],d=Object(u.o)(o.map(({id:e})=>e)),c=Object(u.c)(o,"id"),a=d.map(e=>c[e]);return{...e,stickers:{...e.stickers,forEmoji:{emoji:t,stickers:a,hash:r}}}}function H(e){const{emoji:t,stickers:n,hash:r}=e.stickers.forEmoji||{};return t?W(e,t,n,r):e}var z=n(51);function K(e,t){return{...e,users:{...e.users,byId:t}}}function V(e,t,n){const{byId:r}=e.users,o=r[t],d=n.isMin&&o&&!o.isMin,c={...o,...d?Object(u.j)(n,["isMin","accessHash"]):n};return c.id&&c.type?c:o}function q(e,t){const{hash:n,userIds:r}=e.contactList||{};if(!r)return e;const u=t.filter(e=>e&&e.isContact&&!r.includes(e.id)).map(e=>e.id);return 0===u.length?e:{...e,contactList:{hash:n||0,userIds:[...u,...r]}}}function J(e,t,n){const{byId:r}=e.users,u=V(e,t,n);return K(e=q(e,[u]),{...r,[t]:u})}function Q(e,t){const n=Object.keys(t).map(Number).reduce((n,r)=>{const u=V(e,r,t[r]);return u&&(n[r]=u),n},{});return e=K(e=q(e,Object.values(n)),{...e.users.byId,...n})}function Y(e,t){const{byId:n}=e.users;let r=!1;const u=Object.keys(t).map(Number).reduce((u,o)=>{if(!n[o]||n[o].isMin&&!t[o].isMin){const n=V(e,o,t[o]);n&&(u[o]=n,r||(r=!0))}return u},{});return r&&(e=q(e=K(e,{...e.users.byId,...u}),Object.values(u))),e}function Z(e,t){return e.users.selectedId===t?e:{...e,users:{...e.users,selectedId:t}}}function X(e,t){const{byId:n}=e.users,{hash:r,userIds:u}=e.contactList||{};return delete n[t],K(e={...e,contactList:{hash:r||0,userIds:u?u.filter(e=>e!==t):z.a}},n)}function ee(e,t){return{...e,userSearch:{...e.userSearch,...t}}}function te(e,t){return ee(e,{fetchingStatus:t})}function ne(e,t,n){const{byId:r}=e.users,u=r[t];return u&&u.fullInfo?J(e,t,{...u,fullInfo:{...u.fullInfo,isBlocked:n}}):e}const re=e=>`${e.chatId}_${e.id}`;function ue(e,t){return{...e,globalSearch:{...e.globalSearch,...t}}}function oe(e,t){return ue(e,{currentContent:t})}function de(e,t,n,r,o){const{resultsByType:d}=e.globalSearch||{},c=t.reduce((e,t)=>(e[re(t)]=t,e),{}),a=d&&d[r]?d[r].foundIds:void 0;if(void 0!==a&&Object.keys(c).every(e=>a.includes(re(c[e]))))return ce(e,{messages:!1});const i=a||[],s=t.map(e=>re(e)),f=Array.prototype.concat(i,s),l=Object(u.a)(i,f)?i:f;return ue(e=ce(e,{messages:!1}),{resultsByType:{...(e.globalSearch||{}).resultsByType,[r]:{totalCount:n,nextOffsetId:o,foundIds:l}}})}function ce(e,t){return ue(e,{fetchingStatus:{...e.globalSearch.fetchingStatus,...t}})}var ae=n(4);function ie(e,t,n){return{...e,localTextSearch:{byChatThreadKey:{...e.localTextSearch.byChatThreadKey,[t]:n}}}}function se(e,t,n,r,u){const o=Object(ae.a)(t,n);return ie(e,o,{...e.localTextSearch.byChatThreadKey[o],isActive:r,query:u})}function fe(e,t,n,r,u,o){const d=Object(ae.a)(t,n);return ie(e,d,{...e.localTextSearch.byChatThreadKey[d],results:{foundIds:r,totalCount:u,nextOffsetId:o}})}function le(e,t,n,r,o,d){const c=Object(ae.a)(t,n),{results:a}=e.localTextSearch.byChatThreadKey[c]||{},i=a&&a.foundIds||[],s=pe(Object(u.o)(Array.prototype.concat(i,r)));return fe(e,t,n,Object(u.a)(i,s)?i:s,o,d)}function be(e,t,n){return{...e,localMediaSearch:{byChatId:{...e.localMediaSearch.byChatId,[t]:n}}}}function he(e,t,n){return be(e,t,{...e.localMediaSearch.byChatId[t],currentType:n})}function me(e,t,n,r,o,d){const{resultsByType:c}=e.localMediaSearch.byChatId[t]||{},a=c&&c[n]?c[n].foundIds:[],i=pe(Object(u.o)(Array.prototype.concat(a,r)));return function(e,t,n,r,u,o){return be(e,t,{...e.localMediaSearch.byChatId[t],resultsByType:{...(e.localMediaSearch.byChatId[t]||{}).resultsByType,[n]:{foundIds:r,totalCount:u,nextOffsetId:o}}})}(e,t,n,Object(u.a)(a,i)?a:i,o,d)}function pe(e){return e.sort((e,t)=>e-t)}function ge(e,t){return{...e,management:{...e.management,progress:t}}}function ye(e,t,n){return{...e,management:{...e.management,byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t]||{},...n}}}}}function ve(e,t){return{...e,settings:{...e.settings,byKey:{...e.settings.byKey,...t}}}}function Oe(e,t,n){return{...e,settings:{...e.settings,themes:{...e.settings.themes,[t]:{...e.settings.themes[t]||{},...n}}}}}function je(e,t){return t.forEach(t=>{const{chatId:n,...r}=t;e=we(e,n,r)}),e}function we(e,t,n){return{...e,settings:{...e.settings,notifyExceptions:{...e.settings.notifyExceptions,[t]:n}}}}function Ie(e,t,n,r){switch(t){case"contact":return ve(e,{...void 0!==n&&{hasPrivateChatsNotifications:!n},...void 0!==r&&{hasPrivateChatsMessagePreview:r}});case"group":return ve(e,{...void 0!==n&&{hasGroupNotifications:!n},...void 0!==r&&{hasGroupMessagePreview:r}});case"broadcast":return ve(e,{...void 0!==n&&{hasBroadcastNotifications:!n},...void 0!==r&&{hasBroadcastMessagePreview:r}});default:return}}function Ce(e,t){return e=ne(e,t,!0),{...e,blocked:{...e.blocked,ids:[t,...e.blocked.ids],totalCount:e.blocked.totalCount+1}}}function Ee(e,t){return e=ne(e,t,!1),{...e,blocked:{...e.blocked,ids:e.blocked.ids.filter(e=>e!==t),totalCount:e.blocked.totalCount-1}}}function Se(e,t){return{...e,twoFaSettings:{...e.twoFaSettings,...t}}}function Me(e,t){return{...e,payment:{...e.payment,shippingOptions:t}}}function Ae(e,t){return{...e,payment:{...e.payment,formId:t}}}function ke(e,t){return{...e,payment:{...e.payment,step:t}}}function Te(e,t){if(!t.content||!t.content.invoice)return e;const{title:n,text:r,description:u,photoUrl:o}=t.content.invoice;return{...e,payment:{...e.payment,invoiceContent:{title:n,text:r,description:u,photoUrl:o}}}}function Ne(e,t){return{...e,payment:{...e.payment,stripeCredentials:{...t}}}}function Pe(e,t){return{...e,payment:{...e.payment,...t}}}function De(e,t,n){if(!t||!n)return{...e,payment:{...e.payment,receipt:void 0}};const{invoice:r}=n.content,{photoUrl:u,text:o,title:d}=r||{};return{...e,payment:{...e.payment,receipt:{...t,photoUrl:u,text:o,title:d}}}}function Le(e){return{...e,payment:{}}}function xe(e){return{...e,payment:{...e.payment,isPaymentModalOpen:!1}}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"c",(function(){return o})),n.d(t,"d",(function(){return d})),n.d(t,"b",(function(){return c}));const r=self.caches;let u;async function o(e,t,n){if(r)try{const o=new Request(t.replace(/:/g,"_")),d=await r.open(e),c=await d.match(o);if(!c)return;switch(n){case u.Text:return await c.text();case u.Blob:{const e=await c.blob();if("sticker"===t.substr(0,7))return new Blob([e],{type:"image/webp"});if(!e.type){const t=c.headers.get("Content-Type");if(t)return new Blob([e],{type:t})}return e}case u.Json:return await c.json();default:return}}catch(e){return void console.warn(e)}}async function d(e,t,n){if(r)try{const u="string"==typeof n||n instanceof Blob?n:JSON.stringify(n),o=new Request(t.replace(/:/g,"_")),d=new Response(u),c=await r.open(e);return await c.put(o,d)}catch(e){return void console.warn(e)}}async function c(e){try{if(!r)return;return await r.delete(e)}catch(e){return void console.warn(e)}}!function(e){e[e.Text=0]="Text",e[e.Blob=1]="Blob",e[e.Json=2]="Json"}(u||(u={}))},function(e,t,n){"use strict";let r,u,o,d,c,a,i,s,f,l,b,h,m;n.d(t,"e",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"n",(function(){return o})),n.d(t,"d",(function(){return d})),n.d(t,"c",(function(){return c})),n.d(t,"m",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"a",(function(){return s})),n.d(t,"k",(function(){return f})),n.d(t,"f",(function(){return l})),n.d(t,"i",(function(){return b})),n.d(t,"l",(function(){return h})),n.d(t,"j",(function(){return m})),n.d(t,"o",(function(){return p})),n.d(t,"g",(function(){return g})),function(e){e[e.Backwards=0]="Backwards",e[e.Forwards=1]="Forwards",e[e.Around=2]="Around"}(r||(r={})),function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Static=2]="Static"}(u||(u={})),function(e){e[e.Main=0]="Main",e[e.EditProfile=1]="EditProfile",e[e.Notifications=2]="Notifications",e[e.Language=3]="Language",e[e.General=4]="General",e[e.GeneralChatBackground=5]="GeneralChatBackground",e[e.GeneralChatBackgroundColor=6]="GeneralChatBackgroundColor",e[e.Privacy=7]="Privacy",e[e.PrivacyPhoneNumber=8]="PrivacyPhoneNumber",e[e.PrivacyLastSeen=9]="PrivacyLastSeen",e[e.PrivacyProfilePhoto=10]="PrivacyProfilePhoto",e[e.PrivacyForwarding=11]="PrivacyForwarding",e[e.PrivacyGroupChats=12]="PrivacyGroupChats",e[e.PrivacyPhoneNumberAllowedContacts=13]="PrivacyPhoneNumberAllowedContacts",e[e.PrivacyPhoneNumberDeniedContacts=14]="PrivacyPhoneNumberDeniedContacts",e[e.PrivacyLastSeenAllowedContacts=15]="PrivacyLastSeenAllowedContacts",e[e.PrivacyLastSeenDeniedContacts=16]="PrivacyLastSeenDeniedContacts",e[e.PrivacyProfilePhotoAllowedContacts=17]="PrivacyProfilePhotoAllowedContacts",e[e.PrivacyProfilePhotoDeniedContacts=18]="PrivacyProfilePhotoDeniedContacts",e[e.PrivacyForwardingAllowedContacts=19]="PrivacyForwardingAllowedContacts",e[e.PrivacyForwardingDeniedContacts=20]="PrivacyForwardingDeniedContacts",e[e.PrivacyGroupChatsAllowedContacts=21]="PrivacyGroupChatsAllowedContacts",e[e.PrivacyGroupChatsDeniedContacts=22]="PrivacyGroupChatsDeniedContacts",e[e.PrivacyActiveSessions=23]="PrivacyActiveSessions",e[e.PrivacyBlockedUsers=24]="PrivacyBlockedUsers",e[e.Folders=25]="Folders",e[e.FoldersCreateFolder=26]="FoldersCreateFolder",e[e.FoldersEditFolder=27]="FoldersEditFolder",e[e.FoldersEditFolderFromChatList=28]="FoldersEditFolderFromChatList",e[e.FoldersIncludedChats=29]="FoldersIncludedChats",e[e.FoldersIncludedChatsFromChatList=30]="FoldersIncludedChatsFromChatList",e[e.FoldersExcludedChats=31]="FoldersExcludedChats",e[e.FoldersExcludedChatsFromChatList=32]="FoldersExcludedChatsFromChatList",e[e.TwoFaDisabled=33]="TwoFaDisabled",e[e.TwoFaNewPassword=34]="TwoFaNewPassword",e[e.TwoFaNewPasswordConfirm=35]="TwoFaNewPasswordConfirm",e[e.TwoFaNewPasswordHint=36]="TwoFaNewPasswordHint",e[e.TwoFaNewPasswordEmail=37]="TwoFaNewPasswordEmail",e[e.TwoFaNewPasswordEmailCode=38]="TwoFaNewPasswordEmailCode",e[e.TwoFaEnabled=39]="TwoFaEnabled",e[e.TwoFaChangePasswordCurrent=40]="TwoFaChangePasswordCurrent",e[e.TwoFaChangePasswordNew=41]="TwoFaChangePasswordNew",e[e.TwoFaChangePasswordConfirm=42]="TwoFaChangePasswordConfirm",e[e.TwoFaChangePasswordHint=43]="TwoFaChangePasswordHint",e[e.TwoFaTurnOff=44]="TwoFaTurnOff",e[e.TwoFaRecoveryEmailCurrentPassword=45]="TwoFaRecoveryEmailCurrentPassword",e[e.TwoFaRecoveryEmail=46]="TwoFaRecoveryEmail",e[e.TwoFaRecoveryEmailCode=47]="TwoFaRecoveryEmailCode",e[e.TwoFaCongratulations=48]="TwoFaCongratulations"}(o||(o={})),function(e){e[e.ChatList=0]="ChatList",e[e.GlobalSearch=1]="GlobalSearch",e[e.Settings=2]="Settings",e[e.Contacts=3]="Contacts",e[e.Archived=4]="Archived",e[e.NewChannelStep1=5]="NewChannelStep1",e[e.NewChannelStep2=6]="NewChannelStep2",e[e.NewGroupStep1=7]="NewGroupStep1",e[e.NewGroupStep2=8]="NewGroupStep2"}(d||(d={})),function(e){e[e.ChatList=0]="ChatList",e[e.Media=1]="Media",e[e.Links=2]="Links",e[e.Files=3]="Files",e[e.Music=4]="Music",e[e.Voice=5]="Voice"}(c||(c={})),function(e){e[e.ChatInfo=0]="ChatInfo",e[e.UserInfo=1]="UserInfo",e[e.Search=2]="Search",e[e.Management=3]="Management",e[e.StickerSearch=4]="StickerSearch",e[e.GifSearch=5]="GifSearch",e[e.PollResults=6]="PollResults",e[e.AddingMembers=7]="AddingMembers"}(a||(a={})),function(e){e[e.Inline=0]="Inline",e[e.ScheduledInline=1]="ScheduledInline",e[e.SharedMedia=2]="SharedMedia",e[e.ProfileAvatar=3]="ProfileAvatar",e[e.MiddleHeaderAvatar=4]="MiddleHeaderAvatar",e[e.Album=5]="Album",e[e.ScheduledAlbum=6]="ScheduledAlbum",e[e.SearchResult=7]="SearchResult"}(i||(i={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(s||(s={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(f||(f={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(l||(l={})),function(e){e[e.Closed=0]="Closed",e[e.InProgress=1]="InProgress",e[e.Loading=2]="Loading"}(b||(b={})),function(e){e[e.Profile=0]="Profile",e[e.SharedMedia=1]="SharedMedia",e[e.MemberList=2]="MemberList"}(h||(h={})),function(e){e[e.ShippingInfo=0]="ShippingInfo",e[e.Shipping=1]="Shipping",e[e.PaymentInfo=2]="PaymentInfo",e[e.Checkout=3]="Checkout"}(m||(m={}));const p="UPLOADING_WALLPAPER_SLUG";let g;!function(e){e[e.Initial=0]="Initial",e[e.ChatPrivacyType=1]="ChatPrivacyType",e[e.Discussion=2]="Discussion",e[e.ChannelSubscribers=3]="ChannelSubscribers",e[e.GroupType=4]="GroupType",e[e.GroupPermissions=5]="GroupPermissions",e[e.GroupRemovedUsers=6]="GroupRemovedUsers",e[e.GroupUserPermissionsCreate=7]="GroupUserPermissionsCreate",e[e.GroupUserPermissions=8]="GroupUserPermissions",e[e.ChatAdministrators=9]="ChatAdministrators",e[e.GroupRecentActions=10]="GroupRecentActions",e[e.ChatAdminRights=11]="ChatAdminRights",e[e.GroupMembers=12]="GroupMembers"}(g||(g={}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return h})),n.d(t,"b",(function(){return y})),n.d(t,"c",(function(){return v})),n.d(t,"d",(function(){return O}));var r=n(2),u=n(12),o=n(5);var d=n(50),c=n(1);const a=/%\d?\$?[sdf@]/g,i=["value","zeroValue","oneValue","twoValue","fewValue","manyValue","otherValue"],s={en:e=>1!==e?6:2,ar:e=>0===e?1:1===e?2:2===e?3:e%100>=3&&e%100<=10?4:e%100>=11?5:6,ca:e=>1!==e?6:2,de:e=>1!==e?6:2,es:e=>1!==e?6:2,fa:e=>e>1?6:2,fr:e=>e>1?6:2,id:()=>0,it:e=>1!==e?6:2,ko:()=>0,ms:()=>0,nl:e=>1!==e?6:2,pl:e=>1===e?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,pt_BR:e=>e>1?6:2,ru:e=>e%10==1&&e%100!=11?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,tr:e=>e>1?6:2,uk:e=>e%10==1&&e%100!=11?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,uz:e=>e>1?6:2},f=new Map;let l,b;const{addCallback:h,removeCallback:m,runCallbacks:p}=function(){const e=[];function t(t){const n=e.indexOf(t);-1!==n&&e.splice(n,1)}return{runCallbacks:function(...t){e.forEach(e=>{e(...t)})},addCallback:function(n){return e.push(n),()=>{t(n)}},removeCallback:t}}();let g;const y=(e,t,n)=>{if(void 0!==t){const r=Array.isArray(t)?JSON.stringify(t):t,u=f.get(`${e}_${r}_${n}`);if(u)return u}if(!l&&!b)return e;const r=l&&l[e]||b&&b[e];return r?w(r,e,t,n):(b||j(),e)};async function v(e,t){let n=await u.c(r.O,`${r.v}_${e}_${t}`,u.a.Json);return n||(n=await async function(e,t,n){const d=await Object(o.a)("fetchLangStrings",{langPack:e,langCode:t,keys:[n]});if(d&&d.length)return await u.d(r.O,`${e}_${t}_${n}`,d[0]),d[0];return}(r.v,e,t)),w(n,t)}async function O(e,t,n=!1){if(l&&e===g)return void(t&&t());let d=await u.c(r.O,e,u.a.Json);if(!d&&(n&&await j(),d=await async function(e){const t=await Object(o.a)("fetchLangPack",{sourceLangPacks:r.P,langCode:e});if(t)return await u.d(r.O,e,t.langPack),t.langPack;return}(e),!d))return;f.clear(),g=e,l=d,document.documentElement.lang=e;const{languages:a}=Object(c.e)().settings.byKey,i=a?a.find(t=>t.langCode===e):void 0;y.isRtl=Boolean(i&&i.rtl),y.code=e,t&&t(),p()}async function j(){b||(b=(await n.e(9).then(n.bind(null,332))).default,p())}function w(e,t,n,u){const o=e?e["number"==typeof n?function(e){const t=g||r.u,n=s[t]?s[t](e):0;return i[n]}(n):"value"]:void 0;if(!o||!o.trim()){const e=t.split(".");return e[e.length-1]}if(void 0!==n){const e=function(e,t){t=Array.isArray(t)?t:[t];const n=e.split(a),r=n.shift();return n.reduce((e,n,r)=>`${e}${String(t[r]||"")}${n}`,r||"")}(o,"i"===u?Object(d.a)(n):n),r=Array.isArray(n)?JSON.stringify(n):n;return f.set(`${t}_${r}_${u}`,e),e}return o}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"d",(function(){return c})),n.d(t,"c",(function(){return a})),n.d(t,"b",(function(){return s}));var r=n(2);let u;!function(e){e[e.Auth=0]="Auth",e[e.Main=1]="Main",e[e.Extra=2]="Extra"}(u||(u={}));const o={},d={};async function c(e,t){if(!o[e]){switch(e){case u.Auth:o[u.Auth]=n.e(5).then(n.bind(null,107));break;case u.Main:r.r&&console.log(">>> START LOAD MAIN BUNDLE"),o[u.Main]=Promise.all([n.e(0),n.e(4)]).then(n.bind(null,105));break;case u.Extra:o[u.Extra]=Promise.all([n.e(0),n.e(3)]).then(n.bind(null,106))}o[e].then(f)}const c=await o[e];return d[e]||(d[e]=c),a(e,t)}function a(e,t){const n=d[e];if(n)return n[t]}const i=[];function s(e){i.includes(e)||i.push(e)}function f(){i.forEach(e=>{e()})}},function(e,t,n){"use strict";var r=n(14),u=n(31),o=n(52);t.a=()=>{const e=Object(u.a)();return Object(o.a)(()=>r.a(e),[e]),r.b}},function(e,t,n){"use strict";n.d(t,"d",(function(){return o})),n.d(t,"a",(function(){return d})),n.d(t,"b",(function(){return c})),n.d(t,"g",(function(){return a})),n.d(t,"h",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"f",(function(){return l}));var r=n(10);function u(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}"undefined"==typeof File&&(self.File=class extends Blob{constructor(e,t,n){if(n){const{type:t,...r}=n;super(e,{type:t}),u(this,"name",void 0),Object.assign(this,r)}else super(e),u(this,"name",void 0);this.name=t}});function o(e){const t=e.split(","),n=t[0].match(/:(.*?);/)[1],r=atob(t[1]);let u=r.length;const o=new Uint8Array(u);for(;u--;)o[u]=r.charCodeAt(u);return new Blob([o],{type:n})}function d(e){return new Promise((t,n)=>{const r=new FileReader;r.onload=e=>{const{result:r}=e.target||{};"string"==typeof r&&t(r),n(new Error("Failed to read blob"))},r.onerror=n,r.readAsDataURL(e)})}function c(e,t){return new File([e],t,{lastModified:Date.now(),type:e.type})}function a(e){return new Promise((t,n)=>{const r=new Image;r.onload=()=>t(r),r.onerror=n,r.src=e})}function i(e){return new Promise((t,n)=>{const r=document.createElement("video");r.volume=0,r.onloadedmetadata=()=>t(r),r.onerror=n,r.src=e})}async function s(e){const t=await i(e);return Promise.race([Object(r.f)(2e3),new Promise((e,n)=>{t.onseeked=()=>{t.videoWidth&&t.videoHeight||e(void 0);const n=document.createElement("canvas");n.width=t.videoWidth,n.height=t.videoHeight;n.getContext("2d").drawImage(t,0,0),e(n.toDataURL("image/jpeg"))},t.onerror=n,t.currentTime=Math.min(t.duration,1)})])}async function f(e){return(await fetch(e)).blob()}function l(e){const t=document.createElement("canvas");t.width=e.width,t.height=e.height;return t.getContext("2d").drawImage(e,0,0),t}},function(e,t,n){"use strict";function r(e){return new Promise((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)})}let u;function o(){return u||(u=function(e,t){const n=indexedDB.open(e);n.onupgradeneeded=()=>n.result.createObjectStore(t);const u=r(n);return(e,n)=>u.then(r=>n(r.transaction(t,e).objectStore(t)))}("keyval-store","keyval")),u}function d(e,t){return e("readonly",e=>(e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},r(e.transaction)))}n.d(t,"c",(function(){return s})),n.d(t,"f",(function(){return f})),n.d(t,"b",(function(){return l})),n.d(t,"e",(function(){return b})),n.d(t,"d",(function(){return h})),n.d(t,"a",(function(){return m}));var c=n(2),a=n(12);const i=[1,2,3,4,5];function s(e=!1){if(e&&localStorage.getItem(c.Q))return!0;const t=localStorage.getItem(c.zb);if(!t)return!1;try{const e=JSON.parse(t);return Boolean(e&&e.id&&e.dcID)}catch(e){return!1}}function f(e,t){const{mainDcId:n,keys:r,hashes:u}=e;localStorage.setItem(c.zb,JSON.stringify({dcID:n,id:t})),localStorage.setItem("dc",String(n)),Object.keys(r).map(Number).forEach(e=>{localStorage.setItem(`dc${e}_auth_key`,JSON.stringify(r[e]))}),Object.keys(u).map(Number).forEach(e=>{localStorage.setItem(`dc${e}_hash`,JSON.stringify(u[e]))})}function l(){[c.zb,"dc",...i.map(e=>`dc${e}_auth_key`),...i.map(e=>`dc${e}_hash`)].forEach(e=>{localStorage.removeItem(e)})}function b(){if(!s())return;const e=JSON.parse(localStorage.getItem(c.zb)),t=Number(e.dcID),n={},r={};return i.forEach(e=>{try{const t=localStorage.getItem(`dc${e}_auth_key`);t&&(n[e]=JSON.parse(t));const u=localStorage.getItem(`dc${e}_hash`);u&&(r[e]=JSON.parse(u))}catch(e){c.r&&console.warn("Failed to load stored session",e)}}),Object.keys(n).length?{mainDcId:t,keys:n,hashes:r}:void 0}async function h(){const e=localStorage.getItem(c.Q);if(!e)return;const t=await function(e,t=o()){return t("readonly",t=>r(t.get(e)))}("GramJs:"+e);try{f(JSON.parse(t))}catch(e){c.r&&console.warn("Failed to load legacy session",e)}}async function m(){localStorage.removeItem(c.Q);const e=await function(e=o()){const t=[];return d(e,e=>t.push(e.key)).then(()=>t)}();await Promise.all([a.b("GramJs"),...e.filter(e=>"string"==typeof e&&e.startsWith("GramJs:GramJs-session-")).map(e=>function(e,t=o()){return t("readwrite",t=>(t.delete(e),r(t.transaction)))}(e))])}},function(e,t,n){"use strict";n.d(t,"b",(function(){return o}));const r=/\uFE0F/g,u=String.fromCharCode(8205);function o(e){return e.indexOf(u)<0?e.replace(r,""):e}t.a=/(?:\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d\udc8f\ud83c[\udffb-\udfff]|\ud83d\udc91\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91])|(?:\ud83d[\udc68\udc69]|\ud83e\uddd1)(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83d\ude36\u200d\ud83c\udf2b\ufe0f|\u2764\ufe0f\u200d\ud83d\udd25|\u2764\ufe0f\u200d\ud83e\ude79|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc15\u200d\ud83e\uddba|\ud83d\udc3b\u200d\u2744\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83d\ude2e\u200d\ud83d\udca8|\ud83d\ude35\u200d\ud83d\udcab|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f|\ud83d\udc08\u200d\u2b1b)|[#*0-9]\ufe0f?\u20e3|(?:[©®\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26a7\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g},function(e,t,n){"use strict";var r=n(0),u=n(26);n(96);t.a=Object(r.h)(({color:e="blue"})=>r.a.createElement("div",{className:"Loading"},r.a.createElement(u.a,{color:e,withBackground:"white"===e})))},function(e,t,n){"use strict";var r=n(0),u=n(9),o=n(26),d=n(44);n(94);t.a=({ref:e,type:t="button",onClick:n,onContextMenu:c,onMouseDown:a,onMouseEnter:i,onMouseLeave:s,onFocus:f,children:l,size:b="default",color:h="primary",className:m,round:p,pill:g,fluid:y,isText:v,isLoading:O,ariaLabel:j,href:w,download:I,disabled:C,ripple:E,faded:S,tabIndex:M,isRtl:A})=>{let k=Object(r.q)(null);e&&(k=e);const[T,N]=Object(r.r)(!1),P=Object(u.a)("Button",m,b,h,p&&"round",g&&"pill",y&&"fluid",C&&"disabled",v&&"text",O&&"loading",E&&"has-ripple",S&&"faded",T&&"clicked"),D=Object(r.m)(e=>{!C&&n&&n(e),N(!0),setTimeout(()=>{N(!1)},400)},[C,n]),L=Object(r.m)(e=>{e.preventDefault(),!C&&a&&a(e)},[a,C]);return w?r.a.createElement("a",{ref:k,className:P,href:w,title:j,download:I,tabIndex:M,dir:A?"rtl":void 0},l,!C&&E&&r.a.createElement(d.a,null)):r.a.createElement("button",{ref:k,type:t,className:P,onClick:D,onContextMenu:c,onMouseDown:L,onMouseEnter:i&&!C?i:void 0,onMouseLeave:s&&!C?s:void 0,onFocus:f&&!C?f:void 0,"aria-label":j,title:j,tabIndex:M,dir:A?"rtl":void 0},O?r.a.createElement("div",null,r.a.createElement("span",{dir:A?"auto":void 0},"Please wait.."),r.a.createElement(o.a,{color:v?"blue":"white"})):l,!C&&E&&r.a.createElement(d.a,null))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return b}));var r=n(0),u=n(19),o=n(2),d=n(6),c=n(66),a=n(9),i=n(78),s=n(59);const f=/^[\d\wа-яё]$/i,l=/(\*\*|__).+?\1/g;function b(e,t=["emoji"],n){return"string"!=typeof e?[e]:t.reduce((e,t)=>{switch(t){case"escape_html":return function(e){const t=document.createElement("div");return e.reduce((e,n)=>"string"!=typeof n?[...e,n]:(t.innerText=n,[...e,t.innerHTML]),[])}(e);case"hq_emoji":return u.a.lastIndex=0,h(e,"big","jsx");case"emoji":return u.a.lastIndex=0,h(e,"small","jsx");case"emoji_html":return u.a.lastIndex=0,h(e,"small","html");case"br":return m(e,"jsx");case"br_html":return m(e,"html");case"highlight":return o=e,d=n.highlight,o.reduce((e,t)=>{if("string"!=typeof t||!d)return[...e,t];const n=t.toLowerCase(),u=n.indexOf(d.toLowerCase()),o=n[u+d.length];if(u<0||o&&o.match(f))return[...e,t];const c=[];return c.push(t.substring(0,u)),c.push(r.a.createElement("span",{className:"matching-text-highlight"},t.substring(u,u+d.length))),c.push(t.substring(u+d.length)),[...e,...c]},[]);case"links":return function(e){return e.reduce((e,t)=>{if("string"!=typeof t)return[...e,t];const n=t.match(p);if(!n||!n.length)return[...e,t];const u=[];let o=n.shift(),d=0;for(;o;){const e=t.indexOf(o,d);u.push(t.substring(d,e)),o.startsWith("@")?u.push(r.a.createElement(i.a,{username:o},o)):(o.endsWith("?")&&(o=o.slice(0,o.length-1)),u.push(r.a.createElement(s.a,{text:o,url:o}))),d=e+o.length,o=n.shift()}return u.push(t.substring(d)),[...e,...u]},[])}(e);case"simple_markdown":return g(e,"jsx");case"simple_markdown_html":return g(e,"html")}var o,d;return e},[e])}function h(e,t,n){return d.d?e:e.reduce((e,o)=>{if("string"!=typeof o)return[...e,o];const d=o.split(u.a),i=o.match(u.a)||[];return e.push(d[0]),i.reduce((e,o,i)=>{const s=Object(c.a)(Object(u.b)(o)),f=Object(a.a)("emoji","small"===t&&"emoji-small");"jsx"===n&&e.push(r.a.createElement("img",{className:f,src:`./img-apple-${"big"===t?"160":"64"}/${s}.png`,alt:o})),"html"===n&&e.push(`${o}`);const l=2*i+2;return d[l]&&e.push(d[l]),e},e)},[])}function m(e,t){return e.reduce((e,n)=>"string"!=typeof n?[...e,n]:[...e,...n.split(/\r\n|\r|\n/g).reduce((e,n,u,o)=>{const d=n.trimLeft(),c=n.length-d.length;return e.push(String.fromCharCode(160).repeat(c)+d),u!==o.length-1&&e.push("jsx"===t?r.a.createElement("br",null):"
"),e},[])],[])}const p=new RegExp(`${o.rb}|${o.sb}`,"ig");function g(e,t){return e.reduce((e,n)=>{if("string"!=typeof n)return[...e,n];const u=n.split(l),o=n.match(l)||[];return e.push(u[0]),o.reduce((e,n,o)=>{"jsx"===t?e.push(n.startsWith("**")?r.a.createElement("b",null,n.replace(/\*\*/g,"")):r.a.createElement("i",null,n.replace(/__/g,""))):e.push(n.startsWith("**")?`${n.replace(/\*\*/g,"")}`:`${n.replace(/__/g,"")}`);const d=2*o+2;return u[d]&&e.push(u[d]),e},e)},[])}},function(e,t,n){"use strict";n.d(t,"d",(function(){return d})),n.d(t,"e",(function(){return c})),n.d(t,"b",(function(){return a})),n.d(t,"c",(function(){return i})),n.d(t,"a",(function(){return o}));const r={},u=/(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,3})?(\d{1,3})?/;var o="AF🇦🇫93Afghanistan333\nAO🇦🇴244Angola333\nAL🇦🇱355Albania234\nAD🇦🇩376Andorra222\nAE🇦🇪971United Arab Emirates234\nAI🇦🇮1264Anguilla34\nAR🇦🇷54Argentina\nAM🇦🇲374Armenia233\nAG🇦🇬1268Antigua and Barbuda34\nAU🇦🇺61Australia333\nAS🇦🇸1684American Samoa34\nAT🇦🇹43Austria\nAW🇦🇼297Aruba34\nAZ🇦🇿994Azerbaijan2322\nBI🇧🇮257Burundi224\nBE🇧🇪32Belgium3222\nBJ🇧🇯229Benin233\nBF🇧🇫226Burkina Faso2222\nBD🇧🇩880Bangladesh\nBG🇧🇬359Bulgaria\nBH🇧🇭973Bahrain44\nBS🇧🇸1242Bahamas34\nBA🇧🇦387Bosnia and Herzegovina\nBY🇧🇾375Belarus2322\nBZ🇧🇿501Belize\nBO🇧🇴591Bolivia134\nBR🇧🇷55Brazil254\nBB🇧🇧1246Barbados34\nBM🇧🇲1441Bermuda34\nBN🇧🇳673Brunei34\nBQ🇧🇶599Bonaire, Sint Eustatius and Saba\nBT🇧🇹975Bhutan\nBW🇧🇼267Botswana233\nCF🇨🇫236Central African Republic2222\nCA🇨🇦1Canada334\nCH🇨🇭41Switzerland234\nCK🇨🇰682Cook Islands\nCL🇨🇱56Chile144\nCN🇨🇳86China344\nCI🇨🇮225Côte d`Ivoire233\nCM🇨🇲237Cameroon44\nCD🇨🇩243DR Congo234\nCG🇨🇬242Republic of the Congo234\nCO🇨🇴57Colombia334\nKM🇰🇲269Comoros34\nCV🇨🇻238Cape Verde34\nCR🇨🇷506Costa Rica\nCU🇨🇺53Cuba44\nCY🇨🇾357Cyprus44\nCW🇨🇼599Curaçao\nCZ🇨🇿420Czech Republic\nDE🇩🇪49Germany38\nDJ🇩🇯253Djibouti2222\nDM🇩🇲1767Dominica34\nDK🇩🇰45Denmark44\nDO🇩🇴1Dominican Republic334\nDZ🇩🇿213Algeria3222\nEC🇪🇨593Ecuador\nEG🇪🇬20Egypt234\nER🇪🇷291Eritrea133\nES🇪🇸34Spain333\nEE🇪🇪372Estonia\nET🇪🇹251Ethiopia234\nFI🇫🇮358Finland\nFJ🇫🇯679Fiji\nFK🇫🇰500Falkland Islands\nFM🇫🇲691Micronesia\nFO🇫🇴298Faroe Islands33\nFR🇫🇷33France12222\nGA🇬🇦241Gabon1222\nGB🇬🇧44United Kingdom46\nGE🇬🇪995Georgia\nGF🇬🇫594French Guiana\nGH🇬🇭233Ghana\nGI🇬🇮350Gibraltar44\nGL🇬🇱299Greenland33\nGN🇬🇳224Guinea333\nGM🇬🇲220Gambia34\nGP🇬🇵590Guadeloupe\nGU🇬🇺1671Guam34\nGW🇬🇼245Guinea-Bissau34\nGQ🇬🇶240Equatorial Guinea333\nGR🇬🇷30Greece244\nGD🇬🇩1473Grenada34\nGT🇬🇹502Guatemala134\nGY🇬🇾592Guyana\nHK🇭🇰852Hong Kong\nHN🇭🇳504Honduras44\nHR🇭🇷385Croatia\nHT🇭🇹509Haiti\nHU🇭🇺36Hungary234\nID🇮🇩62Indonesia\nIN🇮🇳91India55\nIO🇩🇬246Diego Garcia34\nIE🇮🇪353Ireland234\nIR🇮🇷98Iran334\nIQ🇮🇶964Iraq334\nIS🇮🇸354Iceland34\nIL🇮🇱972Israel234\nIT🇮🇹39Italy334\nJM🇯🇲1876Jamaica34\nJO🇯🇴962Jordan144\nJP🇯🇵81Japan244\nKZ🇰🇿7Kazakhstan3322\nKE🇰🇪254Kenya333\nKG🇰🇬996Kyrgyzstan\nKH🇰🇭855Cambodia\nKI🇰🇮686Kiribati\nKN🇰🇳1869Saint Kitts and Nevis34\nKR🇰🇷82South Korea\nKW🇰🇼965Kuwait44\nKY🇰🇾1345Cayman Islands34\nLA🇱🇦856Laos\nLB🇱🇧961Lebanon\nLR🇱🇷231Liberia\nLY🇱🇾218Libya234\nLC🇱🇨1758Saint Lucia34\nLI🇱🇮423Liechtenstein\nLK🇱🇰94Sri Lanka234\nLS🇱🇸266Lesotho233\nLT🇱🇹370Lithuania35\nLU🇱🇺352Luxembourg\nLV🇱🇻371Latvia35\nMA🇲🇦212Morocco234\nMC🇲🇨377Monaco44\nMD🇲🇩373Moldova233\nMG🇲🇬261Madagascar2232\nMP🇲🇵1670Northern Mariana Islands34\nMO🇲🇴853Macau\nMS🇲🇸1664Montserrat34\nMV🇲🇻960Maldives\nMX🇲🇽52Mexico\nMH🇲🇭692Marshall Islands\nMK🇲🇰389Macedonia\nML🇲🇱223Mali44\nMT🇲🇹356Malta2222\nMM🇲🇲95Myanmar\nME🇲🇪382Montenegro\nMN🇲🇳976Mongolia\nMZ🇲🇿258Mozambique234\nMQ🇲🇶596Martinique\nMR🇲🇷222Mauritania44\nMU🇲🇺230Mauritius\nMW🇲🇼265Malawi\nMY🇲🇾60Malaysia\nNA🇳🇦264Namibia234\nNC🇳🇨687New Caledonia6\nNE🇳🇪227Niger2222\nNF🇳🇫672Norfolk Island\nNG🇳🇬234Nigeria\nNI🇳🇮505Nicaragua44\nNL🇳🇱31Netherlands12222\nNO🇳🇴47Norway44\nNP🇳🇵977Nepal\nNU🇳🇺683Niue\nNR🇳🇷674Nauru\nNZ🇳🇿64New Zealand\nOM🇴🇲968Oman44\nPK🇵🇰92Pakistan334\nPA🇵🇦507Panama44\nPE🇵🇪51Peru333\nPF🇵🇫689French Polynesia\nPH🇵🇭63Philippines334\nPM🇵🇲508Saint Pierre and Miquelon\nPR🇵🇷1Puerto Rico334\nPS🇵🇸970Palestine324\nPW🇵🇼680Palau\nPG🇵🇬675Papua New Guinea\nPL🇵🇱48Poland333\nKP🇰🇵850North Korea\nPT🇵🇹351Portugal144\nPY🇵🇾595Paraguay333\nQA🇶🇦974Qatar\nRE🇷🇪262Réunion333\nRO🇷🇴40Romania333\nRU🇷🇺7Russia3322\nRW🇷🇼250Rwanda333\nSA🇸🇦966Saudi Arabia\nSD🇸🇩249Sudan234\nSN🇸🇳221Senegal234\nSG🇸🇬65Singapore44\nSH🇸🇭290Saint Helena23\nSH🇸🇭247Saint Helena4\nSB🇸🇧677Solomon Islands\nSL🇸🇱232Sierra Leone233\nSV🇸🇻503El Salvador44\nSM🇸🇲378San Marino334\nSO🇸🇴252Somalia233\nRS🇷🇸381Serbia234\nSS🇸🇸211South Sudan234\nST🇸🇹239São Tomé and Príncipe25\nSR🇸🇷597Suriname34\nSK🇸🇰421Slovakia\nSI🇸🇮386Slovenia\nSE🇸🇪46Sweden234\nSZ🇸🇿268Swaziland44\nSC🇸🇨248Seychelles1222\nSX🇸🇽1721Sint Maarten34\nSY🇸🇾963Syria\nTC🇹🇨1649Turks and Caicos Islands34\nTD🇹🇩235Chad2222\nTG🇹🇬228Togo233\nTH🇹🇭66Thailand144\nTJ🇹🇯992Tajikistan\nTK🇹🇰690Tokelau\nTM🇹🇲993Turkmenistan26\nTL🇹🇱670Timor-Leste\nTO🇹🇴676Tonga\nTT🇹🇹1868Trinidad and Tobago34\nTN🇹🇳216Tunisia233\nTR🇹🇷90Turkey334\nTV🇹🇻688Tuvalu\nTW🇹🇼886Taiwan\nTZ🇹🇿255Tanzania234\nUG🇺🇬256Uganda234\nUA🇺🇦380Ukraine2322\nUY🇺🇾598Uruguay44\nUS🇺🇸1United States334\nUZ🇺🇿998Uzbekistan27\nVA🇻🇦3Vatican City\nVC🇻🇨1784Saint Vincent and the Grenadines34\nVE🇻🇪58Venezuela334\nVG🇻🇬1284British Virgin Islands34\nVI🇻🇮1340US Virgin Islands34\nVN🇻🇳84Vietnam\nVU🇻🇺678Vanuatu\nWF🇼🇫681Wallis and Futuna\nWS🇼🇸685Samoa\nXK🇽🇰383Kosovo44\nYE🇾🇪967Yemen333\nZA🇿🇦27South Africa234\nZM🇿🇲260Zambia234\nZW🇿🇼263Zimbabwe234".split("\n").map(e=>({id:e.substr(0,2),flag:e.substr(2,4),code:"+"+e.match(/\d+/)[0],name:e.split(/\d+/)[1],phoneFormat:function(e){if(!e)return u;const t=e[0];let n;if(!r[t]){const e=t.split("").map(Number);n=e.reduce((e,t,n)=>`${e}(\\d{1,${t}})${n>0?"?":""}`,""),r[t]=new RegExp(`${n}${"()?".repeat(5-e.length)}`)}return r[t]}(e.match(/\d+$/))}));function d(e){return o.find(t=>t.id===e)}function c(e){let t=e.replace(/[^\d+]+/g,"");t.startsWith("+")||(t="+"+t);const n=o.filter(e=>t.startsWith(e.code)).sort((e,t)=>e.code.length-t.code.length);return n[n.length-1]}function a(e,t){let n=e.replace(/[^\d]+/g,"");if(t)n=n.substr(t.code.length-1);else if(e.startsWith("+"))return e;return n=n.replace(function(e){return e?e.phoneFormat:u}(t),(e,n,r,u,o,d)=>{const c=t&&"GB"===t.id?" ":"-";let a="";return n&&(a=""+n),r&&(a+=" "+r),u&&(a+=`${c}${u}`),o&&(a+=`${c}${o}`),d&&(a+=`${c}${d}`),a}),n}function i(e){const t=e.startsWith("+")?e:"+"+e,n=c(t);return n?`${n.code} ${a(t,n)}`:t}},function(e,t,n){"use strict";var r=n(0),u=n(15),o=n(31);t.a=(e,t,n=!1,d=!1)=>{const c=Object(u.c)(e,t),a=Object(o.a)();return d&&Object(u.b)(a),Object(r.n)(()=>{n||c||Object(u.d)(e,t).then(a)},[e,a,c,t,n]),c}},function(e,t,n){"use strict";var r=n(0);t.a=(e=!1)=>{const[t,n]=Object(r.r)(e);return[t,Object(r.m)(()=>{n(!0)},[]),Object(r.m)(()=>{n(!1)},[])]}},function(e,t,n){"use strict";var r=n(0),u=n(9);n(92);t.a=({color:e="blue",withBackground:t})=>r.a.createElement("div",{className:Object(u.a)("Spinner",e,t&&"with-background")},r.a.createElement("div",null))},function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));n(2);var r=n(10);window.addEventListener("error",u),window.addEventListener("unhandledrejection",u);function u(e){e.preventDefault(),o(e instanceof ErrorEvent?e.error:e.reason)}Object(r.h)(window.alert,1e3);function o(e){console.error(e)}},function(e,t,n){"use strict";function r(e,t){if(e===t)return!0;const n=Object.keys(e),r=n.length;if(r!==Object.keys(t).length)return!1;if(0===r)return!0;for(let u=0;u(e[r]!==t[r]&&n.push(`${r}: ${e[r]} => ${t[r]}`),n),[])}n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return u}))},function(e,t,n){"use strict";var r=n(0);t.a=function(e,t){const n=Object(r.q)(),{current:u}=n;return t&&void 0===e||(n.current=e),u}},function(e,t,n){"use strict";n.d(t,"j",(function(){return d})),n.d(t,"k",(function(){return c})),n.d(t,"n",(function(){return a})),n.d(t,"h",(function(){return s})),n.d(t,"g",(function(){return f})),n.d(t,"b",(function(){return l})),n.d(t,"f",(function(){return b})),n.d(t,"c",(function(){return h})),n.d(t,"d",(function(){return p})),n.d(t,"e",(function(){return g})),n.d(t,"i",(function(){return y})),n.d(t,"a",(function(){return v})),n.d(t,"l",(function(){return j})),n.d(t,"m",(function(){return w}));const r=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],u=["January","February","March","April","May","June","July","August","September","October","November","December"],o=u.map(e=>e.toLowerCase());function d(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function c(e){return d(e).getTime()}function a(e){const t=new Date(1e3*e);return`${t.getFullYear()}-${t.getMonth()}`}function i(e){return`${e.getFullYear()}-${e.getMonth()+1}-${e.getDate()}`}function s(e){const t="number"==typeof e?new Date(e):e;return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}function f(e,t){const n="number"==typeof t?new Date(t):t,u=d(new Date);if(n>=u)return s(n);const o=new Date(u);if(o.setDate(u.getDate()-7),n>=o)return e("Weekday.Short"+r[n.getDay()]);const c=n.getFullYear()!==u.getFullYear(),a=e(c?"formatDateScheduleYear":"formatDateSchedule")||(c?"d MMM yyyy":"d MMM");return m(e,n,a)}function l(e,t){const n="number"==typeof t?new Date(t):t,r=e("formatterYearMax")||"dd.MM.yyyy";return m(e,n,r)}function b(e,t,n=!1){const r=e(n?"formatterMonthYear2":"formatterMonthYear")||"MMM yyyy";return m(e,t,r)}function h(e,t,n=!1,u=!1){const o="number"==typeof t?new Date(t):t,c=d(new Date);if(!u){if(i(o)===i(c))return(n?I:C)(e("Weekday.Today"));const t=new Date(c);if(t.setDate(c.getDate()-1),i(o)===i(t))return(n?I:C)(e("Weekday.Yesterday"));const u=new Date(c),d=new Date(c);if(u.setDate(c.getDate()-7),d.setDate(c.getDate()+7),o>=u&&o<=d){const t=r[o.getDay()];return n?I(e("Weekday.Short"+t)):C(e("Weekday."+t))}}const a=o.getFullYear()!==c.getFullYear(),s=e(n?a?"formatDateScheduleYear":"formatDateSchedule":a?"chatFullDate":"chatDate")||"d MMMM yyyy";return(n?I:C)(m(e,o,s))}function m(e,t,n){const r=t.getDate(),o=t.getMonth();return n.replace("LLLL",e(u[o])).replace("MMMM",e("Month.Gen"+u[o])).replace("MMM",e("Month.Short"+u[o])).replace("MM",String(o+1).padStart(2,"0")).replace("dd",String(r).padStart(2,"0")).replace("d",String(r)).replace("yyyy",String(t.getFullYear()))}function p(e,t){const n="number"==typeof t?new Date(t):t;return`${h(e,n,!0)}, ${s(n)}`}function g(e){const t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=Math.floor(e%3600%60);let u="";return t>0?(u+=String(t).padStart(2,"0")+":",u+=String(n).padStart(2,"0")+":"):u+=String(n)+":",u+=String(r).padStart(2,"0"),u}function y(e){const t=[];let n=e%1e3;e-=n,n=Math.floor(n/10);const r=(e=Math.floor(e/1e3))%60;e-=r;const u=(e=Math.floor(e/60))%60;e-=u;const o=(e=Math.floor(e/60))%60;return o>0&&t.push(String(o).padStart(2,"0")),t.push(String(u).padStart(o>0?2:1,"0")),t.push(String(r).padStart(2,"0")),`${t.join(":")},${String(n).padStart(2,"0")}`}function v(e,t="en-US"){return e.toLocaleString(t,{year:"numeric",month:"short",day:"numeric"})}function O(e,t,n=2021){if(t>11||e>31)return!1;const r=new Date(n,t,e);return!Number.isNaN(r.getTime())&&r.getDate()===e}function j(e=""){const t=e.match(/\d{1,2}\s[a-zA-Z]{3,}/),n=e.match(/[a-zA-Z]{3,}\s\d{1,2}/),r=e.match(/\d{1,2}[./-]\d{1,2}([./-]\d{2,4})?/);if(!t&&!r&&!n)return;if(r){const[t,n,r]=e.split(/[./-]/).map(Number);return r&&r<2015||!O(t,n-1,r||void 0)?void 0:`${r?r+"-":""}${String(n).padStart(2,"0")}-${String(t).padStart(2,"0")}`}const u=e.split(" "),d=t?u[0]:u[1],c=(t?u[1]:u[0]).toLowerCase(),a=o.findIndex(e=>e.startsWith(c));return-1!==a&&O(Number(d),a)?`${String(a+1).padStart(2,"0")}-${String(d).padStart(2,"0")}`:void 0}function w(e){return e+86400}function I(e){return`${e[0].toLowerCase()}${e.slice(1)}`}function C(e){return`${e[0].toUpperCase()}${e.slice(1)}`}},function(e,t,n){"use strict";var r=n(0);t.a=()=>{const[,e]=Object(r.r)(!1);return Object(r.m)(()=>{e(e=>!e)},[])}},function(e,t,n){"use strict";var r=n(0),u=n(9);n(90);t.a=({children:e,className:t,isRtl:n,onClick:o})=>{const d=Object(r.m)(e=>{e.preventDefault(),o(e)},[o]);return r.a.createElement("a",{href:"#",className:Object(u.a)("Link",t),dir:n?"rtl":"auto",onClick:o?d:void 0},e)}},function(e,t,n){"use strict";t.a=e=>{let t;do{t=String(Math.random()).replace("0.","id")}while(e.hasOwnProperty(t));return t}},function(e,t,n){"use strict";n.d(t,"d",(function(){return p})),n.d(t,"c",(function(){return y})),n.d(t,"b",(function(){return v})),n.d(t,"a",(function(){return O}));var r=n(5),u=n(68),o=n(2),d=n(1),c=n(4),a=n(14),i=n(11),s=n(7),f=n(6);function l(e){const t=e.toJSON();return JSON.stringify({endpoint:t.endpoint,keys:t.keys})}function b(){return!!f.k&&("showNotification"in ServiceWorkerRegistration.prototype?"denied"===Notification.permission?(o.r&&console.warn("[PUSH] The user has blocked push notifications."),!1):"PushManager"in window||(o.r&&console.warn("[PUSH] Push messaging isn't supported."),!1):(o.r&&console.warn("[PUSH] Push notifications aren't supported."),!1))}async function h(){"Notification"in window&&(["granted","denied"].includes(Notification.permission)||await Notification.requestPermission())}async function m(e){const t=Object(d.e)(),n=Object(d.d)();if(e)try{const t=l(e);return await Object(r.a)("unregisterDevice",t),await e.unsubscribe(),void n.deleteDeviceToken()}catch(e){o.r&&console.log("[PUSH] Unable to unsubscribe from push.",e)}t.push&&(await Object(r.a)("unregisterDevice",t.push.deviceToken),n.deleteDeviceToken())}async function p(){if(!b())return;const e=await navigator.serviceWorker.ready,t=await e.pushManager.getSubscription();await m(t)}let g=!1;async function y(){if(!b())return void await h();const e=await navigator.serviceWorker.ready;let t=await e.pushManager.getSubscription();if(function(e){const t=Object(d.e)();return!t.push||!e||(l(e)!==t.push.deviceToken||Date.now()-t.push.subscribedAt>432e5)}(t)){await m(t);try{t=await e.pushManager.subscribe({userVisibleOnly:!0});const n=l(t);o.r&&console.log("[PUSH] Received push subscription: ",n),await Object(r.a)("registerDevice",n),Object(d.d)().setDeviceToken(n)}catch(e){"denied"===Notification.permission?o.r&&console.warn("[PUSH] The user has blocked push notifications."):o.r&&(console.log("[PUSH] Unable to subscribe to push.",e),e.code===DOMException.ABORT_ERR&&await h())}}}async function v({chat:e,message:t,isActiveChat:n}){if(!("Notification"in window?"denied"!==Notification.permission||(o.r&&console.warn("[PUSH] The user has blocked push notifications."),0):(o.r&&console.warn("[PUSH] This browser does not support desktop notification"),0)))return;if(!t.id)return;if(await async function(){if(g)return;const[e,t]=await Promise.all([Object(r.a)("fetchNotificationSettings",{serverTimeOffset:Object(d.e)().serverTimeOffset}),Object(r.a)("fetchNotificationExceptions",{serverTimeOffset:Object(d.e)().serverTimeOffset})]);if(!e)return;let n=Object(i.w)(Object(d.e)(),e);t&&(n=Object(i.f)(n,t)),Object(d.g)(n),g=!0}(),!function(e,t){if(!g)return!1;const n=Object(d.e)();return!(Object(c.Hb)(e,Object(s.fb)(n),Object(s.eb)(n))||e.isNotJoined||!e.isListed)&&!(t&&document.hasFocus())}(e,n))return;const{title:f,body:l}=function(e,t){const n=Object(d.e)(),{senderId:r,replyToMessageId:o}=t,i=r?Object(s.Jb)(n,r):void 0,f=Object(c.s)(t),l=f&&o?Object(s.l)(n,e.id,o):void 0,{targetUserIds:b,targetChatId:h}=f||{},m=b?b.map(e=>Object(s.Jb)(n,e)).filter(Boolean):void 0,p=Object(c.W)(e),g=p?Object(s.Jb)(n,p):void 0;let y;if(Object(c.gb)(t)){const n=e&&(Object(c.mb)(e)||t.senderId===t.chatId)?e:i;y=Object(u.a)(a.b,t,n,m,l,h,{asPlain:!0})}else{const n=Object(c.K)(a.b,e.id,i),r=Object(c.O)(a.b,t);y=n?`${n}: ${r}`:r}return{title:Object(c.k)(a.b,e,g),body:y}}(e,t);if(b())navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage({type:"newMessageNotification",payload:{title:f,body:l,chatId:e.id,messageId:t.id}});else{const n=Object(d.d)(),r={body:l,icon:"icon-192x192.png",badge:"icon-192x192.png",tag:t.id.toString()};"vibrate"in navigator&&(r.vibrate=[200,100,200]);const u=new Notification(f,r);u.onclick=()=>{u.close(),n.focusMessage({chatId:e.id,messageId:t.id}),window.focus&&window.focus()}}}function O(){navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage({type:"clientReady"})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return c})),n.d(t,"c",(function(){return a})),n.d(t,"d",(function(){return i})),n.d(t,"g",(function(){return s})),n.d(t,"e",(function(){return f})),n.d(t,"f",(function(){return l})),n.d(t,"h",(function(){return b})),n.d(t,"a",(function(){return h}));var r=n(2),u=n(30),o=n(3);const d=[1,8,5,2,7,4,6];function c(e){if(e)switch(e.type){case"userTypeBot":case"userTypeRegular":return e.firstName||e.lastName;case"userTypeDeleted":case"userTypeUnknown":return"Deleted";default:return}}function a(e){if(e){if(f(e))return"Deleted account";switch(e.type){case"userTypeBot":case"userTypeRegular":if(e.firstName&&e.lastName)return`${e.firstName} ${e.lastName}`;if(e.firstName)return e.firstName;if(e.lastName)return e.lastName;break;case"userTypeDeleted":case"userTypeUnknown":return"Deleted account"}}}function i(e,t,n){if(t.id===r.yb)return e("ServiceNotifications").toLowerCase();if(t.type&&"userTypeBot"===t.type)return e("Bot");if(!t.status)return"";switch(t.status.type){case"userStatusEmpty":return e("ALongTimeAgo");case"userStatusLastMonth":return e("WithinAMonth");case"userStatusLastWeek":return e("WithinAWeek");case"userStatusOffline":{const{wasOnline:r}=t.status;if(!r)return e("LastSeen.Offline");const o=new Date((new Date).getTime()+1e3*n),d=new Date(1e3*r);if(d>=o)return e("LastSeen.JustNow");const c=new Date(o.getTime()-d.getTime());if(c.getTime()/1e3<60)return e("LastSeen.JustNow");if(c.getTime()/1e3<3600){return e("LastSeen.MinutesAgo",Math.floor(c.getTime()/1e3/60))}const a=new Date;a.setHours(0,0,0,0);if(d>new Date(a.getTime()+1e3*n)){if(c.getTime()/1e3<21600){return e("LastSeen.HoursAgo",Math.floor(c.getTime()/1e3/60/60))}return e("LastSeen.TodayAt",Object(u.h)(d))}const i=new Date;i.setDate(o.getDate()-1),i.setHours(0,0,0,0);return d>new Date(i.getTime()+1e3*n)?e("LastSeen.YesterdayAt",Object(u.h)(d)):e("LastSeen.AtDate",Object(u.b)(e,d))}case"userStatusOnline":return e("Online");case"userStatusRecently":return e("Lately");default:return}}function s(e){const{id:t,status:n,type:u}=e;return!!n&&(t!==r.yb&&("userStatusOnline"===n.type&&"userTypeBot"!==u))}function f(e){return!(!e.status||"userTypeBot"===e.type||e.id===r.yb)&&("userTypeDeleted"===e.type||"userTypeUnknown"===e.type)}function l(e){return"userTypeBot"===e.type}function b(e,t,n,r=0){return Object(o.k)(e,e=>{const u=Date.now()/1e3+r;if(n&&n.includes(e))return u+172800-(n.length-n.indexOf(e));const o=t[e];if(!o||!o.status)return 0;if("userStatusOnline"===o.status.type)return o.status.expires;if("userStatusOffline"===o.status.type&&o.status.wasOnline)return o.status.wasOnline;switch(o.status.type){case"userStatusRecently":return u-86400;case"userStatusLastWeek":return u-604800;case"userStatusLastMonth":return u-18144e3;default:return 0}},"desc")}function h(e){const t=e?Math.abs(e.id)%7:0;return d[t]}},function(e,t,n){"use strict";n.d(t,"w",(function(){return i})),n.d(t,"v",(function(){return s})),n.d(t,"t",(function(){return f})),n.d(t,"y",(function(){return l})),n.d(t,"u",(function(){return b})),n.d(t,"z",(function(){return h})),n.d(t,"j",(function(){return m})),n.d(t,"p",(function(){return p})),n.d(t,"i",(function(){return g})),n.d(t,"e",(function(){return y})),n.d(t,"f",(function(){return v})),n.d(t,"d",(function(){return O})),n.d(t,"x",(function(){return j})),n.d(t,"r",(function(){return w})),n.d(t,"m",(function(){return I})),n.d(t,"A",(function(){return C})),n.d(t,"c",(function(){return E})),n.d(t,"a",(function(){return S})),n.d(t,"o",(function(){return M})),n.d(t,"h",(function(){return A})),n.d(t,"g",(function(){return k})),n.d(t,"s",(function(){return T})),n.d(t,"D",(function(){return N})),n.d(t,"b",(function(){return P})),n.d(t,"C",(function(){return D})),n.d(t,"B",(function(){return L})),n.d(t,"l",(function(){return x})),n.d(t,"k",(function(){return F})),n.d(t,"q",(function(){return B})),n.d(t,"n",(function(){return R})),n.d(t,"E",(function(){return U}));var r=n(8),u=n(2),o=n(3),d=n(35),c=n(30);const a=Date.now()/1e3+31622400;function i(e){return e>0}function s(e){return f(e)||l(e)}function f(e){return"chatTypeBasicGroup"===e.type}function l(e){return"chatTypeSuperGroup"===e.type}function b(e){return"chatTypeChannel"===e.type}function h(e){return"chatTypePrivate"===e.type||"chatTypeBasicGroup"===e.type}function m(e){switch(e.type){case"chatTypePrivate":return"PrivateChat";case"chatTypeBasicGroup":case"chatTypeSuperGroup":return"AccDescrGroup";case"chatTypeChannel":return"AccDescrChannel";default:return"Chat"}}function p(e){if("chatTypePrivate"===e.type||"chatTypeSecret"===e.type)return e.id}function g(e,t,n,r=!1){return r||n&&t.id===n.id&&n.isSelf?e("SavedMessages"):t.title||e("HiddenName")}function y(e){if(e.fullInfo)return e.fullInfo.about}function v(e){const{username:t}=e;if(t)return"https://t.me/"+t;const{inviteLink:n}=e.fullInfo||{};return n}function O(e,t="normal"){if(e.avatarHash)switch(t){case"big":return`profile${e.id}?${e.avatarHash}`;default:return`avatar${e.id}?${e.avatarHash}`}}function j(e){return!e.lastMessage}function w(e){return Boolean(e.adminRights)}function I(e,t){return!!e.adminRights&&e.adminRights[t]}function C(e,t){return Boolean(e.currentUserBannedRights&&e.currentUserBannedRights[t]||e.defaultBannedRights&&e.defaultBannedRights[t])}function E(e,t){return t!==r.MAIN_THREAD_ID||!(e.isRestricted||e.migratedTo||e.isNotJoined)&&(!!e.isCreator||(!!i(e.id)||(b(e)?I(e,"postMessages"):w(e)||!C(e,"sendMessages"))))}function S(e,t=!1){if(!e)return{canAttachMedia:!1,canAttachPolls:!1,canSendStickers:!1,canSendGifs:!1,canAttachEmbedLinks:!1};const n=w(e);return{canAttachMedia:n||!C(e,"sendMedia"),canAttachPolls:(n||!C(e,"sendPolls"))&&(!i(e.id)||t),canSendStickers:n||!C(e,"sendStickers"),canSendGifs:n||!C(e,"sendGifs"),canAttachEmbedLinks:n||!C(e,"embedLinks")}}function M(e,t,n){if(t&&t.sendMessages){const{untilDate:n}=t;return n&&nfunction(e,t,n,r,u,o,d,c){if(!e.isListed)return!1;if(o&&o.has(e.id))return!1;if(d&&d.has(e.id))return!0;if(c&&c.has(e.id))return!0;if(T(e)&&t.excludeArchived)return!1;if(t.excludeMuted&&!e.unreadMentionsCount&&N(e,r,u))return!1;if(!e.unreadCount&&!e.unreadMentionsCount&&!e.hasUnreadMark&&t.excludeRead)return!1;if(i(e.id)){const r=n[e.id];if(r&&"userTypeBot"===r.type){if(t.bots)return!0}else{if(t.contacts&&r&&r.isContact)return!0;if(t.nonContacts&&r&&!r.isContact)return!0}}else{if(s(e))return!!t.groups;if(b(e))return!!t.channels}return!1}(e[o],n,t,r,u,d,c,a)),n.pinnedChatIds]}function L(e,t,n,r="all"){function u(e){if(!e||!e.lastMessage||e.migratedTo)return!1;switch(r){case"all":if(T(e))return!1;break;case"archived":if(!T(e))return!1}return!e.isRestricted&&!e.isNotJoined}const d=t.map(t=>e[t]).filter(u),c=new Set(t);return{pinnedChats:n?n.map(t=>e[t]).filter(u).filter(e=>c.has(e.id)):[],otherChats:Object(o.k)(n?d.filter(e=>!n.includes(e.id)):d,k,"desc")}}function x(e,t,n,r,u,o){const[d]=D(e,t,n,u,o,r),c=d.map(t=>e[t]).filter(e=>e&&e.lastMessage&&!e.isRestricted&&!e.isNotJoined);return{unreadDialogsCount:c.reduce((e,t)=>t.unreadCount||t.hasUnreadMark?e+1:e,0),hasActiveDialogs:c.some(e=>e.unreadMentionsCount||!N(e,u,o)&&(e.unreadCount||e.hasUnreadMark))}}function F(e,t,n,r,u,o,d){const{id:c,title:a,emoticon:i,description:s,pinnedChatIds:f,excludedChatIds:l,includedChatIds:b,excludeArchived:h,excludeMuted:m,excludeRead:p,...g}=r;if(Object.values(g).filter(Boolean).length>1||l&&l.length||b&&b.length){return e("Chats",function(e,t,n,r,u,o){const[d,c]=D(e,t,n,u,o,r),{pinnedChats:a,otherChats:i}=L(e,d,c,"folder");return a.length+i.length}(t,n,r,u,o,d))}return g.bots?e("FilterBots"):g.groups?e("FilterGroups"):g.channels?e("FilterChannels"):g.contacts?e("FilterContacts"):g.nonContacts?e("FilterNonContacts"):void 0}function B(e){return!!e&&e.id<0}function R(e,t,n){if(n&&!i(t))return n.isSelf?e("FromYou"):Object(d.b)(n)}function U(e,t,n=!1,r){return Object(o.k)(e,e=>{const u=t[e];if(!u)return 0;let o=0;return u.lastMessage&&(o+=u.lastMessage.date),n&&u.isVerified&&(o+=3e9),r&&r.includes(e)&&(o=Date.now()+3e8+(r.length-r.indexOf(e))),o},"desc")}},function(e,t,n){"use strict";n.d(t,"b",(function(){return u})),n.d(t,"a",(function(){return o})),n.d(t,"d",(function(){return a}));var r=n(0);const u="tt-event-heavy-animation-start",o="tt-event-heavy-animation-end";let d,c=!1;const a=e=>(c||(c=!0,document.dispatchEvent(new Event(u))),d&&(clearTimeout(d),d=void 0),e&&(d=window.setTimeout(()=>{c=!1,document.dispatchEvent(new Event(o)),d=void 0},e)),()=>{c=!1,document.dispatchEvent(new Event(o))});t.c=(e,t)=>{Object(r.n)(()=>(c&&e(),document.addEventListener(u,e),document.addEventListener(o,t),()=>{document.removeEventListener(o,t),document.removeEventListener(u,e)}),[t,e])}},function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"c",(function(){return i})),n.d(t,"b",(function(){return b}));var r=n(2);const u=new Set(["scroll","mouseenter","mouseleave"]),o={},d=new Map,c={};function a(e,t,n,r=!1){const u=s(t,e);f(u,e,r)?function(e,t,n){c[e]||(c[e]=0,document.addEventListener(e,h));(function(e){o[e]||(o[e]=new Map);return o[e]})(e).set(t,n),function(e){const t=d.get(e);if(t)return t;const n=new Set;return d.set(e,n),n}(t).add(e),c[e]++}(u,e,n):e.addEventListener(u,n,r)}function i(e,t,n,r=!1){const u=s(t,e);f(u,e,r)?l(u,e):e.removeEventListener(u,n,r)}function s(e,t){const n=e.replace(/^on/,"").replace(/Capture$/,"").toLowerCase();return"change"===n&&"SELECT"!==t.tagName?"input":"doubleclick"===n?"dblclick":"focus"===n?"focusin":"blur"===n?"focusout":n}function f(e,t,n){return!n&&!u.has(e)&&"VIDEO"!==t.tagName&&"IFRAME"!==t.tagName}function l(e,t){c[e]--,c[e]||document.removeEventListener(e,h),o[e].delete(t),d.get(t).delete(e)}function b(e){const t=d.get(e);t&&(t.forEach(t=>l(t,e)),d.delete(e))}function h(e){const t=o[e.type];if(t){let n=!1,r=e.target;const u=()=>{n=!0},o=()=>{e.preventDefault()},d=new Proxy(e,{get:(e,t)=>"currentTarget"===t?r:"stopPropagation"===t||"stopImmediatePropagation"===t?u:"preventDefault"===t?o:Reflect.get(e,t)});for(;r&&r!==document.body;){const e=t.get(r);if(e&&(e(d),n))return;r=r.parentNode}}}r.r&&document.addEventListener("dblclick",()=>{console.log("DELEGATED EVENTS",{delegationRegistry:o,delegatedEventsByElement:d,documentEventCounters:c})})},function(e,t,n){"use strict";n.d(t,"b",(function(){return i})),n.d(t,"a",(function(){return l}));var r=n(0),u=n(6),o=n(29),d=n(1),c=n(3);const a={currentIndex:0,nextStateIndexToReplace:-1,isHistoryAltered:!1,isDisabled:!1,isEdge:!1,currentIndexes:[]},i=()=>{a.isDisabled=!0},s=e=>{const t=e.touches[0].pageX;(t<=300||t>=window.innerWidth-300)&&(a.isEdge=!0)},f=()=>{a.isEdge&&setTimeout(()=>{a.isEdge=!1},350)};function l(e,t,n,u,i=!1,s){const f=Object(r.q)(-1),l=Object(r.q)(!1),b=Object(o.a)(e),h=Object(r.q)(!0),m=Object(r.q)([]),p=Object(o.a)(s),g=Object(r.q)(!1),y=Object(r.m)((t=!1)=>{if(s){const e=p||[];if(e.length0){const e=m.current[m.current.length-t-1];let n=t;if(e){const t=a.currentIndexes.findIndex(t=>t===e.index);n=a.currentIndexes.length-t-1}a.isHistoryAltered=!0,window.history.go(-n);m.current.splice(m.current.length-t-1,t).forEach(({index:e})=>{a.currentIndexes.splice(a.currentIndexes.indexOf(e),1)})}s.length>0&&setTimeout(()=>{const e=++a.currentIndex;a.currentIndexes[a.currentIndexes.length-1]=e,window.history.replaceState({index:e,state:u},"","#"+s[s.length-1]),m.current[m.current.length-1]={index:e,hash:s[s.length-1]}},0)}}}else e&&!t&&(h.current=!1,l.current?(l.current=!1,a.currentIndexes.push(f.current)):setTimeout(()=>{const e=++a.currentIndex;a.currentIndexes.push(e),window.history[a.currentIndexes.includes(a.nextStateIndexToReplace-1)&&0!==window.history.state.index&&a.nextStateIndexToReplace===e&&!i?"replaceState":"pushState"]({index:e,state:u},""),f.current=e,i&&(a.nextStateIndexToReplace=a.currentIndex+1)},0)),!t&&e||h.current||(f.current!==a.currentIndex&&i||(a.isHistoryAltered=!0,window.history.back(),setTimeout(()=>{a.nextStateIndexToReplace=-1},400)),a.currentIndexes.splice(a.currentIndexes.indexOf(f.current),1),h.current=!0)},[u,s,e,p,i]);return Object(r.n)(()=>{const r=e=>{if(a.isHistoryAltered)return void setTimeout(()=>{a.isHistoryAltered=!1},0);const{index:r}=e.state,u=r||0;try{const r=s?m.current[m.current.length-1].index:f.current,o=a.currentIndexes[a.currentIndexes.indexOf(r)-1];if(a.isDisabled)return;!h.current&&(0===u||u===o)||s&&(0===u||u===o)?(s&&(g.current=!0,m.current.pop()),a.currentIndexes.splice(a.currentIndexes.indexOf(r),1),t&&(a.isEdge&&Object(d.d)().disableHistoryAnimations(),t(!a.isEdge),h.current=!0)):u===r&&h.current&&n&&!s&&(l.current=!0,a.isEdge&&Object(d.d)().disableHistoryAnimations(),n(e.state.state))}catch(e){}},u=s?!p||!Object(c.a)(p,s):b!==e;return!a.isDisabled&&u&&y(),window.addEventListener("popstate",r),()=>window.removeEventListener("popstate",r)},[u,y,s,e,t,n,p,b,i]),{forceClose:()=>y(!0)}}u.e&&(window.addEventListener("touchstart",s),window.addEventListener("touchend",f),window.addEventListener("popstate",f)),window.history.replaceState({index:a.currentIndex},"")},function(e,t,n){"use strict";var r=n(0),u=n(9);t.a=(e=!1,t,n=!1,o="fast",d=!1)=>{const[c,a]=Object(r.r)(!e),i=Object(r.q)(),[s,f]=Object(r.r)(e&&n);e?(a(!1),f(!0),i.current&&(window.clearTimeout(i.current),i.current=void 0)):(f(!1),c||i.current||(i.current=window.setTimeout(()=>{a(!0),t&&t(),i.current=void 0},d?0:350)));const l=s&&!(d&&!e),b=Boolean(i.current),h=e||b;return{shouldRender:h,transitionClassNames:Object(u.a)(o&&"opacity-transition",o,l&&"open",h&&"shown",b&&"closing")}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));function r(e,t=30){return!e||e.length<=t?e:e.substr(0,t)+"..."}},function(e){e.exports=JSON.parse('{"--color-primary":["#50A2E9","#8378DB"],"--color-primary-opacity":["#50A2E980","#8378DB80"],"--color-primary-shade":["#4a95d6","#7b71c6"],"--color-background":["#FFFFFF","#212121"],"--color-background-secondary":["#f4f4f5","#121212"],"--color-background-secondary-accent":["#E4E4E5","#100f10"],"--color-background-own":["#EEFEDF","#8378DB"],"--color-background-own-apple":["#E7FDCC","#8378DB"],"--color-background-selected":["#F4F4F5","#2C2C2C"],"--color-background-own-selected":["#d4fcae","#7b71c6"],"--color-chat-hover":["#F4F4F5","#2C2C2C"],"--color-chat-active":["#4C90E6","#8378DB"],"--color-item-active":["#ededed","#292929"],"--color-text":["#000000","#FFFFFF"],"--color-text-secondary":["#707579","#AAAAAA"],"--color-text-secondary-apple":["#8E8E92","#AAAAAA"],"--color-borders":["#DADCE0","#100F10"],"--color-borders-input":["#DADCE0","#5B5B5A"],"--color-links":["#52A1EF","#868DF6"],"--color-links-hover":["#2d8dec","#6b5fcc"],"--color-gray":["#C4C9CC","#717579"],"--color-pinned":["#C4C9CC","#707579"],"--color-default-shadow":["#72727240","#1010109c"],"--color-light-shadow":["#7272722B","#00000040"],"--color-green":["#4DCD5E","#8378DB"],"--color-text-meta-colored":["#4DCD5E","#8378DB"],"--color-reply-hover":["#F4F4F4","#272727"],"--color-reply-active":["#E8E9E9","#2E2F2F"],"--color-reply-own-hover":["#DBF4CE","#6458bc"],"--color-reply-own-hover-apple":["#d9f9c1","#6458bc"],"--color-reply-own-active":["#C8EBBC","#4F4A9F"],"--color-reply-own-active-apple":["#d5edc2","#4F4A9F"],"--color-accent-own":["#4FAE4E","#FFFFFF"],"--color-message-meta-own":["#4FAE4EFF","#FFFFFF88"],"--color-own-links":["#52A1EF","#FFFFFF"],"--color-code":["#4a729a","#93c4ef"],"--color-code-own":["#3c7940","#FFFFFF"],"--color-code-bg":["#70757914","#ffffff26"],"--color-code-own-bg":["#70757914","#ffffff26"]}')},function(e,t,n){"use strict";var r=n(0),u=n(9),o=n(16);n(99);t.a=e=>{const{icon:t,className:n,children:d,onClick:c,href:a,download:i,disabled:s,destructive:f,ariaLabel:l}=e,b=Object(o.a)(),h=Object(r.m)(e=>{if(s||!c)return e.stopPropagation(),void e.preventDefault();c(e)},[s,c]),m=Object(r.m)(e=>{if(13===e.keyCode||32===e.keyCode)return s||!c?(e.stopPropagation(),void e.preventDefault()):void c(e)},[s,c]),p=Object(u.a)("MenuItem",n,s&&"disabled",f&&"destructive"),g=r.a.createElement(r.a.Fragment,null,t&&r.a.createElement("i",{className:"icon-"+t,"data-char":t.startsWith("char-")?t.replace("char-",""):void 0}),d);return a?r.a.createElement("a",{tabIndex:0,className:p,href:a,download:i,"aria-label":l,title:l,target:a.startsWith(window.location.origin)?"_self":"_blank",rel:"noopener noreferrer",dir:b.isRtl?"rtl":void 0,onClick:c},g):r.a.createElement("div",{role:"button",tabIndex:0,className:p,onClick:h,onKeyDown:m,"aria-label":l,title:l,dir:b.isRtl?"rtl":void 0},g)}},function(e,t,n){"use strict";var r=n(0),u=n(10);n(93);t.a=Object(r.h)(()=>{const[e,t]=Object(r.r)([]),n=Object(r.p)(()=>Object(u.a)(()=>{t([])},700,!1),[]),o=Object(r.m)(r=>{if(0!==r.button)return;const u=r.currentTarget,o=u.getBoundingClientRect(),d=u.offsetWidth/2;t([...e,{x:r.clientX-o.x-d/2,y:r.clientY-o.y-d/2,size:d}]),requestAnimationFrame(()=>{n()})},[e,n]);return r.a.createElement("div",{className:"ripple-container",onMouseDown:o},e.map(({x:e,y:t,size:n})=>r.a.createElement("span",{style:`left: ${e}px; top: ${t}px; width: ${n}px; height: ${n}px;`})))})},function(e,t,n){"use strict";var r=n(62),u=n(42);let o=!1;const d=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i,c=(e,t,n)=>(1-n)*e+n*t,a=Object.keys(u).map(e=>({property:e,colors:[i(u[e][0]),i(u[e][1])]}));function i(e){const t=d.exec(e);return{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16),a:void 0!==t[4]?parseInt(t[4],16):void 0}}function s(e,t,n=1){a.forEach(({property:r,colors:u})=>{const o=Math.round(c(u[e].r,u[t].r,n)),d=Math.round(c(u[e].g,u[t].g,n)),a=Math.round(c(u[e].b,u[t].b,n)),i=void 0!==u[e].a?Math.round(c(u[e].a,u[t].a,n)):void 0;document.documentElement.style.setProperty(r,void 0!==i?`rgba(${o},${d},${a},${i/255})`:`rgb(${o},${d},${a})`)})}t.a=(e,t)=>{const n="dark"===e,u=o&&t,d=n?0:1,c=n?1:0,a=Date.now(),i=document.querySelector('meta[name="theme-color"]');document.documentElement.classList.remove("theme-"+(n?"light":"dark")),o&&document.documentElement.classList.add("no-animations"),document.documentElement.classList.add("theme-"+e),i&&i.setAttribute("content",n?"#212121":"#fff"),setTimeout(()=>{document.documentElement.classList.remove("no-animations")},500),o=!0,u?Object(r.b)(()=>{const e=Math.min((Date.now()-a)/200,1);return s(d,c,function(e){return 1-(1-e)**3.5}(e)),e<1}):s(d,c)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"b",(function(){return f})),n.d(t,"c",(function(){return l}));var r=n(84),u=n.n(r),o=n(6),d=n(17),c=n(10);let a,i;const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";async function f(e,t){for(b();!i.wasmReady;)await Object(c.f)(2e3);const{result:n,width:r,height:u}=await function(e,t){return new Promise(n=>{i.requests=i.requests||new Map,i.requests.set(e,n),i.postMessage({id:e,blob:t})})}(e,t);if(r&&u)return function({result:e,width:t,height:n}){a||(a=document.createElement("canvas"));return new Promise(r=>{const u=new ImageData(e,t,n);a.width=t,a.height=n;a.getContext("2d").putImageData(u,0,0),a.toBlob(e=>{r(null!=e?e:void 0)},"image/png",1)})}({result:n,width:r,height:u})}async function l(e,t){if(Object(o.t)()||"data:image/webp"!==t.substr(0,15))return t;b();const n=await f(e,Object(d.d)(t));if(!n)throw new Error("Can't convert webp to png. Url: "+t);return Object(d.a)(n)}function b(){i||(i=new u.a,i.wasmReady=!1,i.onmessage=h)}function h(e){const{id:t}=e.data;switch(e.data.type){case"initialized":i.wasmReady=!0;break;case"result":if(i.requests.has(t)){const n=i.requests.get(t);i.requests.delete(t),n(e.data)}}}},function(e,t,n){"use strict";var r=n(0),u=n(9),o=n(16);t.a=Object(r.h)(({ref:e,id:t,className:n,value:d,label:c,error:a,success:i,disabled:s,readOnly:f,placeholder:l,autoComplete:b,inputMode:h,maxLength:m,onChange:p,onInput:g,onKeyPress:y,onKeyDown:v,onBlur:O,onPaste:j})=>{const w=Object(o.a)(),I=a||i||c,C=Object(u.a)("input-group",d&&"touched",a?"error":i&&"success",s&&"disabled",f&&"disabled",I&&"with-label",n);return r.a.createElement("div",{className:C,dir:w.isRtl?"rtl":void 0},r.a.createElement("input",{ref:e,className:"form-control",type:"text",id:t,dir:"auto",value:d||"",placeholder:l,maxLength:m,autoComplete:b,inputMode:h,disabled:s,readOnly:f,onChange:p,onInput:g,onKeyPress:y,onKeyDown:v,onBlur:O,onPaste:j}),I&&r.a.createElement("label",{htmlFor:t},I))})},function(e,t,n){"use strict";var r=n(0),u=n(9),o=n(16),d=n(26);n(95);t.a=Object(r.h)(({id:e,name:t,value:n,label:c,subLabel:a,checked:i,disabled:s,round:f,blocking:l,isLoading:b,onChange:h,onCheck:m})=>{const p=Object(o.a)(),g=Object(r.m)(e=>{h&&h(e),m&&m(e.currentTarget.checked)},[h,m]),y=Object(u.a)("Checkbox",s&&"disabled",f&&"round",b&&"loading",l&&"blocking");return r.a.createElement("label",{className:y,dir:p.isRtl?"rtl":void 0},r.a.createElement("input",{type:"checkbox",id:e,name:t,value:n,checked:i,disabled:s,onChange:g}),r.a.createElement("div",{className:"Checkbox-main"},r.a.createElement("span",{className:"label",dir:"auto"},c),a&&r.a.createElement("span",{className:"subLabel",dir:"auto"},a)),b&&r.a.createElement(d.a,null))})},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(56);function u(e){return Object(r.a)({onEsc:e})}},function(e,t,n){"use strict";function r(e){return String(e).replace(/\d(?=(\d{3})+$)/g,"$& ")}function u(e){return".0"===String(e.toFixed(1)).substr(-2)?Math.round(e):e.toFixed(1).replace(".",",")}function o(e){return e<1e3?e:e<1e6?u(e/1e3)+"K":u(e/1e6)+"M"}function d(e,t=2){return e.replace(/[.,!@#$%^&*()_+=\-`~[\]/\\{}:"|<>?]+/gi,"").trim().split(/\s+/).slice(0,t).map(e=>e.length&&e.match(/./u)[0].toUpperCase()).join("")}n.d(t,"a",(function(){return r})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return d}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));const r=[]},function(e,t,n){"use strict";var r=n(29);t.a=(e,t)=>{const n=Object(r.a)(t);n&&!t.some((e,t)=>e!==n[t])||e(n||[])}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));const r=/[^\wа-яё]+/;function u(e,t){if(!e||!t)return!1;const n=e.toLowerCase().split(r);return t.toLowerCase().split(r).every(e=>n.some(t=>t.startsWith(e)))}},function(e,t,n){"use strict";n.d(t,"b",(function(){return f}));var r=n(10),u=n(2),o=n(6);const d=o.l&&l(),c=window.innerHeight;let a=f(),i=!1;const s=Object(r.h)(()=>{a=f(),!i&&((a.width<=u.ob||a.width<=u.nb&&a.height<=u.mb)!==o.l||o.l&&d!==l())&&window.location.reload()},250,!0);function f(){const e=.01*window.innerHeight;return document.documentElement.style.setProperty("--vh",e+"px"),{width:window.innerWidth,height:window.innerHeight}}function l(){return o.e?window.matchMedia("(orientation: landscape)").matches:window.matchMedia("screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)").matches}window.addEventListener("resize",s),window.addEventListener("orientationchange",s),t.a={get:()=>a,getIsKeyboardVisible:()=>c>a.height,disableRefresh:function(){i=!0},enableRefresh:function(){i=!1}}},function(e,t,n){"use strict";var r=n(0),u=n(40),o=n(64),d=n(80),c=n(58),a=n(49),i=n(9),s=n(37),f=n(39);n(97);t.a=({ref:e,containerRef:t,isOpen:n,className:l,style:b,children:h,positionX:m="left",positionY:p="top",autoClose:g=!1,footer:y,noCloseOnBackdrop:v=!1,onCloseAnimationEnd:O,onClose:j,onMouseEnter:w,onMouseLeave:I,shouldSkipTransition:C})=>{let E=Object(r.q)(null);e&&(E=e);const S=t||E,{transitionClassNames:M}=Object(u.a)(n,O,C,void 0,C);Object(r.n)(()=>n&&j?Object(a.a)(j):void 0,[n,j]),Object(f.a)(n,j,void 0,void 0,g),Object(c.a)(([e])=>{void 0!==e&&Object(s.d)(200)},[n]);const A=Object(o.a)(E,n,g?j:void 0,void 0,!0);Object(d.a)(n,S,v?void 0:j);const k=Object(i.a)("bubble menu-container custom-scroll",p,m,y&&"with-footer",M);return r.a.createElement("div",{className:Object(i.a)("Menu no-selection",l),onKeyDown:n?A:void 0,onMouseEnter:w,onMouseLeave:n?I:void 0,style:b},n&&r.a.createElement("div",{className:"backdrop"}),r.a.createElement("div",{ref:E,className:k,style:`transform-origin: ${p} ${m}`,onClick:g?j:void 0},h,y&&r.a.createElement("div",{className:"footer"},y)))}},function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));const r={Enter:"onEnter",Backspace:"onBackspace",Delete:"onDelete",Esc:"onEsc",Escape:"onEsc",ArrowUp:"onUp",ArrowDown:"onDown",ArrowLeft:"onLeft",ArrowRight:"onRight",Tab:"onTab"},u={onEnter:[],onDelete:[],onBackspace:[],onEsc:[],onUp:[],onDown:[],onLeft:[],onRight:[],onTab:[]};function o(e){return d()||document.addEventListener("keydown",c,!0),Object.keys(e).forEach(t=>{const n=e[t];if(!n)return;const r=u[t];r&&r.push(n)}),()=>{!function(e){Object.keys(e).forEach(t=>{const n=e[t],r=u[t];if(r){const e=r.findIndex(e=>e===n);-1!==e&&r.splice(e,1)}}),d()||document.removeEventListener("keydown",c,!1)}(e)}}function d(){return Object.values(u).some(e=>Boolean(e.length))}function c(e){const t=r[e.key];if(!t)return;const{length:n}=u[t];if(!n)return;e.stopPropagation();(0,u[t][n-1])(e)}},function(e,t,n){"use strict";n.d(t,"b",(function(){return y})),n.d(t,"c",(function(){return v})),n.d(t,"a",(function(){return O}));var r=n(8),u=n(2),o=n(5),d=n(12),c=n(17),a=n(6),i=n(82),s=n.n(i),f=n(83),l=n.n(f);async function b(e){const t=await new Response(e).arrayBuffer();return new Promise(e=>{const n=new Uint8Array(t);let r=new s.a,u=new l.a;r.onmessage=e=>{null===e.data?u.postMessage({command:"done"}):u.postMessage({command:"encode",buffers:e.data},e.data.map(({buffer:e})=>e))},u.onmessage=t=>{"page"===t.data.message&&(e(new Blob([t.data.page],{type:"audio/wav"})),r.terminate(),r=void 0,u.terminate(),u=void 0)},u.postMessage({command:"init",wavBitDepth:16,wavSampleRate:48e3}),r.postMessage({command:"init",decoderSampleRate:48e3,outputBufferSampleRate:48e3}),r.postMessage({command:"decode",pages:n},[n.buffer])})}var h=n(46);const m={[r.ApiMediaFormat.DataUri]:d.a.Text,[r.ApiMediaFormat.BlobUrl]:d.a.Blob,[r.ApiMediaFormat.Lottie]:d.a.Json,[r.ApiMediaFormat.Progressive]:void 0,[r.ApiMediaFormat.Stream]:void 0},p=new Map,g=new Map;function y(e,t,n){if(t===r.ApiMediaFormat.Progressive)return a.h?function(e){const t="./progressive/"+e;return p.set(e,t),Promise.resolve(t)}(e):y(e,r.ApiMediaFormat.BlobUrl,n);if(!g.has(e)){const i=async function(e,t,n){if(!u.X){const n=e.startsWith("avatar")?u.Z:u.Y,r=await d.c(n,e,m[t]);if(r){let t=r;if("audio/ogg"!==r.type||a.g||(t=await b(t)),"image/webp"===r.type&&!Object(a.t)()&&t){const n=await Object(h.b)(e,t);n&&(t=n)}const n=j(t);return p.set(e,n),n}}if(t===r.ApiMediaFormat.Stream){const r=new MediaSource,u=URL.createObjectURL(r);let d=!1;return r.addEventListener("sourceopen",()=>{if(d)return;d=!0;const u=r.addSourceBuffer("audio/mpeg");Object(o.a)("downloadMedia",{url:e,mediaFormat:t},(e,t)=>{n&&n(e),1===e&&r.endOfStream(),t&&u.appendBuffer(t)})}),p.set(e,u),u}const i=await Object(o.a)("downloadMedia",{url:e,mediaFormat:t},n);if(!i)throw new Error("Failed to fetch media");let{prepared:s,mimeType:f}=i;if("audio/ogg"===f&&!a.g){const e=await Object(c.e)(s);URL.revokeObjectURL(s);const t=await b(e);s=j(t),f=e.type}if("image/webp"===f&&!Object(a.t)()){const t=await Object(c.e)(s);URL.revokeObjectURL(s);const n=await Object(h.b)(e,t);n&&(s=j(n))}return p.set(e,s),s}(e,t,n).catch(e=>{u.r&&console.warn(e)}).finally(()=>{g.delete(e)});g.set(e,i)}return g.get(e)}function v(e){return p.get(e)}function O(e){Object(o.b)(e)}function j(e){return e instanceof Blob?URL.createObjectURL(e):e}a.h&&navigator.serviceWorker.addEventListener("message",async e=>{const{type:t,messageId:n,params:u}=e.data;if("requestPart"!==t)return;const d=await Object(o.a)("downloadMedia",{mediaFormat:r.ApiMediaFormat.Progressive,...u});if(!d)return;const{arrayBuffer:c,mimeType:a,fullSize:i}=d;navigator.serviceWorker.controller.postMessage({type:"partResponse",messageId:n,result:{arrayBuffer:c,mimeType:a,fullSize:i}},[c])})},function(e,t,n){"use strict";var r=n(0),u=n(29);t.a=(e,t,n)=>{const o=Object(u.a)(t);return Object(r.n)(()=>e(o||[]),t,n)}},function(e,t,n){"use strict";var r=n(0),u=n(1);const o=e=>{const t=[];let n=0;const r=e.length;let u;for(;n65535&&(u-=65536,t.push(String.fromCharCode(u>>>10&1023|55296)),u=56320|1023&u),t.push(String.fromCharCode(u))}return t.join("")};function d(e,t,n){let r;for(e=n?Math.floor(e/700):e>>1,e+=Math.floor(e/t),r=0;e>455;r+=36)e=Math.floor(e/35);return Math.floor(r+36*e/(e+38))}function c(e,t){const n=[],r=[],u=e.length;let c,a,i,s,f,l,b,h,m,p,g,y,v;for(c=128,i=0,s=72,f=e.lastIndexOf("-"),f<0&&(f=0),l=0;l=128)throw new RangeError("Illegal input >= 0x80");n.push(e.charCodeAt(l))}for(b=f>0?f+1:0;b=u)throw RangeError("punycode_bad_input(1)");if(g=(O=e.charCodeAt(b++))-48<10?O-22:O-65<26?O-65:O-97<26?O-97:36,g>=36)throw RangeError("punycode_bad_input(2)");if(g>Math.floor((2147483647-i)/m))throw RangeError("punycode_overflow(1)");if(i+=g*m,y=p<=s?1:p>=s+26?26:p-s,gMath.floor(2147483647/(36-y)))throw RangeError("punycode_overflow(2)");m*=36-y}if(a=n.length+1,s=d(i-h,a,0===h),Math.floor(i/a)>2147483647-c)throw RangeError("punycode_overflow(3)");c+=Math.floor(i/a),i%=a,t&&r.splice(i,0,e.charCodeAt(b-1)-65<26),n.splice(i,0,c),i++}var O;if(t)for(i=0,v=n.length;i{const{toggleSafeLinkModal:c,openTelegramLink:a}=Object(u.d)(),b=o||t,h=e!==b,m=Object(r.m)(t=>t.ctrlKey||t.altKey||t.shiftKey||t.metaKey||!e||!e.match(i.ub)&&!e.match(i.tb)?!h||(c({url:e}),t.preventDefault(),!1):(t.preventDefault(),a({url:e}),!1),[h,a,c,e]);if(!e)return;const p=Object(s.a)(n||"text-entity-link",t.length>50&&"long-word-break-all");return r.a.createElement("a",{href:f(e),title:l(e),target:"_blank",rel:"noopener noreferrer",className:p,onClick:m,dir:d?"rtl":"auto"},b)})},function(e,t,n){"use strict";n.d(t,"e",(function(){return r})),n.d(t,"b",(function(){return u})),n.d(t,"d",(function(){return o})),n.d(t,"a",(function(){return d})),n.d(t,"c",(function(){return c}));function r(e){return e>536870912?(e/1073741824).toFixed(1)+" GB":e>524288?(e/1048576).toFixed(1)+" MB":(e/1024).toFixed(1)+" KB"}function u(e){const{fileName:t,mimeType:n}=e;return o(t,n)}function o(e,t){return e&&-1!==e.indexOf(".")?e.split(".").pop():t.split("/").pop()}function d(e){switch(e){case"apk":case"xls":case"xlsx":return"green";case"zip":case"rar":case"7z":case"tar":case"gz":case"ppt":case"pptx":return"orange";case"pdf":case"xps":return"red";default:return"default"}}function c(e){return Boolean(e.previewBlobUrl||e.thumbnail)}},function(e,t,n){"use strict";n.d(t,"b",(function(){return u})),n.d(t,"a",(function(){return d}));const r={missing_payment_information:{field:"cardNumber",fieldError:"Incorrect card number"},invalid_number:{field:"cardNumber",fieldError:"Incorrect card number"},number:{field:"cardNumber",fieldError:"Incorrect card number"},exp_year:{field:"expiry",fieldError:"Incorrect year"},exp_month:{field:"expiry",fieldError:"Incorrect month"},invalid_expiry_year:{field:"expiry",fieldError:"Incorrect year"},invalid_expiry_month:{field:"expiry",fieldError:"Incorrect month"},cvc:{field:"cvv",fieldError:"Incorrect CVV"},invalid_cvc:{field:"cvv",fieldError:"Incorrect CVV"}};function u(e){const{message:t,code:n,param:u}=e,{field:o,fieldError:d,description:c}=u?r[u]:r[n];return{field:o,fieldError:d,description:c||t}}const o={ADDRESS_STREET_LINE1_INVALID:{field:"streetLine1",fieldError:"Incorrect street address"},ADDRESS_STREET_LINE2_INVALID:{field:"streetLine2",fieldError:"Incorrect street address"},ADDRESS_CITY_INVALID:{field:"city",fieldError:"Incorrect city"},ADDRESS_COUNTRY_INVALID:{field:"countryIso2",fieldError:"Incorrect country"},ADDRESS_POSTCODE_INVALID:{field:"postCode",fieldError:"Incorrect post code"},ADDRESS_STATE_INVALID:{field:"state",fieldError:"Incorrect state"},REQ_INFO_NAME_INVALID:{field:"fullName",fieldError:"Incorrect name"},REQ_INFO_PHONE_INVALID:{field:"phone",fieldError:"Incorrect phone"},REQ_INFO_EMAIL_INVALID:{field:"email",fieldError:"Incorrect email"}};function d(e){return Object.values(e).reduce((e,t)=>{if(!("hasErrorKey"in t)||!t.hasErrorKey)return e;const n=o[t.message];return n&&(e={...e,[n.field]:n.fieldError}),e},{})}},function(e,t,n){"use strict";n.d(t,"b",(function(){return o})),n.d(t,"a",(function(){return d}));var r=n(10);let u;function o(e,t){t||(u&&!u.isCancelled&&(u.isCancelled=!0),u=t={isCancelled:!1}),Object(r.b)(()=>{!t.isCancelled&&e()&&o(e,t)})}function d(e){Object(r.b)(()=>{e()&&d(e)})}},function(e,t,n){"use strict";var r=n(0),u=n(55);n(98);t.a=({trigger:e,className:t,children:n,positionX:o="left",positionY:d="top",footer:c,forceOpen:a,onOpen:i,onClose:s})=>{const f=Object(r.q)(null),l=Object(r.q)(null),[b,h]=Object(r.r)(!1);return r.a.createElement("div",{ref:l,className:"DropdownMenu "+(t||""),onKeyDown:e=>{const t=f.current;if(!b||40!==e.keyCode||!t)return;const n=document.activeElement,r=Array.from(t.children);n&&-1!==r.indexOf(n)||r[0].focus()}},e({onTrigger:()=>{h(!b),b?s&&s():i&&i()},isOpen:b}),r.a.createElement(u.a,{ref:f,containerRef:l,isOpen:b||!!a,className:t||"",positionX:o,positionY:d,footer:c,autoClose:!0,onClose:()=>{h(!1),s&&s()},shouldSkipTransition:a},n))}},function(e,t,n){"use strict";var r=n(0);t.a=(e,t,n,u,o)=>{const[d,c]=Object(r.r)(-1);Object(r.n)(()=>{c(-1);const n=e.current;t&&n&&!o&&(n.tabIndex=-1,n.focus())},[e,t,o]);return Object(r.m)(t=>{const r=e.current;if(!r)return;if(13===t.keyCode&&n)return void n(d);if(38!==t.keyCode&&40!==t.keyCode)return;const o=document.activeElement,a=Array.from(u?r.querySelectorAll(u):r.children);let i=o&&a.indexOf(o)||d;if(38===t.keyCode&&i>0)i--;else if(40===t.keyCode&&i{if(e.length>24)return!1;if(!Boolean(e.match(u)))return!1;let t=0;for(;r.a.exec(e);)if(t++,t>3)return r.a.lastIndex=0,!1;return t}},function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return d}));const r=["female_sign","male_sign","medical_symbol"];function u(e){const t=e.split("-").map(e=>parseInt(e,16));return String.fromCodePoint(...t)}function o(e){let t;if(1===e.length)t=e.charCodeAt(0).toString(16).padStart(4,"0");else{const n=[];for(let t=0;t=55296&&e.charCodeAt(t)<=56319?e.charCodeAt(t+1)>=56320&&e.charCodeAt(t+1)<=57343&&n.push(1024*(e.charCodeAt(t)-55296)+(e.charCodeAt(t+1)-56320)+65536):(e.charCodeAt(t)<55296||e.charCodeAt(t)>57343)&&n.push(e.charCodeAt(t));t=n.map(e=>e.toString(16).padStart(4,"0")).join("-")}return t}function d(e){const t={categories:[],emojis:{}};for(let n=0;n{void 0!==e.props[r]&&void 0===t.props[r]&&g(n,r,e.props[r])}),u.forEach(r=>{void 0!==t.props[r]&&e.props[r]!==t.props[r]&&(void 0===e.props[r]?p(n,r,t.props[r]):function(e,t,n,r){"value"===t?e.value=void 0!==r?r:"":(g(e,t,n),p(e,t,r))}(n,r,e.props[r],t.props[r]))})}(t,n,Object(r.b)(t)),n.children=function(e,t,n){if(t.props.teactFastList)return function(e,t,n){const u=new Set(t.children.map(e=>{const t="props"in e&&e.props.key;return o.r&&Object(r.f)(e)&&!t&&console.warn("Missing `key` in `teactFastList`"),t}));let d=0;const c=e.children.reduce((e,r,o)=>{let c="props"in r?r.props.key:void 0;if(c&&!u.has(c))return f(n,r,void 0,t,-1),e;if(!c){const u=t.children[o],d=u&&"props"in u?u.props.key:void 0;if(!u||d)return f(n,r,void 0,t,-1),e;c="__indexKey#"+o}return e[c]={$element:r,index:d++,order:"props"in r?r.props.teactOrderKey:void 0},e},{});let a,i,s=[],l=0;t.children.forEach((e,r)=>{const u="props"in e?e.props.key:"__indexKey#"+r,o=c[u];if(!o)return a||(a=[],i=r),void a.push(e);a&&(s=s.concat(m(a,i,n,t)),i=void 0,a=void 0);const d="props"in e?e.props.teactOrderKey:void 0,b=o.index!==l&&o.order!==d,h=b&&l>o.index;b&&!h||l++,s.push(f(n,o.$element,e,t,r,{forceIndex:!0,...b&&{moveDirection:h?"down":"up"}}))}),a&&(s=s.concat(m(a,i,n,t)));return s}(e,t,n);const u=Math.max(e.children.length,t.children.length),d=[],c=t.children.length>e.children.length+1?document.createDocumentFragment():void 0;for(let r=0;r=e.children.length?{fragment:c}:void 0);u&&d.push(u)}c&&n.appendChild(c);return d}(t,n,u?e:Object(r.b)(t))}}return n}function l(e,t,n,u){if(!Object(r.d)(e))return e;const{componentInstance:o}=e;if(!o.isMounted){b(e=Object(r.i)(o),t,n,u);const d=e.children[0];Object(r.d)(d)&&(e.children=[l(d,e,0,u)]),o.isMounted=!0}return e}function b(e,t,n,r){const{componentInstance:u}=e;u.onUpdate=()=>{t.children[n]=f(r,t.children[n],u.$element,t,n,{skipComponentUpdate:!0})}}function h(e){if(Object(r.e)(e))return document.createTextNode("");if(Object(r.g)(e))return document.createTextNode(e.value);if(Object(r.d)(e))return h(e.children[0]);const{tag:t,props:n,children:u=[]}=e,o=document.createElement(t);return"object"==typeof n.ref&&(n.ref.current=o),Object.keys(n).forEach(e=>{p(o,e,n[e])}),e.children=u.map((t,n)=>f(o,void 0,t,e,n)),o}function m(e,t,n,r){if(1===e.length)return[f(n,void 0,e[0],r,t,{forceIndex:!0})];if(e.length>1){const u=document.createDocumentFragment(),o=e.map(e=>f(n,void 0,e,r,t,{fragment:u}));return n.childNodes[t]?n.insertBefore(u,n.childNodes[t]):n.appendChild(u),o}throw new Error("Unexpected input")}function p(e,t,n){void 0!==n&&("className"===t?e.className=n:"value"===t?e.value=n:"style"===t?e.style.cssText=n:t.startsWith("on")?Object(d.a)(e,t,n,t.endsWith("Capture")):t.startsWith("data-")||a.has(t)?e.setAttribute(t,n):c.has(t)||(e[i[t]||t]=n))}function g(e,t,n){"className"===t?e.className="":"value"===t?e.value="":"style"===t?e.style.cssText="":t.startsWith("on")?Object(d.c)(e,t,n,t.endsWith("Capture")):t.startsWith("data-")||a.has(t)?e.removeAttribute(t):c.has(t)||delete e[i[t]||t]}t.a={render:function(e,t){if(!t)return;let n=t.getAttribute("data-teact-head-id");n||(n=Object(u.a)(s),s[n]={children:[]},t.setAttribute("data-teact-head-id",n));const r=s[n];r.children=[f(t,r.children[0],e,r,0)]}}},function(e,t,n){"use strict";n.d(t,"a",(function(){return h}));var r=n(0),u=n(4),o=n(41),d=n(22),c=n(1),a=n(3),i=n(9),s=n(32);var f=Object(c.h)(void 0,(e,t)=>Object(a.l)(t,["openUserInfo"]))(({className:e,sender:t,openUserInfo:n,children:u})=>{const o=Object(r.m)(()=>{t&&n({id:t.id})},[t,n]);return t?r.a.createElement(s.a,{className:Object(i.a)("UserLink",e),onClick:o},u):u});var l=Object(c.h)(void 0,(e,t)=>Object(a.l)(t,["focusMessage"]))(({className:e,message:t,children:n,focusMessage:u})=>{const o=Object(r.m)(()=>{t&&u({chatId:t.chatId,messageId:t.id})},[u,t]);return t?r.a.createElement(s.a,{className:Object(i.a)("MessageLink",e),onClick:o},n):n});var b=Object(c.h)(void 0,(e,t)=>Object(a.l)(t,["openChat"]))(({className:e,chatId:t,openChat:n,children:u})=>{const o=Object(r.m)(()=>{t&&n({id:t})},[t,n]);return t?r.a.createElement(s.a,{className:Object(i.a)("ChatLink",e),onClick:o},u):u});function h(e,t,n,c,a,i,s={}){if(!t.content.action)return[];const{text:f,translationValues:h}=t.content.action,g=[],y={...s,maxTextLength:32};let v,O=p(e("Chat.Service.Group.UpdatedPinnedMessage1"!==f||a?f:"Message.PinnedGenericMessage",h&&h.length?h:void 0),"%action_origin%",n?!s.isEmbedded&&function(e,t,n){return Object(u.ib)(t)?function(e,t,n){const c=Object(o.a)(Object(u.k)(e,t));if(n)return c;return r.a.createElement(b,{className:"action-link",chatId:t.id},t&&Object(d.a)(c))}(e,t,n):m(t,n)}(e,n,s.asPlain)||" ":"User");return v=O.pop(),g.push(...O),O=p(v,"%target_user%",c?c.map(e=>m(e,s.asPlain)).filter(Boolean):"User"),v=O.pop(),g.push(...O),O=p(v,"%message%",a?function(e,t,n={}){const c=Object(u.O)(e,t),{photo:a,video:i,document:s,sticker:f}=Object(u.v)(t),{maxTextLength:b,isEmbedded:h,asPlain:m}=n,p=h&&c&&!a&&!i&&!s&&!f;let g=Object(o.a)(c,b);h&&(a?g="a photo":i?g=i.isGif?"a GIF":"a video":s?g="a document":f&&(g=c));if(m)return p?`«${g}»`:g;if(p)return r.a.createElement("span",null,"«",r.a.createElement(l,{className:"action-link",message:t},Object(d.a)(g)),"»");return r.a.createElement(l,{className:"action-link",message:t},Object(d.a)(g))}(e,a,y):"a message"),v=O.pop(),g.push(...O),O=p(v,"%product%",a?function(e){return e.content&&e.content.invoice?e.content.invoice.title:"a product"}(a):"a product"),v=O.pop(),g.push(...O),O=p(v,"%target_chat%",i?function(e,t){if(t)return"another chat";return r.a.createElement(b,{className:"action-link",chatId:e},"another chat")}(i,s.asPlain):"another chat"),g.push(...O),s.asPlain?g.join("").trim():g}function m(e,t){const n=Object(o.a)(Object(u.bb)(e));return t?n:r.a.createElement(f,{className:"action-link",sender:e},e&&Object(d.a)(n))}function p(e,t,n){const r=e.indexOf(t);if(r<0||!n)return[e];const u=[];return u.push(e.substring(0,r)),Array.isArray(n)?n.forEach((e,t)=>{u.push(e),t+1({userOrChat:t?Object(d.Jb)(e,t):void 0}),(e,t)=>Object(o.l)(t,["openChat","openChatByUsername"]))(({username:e,userOrChat:t,children:n,openChat:u,openChatByUsername:o})=>r.a.createElement("a",{onClick:()=>{t?u({id:t.id}):e&&o({username:e.substring(1)})},className:"text-entity-link",dir:"auto"},n))},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(2);function u(e){"function"==typeof window.navigator.setAppBadge&&window.navigator.setAppBadge(e).catch(e=>{r.r&&console.error(e)})}},function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var r=n(0);function u(e,t,n){Object(r.n)(()=>{const r=e=>{const r=t.current,u=e.target;r&&u&&(r.contains(e.target)&&!u.classList.contains("backdrop")||(e.preventDefault(),e.stopPropagation(),n&&n()))};return e&&n&&document.addEventListener("mousedown",r),()=>{document.removeEventListener("mousedown",r)}},[e,t,n])}},function(e,t,n){e.exports=function(){return new Worker(n.p+"f04c4dace6672b308b1e.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"5054ce745024de60a724.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"695e66b225ec96107343.worker.js")}},function(e,t,n){e.exports=function(){return new Worker(n.p+"4c9029ba18603b924ede.worker.js")}},function(e,t,n){"use strict";var r=n(1),u=n(2),o=n(6),d=n(14),c=n(45),a=n(7);!function(){function e(){const e=document.documentElement.className.match(/theme-(\w+)/),t=e?e[1]:"light",n=Object(r.e)(),o=Object(a.Db)(n),{animationLevel:d}=n.settings.byKey;o!==t&&(Object(c.a)(o,d===u.e),Object(r.g)({...n}))}const t=window.matchMedia("(prefers-color-scheme: dark)");"function"==typeof t.addEventListener?t.addEventListener("change",e):"function"==typeof t.addListener&&t.addListener(e)}(),Object(r.b)("init",e=>{const{animationLevel:t,messageTextSize:n,language:r}=e.settings.byKey,i=Object(a.Db)(e);Object(d.d)(r,void 0,!0),document.documentElement.style.setProperty("--composer-text-size",Math.max(n,o.e?16:15)+"px"),document.documentElement.style.setProperty("--message-text-size",n+"px"),document.body.classList.add("initial"),document.body.classList.add("animation-level-"+t),document.body.classList.add(o.n?"is-touch-env":"is-pointer-env"),Object(c.a)(i,t===u.e),o.j&&document.body.classList.add("is-safari"),o.e?document.body.classList.add("is-ios"):o.b?document.body.classList.add("is-android"):o.f&&document.body.classList.add("is-macos")}),Object(r.b)("setIsUiReady",(e,t,n)=>{const{uiReadyState:r}=n;return 2===r&&document.body.classList.remove("initial"),{...e,uiReadyState:r}}),Object(r.b)("setAuthPhoneNumber",(e,t,n)=>{const{phoneNumber:r}=n;return{...e,authPhoneNumber:r}}),Object(r.b)("setAuthRememberMe",(e,t,n)=>({...e,authRememberMe:Boolean(n)})),Object(r.b)("clearAuthError",e=>({...e,authError:void 0})),Object(r.b)("disableHistoryAnimations",()=>{setTimeout(()=>{Object(r.g)({...Object(r.e)(),shouldSkipHistoryAnimations:!1}),document.body.classList.remove("no-animate")},450),Object(r.g)({...Object(r.e)(),shouldSkipHistoryAnimations:!0},!0)})},function(e,t,n){"use strict";var r=n(1),u=n(11);Object(r.b)("setSettingOption",(e,t,n)=>Object(u.w)(e,n)),Object(r.b)("setThemeSettings",(e,t,n)=>{const{theme:r,...o}=n;return Object(u.x)(e,r,o)})},function(e,t,n){"use strict";var r=n(1),u=n(5),o=n(2),d=n(6),c=n(34),a=n(12),i=n(79),s=n(18);Object(r.b)("initApi",(e,t)=>{(async()=>{o.N||(await Object(s.d)(),Object(s.a)()),Object(u.c)(t.apiUpdate,{userAgent:navigator.userAgent,platform:d.r,sessionData:Object(s.e)()})})()}),Object(r.b)("setAuthPhoneNumber",(e,t,n)=>{const{phoneNumber:r}=n;return Object(u.a)("provideAuthPhoneNumber",r.replace(/[^\d]/g,"")),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("setAuthCode",(e,t,n)=>{const{code:r}=n;return Object(u.a)("provideAuthCode",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("setAuthPassword",(e,t,n)=>{const{password:r}=n;return Object(u.a)("provideAuthPassword",r),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("uploadProfilePhoto",(e,t,n)=>{const{file:r}=n;Object(u.a)("uploadProfilePhoto",r)}),Object(r.b)("signUp",(e,t,n)=>{const{firstName:r,lastName:o}=n;return Object(u.a)("provideAuthRegistration",{firstName:r,lastName:o}),{...e,authIsLoading:!0,authError:void 0}}),Object(r.b)("returnToAuthPhoneNumber",e=>(Object(u.a)("restartAuth"),{...e,authError:void 0})),Object(r.b)("goToAuthQrCode",e=>(Object(u.a)("restartAuthWithQr"),{...e,authIsLoadingQrCode:!0,authError:void 0})),Object(r.b)("saveSession",(e,t,n)=>{const{sessionData:r}=n;r?Object(s.f)(n.sessionData,e.currentUserId):Object(s.b)()}),Object(r.b)("signOut",()=>{(async()=>{try{await Object(c.d)(),await Object(u.a)("destroy")}catch(e){}Object(r.d)().reset()})()}),Object(r.b)("reset",()=>{Object(s.b)(),a.b(o.Y),a.b(o.Z),a.b(o.ab),a.b(o.o);const e=o.O.replace(/\d+$/,""),t=(o.O.match(/\d+$/)||[0])[0];for(let n=0;n{(async()=>{await Object(u.a)("disconnect")})()}),Object(r.b)("loadNearestCountry",e=>{"connectionStateReady"===e.connectionState&&(async()=>{const e=await Object(u.a)("fetchNearestCountry");Object(r.g)({...Object(r.e)(),authNearestCountry:e})})()}),Object(r.b)("setDeviceToken",(e,t,n)=>{Object(r.g)({...e,push:{deviceToken:n,subscribedAt:Date.now()}})}),Object(r.b)("deleteDeviceToken",e=>{const t={...e};delete t.push,Object(r.g)(t)})},function(e,t,n){"use strict";var r=n(1),u=n(13),o=n(5),d=n(3),c=n(7),a=n(11),i=n(4);function s(e,{visibility:t,allowedIds:n,deniedIds:r}){const{users:{byId:u},chats:{byId:o}}=e,d={visibility:t};let c,a;const s=e=>{if(!Object(i.ob)(e))return;const{id:t,accessHash:n}=u[e]||{};return t?{id:t,accessHash:n}:void 0},f=e=>{if(Object(i.ob)(e))return;const t=o[e];return t?{id:t.id}:void 0};return"contacts"!==t&&"nobody"!==t||(c=n.map(s).filter(Boolean),a=n.map(f).filter(Boolean),c.length>0&&(d.allowedUsers=c),a.length>0&&(d.allowedChats=a)),"everybody"!==t&&"contacts"!==t||(c=r.map(s).filter(Boolean),a=r.map(f).filter(Boolean),c.length>0&&(d.blockedUsers=c),a.length>0&&(d.blockedChats=a)),d}Object(r.b)("updateProfile",(e,t,n)=>{const{photo:d,firstName:i,lastName:s,bio:f,username:l}=n;(async()=>{const{currentUserId:t}=e;if(t){if(Object(r.g)({...Object(r.e)(),profileEdit:{progress:u.k.InProgress}}),d&&await Object(o.a)("updateProfilePhoto",d),i||s||f){if(await Object(o.a)("updateProfile",{firstName:i,lastName:s,about:f})){e=Object(r.e)();const n=t&&Object(c.Jb)(e,t);n&&Object(r.g)(Object(a.ob)(e,n.id,{firstName:i,lastName:s,fullInfo:{...n.fullInfo,bio:f}}))}}if(l){await Object(o.a)("updateUsername",l)&&t&&Object(r.g)(Object(a.ob)(Object(r.e)(),t,{username:l}))}Object(r.g)({...Object(r.e)(),profileEdit:{progress:u.k.Complete}})}})()}),Object(r.b)("checkUsername",(e,t,n)=>{const{username:d}=n;(async()=>{if(e.profileEdit&&e.profileEdit.progress===u.k.InProgress)return;Object(r.g)({...e,profileEdit:{progress:e.profileEdit?e.profileEdit.progress:u.k.Idle,isUsernameAvailable:void 0}});const t=await Object(o.a)("checkUsername",d);e=Object(r.e)(),Object(r.g)({...e,profileEdit:{...e.profileEdit,isUsernameAvailable:t}})})()}),Object(r.b)("loadWallpapers",()=>{(async()=>{const e=await Object(o.a)("fetchWallpapers",0);if(!e)return;const t=Object(r.e)();Object(r.g)({...t,settings:{...t.settings,loadedWallpapers:e.wallpapers}})})()}),Object(r.b)("uploadWallpaper",(e,t,n)=>{const d=n,c=URL.createObjectURL(d);Object(r.g)({...e,settings:{...e.settings,loadedWallpapers:[{slug:u.o,document:{fileName:"",size:d.size,mimeType:d.type,previewBlobUrl:c}},...e.settings.loadedWallpapers||[]]}}),(async()=>{const t=await Object(o.a)("uploadWallpaper",d);if(!t)return;const{wallpaper:n}=t;if(!(e=Object(r.e)()).settings.loadedWallpapers)return;const a=e.settings.loadedWallpapers[0];if(!a||a.slug!==u.o)return;const i={...n,document:{...n.document,previewBlobUrl:c}};Object(r.g)({...e,settings:{...e.settings,loadedWallpapers:[i,...e.settings.loadedWallpapers.slice(1)]}})})()}),Object(r.b)("loadBlockedContacts",()=>{(async()=>{const e=await Object(o.a)("fetchBlockedContacts");if(!e)return;let t=Object(r.e)();e.users&&e.users.length&&(t=Object(a.g)(t,Object(d.c)(e.users,"id"))),e.chats&&e.chats.length&&(t=Object(a.N)(t,Object(d.c)(e.chats,"id"))),t={...t,blocked:{...t.blocked,ids:[...t.blocked.ids||[],...e.blockedIds],totalCount:e.totalCount}},Object(r.g)(t)})()}),Object(r.b)("blockContact",(e,t,n)=>{const{contactId:u,accessHash:d}=n;(async()=>{if(!await Object(o.a)("blockContact",u,d))return;const e=Object(r.e)();Object(r.g)(Object(a.a)(e,u))})()}),Object(r.b)("unblockContact",(e,t,n)=>{const{contactId:u}=n;let d;if(Object(i.ob)(u)){const t=Object(c.Jb)(e,u);if(!t)return;d=t.accessHash}(async()=>{if(!await Object(o.a)("unblockContact",u,d))return;const e=Object(r.e)();Object(r.g)(Object(a.q)(e,u))})()}),Object(r.b)("loadAuthorizations",()=>{(async()=>{const e=await Object(o.a)("fetchAuthorizations");e&&Object(r.g)({...Object(r.e)(),activeSessions:e})})()}),Object(r.b)("terminateAuthorization",(e,t,n)=>{const{hash:u}=n;(async()=>{if(!await Object(o.a)("terminateAuthorization",u))return;const e=Object(r.e)();Object(r.g)({...e,activeSessions:e.activeSessions.filter(e=>e.hash!==u)})})()}),Object(r.b)("terminateAllAuthorizations",()=>{(async()=>{if(!await Object(o.a)("terminateAllAuthorizations"))return;const e=Object(r.e)();Object(r.g)({...e,activeSessions:e.activeSessions.filter(e=>e.isCurrent)})})()}),Object(r.b)("loadNotificationExceptions",e=>{const{serverTimeOffset:t}=e;(async()=>{const e=await Object(o.a)("fetchNotificationExceptions",{serverTimeOffset:t});e&&Object(r.g)(Object(a.f)(Object(r.e)(),e))})()}),Object(r.b)("loadNotificationSettings",e=>{const{serverTimeOffset:t}=e;(async()=>{const e=await Object(o.a)("fetchNotificationSettings",{serverTimeOffset:t});e&&Object(r.g)(Object(a.w)(Object(r.e)(),e))})()}),Object(r.b)("updateNotificationSettings",(e,t,n)=>{const{peerType:u,isSilent:d,shouldShowPreviews:c}=n;(async()=>{await Object(o.a)("updateNotificationSettings",u,{isSilent:d,shouldShowPreviews:c})&&Object(r.g)(Object(a.db)(Object(r.e)(),u,d,c))})()}),Object(r.b)("updateContactSignUpNotification",(e,t,n)=>{const{isSilent:u}=n;(async()=>{await Object(o.a)("updateContactSignUpNotification",u)&&Object(r.g)(Object(a.w)(Object(r.e)(),{hasContactJoinedNotifications:!u}))})()}),Object(r.b)("loadLanguages",()=>{(async()=>{const e=await Object(o.a)("fetchLanguages");e&&Object(r.g)(Object(a.w)(Object(r.e)(),{languages:e}))})()}),Object(r.b)("loadPrivacySettings",()=>{(async()=>{const[e,t,n,u,d]=await Promise.all([Object(o.a)("fetchPrivacySettings","phoneNumber"),Object(o.a)("fetchPrivacySettings","lastSeen"),Object(o.a)("fetchPrivacySettings","profilePhoto"),Object(o.a)("fetchPrivacySettings","forwards"),Object(o.a)("fetchPrivacySettings","chatInvite")]);if(!(e&&t&&n&&u&&d))return;const c=Object(r.e)();c.settings.privacy.phoneNumber=e,c.settings.privacy.lastSeen=t,c.settings.privacy.profilePhoto=n,c.settings.privacy.forwards=u,c.settings.privacy.chatInvite=d,Object(r.g)(c)})()}),Object(r.b)("setPrivacyVisibility",(e,t,n)=>{const{privacyKey:u,visibility:d}=n,{privacy:{[u]:c}}=e.settings;if(!c)return;const a=s(e,{visibility:d,allowedIds:[...c.allowUserIds,...c.allowChatIds],deniedIds:[...c.blockUserIds,...c.blockChatIds]});(async()=>{const e=await Object(o.a)("setPrivacySettings",u,a);if(e){const t=Object(r.e)();t.settings.privacy[u]=e,Object(r.g)(t)}})()}),Object(r.b)("setPrivacySettings",(e,t,n)=>{const{privacyKey:u,isAllowList:d,contactsIds:c}=n,{privacy:{[u]:a}}=e.settings;if(!a)return;const i=s(e,{visibility:a.visibility,allowedIds:d?c:[...a.allowUserIds,...a.allowChatIds],deniedIds:d?[...a.blockUserIds,...a.blockChatIds]:c});(async()=>{const e=await Object(o.a)("setPrivacySettings",u,i);if(e){const t=Object(r.e)();t.settings.privacy[u]=e,Object(r.g)(t)}})()}),Object(r.b)("updateIsOnline",(e,t,n)=>{Object(o.a)("updateIsOnline",n)}),Object(r.b)("loadContentSettings",()=>{(async()=>{const e=await Object(o.a)("fetchContentSettings");e&&Object(r.g)(Object(a.w)(Object(r.e)(),e))})()}),Object(r.b)("updateContentSettings",(e,t,n)=>{(async()=>{Object(r.g)(Object(a.w)(Object(r.e)(),{isSensitiveEnabled:n}));await Object(o.a)("updateContentSettings",n)||Object(r.g)(Object(a.w)(Object(r.e)(),{isSensitiveEnabled:!n}))})()})},function(e,t,n){"use strict";var r=n(1),u=n(2),o=n(34),d=n(11),c=n(14);Object(r.b)("apiUpdate",(e,t,n)=>{switch(u.r&&"updateUserStatus"!==n["@type"]&&"updateServerTimeOffset"!==n["@type"]&&console.log("[GramJs] UPDATE",n["@type"],{update:n}),n["@type"]){case"updateApiReady":!function(e){Object(o.c)(),Object(c.d)(e.settings.byKey.language)}(e);break;case"updateAuthorizationState":!function(e){let t=Object(r.e)();const n="authorizationStateReady"===t.authState,u=e.authorizationState;switch(Object(r.g)({...t,authState:u,authIsLoading:!1}),t=Object(r.e)(),u){case"authorizationStateLoggingOut":Object(r.g)({...t,isLoggingOut:!0});break;case"authorizationStateWaitCode":Object(r.g)({...t,authIsCodeViaApp:e.isCodeViaApp});break;case"authorizationStateWaitPassword":Object(r.g)({...t,authHint:e.hint});break;case"authorizationStateWaitQrCode":Object(r.g)({...t,authIsLoadingQrCode:!1,authQrCode:e.qrCode});break;case"authorizationStateReady":if(n)break;Object(r.g)({...t,isLoggingOut:!1,lastSyncTime:Date.now()})}}(n);break;case"updateAuthorizationError":!function(e){Object(r.g)({...Object(r.e)(),authError:e.message})}(n);break;case"updateConnectionState":!function(e){const{connectionState:t}=e,n=Object(r.e)();Object(r.g)({...n,connectionState:t}),"connectionStateReady"===t&&"authorizationStateReady"===n.authState?Object(r.d)().sync():"connectionStateBroken"===t&&Object(r.d)().signOut()}(n);break;case"updateSession":!function(e){const{sessionData:t}=e,{authRememberMe:n,authState:u}=Object(r.e)(),o=!t||!t.mainDcId;if(!n||"authorizationStateReady"!==u||o)return;Object(r.d)().saveSession({sessionData:t})}(n);break;case"updateServerTimeOffset":!function(e){const t=Object(r.e)();if(t.serverTimeOffset===e.serverTimeOffset)return;Object(r.g)({...t,serverTimeOffset:e.serverTimeOffset})}(n);break;case"updateCurrentUser":!function(e){const{currentUser:t}=e;Object(r.g)({...Object(d.ob)(Object(r.e)(),t.id,t),currentUserId:t.id}),function(e){const t=localStorage.getItem(u.zb);if(!t)return;const n=JSON.parse(t);n.id=e,localStorage.setItem(u.zb,JSON.stringify(n))}(t.id)}(n);break;case"error":"SESSION_REVOKED"===n.error.message&&t.signOut(),t.showDialog&&t.showDialog({data:{...n.error,hasErrorKey:!0}})}})},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";n.r(t);n(27),function(){function e(){var t=Error.call(this,"ServiceWorker is not supported.");return Object.setPrototypeOf(t,e.prototype),t}e.prototype=Object.create(Error.prototype)}();var r=n.p+"serviceWorker.js";var u=n(2),o=n(1),d=n(6),c=n(34);function a(e){const t=e.data;if(!t.type)return;const n=Object(o.d)();switch(t.type){case"focusMessage":n.focusMessage(t.payload)}}function i(){navigator.serviceWorker.removeEventListener("message",a),navigator.serviceWorker.addEventListener("message",a),Object(c.a)()}d.k&&(window.addEventListener("load",async()=>{try{await navigator.serviceWorker.register(r),u.r&&console.log("[SW] ServiceWorker registered"),await navigator.serviceWorker.ready,navigator.serviceWorker.controller?(u.r&&console.log("[SW] ServiceWorker ready"),i()):(u.r&&console.error("[SW] ServiceWorker not available"),d.e||d.b||Object(o.d)().showDialog({data:{message:"SERVICE_WORKER_DISABLED",hasErrorKey:!0}}))}catch(e){u.r&&console.error("[SW] ServiceWorker registration failed: ",e)}}),window.addEventListener("focus",async()=>{await navigator.serviceWorker.ready,i()}));var s=n(67);const f={isLeftColumnShown:!0,isChatInfoShown:!1,newChatMembersProgress:n(13).i.Closed,uiReadyState:0,serverTimeOffset:0,authRememberMe:!0,blocked:{ids:[],totalCount:0},users:{byId:{}},chats:{listIds:{},isFullyLoaded:{},orderedPinnedIds:{},totalCount:{},byId:{}},messages:{byChatId:{},messageLists:[]},scheduledMessages:{byChatId:{}},chatFolders:{byId:{},activeChatFolder:0},fileUploads:{byMessageLocalId:{}},recentEmojis:["grinning","kissing_heart","christmas_tree","brain","trophy"],stickers:{setsById:{},added:{},recent:{stickers:[]},favorite:{stickers:[]},greeting:{stickers:[]},featured:{setIds:[]},search:{},forEmoji:{}},emojiKeywords:{},gifs:{saved:{},search:{}},inlineBots:{isLoading:!1,byUsername:{}},globalSearch:{},userSearch:{},localTextSearch:{byChatThreadKey:{}},localMediaSearch:{byChatId:{}},management:{byChatId:{}},topPeers:{},topInlineBots:{},mediaViewer:{},audioPlayer:{},forwardMessages:{},pollResults:{},payment:{},notifications:[],dialogs:[],activeSessions:[],settings:{byKey:{theme:"light",shouldUseSystemTheme:!0,messageTextSize:d.e?u.M:d.f?u.U:u.w,animationLevel:u.d,messageSendKeyCombo:"enter",shouldAutoDownloadMediaFromContacts:!0,shouldAutoDownloadMediaInPrivateChats:!0,shouldAutoDownloadMediaInGroups:!0,shouldAutoDownloadMediaInChannels:!0,shouldAutoPlayGifs:!0,shouldAutoPlayVideos:!0,shouldSuggestStickers:!0,shouldLoopStickers:!0,language:"en"},themes:{light:{isBlurred:!0,patternColor:u.x},dark:{isBlurred:!0,patternColor:u.q}},privacy:{},notifyExceptions:{}},twoFaSettings:{},shouldShowContextMenuHint:!0};var l=n(8),b=n(10),h=n(37),m=n(3),p=n(7),g=n(18);const y=Object(b.h)(()=>Object(b.d)(E),5e3,!1);let v,O=!1,j=!1;function w(e){if(!u.I)return Object(g.c)(!0)?(I(),function(e){u.r&&console.time("global-state-cache-read");const t=localStorage.getItem(u.J),n=t?JSON.parse(t):void 0;u.r&&console.timeEnd("global-state-cache-read");n&&(n.settings.byKey={...e.settings.byKey,...n.settings.byKey},n.settings.themes={...e.settings.themes,...n.settings.themes},n.chatFolders={...e.chatFolders,...n.chatFolders},n.messages.messageLists||(n.messages.messageLists=[]));return{...e,...n}}(e)):void C()}function I(){O=!0,v=Object(b.c)(E,!0),window.addEventListener("blur",E),Object(o.a)(y)}function C(){O=!1,Object(o.f)(y),window.removeEventListener("blur",E),v&&v()}function E(){if(!O||j)return;const e=Object(o.e)();if(e.isLoggingOut)return;const t={...f,...Object(m.l)(e,["authState","authPhoneNumber","authRememberMe","authNearestCountry","currentUserId","contactList","topPeers","topInlineBots","recentEmojis","push","shouldShowContextMenuHint"]),isChatInfoShown:S(e),users:M(e),chats:A(e),messages:k(e),globalSearch:{recentlyFoundChatIds:e.globalSearch.recentlyFoundChatIds},settings:T(e),chatFolders:N(e)},n=JSON.stringify(t);localStorage.setItem(u.J,n)}function S(e){return window.innerWidth>u.lb&&e.isChatInfoShown}function M(e){const{users:{byId:t,selectedId:n}}=e,r=[...(e.chats.listIds.active||[]).slice(0,u.H).filter(e=>e>0),...Object.keys(t)].slice(0,u.K);return{byId:Object(m.l)(t,r),selectedId:window.innerWidth>u.lb?n:void 0}}function A(e){const t=[...(e.chats.listIds.active||[]).slice(0,u.H)],{chatId:n}=Object(p.z)(e)||{};return{...e.chats,byId:Object(m.l)(e.chats.byId,n?[...t,n]:t),listIds:{active:t},isFullyLoaded:{},orderedPinnedIds:{active:e.chats.orderedPinnedIds.active}}}function k(e){const t={},{chatId:n}=Object(p.z)(e)||{};[...(e.chats.listIds.active||[]).slice(0,u.H),...n?[n]:[]].forEach(n=>{const r=e.messages.byChatId[n];if(!r)return;const u=r.threadsById[l.MAIN_THREAD_ID];u&&u.viewportIds&&(t[n]={byId:Object(m.l)(r.byId,u.viewportIds),threadsById:{[l.MAIN_THREAD_ID]:u}})});const r=Object(p.z)(e);return{byChatId:t,messageLists:!r||d.l?[]:[{...r,threadId:l.MAIN_THREAD_ID,type:"thread"}]}}function T(e){const{byKey:t,themes:n}=e.settings;return{byKey:t,themes:n,privacy:{},notifyExceptions:{}}}function N(e){return{...e.chatFolders,activeChatFolder:0}}document.addEventListener(h.b,()=>{j=!0}),document.addEventListener(h.a,()=>{j=!1}),u.I||(Object(o.b)("saveSession",()=>{O||I()}),Object(o.b)("reset",()=>{localStorage.removeItem(u.J),O&&C()})),Object(o.b)("init",()=>{const e=Object(m.d)(f);return w(e)||e});var P=n(0),D=n(54);const L=String(Date.now()+Math.random());let x;localStorage.setItem("tt-active-tab",L);const F=window.setInterval(()=>{x&&localStorage.getItem("tt-active-tab")!==L&&(x(),clearInterval(F))},2e3);var B=n(25),R=(n(85),n(86),n(87),n(88),n(89),n(39)),U=n(36),_=n(40),$=n(17);const G=["400 1em Roboto","500 1em Roboto"];function W(){if("fonts"in document)return Promise.all(G.map(e=>document.fonts.load(e)))}var H=n(57),z=n(15),K=n(9),V=(n(91),n.p+"telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg"),q=n.p+"monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg";function J(){const{listIds:e,byId:t}=Object(o.e)().chats;if(e.active)return Promise.all(e.active.slice(0,10).map(e=>{const n=t[e];if(!n)return;const r=Object(U.d)(n);return r?H.b(r,l.ApiMediaFormat.DataUri):void 0}))}const Q={main:()=>Promise.all([Object(z.d)(z.a.Main,"Main").then(W),J()]),authPhoneNumber:()=>Promise.all([W(),Object($.g)(V)]),authCode:()=>Object($.g)(q),authPassword:()=>Object($.g)(q),authQrCode:W};var Y=Object(o.h)(e=>{const t=Object(p.Db)(e),{background:n,backgroundColor:r}=e.settings.themes[t]||{};return{shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations,uiReadyState:e.uiReadyState,hasCustomBackground:Boolean(n),hasCustomBackgroundColor:Boolean(r),isRightColumnShown:Object(p.W)(e)}},(e,t)=>Object(m.l)(t,["setIsUiReady"]))(({page:e,children:t,hasCustomBackground:n,hasCustomBackgroundColor:r,isRightColumnShown:u,shouldSkipHistoryAnimations:o,setIsUiReady:d})=>{const[c,a]=Object(B.a)(),{shouldRender:i,transitionClassNames:s}=Object(_.a)(!c,void 0,!0);return Object(P.n)(()=>{let t;return Promise.race([Object(b.f)(700),(async()=>{try{await Q[e]()}catch(e){}})()]).then(()=>{a(),d({uiReadyState:1}),t=window.setTimeout(()=>{d({uiReadyState:2})},1e3)}),()=>{t&&(clearTimeout(t),t=void 0),d({uiReadyState:0})}},[]),P.a.createElement("div",{id:"UiLoader"},t,i&&!o&&P.a.createElement("div",{className:Object(K.a)("mask",s)},"main"===e?P.a.createElement(P.a.Fragment,null,P.a.createElement("div",{className:"left"}),P.a.createElement("div",{className:Object(K.a)("middle",n&&"custom-bg-image",r&&"custom-bg-color",u&&"with-right-column")}),u&&P.a.createElement("div",{className:"right"})):P.a.createElement("div",{className:"blank"})))}),Z=n(23),X=n(14),ee=n(16),te=(e,t)=>{const[n,r]=Object(P.r)();return e&&X.c(e,t).then(r),n};function ne(){let e=navigator.language;return e&&"pt-br"!==e&&(e=e.substr(0,2)),e}var re=n(21),ue=n(48),oe=n(47),de=n(20),ce=n(53),ae=n(22),ie=n(63),se=n(43),fe=n(26);n(100);const le=200+u.c;var be=Object(P.h)(({id:e,value:t,isLoading:n,onChange:r})=>{const u=Object(ee.a)(),o=Object(P.q)(null),[d,c]=Object(P.r)(),[a,i]=Object(P.r)(Z.a);function s(e){c(e),i(function(e=""){return e.length?Z.a.filter(t=>Object(ce.a)(t.name,e)):Z.a}(e))}const f=Object(P.m)(e=>{const{countryId:t}=e.currentTarget.firstElementChild.dataset,n=Z.a.find(e=>e.id===t);n&&r(n),setTimeout(()=>s(void 0),le)},[r]),l=Object(P.m)(e=>{s(e.currentTarget.value)},[]),b=Object(P.m)(e=>{if(8!==e.keyCode)return;const n=e.currentTarget;t&&void 0===d&&(n.value=""),s(n.value)},[d,t]);return P.a.createElement(ie.a,{className:"CountryCodeInput",trigger:({onTrigger:r,isOpen:c})=>{const a=()=>{if(c)return;setTimeout(()=>{o.current.select()},50),r();const e=document.getElementById("auth-phone-number-form");e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},i=void 0!==d?d:t&&t.name||"";return P.a.createElement("div",{className:Object(K.a)("input-group",t&&"touched")},P.a.createElement("input",{ref:o,className:Object(K.a)("form-control",c&&"focus"),type:"text",id:e,value:i,autoComplete:"off",onClick:a,onFocus:a,onInput:l,onKeyDown:b}),P.a.createElement("label",null,u("Login.SelectCountry.Title")),n?P.a.createElement(fe.a,{color:"black"}):P.a.createElement("i",{onClick:a,className:Object(K.a)("css-icon-down",c&&"open")}))}},a.map(e=>P.a.createElement(se.a,{key:e.id,className:t&&e.id===t.id?"selected":"",onClick:f},P.a.createElement("span",{"data-country-id":e.id}),P.a.createElement("span",{className:"country-flag"},Object(ae.a)(e.flag,["hq_emoji"])),P.a.createElement("span",{className:"country-name"},e.name),P.a.createElement("span",{className:"country-code"},e.code))),!a.length&&P.a.createElement(se.a,{key:"no-results",className:"no-results",disabled:!0},P.a.createElement("span",null,u("lng_country_none"))))});let he=!1;var me=Object(P.h)(Object(o.h)(e=>{const{settings:{byKey:{language:t}}}=e;return{...Object(m.l)(e,["connectionState","authState","authPhoneNumber","authIsLoading","authIsLoadingQrCode","authError","authRememberMe","authNearestCountry"]),language:t}},(e,t)=>Object(m.l)(t,["setAuthPhoneNumber","setAuthRememberMe","clearAuthError","loadNearestCountry","goToAuthQrCode","setSettingOption"]))(({connectionState:e,authState:t,authPhoneNumber:n,authIsLoading:r,authIsLoadingQrCode:u,authError:o,authRememberMe:c,authNearestCountry:a,language:i,setAuthPhoneNumber:s,setAuthRememberMe:f,loadNearestCountry:l,clearAuthError:b,goToAuthQrCode:h,setSettingOption:m})=>{const p=Object(ee.a)(),g=Object(P.q)(null),y=ne(),v=te(y,"ContinueOnThisLanguage"),[O,j]=Object(P.r)(),[w,I]=Object(P.r)(),[C,E]=Object(P.r)(!1),[S,M]=Object(P.r)(),[A,k,T]=Object(B.a)(),N=O?`${O.code} ${w||""}`:w,D=N&&N.replace(/[^\d]+/g,"").length>=7;Object(P.n)(()=>{d.n||g.current.focus()},[O]),Object(P.n)(()=>{"connectionStateReady"!==e||a||l()},[e,a,l]),Object(P.n)(()=>{!a||O||C||j(Object(Z.d)(a))},[O,a,C]);const L=Object(P.m)(e=>{e.length||I("");const t=Object(Z.e)(e),n=!O||t&&t.id!==O.id||!t&&e.length?t:O;(!O||!n||n&&n.code!==O.code)&&j(n),I(Object(Z.b)(e,n))},[O]),x=Object(P.m)(()=>{k(),Object(X.d)(y,()=>{T(),m({language:y})})},[k,m,y,T]);Object(P.n)(()=>{void 0===w&&n&&L(n)},[n,w,L]),Object(P.o)(()=>{g.current&&S&&g.current.setSelectionRange(...S)},[S]);const F=Object(P.q)(!1),R=Object(P.m)(()=>{F.current=!0,requestAnimationFrame(()=>{F.current=!1})},[]),U=Object(P.m)(e=>{o&&b(),he||(he=!0,W(),Object($.g)(q));const{value:t,selectionStart:n,selectionEnd:r}=e.target;M(n&&r&&r1&&!F.current;L(u?`${O.code} ${t}`:t)},[o,b,O,N,L]),_=Object(P.m)(e=>{f(e.target.checked)},[f]);const G="authorizationStateWaitPhoneNumber"===t;return P.a.createElement("div",{id:"auth-phone-number-form",className:"custom-scroll"},P.a.createElement("div",{className:"auth-form"},P.a.createElement("div",{id:"logo"}),P.a.createElement("h2",null,"Telegram"),P.a.createElement("p",{className:"note"},p("StartText")),P.a.createElement("form",{action:"",onSubmit:function(e){e.preventDefault(),r||D&&s({phoneNumber:N})}},P.a.createElement(be,{id:"sign-in-phone-code",value:O,isLoading:!a&&!O,onChange:j}),P.a.createElement(oe.a,{ref:g,id:"sign-in-phone-number",label:p("Login.PhonePlaceholder"),value:N,error:o&&p(o),inputMode:"tel",onChange:U,onPaste:d.j?R:void 0}),P.a.createElement(ue.a,{id:"sign-in-keep-session",label:"Keep me signed in",checked:Boolean(c),onChange:_}),D&&(G?P.a.createElement(re.a,{type:"submit",ripple:!0,isLoading:r},p("Login.Next")):P.a.createElement(de.a,null)),G&&P.a.createElement(re.a,{isText:!0,ripple:!0,isLoading:u,onClick:h},p("Login.QR.Login")),y&&y!==i&&v&&P.a.createElement(re.a,{isText:!0,isLoading:A,onClick:x},v))))})),pe=n(24);var ge=Object(P.h)(()=>{const e=Object(pe.a)(z.a.Auth,"AuthCode");return e?P.a.createElement(e,null):P.a.createElement(de.a,null)});var ye=Object(P.h)(()=>{const e=Object(pe.a)(z.a.Auth,"AuthPassword");return e?P.a.createElement(e,null):P.a.createElement(de.a,null)});var ve=Object(P.h)(()=>{const e=Object(pe.a)(z.a.Auth,"AuthRegister");return e?P.a.createElement(e,null):P.a.createElement(de.a,null)});let Oe=null;class je{}je.render=function(e,t){Oe(e,t)},self.QrCreator=je,function(e){function t(t,n,r,u){var o={},d=e(r,n);d.u(t),d.J(),u=u||0;var c=d.h(),a=d.h()+2*u;return o.text=t,o.level=n,o.version=r,o.O=a,o.a=function(e,t){return t-=u,!(0>(e-=u)||e>=c||0>t||t>=c)&&d.a(e,t)},o}function n(e,t,n,r,u,o,d,c,a,i){function s(t,n,r,u,d,c,a){t?(e.lineTo(n+c,r+a),e.arcTo(n,r,u,d,o)):e.lineTo(n,r)}d?e.moveTo(t+o,n):e.moveTo(t,n),s(c,r,n,r,u,-o,0),s(a,r,u,t,u,0,-o),s(i,t,u,t,n,o,0),s(d,t,n,r,n,0,o)}function r(e,t,n,r,u,o,d,c,a,i){function s(t,n,r,u){e.moveTo(t+r,n),e.lineTo(t,n),e.lineTo(t,n+u),e.arcTo(t,n,t+r,n,o)}d&&s(t,n,o,o),c&&s(r,n,-o,o),a&&s(r,u,-o,-o),i&&s(t,u,o,-o)}function u(e,u){e:{var o=u.text,d=u.v,c=u.N,a=u.K,i=u.P;for(c=Math.max(1,c||1),a=Math.min(40,a||40);c<=a;c+=1)try{var s=t(o,d,c,i);break e}catch(e){}s=void 0}if(!s)return null;for(o=e.getContext("2d"),u.background&&(o.fillStyle=u.background,o.fillRect(u.left,u.top,u.size,u.size)),d=s.O,a=u.size/d,o.beginPath(),i=0;iMath.round(e*t.size)),"linear-gradient"===r)var o=e.createLinearGradient.apply(e,n);else{if("radial-gradient"!==r)throw Error("Unsupported fill");o=e.createRadialGradient.apply(e,n)}u.forEach(([e,t])=>{o.addColorStop(e,t)}),e.fillStyle=o}}(o,u),o.fill(),e}var o={minVersion:1,maxVersion:40,ecLevel:"L",left:0,top:0,size:200,fill:"#000",background:null,text:"no text",radius:.5,quiet:0};Oe=function(e,t){var n={};Object.assign(n,o,e),n.N=n.minVersion,n.K=n.maxVersion,n.v=n.ecLevel,n.left=n.left,n.top=n.top,n.size=n.size,n.fill=n.fill,n.background=n.background,n.text=n.text,n.R=n.radius,n.P=n.quiet,t instanceof HTMLCanvasElement?(t.width===n.size&&t.height===n.size||(t.width=n.size,t.height=n.size),t.getContext("2d").clearRect(0,0,t.width,t.height),u(t,n)):((e=document.createElement("canvas")).width=n.size,e.height=n.size,n=u(e,n),t.appendChild(n))}}(function(){function e(u,d){function c(e,t){for(var n=-1;7>=n;n+=1)if(!(-1>=e+n||f<=e+n))for(var r=-1;7>=r;r+=1)-1>=t+r||f<=t+r||(s[e+n][t+r]=0<=n&&6>=n&&(0==r||6==r)||0<=r&&6>=r&&(0==n||6==n)||2<=n&&4>=n&&2<=r&&4>=r)}function a(e,n){for(var d=f=4*u+17,a=Array(d),h=0;h=g;g+=1)for(var y=-2;2>=y;y+=1)s[m+g][p+y]=-2==g||2==g||-2==y||2==y||0==g&&0==y}for(d=8;da;a+=1)h=!e&&1==(d>>a&1),s[6>a?a:8>a?a+1:f-15+a][8]=h,s[8][8>a?f-a-1:9>a?15-a:14-a]=h;if(s[f-8][8]=!e,7<=u){for(d=r.A(u),a=0;18>a;a+=1)h=!e&&1==(d>>a&1),s[Math.floor(a/3)][a%3+f-8-3]=h;for(a=0;18>a;a+=1)h=!e&&1==(d>>a&1),s[a%3+f-8-3][Math.floor(a/3)]=h}if(null==l){for(e=o.I(u,i),d=function(){var e=[],t=0,n={B:function(){return e},c:function(t){return 1==(e[Math.floor(t/8)]>>>7-t%8&1)},put:function(e,t){for(var r=0;r>>t-r-1&1))},f:function(){return t},m:function(n){var r=Math.floor(t/8);e.length<=r&&e.push(0),n&&(e[r]|=128>>>t%8),t+=1}};return n}(),a=0;a8*h)throw Error("code length overflow. ("+d.f()+">"+8*h+")");for(d.f()+4<=8*h&&d.put(0,4);0!=d.f()%8;)d.m(!1);for(;!(d.f()>=8*h)&&(d.put(236,8),!(d.f()>=8*h));)d.put(17,8);var v=0;for(h=a=0,m=Array(e.length),p=Array(e.length),g=0;gg;g+=1)null==s[a][p-g]&&(y=!1,m>>h&1)),n(a,p-g)&&(y=!y),s[a][p-g]=y,-1==--h&&(m+=1,h=7));if(0>(a+=d)||f<=a){a-=d,d=-d;break}}}var i=n[d],s=null,f=0,l=null,b=[],h={u:function(t){t=function(t){var n=e.s(t);return{S:function(){return 4},b:function(){return n.length},write:function(e){for(var t=0;te||f<=e||0>t||f<=t)throw Error(e+","+t);return s[e][t]},h:function(){return f},J:function(){for(var e=0,t=0,n=0;8>n;n+=1){a(!0,n);var u=r.D(h);(0==n||e>u)&&(e=u,t=n)}a(!1,t)}};return h}function t(e,n){if(void 0===e.length)throw Error(e.length+"/"+n);var r=function(){for(var t=0;to.b()-e.b())return o;for(var n=u.g(o.c(0))-u.g(e.c(0)),r=Array(o.b()),d=0;dr?t.push(r):2048>r?t.push(192|r>>6,128|63&r):55296>r||57344<=r?t.push(224|r>>12,128|r>>6&63,128|63&r):(n++,r=65536+((1023&r)<<10|1023&e.charCodeAt(n)),t.push(240|r>>18,128|r>>12&63,128|r>>6&63,128|63&r))}return t};var n={L:1,M:0,Q:3,H:2},r=function(){function e(e){for(var t=0;0!=e;)t+=1,e>>>=1;return t}var n=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]];return{w:function(t){for(var n=t<<10;0<=e(n)-e(1335);)n^=1335<t||40t?8:16},D:function(e){for(var t=e.h(),n=0,r=0;r=c;c+=1)if(!(0>r+c||t<=r+c))for(var a=-1;1>=a;a+=1)0>u+a||t<=u+a||(0!=c||0!=a)&&d==e.a(r+c,u+a)&&(o+=1);5n;n+=1)e[n]=1<n;n+=1)e[n]=e[n-4]^e[n-5]^e[n-6]^e[n-8];for(n=0;255>n;n+=1)t[e[n]]=n;return{g:function(e){if(1>e)throw Error("glog("+e+")");return t[e]},i:function(t){for(;0>t;)t+=255;for(;256<=t;)t-=255;return e[t]}}}(),o=function(){function e(e,r){switch(r){case n.L:return t[4*(e-1)];case n.M:return t[4*(e-1)+1];case n.Q:return t[4*(e-1)+2];case n.H:return t[4*(e-1)+3]}}var t=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];return{I:function(t,n){var r=e(t,n);if(void 0===r)throw Error("bad rs block @ typeNumber:"+t+"/errorCorrectLevel:"+n);t=r.length/3,n=[];for(var u=0;u{const{connectionState:t,authState:n,authQrCode:r,settings:{byKey:{language:u}}}=e;return{connectionState:t,authState:n,authQrCode:r,language:u}},(e,t)=>Object(m.l)(t,["returnToAuthPhoneNumber","setSettingOption"]))(({connectionState:e,authState:t,authQrCode:n,language:r,returnToAuthPhoneNumber:u,setSettingOption:o})=>{const d=ne(),c=Object(ee.a)(),a=Object(P.q)(null),i=te(d,"ContinueOnThisLanguage"),[s,f,l]=Object(B.a)();Object(P.n)(()=>{if(!n||"connectionStateReady"!==e)return;const t=a.current;t.innerHTML="",t.classList.remove("pre-animate"),we.render({text:"tg://login?token="+n.token,radius:.5,ecLevel:"M",fill:"#4E96D4",size:280},t)},[e,n]);const b=Object(P.m)(()=>{f(),Object(X.d)(d,()=>{l(),o({language:d})})},[f,o,d,l]),h="authorizationStateWaitQrCode"===t;return P.a.createElement("div",{id:"auth-qr-form",className:"custom-scroll"},P.a.createElement("div",{className:"auth-form qr"},n?P.a.createElement("div",{key:"qr-container",className:"qr-container pre-animate",ref:a}):P.a.createElement("div",{key:"qr-loading",className:"qr-loading"},P.a.createElement(de.a,null)),P.a.createElement("h3",null,c("Login.QR.Title")),P.a.createElement("ol",null,P.a.createElement("li",null,P.a.createElement("span",null,c("Login.QR.Help1"))),P.a.createElement("li",null,P.a.createElement("span",null,Object(ae.a)(c("Login.QR.Help2"),["simple_markdown"]))),P.a.createElement("li",null,P.a.createElement("span",null,c("Login.QR.Help3")))),h&&P.a.createElement(re.a,{isText:!0,onClick:u},c("Login.QR.Cancel")),d&&d!==r&&i&&P.a.createElement(re.a,{isText:!0,isLoading:s,onClick:b},i)))}));n(101);var Ce=Object(P.h)(Object(o.h)(e=>Object(m.l)(e,["authState"]),(e,t)=>Object(m.l)(t,["reset","initApi","returnToAuthPhoneNumber","goToAuthQrCode"]))(({authState:e,reset:t,initApi:n,returnToAuthPhoneNumber:r,goToAuthQrCode:u})=>{Object(P.n)(()=>{t(),n()},[t,n]);const o="iOS"===d.r||"Android"===d.r;switch(Object(R.a)(!o&&"authorizationStateWaitPhoneNumber"===e||o&&"authorizationStateWaitQrCode"===e,()=>{o?r():u()}),e){case"authorizationStateWaitCode":return P.a.createElement(Y,{page:"authCode",key:"authCode"},P.a.createElement(ge,null));case"authorizationStateWaitPassword":return P.a.createElement(Y,{page:"authPassword",key:"authPassword"},P.a.createElement(ye,null));case"authorizationStateWaitRegistration":return P.a.createElement(ve,null);case"authorizationStateWaitPhoneNumber":return P.a.createElement(Y,{page:"authPhoneNumber",key:"authPhoneNumber"},P.a.createElement(me,null));case"authorizationStateWaitQrCode":return P.a.createElement(Y,{page:"authQrCode",key:"authQrCode"},P.a.createElement(Ie,null));default:return o?P.a.createElement(Y,{page:"authPhoneNumber",key:"authPhoneNumber"},P.a.createElement(me,null)):P.a.createElement(Y,{page:"authQrCode",key:"authQrCode"},P.a.createElement(Ie,null))}}));var Ee=Object(P.h)(()=>{const e=Object(pe.a)(z.a.Main,"Main");return e?P.a.createElement(e,null):void 0}),Se=n.p+"app-inactive.bc7953c2dfebcabce2c43ca7dc778a89.png";n(102);var Me=()=>P.a.createElement("div",{id:"AppInactive"},P.a.createElement("div",{className:"content"},P.a.createElement("img",{src:Se,alt:""}),P.a.createElement("h3",{className:"title"},"Such error, many tabs"),P.a.createElement("div",{className:"description"},"Telegram supports only one active tab with the app.",P.a.createElement("br",null),"Please reload this page to continue using this tab or close it."),P.a.createElement("div",{className:"actions"},P.a.createElement(re.a,{isText:!0,ripple:!0,onClick:()=>{window.location.reload()}},"Reload app"))));function Ae(){return o.c.createElement(Y,{page:"main",key:"main"},o.c.createElement(Ee,null))}var ke=Object(o.h)(e=>Object(m.l)(e,["authState"]),(e,t)=>Object(m.l)(t,["disconnect"]))(({authState:e,disconnect:t})=>{const[n,r]=Object(B.a)(!1);if(Object(P.n)(()=>{Object(D.b)(),x=()=>{t(),document.title=`${u.pb}${u.L}`,r()}},[t,r]),n)return o.c.createElement(Me,null);if(e)switch(e){case"authorizationStateWaitPhoneNumber":case"authorizationStateWaitCode":case"authorizationStateWaitPassword":case"authorizationStateWaitRegistration":case"authorizationStateWaitQrCode":return o.c.createElement(Ce,null);case"authorizationStateClosed":case"authorizationStateClosing":case"authorizationStateLoggingOut":case"authorizationStateReady":return Ae()}return Object(g.c)(!0)?Ae():o.c.createElement(Ce,null)});n(103);u.r&&console.log(">>> INIT"),Object(o.d)().init(),u.r&&console.log(">>> START INITIAL RENDER"),s.a.render(o.c.createElement(ke,null),document.getElementById("root")),u.r&&console.log(">>> FINISH INITIAL RENDER"),document.addEventListener("dblclick",()=>{console.log("GLOBAL STATE",Object(o.e)())})}]); +//# sourceMappingURL=main.9cbfb7726cae6e685678.js.map \ No newline at end of file diff --git a/dist/main.9cbfb7726cae6e685678.js.map b/dist/main.9cbfb7726cae6e685678.js.map new file mode 100644 index 000000000..0e88abcbb --- /dev/null +++ b/dist/main.9cbfb7726cae6e685678.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/teact/teact.ts","webpack:///./src/lib/teact/teactn.tsx","webpack:///./src/config.ts","webpack:///./src/util/iteratees.ts","webpack:///./src/modules/helpers/messages.ts","webpack:///./src/modules/helpers/messageMedia.ts","webpack:///./src/modules/helpers/localSearch.ts","webpack:///./src/api/gramjs/worker/provider.ts","webpack:///./src/util/environmentWebp.ts","webpack:///./src/util/environmentSystemTheme.ts","webpack:///./src/util/environment.ts","webpack:///./src/modules/selectors/users.ts","webpack:///./src/modules/selectors/settings.ts","webpack:///./src/modules/selectors/chats.ts","webpack:///./src/modules/selectors/symbols.ts","webpack:///./src/modules/selectors/messages.ts","webpack:///./src/modules/selectors/localSearch.ts","webpack:///./src/modules/selectors/management.ts","webpack:///./src/modules/selectors/ui.ts","webpack:///./src/modules/selectors/globalSearch.ts","webpack:///./src/modules/selectors/payments.ts","webpack:///./src/api/types/index.ts","webpack:///./src/util/buildClassName.ts","webpack:///./src/util/schedulers.ts","webpack:///./src/modules/reducers/chats.ts","webpack:///./src/modules/reducers/messages.ts","webpack:///./src/modules/reducers/symbols.ts","webpack:///./src/modules/reducers/users.ts","webpack:///./src/modules/reducers/globalSearch.ts","webpack:///./src/modules/reducers/localSearch.ts","webpack:///./src/modules/reducers/management.ts","webpack:///./src/modules/reducers/settings.ts","webpack:///./src/modules/reducers/twoFaSettings.ts","webpack:///./src/modules/reducers/payments.ts","webpack:///./src/util/cacheApi.ts","webpack:///./src/types/index.ts","webpack:///./src/util/langProvider.ts","webpack:///./src/util/callbacks.ts","webpack:///./src/util/moduleLoader.ts","webpack:///./src/hooks/useLang.ts","webpack:///./src/util/files.ts","webpack:///./node_modules/idb-keyval/dist/esm/index.js","webpack:///./src/util/sessions.ts","webpack:///./src/lib/twemojiRegex.js","webpack:///./src/components/ui/Loading.tsx","webpack:///./src/components/ui/Button.tsx","webpack:///./src/components/common/helpers/renderText.tsx","webpack:///./src/util/countries.ts","webpack:///./src/util/phoneNumber.ts","webpack:///./src/hooks/useModuleLoader.ts","webpack:///./src/hooks/useFlag.ts","webpack:///./src/components/ui/Spinner.tsx","webpack:///./src/util/handleError.ts","webpack:///./src/util/arePropsShallowEqual.ts","webpack:///./src/hooks/usePrevious.ts","webpack:///./src/util/dateFormat.ts","webpack:///./src/hooks/useForceUpdate.ts","webpack:///./src/components/ui/Link.tsx","webpack:///./src/util/generateIdFor.ts","webpack:///./src/util/notifications.ts","webpack:///./src/modules/helpers/users.ts","webpack:///./src/modules/helpers/chats.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/lib/teact/dom-events.ts","webpack:///./src/hooks/useHistoryBack.ts","webpack:///./src/hooks/useShowTransition.ts","webpack:///./src/util/trimText.ts","webpack:///./src/components/ui/MenuItem.tsx","webpack:///./src/components/ui/RippleEffect.tsx","webpack:///./src/util/switchTheme.ts","webpack:///./src/util/webpToPng.ts","webpack:///./src/components/ui/InputText.tsx","webpack:///./src/components/ui/Checkbox.tsx","webpack:///./src/util/captureEscKeyListener.ts","webpack:///./src/util/textFormat.ts","webpack:///./src/util/memo.ts","webpack:///./src/hooks/useOnChange.ts","webpack:///./src/util/searchWords.ts","webpack:///./src/util/windowSize.ts","webpack:///./src/components/ui/Menu.tsx","webpack:///./src/util/captureKeyboardListeners.ts","webpack:///./src/util/oggToWav.ts","webpack:///./src/util/mediaLoader.ts","webpack:///./src/hooks/useEffectWithPrevDeps.ts","webpack:///./src/lib/punycode.js","webpack:///./src/components/common/SafeLink.tsx","webpack:///./src/components/common/helpers/documentInfo.ts","webpack:///./src/modules/helpers/payments.ts","webpack:///./src/util/animation.ts","webpack:///./src/components/ui/DropdownMenu.tsx","webpack:///./src/hooks/useKeyboardListNavigation.ts","webpack:///./src/components/common/helpers/parseEmojiOnlyString.ts","webpack:///./src/util/emoji.ts","webpack:///./src/lib/teact/teact-dom.ts","webpack:///./src/components/common/UserLink.tsx","webpack:///./src/components/common/MessageLink.tsx","webpack:///./src/components/common/ChatLink.tsx","webpack:///./src/components/common/helpers/renderActionMessageText.tsx","webpack:///./src/api/types/messages.ts","webpack:///./src/api/types/media.ts","webpack:///./src/components/middle/message/MentionLink.tsx","webpack:///./src/util/appBadge.ts","webpack:///./src/hooks/useVirtualBackdrop.ts","webpack:///./src/api/gramjs/worker/worker.ts","webpack:///./node_modules/opus-recorder/dist/decoderWorker.min.js","webpack:///./node_modules/opus-recorder/dist/waveWorker.min.js","webpack:///./src/lib/webp/webp_wasm.worker.js","webpack:///./src/modules/actions/ui/initial.ts","webpack:///./src/modules/actions/ui/settings.ts","webpack:///./src/modules/actions/api/initial.ts","webpack:///./src/modules/actions/api/settings.ts","webpack:///./src/modules/actions/apiUpdaters/initial.ts","webpack:///./src/serviceWorker.ts","webpack:///./src/util/setupServiceWorker.ts","webpack:///./src/global/initial.ts","webpack:///./src/global/cache.ts","webpack:///./src/global/index.ts","webpack:///./src/util/activeTabMonitor.ts","webpack:///./src/util/fonts.ts","webpack:///./src/assets/telegram-logo.svg","webpack:///./src/assets/monkey.svg","webpack:///./src/components/common/UiLoader.tsx","webpack:///./src/hooks/useLangString.ts","webpack:///./src/components/auth/helpers/getSuggestedLanguage.ts","webpack:///./src/components/auth/CountryCodeInput.tsx","webpack:///./src/components/auth/AuthPhoneNumber.tsx","webpack:///./src/components/auth/AuthCode.async.tsx","webpack:///./src/components/auth/AuthPassword.async.tsx","webpack:///./src/components/auth/AuthRegister.async.tsx","webpack:///./node_modules/qr-creator/dist/qr-creator.es6.min.js","webpack:///./src/components/auth/AuthQrCode.tsx","webpack:///./src/components/auth/Auth.tsx","webpack:///./src/components/main/Main.async.tsx","webpack:///./src/assets/app-inactive.png","webpack:///./src/components/main/AppInactive.tsx","webpack:///./src/App.tsx","webpack:///./src/index.tsx"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","installedCssChunks","2","__webpack_require__","exports","module","l","e","promises","Promise","resolve","reject","href","fullhref","p","existingLinkTags","document","getElementsByTagName","dataHref","tag","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","jsonpScriptSrc","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","head","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","s","VirtualElementTypesEnum","Fragment","renderingInstance","isEmptyElement","$element","Empty","isTextElement","Text","isTagElement","Tag","isComponentElement","Component","isRealElement","source","props","children","flatten","parsedChildren","componentInstance","isMounted","hooks","state","cursor","byCursor","effects","memos","buildComponentElement","createComponentInstance","dropEmptyTail","map","buildChildElement","buildTagElement","isEmptyPlaceholder","child","String","DEBUG_components","renderComponent","newRenderedValue","DEBUG_startAt","DEBUG","componentName","renderCount","renderTimes","DEBUG_MORE","log","performance","now","renderTime","warn","Math","round","handleError","renderedValue","newChild","hasElementChanged","$old","$new","unmountTree","forEach","hook","current","cleanup","effect","dependencies","nextValue","setter","forceUpdate","onUpdate","helpGc","unmountComponent","removeAllDelegatedListeners","mountComponent","forceUpdateComponent","currentElement","getTarget","setTarget","useState","initial","newValue","prepareForFrame","throttleWithPrimaryRaf","prepareComponentForFrame","throttleWithRaf","DEBUG_contentComponentName","useLayoutEffectBase","schedulerFn","debugKey","exec","some","dependency","causedBy","reduce","res","prevValue","join","useEffect","fastRaf","useLayoutEffect","onTickEnd","useMemo","resolver","getUnequalProps","useCallback","newCallback","useRef","memo","areEqual","arePropsShallowEqual","propsRef","renderedRef","addEventListener","orderBy","values","React","currentGlobal","reducers","callbacks","container","containers","mapStateToProps","mapReducersToProps","ownProps","mappedProps","newMappedProps","setGlobal","actions","Number","isNaN","DEBUG_componentName","keys","areMappedPropsChanged","DEBUG_updates","updateTime","Map","runCallbacks","cb","runCallbacksThrottled","newGlobal","noThrottle","getGlobal","getDispatch","addReducer","reducer","payload","onDispatch","addCallback","removeCallback","index","indexOf","splice","withGlobal","TeactNContainer","id","generateIdFor","useForceUpdate","delete","set","Array","from","PAGE_TITLE","INACTIVE_MARKER","APP_NAME","process","APP_VERSION","IS_TEST","DEBUG_ALERT_MSG","SESSION_USER_KEY","LEGACY_SESSION_KEY","GLOBAL_STATE_CACHE_DISABLED","GLOBAL_STATE_CACHE_KEY","GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT","GLOBAL_STATE_CACHE_USER_LIST_LIMIT","MEDIA_CACHE_DISABLED","MEDIA_CACHE_NAME","MEDIA_CACHE_NAME_AVATARS","MEDIA_PROGRESSIVE_CACHE_NAME","CUSTOM_BG_CACHE_NAME","LANG_CACHE_NAME","isBigScreen","innerHeight","MIN_PASSWORD_LENGTH","MESSAGE_LIST_SENSITIVE_AREA","MESSAGE_LIST_SLICE","MESSAGE_LIST_VIEWPORT_LIMIT","CHAT_HEIGHT_PX","CHAT_LIST_SLICE","CHAT_LIST_LOAD_SLICE","SHARED_MEDIA_SLICE","MESSAGE_SEARCH_SLICE","GLOBAL_SEARCH_SLICE","MEMBERS_SLICE","MEMBERS_LOAD_SLICE","PROFILE_SENSITIVE_AREA","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","ALL_CHATS_PRELOAD_DISABLED","ANIMATION_LEVEL_MIN","ANIMATION_LEVEL_MAX","ANIMATION_LEVEL_DEFAULT","DEFAULT_MESSAGE_TEXT_SIZE_PX","IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX","MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX","DRAFT_DEBOUNCE","EDITABLE_INPUT_ID","EDITABLE_INPUT_MODAL_ID","SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","SAFE_SCREEN_WIDTH_FOR_CHAT_INFO","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","MOBILE_SCREEN_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT","LOCAL_MESSAGE_ID_BASE","ANIMATION_END_DELAY","FAST_SMOOTH_MAX_DISTANCE","FAST_SMOOTH_MIN_DURATION","FAST_SMOOTH_MAX_DURATION","FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE","STICKER_SIZE_INLINE_DESKTOP_FACTOR","Set","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_AUTH","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_PICKER","STICKER_SIZE_GENERAL_SETTINGS","STICKER_SIZE_PICKER_HEADER","STICKER_SIZE_SEARCH","STICKER_SIZE_MODAL","STICKER_SIZE_TWO_FA","STICKER_SIZE_DISCUSSION_GROUPS","STICKER_SIZE_FOLDER_SETTINGS","STICKER_SIZE_INLINE_BOT_RESULT","MEMOJI_STICKER_ID","BASE_EMOJI_KEYWORD_LANG","MENU_TRANSITION_DURATION","SLIDE_TRANSITION_DURATION","CONTENT_TYPES_FOR_QUICK_UPLOAD","RE_LINK_TEMPLATE","RE_MENTION_TEMPLATE","RE_TME_LINK","RE_TME_INVITE_LINK","SERVICE_NOTIFICATIONS_USER_ID","ALL_FOLDER_ID","ARCHIVED_FOLDER_ID","MAX_MEDIA_FILES_FOR_ALBUM","MAX_ACTIVE_PINNED_CHATS","SCHEDULED_WHEN_ONLINE","DEFAULT_LANG_CODE","DEFAULT_LANG_PACK","LANG_PACKS","TIPS_USERNAME","LOCALIZED_TIPS","FEEDBACK_URL","LIGHT_THEME_BG_COLOR","DARK_THEME_BG_COLOR","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","buildCollectionByKey","collection","byKey","member","mapValues","callback","newByKey","pick","result","pickTruthy","omit","stringKeys","filter","has","orderKey","sort","a","b","isArray","mode1","mode2","orderKey1","orderKey2","aValue1","bValue1","aValue2","bValue2","aValue","bValue","array","concat","unique","compact","Boolean","areSortedArraysEqual","array1","array2","every","item","areSortedArraysIntersecting","findIntersectionWithSet","split","chunkSize","cloneDeep","acc","findLast","predicate","RE_LINK","RegExp","getMessageKey","chatId","parseMessageKey","match","messageId","getMessageOriginalId","previousLocalId","getMessageSummaryText","lang","noEmoji","text","photo","video","audio","voice","sticker","contact","poll","invoice","content","truncatedText","substr","groupedId","isGif","emoji","trim","getMessageAudioCaption","fileName","summary","question","getMessageText","webPage","getMessageCustomShape","isRound","parseEmojiOnlyString","getMessageSingleEmoji","getFirstLinkInMessage","entities","link","find","entity","ApiMessageEntityTypes","TextUrl","url","Url","offset","substring","domain","isOwnMessage","isOutgoing","isReplyMessage","replyToMessageId","isForwardedMessage","forwardInfo","isActionMessage","action","isServiceNotificationMessage","isMessageLocal","isAnonymousOwnMessage","senderId","getSenderTitle","sender","getUserFullName","getChatTitle","getSendingState","sendingState","isHistoryClearMessage","title","performer","getMessageContent","hasMessageMedia","getMessagePhoto","getMessageVideo","getMessageDocument","getMessageSticker","getMessageContact","getMessagePoll","getMessageAction","getMessageAudio","getMessageVoice","getMessageRoundVideo","isMessageDocumentPhoto","mediaType","isMessageDocumentVideo","getMessageInvoice","getMessageWebPage","getMessageWebPagePhoto","getMessageWebPageVideo","getMessageMediaThumbDataUri","thumbnail","media","getMessageMediaThumbnail","dataUri","getMessageMediaHash","webPagePhoto","webPageVideo","messageVideo","messagePhoto","base","hasMessageLocalBlobUrl","getVideoOrAudioBaseHash","getDocumentHasPreview","IS_PROGRESSIVE_SUPPORTED","IS_SAFARI","size","mimeType","getMessageMediaFormat","fullVideo","isAnimated","ApiMediaFormat","Lottie","Progressive","IS_OPUS_SUPPORTED","BlobUrl","getMessageFileName","date","getMessageFileSize","blobUrl","previewBlobUrl","getChatMediaMessageIds","messages","listedIds","isFromSharedMedia","ids","getMessageContentIds","reverse","getPhotoFullDimensions","sizes","getPhotoInlineDimensions","getVideoDimensions","width","height","getMediaTransferState","progress","isDownloadNeeded","isUploading","isTransferring","transferProgress","messageIds","contentType","validator","matchLinkInMessageText","getMediaDuration","duration","buildChatThreadKey","threadId","worker","requestStates","requestStatesByCallback","initApi","initialArgs","Worker","update","requestState","response","callbackArgs","subscribeToWorker","makeRequest","args","callApi","fnName","cancelApiProgress","progressCallback","isCanceled","postMessage","assign","pop","catch","finally","isWebpSupportedCache","isWebpSupported","webp","Image","handleLoadOrError","hasWebp","systemThemeCache","matchMedia","matches","getSystemTheme","handleSystemThemeChange","mql","addListener","PLATFORM_ENV","userAgent","platform","navigator","os","test","getPlatform","IS_MAC_OS","IS_IOS","IS_ANDROID","IS_PWA","standalone","referrer","includes","IS_TOUCH_ENV","IS_SINGLE_COLUMN_LAYOUT","innerWidth","IS_TABLET_COLUMN_LAYOUT","IS_VOICE_RECORDING_SUPPORTED","mediaDevices","AudioContext","webkitAudioContext","IS_EMOJI_SUPPORTED","documentElement","style","IS_SERVICE_WORKER_SUPPORTED","Audio","canPlayType","IS_CANVAS_FILTER_SUPPORTED","getContext","LAYERS_ANIMATION_NAME","DPR","devicePixelRatio","MASK_IMAGE_DISABLED","selectUser","global","userId","users","byId","selectIsUserBlocked","user","fullInfo","isBlocked","selectNotifySettings","settings","selectNotifyExceptions","notifyExceptions","selectChat","chats","selectChatUser","chat","getPrivateChatUserId","selectIsChatWithSelf","currentUserId","selectIsChatWithBot","isUserBot","selectSupportChat","isSupport","selectChatOnlineCount","isChatPrivate","isChatChannel","members","onlineCount","isUserOnline","selectChatBot","selectIsChatBotNotStarted","bot","lastMessage","messageInfo","byChatId","threadsById","MAIN_THREAD_ID","selectAreActiveChatsLoaded","listIds","active","selectIsChatListed","targetList","list","selectChatListType","folderId","selectChatFolder","chatFolders","selectIsChatPinned","archived","orderedPinnedIds","chatFoldersById","pinnedChatIds","selectChatByUsername","username","usernameLowered","toLowerCase","selectCountNotMutedUnread","activeChatIds","unreadCount","selectIsChatMuted","selectCurrentStickerSearch","stickers","search","selectCurrentGifSearch","gifs","selectStickerSet","setsById","selectStickersForEmoji","stickerSets","stickersForEmoji","packs","selectAnimatedEmoji","animatedEmojis","cleanedEmoji","replace","selectCurrentMessageList","messageLists","selectCurrentChat","selectChatMessages","selectScheduledMessages","scheduledMessages","selectThreadParam","thread","selectListedIds","selectOutlyingIds","selectCurrentMessageIds","messageListType","selectViewportIds","selectPinnedIds","selectScheduledIds","selectScrollOffset","selectReplyingToId","selectEditingId","selectEditingScheduledId","selectDraft","selectNoWebPage","selectThreadInfo","selectFirstMessageId","selectReplyStack","selectThreadOriginChat","threadInfo","originChannelId","selectThreadTopMessageId","topMessageId","selectThreadByMessage","replyToTopMessageId","isMessageInCurrentMessageList","currentMessageList","selectIsViewportNewest","viewportIds","lastMessageId","selectChatMessage","chatMessages","selectScheduledMessage","selectEditingMessage","selectChatMessageByPollId","pollId","messageWithPoll","selectFocusedMessageId","focusedChatId","focusedMessage","selectIsMessageFocused","focusedId","selectOutgoingStatus","isScheduledList","lastReadOutboxMessageId","selectIsMessageUnread","selectSender","selectForwardedSender","isChannelPost","fromChatId","senderUserId","selectAllowedMessageActions","serverTimeOffset","isRestricted","isPrivate","isChatWithSelf","isBasicGroup","isChatBasicGroup","isSuperGroup","isChatSuperGroup","isChannel","isServiceNotification","isOwn","isAction","isMessageEditable","getHasAdminRight","Date","viaBotId","canReply","getCanPostInChat","hasPinPermission","isCreator","isUserRightBanned","canPin","canUnpin","pinnedMessageIds","canDelete","canReport","canDeleteForAll","canEdit","canForward","hasSticker","hasFavoriteSticker","favorite","selectIsStickerFavorite","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","noOptions","ability","selectCanDeleteSelectedMessages","selectedMessageIds","selectedMessages","messageActions","selectCanReportSelectedMessages","selectUploadProgress","fileTransfer","fileUploads","byMessageLocalId","selectRealLastReadId","lastReadInboxMessageId","min","Infinity","selectFirstUnreadId","outlyingIds","lastReadId","isNotJoined","found","isFromScheduled","selectIsForwardModalOpen","forwardMessages","isModalShown","selectCommonBoxChatId","fromLastMessage","isCommonBoxChat","selectIsInSelectMode","selectIsMessageSelected","selectForwardedMessageIdsByGroupId","fromMessageId","selectMessageIdsByGroupId","selectIsDocumentGroupSelected","selectedIds","groupIds","selectSelectedMessagesCount","selectNewestMessageWithBotKeyboardButtons","keyboardButtons","replyHideMessageId","shouldHideKeyboardButtons","selectShouldAutoLoadMedia","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","isChatGroup","userOrChat","contactList","userIds","selectIsUserOrChatContact","selectShouldAutoPlayMedia","shouldAutoPlayVideos","shouldAutoPlayGifs","asGif","selectShouldLoopStickers","shouldLoopStickers","selectCurrentTextSearch","chatThreadKey","currentSearch","localTextSearch","byChatThreadKey","isActive","selectCurrentMediaSearchPeerId","localMediaSearch","currentProfileUserId","selectedId","selectCurrentMediaSearch","peerId","selectManagement","management","selectCurrentManagementType","selectIsMediaViewerOpen","mediaViewer","avatarOwnerId","selectRightColumnContentKey","isChatInfoShown","newChatMembersProgress","isAddingChatMembersShown","NewChatMembersProgress","Closed","isPollResults","pollResults","selectIsPollResultsOpen","isSearch","isManagement","currentManagement","selectCurrentManagement","isStickerSearch","query","isGifSearch","currentChatId","areActiveChatsLoaded","isUserInfo","isChatInfo","RightColumnContent","PollResults","Search","Management","StickerSearch","GifSearch","AddingMembers","UserInfo","ChatInfo","selectIsRightColumnShown","selectTheme","theme","shouldUseSystemTheme","selectCurrentGlobalSearchQuery","globalSearch","selectPaymentMessageId","payment","selectPaymentRequestId","formId","selectProviderPublishableKey","nativeParams","publishableKey","selectStripeCredentials","stripeCredentials","parts","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","self","throttle","interval","isPending","_args","setInterval","clearInterval","throttleWith","fastPrimaryRaf","waiting","onIdle","requestIdleCallback","pause","rafPromise","fastRafCallbacks","fastRafPrimaryCallbacks","beforeUnloadCallbacks","isPrimary","requestAnimationFrame","currentCallbacks","currentPrimaryCallbacks","onBeforeUnload","isLast","unshift","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","getUpdatedChat","chatUpdate","shouldOmitMinInfo","isMin","updatedChat","photos","updateChat","updateChats","updatedById","updatedChats","addChats","addedById","isAdded","addedChats","updateChatListType","listType","currentListIds","listTypeKey","currentFolderList","updateChatListSecondaryInfo","info","totalCountKey","totalCount","totalChatCount","isFullyLoaded","updateCurrentMessageList","shouldReplaceHistory","newMessageLists","last","replaceChatMessages","updateMessageStore","replaceThreadParam","paramName","threadUpdate","updateThread","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","newId","updateChatMessage","messageUpdate","updatedMessage","updateScheduledMessage","replaceScheduledMessages","deleteChatMessages","deletedForwardedPosts","isLinkedChannelPost","pinnedIds","newMessageCount","messagesCount","canDeleteCurrentThread","currentThreadId","originalPost","deleteChatScheduledMessages","scheduledIds","updateListedIds","orderHistoryIds","updateOutlyingIds","addViewportId","safeReplaceViewportIds","newViewportIds","updateThreadInfo","newThreadInfo","updateThreadInfos","updates","hash","updateScheduledMessages","updateFocusedMessage","noHighlight","updateFocusDirection","direction","enterMessageSelectMode","toggleMessageSelection","childMessageIds","withShift","oldSelectedMessages","newMessageIds","newSelectedMessageIds","prevIndex","currentIndex","to","max","exitMessageSelectMode","updateStickerSets","category","sets","resultIds","updatedSets","stickerSet","existing","setIds","updateStickerSet","stickerSetId","currentStickerSet","updateGifSearch","isNew","results","nextOffset","currentResults","newResults","currentIds","gif","replaceAnimatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","uniqueIds","forEmoji","rebuildStickersForEmoji","replaceUsers","getUpdatedUser","userUpdate","updatedUser","updateContactList","updatedUsers","contactUserIds","newContactUserIds","isContact","updateUser","updateUsers","addUsers","addedUsers","updateSelectedUserId","deleteUser","MEMO_EMPTY_ARRAY","updateUserSearch","searchStatePartial","userSearch","updateUserSearchFetchingStatus","newState","fetchingStatus","updateUserBlockedState","getComplexKey","updateGlobalSearch","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","foundOrPrevFoundIds","nextOffsetId","replaceLocalTextSearch","searchParams","updateLocalTextSearch","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","updateManagementProgress","updateManagement","replaceSettings","newSettings","replaceThemeSettings","themes","addNotifyExceptions","notifyException","exceptionData","addNotifyException","updateNotifySettings","peerType","isSilent","shouldShowPreviews","hasPrivateChatsNotifications","hasPrivateChatsMessagePreview","hasGroupNotifications","hasGroupMessagePreview","hasBroadcastNotifications","hasBroadcastMessagePreview","addBlockedContact","contactId","blocked","removeBlockedContact","updateTwoFaSettings","twoFaSettings","updateShippingOptions","shippingOptions","setRequestInfoId","setPaymentStep","step","setInvoiceMessageInfo","description","photoUrl","invoiceContent","setStripeCardInfo","cardInfo","setPaymentForm","form","setReceipt","receipt","messageInvoice","clearPayment","closeInvoice","isPaymentModalOpen","cacheApi","caches","Type","async","fetch","cacheName","Request","cache","open","Blob","blob","headers","Json","json","save","cacheData","JSON","stringify","Response","put","clear","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","ChatCreationProgress","ProfileEditProgress","ManagementProgress","ProfileState","PaymentStep","UPLOADING_WALLPAPER_SLUG","ManagementScreens","SUBSTITUTION_REGEX","PLURAL_OPTIONS","PLURAL_RULES","en","ar","ca","de","es","fa","fr","it","ko","nl","pl","pt_BR","ru","tr","uk","uz","langPack","fallbackLangPack","createCallbackManager","currentLangCode","getTranslation","format","cacheValue","cached","langString","processTranslation","importFallbackLangPack","getTranslationForLangString","langCode","translateString","remoteLangPack","remote","fetchRemoteString","setLanguage","withFallback","newLangPack","sourceLangPacks","fetchRemote","languages","langInfo","isRtl","rtl","default","template","amount","optionIndex","getPluralOption","translationSlices","initialValue","str","processTemplate","formatInteger","Bundles","LOAD_PROMISES","MEMORY_CACHE","loadModule","bundleName","moduleName","Auth","Main","Extra","handleBundleLoad","bundle","getModuleFromMemory","listeners","addLoadListener","listener","useOnChange","langProvider","File","constructor","fileBits","options","rest","super","this","dataUriToBlob","arr","mime","bstr","atob","u8arr","Uint8Array","charCodeAt","blobToDataUri","reader","FileReader","readAsDataURL","blobToFile","lastModified","preloadImage","img","preloadVideo","volume","onloadedmetadata","createPosterForVideo","race","onseeked","videoWidth","videoHeight","canvas","drawImage","toDataURL","currentTime","fetchBlob","imgToCanvas","promisifyRequest","oncomplete","onsuccess","onabort","defaultGetStoreFunc","defaultGetStore","dbName","storeName","indexedDB","onupgradeneeded","createObjectStore","dbp","txMode","db","transaction","objectStore","createStore","eachCursor","customStore","store","openCursor","continue","DC_IDS","hasStoredSession","withLegacy","localStorage","getItem","userAuthJson","userAuth","parse","dcID","storeSession","sessionData","mainDcId","hashes","setItem","dcId","clearStoredSession","removeItem","loadStoredSession","importLegacySession","sessionId","sessionJson","idb","clearLegacySessions","idbKeys","items","k","startsWith","vs16RegExp","zeroWidthJoiner","fromCharCode","removeVS16s","rawEmoji","color","className","withBackground","Button","ref","onClick","onContextMenu","onMouseDown","onMouseEnter","onMouseLeave","onFocus","pill","fluid","isText","isLoading","ariaLabel","download","disabled","ripple","faded","tabIndex","elementRef","isClicked","setIsClicked","fullClassName","buildClassName","handleClick","handleMouseDown","preventDefault","dir","aria-label","RE_LETTER_OR_DIGIT","SIMPLE_MARKDOWN_REGEX","renderText","part","filters","params","textParts","divEl","innerText","innerHTML","escapeHtml","EMOJI_REGEX","lastIndex","replaceEmojis","addLineBreaks","highlight","lowerCaseText","queryPosition","nextSymbol","newParts","links","nextLink","endsWith","addLinks","replaceSimpleMarkdown","emojis","emojiResult","nativeToUnfified","alt","line","trimmedLine","trimLeft","indentLength","repeat","entityResult","formatsCache","defaultPhoneNumberFormat","parsed","flag","phoneFormat","formatValue","phoneNumberFormat","phoneNumberGroups","count","getPhoneNumberFormat","getCountryById","countryList","getCountryFromPhoneNumber","input","phoneNumber","possibleCountries","country","formatPhoneNumber","_","p1","p2","p3","p4","p5","separator","output","formatPhoneNumberWithCode","numberWithPlus","noLoad","autoUpdate","setValue","Spinner","handleErrorEvent","ErrorEvent","reason","alert","currentProps","newProps","currentKeys","currentKeysLength","prop","usePrevious","next","shouldSkipUndefined","WEEKDAYS_FULL","MONTHS_FULL","MONTHS_FULL_LOWERCASE","month","getDayStart","datetime","setHours","getDayStartAt","getTime","toYearMonth","timestamp","getFullYear","getMonth","toIsoString","getDate","formatTime","getHours","padStart","getMinutes","formatPastTimeShort","today","weekAgo","setDate","getDay","withYear","formatDate","formatFullDate","formatMonthAndYear","isShort","formatHumanDate","noWeekdays","lowerFirst","upperFirst","yesterday","weekAhead","weekDay","day","monthIndex","formatMediaDateTime","formatMediaDuration","hours","floor","minutes","seconds","string","formatVoiceRecordDuration","durationInMs","milliseconds","formatDateToString","locale","toLocaleString","year","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","findIndex","timestampPlusDay","MILISECONDS_IN_DAY","toUpperCase","setTrigger","trigger","Link","random","getDeviceToken","subscription","toJSON","endpoint","checkIfPushSupported","ServiceWorkerRegistration","Notification","permission","requestPermission","unsubscribeFromPush","dispatch","deviceToken","unsubscribe","deleteDeviceToken","serviceWorkerRegistration","serviceWorker","ready","pushManager","getSubscription","areSettingsLoaded","subscribe","subscribedAt","checkIfShouldResubscribe","userVisibleOnly","setDeviceToken","DOMException","ABORT_ERR","showNewMessageNotification","isActiveChat","resultSettings","resultExceptions","loadNotificationSettings","isListed","hasFocus","checkIfShouldNotify","body","messageSender","messageAction","actionTargetMessage","targetUserIds","actionTargetUserIds","targetChatId","actionTargetChatId","actionTargetUsers","privateChatUserId","privateChatUser","actionOrigin","renderActionMessageText","asPlain","senderName","getMessageSenderName","getNotificationContent","controller","icon","badge","toString","vibrate","notification","onclick","close","focusMessage","focus","notifyClientReady","USER_COLOR_KEYS","getUserFirstOrLastName","firstName","lastName","isDeletedUser","getUserStatus","status","wasOnline","wasOnlineDate","diff","sortUserIds","usersById","priorityIds","expires","getUserColorKey","peer","abs","FOREVER_BANNED_DATE","getChatTypeString","isSelf","getChatDescription","about","getChatLink","inviteLink","getChatAvatarHash","owner","avatarHash","isChatSummaryOnly","isChatAdmin","adminRights","currentUserBannedRights","defaultBannedRights","migratedTo","getAllowedAttachmentOptions","isChatWithBot","canAttachMedia","canAttachPolls","canSendStickers","canSendGifs","canAttachEmbedLinks","isAdmin","getMessageSendingRestrictionReason","sendMessages","untilDate","getChatSlowModeOptions","slowMode","getChatOrder","joinDate","draftDate","isChatArchived","notifySettings","isMuted","getCanDeleteChat","prepareFolderListIds","chatsById","folder","chatIdsCache","excludedChatIds","includedChatIds","excludeArchived","excludeMuted","unreadMentionsCount","hasUnreadMark","excludeRead","bots","contacts","nonContacts","groups","channels","filterChatFolder","prepareChatList","folderType","chatFilter","listedChats","listIdsSet","pinnedChats","otherChats","getFolderUnreadDialogs","unreadDialogsCount","total","hasActiveDialogs","getFolderDescriptionText","emoticon","getFolderChatsCount","isChat","chatOrUser","sortChatIds","chatIds","shouldPrioritizeVerified","priority","isVerified","ANIMATION_START_EVENT","ANIMATION_END_EVENT","isAnimating","dispatchHeavyAnimationEvent","dispatchEvent","Event","handleAnimationStart","handleAnimationEnd","removeEventListener","NON_BUBBLEABLE_EVENTS","delegationRegistry","delegatedEventsByElement","documentEventCounters","element","propName","handler","asCapture","eventName","resolveEventName","canUseEventDelegation","handleEvent","resolveDelegationRegistryForName","newSet","resolveDelegatedEventsForElement","add","addDelegatedListener","removeDelegatedListener","tagName","realEventName","eventNames","realEvent","events","furtherCallsPrevented","stopPropagation","Proxy","Reflect","historyState","nextStateIndexToReplace","isHistoryAltered","isDisabled","isEdge","currentIndexes","disableHistoryBack","handleTouchStart","x","touches","pageX","handleTouchEnd","useHistoryBack","onBack","onForward","currentState","shouldReplaceNext","indexRef","isForward","prevIsActive","isClosed","indexHashRef","prevHashes","isHashChangedFromEvent","handleChange","isForceClose","prev","history","pushState","delta","realDelta","indexLast","go","replaceState","back","handlePopState","currIndex","disableHistoryAnimations","hasChanged","forceClose","isOpen","onCloseTransitionEnd","noOpenTransition","noCloseTransition","setIsClosed","closeTimeoutRef","hasOpenClassName","setHasOpenClassName","shouldHaveOpenClassName","isClosing","shouldRender","transitionClassNames","trimText","MenuItem","destructive","useLang","handleKeyDown","keyCode","data-char","location","origin","role","onKeyDown","ripples","setRipples","cleanUpDebounced","button","currentTarget","position","getBoundingClientRect","rippleSize","offsetWidth","clientX","y","clientY","isInitialized","HEX_COLOR_REGEX","lerp","start","end","interpolationRatio","colors","themeColors","hexToRgb","hex","parseInt","g","applyColorAnimationStep","startIndex","endIndex","propertyColors","setProperty","withAnimation","isDarkTheme","shouldAnimate","startAt","themeColorTag","querySelector","classList","remove","animateSingle","transition","EMPTY_IMAGE_DATA_URI","webpToPng","initWebpWorker","wasmReady","requests","getDecodePromise","ImageData","putImageData","toBlob","createPng","webpToPngBase64","pngBlob","WebpWorker","onmessage","handleLibWebpMessage","label","success","readOnly","placeholder","autoComplete","inputMode","maxLength","onChange","onInput","onKeyPress","onBlur","onPaste","labelText","htmlFor","subLabel","checked","blocking","onCheck","captureEscKeyListener","captureKeyboardListener","onEsc","formatFixedNumber","number","toFixed","formatIntegerCompact","views","getFirstLetters","phrase","word","prevDeps","RE_NOT_LETTER","searchWords","haystack","needle","haystackWords","needleWord","haystackWord","IS_LANDSCAPE","isLandscape","initialHeight","windowSize","updateSizes","isRefreshDisabled","handleResize","reload","vh","getIsKeyboardVisible","disableRefresh","enableRefresh","Menu","containerRef","positionX","positionY","autoClose","footer","noCloseOnBackdrop","onCloseAnimationEnd","onClose","shouldSkipTransition","menuRef","backdropContainerRef","useShowTransition","useEffectWithPrevDeps","prevIsOpen","useKeyboardListNavigation","useVirtualBackdrop","bubbleClassName","keyToHandlerName","Enter","Backspace","Delete","Esc","Escape","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Tab","handlers","onEnter","onDelete","onBackspace","onUp","onDown","onLeft","onRight","onTab","captureKeyboardListeners","hasActiveHandlers","handlerName","currentEventHandlers","releaseKeyboardListener","keyHandlers","oggToWav","opusData","arrayBuffer","typedArray","decoderWorker","DecoderWorker","wavWorker","WavWorker","command","buffers","buffer","page","terminate","wavBitDepth","wavSampleRate","decoderSampleRate","outputBufferSampleRate","pages","asCacheApiType","DataUri","Stream","memoryCache","fetchPromises","mediaFormat","onProgress","progressiveUrl","getProgressive","mediaPng","prepared","prepareMedia","mediaSource","MediaSource","streamUrl","URL","createObjectURL","sourceBuffer","addSourceBuffer","endOfStream","appendBuffer","revokeObjectURL","fetchFromCacheOrRemote","getFromMemory","cancelProgress","mediaData","fullSize","utf16","len","RangeError","adapt","numpoints","firsttime","decode","preserveCase","case_flags","input_length","out","bias","basic","j","ic","oldi","w","digit","lastIndexOf","cp","toUnicode","domain_array","ensureProtocol","getDomain","decodedHref","decodeURI","convertPunycode","toggleSafeLinkModal","openTelegramLink","isNotSafe","ctrlKey","altKey","shiftKey","metaKey","classNames","getFileSizeString","bytes","ONE_GIGABYTE","ONE_MEGABYTE","getDocumentExtension","getFileExtension","getColorFromExtension","extension","STRIPE_ERRORS","missing_payment_information","field","fieldError","invalid_number","exp_year","exp_month","invalid_expiry_year","invalid_expiry_month","cvc","invalid_cvc","getStripeError","param","SHIPPING_ERRORS","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_CITY_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_POSTCODE_INVALID","ADDRESS_STATE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_PHONE_INVALID","REQ_INFO_EMAIL_INVALID","getShippingErrors","dialogs","cur","hasErrorKey","currentInstance","tick","instance","isCancelled","animate","DropdownMenu","forceOpen","onOpen","dropdownRef","setIsOpen","menu","focusedElement","activeElement","elementChildren","onTrigger","onSelectWithEnter","itemSelector","noCaptureFocus","focusedIndex","setFocusedIndex","querySelectorAll","newIndex","RE_EMOJI_ONLY","twemojiRegex","DETECT_UP_TO","emojiCount","EXCLUDE_EMOJIS","unifiedToNative","unified","codePoints","fromCodePoint","pairs","uncompressEmoji","emojiData","categories","emojiRaw","names","native","image","FILTERED_ATTRIBUTES","HTML_ATTRIBUTES","MAPPED_ATTRIBUTES","autoPlay","headsByElement","renderWithVirtual","parentEl","$current","$parent","skipComponentUpdate","forceIndex","fragment","moveDirection","updateComponent","setupComponentUpdateListener","initComponent","node","createNode","childNodes","insertBefore","replaceChild","areComponents","nextSibling","newKeys","removeAttribute","addAttribute","oldValue","updateAttribute","updateAttributes","currentEl","teactFastList","$newChild","currentRemainingIndex","remainingByKey","$currentChild","newChildKey","order","teactOrderKey","fragmentQueue","fragmentIndex","newChildren","currentPreservedIndex","currentChildInfo","flushFragmentQueue","shouldMoveNode","isMovingDown","renderFastListChildren","createDocumentFragment","renderChildren","$firstChild","createTextNode","$child","$fragmentChild","cssText","render","headId","$head","openUserInfo","handleMessageClick","openChat","targetUsers","targetMessage","translationValues","textOptions","maxTextLength","unprocessed","processed","processPlaceholder","isEmbedded","renderChatContent","renderUserContent","renderOriginContent","showQuotes","messageText","renderMessageContent","renderProductContent","renderMigratedContent","replaceValue","placeholderPosition","MESSAGE_DELETED","openChatByUsername","updateAppBadge","setAppBadge","contains","currentThemeMatch","currentTheme","nextTheme","animationLevel","switchTheme","subscribeToSystemThemeChange","messageTextSize","language","uiReadyState","authPhoneNumber","authRememberMe","authError","shouldSkipHistoryAnimations","apiUpdate","authIsLoading","password","file","authIsLoadingQrCode","reset","langCachePrefix","langCacheVersion","init","connectionState","authNearestCountry","buildInputPrivacyRules","visibility","allowedIds","deniedIds","rules","collectUsers","accessHash","collectChats","allowedUsers","allowedChats","blockedUsers","blockedChats","bio","profileEdit","InProgress","currentUser","Complete","Idle","isUsernameAvailable","loadedWallpapers","wallpapers","slug","wallpaper","firstWallpaper","withLocalMedia","blockedIds","activeSessions","session","isCurrent","hasContactJoinedNotifications","phoneNumberSettings","lastSeenSettings","profilePhotoSettings","forwardsSettings","chatInviteSettings","privacy","lastSeen","profilePhoto","forwards","chatInvite","privacyKey","allowUserIds","allowChatIds","blockUserIds","blockChatIds","isAllowList","contactsIds","isSensitiveEnabled","onUpdateApiReady","wasAuthReady","authState","authorizationState","isLoggingOut","authIsCodeViaApp","isCodeViaApp","authHint","hint","authQrCode","qrCode","lastSyncTime","onUpdateAuthorizationState","onUpdateAuthorizationError","sync","signOut","onUpdateConnectionState","isEmpty","saveSession","onUpdateSession","onUpdateServerTimeOffset","sessionUserAuth","updateSessionUserId","onUpdateCurrentUser","showDialog","ServiceWorkerNoSupportError","setPrototypeOf","scriptUrl","handleWorkerMessage","register","INITIAL_STATE","isLeftColumnShown","activeChatFolder","recentEmojis","added","recent","greeting","featured","emojiKeywords","saved","inlineBots","byUsername","topPeers","topInlineBots","audioPlayer","notifications","messageSendKeyCombo","shouldSuggestStickers","light","isBlurred","patternColor","dark","shouldShowContextMenuHint","updateCacheThrottled","updateCache","unsubscribeFromBeforeUnload","isCaching","isHeavyAnimating","loadCache","initialState","setupCaching","time","timeEnd","readCache","clearCaching","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","reduceChatFolders","idsToSave","cid","chatIdsToSave","mainThread","tabKey","SITE_FONTS","preloadFonts","font","fonts","load","preloadAvatars","mediaLoader","preloadTasks","main","telegramLogoPath","authCode","monkeyPath","authPassword","background","backgroundColor","hasCustomBackground","hasCustomBackgroundColor","isRightColumnShown","setIsUiReady","isReady","markReady","useFlag","shouldRenderMask","safePreload","translation","setTranslation","getSuggestedLanguage","suggestedLanguage","MENU_HIDING_DURATION","inputRef","setFilter","filteredList","setFilteredList","updateFilter","filterValue","getFilteredList","countryId","firstElementChild","dataset","handleInput","handleInputKeyDown","handleTrigger","select","formEl","getElementById","scrollTo","top","scrollHeight","behavior","inputValue","data-country-id","isPreloadInitiated","setAuthPhoneNumber","setAuthRememberMe","loadNearestCountry","clearAuthError","goToAuthQrCode","setSettingOption","continueText","useLangString","setCountry","setPhoneNumber","isTouched","setIsTouched","lastSelection","setLastSelection","markIsLoading","unmarkIsLoading","fullNumber","canSubmit","parseFullNumber","newFullNumber","suggestedCountry","selectedCountry","handleLangChange","setSelectionRange","isJustPastedRef","handlePaste","handlePhoneNumberChange","selectionStart","selectionEnd","shouldFixSafariAutoComplete","handleKeepSessionChange","isAuthReady","onSubmit","InputText","Checkbox","Loading","AuthCode","useModuleLoader","AuthPassword","AuthRegister","G","H","B","QrCreator","h","u","J","level","version","O","C","f","lineTo","arcTo","moveTo","z","v","N","K","P","fillStyle","fillRect","left","beginPath","q","D","E","R","I","F","fill","colorStops","createLinearGradient","apply","createRadialGradient","addColorStop","A","minVersion","maxVersion","ecLevel","radius","quiet","HTMLCanvasElement","clearRect","write","S","multiply","L","M","Q","returnToAuthPhoneNumber","qrCodeRef","token","isMobile","AuthQrCode","AppInactive","appInactivePath","renderMain","disconnect","isInactive","markInactive","TeactDOM"],"mappings":"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,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAClf,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GACnf,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EACrf,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAChf,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,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","file":"main.9cbfb7726cae6e685678.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t2: 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + chunkId + \".\" + {\"0\":\"d8fb0ed03b2b879a4243\",\"1\":\"6110220c0cd22a07afe2\",\"3\":\"356913bd8f5c1b421f79\",\"4\":\"5fb9a295648f3bed8bba\",\"5\":\"64e3757d90b4958d12d9\",\"6\":\"f9e82031a240faaf8916\",\"7\":\"5020185fc616949435e0\",\"8\":\"b1c64eac1a0833d4fa35\",\"9\":\"8ce2b842c50b69d2f741\",\"10\":\"0f031682109823f02d37\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"0\":1,\"3\":1,\"4\":1,\"5\":1,\"6\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"\" + ({}[chunkId]||chunkId) + \".\" + {\"0\":\"d8fb0ed03b2b879a4243\",\"1\":\"6110220c0cd22a07afe2\",\"3\":\"356913bd8f5c1b421f79\",\"4\":\"5fb9a295648f3bed8bba\",\"5\":\"64e3757d90b4958d12d9\",\"6\":\"f9e82031a240faaf8916\",\"7\":\"5020185fc616949435e0\",\"8\":\"b1c64eac1a0833d4fa35\",\"9\":\"8ce2b842c50b69d2f741\",\"10\":\"0f031682109823f02d37\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 104);\n","import { DEBUG, DEBUG_MORE } from '../../config';\nimport {\n fastRaf, onTickEnd, throttleWithPrimaryRaf, throttleWithRaf,\n} from '../../util/schedulers';\nimport { flatten, orderBy } from '../../util/iteratees';\nimport arePropsShallowEqual, { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { handleError } from '../../util/handleError';\nimport { removeAllDelegatedListeners } from './dom-events';\n\nexport type Props = AnyLiteral;\nexport type FC

= (props: P) => any;\nexport type FC_withDebug =\n FC\n & {\n DEBUG_contentComponentName?: string;\n};\n\nexport enum VirtualElementTypesEnum {\n Empty,\n Text,\n Tag,\n Component,\n}\n\ninterface VirtualElementEmpty {\n type: VirtualElementTypesEnum.Empty;\n target?: Node;\n}\n\ninterface VirtualElementText {\n type: VirtualElementTypesEnum.Text;\n target?: Node;\n value: string;\n}\n\nexport interface VirtualElementTag {\n type: VirtualElementTypesEnum.Tag;\n target?: Node;\n tag: string;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport interface VirtualElementComponent {\n type: VirtualElementTypesEnum.Component;\n componentInstance: ComponentInstance;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport type StateHookSetter = (newValue: ((current: T) => T) | T) => void;\n\ninterface ComponentInstance {\n $element: VirtualElementComponent;\n Component: FC;\n name: string;\n props: Props;\n renderedValue?: any;\n isMounted: boolean;\n hooks: {\n state: {\n cursor: number;\n byCursor: {\n value: any;\n nextValue: any;\n setter: StateHookSetter;\n }[];\n };\n effects: {\n cursor: number;\n byCursor: {\n effect: () => void;\n dependencies?: any[];\n cleanup?: Function;\n }[];\n };\n memos: {\n cursor: number;\n byCursor: {\n current: any;\n dependencies: any[];\n }[];\n };\n };\n prepareForFrame?: () => void;\n forceUpdate?: () => void;\n onUpdate?: () => void;\n}\n\nexport type VirtualElement =\n VirtualElementEmpty\n | VirtualElementText\n | VirtualElementTag\n | VirtualElementComponent;\nexport type VirtualRealElement =\n VirtualElementTag\n | VirtualElementComponent;\nexport type VirtualElementChildren = VirtualElement[];\n\nconst Fragment = Symbol('Fragment');\n\nlet renderingInstance: ComponentInstance;\n\nexport function isEmptyElement($element: VirtualElement): $element is VirtualElementEmpty {\n return $element.type === VirtualElementTypesEnum.Empty;\n}\n\nexport function isTextElement($element: VirtualElement): $element is VirtualElementText {\n return $element.type === VirtualElementTypesEnum.Text;\n}\n\nexport function isTagElement($element: VirtualElement): $element is VirtualElementTag {\n return $element.type === VirtualElementTypesEnum.Tag;\n}\n\nexport function isComponentElement($element: VirtualElement): $element is VirtualElementComponent {\n return $element.type === VirtualElementTypesEnum.Component;\n}\n\nexport function isRealElement($element: VirtualElement): $element is VirtualRealElement {\n return isTagElement($element) || isComponentElement($element);\n}\n\nfunction createElement(\n source: string | FC | typeof Fragment,\n props: Props,\n ...children: any[]\n): VirtualRealElement | VirtualElementChildren {\n if (!props) {\n props = {};\n }\n\n children = flatten(children);\n\n if (source === Fragment) {\n return children;\n } else if (typeof source === 'function') {\n return createComponentInstance(source, props, children);\n } else {\n return buildTagElement(source, props, children);\n }\n}\n\nfunction createComponentInstance(Component: FC, props: Props, children: any[]): VirtualElementComponent {\n let parsedChildren: any | any[] | undefined;\n if (children.length === 0) {\n parsedChildren = undefined;\n } else if (children.length === 1) {\n [parsedChildren] = children;\n } else {\n parsedChildren = children;\n }\n\n const componentInstance: ComponentInstance = {\n $element: {} as VirtualElementComponent,\n Component,\n name: Component.name,\n props: {\n ...props,\n ...(parsedChildren && { children: parsedChildren }),\n },\n isMounted: false,\n hooks: {\n state: {\n cursor: 0,\n byCursor: [],\n },\n effects: {\n cursor: 0,\n byCursor: [],\n },\n memos: {\n cursor: 0,\n byCursor: [],\n },\n },\n };\n\n componentInstance.$element = buildComponentElement(componentInstance);\n\n return componentInstance.$element;\n}\n\nfunction buildComponentElement(\n componentInstance: ComponentInstance,\n children: VirtualElementChildren = [],\n): VirtualElementComponent {\n const { props } = componentInstance;\n\n return {\n componentInstance,\n type: VirtualElementTypesEnum.Component,\n props,\n children,\n };\n}\n\nfunction buildTagElement(tag: string, props: Props, children: any[]): VirtualElementTag {\n return {\n type: VirtualElementTypesEnum.Tag,\n tag,\n props,\n children: dropEmptyTail(children).map(buildChildElement),\n };\n}\n\n// We only need placeholders in the middle of collection (to ensure other elements order).\nfunction dropEmptyTail(children: any[]) {\n let i = children.length - 1;\n\n for (; i >= 0; i--) {\n if (!isEmptyPlaceholder(children[i])) {\n break;\n }\n }\n\n return i + 1 < children.length ? children.slice(0, i + 1) : children;\n}\n\nfunction isEmptyPlaceholder(child: any) {\n // eslint-disable-next-line no-null/no-null\n return child === false || child === null || child === undefined;\n}\n\nfunction buildChildElement(child: any): VirtualElement {\n if (isEmptyPlaceholder(child)) {\n return buildEmptyElement();\n } else if (isRealElement(child)) {\n return child;\n } else {\n return buildTextElement(child);\n }\n}\n\nfunction buildTextElement(value: any): VirtualElementText {\n return {\n type: VirtualElementTypesEnum.Text,\n value: String(value),\n };\n}\n\nfunction buildEmptyElement(): VirtualElementEmpty {\n return { type: VirtualElementTypesEnum.Empty };\n}\n\nconst DEBUG_components: AnyLiteral = {};\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('COMPONENTS', orderBy(Object.values(DEBUG_components), 'renderCount', 'desc'));\n});\n\nexport function renderComponent(componentInstance: ComponentInstance) {\n renderingInstance = componentInstance;\n componentInstance.hooks.state.cursor = 0;\n componentInstance.hooks.effects.cursor = 0;\n componentInstance.hooks.memos.cursor = 0;\n\n const { Component, props } = componentInstance;\n let newRenderedValue;\n\n try {\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n const componentName = componentInstance.name;\n if (!DEBUG_components[componentName]) {\n DEBUG_components[componentName] = {\n componentName,\n renderCount: 0,\n renderTimes: [],\n };\n }\n\n if (DEBUG_MORE) {\n if (componentName !== 'TeactMemoWrapper' && componentName !== 'TeactNContainer') {\n // eslint-disable-next-line no-console\n console.log(`[Teact] Render ${componentName}`);\n }\n }\n\n DEBUG_startAt = performance.now();\n }\n\n newRenderedValue = Component(props);\n\n if (DEBUG) {\n const renderTime = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (renderTime > 7) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow component render: ${componentName}, ${Math.round(renderTime)} ms`);\n }\n DEBUG_components[componentName].renderTimes.push(renderTime);\n DEBUG_components[componentName].renderCount++;\n }\n } catch (err) {\n handleError(err);\n\n newRenderedValue = componentInstance.renderedValue;\n }\n\n if (componentInstance.isMounted && newRenderedValue === componentInstance.renderedValue) {\n return componentInstance.$element;\n }\n\n componentInstance.renderedValue = newRenderedValue;\n\n const newChild = buildChildElement(newRenderedValue);\n componentInstance.$element = buildComponentElement(componentInstance, [newChild]);\n\n return componentInstance.$element;\n}\n\nexport function hasElementChanged($old: VirtualElement, $new: VirtualElement) {\n if (typeof $old !== typeof $new) {\n return true;\n } else if ($old.type !== $new.type) {\n return true;\n } else if (isTextElement($old) && isTextElement($new)) {\n return $old.value !== $new.value;\n } else if (isTagElement($old) && isTagElement($new)) {\n return ($old.tag !== $new.tag) || ($old.props.key !== $new.props.key);\n } else if (isComponentElement($old) && isComponentElement($new)) {\n return (\n $old.componentInstance.Component !== $new.componentInstance.Component\n ) || (\n $old.props.key !== $new.props.key\n );\n }\n\n return false;\n}\n\nexport function unmountTree($element: VirtualElement) {\n if (!isRealElement($element)) {\n return;\n }\n\n if (isComponentElement($element)) {\n unmountComponent($element.componentInstance);\n } else if ($element.target) {\n removeAllDelegatedListeners($element.target as HTMLElement);\n // Trying to help GC\n // eslint-disable-next-line no-null/no-null\n $element.target = null as any;\n }\n\n $element.children.forEach(unmountTree);\n}\n\nexport function mountComponent(componentInstance: ComponentInstance) {\n renderComponent(componentInstance);\n componentInstance.isMounted = true;\n return componentInstance.$element;\n}\n\nfunction unmountComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n // eslint-disable-next-line no-null/no-null\n hook.current = null;\n });\n\n componentInstance.hooks.effects.byCursor.forEach(({ cleanup }) => {\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err) {\n handleError(err);\n }\n }\n });\n\n componentInstance.isMounted = false;\n\n helpGc(componentInstance);\n}\n\n// We need to remove all references to DOM objects. We also clean all other references, just in case.\nfunction helpGc(componentInstance: ComponentInstance) {\n /* eslint-disable no-null/no-null */\n\n componentInstance.hooks.effects.byCursor.forEach((hook) => {\n hook.cleanup = null as any;\n hook.effect = null as any;\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = null as any;\n hook.nextValue = null as any;\n hook.setter = null as any;\n });\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks = null as any;\n componentInstance.$element = null as any;\n componentInstance.renderedValue = null as any;\n componentInstance.Component = null as any;\n componentInstance.props = null as any;\n componentInstance.forceUpdate = null as any;\n componentInstance.onUpdate = null as any;\n\n /* eslint-enable no-null/no-null */\n}\n\nfunction prepareComponentForFrame(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = hook.nextValue;\n });\n\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(() => prepareComponentForFrame(componentInstance));\n componentInstance.forceUpdate = throttleWithRaf(() => forceUpdateComponent(componentInstance));\n}\n\nfunction forceUpdateComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted || !componentInstance.onUpdate) {\n return;\n }\n\n const currentElement = componentInstance.$element;\n\n renderComponent(componentInstance);\n\n if (componentInstance.$element !== currentElement) {\n componentInstance.onUpdate();\n }\n}\n\nexport function getTarget($element: VirtualElement): Node | undefined {\n if (isComponentElement($element)) {\n return getTarget($element.children[0]);\n } else {\n return $element.target;\n }\n}\n\nexport function setTarget($element: VirtualElement, target: Node) {\n if (isComponentElement($element)) {\n setTarget($element.children[0], target);\n } else {\n $element.target = target;\n }\n}\n\nexport function useState(initial?: T): [T, StateHookSetter] {\n const { cursor, byCursor } = renderingInstance.hooks.state;\n\n if (byCursor[cursor] === undefined) {\n byCursor[cursor] = {\n value: initial,\n nextValue: initial,\n setter: ((componentInstance) => (newValue: ((current: T) => T) | T) => {\n if (byCursor[cursor].nextValue !== newValue) {\n byCursor[cursor].nextValue = typeof newValue === 'function'\n ? (newValue as (current: T) => T)(byCursor[cursor].value)\n : newValue;\n\n if (!componentInstance.prepareForFrame || !componentInstance.forceUpdate) {\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(\n () => prepareComponentForFrame(componentInstance),\n );\n componentInstance.forceUpdate = throttleWithRaf(\n () => forceUpdateComponent(componentInstance),\n );\n }\n\n componentInstance.prepareForFrame();\n componentInstance.forceUpdate();\n\n if (DEBUG_MORE) {\n if (componentInstance.name !== 'TeactNContainer') {\n // eslint-disable-next-line no-console\n console.log(\n '[Teact.useState]',\n componentInstance.name,\n // `componentInstance.Component` may be set to `null` by GC helper\n componentInstance.Component && (componentInstance.Component as FC_withDebug).DEBUG_contentComponentName\n ? `> ${(componentInstance.Component as FC_withDebug).DEBUG_contentComponentName}`\n : '',\n `Forced update at cursor #${cursor}, next value: `,\n byCursor[cursor].nextValue,\n );\n }\n }\n }\n })(renderingInstance),\n };\n }\n\n renderingInstance.hooks.state.cursor++;\n\n return [\n byCursor[cursor].value,\n byCursor[cursor].setter,\n ];\n}\n\nfunction useLayoutEffectBase(\n schedulerFn: typeof onTickEnd | typeof requestAnimationFrame,\n effect: () => Function | void,\n dependencies?: any[],\n debugKey?: string,\n) {\n const { cursor, byCursor } = renderingInstance.hooks.effects;\n const componentInstance = renderingInstance;\n\n const exec = () => {\n if (!componentInstance.isMounted) {\n return;\n }\n\n const { cleanup } = byCursor[cursor];\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err) {\n handleError(err);\n }\n }\n\n byCursor[cursor].cleanup = effect() as Function;\n };\n\n if (byCursor[cursor] !== undefined && dependencies && byCursor[cursor].dependencies) {\n if (dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies![i])) {\n if (debugKey) {\n const causedBy = dependencies.reduce((res, newValue, i) => {\n const prevValue = byCursor[cursor].dependencies![i];\n if (newValue !== prevValue) {\n res.push(`${i}: ${prevValue} => ${newValue}`);\n }\n\n return res;\n }, []);\n\n // eslint-disable-next-line no-console\n console.log(\n '[Teact]',\n debugKey,\n 'Effect caused by dependencies.',\n causedBy.join(', '),\n );\n }\n\n schedulerFn(exec);\n }\n } else {\n schedulerFn(exec);\n }\n\n byCursor[cursor] = {\n effect,\n dependencies,\n cleanup: byCursor[cursor] ? byCursor[cursor].cleanup : undefined,\n };\n\n renderingInstance.hooks.effects.cursor++;\n}\n\nexport function useEffect(effect: () => Function | void, dependencies?: any[], debugKey?: string) {\n return useLayoutEffectBase(fastRaf, effect, dependencies, debugKey);\n}\n\nexport function useLayoutEffect(effect: () => Function | void, dependencies?: any[], debugKey?: string) {\n return useLayoutEffectBase(onTickEnd, effect, dependencies, debugKey);\n}\n\nexport function useMemo(resolver: () => T, dependencies: any[], debugKey?: string): T {\n const { cursor, byCursor } = renderingInstance.hooks.memos;\n let { current } = byCursor[cursor] || {};\n\n if (\n byCursor[cursor] === undefined\n || dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies[i])\n ) {\n if (DEBUG && debugKey) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.useMemo] ${renderingInstance.name} (${debugKey}): Update is caused by:`,\n byCursor[cursor]\n ? getUnequalProps(dependencies, byCursor[cursor].dependencies).join(', ')\n : '[first render]',\n );\n }\n\n current = resolver();\n }\n\n byCursor[cursor] = {\n current,\n dependencies,\n };\n\n renderingInstance.hooks.memos.cursor++;\n\n return current;\n}\n\nexport function useCallback(newCallback: F, dependencies: any[]): F {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => newCallback, dependencies);\n}\n\nexport function useRef(initial: T): { current: T };\nexport function useRef(): { current: T | undefined }; // TT way (empty is `undefined`)\nexport function useRef(initial: null): { current: T | null }; // React way (empty is `null`)\n// eslint-disable-next-line no-null/no-null\nexport function useRef(initial?: T | null) {\n return useMemo(() => ({\n current: initial,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), []);\n}\n\nexport function memo(Component: T, areEqual = arePropsShallowEqual, debugKey?: string) {\n return function TeactMemoWrapper(props: Props) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const propsRef = useRef(props);\n const renderedRef = useRef();\n\n if (!renderedRef.current || (propsRef.current && !areEqual(propsRef.current, props))) {\n if (DEBUG && debugKey) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.memo] ${Component.name} (${debugKey}): Update is caused by:`,\n getUnequalProps(propsRef.current!, props).join(', '),\n );\n }\n\n propsRef.current = props;\n renderedRef.current = createElement(Component, props) as VirtualElementComponent;\n }\n\n return renderedRef.current;\n } as T;\n}\n\n// We need to keep it here for JSX.\nexport default {\n createElement,\n Fragment,\n};\n","import React, {\n FC, FC_withDebug, Props, useEffect, useState,\n} from './teact';\n\nimport { DEBUG, DEBUG_MORE } from '../../config';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport generateIdFor from '../../util/generateIdFor';\nimport { throttleWithRaf } from '../../util/schedulers';\nimport arePropsShallowEqual, { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { orderBy } from '../../util/iteratees';\nimport { GlobalState, GlobalActions, ActionTypes } from '../../global/types';\nimport { handleError } from '../../util/handleError';\n\nexport default React;\n\ntype ActionPayload = AnyLiteral;\n\ntype Reducer = (\n global: GlobalState,\n actions: GlobalActions,\n payload: any,\n) => GlobalState | void;\n\ntype MapStateToProps = ((global: GlobalState, ownProps: OwnProps) => AnyLiteral | null);\ntype MapActionsToProps = ((setGlobal: Function, actions: GlobalActions) => Partial | null);\n\nlet currentGlobal = {} as GlobalState;\n\nconst reducers: Record = {};\nconst callbacks: Function[] = [updateContainers];\nconst actions = {} as GlobalActions;\nconst containers = new Map;\n mapReducersToProps: MapActionsToProps;\n ownProps: Props;\n mappedProps?: Props;\n forceUpdate: Function;\n areMappedPropsChanged: boolean;\n DEBUG_updates: number;\n DEBUG_componentName: string;\n}>();\n\nfunction runCallbacks() {\n callbacks.forEach((cb) => cb(currentGlobal));\n}\n\nconst runCallbacksThrottled = throttleWithRaf(runCallbacks);\n\n// `noThrottle = true` is used as a workaround for iOS gesture history navigation\nexport function setGlobal(newGlobal?: GlobalState, noThrottle = false) {\n if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) {\n currentGlobal = newGlobal;\n if (!noThrottle) {\n runCallbacksThrottled();\n } else {\n runCallbacks();\n }\n }\n}\n\nexport function getGlobal() {\n return currentGlobal;\n}\n\nexport function getDispatch() {\n return actions;\n}\n\nfunction onDispatch(name: string, payload?: ActionPayload, noThrottle?: boolean) {\n if (reducers[name]) {\n reducers[name].forEach((reducer) => {\n const newGlobal = reducer(currentGlobal, actions, payload);\n if (newGlobal) {\n setGlobal(newGlobal, noThrottle);\n }\n });\n }\n}\n\nfunction updateContainers() {\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n DEBUG_startAt = performance.now();\n }\n\n // eslint-disable-next-line no-restricted-syntax\n for (const container of containers.values()) {\n const {\n mapStateToProps, mapReducersToProps, ownProps, mappedProps, forceUpdate,\n } = container;\n\n let newMappedProps;\n\n try {\n newMappedProps = {\n ...mapStateToProps(currentGlobal, ownProps),\n ...mapReducersToProps(setGlobal, actions),\n };\n } catch (err) {\n handleError(err);\n\n return;\n }\n\n if (DEBUG) {\n if (Object.values(newMappedProps).some(Number.isNaN)) {\n // eslint-disable-next-line no-console\n console.warn(\n // eslint-disable-next-line max-len\n `[TeactN] Some of \\`${container.DEBUG_componentName}\\` mappers contain NaN values. This may cause redundant updates because of incorrect equality check.`,\n );\n }\n }\n\n if (Object.keys(newMappedProps).length && !arePropsShallowEqual(mappedProps!, newMappedProps)) {\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log(\n '[TeactN] Will update',\n container.DEBUG_componentName,\n 'caused by',\n getUnequalProps(mappedProps!, newMappedProps).join(', '),\n );\n }\n\n container.mappedProps = newMappedProps;\n container.areMappedPropsChanged = true;\n container.DEBUG_updates++;\n\n forceUpdate();\n }\n }\n\n if (DEBUG) {\n const updateTime = performance.now() - DEBUG_startAt!;\n if (updateTime > 7) {\n // eslint-disable-next-line no-console\n console.warn(`[TeactN] Slow containers update: ${Math.round(updateTime)} ms`);\n }\n }\n}\n\nexport function addReducer(name: ActionTypes, reducer: Reducer) {\n if (!reducers[name]) {\n reducers[name] = [];\n\n actions[name] = (payload?: ActionPayload, noThrottle = false) => {\n onDispatch(name, payload, noThrottle);\n };\n }\n\n reducers[name].push(reducer);\n}\n\nexport function addCallback(cb: Function) {\n callbacks.push(cb);\n}\n\nexport function removeCallback(cb: Function) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n}\n\nexport function withGlobal(\n mapStateToProps: MapStateToProps = () => ({}),\n mapReducersToProps: MapActionsToProps = () => ({}),\n) {\n return (Component: FC) => {\n return function TeactNContainer(props: OwnProps) {\n (TeactNContainer as FC_withDebug).DEBUG_contentComponentName = Component.name;\n\n const [id] = useState(generateIdFor(containers));\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n return () => {\n containers.delete(id);\n };\n }, [id]);\n\n let container = containers.get(id);\n if (!container) {\n container = {\n mapStateToProps,\n mapReducersToProps,\n ownProps: props,\n areMappedPropsChanged: false,\n forceUpdate,\n DEBUG_updates: 0,\n DEBUG_componentName: Component.name,\n };\n\n containers.set(id, container);\n }\n\n if (container.areMappedPropsChanged) {\n container.areMappedPropsChanged = false;\n }\n\n if (!container.mappedProps || !arePropsShallowEqual(container.ownProps, props)) {\n container.ownProps = props;\n\n try {\n container.mappedProps = {\n ...mapStateToProps(currentGlobal, props),\n ...mapReducersToProps(setGlobal, actions),\n };\n } catch (err) {\n handleError(err);\n }\n }\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ;\n };\n };\n}\n\nif (DEBUG) {\n (window as any).getGlobal = getGlobal;\n\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log(\n 'GLOBAL CONTAINERS',\n orderBy(\n Array.from(containers.values())\n .map(({ DEBUG_componentName, DEBUG_updates }) => ({ DEBUG_componentName, DEBUG_updates })),\n 'DEBUG_updates',\n 'desc',\n ),\n );\n });\n}\n","export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const APP_NAME = process.env.APP_NAME || 'Telegram WebZ';\nexport const APP_VERSION = process.env.APP_VERSION || 'dev';\n\nexport const DEBUG = (\n process.env.APP_ENV !== 'production' && process.env.APP_ENV !== 'perf' && process.env.APP_ENV !== 'test'\n);\nexport const DEBUG_MORE = false;\n\nexport const IS_TEST = process.env.APP_ENV === 'test';\nexport const IS_PERF = process.env.APP_ENV === 'perf';\n\nexport const DEBUG_ALERT_MSG = 'Shoot!\\nSomething went wrong, please see the error details in Dev Tools Console.';\nexport const DEBUG_GRAMJS = false;\n\nexport const SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_KEY = 'GramJs:sessionId';\n\nexport const GLOBAL_STATE_CACHE_DISABLED = false;\nexport const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';\nexport const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 30;\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 5000;\n\nexport const MEDIA_CACHE_DISABLED = false;\nexport const MEDIA_CACHE_NAME = 'tt-media';\nexport const MEDIA_CACHE_NAME_AVATARS = 'tt-media-avatars';\nexport const MEDIA_PROGRESSIVE_CACHE_DISABLED = false;\nexport const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive';\nexport const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB\nexport const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg';\nexport const LANG_CACHE_NAME = 'tt-lang-packs-v5';\nexport const ASSET_CACHE_NAME = 'tt-assets';\n\nexport const DOWNLOAD_WORKERS = 16;\nexport const UPLOAD_WORKERS = 16;\n\nconst isBigScreen = typeof window !== 'undefined' && window.innerHeight >= 900;\n\nexport const MIN_PASSWORD_LENGTH = 1;\n\nexport const MESSAGE_LIST_SENSITIVE_AREA = 750;\nexport const MESSAGE_LIST_SLICE = isBigScreen ? 60 : 40;\nexport const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2;\n\nexport const CHAT_HEIGHT_PX = 72;\nexport const CHAT_LIST_SLICE = isBigScreen ? 30 : 25;\nexport const CHAT_LIST_LOAD_SLICE = 100;\nexport const SHARED_MEDIA_SLICE = 42;\nexport const MESSAGE_SEARCH_SLICE = 42;\nexport const GLOBAL_SEARCH_SLICE = 20;\nexport const MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const ANIMATION_LEVEL_MIN = 0;\nexport const ANIMATION_LEVEL_MED = 1;\nexport const ANIMATION_LEVEL_MAX = 2;\nexport const ANIMATION_LEVEL_DEFAULT = ANIMATION_LEVEL_MAX;\n\nexport const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16;\nexport const IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 17;\nexport const MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 15;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\n\n// Screen width where Pinned Message / Audio Player in the Middle Header can be safely displayed\nexport const SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1440; // px\n// Screen width where Pinned Message / Audio Player in the Middle Header shouldn't collapse with ChatInfo\nexport const SAFE_SCREEN_WIDTH_FOR_CHAT_INFO = 1150; // px\n\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1275; // px\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN = 925; // px\nexport const MOBILE_SCREEN_MAX_WIDTH = 600; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH = 950; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT = 450; // px\n\nexport const LOCAL_MESSAGE_ID_BASE = 1e9;\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const FAST_SMOOTH_MAX_DISTANCE = 1500;\nexport const FAST_SMOOTH_MIN_DURATION = 250;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 500; // px\n\n// Average duration of message sending animation\nexport const API_UPDATE_THROTTLE = Math.round((FAST_SMOOTH_MIN_DURATION + FAST_SMOOTH_MAX_DURATION) / 2);\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\n\nexport const STICKER_SIZE_INLINE_DESKTOP_FACTOR = 13;\nexport const STICKER_SIZE_INLINE_MOBILE_FACTOR = 11;\nexport const STICKER_SIZE_AUTH = 160;\nexport const STICKER_SIZE_AUTH_MOBILE = 120;\nexport const STICKER_SIZE_PICKER = 64;\nexport const STICKER_SIZE_GENERAL_SETTINGS = 48;\nexport const STICKER_SIZE_PICKER_HEADER = 32;\nexport const STICKER_SIZE_SEARCH = 64;\nexport const STICKER_SIZE_MODAL = 64;\nexport const STICKER_SIZE_TWO_FA = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 80;\nexport const STICKER_SIZE_INLINE_BOT_RESULT = 100;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\n\nexport const BASE_EMOJI_KEYWORD_LANG = 'en';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\n\nexport const CONTENT_TYPES_FOR_QUICK_UPLOAD = new Set([\n 'image/png', 'image/gif', 'image/jpeg', 'video/mp4', 'video/avi', 'video/quicktime',\n]);\n\n// eslint-disable-next-line max-len\nexport const RE_LINK_TEMPLATE = '((ftp|https?):\\\\/\\\\/)?((www\\\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,63})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_MENTION_TEMPLATE = '(@[\\\\w\\\\d_-]+)';\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)([\\d\\w_]+)(?:\\/([\\d]+))?(?:\\/([\\d]+))?$/gm;\nexport const RE_TME_INVITE_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/joinchat\\/)([\\d\\w_-]+)?$/gm;\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = 777000;\nexport const ALL_FOLDER_ID = 0;\nexport const ARCHIVED_FOLDER_ID = 1;\nexport const DELETED_COMMENTS_CHANNEL_ID = 777;\nexport const MAX_MEDIA_FILES_FOR_ALBUM = 10;\nexport const MAX_ACTIVE_PINNED_CHATS = 5;\nexport const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE;\nexport const DEFAULT_LANG_CODE = 'en';\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'] as const;\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const LOCALIZED_TIPS = ['ar', 'pt-br', 'id', 'it', 'ko', 'ms', 'pl', 'es', 'tr'];\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const LIGHT_THEME_BG_COLOR = '#A2AF8E';\nexport const DARK_THEME_BG_COLOR = '#0F0F0F';\nexport const DARK_THEME_PATTERN_COLOR = '#0a0a0a8c';\nexport const DEFAULT_PATTERN_COLOR = 'rgba(90, 110, 70, 0.6)';\n","type CollectionByKey = Record;\n\ntype OrderDirection = 'asc' | 'desc';\n\ninterface OrderCallback {\n (member: T): any;\n}\n\nexport function buildCollectionByKey(collection: T[], key: keyof T) {\n return collection.reduce((byKey: CollectionByKey, member: T) => {\n byKey[member[key]] = member;\n\n return byKey;\n }, {});\n}\n\nexport function mapValues(\n byKey: CollectionByKey,\n callback: (member: M, key: string, index: number, originalByKey: CollectionByKey) => R,\n): CollectionByKey {\n return Object.keys(byKey).reduce((newByKey: CollectionByKey, key, index) => {\n newByKey[key] = callback(byKey[key], key, index, byKey);\n return newByKey;\n }, {});\n}\n\nexport function pick(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n result[key] = object[key];\n return result;\n }, {} as Pick);\n}\n\nexport function pickTruthy(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n if (object[key]) {\n result[key] = object[key];\n }\n\n return result;\n }, {} as Pick);\n}\n\nexport function omit(object: T, keys: K[]) {\n const stringKeys = new Set(keys.map(String));\n const savedKeys = Object.keys(object)\n .filter((key) => !stringKeys.has(key)) as Array>;\n\n return pick(object, savedKeys);\n}\n\nexport function orderBy(\n collection: T[],\n orderKey: (keyof T) | OrderCallback | ((keyof T) | OrderCallback)[],\n mode: OrderDirection | [OrderDirection, OrderDirection] = 'asc',\n): T[] {\n return collection.sort((a, b) => {\n if (Array.isArray(orderKey)) {\n const [mode1, mode2] = Array.isArray(mode) ? mode : [mode, mode];\n const [orderKey1, orderKey2] = orderKey;\n\n let aValue1;\n let bValue1;\n\n if (typeof orderKey1 === 'function') {\n aValue1 = orderKey1(a) || 0;\n bValue1 = orderKey1(b) || 0;\n } else if (typeof orderKey1 === 'string') {\n aValue1 = a[orderKey1] || 0;\n bValue1 = b[orderKey1] || 0;\n }\n\n if (aValue1 !== bValue1) {\n return mode1 === 'asc' ? aValue1 - bValue1 : bValue1 - aValue1;\n } else {\n let aValue2;\n let bValue2;\n\n if (typeof orderKey2 === 'function') {\n aValue2 = orderKey2(a) || 0;\n bValue2 = orderKey2(b) || 0;\n } else if (typeof orderKey2 === 'string') {\n aValue2 = a[orderKey2] || 0;\n bValue2 = b[orderKey2] || 0;\n }\n\n return mode2 === 'asc' ? aValue2 - bValue2 : bValue2 - aValue2;\n }\n }\n\n let aValue;\n let bValue;\n\n if (typeof orderKey === 'function') {\n aValue = orderKey(a) || 0;\n bValue = orderKey(b) || 0;\n } else if (typeof orderKey === 'string') {\n aValue = a[orderKey] || 0;\n bValue = b[orderKey] || 0;\n }\n\n return mode === 'asc' ? aValue - bValue : bValue - aValue;\n });\n}\n\nexport function flatten(array: any[]) {\n return array.reduce((result, member) => {\n if (Array.isArray(member)) {\n return result.concat(member);\n } else {\n result.push(member);\n return result;\n }\n }, []);\n}\n\nexport function unique(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function compact(array: any[]) {\n return array.filter(Boolean);\n}\n\nexport function areSortedArraysEqual(array1: any[], array2: any[]) {\n if (array1.length !== array2.length) {\n return false;\n }\n\n return array1.every((item, i) => item === array2[i]);\n}\n\nexport function areSortedArraysIntersecting(array1: any[], array2: any[]) {\n return array1[0] <= array2[array2.length - 1] && array1[array1.length - 1] >= array2[0];\n}\n\nexport function findIntersectionWithSet(array: T[], set: Set): T[] {\n return array.filter((a) => set.has(a));\n}\n\nexport function split(array: any[], chunkSize: number) {\n const result = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n\n return result;\n}\n\nexport function cloneDeep(value: T): T {\n if (typeof value !== 'object') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(cloneDeep) as typeof value;\n }\n\n return Object.keys(value).reduce((acc, key) => {\n acc[key as keyof T] = cloneDeep(value[key as keyof T]);\n return acc;\n }, {} as T);\n}\n\n/**\n * Returns the index of the last element in the array where predicate is true, and -1 otherwise.\n *\n * @param array The source array to search in\n * @param predicate find calls predicate once for each element of the array, in descending\n * order, until it finds one where predicate returns true. If such an element is found,\n * findLastIndex immediately returns that element index. Otherwise, findLastIndex returns -1.\n */\nexport function findLast(array: Array, predicate: (value: T, index: number, obj: T[]) => boolean): T | undefined {\n let cursor = array.length;\n\n while (cursor--) {\n if (predicate(array[cursor], cursor, array)) {\n return array[cursor];\n }\n }\n\n return undefined;\n}\n","import {\n ApiChat, ApiMessage, ApiMessageEntityTypes, ApiUser,\n} from '../../api/types';\nimport { LangFn } from '../../hooks/useLang';\n\nimport { LOCAL_MESSAGE_ID_BASE, SERVICE_NOTIFICATIONS_USER_ID, RE_LINK_TEMPLATE } from '../../config';\nimport parseEmojiOnlyString from '../../components/common/helpers/parseEmojiOnlyString';\nimport { getUserFullName } from './users';\nimport { getChatTitle } from './chats';\n\nconst CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram';\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\nconst TRUNCATED_SUMMARY_LENGTH = 80;\n\nexport function getMessageKey(message: ApiMessage) {\n const { chatId, id } = message;\n\n return `msg${chatId}-${id}`;\n}\n\nexport function parseMessageKey(key: string) {\n const match = key.match(/^msg(-?\\d+)-(\\d+)/)!;\n\n return { chatId: Number(match[1]), messageId: Number(match[2]) };\n}\n\nexport function getMessageOriginalId(message: ApiMessage) {\n return message.previousLocalId || message.id;\n}\n\nexport function getMessageSummaryText(lang: LangFn, message: ApiMessage, noEmoji = false) {\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, invoice,\n } = message.content;\n\n const truncatedText = text && text.text.substr(0, TRUNCATED_SUMMARY_LENGTH);\n\n if (message.groupedId) {\n return `${noEmoji ? '' : '🖼 '}${truncatedText || lang('lng_in_dlg_album')}`;\n }\n\n if (photo) {\n return `${noEmoji ? '' : '🖼 '}${truncatedText || lang('AttachPhoto')}`;\n }\n\n if (video) {\n return `${noEmoji ? '' : '📹 '}${truncatedText || lang(video.isGif ? 'AttachGif' : 'AttachVideo')}`;\n }\n\n if (sticker) {\n return `${sticker.emoji || ''} ${lang('AttachSticker')}`.trim();\n }\n\n if (audio) {\n return `${noEmoji ? '' : '🎧 '}${getMessageAudioCaption(message) || lang('AttachMusic')}`;\n }\n\n if (voice) {\n return `${noEmoji ? '' : '🎤 '}${truncatedText || lang('AttachAudio')}`;\n }\n\n if (document) {\n return `${noEmoji ? '' : '📎 '}${truncatedText || document.fileName}`;\n }\n\n if (contact) {\n return lang('AttachContact');\n }\n\n if (poll) {\n return `${noEmoji ? '' : '📊 '}${poll.summary.question}`;\n }\n\n if (invoice) {\n return 'Invoice';\n }\n\n if (text) {\n return truncatedText;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function getMessageText(message: ApiMessage) {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact, invoice,\n } = message.content;\n\n if (text) {\n return text.text;\n }\n\n if (sticker || photo || video || audio || voice || document || contact || poll || webPage || invoice) {\n return undefined;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function getMessageCustomShape(message: ApiMessage): boolean | number {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact,\n } = message.content;\n\n if (sticker || (video && video.isRound)) {\n return true;\n }\n\n if (!text || photo || video || audio || voice || document || poll || webPage || contact) {\n return false;\n }\n\n // This is a \"dual-intent\" method used to limit calls of `parseEmojiOnlyString`.\n return parseEmojiOnlyString(text.text) || false;\n}\n\nexport function getMessageSingleEmoji(message: ApiMessage) {\n const { text } = message.content;\n if (!(text && text.text.length <= 6)) {\n return undefined;\n }\n\n if (getMessageCustomShape(message) !== 1) {\n return undefined;\n }\n\n return text.text;\n}\n\nexport function getFirstLinkInMessage(message: ApiMessage) {\n const { text } = message.content;\n\n let match: RegExpMatchArray | null | undefined;\n if (text && text.entities) {\n let link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.TextUrl);\n if (link) {\n match = link.url!.match(RE_LINK);\n }\n\n if (!match) {\n link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.Url);\n if (link) {\n const { offset, length } = link;\n match = text.text.substring(offset, offset + length).match(RE_LINK);\n }\n }\n }\n\n if (!match && text) {\n match = text.text.match(RE_LINK);\n }\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function matchLinkInMessageText(message: ApiMessage) {\n const { text } = message.content;\n const match = text && text.text.match(RE_LINK);\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function isOwnMessage(message: ApiMessage) {\n return message.isOutgoing;\n}\n\nexport function isReplyMessage(message: ApiMessage) {\n return Boolean(message.replyToMessageId);\n}\n\nexport function isForwardedMessage(message: ApiMessage) {\n return Boolean(message.forwardInfo);\n}\n\nexport function isActionMessage(message: ApiMessage) {\n return !!message.content.action;\n}\n\nexport function isServiceNotificationMessage(message: ApiMessage) {\n return message.chatId === SERVICE_NOTIFICATIONS_USER_ID && isMessageLocal(message);\n}\n\nexport function isAnonymousOwnMessage(message: ApiMessage) {\n return Boolean(message.senderId) && message.senderId! < 0 && isOwnMessage(message);\n}\n\nexport function getSenderTitle(lang: LangFn, sender: ApiUser | ApiChat) {\n return sender.id > 0 ? getUserFullName(sender as ApiUser) : getChatTitle(lang, sender as ApiChat);\n}\n\nexport function getSendingState(message: ApiMessage) {\n if (!message.sendingState) {\n return 'succeeded';\n }\n\n return message.sendingState === 'messageSendingStateFailed' ? 'failed' : 'pending';\n}\n\nexport function isMessageLocal(message: ApiMessage) {\n return message.id >= LOCAL_MESSAGE_ID_BASE;\n}\n\nexport function isHistoryClearMessage(message: ApiMessage) {\n return message.content.action && message.content.action.type === 'historyClear';\n}\n\nexport function getMessageAudioCaption(message: ApiMessage) {\n const { audio, text } = message.content;\n\n return (audio && [audio.title, audio.performer].filter(Boolean).join(' — ')) || (text && text.text);\n}\n","import {\n ApiAudio, ApiMediaFormat, ApiMessage, ApiMessageSearchType, ApiPhoto, ApiVideo, ApiDimensions,\n} from '../../api/types';\n\nimport { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, IS_SAFARI } from '../../util/environment';\nimport { getMessageKey, isMessageLocal, matchLinkInMessageText } from './messages';\nimport { getDocumentHasPreview } from '../../components/common/helpers/documentInfo';\n\ntype Target =\n 'micro'\n | 'pictogram'\n | 'inline'\n | 'viewerPreview'\n | 'viewerFull'\n | 'download';\n\n\nexport function getMessageContent(message: ApiMessage) {\n return message.content;\n}\n\nexport function hasMessageMedia(message: ApiMessage) {\n return Boolean((\n getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageContact(message)\n || getMessagePoll(message)\n || getMessageAction(message)\n || getMessageAudio(message)\n || getMessageVoice(message)\n ));\n}\n\nexport function getMessagePhoto(message: ApiMessage) {\n return message.content.photo;\n}\n\nexport function getMessageVideo(message: ApiMessage) {\n return message.content.video;\n}\n\nexport function getMessageRoundVideo(message: ApiMessage) {\n const { video } = message.content;\n\n return video && video.isRound ? video : undefined;\n}\n\nexport function getMessageAction(message: ApiMessage) {\n return message.content.action;\n}\n\nexport function getMessageAudio(message: ApiMessage) {\n return message.content.audio;\n}\n\nexport function getMessageVoice(message: ApiMessage) {\n return message.content.voice;\n}\n\nexport function getMessageSticker(message: ApiMessage) {\n return message.content.sticker;\n}\n\nexport function getMessageDocument(message: ApiMessage) {\n return message.content.document;\n}\n\nexport function isMessageDocumentPhoto(message: ApiMessage) {\n const document = getMessageDocument(message);\n return document ? document.mediaType === 'photo' : undefined;\n}\n\nexport function isMessageDocumentVideo(message: ApiMessage) {\n const document = getMessageDocument(message);\n return document ? document.mediaType === 'video' : undefined;\n}\n\nexport function getMessageContact(message: ApiMessage) {\n return message.content.contact;\n}\n\nexport function getMessagePoll(message: ApiMessage) {\n return message.content.poll;\n}\n\nexport function getMessageInvoice(message: ApiMessage) {\n return message.content.invoice;\n}\n\nexport function getMessageWebPage(message: ApiMessage) {\n return message.content.webPage;\n}\n\nexport function getMessageWebPagePhoto(message: ApiMessage) {\n const webPage = getMessageWebPage(message);\n return webPage ? webPage.photo : undefined;\n}\n\nexport function getMessageWebPageDocument(message: ApiMessage) {\n const webPage = getMessageWebPage(message);\n return webPage ? webPage.document : undefined;\n}\n\nexport function getMessageWebPageVideo(message: ApiMessage): ApiVideo | undefined {\n const webPage = getMessageWebPage(message);\n if (!webPage) return undefined;\n return webPage.video;\n}\n\nexport function getMessageMediaThumbnail(message: ApiMessage) {\n const media = getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageWebPagePhoto(message)\n || getMessageWebPageVideo(message);\n\n if (!media) {\n return undefined;\n }\n\n return media.thumbnail;\n}\n\nexport function getMessageMediaThumbDataUri(message: ApiMessage) {\n const thumbnail = getMessageMediaThumbnail(message);\n\n return thumbnail ? thumbnail.dataUri : undefined;\n}\n\nexport function getMessageMediaHash(\n message: ApiMessage,\n target: Target,\n) {\n const {\n photo, video, sticker, audio, voice, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n const webPageVideo = getMessageWebPageVideo(message);\n\n const messageVideo = video || webPageVideo;\n const messagePhoto = photo || webPagePhoto;\n\n if (!(messagePhoto || messageVideo || sticker || audio || voice || document)) {\n return undefined;\n }\n\n const base = getMessageKey(message);\n\n if (messageVideo) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n return !hasMessageLocalBlobUrl(message) ? getVideoOrAudioBaseHash(messageVideo, base) : undefined;\n case 'viewerPreview':\n return `${base}?size=m`;\n case 'viewerFull':\n return getVideoOrAudioBaseHash(messageVideo, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (messagePhoto) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n return !hasMessageLocalBlobUrl(message) ? `${base}?size=x` : undefined;\n case 'viewerPreview':\n return `${base}?size=x`;\n case 'viewerFull':\n return `${base}?size=z`;\n }\n }\n\n if (document) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n case 'inline':\n case 'viewerPreview':\n if (!getDocumentHasPreview(document) || hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=m`;\n default:\n return base;\n }\n }\n\n if (sticker) {\n switch (target) {\n case 'micro':\n return undefined;\n case 'pictogram':\n return `${base}?size=m`;\n default:\n return base;\n }\n }\n\n if (audio) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n case 'download':\n return `${base}?download`;\n default:\n return getVideoOrAudioBaseHash(audio, base);\n }\n }\n\n if (voice) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n default:\n return base;\n }\n }\n\n return undefined;\n}\n\nfunction getVideoOrAudioBaseHash(media: ApiAudio | ApiVideo, base: string) {\n if (IS_PROGRESSIVE_SUPPORTED && IS_SAFARI) {\n return `${base}?fileSize=${media.size}&mimeType=${media.mimeType}`;\n }\n\n return base;\n}\n\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): Exclude;\nexport function getMessageMediaFormat(message: ApiMessage, target: Target, canBeLottie: true): ApiMediaFormat;\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): ApiMediaFormat {\n const {\n sticker, video, audio, voice,\n } = message.content;\n\n const fullVideo = video || getMessageWebPageVideo(message);\n\n if (sticker && target === 'inline' && sticker.isAnimated) {\n return ApiMediaFormat.Lottie;\n } else if (fullVideo && IS_PROGRESSIVE_SUPPORTED && (\n target === 'viewerFull' || target === 'inline'\n )) {\n return ApiMediaFormat.Progressive;\n } else if (audio || voice) {\n // Safari\n if (voice && !IS_OPUS_SUPPORTED) {\n return ApiMediaFormat.BlobUrl;\n }\n\n return ApiMediaFormat.Progressive;\n }\n\n return ApiMediaFormat.BlobUrl;\n}\n\nexport function getMessageFileName(message: ApiMessage) {\n const {\n photo, video, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n const webPageVideo = getMessageWebPageVideo(message);\n\n if (photo || webPagePhoto) {\n return `photo${message.date}.jpeg`;\n }\n\n const { fileName } = video || webPageVideo || document || {};\n\n return fileName;\n}\n\nexport function getMessageFileSize(message: ApiMessage) {\n const { video, document } = message.content;\n const webPageVideo = getMessageWebPageVideo(message);\n const { size } = video || webPageVideo || document || {};\n\n return size;\n}\n\nexport function hasMessageLocalBlobUrl(message: ApiMessage) {\n const { photo, video, document } = message.content;\n\n return (photo && photo.blobUrl) || (video && video.blobUrl) || (document && document.previewBlobUrl);\n}\n\nexport function getChatMediaMessageIds(\n messages: Record, listedIds: number[], isFromSharedMedia = false,\n) {\n const ids = getMessageContentIds(messages, listedIds, isFromSharedMedia ? 'media' : 'inlineMedia');\n\n return isFromSharedMedia ? ids.reverse() : ids;\n}\n\nexport function getPhotoFullDimensions(photo: ApiPhoto): ApiDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'z')\n || photo.sizes.find((size) => size.type === 'y')\n || getPhotoInlineDimensions(photo)\n );\n}\n\nexport function getPhotoInlineDimensions(photo: ApiPhoto): ApiDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'x')\n || photo.sizes.find((size) => size.type === 'm')\n || photo.sizes.find((size) => size.type === 's')\n || photo.thumbnail\n );\n}\n\nexport function getVideoDimensions(video: ApiVideo): ApiDimensions | undefined {\n if (video.width && video.height) {\n return video as ApiDimensions;\n }\n\n return undefined;\n}\n\nexport function getMediaTransferState(message: ApiMessage, progress?: number, isDownloadNeeded = false) {\n const isUploading = isMessageLocal(message);\n const isTransferring = isUploading || isDownloadNeeded;\n const transferProgress = Number(progress);\n\n return {\n isUploading, isTransferring, transferProgress,\n };\n}\n\nexport function getMessageContentIds(\n messages: Record, messageIds: number[], contentType: ApiMessageSearchType | 'inlineMedia',\n) {\n let validator: Function;\n\n switch (contentType) {\n case 'media':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return getMessagePhoto(message) || (video && !video.isRound && !video.isGif);\n };\n break;\n\n case 'documents':\n validator = getMessageDocument;\n break;\n\n case 'links':\n validator = (message: ApiMessage) => getMessageWebPage(message) || matchLinkInMessageText(message);\n break;\n\n case 'audio':\n validator = getMessageAudio;\n break;\n\n case 'inlineMedia':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return (\n getMessagePhoto(message)\n || (video && !video.isRound && !video.isGif)\n || isMessageDocumentPhoto(message)\n || isMessageDocumentVideo(message)\n );\n };\n break;\n\n default:\n return [] as Array;\n }\n\n return messageIds.reduce((result, messageId) => {\n if (messages[messageId] && validator(messages[messageId])) {\n result.push(messageId);\n }\n\n return result;\n }, [] as Array);\n}\n\nexport function getMediaDuration(message: ApiMessage) {\n const { audio, voice, video } = getMessageContent(message);\n const media = audio || voice || video || getMessageWebPageVideo(message);\n if (!media) {\n return undefined;\n }\n\n return media.duration;\n}\n","export function buildChatThreadKey(chatId: number, threadId: number) {\n return `${chatId}_${threadId}`;\n}\n","import Worker from 'worker-loader!./worker';\n\nimport { ApiInitialArgs, ApiOnProgress, OnApiUpdate } from '../../types';\nimport { Methods, MethodArgs, MethodResponse } from '../methods/types';\nimport { WorkerMessageEvent, ThenArg, OriginRequest } from './types';\n\nimport { DEBUG } from '../../../config';\nimport generateIdFor from '../../../util/generateIdFor';\n\ntype RequestStates = {\n messageId: string;\n resolve: Function;\n reject: Function;\n callback?: AnyToVoidFunction;\n};\n\nlet worker: Worker;\nconst requestStates = new Map();\nconst requestStatesByCallback = new Map();\n\n// TODO Re-use `util/WorkerConnector.ts`\n\nexport function initApi(onUpdate: OnApiUpdate, initialArgs: ApiInitialArgs) {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD WORKER');\n }\n\n worker = new Worker();\n subscribeToWorker(onUpdate);\n }\n\n return makeRequest({\n type: 'initApi',\n args: [initialArgs],\n });\n}\n\nexport function callApi(fnName: T, ...args: MethodArgs) {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('API is not initialized');\n }\n\n return undefined;\n }\n\n return makeRequest({\n type: 'callMethod',\n name: fnName,\n args,\n }) as MethodResponse;\n}\n\nexport function cancelApiProgress(progressCallback: ApiOnProgress) {\n progressCallback.isCanceled = true;\n\n const { messageId } = requestStatesByCallback.get(progressCallback) || {};\n if (!messageId) {\n return;\n }\n\n worker.postMessage({\n type: 'cancelProgress',\n messageId,\n });\n}\n\nfunction subscribeToWorker(onUpdate: OnApiUpdate) {\n worker.addEventListener('message', ({ data }: WorkerMessageEvent) => {\n if (data.type === 'update') {\n onUpdate(data.update);\n } else if (data.type === 'methodResponse') {\n const requestState = requestStates.get(data.messageId);\n if (requestState) {\n if (data.error) {\n requestState.reject(data.error);\n } else {\n requestState.resolve(data.response);\n }\n }\n } else if (data.type === 'methodCallback') {\n const requestState = requestStates.get(data.messageId);\n if (requestState && requestState.callback) {\n requestState.callback(...data.callbackArgs);\n }\n } else if (data.type === 'unhandledError') {\n throw data.error;\n }\n });\n}\n\nfunction makeRequest(message: OriginRequest) {\n const messageId = generateIdFor(requestStates);\n const payload: OriginRequest = {\n messageId,\n ...message,\n };\n\n const requestState = { messageId } as RequestStates;\n\n // Re-wrap type because of `postMessage`\n const promise: Promise>> = new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n });\n\n if (typeof payload.args[1] === 'function') {\n const callback = payload.args.pop() as AnyToVoidFunction;\n requestState.callback = callback;\n requestStatesByCallback.set(callback, requestState);\n }\n\n requestStates.set(messageId, requestState);\n promise\n .catch(() => undefined)\n .finally(() => {\n requestStates.delete(messageId);\n\n if (requestState.callback) {\n requestStatesByCallback.delete(requestState.callback);\n }\n });\n\n worker.postMessage(payload);\n\n return promise;\n}\n","let isWebpSupportedCache: boolean | undefined;\n\nexport function isWebpSupported() {\n return Boolean(isWebpSupportedCache);\n}\n\nfunction testWebp(): Promise {\n return new Promise((resolve) => {\n const webp = new Image();\n // eslint-disable-next-line max-len\n webp.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n const handleLoadOrError = () => {\n resolve(webp.height === 2);\n };\n webp.onload = handleLoadOrError;\n webp.onerror = handleLoadOrError;\n });\n}\n\ntestWebp().then((hasWebp) => {\n isWebpSupportedCache = hasWebp;\n});\n","import { ThemeKey } from '../types';\n\nlet systemThemeCache: ThemeKey = (\n window && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches\n) ? 'dark' : 'light';\n\nexport function getSystemTheme() {\n return systemThemeCache;\n}\n\nfunction handleSystemThemeChange(e: MediaQueryListEventMap['change']) {\n systemThemeCache = e.matches ? 'dark' : 'light';\n}\n\nconst mql = window.matchMedia('(prefers-color-scheme: dark)');\nif (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handleSystemThemeChange);\n} else if (typeof mql.addListener === 'function') {\n mql.addListener(handleSystemThemeChange);\n}\n","import {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n IS_TEST,\n} from '../config';\n\nexport * from './environmentWebp';\n\nexport * from './environmentSystemTheme';\n\nexport function getPlatform() {\n const { userAgent, platform } = window.navigator;\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os: 'macOS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined;\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'macOS';\n } else if (iosPlatforms.indexOf(platform) !== -1) {\n os = 'iOS';\n } else if (windowsPlatforms.indexOf(platform) !== -1) {\n os = 'Windows';\n } else if (/Android/.test(userAgent)) {\n os = 'Android';\n } else if (/Linux/.test(platform)) {\n os = 'Linux';\n }\n\n return os;\n}\n\nexport const PLATFORM_ENV = getPlatform();\nexport const IS_MAC_OS = PLATFORM_ENV === 'macOS';\nexport const IS_IOS = PLATFORM_ENV === 'iOS';\nexport const IS_ANDROID = PLATFORM_ENV === 'Android';\nexport const IS_SAFARI = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\nexport const IS_PWA = window.matchMedia('(display-mode: standalone)').matches\n|| (window.navigator as any).standalone\n|| document.referrer.includes('android-app://');\n\nexport const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches;\n// Keep in mind the landscape orientation\nexport const IS_SINGLE_COLUMN_LAYOUT = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || (\n window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n);\n// Special layout, 1 column while chat opened, 2 columns while collapsed\nexport const IS_TABLET_COLUMN_LAYOUT = !IS_SINGLE_COLUMN_LAYOUT && (\n window.innerWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n);\nexport const IS_VOICE_RECORDING_SUPPORTED = (navigator.mediaDevices && 'getUserMedia' in navigator.mediaDevices && (\n window.AudioContext || (window as any).webkitAudioContext\n));\nexport const IS_SMOOTH_SCROLL_SUPPORTED = 'scrollBehavior' in document.documentElement.style;\nexport const IS_EMOJI_SUPPORTED = PLATFORM_ENV && (IS_MAC_OS || IS_IOS);\nexport const IS_SERVICE_WORKER_SUPPORTED = 'serviceWorker' in navigator;\n// TODO Consider failed service worker\nexport const IS_PROGRESSIVE_SUPPORTED = IS_SERVICE_WORKER_SUPPORTED;\nexport const IS_STREAMING_SUPPORTED = 'MediaSource' in window;\nexport const IS_OPUS_SUPPORTED = Boolean((new Audio()).canPlayType('audio/ogg; codecs=opus'));\nexport const IS_CANVAS_FILTER_SUPPORTED = (\n !IS_TEST && 'filter' in (document.createElement('canvas').getContext('2d') || {})\n);\nexport const LAYERS_ANIMATION_NAME = IS_ANDROID ? 'slide-fade' : IS_IOS ? 'slide-layers' : 'push-slide';\n\nexport const DPR = window.devicePixelRatio || 1;\n\nexport const MASK_IMAGE_DISABLED = true;\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nexport function selectUser(global: GlobalState, userId: number): ApiUser | undefined {\n return global.users.byId[userId];\n}\n\nexport function selectIsUserBlocked(global: GlobalState, userId: number) {\n const user = selectUser(global, userId);\n\n return user && user.fullInfo && user.fullInfo.isBlocked;\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectUserByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.users.byId).find(\n (user) => user.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectIsUserOrChatContact(global: GlobalState, userOrChat: ApiUser | ApiChat) {\n return global.contactList && global.contactList.userIds.includes(userOrChat.id);\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectNotifySettings(global: GlobalState) {\n return global.settings.byKey;\n}\n\nexport function selectNotifyExceptions(global: GlobalState) {\n return global.settings.notifyExceptions;\n}\n","import { ApiChat, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalState } from '../../global/types';\n\nimport {\n getPrivateChatUserId, isChatChannel, isChatPrivate, isHistoryClearMessage, isUserBot, isUserOnline, selectIsChatMuted,\n} from '../helpers';\nimport { selectUser } from './users';\nimport { ALL_FOLDER_ID, ARCHIVED_FOLDER_ID, MEMBERS_LOAD_SLICE } from '../../config';\nimport { selectNotifyExceptions, selectNotifySettings } from './settings';\n\nexport function selectChat(global: GlobalState, chatId: number): ApiChat | undefined {\n return global.chats.byId[chatId];\n}\n\nexport function selectChatUser(global: GlobalState, chat: ApiChat) {\n const userId = getPrivateChatUserId(chat);\n if (!userId) {\n return false;\n }\n\n return selectUser(global, userId);\n}\n\nexport function selectIsChatWithSelf(global: GlobalState, chatId: number) {\n return chatId === global.currentUserId;\n}\n\nexport function selectIsChatWithBot(global: GlobalState, chat: ApiChat) {\n const user = selectChatUser(global, chat);\n return user && isUserBot(user);\n}\n\nexport function selectSupportChat(global: GlobalState) {\n return Object.values(global.chats.byId).find(({ isSupport }: ApiChat) => isSupport);\n}\n\nexport function selectChatOnlineCount(global: GlobalState, chat: ApiChat) {\n if (isChatPrivate(chat.id) || isChatChannel(chat) || !chat.fullInfo) {\n return undefined;\n }\n\n if (!chat.fullInfo.members || chat.fullInfo.members.length === MEMBERS_LOAD_SLICE) {\n return chat.fullInfo.onlineCount;\n }\n\n return chat.fullInfo.members.reduce((onlineCount, { userId }) => {\n if (global.users.byId[userId] && isUserOnline(global.users.byId[userId]) && userId !== global.currentUserId) {\n return onlineCount + 1;\n }\n\n return onlineCount;\n }, 0);\n}\n\nexport function selectChatBot(global: GlobalState, chatId: number) {\n const chat = selectChat(global, chatId);\n const userId = chat && getPrivateChatUserId(chat);\n const user = userId && selectUser(global, userId);\n if (!user || !isUserBot(user)) {\n return undefined;\n }\n\n return user;\n}\n\nexport function selectIsChatBotNotStarted(global: GlobalState, chatId: number) {\n const chat = selectChat(global, chatId);\n const bot = selectChatBot(global, chatId);\n if (!chat || !bot) {\n return false;\n }\n\n if (chat.lastMessage && isHistoryClearMessage(chat.lastMessage)) {\n return true;\n }\n\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return false;\n }\n\n const { listedIds } = messageInfo.threadsById[MAIN_THREAD_ID] || {};\n return listedIds && !listedIds.length;\n}\n\nexport function selectAreActiveChatsLoaded(global: GlobalState): boolean {\n return Boolean(global.chats.listIds.active);\n}\n\nexport function selectIsChatListed(global: GlobalState, chatId: number, type?: 'active' | 'archived'): boolean {\n const { listIds } = global.chats;\n if (type) {\n const targetList = listIds[type];\n return Boolean(targetList && targetList.includes(chatId));\n }\n\n return Object.values(listIds).some((list) => list && list.includes(chatId));\n}\n\nexport function selectChatListType(global: GlobalState, chatId: number): 'active' | 'archived' | undefined {\n const chat = selectChat(global, chatId);\n if (!chat || !selectIsChatListed(global, chatId)) {\n return undefined;\n }\n\n return chat.folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n}\n\nexport function selectChatFolder(global: GlobalState, folderId: number) {\n return global.chatFolders.byId[folderId];\n}\n\nexport function selectTotalChatCount(global: GlobalState, listType: 'active' | 'archived'): number {\n const { totalCount } = global.chats;\n const allChatsCount = totalCount.all;\n const archivedChatsCount = totalCount.archived || 0;\n\n if (listType === 'archived') {\n return archivedChatsCount;\n }\n\n return allChatsCount ? allChatsCount - archivedChatsCount : 0;\n}\n\nexport function selectIsChatPinned(global: GlobalState, chatId: number, folderId = ALL_FOLDER_ID): boolean {\n const { active, archived } = global.chats.orderedPinnedIds;\n\n if (folderId === ALL_FOLDER_ID) {\n return !!active && active.includes(chatId);\n }\n\n if (folderId === ARCHIVED_FOLDER_ID) {\n return !!archived && archived.includes(chatId);\n }\n\n const { byId: chatFoldersById } = global.chatFolders;\n\n const { pinnedChatIds } = chatFoldersById[folderId] || {};\n return !!pinnedChatIds && pinnedChatIds.includes(chatId);\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectChatByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.chats.byId).find(\n (chat) => chat.username && chat.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectCountNotMutedUnread(global: GlobalState) {\n const activeChatIds = global.chats.listIds.active;\n if (!activeChatIds) {\n return 0;\n }\n\n const chats = global.chats.byId;\n\n return activeChatIds.reduce((acc, chatId) => {\n const chat = chats[chatId];\n\n if (\n chat\n && chat.unreadCount\n && !selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global))\n ) {\n return acc + chat.unreadCount;\n }\n\n return acc;\n }, 0);\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiSticker } from '../../api/types';\n\nexport function selectIsStickerFavorite(global: GlobalState, sticker: ApiSticker) {\n const { stickers } = global.stickers.favorite;\n return stickers && stickers.some(({ id }) => id === sticker.id);\n}\n\nexport function selectCurrentStickerSearch(global: GlobalState) {\n return global.stickers.search;\n}\n\nexport function selectCurrentGifSearch(global: GlobalState) {\n return global.gifs.search;\n}\n\nexport function selectStickerSet(global: GlobalState, id: string) {\n return global.stickers.setsById[id];\n}\n\nexport function selectStickersForEmoji(global: GlobalState, emoji: string) {\n const stickerSets = Object.values(global.stickers.setsById);\n let stickersForEmoji: ApiSticker[] = [];\n stickerSets.forEach(({ packs }) => {\n if (!packs) {\n return;\n }\n const stickers = packs[emoji];\n if (stickers) {\n stickersForEmoji = stickersForEmoji.concat(stickers);\n }\n });\n return stickersForEmoji;\n}\n\nexport function selectAnimatedEmoji(global: GlobalState, emoji: string) {\n const { animatedEmojis } = global;\n if (!animatedEmojis || !animatedEmojis.stickers) {\n return undefined;\n }\n\n // Some emojis (❤️ for example) with a service symbol 'VARIATION SELECTOR-16' are not recognized as animated\n const cleanedEmoji = emoji.replace('\\ufe0f', '');\n\n return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\n}\n","import { GlobalState, MessageListType, Thread } from '../../global/types';\nimport {\n ApiChat,\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { LOCAL_MESSAGE_ID_BASE } from '../../config';\nimport {\n selectChat, selectIsChatWithBot, selectIsChatWithSelf,\n} from './chats';\nimport { selectIsUserOrChatContact, selectUser } from './users';\nimport {\n getSendingState,\n isChatChannel,\n isMessageLocal,\n isChatPrivate,\n isForwardedMessage,\n getCanPostInChat,\n isUserRightBanned,\n getHasAdminRight,\n isChatBasicGroup,\n isCommonBoxChat,\n isServiceNotificationMessage,\n isOwnMessage,\n isActionMessage,\n isChatGroup,\n isChatSuperGroup,\n getMessageVideo,\n getMessageWebPageVideo,\n} from '../helpers';\nimport { findLast } from '../../util/iteratees';\nimport { selectIsStickerFavorite } from './symbols';\n\nconst MESSAGE_EDIT_ALLOWED_TIME_MS = 172800000; // 48 hours\n\nexport function selectCurrentMessageList(global: GlobalState) {\n const { messageLists } = global.messages;\n\n if (messageLists.length) {\n return messageLists[messageLists.length - 1];\n }\n\n return undefined;\n}\n\nexport function selectCurrentChat(global: GlobalState) {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n return chatId ? selectChat(global, chatId) : undefined;\n}\n\nexport function selectChatMessages(global: GlobalState, chatId: number) {\n const messages = global.messages.byChatId[chatId];\n\n return messages ? messages.byId : undefined;\n}\n\nexport function selectScheduledMessages(global: GlobalState, chatId: number) {\n const messages = global.scheduledMessages.byChatId[chatId];\n\n return messages ? messages.byId : undefined;\n}\n\nexport function selectThreadParam(\n global: GlobalState,\n chatId: number,\n threadId: number,\n key: K,\n) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const thread = messageInfo.threadsById[threadId];\n if (!thread) {\n return undefined;\n }\n\n return thread[key];\n}\n\nexport function selectListedIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'listedIds');\n}\n\nexport function selectOutlyingIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'outlyingIds');\n}\n\nexport function selectCurrentMessageIds(\n global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType,\n) {\n switch (messageListType) {\n case 'thread':\n return selectViewportIds(global, chatId, threadId);\n case 'pinned':\n return selectPinnedIds(global, chatId);\n case 'scheduled':\n return selectScheduledIds(global, chatId);\n }\n\n return undefined;\n}\n\nexport function selectViewportIds(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'viewportIds');\n}\n\nexport function selectPinnedIds(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds');\n}\n\nexport function selectScheduledIds(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds');\n}\n\nexport function selectScrollOffset(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'scrollOffset');\n}\n\nexport function selectReplyingToId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyingToId');\n}\n\nexport function selectEditingId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'editingId');\n}\n\nexport function selectEditingScheduledId(global: GlobalState, chatId: number) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'editingScheduledId');\n}\n\nexport function selectDraft(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'draft');\n}\n\nexport function selectNoWebPage(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'noWebPage');\n}\n\nexport function selectThreadInfo(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'threadInfo');\n}\n\nexport function selectFirstMessageId(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'firstMessageId');\n}\n\nexport function selectReplyStack(global: GlobalState, chatId: number, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyStack');\n}\n\nexport function selectThreadOriginChat(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return selectChat(global, chatId);\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return selectChat(global, threadInfo.originChannelId || chatId);\n}\n\nexport function selectThreadTopMessageId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return undefined;\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return threadInfo.topMessageId;\n}\n\nexport function selectThreadByMessage(global: GlobalState, chatId: number, message: ApiMessage) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const { replyToMessageId, replyToTopMessageId } = message;\n if (!replyToMessageId && !replyToTopMessageId) {\n return undefined;\n }\n\n return Object.values(messageInfo.threadsById).find((thread) => {\n return thread.threadInfo && (\n (replyToMessageId && replyToMessageId === thread.threadInfo.topMessageId)\n || (replyToTopMessageId && replyToTopMessageId === thread.threadInfo.topMessageId)\n );\n });\n}\n\nexport function isMessageInCurrentMessageList(global: GlobalState, chatId: number, message: ApiMessage) {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return false;\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n return (\n chatId === currentMessageList.chatId\n && (\n (currentMessageList.threadId === MAIN_THREAD_ID)\n || (threadInfo && currentMessageList.threadId === threadInfo.threadId)\n )\n );\n}\n\nexport function selectIsViewportNewest(global: GlobalState, chatId: number, threadId: number) {\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!viewportIds || !viewportIds.length) {\n return true;\n }\n\n let lastMessageId: number;\n\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.lastMessage) {\n return true;\n }\n\n lastMessageId = chat.lastMessage.id;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo || !threadInfo.lastMessageId) {\n return undefined;\n }\n\n lastMessageId = threadInfo.lastMessageId;\n }\n\n // Edge case: outgoing `lastMessage` is updated with a delay to optimize animation\n if (lastMessageId >= LOCAL_MESSAGE_ID_BASE && !selectChatMessage(global, chatId, lastMessageId)) {\n return true;\n }\n\n return viewportIds[viewportIds.length - 1] >= lastMessageId;\n}\n\nexport function selectChatMessage(global: GlobalState, chatId: number, messageId: number) {\n const chatMessages = selectChatMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectScheduledMessage(global: GlobalState, chatId: number, messageId: number) {\n const chatMessages = selectScheduledMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectEditingMessage(\n global: GlobalState, chatId: number, threadId: number, messageListType: MessageListType,\n) {\n if (messageListType === 'scheduled') {\n const messageId = selectEditingScheduledId(global, chatId);\n return messageId ? selectScheduledMessage(global, chatId, messageId) : undefined;\n } else {\n const messageId = selectEditingId(global, chatId, threadId);\n return messageId ? selectChatMessage(global, chatId, messageId) : undefined;\n }\n}\n\nexport function selectChatMessageByPollId(global: GlobalState, pollId: string) {\n let messageWithPoll: ApiMessage | undefined;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const chatMessages of Object.values(global.messages.byChatId)) {\n const { byId } = chatMessages;\n messageWithPoll = Object.values(byId).find((message) => {\n return message.content.poll && message.content.poll.id === pollId;\n });\n if (messageWithPoll) {\n break;\n }\n }\n\n return messageWithPoll;\n}\n\nexport function selectFocusedMessageId(global: GlobalState, chatId: number) {\n const { chatId: focusedChatId, messageId } = global.focusedMessage || {};\n\n return focusedChatId === chatId ? messageId : undefined;\n}\n\nexport function selectIsMessageFocused(global: GlobalState, message: ApiMessage) {\n const focusedId = selectFocusedMessageId(global, message.chatId);\n\n return focusedId ? focusedId === message.id || focusedId === message.previousLocalId : false;\n}\n\nexport function selectIsMessageUnread(global: GlobalState, message: ApiMessage) {\n const { lastReadOutboxMessageId } = selectChat(global, message.chatId) || {};\n return isMessageLocal(message) || !lastReadOutboxMessageId || lastReadOutboxMessageId < message.id;\n}\n\nexport function selectOutgoingStatus(\n global: GlobalState, message: ApiMessage, isScheduledList = false,\n): ApiMessageOutgoingStatus {\n if (!selectIsMessageUnread(global, message) && !isScheduledList) {\n return 'read';\n }\n\n return getSendingState(message);\n}\n\nexport function selectSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n return senderId > 0 ? selectUser(global, senderId) : selectChat(global, senderId);\n}\n\nexport function selectForwardedSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { forwardInfo } = message;\n if (!forwardInfo) {\n return undefined;\n }\n\n if (forwardInfo.isChannelPost && forwardInfo.fromChatId) {\n return selectChat(global, forwardInfo.fromChatId);\n } else if (forwardInfo.senderUserId) {\n return selectUser(global, forwardInfo.senderUserId);\n }\n\n return undefined;\n}\n\nexport function selectAllowedMessageActions(global: GlobalState, message: ApiMessage, threadId: number) {\n const { serverTimeOffset } = global;\n const chat = selectChat(global, message.chatId);\n if (!chat || chat.isRestricted) {\n return {};\n }\n\n const isPrivate = isChatPrivate(chat.id);\n const isChatWithSelf = selectIsChatWithSelf(global, message.chatId);\n const isBasicGroup = isChatBasicGroup(chat);\n const isSuperGroup = isChatSuperGroup(chat);\n const isChannel = isChatChannel(chat);\n const isServiceNotification = isServiceNotificationMessage(message);\n\n const isOwn = isOwnMessage(message);\n const isAction = isActionMessage(message);\n const { content } = message;\n const canEditMessagesIndefinitely = isChatWithSelf\n || (isSuperGroup && getHasAdminRight(chat, 'pinMessages'))\n || (isChannel && getHasAdminRight(chat, 'editMessages'));\n const isMessageEditable = (\n (canEditMessagesIndefinitely\n || Date.now() + serverTimeOffset * 1000 - message.date * 1000 < MESSAGE_EDIT_ALLOWED_TIME_MS)\n && !(\n content.sticker || content.contact || content.poll || content.action || content.audio\n || (content.video && content.video.isRound)\n )\n && !isForwardedMessage(message)\n && !message.viaBotId\n );\n\n const canReply = getCanPostInChat(chat, threadId) && !isServiceNotification;\n\n const hasPinPermission = isPrivate || (\n chat.isCreator\n || (!isChannel && !isUserRightBanned(chat, 'pinMessages'))\n || getHasAdminRight(chat, 'pinMessages')\n );\n\n let canPin = !isAction && hasPinPermission;\n let canUnpin = false;\n\n const pinnedMessageIds = selectPinnedIds(global, chat.id);\n\n if (canPin) {\n canUnpin = Boolean(pinnedMessageIds && pinnedMessageIds.includes(message.id));\n canPin = !canUnpin;\n }\n\n const canDelete = isPrivate\n || isOwn\n || isBasicGroup\n || chat.isCreator\n || getHasAdminRight(chat, 'deleteMessages');\n\n const canReport = !isPrivate && !isOwn;\n\n const canDeleteForAll = canDelete && !isServiceNotification && (\n (isPrivate && !isChatWithSelf)\n || (isBasicGroup && (\n isOwn || getHasAdminRight(chat, 'deleteMessages') || chat.isCreator\n ))\n );\n\n const canEdit = !isAction && isMessageEditable && (\n isOwn\n || (isChannel && (chat.isCreator || getHasAdminRight(chat, 'editMessages')))\n );\n\n const canForward = !isAction && !isServiceNotification;\n\n const hasSticker = Boolean(message.content.sticker);\n const hasFavoriteSticker = hasSticker && selectIsStickerFavorite(global, message.content.sticker!);\n const canFaveSticker = !isAction && hasSticker && !hasFavoriteSticker;\n const canUnfaveSticker = !isAction && hasFavoriteSticker;\n const canCopy = !isAction;\n const canCopyLink = !isAction && (isChannel || isSuperGroup);\n const canSelect = !isAction;\n const noOptions = [\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n ].every((ability) => !ability);\n\n return {\n noOptions,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n };\n}\n\n// This selector always returns a new object which can not be safely used in shallow-equal checks\nexport function selectCanDeleteSelectedMessages(global: GlobalState) {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chatMessages = chatId && selectChatMessages(global, chatId);\n if (!chatMessages || !selectedMessageIds || !threadId) {\n return {};\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return {\n canDelete: messageActions.every((actions) => actions.canDelete),\n canDeleteForAll: messageActions.every((actions) => actions.canDeleteForAll),\n };\n}\n\nexport function selectCanReportSelectedMessages(global: GlobalState) {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chatMessages = chatId && selectChatMessages(global, chatId);\n if (!chatMessages || !selectedMessageIds || !threadId) {\n return false;\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return messageActions.every((actions) => actions.canReport);\n}\n\nexport function selectUploadProgress(global: GlobalState, message: ApiMessage) {\n const fileTransfer = global.fileUploads.byMessageLocalId[message.previousLocalId || message.id];\n\n return fileTransfer ? fileTransfer.progress : undefined;\n}\n\nexport function selectRealLastReadId(global: GlobalState, chatId: number, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n // `lastReadInboxMessageId` is empty for new chats\n if (!chat.lastReadInboxMessageId) {\n return undefined;\n }\n\n if (!chat.lastMessage) {\n return chat.lastReadInboxMessageId;\n }\n\n if (isMessageLocal(chat.lastMessage)) {\n return chat.lastMessage.id;\n }\n\n // Some previously read messages may be deleted\n return Math.min(chat.lastMessage.id, chat.lastReadInboxMessageId);\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n if (!threadInfo.lastReadInboxMessageId) {\n return threadInfo.topMessageId;\n }\n\n // Some previously read messages may be deleted\n return Math.min(threadInfo.lastReadInboxMessageId, threadInfo.lastMessageId || Infinity);\n }\n}\n\nexport function selectFirstUnreadId(global: GlobalState, chatId: number, threadId: number) {\n const chat = selectChat(global, chatId);\n\n if (threadId === MAIN_THREAD_ID) {\n if (!chat) {\n return undefined;\n }\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo || threadInfo.lastMessageId === threadInfo.lastReadInboxMessageId) {\n return undefined;\n }\n }\n\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const listedIds = selectListedIds(global, chatId, threadId);\n const byId = selectChatMessages(global, chatId);\n if (!byId || !(outlyingIds || listedIds)) {\n return undefined;\n }\n\n const lastReadId = selectRealLastReadId(global, chatId, threadId);\n if (!lastReadId && chat && chat.isNotJoined) {\n return undefined;\n }\n\n if (outlyingIds) {\n const found = !lastReadId ? outlyingIds[0] : outlyingIds.find((id) => {\n return id > lastReadId && byId[id] && (!byId[id].isOutgoing || byId[id].isFromScheduled);\n });\n if (found) {\n return found;\n }\n }\n\n if (listedIds) {\n const found = !lastReadId ? listedIds[0] : listedIds.find((id) => {\n return id > lastReadId && byId[id] && (!byId[id].isOutgoing || byId[id].isFromScheduled);\n });\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nexport function selectIsPollResultsOpen(global: GlobalState) {\n const { pollResults } = global;\n return Boolean(pollResults.messageId);\n}\n\nexport function selectIsForwardModalOpen(global: GlobalState) {\n const { forwardMessages } = global;\n return Boolean(forwardMessages.isModalShown);\n}\n\nexport function selectCommonBoxChatId(global: GlobalState, messageId: number) {\n const fromLastMessage = Object.values(global.chats.byId).find((chat) => (\n isCommonBoxChat(chat) && chat.lastMessage && chat.lastMessage.id === messageId\n ));\n if (fromLastMessage) {\n return fromLastMessage.id;\n }\n\n const { byChatId } = global.messages;\n return Number(Object.keys(byChatId).find((chatId) => {\n const chat = selectChat(global, Number(chatId));\n return chat && isCommonBoxChat(chat) && byChatId[chat.id].byId[messageId];\n }));\n}\n\nexport function selectIsInSelectMode(global: GlobalState) {\n const { selectedMessages } = global;\n\n return Boolean(selectedMessages);\n}\n\nexport function selectIsMessageSelected(global: GlobalState, messageId: number) {\n const { messageIds } = global.selectedMessages || {};\n if (!messageIds) {\n return false;\n }\n\n return messageIds.includes(messageId);\n}\n\nexport function selectForwardedMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.values(chatMessages)\n .filter((message) => message.groupedId === groupedId && message.forwardInfo)\n .map(({ forwardInfo }) => forwardInfo!.fromMessageId);\n}\n\nexport function selectMessageIdsByGroupId(global: GlobalState, chatId: number, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.keys(chatMessages)\n .map(Number)\n .filter((id) => chatMessages[id].groupedId === groupedId);\n}\n\nexport function selectIsDocumentGroupSelected(global: GlobalState, chatId: number, groupedId: string) {\n const { messageIds: selectedIds } = global.selectedMessages || {};\n if (!selectedIds) {\n return false;\n }\n\n const groupIds = selectMessageIdsByGroupId(global, chatId, groupedId);\n return groupIds && groupIds.every((id) => selectedIds.includes(id));\n}\n\nexport function selectSelectedMessagesCount(global: GlobalState) {\n const { messageIds } = global.selectedMessages || {};\n\n return messageIds ? messageIds.length : 0;\n}\n\nexport function selectNewestMessageWithBotKeyboardButtons(\n global: GlobalState, chatId: number,\n): ApiMessage | undefined {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (!selectIsChatWithBot(global, chat)) {\n return undefined;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, MAIN_THREAD_ID);\n if (!chatMessages || !viewportIds) {\n return undefined;\n }\n\n const messageId = findLast(viewportIds, (id) => {\n return !chatMessages[id].isOutgoing && Boolean(chatMessages[id].keyboardButtons);\n });\n\n const replyHideMessageId = findLast(viewportIds, (id) => {\n return Boolean(chatMessages[id].shouldHideKeyboardButtons);\n });\n\n if (messageId && replyHideMessageId && replyHideMessageId > messageId) {\n return undefined;\n }\n\n return messageId ? chatMessages[messageId] : undefined;\n}\n\nexport function selectShouldAutoLoadMedia(\n global: GlobalState, message: ApiMessage, chat: ApiChat, sender?: ApiChat | ApiUser,\n) {\n const {\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n } = global.settings.byKey;\n\n return Boolean(\n (shouldAutoDownloadMediaInPrivateChats && isChatPrivate(chat.id))\n || (shouldAutoDownloadMediaInGroups && isChatGroup(chat))\n || (shouldAutoDownloadMediaInChannels && isChatChannel(chat))\n || (shouldAutoDownloadMediaFromContacts && sender && (\n sender.id === global.currentUserId\n || selectIsUserOrChatContact(global, sender)\n )),\n );\n}\n\nexport function selectShouldAutoPlayMedia(global: GlobalState, message: ApiMessage) {\n const video = getMessageVideo(message) || getMessageWebPageVideo(message);\n if (!video) {\n return undefined;\n }\n\n const {\n shouldAutoPlayVideos,\n shouldAutoPlayGifs,\n } = global.settings.byKey;\n\n const asGif = video.isGif || video.isRound;\n\n return (shouldAutoPlayVideos && !asGif) || (shouldAutoPlayGifs && asGif);\n}\n\nexport function selectShouldLoopStickers(global: GlobalState) {\n return global.settings.byKey.shouldLoopStickers;\n}\n","import { GlobalState } from '../../global/types';\nimport { selectCurrentMessageList } from './messages';\nimport { buildChatThreadKey } from '../helpers';\n\nexport function selectCurrentTextSearch(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const currentSearch = global.localTextSearch.byChatThreadKey[chatThreadKey];\n if (!currentSearch || !currentSearch.isActive) {\n return undefined;\n }\n\n return currentSearch;\n}\n\nexport function selectCurrentMediaSearchPeerId(global: GlobalState) {\n const { byChatId } = global.localMediaSearch;\n const { chatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = global.users.selectedId;\n\n return currentProfileUserId && byChatId[currentProfileUserId] ? currentProfileUserId : chatId;\n}\n\nexport function selectCurrentMediaSearch(global: GlobalState) {\n const peerId = selectCurrentMediaSearchPeerId(global);\n if (!peerId) {\n return undefined;\n }\n\n return global.localMediaSearch.byChatId[peerId];\n}\n","import { GlobalState } from '../../global/types';\n\nimport { selectCurrentMessageList } from './messages';\nimport { selectChat } from './chats';\nimport { isChatGroup, isChatPrivate } from '../helpers';\n\nexport function selectManagement(global: GlobalState, chatId: number) {\n return global.management.byChatId[chatId];\n}\n\nexport function selectCurrentManagement(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const currentManagement = global.management.byChatId[chatId];\n if (!currentManagement || !currentManagement.isActive) {\n return undefined;\n }\n\n return currentManagement;\n}\n\nexport function selectCurrentManagementType(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n if (isChatPrivate(chatId)) {\n return 'user';\n }\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (isChatGroup(chat)) {\n return 'group';\n }\n\n return 'channel';\n}\n","import { GlobalState } from '../../global/types';\nimport { NewChatMembersProgress, RightColumnContent } from '../../types';\n\nimport { getSystemTheme, IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { selectCurrentMessageList, selectIsPollResultsOpen } from './messages';\nimport { selectCurrentTextSearch } from './localSearch';\nimport { selectCurrentStickerSearch, selectCurrentGifSearch } from './symbols';\nimport { selectAreActiveChatsLoaded } from './chats';\nimport { selectCurrentManagement } from './management';\n\nexport function selectIsMediaViewerOpen(global: GlobalState) {\n const { mediaViewer } = global;\n return Boolean(mediaViewer.messageId || mediaViewer.avatarOwnerId);\n}\n\nexport function selectRightColumnContentKey(global: GlobalState) {\n const {\n users,\n isChatInfoShown,\n newChatMembersProgress,\n } = global;\n\n const isAddingChatMembersShown = newChatMembersProgress !== NewChatMembersProgress.Closed;\n const isPollResults = selectIsPollResultsOpen(global);\n const isSearch = Boolean(!IS_SINGLE_COLUMN_LAYOUT && selectCurrentTextSearch(global));\n const isManagement = selectCurrentManagement(global);\n const stickerSearch = selectCurrentStickerSearch(global);\n const isStickerSearch = stickerSearch.query !== undefined;\n const gifSearch = selectCurrentGifSearch(global);\n const isGifSearch = gifSearch.query !== undefined;\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = users.selectedId;\n const areActiveChatsLoaded = selectAreActiveChatsLoaded(global);\n const isUserInfo = Boolean(currentProfileUserId && areActiveChatsLoaded);\n const isChatShown = Boolean(currentChatId && areActiveChatsLoaded);\n const isChatInfo = isChatShown && isChatInfoShown;\n\n return isPollResults ? (\n RightColumnContent.PollResults\n ) : isSearch ? (\n RightColumnContent.Search\n ) : isManagement ? (\n RightColumnContent.Management\n ) : isStickerSearch ? (\n RightColumnContent.StickerSearch\n ) : isGifSearch ? (\n RightColumnContent.GifSearch\n ) : isAddingChatMembersShown ? (\n RightColumnContent.AddingMembers\n ) : isUserInfo ? (\n RightColumnContent.UserInfo\n ) : isChatInfo ? (\n RightColumnContent.ChatInfo\n ) : undefined;\n}\n\nexport function selectIsRightColumnShown(global: GlobalState) {\n return selectRightColumnContentKey(global) !== undefined;\n}\n\nexport function selectTheme(global: GlobalState) {\n const { theme, shouldUseSystemTheme } = global.settings.byKey;\n\n return shouldUseSystemTheme ? getSystemTheme() : theme;\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectCurrentGlobalSearchQuery(global: GlobalState) {\n return global.globalSearch.query;\n}\n","\nimport { GlobalState } from '../../global/types';\n\nexport function selectPaymentMessageId(global: GlobalState) {\n return global.payment.messageId;\n}\n\nexport function selectPaymentRequestId(global: GlobalState) {\n return global.payment.formId;\n}\n\nexport function selectProviderPublishableKey(global: GlobalState) {\n return global.payment.nativeParams ? global.payment.nativeParams.publishableKey : undefined;\n}\n\nexport function selectStripeCredentials(global: GlobalState) {\n return global.payment.stripeCredentials;\n}\n","export * from './users';\nexport * from './chats';\nexport * from './messages';\nexport * from './updates';\nexport * from './media';\nexport * from './payments';\nexport * from './settings';\nexport * from './bots';\nexport * from './misc';\n","type Parts = (string | false | undefined)[];\n\nexport default (...parts: Parts) => {\n return parts.filter(Boolean).join(' ');\n};\n","type Scheduler =\n typeof requestAnimationFrame\n | typeof onTickEnd\n | typeof runNow;\n\nexport function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true,\n) {\n let waitingTimeout: number | undefined;\n\n return (...args: Parameters) => {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = undefined;\n } else if (shouldRunFirst) {\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\n // @ts-ignore\n fn(...args);\n }\n\n waitingTimeout = undefined;\n }, ms);\n };\n}\n\nexport function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n) {\n let interval: number | undefined;\n let isPending: boolean;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n interval = self.setInterval(() => {\n if (!isPending) {\n // eslint-disable-next-line no-restricted-globals\n self.clearInterval(interval!);\n interval = undefined;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n\nexport function throttleWithPrimaryRaf(fn: F) {\n return throttleWith(fastPrimaryRaf, fn);\n}\n\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function throttleWith(schedulerFn: Scheduler, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nexport function onIdle(cb: NoneToVoidFunction) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb);\n } else {\n onTickEnd(cb);\n }\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n}\n\nexport const pause = (ms: number) => new Promise((resolve) => {\n setTimeout(() => resolve(), ms);\n});\n\nexport function rafPromise() {\n return new Promise((resolve) => {\n fastRaf(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nlet fastRafPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\n// May result in an immediate execution if called from another `requestAnimationFrame` callback\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = isPrimary ? [] : [callback];\n fastRafPrimaryCallbacks = isPrimary ? [callback] : [];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n const currentPrimaryCallbacks = fastRafPrimaryCallbacks!;\n fastRafCallbacks = undefined;\n fastRafPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafPrimaryCallbacks!.push(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastPrimaryRaf(callback: NoneToVoidFunction) {\n fastRaf(callback, true);\n}\n\nlet beforeUnloadCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onBeforeUnload(callback: NoneToVoidFunction, isLast = false) {\n if (!beforeUnloadCallbacks) {\n beforeUnloadCallbacks = [];\n // eslint-disable-next-line no-restricted-globals\n self.addEventListener('beforeunload', () => {\n beforeUnloadCallbacks!.forEach((cb) => cb());\n });\n }\n\n if (isLast) {\n beforeUnloadCallbacks.push(callback);\n } else {\n beforeUnloadCallbacks.unshift(callback);\n }\n\n return () => {\n beforeUnloadCallbacks = beforeUnloadCallbacks!.filter((cb) => cb !== callback);\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiPhoto } from '../../api/types';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { omit } from '../../util/iteratees';\n\nexport function replaceChatListIds(\n global: GlobalState,\n type: 'active' | 'archived',\n newIds: number[] | undefined,\n): GlobalState {\n return {\n ...global,\n chats: {\n ...global.chats,\n listIds: {\n ...global.chats.listIds,\n [type]: newIds,\n },\n },\n };\n}\n\nexport function updateChatListIds(global: GlobalState, type: 'active' | 'archived', idsUpdate: number[]): GlobalState {\n const { [type]: listIds } = global.chats.listIds;\n const newIds = listIds && listIds.length\n ? idsUpdate.filter((id) => !listIds.includes(id))\n : idsUpdate;\n\n if (listIds && !newIds.length) {\n return global;\n }\n\n return replaceChatListIds(global, type, [\n ...(listIds || []),\n ...newIds,\n ]);\n}\n\nexport function replaceChats(global: GlobalState, newById: Record): GlobalState {\n return {\n ...global,\n chats: {\n ...global.chats,\n byId: newById,\n },\n };\n}\n\n// @optimization Don't spread/unspread global for each element, do it in a batch\nfunction getUpdatedChat(\n global: GlobalState, chatId: number, chatUpdate: Partial, photo?: ApiPhoto,\n): ApiChat {\n const { byId } = global.chats;\n const chat = byId[chatId];\n const shouldOmitMinInfo = chatUpdate.isMin && chat && !chat.isMin;\n const updatedChat = {\n ...chat,\n ...(shouldOmitMinInfo ? omit(chatUpdate, ['isMin', 'accessHash']) : chatUpdate),\n ...(photo && { photos: [photo, ...(chat.photos || [])] }),\n };\n\n if (!updatedChat.id || !updatedChat.type) {\n return updatedChat;\n }\n\n return updatedChat;\n}\n\nexport function updateChat(\n global: GlobalState, chatId: number, chatUpdate: Partial, photo?: ApiPhoto,\n): GlobalState {\n const { byId } = global.chats;\n\n const updatedChat = getUpdatedChat(global, chatId, chatUpdate, photo);\n\n return replaceChats(global, {\n ...byId,\n [chatId]: updatedChat,\n });\n}\n\nexport function updateChats(global: GlobalState, updatedById: Record): GlobalState {\n const updatedChats = Object.keys(updatedById).map(Number).reduce>((acc, id) => {\n const updatedChat = getUpdatedChat(global, id, updatedById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n }\n return acc;\n }, {});\n\n global = replaceChats(global, {\n ...global.chats.byId,\n ...updatedChats,\n });\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addChats(global: GlobalState, addedById: Record): GlobalState {\n const { byId } = global.chats;\n let isAdded = false;\n\n const addedChats = Object.keys(addedById).map(Number).reduce>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n const updatedChat = getUpdatedChat(global, id, addedById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n\n if (!isAdded) {\n isAdded = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (isAdded) {\n global = replaceChats(global, {\n ...global.chats.byId,\n ...addedChats,\n });\n }\n\n return global;\n}\n\nexport function updateChatListType(\n global: GlobalState,\n chatId: number,\n folderId?: number,\n): GlobalState {\n const listType = folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n\n let currentListIds = global.chats.listIds;\n (Object.keys(currentListIds) as Array).forEach((listTypeKey) => {\n const currentFolderList = currentListIds[listTypeKey] || [];\n if (listTypeKey === listType && !currentFolderList.includes(chatId)) {\n currentListIds = {\n ...currentListIds,\n [listTypeKey]: [...currentFolderList, chatId],\n };\n } else if (listTypeKey !== listType && currentFolderList.includes(chatId)) {\n currentListIds = {\n ...currentListIds,\n [listTypeKey]: currentFolderList.filter((id) => id !== chatId),\n };\n }\n });\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n listIds: currentListIds,\n },\n };\n\n global = updateChat(global, chatId, { folderId: folderId || undefined });\n\n return global;\n}\n\nexport function updateChatListSecondaryInfo(\n global: GlobalState,\n type: 'active' | 'archived',\n info: {\n orderedPinnedIds?: number[];\n totalChatCount: number;\n },\n): GlobalState {\n const totalCountKey = type === 'active' ? 'all' : 'archived';\n\n return {\n ...global,\n chats: {\n ...global.chats,\n ...(info.orderedPinnedIds && {\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [type]: info.orderedPinnedIds,\n },\n }),\n totalCount: {\n ...global.chats.totalCount,\n [totalCountKey]: info.totalChatCount,\n },\n isFullyLoaded: {\n ...global.chats.isFullyLoaded,\n [type]: false,\n },\n },\n };\n}\n","import {\n GlobalState, MessageList, MessageListType, Thread,\n} from '../../global/types';\nimport { ApiMessage, ApiThreadInfo, MAIN_THREAD_ID } from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport { IS_TEST, MESSAGE_LIST_SLICE, MESSAGE_LIST_VIEWPORT_LIMIT } from '../../config';\nimport {\n selectListedIds,\n selectChatMessages,\n selectViewportIds,\n selectOutlyingIds,\n selectPinnedIds,\n selectThreadInfo,\n selectMessageIdsByGroupId,\n selectScheduledMessages,\n selectScheduledIds,\n selectCurrentMessageIds,\n selectChatMessage,\n selectCurrentMessageList,\n} from '../selectors';\nimport {\n areSortedArraysEqual, omit, pickTruthy, unique,\n} from '../../util/iteratees';\n\nconst TMP_CHAT_ID = -1;\n\ntype MessageStoreSections = {\n byId: Record;\n threadsById: Record;\n};\n\nexport function updateCurrentMessageList(\n global: GlobalState,\n chatId: number | undefined,\n threadId: number = MAIN_THREAD_ID,\n type: MessageListType = 'thread',\n shouldReplaceHistory?: boolean,\n): GlobalState {\n const { messageLists } = global.messages;\n let newMessageLists: MessageList[] = messageLists;\n if (shouldReplaceHistory || IS_TEST) {\n newMessageLists = chatId ? [{ chatId, threadId, type }] : [];\n } else if (chatId) {\n const last = messageLists[messageLists.length - 1];\n if (!last || last.chatId !== chatId || last.threadId !== threadId || last.type !== type) {\n if (last && last.chatId === TMP_CHAT_ID) {\n newMessageLists = [...messageLists.slice(0, -1), { chatId, threadId, type }];\n } else {\n newMessageLists = [...messageLists, { chatId, threadId, type }];\n }\n }\n } else {\n newMessageLists = messageLists.slice(0, -1);\n }\n\n return {\n ...global,\n messages: {\n ...global.messages,\n messageLists: newMessageLists,\n },\n };\n}\n\nfunction replaceChatMessages(global: GlobalState, chatId: number, newById: Record): GlobalState {\n return updateMessageStore(global, chatId, {\n byId: newById,\n });\n}\n\nfunction updateThread(\n global: GlobalState, chatId: number, threadId: number, threadUpdate: Partial,\n): GlobalState {\n const current = global.messages.byChatId[chatId];\n\n return updateMessageStore(global, chatId, {\n threadsById: {\n ...(current && current.threadsById),\n [threadId]: {\n ...(current && current.threadsById[threadId]),\n ...threadUpdate,\n },\n },\n });\n}\n\nfunction updateMessageStore(\n global: GlobalState, chatId: number, update: Partial,\n): GlobalState {\n const current = global.messages.byChatId[chatId] || { byId: {}, threadsById: {} };\n\n return {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n ...global.messages.byChatId,\n [chatId]: {\n ...current,\n ...update,\n },\n },\n },\n };\n}\n\nexport function replaceThreadParam(\n global: GlobalState, chatId: number, threadId: number, paramName: T, newValue: Thread[T] | undefined,\n) {\n return updateThread(global, chatId, threadId, { [paramName]: newValue });\n}\n\nexport function addMessages(\n global: GlobalState, messages: ApiMessage[],\n): GlobalState {\n const addedByChatId = messages.reduce((messagesByChatId, message: ApiMessage) => {\n if (!messagesByChatId[message.chatId]) {\n messagesByChatId[message.chatId] = {};\n }\n messagesByChatId[message.chatId][message.id] = message;\n\n return messagesByChatId;\n }, {} as Record>);\n\n Object.keys(addedByChatId).map(Number).forEach((chatId) => {\n global = addChatMessagesById(global, chatId, addedByChatId[chatId]);\n });\n\n return global;\n}\n\nexport function addChatMessagesById(\n global: GlobalState, chatId: number, newById: Record,\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n\n if (byId && Object.keys(newById).every((newId) => Boolean(byId[Number(newId)]))) {\n return global;\n }\n\n return replaceChatMessages(global, chatId, {\n ...newById,\n ...byId,\n });\n}\n\nexport function updateChatMessage(\n global: GlobalState, chatId: number, messageId: number, messageUpdate: Partial,\n): GlobalState {\n const byId = selectChatMessages(global, chatId) || {};\n const message = byId[messageId];\n const updatedMessage = {\n ...message,\n ...messageUpdate,\n };\n\n if (!updatedMessage.id) {\n return global;\n }\n\n return replaceChatMessages(global, chatId, {\n ...byId,\n [messageId]: updatedMessage,\n });\n}\n\nexport function updateScheduledMessage(\n global: GlobalState, chatId: number, messageId: number, messageUpdate: Partial,\n): GlobalState {\n const byId = selectScheduledMessages(global, chatId) || {};\n const message = byId[messageId];\n const updatedMessage = {\n ...message,\n ...messageUpdate,\n };\n\n if (!updatedMessage.id) {\n return global;\n }\n\n return replaceScheduledMessages(global, chatId, {\n ...byId,\n [messageId]: updatedMessage,\n }, undefined);\n}\n\nexport function deleteChatMessages(\n global: GlobalState,\n chatId: number,\n messageIds: number[],\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n if (!byId) {\n return global;\n }\n const newById = omit(byId, messageIds);\n const deletedForwardedPosts = Object.values(pickTruthy(byId, messageIds)).filter(\n ({ forwardInfo }) => forwardInfo && forwardInfo.isLinkedChannelPost,\n );\n\n const threadIds = Object.keys(global.messages.byChatId[chatId].threadsById).map(Number);\n threadIds.forEach((threadId) => {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n let listedIds = selectListedIds(global, chatId, threadId);\n let outlyingIds = selectOutlyingIds(global, chatId, threadId);\n let viewportIds = selectViewportIds(global, chatId, threadId);\n let pinnedIds = selectPinnedIds(global, chatId);\n let newMessageCount = threadInfo ? threadInfo.messagesCount : undefined;\n\n messageIds.forEach((messageId) => {\n if (listedIds && listedIds.includes(messageId)) {\n listedIds = listedIds.filter((id) => id !== messageId);\n if (newMessageCount !== undefined) newMessageCount -= 1;\n }\n\n if (outlyingIds && outlyingIds.includes(messageId)) {\n outlyingIds = outlyingIds.filter((id) => id !== messageId);\n }\n\n if (viewportIds && viewportIds.includes(messageId)) {\n viewportIds = viewportIds.filter((id) => id !== messageId);\n }\n\n if (pinnedIds && pinnedIds.includes(messageId)) {\n pinnedIds = pinnedIds.filter((id) => id !== messageId);\n }\n });\n\n\n global = replaceThreadParam(global, chatId, threadId, 'listedIds', listedIds);\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', outlyingIds);\n global = replaceThreadParam(global, chatId, threadId, 'viewportIds', viewportIds);\n global = replaceThreadParam(global, chatId, threadId, 'pinnedIds', pinnedIds);\n\n if (threadInfo && newMessageCount !== undefined) {\n global = replaceThreadParam(global, chatId, threadId, 'threadInfo', {\n ...threadInfo,\n messagesCount: newMessageCount,\n });\n }\n });\n\n if (deletedForwardedPosts.length) {\n const currentMessageList = selectCurrentMessageList(global);\n const canDeleteCurrentThread = currentMessageList && currentMessageList.chatId === chatId\n && currentMessageList.type === 'thread';\n const currentThreadId = currentMessageList && currentMessageList.threadId;\n\n deletedForwardedPosts.forEach((message) => {\n const { fromChatId, fromMessageId } = message.forwardInfo!;\n const originalPost = selectChatMessage(global, fromChatId!, fromMessageId!);\n\n if (canDeleteCurrentThread && currentThreadId === fromMessageId) {\n global = updateCurrentMessageList(global, chatId);\n }\n if (originalPost) {\n global = updateChatMessage(global, fromChatId!, fromMessageId!, { threadInfo: undefined });\n }\n });\n }\n\n global = replaceChatMessages(global, chatId, newById);\n\n return global;\n}\n\nexport function deleteChatScheduledMessages(\n global: GlobalState,\n chatId: number,\n messageIds: number[],\n): GlobalState {\n const byId = selectScheduledMessages(global, chatId);\n if (!byId) {\n return global;\n }\n const newById = omit(byId, messageIds);\n\n let scheduledIds = selectScheduledIds(global, chatId);\n if (scheduledIds) {\n messageIds.forEach((messageId) => {\n if (scheduledIds!.includes(messageId)) {\n scheduledIds = scheduledIds!.filter((id) => id !== messageId);\n }\n });\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', scheduledIds);\n }\n\n global = replaceScheduledMessages(global, chatId, newById, undefined);\n\n return global;\n}\n\nexport function updateListedIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const listedIds = selectListedIds(global, chatId, threadId);\n const newIds = listedIds && listedIds.length\n ? idsUpdate.filter((id) => !listedIds.includes(id))\n : idsUpdate;\n\n if (listedIds && !newIds.length) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'listedIds', orderHistoryIds([\n ...(listedIds || []),\n ...newIds,\n ]));\n}\n\nexport function updateOutlyingIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const newIds = outlyingIds && outlyingIds.length\n ? idsUpdate.filter((id) => !outlyingIds.includes(id))\n : idsUpdate;\n\n if (outlyingIds && !newIds.length) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'outlyingIds', orderHistoryIds([\n ...(outlyingIds || []),\n ...newIds,\n ]));\n}\n\nfunction orderHistoryIds(listedIds: number[]) {\n return listedIds.sort((a, b) => a - b);\n}\n\nexport function addViewportId(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newId: number,\n): GlobalState {\n const viewportIds = selectViewportIds(global, chatId, threadId) || [];\n if (viewportIds.includes(newId)) {\n return global;\n }\n\n const newIds = orderHistoryIds([\n ...(\n viewportIds.length < MESSAGE_LIST_VIEWPORT_LIMIT\n ? viewportIds\n : viewportIds.slice(-(MESSAGE_LIST_SLICE / 2))\n ),\n newId,\n ]);\n\n return replaceThreadParam(global, chatId, threadId, 'viewportIds', newIds);\n}\n\nexport function safeReplaceViewportIds(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newViewportIds: number[],\n): GlobalState {\n const viewportIds = selectViewportIds(global, chatId, threadId) || [];\n\n return replaceThreadParam(\n global,\n chatId,\n threadId,\n 'viewportIds',\n areSortedArraysEqual(viewportIds, newViewportIds) ? viewportIds : newViewportIds,\n );\n}\n\nexport function updateThreadInfo(\n global: GlobalState, chatId: number, threadId: number, update: Partial | undefined,\n): GlobalState {\n const newThreadInfo = {\n ...(selectThreadInfo(global, chatId, threadId) as ApiThreadInfo),\n ...update,\n };\n\n if (!newThreadInfo.threadId) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'threadInfo', newThreadInfo);\n}\n\nexport function updateThreadInfos(\n global: GlobalState, chatId: number, updates: Partial[],\n): GlobalState {\n updates.forEach((update) => {\n global = updateThreadInfo(global, update.chatId!, update.threadId!, update);\n });\n\n return global;\n}\n\nexport function replaceScheduledMessages(\n global: GlobalState, chatId: number, newById: Record, hash: number | undefined,\n): GlobalState {\n return updateScheduledMessages(global, chatId, {\n byId: newById,\n hash,\n });\n}\n\nfunction updateScheduledMessages(\n global: GlobalState, chatId: number, update: Partial<{ byId: Record; hash: number }>,\n): GlobalState {\n const current = global.scheduledMessages.byChatId[chatId] || { byId: {}, hash: 0 };\n\n return {\n ...global,\n scheduledMessages: {\n byChatId: {\n ...global.scheduledMessages.byChatId,\n [chatId]: {\n ...current,\n ...update,\n },\n },\n },\n };\n}\n\nexport function updateFocusedMessage(\n global: GlobalState, chatId?: number, messageId?: number, noHighlight = false,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n chatId,\n messageId,\n noHighlight,\n },\n };\n}\n\nexport function updateFocusDirection(\n global: GlobalState, direction?: FocusDirection,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n direction,\n },\n };\n}\n\nexport function enterMessageSelectMode(\n global: GlobalState,\n chatId: number,\n messageId?: number | number[],\n): GlobalState {\n const messageIds = messageId ? Array.prototype.concat([], messageId) : [];\n return {\n ...global,\n selectedMessages: {\n chatId,\n messageIds,\n },\n };\n}\n\nexport function toggleMessageSelection(\n global: GlobalState,\n chatId: number,\n threadId: number,\n messageListType: MessageListType,\n messageId: number,\n groupedId?: string,\n childMessageIds?: number[],\n withShift = false,\n): GlobalState {\n const { selectedMessages: oldSelectedMessages } = global;\n if (groupedId) {\n childMessageIds = selectMessageIdsByGroupId(global, chatId, groupedId);\n }\n const selectedMessageIds = childMessageIds || [messageId];\n if (!oldSelectedMessages) {\n return enterMessageSelectMode(global, chatId, selectedMessageIds);\n }\n\n const { messageIds } = oldSelectedMessages;\n\n let newMessageIds;\n const newSelectedMessageIds = selectedMessageIds.filter((id) => !messageIds.includes(id));\n if (newSelectedMessageIds && !newSelectedMessageIds.length) {\n newMessageIds = messageIds.filter((id) => !selectedMessageIds.includes(id));\n } else if (withShift && messageIds.length) {\n const viewportIds = selectCurrentMessageIds(global, chatId, threadId, messageListType)!;\n const prevIndex = viewportIds.indexOf(messageIds[messageIds.length - 1]);\n const currentIndex = viewportIds.indexOf(messageId);\n const from = Math.min(prevIndex, currentIndex);\n const to = Math.max(prevIndex, currentIndex);\n const slice = viewportIds.slice(from, to + 1);\n newMessageIds = unique([...messageIds, ...slice]);\n } else {\n newMessageIds = [...messageIds, ...newSelectedMessageIds];\n }\n\n if (!newMessageIds.length) {\n return exitMessageSelectMode(global);\n }\n\n return {\n ...global,\n selectedMessages: {\n ...oldSelectedMessages,\n messageIds: newMessageIds,\n },\n };\n}\n\nexport function exitMessageSelectMode(global: GlobalState): GlobalState {\n return {\n ...global,\n selectedMessages: undefined,\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiSticker, ApiStickerSet, ApiVideo } from '../../api/types';\nimport { buildCollectionByKey, unique } from '../../util/iteratees';\nimport { selectStickersForEmoji } from '../selectors';\n\nexport function updateStickerSets(\n global: GlobalState,\n category: 'added' | 'featured' | 'search',\n hash: number,\n sets: ApiStickerSet[],\n resultIds?: string[],\n): GlobalState {\n const updatedSets = sets.map((stickerSet) => {\n const existing = global.stickers.setsById[stickerSet.id];\n if (!existing) {\n return stickerSet;\n }\n\n return {\n ...existing,\n ...stickerSet,\n };\n });\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n setsById: {\n ...global.stickers.setsById,\n ...buildCollectionByKey(updatedSets, 'id'),\n },\n [category]: {\n ...global.stickers[category],\n hash,\n ...(\n category === 'search'\n ? { resultIds }\n : { setIds: sets.map(({ id }) => id) }\n ),\n },\n },\n };\n}\n\nexport function updateStickerSet(\n global: GlobalState, stickerSetId: string, update: Partial,\n): GlobalState {\n const currentStickerSet = global.stickers.setsById[stickerSetId] || {};\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n setsById: {\n ...global.stickers.setsById,\n [stickerSetId]: {\n ...currentStickerSet,\n ...update,\n },\n },\n },\n };\n}\n\nexport function updateGifSearch(\n global: GlobalState, isNew: boolean, results: ApiVideo[], nextOffset?: string,\n): GlobalState {\n const { results: currentResults } = global.gifs.search;\n\n let newResults!: ApiVideo[];\n if (isNew || !currentResults) {\n newResults = results;\n } else {\n const currentIds = new Set(currentResults.map((gif) => gif.id));\n newResults = [\n ...currentResults,\n ...results.filter((gif) => !currentIds.has(gif.id)),\n ];\n }\n\n return {\n ...global,\n gifs: {\n ...global.gifs,\n search: {\n ...global.gifs.search,\n offset: nextOffset,\n results: newResults,\n },\n },\n };\n}\n\nexport function replaceAnimatedEmojis(global: GlobalState, stickerSet: ApiStickerSet): GlobalState {\n return {\n ...global,\n animatedEmojis: stickerSet,\n };\n}\n\nexport function updateStickersForEmoji(\n global: GlobalState, emoji: string, remoteStickers?: ApiSticker[], hash?: number,\n): GlobalState {\n const localStickers = selectStickersForEmoji(global, emoji);\n const allStickers = [...localStickers, ...(remoteStickers || [])];\n const uniqueIds = unique(allStickers.map(({ id }) => id));\n const byId = buildCollectionByKey(allStickers, 'id');\n const stickers = uniqueIds.map((id) => byId[id]);\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {\n emoji,\n stickers,\n hash,\n },\n },\n };\n}\n\nexport function rebuildStickersForEmoji(global: GlobalState): GlobalState {\n const { emoji, stickers, hash } = global.stickers.forEmoji || {};\n if (!emoji) {\n return global;\n }\n\n return updateStickersForEmoji(global, emoji, stickers, hash);\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiUser } from '../../api/types';\n\nimport { omit } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\n\nexport function replaceUsers(global: GlobalState, newById: Record): GlobalState {\n return {\n ...global,\n users: {\n ...global.users,\n byId: newById,\n },\n };\n}\n\n// @optimization Don't spread/unspread global for each element, do it in a batch\nfunction getUpdatedUser(global: GlobalState, userId: number, userUpdate: Partial): ApiUser {\n const { byId } = global.users;\n const user = byId[userId];\n const shouldOmitMinInfo = userUpdate.isMin && user && !user.isMin;\n\n const updatedUser = {\n ...user,\n ...(shouldOmitMinInfo ? omit(userUpdate, ['isMin', 'accessHash']) : userUpdate),\n };\n\n if (!updatedUser.id || !updatedUser.type) {\n return user;\n }\n\n return updatedUser;\n}\n\nfunction updateContactList(global: GlobalState, updatedUsers: ApiUser[]): GlobalState {\n const { hash, userIds: contactUserIds } = global.contactList || {};\n\n if (!contactUserIds) return global;\n\n const newContactUserIds = updatedUsers\n .filter((user) => user && user.isContact && !contactUserIds.includes(user.id))\n .map((user) => user.id);\n\n if (newContactUserIds.length === 0) return global;\n\n return {\n ...global,\n contactList: {\n hash: hash || 0,\n userIds: [\n ...newContactUserIds,\n ...contactUserIds,\n ],\n },\n };\n}\n\nexport function updateUser(global: GlobalState, userId: number, userUpdate: Partial): GlobalState {\n const { byId } = global.users;\n\n const updatedUser = getUpdatedUser(global, userId, userUpdate);\n\n global = updateContactList(global, [updatedUser]);\n\n return replaceUsers(global, {\n ...byId,\n [userId]: updatedUser,\n });\n}\n\n\nexport function updateUsers(global: GlobalState, updatedById: Record): GlobalState {\n const updatedUsers = Object.keys(updatedById).map(Number).reduce>((acc, id) => {\n const updatedUser = getUpdatedUser(global, id, updatedById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n }\n return acc;\n }, {});\n\n global = updateContactList(global, Object.values(updatedUsers));\n\n global = replaceUsers(global, {\n ...global.users.byId,\n ...updatedUsers,\n });\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addUsers(global: GlobalState, addedById: Record): GlobalState {\n const { byId } = global.users;\n let isAdded = false;\n\n const addedUsers = Object.keys(addedById).map(Number).reduce>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !addedById[id].isMin)) {\n const updatedUser = getUpdatedUser(global, id, addedById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n\n if (!isAdded) {\n isAdded = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (isAdded) {\n global = replaceUsers(global, {\n ...global.users.byId,\n ...addedUsers,\n });\n\n global = updateContactList(global, Object.values(addedUsers));\n }\n\n return global;\n}\n\nexport function updateSelectedUserId(global: GlobalState, selectedId?: number): GlobalState {\n if (global.users.selectedId === selectedId) {\n return global;\n }\n\n return {\n ...global,\n users: {\n ...global.users,\n selectedId,\n },\n };\n}\n\nexport function deleteUser(global: GlobalState, userId: number): GlobalState {\n const { byId } = global.users;\n const { hash, userIds } = global.contactList || {};\n delete byId[userId];\n\n global = {\n ...global,\n contactList: {\n hash: hash || 0,\n userIds: userIds ? userIds.filter((id) => id !== userId) : MEMO_EMPTY_ARRAY,\n },\n };\n\n return replaceUsers(global, byId);\n}\n\nexport function updateUserSearch(\n global: GlobalState,\n searchStatePartial: Partial,\n) {\n return {\n ...global,\n userSearch: {\n ...global.userSearch,\n ...searchStatePartial,\n },\n };\n}\n\nexport function updateUserSearchFetchingStatus(\n global: GlobalState, newState: boolean,\n) {\n return updateUserSearch(global, {\n fetchingStatus: newState,\n });\n}\n\nexport function updateUserBlockedState(global: GlobalState, userId: number, isBlocked: boolean) {\n const { byId } = global.users;\n const user = byId[userId];\n if (!user || !user.fullInfo) {\n return global;\n }\n\n return updateUser(global, userId, {\n ...user,\n fullInfo: {\n ...user.fullInfo,\n isBlocked,\n },\n });\n}\n","import { GlobalState } from '../../global/types';\nimport { GlobalSearchContent } from '../../types';\nimport { ApiGlobalMessageSearchType, ApiMessage } from '../../api/types';\nimport { areSortedArraysEqual } from '../../util/iteratees';\n\nconst getComplexKey = (message: ApiMessage) => `${message.chatId}_${message.id}`;\n\nexport function updateGlobalSearch(\n global: GlobalState,\n searchStatePartial: Partial,\n) {\n return {\n ...global,\n globalSearch: {\n ...global.globalSearch,\n ...searchStatePartial,\n },\n };\n}\n\nexport function updateGlobalSearchContent(\n global: GlobalState,\n currentContent: GlobalSearchContent | undefined,\n): GlobalState {\n return updateGlobalSearch(global, { currentContent });\n}\n\nexport function updateGlobalSearchResults(\n global: GlobalState,\n newFoundMessages: ApiMessage[],\n totalCount: number,\n type: ApiGlobalMessageSearchType,\n nextRate?: number,\n): GlobalState {\n const { resultsByType } = global.globalSearch || {};\n const newFoundMessagesById = newFoundMessages.reduce((result, message) => {\n result[getComplexKey(message)] = message;\n\n return result;\n }, {} as Record);\n const foundIdsForType = resultsByType && resultsByType[type] ? resultsByType[type]!.foundIds : undefined;\n\n if (foundIdsForType !== undefined\n && Object.keys(newFoundMessagesById).every(\n (newId) => foundIdsForType.includes(getComplexKey(newFoundMessagesById[newId])),\n )\n ) {\n return updateGlobalSearchFetchingStatus(global, { messages: false });\n }\n\n const prevFoundIds = foundIdsForType || [];\n const newFoundIds = newFoundMessages.map((message) => getComplexKey(message));\n const foundIds = Array.prototype.concat(prevFoundIds, newFoundIds);\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n global = updateGlobalSearchFetchingStatus(global, { messages: false });\n\n return updateGlobalSearch(global, {\n resultsByType: {\n ...(global.globalSearch || {}).resultsByType,\n [type]: {\n totalCount,\n nextOffsetId: nextRate,\n foundIds: foundOrPrevFoundIds,\n },\n },\n });\n}\n\nexport function updateGlobalSearchFetchingStatus(\n global: GlobalState, newState: { chats?: boolean; messages?: boolean },\n) {\n return updateGlobalSearch(global, {\n fetchingStatus: {\n ...global.globalSearch.fetchingStatus,\n ...newState,\n },\n });\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiMessageSearchType } from '../../api/types';\n\nimport { areSortedArraysEqual, unique } from '../../util/iteratees';\nimport { SharedMediaType } from '../../types';\nimport { buildChatThreadKey } from '../helpers';\n\ninterface TextSearchParams {\n isActive: boolean;\n query?: string;\n results?: {\n totalCount?: number;\n nextOffsetId?: number;\n foundIds?: number[];\n };\n}\n\ninterface MediaSearchParams {\n currentType?: SharedMediaType;\n resultsByType?: Partial>;\n}\n\nfunction replaceLocalTextSearch(\n global: GlobalState,\n chatThreadKey: string,\n searchParams: TextSearchParams,\n): GlobalState {\n return {\n ...global,\n localTextSearch: {\n byChatThreadKey: {\n ...global.localTextSearch.byChatThreadKey,\n [chatThreadKey]: searchParams,\n },\n },\n };\n}\n\nexport function updateLocalTextSearch(\n global: GlobalState,\n chatId: number,\n threadId: number,\n isActive: boolean,\n query?: string,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n\n return replaceLocalTextSearch(global, chatThreadKey, {\n ...global.localTextSearch.byChatThreadKey[chatThreadKey],\n isActive,\n query,\n });\n}\n\nexport function replaceLocalTextSearchResults(\n global: GlobalState,\n chatId: number,\n threadId: number,\n foundIds?: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n\n return replaceLocalTextSearch(global, chatThreadKey, {\n ...global.localTextSearch.byChatThreadKey[chatThreadKey],\n results: {\n foundIds,\n totalCount,\n nextOffsetId,\n },\n });\n}\n\nexport function updateLocalTextSearchResults(\n global: GlobalState,\n chatId: number,\n threadId: number,\n newFoundIds: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const { results } = global.localTextSearch.byChatThreadKey[chatThreadKey] || {};\n const prevFoundIds = (results && results.foundIds) || [];\n const foundIds = orderFoundIds(unique(Array.prototype.concat(prevFoundIds, newFoundIds)));\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n return replaceLocalTextSearchResults(global, chatId, threadId, foundOrPrevFoundIds, totalCount, nextOffsetId);\n}\n\nfunction replaceLocalMediaSearch(\n global: GlobalState,\n chatId: number,\n searchParams: MediaSearchParams,\n): GlobalState {\n return {\n ...global,\n localMediaSearch: {\n byChatId: {\n ...global.localMediaSearch.byChatId,\n [chatId]: searchParams,\n },\n },\n };\n}\n\nexport function updateLocalMediaSearchType(\n global: GlobalState,\n chatId: number,\n currentType: SharedMediaType | undefined,\n): GlobalState {\n return replaceLocalMediaSearch(global, chatId, {\n ...global.localMediaSearch.byChatId[chatId],\n currentType,\n });\n}\n\nexport function replaceLocalMediaSearchResults(\n global: GlobalState,\n chatId: number,\n type: ApiMessageSearchType,\n foundIds?: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n return replaceLocalMediaSearch(global, chatId, {\n ...global.localMediaSearch.byChatId[chatId],\n resultsByType: {\n ...(global.localMediaSearch.byChatId[chatId] || {}).resultsByType,\n [type]: {\n foundIds,\n totalCount,\n nextOffsetId,\n },\n },\n });\n}\n\nexport function updateLocalMediaSearchResults(\n global: GlobalState,\n chatId: number,\n type: SharedMediaType,\n newFoundIds: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const { resultsByType } = global.localMediaSearch.byChatId[chatId] || {};\n const prevFoundIds = resultsByType && resultsByType[type] ? resultsByType[type]!.foundIds : [];\n const foundIds = orderFoundIds(unique(Array.prototype.concat(prevFoundIds, newFoundIds)));\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n return replaceLocalMediaSearchResults(global, chatId, type, foundOrPrevFoundIds, totalCount, nextOffsetId);\n}\n\nfunction orderFoundIds(listedIds: number[]) {\n return listedIds.sort((a, b) => a - b);\n}\n","import { GlobalState } from '../../global/types';\nimport { ManagementProgress } from '../../types';\n\ninterface ManagementState {\n isActive: boolean;\n isUsernameAvailable?: boolean;\n error?: string;\n}\n\nexport function updateManagementProgress(global: GlobalState, progress: ManagementProgress): GlobalState {\n return {\n ...global,\n management: {\n ...global.management,\n progress,\n },\n };\n}\n\nexport function updateManagement(global: GlobalState, chatId: number, update: Partial): GlobalState {\n return {\n ...global,\n management: {\n ...global.management,\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...(global.management.byChatId[chatId] || {}),\n ...update,\n },\n },\n },\n };\n}\n","import { GlobalState } from '../../global/types';\nimport {\n ISettings, IThemeSettings, ThemeKey, NotifyException,\n} from '../../types';\nimport { ApiNotifyException } from '../../api/types';\nimport { updateUserBlockedState } from './users';\n\nexport function replaceSettings(global: GlobalState, newSettings?: Partial): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n byKey: {\n ...global.settings.byKey,\n ...newSettings,\n },\n },\n };\n}\n\nexport function replaceThemeSettings(\n global: GlobalState, theme: ThemeKey, newSettings?: Partial,\n): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n themes: {\n ...global.settings.themes,\n [theme]: {\n ...(global.settings.themes[theme] || {}),\n ...newSettings,\n },\n },\n },\n };\n}\n\nexport function addNotifyExceptions(\n global: GlobalState, notifyExceptions: ApiNotifyException[],\n): GlobalState {\n notifyExceptions.forEach((notifyException) => {\n const { chatId, ...exceptionData } = notifyException;\n global = addNotifyException(global, chatId, exceptionData);\n });\n\n return global;\n}\n\nexport function addNotifyException(\n global: GlobalState, id: number, notifyException: NotifyException,\n): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n notifyExceptions: {\n ...global.settings.notifyExceptions,\n [id]: notifyException,\n },\n },\n };\n}\n\nexport function updateNotifySettings(\n global: GlobalState, peerType: 'contact' | 'group' | 'broadcast', isSilent?: boolean, shouldShowPreviews?: boolean,\n) {\n switch (peerType) {\n case 'contact':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasPrivateChatsNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasPrivateChatsMessagePreview: shouldShowPreviews }),\n });\n case 'group':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasGroupNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasGroupMessagePreview: shouldShowPreviews }),\n });\n case 'broadcast':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasBroadcastNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasBroadcastMessagePreview: shouldShowPreviews }),\n });\n\n default:\n return undefined;\n }\n}\n\nexport function addBlockedContact(global: GlobalState, contactId: number): GlobalState {\n global = updateUserBlockedState(global, contactId, true);\n\n return {\n ...global,\n blocked: {\n ...global.blocked,\n ids: [contactId, ...global.blocked.ids],\n totalCount: global.blocked.totalCount + 1,\n },\n };\n}\n\nexport function removeBlockedContact(global: GlobalState, contactId: number): GlobalState {\n global = updateUserBlockedState(global, contactId, false);\n\n return {\n ...global,\n blocked: {\n ...global.blocked,\n ids: global.blocked.ids.filter((id) => id !== contactId),\n totalCount: global.blocked.totalCount - 1,\n },\n };\n}\n","import { GlobalState } from '../../global/types';\n\nexport function updateTwoFaSettings(\n global: GlobalState,\n update: GlobalState['twoFaSettings'],\n): GlobalState {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n ...update,\n },\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ShippingOption, PaymentStep } from '../../types';\nimport { ApiMessage, ApiPaymentForm, ApiReceipt } from '../../api/types';\n\nexport function updateShippingOptions(\n global: GlobalState,\n shippingOptions: ShippingOption[],\n): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n shippingOptions,\n },\n };\n}\n\nexport function setRequestInfoId(global: GlobalState, id: string): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n formId: id,\n },\n };\n}\n\nexport function setPaymentStep(global: GlobalState, step: PaymentStep): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n step,\n },\n };\n}\n\nexport function setInvoiceMessageInfo(global: GlobalState, message: ApiMessage): GlobalState {\n if (!message.content || !message.content.invoice) {\n return global;\n }\n const {\n title,\n text,\n description,\n photoUrl,\n } = message.content.invoice;\n return {\n ...global,\n payment: {\n ...global.payment,\n invoiceContent: {\n title,\n text,\n description,\n photoUrl,\n },\n },\n };\n}\n\nexport function setStripeCardInfo(global: GlobalState, cardInfo: { type: string; id: string }): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n stripeCredentials: {\n ...cardInfo,\n },\n },\n };\n}\n\nexport function setPaymentForm(global: GlobalState, form: ApiPaymentForm): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n ...form,\n },\n };\n}\n\nexport function setReceipt(\n global: GlobalState,\n receipt?: ApiReceipt,\n message?: ApiMessage,\n): GlobalState {\n if (!receipt || !message) {\n return {\n ...global,\n payment: {\n ...global.payment,\n receipt: undefined,\n },\n };\n }\n\n const { invoice: messageInvoice } = message.content;\n const { photoUrl, text, title } = (messageInvoice || {});\n\n return {\n ...global,\n payment: {\n ...global.payment,\n receipt: {\n ...receipt,\n photoUrl,\n text,\n title,\n },\n },\n };\n}\n\nexport function clearPayment(global: GlobalState): GlobalState {\n return {\n ...global,\n payment: {},\n };\n}\n\nexport function closeInvoice(global: GlobalState): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n isPaymentModalOpen: false,\n },\n };\n}\n","// eslint-disable-next-line no-restricted-globals\nconst cacheApi = self.caches;\n\nexport enum Type {\n Text,\n Blob,\n Json,\n}\n\nexport async function fetch(cacheName: string, key: string, type: Type) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\n const cache = await cacheApi.open(cacheName);\n const response = await cache.match(request);\n if (!response) {\n return undefined;\n }\n\n switch (type) {\n case Type.Text:\n return await response.text();\n case Type.Blob: {\n const blob = await response.blob();\n\n // Safari does not return correct Content-Type header for webp images.\n if (key.substr(0, 7) === 'sticker') {\n return new Blob([blob], { type: 'image/webp' });\n }\n\n // iOS Safari fails to preserve `type` in cache\n if (!blob.type) {\n const contentType = response.headers.get('Content-Type');\n if (contentType) {\n return new Blob([blob], { type: contentType });\n }\n }\n\n return blob;\n }\n case Type.Json:\n return await response.json();\n default:\n return undefined;\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function save(cacheName: string, key: string, data: AnyLiteral | Blob | string) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n const cacheData = typeof data === 'string' || data instanceof Blob ? data : JSON.stringify(data);\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\n const response = new Response(cacheData);\n const cache = await cacheApi.open(cacheName);\n return await cache.put(request, response);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function clear(cacheName: string) {\n try {\n if (!cacheApi) {\n return undefined;\n }\n\n return await cacheApi.delete(cacheName);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n","import {\n ApiBotInlineMediaResult, ApiBotInlineResult, ApiBotInlineSwitchPm,\n ApiLanguage, ApiMessage, ApiShippingAddress, ApiStickerSet,\n} from '../api/types';\n\nexport enum LoadMoreDirection {\n Backwards,\n Forwards,\n Around,\n}\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n}\n\nexport interface IAlbum {\n albumId: string;\n messages: ApiMessage[];\n mainMessage: ApiMessage;\n}\n\nexport type ThemeKey = 'light' | 'dark';\n\nexport interface IThemeSettings {\n background?: string;\n backgroundColor?: string;\n patternColor?: string;\n isBlurred?: boolean;\n}\n\nexport type NotifySettings = {\n hasPrivateChatsNotifications?: boolean;\n hasPrivateChatsMessagePreview?: boolean;\n hasGroupNotifications?: boolean;\n hasGroupMessagePreview?: boolean;\n hasBroadcastNotifications?: boolean;\n hasBroadcastMessagePreview?: boolean;\n hasContactJoinedNotifications?: boolean;\n};\n\nexport type LangCode = (\n 'en' | 'ar' | 'be' | 'ca' | 'nl' | 'fr' | 'de' | 'id' | 'it' | 'ko' | 'ms' | 'fa' | 'pl' | 'pt-br' | 'ru' | 'es'\n | 'tr' | 'uk' | 'uz'\n);\n\nexport interface ISettings extends NotifySettings, Record {\n theme: ThemeKey;\n shouldUseSystemTheme: boolean;\n messageTextSize: number;\n animationLevel: 0 | 1 | 2;\n messageSendKeyCombo: 'enter' | 'ctrl-enter';\n shouldAutoDownloadMediaFromContacts: boolean;\n shouldAutoDownloadMediaInPrivateChats: boolean;\n shouldAutoDownloadMediaInGroups: boolean;\n shouldAutoDownloadMediaInChannels: boolean;\n shouldAutoPlayGifs: boolean;\n shouldAutoPlayVideos: boolean;\n shouldSuggestStickers: boolean;\n shouldLoopStickers: boolean;\n hasPassword?: boolean;\n languages?: ApiLanguage[];\n language: LangCode;\n isSensitiveEnabled?: boolean;\n canChangeSensitive?: boolean;\n}\n\nexport interface ApiPrivacySettings {\n visibility: PrivacyVisibility;\n allowUserIds: number[];\n allowChatIds: number[];\n blockUserIds: number[];\n blockChatIds: number[];\n}\n\nexport interface IInputPrivacyContact {\n id: number;\n accessHash?: string;\n}\n\nexport interface IInputPrivacyRules {\n visibility: PrivacyVisibility;\n allowedUsers?: IInputPrivacyContact[];\n allowedChats?: IInputPrivacyContact[];\n blockedUsers?: IInputPrivacyContact[];\n blockedChats?: IInputPrivacyContact[];\n}\n\nexport type IAnchorPosition = {\n x: number;\n y: number;\n};\n\nexport interface ShippingOption {\n id: string;\n title: string;\n amount: number;\n prices: Price[];\n}\n\nexport interface Price {\n label: string;\n amount: number;\n}\n\nexport interface Invoice {\n currency?: string;\n emailRequested?: boolean;\n emailToProvider?: boolean;\n flexible?: boolean;\n nameRequested?: boolean;\n phoneRequested?: boolean;\n phoneToProvider?: boolean;\n prices?: Price[];\n shippingAddressRequested?: boolean;\n test?: boolean;\n}\n\nexport interface Receipt {\n currency: string;\n prices: Price[];\n info?: {\n shippingAddress?: ApiShippingAddress;\n phone?: string;\n name?: string;\n };\n totalAmount: number;\n credentialsTitle: string;\n shippingPrices?: Price[];\n shippingMethod?: string;\n photoUrl?: string;\n text?: string;\n title?: string;\n}\n\nexport enum SettingsScreens {\n Main,\n EditProfile,\n Notifications,\n Language,\n General,\n GeneralChatBackground,\n GeneralChatBackgroundColor,\n Privacy,\n PrivacyPhoneNumber,\n PrivacyLastSeen,\n PrivacyProfilePhoto,\n PrivacyForwarding,\n PrivacyGroupChats,\n PrivacyPhoneNumberAllowedContacts,\n PrivacyPhoneNumberDeniedContacts,\n PrivacyLastSeenAllowedContacts,\n PrivacyLastSeenDeniedContacts,\n PrivacyProfilePhotoAllowedContacts,\n PrivacyProfilePhotoDeniedContacts,\n PrivacyForwardingAllowedContacts,\n PrivacyForwardingDeniedContacts,\n PrivacyGroupChatsAllowedContacts,\n PrivacyGroupChatsDeniedContacts,\n PrivacyActiveSessions,\n PrivacyBlockedUsers,\n Folders,\n FoldersCreateFolder,\n FoldersEditFolder,\n FoldersEditFolderFromChatList,\n FoldersIncludedChats,\n FoldersIncludedChatsFromChatList,\n FoldersExcludedChats,\n FoldersExcludedChatsFromChatList,\n TwoFaDisabled,\n TwoFaNewPassword,\n TwoFaNewPasswordConfirm,\n TwoFaNewPasswordHint,\n TwoFaNewPasswordEmail,\n TwoFaNewPasswordEmailCode,\n TwoFaEnabled,\n TwoFaChangePasswordCurrent,\n TwoFaChangePasswordNew,\n TwoFaChangePasswordConfirm,\n TwoFaChangePasswordHint,\n TwoFaTurnOff,\n TwoFaRecoveryEmailCurrentPassword,\n TwoFaRecoveryEmail,\n TwoFaRecoveryEmailCode,\n TwoFaCongratulations,\n}\n\nexport type StickerSetOrRecent = Pick;\n\nexport enum LeftColumnContent {\n ChatList,\n GlobalSearch,\n Settings,\n Contacts,\n Archived,\n NewChannelStep1,\n NewChannelStep2,\n NewGroupStep1,\n NewGroupStep2,\n}\n\nexport enum GlobalSearchContent {\n ChatList,\n Media,\n Links,\n Files,\n Music,\n Voice,\n}\n\nexport enum RightColumnContent {\n ChatInfo,\n UserInfo,\n Search,\n Management,\n StickerSearch,\n GifSearch,\n PollResults,\n AddingMembers,\n}\n\nexport enum MediaViewerOrigin {\n Inline,\n ScheduledInline,\n SharedMedia,\n ProfileAvatar,\n MiddleHeaderAvatar,\n Album,\n ScheduledAlbum,\n SearchResult,\n}\n\nexport enum ChatCreationProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport enum ProfileEditProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport enum ManagementProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport enum NewChatMembersProgress {\n Closed,\n InProgress,\n Loading,\n}\n\nexport type ProfileTabType = 'members' | 'media' | 'documents' | 'links' | 'audio';\nexport type SharedMediaType = 'media' | 'documents' | 'links' | 'audio';\nexport type ApiPrivacyKey = 'phoneNumber' | 'lastSeen' | 'profilePhoto' | 'forwards' | 'chatInvite';\nexport type PrivacyVisibility = 'everybody' | 'contacts' | 'nonContacts' | 'nobody';\n\nexport enum ProfileState {\n Profile,\n SharedMedia,\n MemberList,\n}\n\nexport enum PaymentStep {\n ShippingInfo,\n Shipping,\n PaymentInfo,\n Checkout\n}\n\nexport const UPLOADING_WALLPAPER_SLUG = 'UPLOADING_WALLPAPER_SLUG';\n\nexport enum ManagementScreens {\n Initial,\n ChatPrivacyType,\n Discussion,\n ChannelSubscribers,\n GroupType,\n GroupPermissions,\n GroupRemovedUsers,\n GroupUserPermissionsCreate,\n GroupUserPermissions,\n ChatAdministrators,\n GroupRecentActions,\n ChatAdminRights,\n GroupMembers,\n}\n\nexport type ManagementType = 'user' | 'group' | 'channel';\n\nexport type NotifyException = {\n isMuted: boolean;\n isSilent?: boolean;\n shouldShowPreviews?: boolean;\n};\n\nexport type EmojiKeywords = {\n isLoading?: boolean;\n version: number;\n keywords: Record;\n};\n\nexport type InlineBotSettings = {\n id: number;\n help?: string;\n query?: string;\n offset?: string;\n canLoadMore?: boolean;\n results?: (ApiBotInlineResult | ApiBotInlineMediaResult)[];\n isGallery?: boolean;\n switchPm?: ApiBotInlineSwitchPm;\n};\n","import { ApiLangPack, ApiLangString } from '../api/types';\n\nimport {\n DEFAULT_LANG_CODE, DEFAULT_LANG_PACK, LANG_CACHE_NAME, LANG_PACKS,\n} from '../config';\nimport * as cacheApi from './cacheApi';\nimport { callApi } from '../api/gramjs';\nimport { createCallbackManager } from './callbacks';\nimport { formatInteger } from './textFormat';\nimport { getGlobal } from '../lib/teact/teactn';\n\ninterface LangFn {\n (key: string, value?: any, format?: 'i'): any;\n\n isRtl?: boolean;\n code?: string;\n}\n\nconst SUBSTITUTION_REGEX = /%\\d?\\$?[sdf@]/g;\nconst PLURAL_OPTIONS = ['value', 'zeroValue', 'oneValue', 'twoValue', 'fewValue', 'manyValue', 'otherValue'] as const;\nconst PLURAL_RULES = {\n /* eslint-disable max-len */\n en: (n: number) => (n !== 1 ? 6 : 2),\n ar: (n: number) => (n === 0 ? 1 : n === 1 ? 2 : n === 2 ? 3 : n % 100 >= 3 && n % 100 <= 10 ? 4 : n % 100 >= 11 ? 5 : 6),\n ca: (n: number) => (n !== 1 ? 6 : 2),\n de: (n: number) => (n !== 1 ? 6 : 2),\n es: (n: number) => (n !== 1 ? 6 : 2),\n fa: (n: number) => (n > 1 ? 6 : 2),\n fr: (n: number) => (n > 1 ? 6 : 2),\n id: () => 0,\n it: (n: number) => (n !== 1 ? 6 : 2),\n ko: () => 0,\n ms: () => 0,\n nl: (n: number) => (n !== 1 ? 6 : 2),\n pl: (n: number) => (n === 1 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n pt_BR: (n: number) => (n > 1 ? 6 : 2),\n ru: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n tr: (n: number) => (n > 1 ? 6 : 2),\n uk: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n uz: (n: number) => (n > 1 ? 6 : 2),\n /* eslint-enable max-len */\n};\n\nconst cache = new Map();\n\nlet langPack: ApiLangPack | undefined;\nlet fallbackLangPack: ApiLangPack | undefined;\n\nconst {\n addCallback,\n removeCallback,\n runCallbacks,\n} = createCallbackManager();\n\nexport { addCallback, removeCallback };\n\nlet currentLangCode: string | undefined;\n\nexport const getTranslation: LangFn = (key: string, value?: any, format?: 'i') => {\n if (value !== undefined) {\n const cacheValue = Array.isArray(value) ? JSON.stringify(value) : value;\n const cached = cache.get(`${key}_${cacheValue}_${format}`);\n if (cached) {\n return cached;\n }\n }\n\n if (!langPack && !fallbackLangPack) {\n return key;\n }\n\n const langString = (langPack && langPack[key]) || (fallbackLangPack && fallbackLangPack[key]);\n if (!langString) {\n if (!fallbackLangPack) {\n void importFallbackLangPack();\n }\n\n return key;\n }\n\n return processTranslation(langString, key, value, format);\n};\n\nexport async function getTranslationForLangString(langCode: string, key: string) {\n let translateString = await cacheApi.fetch(\n LANG_CACHE_NAME,\n `${DEFAULT_LANG_PACK}_${langCode}_${key}`,\n cacheApi.Type.Json,\n );\n\n if (!translateString) {\n translateString = await fetchRemoteString(DEFAULT_LANG_PACK, langCode, key);\n }\n\n return processTranslation(translateString, key);\n}\n\nexport async function setLanguage(langCode: string, callback?: NoneToVoidFunction, withFallback = false) {\n if (langPack && langCode === currentLangCode) {\n if (callback) {\n callback();\n }\n\n return;\n }\n\n let newLangPack = await cacheApi.fetch(LANG_CACHE_NAME, langCode, cacheApi.Type.Json);\n if (!newLangPack) {\n if (withFallback) {\n await importFallbackLangPack();\n }\n\n newLangPack = await fetchRemote(langCode);\n if (!newLangPack) {\n return;\n }\n }\n\n cache.clear();\n\n currentLangCode = langCode;\n langPack = newLangPack;\n document.documentElement.lang = langCode;\n\n const { languages } = getGlobal().settings.byKey;\n const langInfo = languages ? languages.find((l) => l.langCode === langCode) : undefined;\n getTranslation.isRtl = Boolean(langInfo && langInfo.rtl);\n getTranslation.code = langCode;\n\n if (callback) {\n callback();\n }\n\n runCallbacks();\n}\n\nasync function importFallbackLangPack() {\n if (fallbackLangPack) {\n return;\n }\n\n fallbackLangPack = (await import('./fallbackLangPack')).default;\n runCallbacks();\n}\n\nasync function fetchRemote(langCode: string): Promise {\n const remote = await callApi('fetchLangPack', { sourceLangPacks: LANG_PACKS, langCode });\n if (remote) {\n await cacheApi.save(LANG_CACHE_NAME, langCode, remote.langPack);\n return remote.langPack;\n }\n\n return undefined;\n}\n\nasync function fetchRemoteString(\n remoteLangPack: typeof LANG_PACKS[number], langCode: string, key: string,\n): Promise {\n const remote = await callApi('fetchLangStrings', {\n langPack: remoteLangPack,\n langCode,\n keys: [key],\n });\n\n if (remote && remote.length) {\n await cacheApi.save(LANG_CACHE_NAME, `${remoteLangPack}_${langCode}_${key}`, remote[0]);\n\n return remote[0];\n }\n\n return undefined;\n}\n\nfunction getPluralOption(amount: number) {\n const langCode = currentLangCode || DEFAULT_LANG_CODE;\n const optionIndex = PLURAL_RULES[langCode as keyof typeof PLURAL_RULES]\n ? PLURAL_RULES[langCode as keyof typeof PLURAL_RULES](amount)\n : 0;\n\n return PLURAL_OPTIONS[optionIndex];\n}\n\nfunction processTemplate(template: string, value: any) {\n value = Array.isArray(value) ? value : [value];\n const translationSlices = template.split(SUBSTITUTION_REGEX);\n const initialValue = translationSlices.shift();\n\n return translationSlices.reduce((result, str, index) => {\n return `${result}${String(value[index] || '')}${str}`;\n }, initialValue || '');\n}\n\nfunction processTranslation(langString: ApiLangString | undefined, key: string, value?: any, format?: 'i') {\n const template = langString ? langString[typeof value === 'number' ? getPluralOption(value) : 'value'] : undefined;\n if (!template || !template.trim()) {\n const parts = key.split('.');\n\n return parts[parts.length - 1];\n }\n\n if (value !== undefined) {\n const formattedValue = format === 'i' ? formatInteger(value) : value;\n const result = processTemplate(template, formattedValue);\n const cacheValue = Array.isArray(value) ? JSON.stringify(value) : value;\n cache.set(`${key}_${cacheValue}_${format}`, result);\n return result;\n }\n\n return template;\n}\n","export function createCallbackManager() {\n const callbacks: AnyToVoidFunction[] = [];\n\n function addCallback(cb: AnyToVoidFunction) {\n callbacks.push(cb);\n\n return () => {\n removeCallback(cb);\n };\n }\n\n function removeCallback(cb: AnyToVoidFunction) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n }\n\n function runCallbacks(...args: any[]) {\n callbacks.forEach((callback) => {\n callback(...args);\n });\n }\n\n return {\n runCallbacks,\n addCallback,\n removeCallback,\n };\n}\n","import { DEBUG } from '../config';\n\nexport enum Bundles {\n Auth,\n Main,\n Extra\n}\n\ninterface ImportedBundles {\n [Bundles.Auth]: typeof import('../bundles/auth');\n [Bundles.Main]: typeof import('../bundles/main');\n [Bundles.Extra]: typeof import('../bundles/extra');\n}\n\ntype BundlePromises = {\n [K in keyof ImportedBundles]: Promise\n};\n\nexport type BundleModules = keyof ImportedBundles[B];\n\nconst LOAD_PROMISES: Partial = {};\nconst MEMORY_CACHE: Partial = {};\n\nexport async function loadModule>(bundleName: B, moduleName: M) {\n if (!LOAD_PROMISES[bundleName]) {\n switch (bundleName) {\n case Bundles.Auth:\n LOAD_PROMISES[Bundles.Auth] = import('../bundles/auth');\n break;\n case Bundles.Main:\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD MAIN BUNDLE');\n }\n\n LOAD_PROMISES[Bundles.Main] = import('../bundles/main');\n break;\n case Bundles.Extra:\n LOAD_PROMISES[Bundles.Extra] = import('../bundles/extra');\n break;\n }\n\n (LOAD_PROMISES[bundleName] as Promise).then(handleBundleLoad);\n }\n\n const bundle = (await LOAD_PROMISES[bundleName]) as unknown as ImportedBundles[B];\n\n if (!MEMORY_CACHE[bundleName]) {\n MEMORY_CACHE[bundleName] = bundle;\n }\n\n return getModuleFromMemory(bundleName, moduleName);\n}\n\nexport function getModuleFromMemory>(bundleName: B, moduleName: M) {\n const bundle = MEMORY_CACHE[bundleName] as ImportedBundles[B];\n\n if (!bundle) {\n return undefined;\n }\n\n return bundle[moduleName];\n}\n\nconst listeners: NoneToVoidFunction[] = [];\n\nexport function addLoadListener(listener: NoneToVoidFunction) {\n if (!listeners.includes(listener)) {\n listeners.push(listener);\n }\n}\n\nfunction handleBundleLoad() {\n listeners.forEach((listener) => {\n listener();\n });\n}\n","import { ApiMediaFormat } from '../api/types';\n\nimport * as langProvider from '../util/langProvider';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport type LangFn = typeof langProvider.getTranslation;\n\nexport default (): LangFn => {\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n return langProvider.addCallback(forceUpdate);\n }, [forceUpdate]);\n\n return langProvider.getTranslation;\n};\n","import { pause } from './schedulers';\n\n// Polyfill for Safari: `File` is not available in web worker\nif (typeof File === 'undefined') {\n // eslint-disable-next-line no-global-assign, no-restricted-globals, func-names\n self.File = class extends Blob {\n name: string;\n\n constructor(fileBits: BlobPart[], fileName: string, options?: FilePropertyBag) {\n if (options) {\n const { type, ...rest } = options;\n super(fileBits, { type });\n Object.assign(this, rest);\n } else {\n super(fileBits);\n }\n\n this.name = fileName;\n }\n } as typeof File;\n}\n\nexport function dataUriToBlob(dataUri: string) {\n const arr = dataUri.split(',');\n const mime = arr[0].match(/:(.*?);/)![1];\n const bstr = atob(arr[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n\n return new Blob([u8arr], { type: mime });\n}\n\nexport function blobToDataUri(blob: Blob): Promise {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e: ProgressEvent) => {\n const { result } = e.target || {};\n if (typeof result === 'string') {\n resolve(result);\n }\n\n reject(new Error('Failed to read blob'));\n };\n\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport function blobToFile(blob: Blob, fileName: string) {\n return new File([blob], fileName, {\n lastModified: Date.now(),\n type: blob.type,\n });\n}\n\nexport function preloadImage(url: string): Promise {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = url;\n });\n}\n\nexport function preloadVideo(url: string): Promise {\n return new Promise((resolve, reject) => {\n const video = document.createElement('video');\n video.volume = 0;\n video.onloadedmetadata = () => resolve(video);\n video.onerror = reject;\n video.src = url;\n });\n}\n\nexport async function createPosterForVideo(url: string): Promise {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise,\n new Promise((resolve, reject) => {\n video.onseeked = () => {\n if (!video.videoWidth || !video.videoHeight) {\n resolve(undefined);\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(video, 0, 0);\n resolve(canvas.toDataURL('image/jpeg'));\n };\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n }),\n ]);\n}\n\nexport async function fetchBlob(blobUrl: string) {\n const response = await fetch(blobUrl);\n return response.blob();\n}\n\nexport async function fetchFile(blobUrl: string, fileName: string) {\n const blob = await fetchBlob(blobUrl);\n return blobToFile(blob, fileName);\n}\n\nexport function imgToCanvas(img: HTMLImageElement) {\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0);\n\n return canvas;\n}\n","function promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n const dbp = promisifyRequest(request);\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(customStore, callback) {\n return customStore('readonly', (store) => {\n // This would be store.getAllKeys(), but it isn't supported by Edge or Safari.\n // And openKeyCursor isn't supported by Safari.\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push(cursor.key)).then(() => items);\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push(cursor.value)).then(() => items);\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n const items = [];\n return eachCursor(customStore, (cursor) => items.push([cursor.key, cursor.value])).then(() => items);\n}\n\nexport { clear, createStore, del, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","import * as idb from 'idb-keyval';\n\nimport { ApiSessionData } from '../api/types';\n\nimport { DEBUG, LEGACY_SESSION_KEY, SESSION_USER_KEY } from '../config';\nimport * as cacheApi from './cacheApi';\n\nconst DC_IDS = [1, 2, 3, 4, 5];\n\nexport function hasStoredSession(withLegacy = false) {\n if (withLegacy && localStorage.getItem(LEGACY_SESSION_KEY)) {\n return true;\n }\n\n const userAuthJson = localStorage.getItem(SESSION_USER_KEY);\n if (!userAuthJson) return false;\n\n try {\n const userAuth = JSON.parse(userAuthJson);\n return Boolean(userAuth && userAuth.id && userAuth.dcID);\n } catch (err) {\n // Do nothing.\n return false;\n }\n}\n\nexport function storeSession(sessionData: ApiSessionData, currentUserId?: number) {\n const { mainDcId, keys, hashes } = sessionData;\n\n localStorage.setItem(SESSION_USER_KEY, JSON.stringify({ dcID: mainDcId, id: currentUserId }));\n localStorage.setItem('dc', String(mainDcId));\n Object.keys(keys).map(Number).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_auth_key`, JSON.stringify(keys[dcId]));\n });\n Object.keys(hashes).map(Number).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_hash`, JSON.stringify(hashes[dcId]));\n });\n}\n\nexport function clearStoredSession() {\n [\n SESSION_USER_KEY,\n 'dc',\n ...DC_IDS.map((dcId) => `dc${dcId}_auth_key`),\n ...DC_IDS.map((dcId) => `dc${dcId}_hash`),\n ].forEach((key) => {\n localStorage.removeItem(key);\n });\n}\n\nexport function loadStoredSession(): ApiSessionData | undefined {\n if (!hasStoredSession()) {\n return undefined;\n }\n\n const userAuth = JSON.parse(localStorage.getItem(SESSION_USER_KEY)!);\n const mainDcId = Number(userAuth.dcID);\n const keys: Record = {};\n const hashes: Record = {};\n\n DC_IDS.forEach((dcId) => {\n try {\n const key = localStorage.getItem(`dc${dcId}_auth_key`);\n if (key) {\n keys[dcId] = JSON.parse(key);\n }\n\n const hash = localStorage.getItem(`dc${dcId}_hash`);\n if (hash) {\n hashes[dcId] = JSON.parse(hash);\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load stored session', err);\n }\n // Do nothing.\n }\n });\n\n if (!Object.keys(keys).length) return undefined;\n\n return {\n mainDcId,\n keys,\n hashes,\n };\n}\n\nexport async function importLegacySession() {\n const sessionId = localStorage.getItem(LEGACY_SESSION_KEY);\n if (!sessionId) return;\n\n const sessionJson = await idb.get(`GramJs:${sessionId}`);\n try {\n const sessionData = JSON.parse(sessionJson) as ApiSessionData;\n storeSession(sessionData);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load legacy session', err);\n }\n // Do nothing.\n }\n}\n\n// Remove previously created IndexedDB and cache API sessions\nexport async function clearLegacySessions() {\n localStorage.removeItem(LEGACY_SESSION_KEY);\n\n const idbKeys = await idb.keys();\n\n await Promise.all>([\n cacheApi.clear('GramJs'),\n ...idbKeys\n .filter((k) => typeof k === 'string' && k.startsWith('GramJs:GramJs-session-'))\n .map((k) => idb.del(k)),\n ]);\n}\n\nexport function importTestSession() {\n const sessionJson = process.env.TEST_SESSION!;\n try {\n const sessionData = JSON.parse(sessionJson) as ApiSessionData & { userId: number };\n storeSession(sessionData, sessionData.userId);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load test session', err);\n }\n // Do nothing.\n }\n}\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n// Version 2c193ce 28.05.2021\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nexport function removeVS16s(rawEmoji) {\n return rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji;\n}\n\n// This file is generated by source/emoji/scripts/generate.sh\n// eslint-disable-next-line max-len\nexport default /(?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91])|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f|\\u2696\\ufe0f|\\u2708\\ufe0f|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)((?:\\ud83c[\\udffb-\\udfff]|\\ufe0f)\\u200d[\\u2640\\u2642]\\ufe0f)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f\\u200d\\u26a7\\ufe0f|\\ud83c\\udff3\\ufe0f\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f|\\u2764\\ufe0f\\u200d\\ud83d\\udd25|\\u2764\\ufe0f\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f|\\ud83e\\uddde\\u200d\\u2640\\ufe0f|\\ud83e\\uddde\\u200d\\u2642\\ufe0f|\\ud83e\\udddf\\u200d\\u2640\\ufe0f|\\ud83e\\udddf\\u200d\\u2642\\ufe0f|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f?\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd1d\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78\\udd7a-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcb\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7a\\ude80-\\ude86\\ude90-\\udea8\\udeb0-\\udeb6\\udec0-\\udec2\\uded0-\\uded6]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f/g;\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport Spinner from './Spinner';\n\nimport './Loading.scss';\n\ntype OwnProps = {\n color?: 'blue' | 'white' | 'black';\n};\n\nconst Loading: FC = ({ color = 'blue' }) => {\n return (\n

\n \n
\n );\n};\n\nexport default memo(Loading);\n","import { MouseEvent as ReactMouseEvent, RefObject } from 'react';\n\nimport React, {\n FC, useRef, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Spinner from './Spinner';\nimport RippleEffect from './RippleEffect';\n\nimport './Button.scss';\n\nexport type OwnProps = {\n ref?: RefObject;\n type?: 'button' | 'submit' | 'reset';\n children: any;\n size?: 'default' | 'smaller' | 'tiny';\n color?: 'primary' | 'secondary' | 'gray' | 'danger' | 'translucent' | 'translucent-white' | 'dark';\n className?: string;\n round?: boolean;\n pill?: boolean;\n fluid?: boolean;\n isText?: boolean;\n isLoading?: boolean;\n ariaLabel?: string;\n href?: string;\n download?: string;\n disabled?: boolean;\n ripple?: boolean;\n faded?: boolean;\n tabIndex?: number;\n isRtl?: boolean;\n onClick?: (e: ReactMouseEvent) => void;\n onContextMenu?: (e: ReactMouseEvent) => void;\n onMouseDown?: (e: ReactMouseEvent) => void;\n onMouseEnter?: NoneToVoidFunction;\n onMouseLeave?: NoneToVoidFunction;\n onFocus?: NoneToVoidFunction;\n};\n\n// Longest animation duration;\nconst CLICKED_TIMEOUT = 400;\n\nconst Button: FC = ({\n ref,\n type = 'button',\n onClick,\n onContextMenu,\n onMouseDown,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n children,\n size = 'default',\n color = 'primary',\n className,\n round,\n pill,\n fluid,\n isText,\n isLoading,\n ariaLabel,\n href,\n download,\n disabled,\n ripple,\n faded,\n tabIndex,\n isRtl,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef(null);\n if (ref) {\n elementRef = ref;\n }\n\n const [isClicked, setIsClicked] = useState(false);\n\n const fullClassName = buildClassName(\n 'Button',\n className,\n size,\n color,\n round && 'round',\n pill && 'pill',\n fluid && 'fluid',\n disabled && 'disabled',\n isText && 'text',\n isLoading && 'loading',\n ripple && 'has-ripple',\n faded && 'faded',\n isClicked && 'clicked',\n );\n\n const handleClick = useCallback((e: ReactMouseEvent) => {\n if (!disabled && onClick) {\n onClick(e);\n }\n\n setIsClicked(true);\n setTimeout(() => {\n setIsClicked(false);\n }, CLICKED_TIMEOUT);\n }, [disabled, onClick]);\n\n const handleMouseDown = useCallback((e: ReactMouseEvent) => {\n e.preventDefault();\n if (!disabled && onMouseDown) {\n onMouseDown(e);\n }\n }, [onMouseDown, disabled]);\n\n if (href) {\n return (\n }\n className={fullClassName}\n href={href}\n title={ariaLabel}\n download={download}\n tabIndex={tabIndex}\n dir={isRtl ? 'rtl' : undefined}\n >\n {children}\n {!disabled && ripple && (\n \n )}\n \n );\n }\n\n return (\n // eslint-disable-next-line react/button-has-type\n }\n type={type}\n className={fullClassName}\n onClick={handleClick}\n onContextMenu={onContextMenu}\n onMouseDown={handleMouseDown}\n onMouseEnter={onMouseEnter && !disabled ? onMouseEnter : undefined}\n onMouseLeave={onMouseLeave && !disabled ? onMouseLeave : undefined}\n onFocus={onFocus && !disabled ? onFocus : undefined}\n aria-label={ariaLabel}\n title={ariaLabel}\n tabIndex={tabIndex}\n dir={isRtl ? 'rtl' : undefined}\n >\n {isLoading ? (\n
\n Please wait..\n \n
\n ) : children}\n {!disabled && ripple && (\n \n )}\n \n );\n};\n\nexport default Button;\n","import React from '../../../lib/teact/teact';\nimport EMOJI_REGEX, { removeVS16s } from '../../../lib/twemojiRegex';\n\nimport { RE_LINK_TEMPLATE, RE_MENTION_TEMPLATE } from '../../../config';\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\nimport { nativeToUnfified } from '../../../util/emoji';\nimport buildClassName from '../../../util/buildClassName';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\n\ntype TextPart = string | Element;\n\nconst RE_LETTER_OR_DIGIT = /^[\\d\\wа-яё]$/i;\nconst SIMPLE_MARKDOWN_REGEX = /(\\*\\*|__).+?\\1/g;\n\nexport default function renderText(\n part: TextPart,\n filters: Array<(\n 'escape_html' | 'hq_emoji' | 'emoji' | 'emoji_html' | 'br' | 'br_html' | 'highlight' | 'links' |\n 'simple_markdown' | 'simple_markdown_html'\n )> = ['emoji'],\n params?: { highlight: string | undefined },\n): TextPart[] {\n if (typeof part !== 'string') {\n return [part];\n }\n\n return filters.reduce((text, filter) => {\n switch (filter) {\n case 'escape_html':\n return escapeHtml(text);\n\n case 'hq_emoji':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'big', 'jsx');\n\n case 'emoji':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'small', 'jsx');\n\n case 'emoji_html':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'small', 'html');\n\n case 'br':\n return addLineBreaks(text, 'jsx');\n\n case 'br_html':\n return addLineBreaks(text, 'html');\n\n case 'highlight':\n return addHighlight(text, params!.highlight);\n\n case 'links':\n return addLinks(text);\n\n case 'simple_markdown':\n return replaceSimpleMarkdown(text, 'jsx');\n\n case 'simple_markdown_html':\n return replaceSimpleMarkdown(text, 'html');\n }\n\n return text;\n }, [part] as TextPart[]);\n}\n\nfunction escapeHtml(textParts: TextPart[]): TextPart[] {\n const divEl = document.createElement('div');\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n divEl.innerText = part;\n\n return [...result, divEl.innerHTML];\n }, [] as TextPart[]);\n}\n\nfunction replaceEmojis(textParts: TextPart[], size: 'big' | 'small', type: 'jsx' | 'html'): TextPart[] {\n if (IS_EMOJI_SUPPORTED) {\n return textParts;\n }\n\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const parts = part.split(EMOJI_REGEX);\n const emojis = part.match(EMOJI_REGEX) || [];\n result.push(parts[0]);\n\n return emojis.reduce((emojiResult: TextPart[], emoji, i) => {\n const code = nativeToUnfified(removeVS16s(emoji));\n const className = buildClassName(\n 'emoji',\n size === 'small' && 'emoji-small',\n );\n if (type === 'jsx') {\n emojiResult.push(\n ,\n );\n }\n if (type === 'html') {\n emojiResult.push(\n // For preventing extra spaces in html\n // eslint-disable-next-line max-len\n `\"${emoji}\"`,\n );\n }\n\n const index = i * 2 + 2;\n if (parts[index]) {\n emojiResult.push(parts[index]);\n }\n\n return emojiResult;\n }, result);\n }, [] as TextPart[]);\n}\n\nfunction addLineBreaks(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n return [...result, ...part\n .split(/\\r\\n|\\r|\\n/g)\n .reduce((parts: TextPart[], line: string, i, source) => {\n // This adds non-breaking space if line was indented with spaces, to preserve the indentation\n const trimmedLine = line.trimLeft();\n const indentLength = line.length - trimmedLine.length;\n parts.push(String.fromCharCode(160).repeat(indentLength) + trimmedLine);\n\n if (i !== source.length - 1) {\n parts.push(\n type === 'jsx' ?
: '
',\n );\n }\n\n return parts;\n }, [])];\n }, [] as TextPart[]);\n}\n\nfunction addHighlight(textParts: TextPart[], highlight: string | undefined): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string' || !highlight) {\n return [...result, part];\n }\n\n const lowerCaseText = part.toLowerCase();\n const queryPosition = lowerCaseText.indexOf(highlight.toLowerCase());\n const nextSymbol = lowerCaseText[queryPosition + highlight.length];\n if (queryPosition < 0 || (nextSymbol && nextSymbol.match(RE_LETTER_OR_DIGIT))) {\n return [...result, part];\n }\n\n const newParts: TextPart[] = [];\n newParts.push(part.substring(0, queryPosition));\n newParts.push(\n \n {part.substring(queryPosition, queryPosition + highlight.length)}\n ,\n );\n newParts.push(part.substring(queryPosition + highlight.length));\n\n return [...result, ...newParts];\n }, [] as TextPart[]);\n}\n\nconst RE_LINK = new RegExp(`${RE_LINK_TEMPLATE}|${RE_MENTION_TEMPLATE}`, 'ig');\n\nfunction addLinks(textParts: TextPart[]): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const links = part.match(RE_LINK);\n if (!links || !links.length) {\n return [...result, part];\n }\n\n const content: TextPart[] = [];\n\n let nextLink = links.shift();\n let lastIndex = 0;\n while (nextLink) {\n const index = part.indexOf(nextLink, lastIndex);\n content.push(part.substring(lastIndex, index));\n if (nextLink.startsWith('@')) {\n content.push(\n \n {nextLink}\n ,\n );\n } else {\n if (nextLink.endsWith('?')) {\n nextLink = nextLink.slice(0, nextLink.length - 1);\n }\n\n content.push(\n ,\n );\n }\n lastIndex = index + nextLink.length;\n nextLink = links.shift();\n }\n content.push(part.substring(lastIndex));\n\n return [...result, ...content];\n }, [] as TextPart[]);\n}\n\nfunction replaceSimpleMarkdown(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n return [...result, part];\n }\n\n const parts = part.split(SIMPLE_MARKDOWN_REGEX);\n const entities = part.match(SIMPLE_MARKDOWN_REGEX) || [];\n result.push(parts[0]);\n\n return entities.reduce((entityResult: TextPart[], entity, i) => {\n if (type === 'jsx') {\n entityResult.push(\n entity.startsWith('**')\n ? {entity.replace(/\\*\\*/g, '')}\n : {entity.replace(/__/g, '')},\n );\n } else {\n entityResult.push(\n entity.startsWith('**')\n ? `${entity.replace(/\\*\\*/g, '')}`\n : `${entity.replace(/__/g, '')}`,\n );\n }\n\n const index = i * 2 + 2;\n if (parts[index]) {\n entityResult.push(parts[index]);\n }\n\n return entityResult;\n }, result);\n }, [] as TextPart[]);\n}\n","// This data was received from Telegram Desktop (Telegram/Resources/numbers.txt)\nconst DATA = `AF🇦🇫93Afghanistan333\nAO🇦🇴244Angola333\nAL🇦🇱355Albania234\nAD🇦🇩376Andorra222\nAE🇦🇪971United Arab Emirates234\nAI🇦🇮1264Anguilla34\nAR🇦🇷54Argentina\nAM🇦🇲374Armenia233\nAG🇦🇬1268Antigua and Barbuda34\nAU🇦🇺61Australia333\nAS🇦🇸1684American Samoa34\nAT🇦🇹43Austria\nAW🇦🇼297Aruba34\nAZ🇦🇿994Azerbaijan2322\nBI🇧🇮257Burundi224\nBE🇧🇪32Belgium3222\nBJ🇧🇯229Benin233\nBF🇧🇫226Burkina Faso2222\nBD🇧🇩880Bangladesh\nBG🇧🇬359Bulgaria\nBH🇧🇭973Bahrain44\nBS🇧🇸1242Bahamas34\nBA🇧🇦387Bosnia and Herzegovina\nBY🇧🇾375Belarus2322\nBZ🇧🇿501Belize\nBO🇧🇴591Bolivia134\nBR🇧🇷55Brazil254\nBB🇧🇧1246Barbados34\nBM🇧🇲1441Bermuda34\nBN🇧🇳673Brunei34\nBQ🇧🇶599Bonaire, Sint Eustatius and Saba\nBT🇧🇹975Bhutan\nBW🇧🇼267Botswana233\nCF🇨🇫236Central African Republic2222\nCA🇨🇦1Canada334\nCH🇨🇭41Switzerland234\nCK🇨🇰682Cook Islands\nCL🇨🇱56Chile144\nCN🇨🇳86China344\nCI🇨🇮225Côte d\\`Ivoire233\nCM🇨🇲237Cameroon44\nCD🇨🇩243DR Congo234\nCG🇨🇬242Republic of the Congo234\nCO🇨🇴57Colombia334\nKM🇰🇲269Comoros34\nCV🇨🇻238Cape Verde34\nCR🇨🇷506Costa Rica\nCU🇨🇺53Cuba44\nCY🇨🇾357Cyprus44\nCW🇨🇼599Curaçao\nCZ🇨🇿420Czech Republic\nDE🇩🇪49Germany38\nDJ🇩🇯253Djibouti2222\nDM🇩🇲1767Dominica34\nDK🇩🇰45Denmark44\nDO🇩🇴1Dominican Republic334\nDZ🇩🇿213Algeria3222\nEC🇪🇨593Ecuador\nEG🇪🇬20Egypt234\nER🇪🇷291Eritrea133\nES🇪🇸34Spain333\nEE🇪🇪372Estonia\nET🇪🇹251Ethiopia234\nFI🇫🇮358Finland\nFJ🇫🇯679Fiji\nFK🇫🇰500Falkland Islands\nFM🇫🇲691Micronesia\nFO🇫🇴298Faroe Islands33\nFR🇫🇷33France12222\nGA🇬🇦241Gabon1222\nGB🇬🇧44United Kingdom46\nGE🇬🇪995Georgia\nGF🇬🇫594French Guiana\nGH🇬🇭233Ghana\nGI🇬🇮350Gibraltar44\nGL🇬🇱299Greenland33\nGN🇬🇳224Guinea333\nGM🇬🇲220Gambia34\nGP🇬🇵590Guadeloupe\nGU🇬🇺1671Guam34\nGW🇬🇼245Guinea-Bissau34\nGQ🇬🇶240Equatorial Guinea333\nGR🇬🇷30Greece244\nGD🇬🇩1473Grenada34\nGT🇬🇹502Guatemala134\nGY🇬🇾592Guyana\nHK🇭🇰852Hong Kong\nHN🇭🇳504Honduras44\nHR🇭🇷385Croatia\nHT🇭🇹509Haiti\nHU🇭🇺36Hungary234\nID🇮🇩62Indonesia\nIN🇮🇳91India55\nIO🇩🇬246Diego Garcia34\nIE🇮🇪353Ireland234\nIR🇮🇷98Iran334\nIQ🇮🇶964Iraq334\nIS🇮🇸354Iceland34\nIL🇮🇱972Israel234\nIT🇮🇹39Italy334\nJM🇯🇲1876Jamaica34\nJO🇯🇴962Jordan144\nJP🇯🇵81Japan244\nKZ🇰🇿7Kazakhstan3322\nKE🇰🇪254Kenya333\nKG🇰🇬996Kyrgyzstan\nKH🇰🇭855Cambodia\nKI🇰🇮686Kiribati\nKN🇰🇳1869Saint Kitts and Nevis34\nKR🇰🇷82South Korea\nKW🇰🇼965Kuwait44\nKY🇰🇾1345Cayman Islands34\nLA🇱🇦856Laos\nLB🇱🇧961Lebanon\nLR🇱🇷231Liberia\nLY🇱🇾218Libya234\nLC🇱🇨1758Saint Lucia34\nLI🇱🇮423Liechtenstein\nLK🇱🇰94Sri Lanka234\nLS🇱🇸266Lesotho233\nLT🇱🇹370Lithuania35\nLU🇱🇺352Luxembourg\nLV🇱🇻371Latvia35\nMA🇲🇦212Morocco234\nMC🇲🇨377Monaco44\nMD🇲🇩373Moldova233\nMG🇲🇬261Madagascar2232\nMP🇲🇵1670Northern Mariana Islands34\nMO🇲🇴853Macau\nMS🇲🇸1664Montserrat34\nMV🇲🇻960Maldives\nMX🇲🇽52Mexico\nMH🇲🇭692Marshall Islands\nMK🇲🇰389Macedonia\nML🇲🇱223Mali44\nMT🇲🇹356Malta2222\nMM🇲🇲95Myanmar\nME🇲🇪382Montenegro\nMN🇲🇳976Mongolia\nMZ🇲🇿258Mozambique234\nMQ🇲🇶596Martinique\nMR🇲🇷222Mauritania44\nMU🇲🇺230Mauritius\nMW🇲🇼265Malawi\nMY🇲🇾60Malaysia\nNA🇳🇦264Namibia234\nNC🇳🇨687New Caledonia6\nNE🇳🇪227Niger2222\nNF🇳🇫672Norfolk Island\nNG🇳🇬234Nigeria\nNI🇳🇮505Nicaragua44\nNL🇳🇱31Netherlands12222\nNO🇳🇴47Norway44\nNP🇳🇵977Nepal\nNU🇳🇺683Niue\nNR🇳🇷674Nauru\nNZ🇳🇿64New Zealand\nOM🇴🇲968Oman44\nPK🇵🇰92Pakistan334\nPA🇵🇦507Panama44\nPE🇵🇪51Peru333\nPF🇵🇫689French Polynesia\nPH🇵🇭63Philippines334\nPM🇵🇲508Saint Pierre and Miquelon\nPR🇵🇷1Puerto Rico334\nPS🇵🇸970Palestine324\nPW🇵🇼680Palau\nPG🇵🇬675Papua New Guinea\nPL🇵🇱48Poland333\nKP🇰🇵850North Korea\nPT🇵🇹351Portugal144\nPY🇵🇾595Paraguay333\nQA🇶🇦974Qatar\nRE🇷🇪262Réunion333\nRO🇷🇴40Romania333\nRU🇷🇺7Russia3322\nRW🇷🇼250Rwanda333\nSA🇸🇦966Saudi Arabia\nSD🇸🇩249Sudan234\nSN🇸🇳221Senegal234\nSG🇸🇬65Singapore44\nSH🇸🇭290Saint Helena23\nSH🇸🇭247Saint Helena4\nSB🇸🇧677Solomon Islands\nSL🇸🇱232Sierra Leone233\nSV🇸🇻503El Salvador44\nSM🇸🇲378San Marino334\nSO🇸🇴252Somalia233\nRS🇷🇸381Serbia234\nSS🇸🇸211South Sudan234\nST🇸🇹239São Tomé and Príncipe25\nSR🇸🇷597Suriname34\nSK🇸🇰421Slovakia\nSI🇸🇮386Slovenia\nSE🇸🇪46Sweden234\nSZ🇸🇿268Swaziland44\nSC🇸🇨248Seychelles1222\nSX🇸🇽1721Sint Maarten34\nSY🇸🇾963Syria\nTC🇹🇨1649Turks and Caicos Islands34\nTD🇹🇩235Chad2222\nTG🇹🇬228Togo233\nTH🇹🇭66Thailand144\nTJ🇹🇯992Tajikistan\nTK🇹🇰690Tokelau\nTM🇹🇲993Turkmenistan26\nTL🇹🇱670Timor-Leste\nTO🇹🇴676Tonga\nTT🇹🇹1868Trinidad and Tobago34\nTN🇹🇳216Tunisia233\nTR🇹🇷90Turkey334\nTV🇹🇻688Tuvalu\nTW🇹🇼886Taiwan\nTZ🇹🇿255Tanzania234\nUG🇺🇬256Uganda234\nUA🇺🇦380Ukraine2322\nUY🇺🇾598Uruguay44\nUS🇺🇸1United States334\nUZ🇺🇿998Uzbekistan27\nVA🇻🇦3Vatican City\nVC🇻🇨1784Saint Vincent and the Grenadines34\nVE🇻🇪58Venezuela334\nVG🇻🇬1284British Virgin Islands34\nVI🇻🇮1340US Virgin Islands34\nVN🇻🇳84Vietnam\nVU🇻🇺678Vanuatu\nWF🇼🇫681Wallis and Futuna\nWS🇼🇸685Samoa\nXK🇽🇰383Kosovo44\nYE🇾🇪967Yemen333\nZA🇿🇦27South Africa234\nZM🇿🇲260Zambia234\nZW🇿🇼263Zimbabwe234`;\n\nconst formatsCache: Record = {};\nexport const defaultPhoneNumberFormat = /(\\d{1,3})(\\d{1,3})?(\\d{1,3})?(\\d{1,3})?(\\d{1,3})?/;\n\nconst parsed = DATA\n .split('\\n')\n .map((str) => {\n const id = str.substr(0, 2);\n const flag = str.substr(2, 4);\n const code = `+${str.match(/\\d+/)![0]}`;\n const name = str.split(/\\d+/)[1];\n const format = str.match(/\\d+$/);\n const phoneFormat = getPhoneNumberFormat(format);\n\n return {\n id, flag, code, name, phoneFormat,\n };\n });\n\nfunction getPhoneNumberFormat(format: RegExpMatchArray | null) {\n if (!format) {\n return defaultPhoneNumberFormat;\n }\n\n const formatValue = format[0] as string;\n let phoneNumberFormat;\n\n if (!formatsCache[formatValue]) {\n const phoneNumberGroups = formatValue.split('').map(Number);\n phoneNumberFormat = phoneNumberGroups.reduce((result, count, i) => {\n return `${result}(\\\\d{1,${count}})${i > 0 ? '?' : ''}`;\n }, '');\n formatsCache[formatValue] = new RegExp(`${phoneNumberFormat}${'()?'.repeat(5 - phoneNumberGroups.length)}`);\n }\n\n return formatsCache[formatValue];\n}\n\nexport default parsed;\n","import countryList, { defaultPhoneNumberFormat } from './countries';\n\nexport function getCountryById(id: string) {\n return countryList.find((c) => c.id === id) as Country;\n}\n\n// Empty groups are used to preserve 5 callback arguments for `replace` method\nfunction getPhoneNumberFormat(country?: Country) {\n return country ? country.phoneFormat : defaultPhoneNumberFormat;\n}\n\nexport function getCountryFromPhoneNumber(input: string) {\n let phoneNumber = input.replace(/[^\\d+]+/g, '');\n if (!phoneNumber.startsWith('+')) {\n phoneNumber = `+${phoneNumber}`;\n }\n\n const possibleCountries = countryList\n .filter((country: Country) => phoneNumber.startsWith(country.code))\n .sort((a, b) => a.code.length - b.code.length);\n\n return possibleCountries[possibleCountries.length - 1];\n}\n\nexport function formatPhoneNumber(input: string, country?: Country) {\n let phoneNumber = input.replace(/[^\\d]+/g, '');\n if (country) {\n phoneNumber = phoneNumber.substr(country.code.length - 1);\n } else if (input.startsWith('+')) {\n return input;\n }\n\n phoneNumber = phoneNumber.replace(getPhoneNumberFormat(country), (_, p1, p2, p3, p4, p5) => {\n const separator = country && country.id === 'GB' ? ' ' : '-';\n\n let output = '';\n if (p1) output = `${p1}`;\n if (p2) output += ` ${p2}`;\n if (p3) output += `${separator}${p3}`;\n if (p4) output += `${separator}${p4}`;\n if (p5) output += `${separator}${p5}`;\n return output;\n });\n\n return phoneNumber;\n}\n\nexport function formatPhoneNumberWithCode(phoneNumber: string) {\n const numberWithPlus = phoneNumber.startsWith('+') ? phoneNumber : `+${phoneNumber}`;\n const country = getCountryFromPhoneNumber(numberWithPlus);\n if (!country) {\n return numberWithPlus;\n }\n return `${country.code} ${formatPhoneNumber(numberWithPlus, country)}`;\n}\n\nexport { countryList };\n","import { useEffect } from '../lib/teact/teact';\n\nimport {\n BundleModules, Bundles, getModuleFromMemory, loadModule, addLoadListener,\n} from '../util/moduleLoader';\n\nimport useForceUpdate from './useForceUpdate';\n\nexport default >(\n bundleName: B, moduleName: M, noLoad = false, autoUpdate = false,\n) => {\n const module = getModuleFromMemory(bundleName, moduleName);\n const forceUpdate = useForceUpdate();\n\n if (autoUpdate) {\n // Use effect and cleanup for listener removal\n addLoadListener(forceUpdate);\n }\n\n useEffect(() => {\n if (!noLoad && !module) {\n loadModule(bundleName, moduleName).then(forceUpdate);\n }\n }, [bundleName, forceUpdate, module, moduleName, noLoad]);\n\n return module;\n};\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default (initial = false): [boolean, AnyToVoidFunction, AnyToVoidFunction] => {\n const [value, setValue] = useState(initial);\n\n const setTrue = useCallback(() => {\n setValue(true);\n }, []);\n\n const setFalse = useCallback(() => {\n setValue(false);\n }, []);\n\n return [value, setTrue, setFalse];\n};\n","import React, { FC } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Spinner.scss';\n\nconst Spinner: FC<{\n color?: 'blue' | 'white' | 'black' | 'green' | 'gray';\n withBackground?: boolean;\n}> = ({\n color = 'blue',\n withBackground,\n}) => {\n return (\n
\n
\n
\n );\n};\n\nexport default Spinner;\n","import { DEBUG_ALERT_MSG } from '../config';\nimport { throttle } from './schedulers';\n\nwindow.addEventListener('error', handleErrorEvent);\nwindow.addEventListener('unhandledrejection', handleErrorEvent);\n\n// eslint-disable-next-line prefer-destructuring\nconst APP_ENV = process.env.APP_ENV;\n\nfunction handleErrorEvent(e: ErrorEvent | PromiseRejectionEvent) {\n e.preventDefault();\n\n handleError(e instanceof ErrorEvent ? e.error : e.reason);\n}\n\nconst throttledAlert = throttle(window.alert, 1000);\n\nexport function handleError(err: Error) {\n // eslint-disable-next-line no-console\n console.error(err);\n\n if (APP_ENV === 'development' || APP_ENV === 'staging') {\n throttledAlert(`${DEBUG_ALERT_MSG}\\n\\n${(err && err.message) || err}\\n${err && err.stack}`);\n }\n}\n","export default function arePropsShallowEqual(currentProps: AnyLiteral, newProps: AnyLiteral) {\n if (currentProps === newProps) {\n return true;\n }\n\n const currentKeys = Object.keys(currentProps);\n const currentKeysLength = currentKeys.length;\n const newKeysLength = Object.keys(newProps).length;\n\n if (currentKeysLength !== newKeysLength) {\n return false;\n }\n\n if (currentKeysLength === 0) {\n return true;\n }\n\n for (let i = 0; i < currentKeysLength; i++) {\n const prop = currentKeys[i];\n if (currentProps[prop] !== newProps[prop]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function getUnequalProps(currentProps: AnyLiteral, newProps: AnyLiteral) {\n const currentKeys = Object.keys(currentProps);\n const currentKeysLength = currentKeys.length;\n const newKeysLength = Object.keys(newProps).length;\n\n if (currentKeysLength !== newKeysLength) {\n return ['%LENGTH%'];\n }\n\n return currentKeys.reduce((res, prop) => {\n if (currentProps[prop] !== newProps[prop]) {\n res.push(`${prop}: ${currentProps[prop]} => ${newProps[prop]}`);\n }\n\n return res;\n }, [] as string[]);\n}\n","import { useRef } from '../lib/teact/teact';\n\nfunction usePrevious(next: T): T | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined: true): Exclude | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined?: boolean): Exclude | undefined;\nfunction usePrevious(next: T, shouldSkipUndefined?: boolean) {\n const ref = useRef();\n const { current } = ref;\n if (!shouldSkipUndefined || next !== undefined) {\n ref.current = next;\n }\n\n return current;\n}\n\nexport default usePrevious;\n","import { LangFn } from '../hooks/useLang';\n\nconst WEEKDAYS_FULL = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst MONTHS_FULL = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n];\n\nconst MONTHS_FULL_LOWERCASE = MONTHS_FULL.map((month) => month.toLowerCase());\nconst MIN_SEARCH_YEAR = 2015;\nconst MAX_DAY_IN_MONTH = 31;\nconst MAX_MONTH_IN_YEAR = 12;\nexport const MILISECONDS_IN_DAY = 24 * 60 * 60 * 1000;\n\nexport function getDayStart(datetime: number | Date) {\n const date = new Date(datetime);\n date.setHours(0, 0, 0, 0);\n return date;\n}\n\nexport function getDayStartAt(datetime: number | Date) {\n return getDayStart(datetime).getTime();\n}\n\nexport function toYearMonth(timestamp: number) {\n const date = new Date(timestamp * 1000);\n return `${date.getFullYear()}-${date.getMonth()}`;\n}\n\nfunction toIsoString(date: Date) {\n return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;\n}\n\nexport function formatTime(datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n\n return `${hours}:${minutes}`;\n}\n\nexport function formatPastTimeShort(lang: LangFn, datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n const today = getDayStart(new Date());\n if (date >= today) {\n return formatTime(date);\n }\n\n const weekAgo = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n if (date >= weekAgo) {\n return lang(`Weekday.Short${WEEKDAYS_FULL[date.getDay()]}`);\n }\n\n const withYear = date.getFullYear() !== today.getFullYear();\n const format = (\n lang(withYear ? 'formatDateScheduleYear' : 'formatDateSchedule')\n || (withYear ? 'd MMM yyyy' : 'd MMM')\n );\n\n return formatDate(lang, date, format);\n}\n\nexport function formatFullDate(lang: LangFn, datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const format = lang('formatterYearMax') || 'dd.MM.yyyy';\n\n return formatDate(lang, date, format);\n}\n\nexport function formatMonthAndYear(lang: LangFn, date: Date, isShort = false) {\n const format = lang(isShort ? 'formatterMonthYear2' : 'formatterMonthYear') || 'MMM yyyy';\n\n return formatDate(lang, date, format);\n}\n\nexport function formatHumanDate(lang: LangFn, datetime: number | Date, isShort = false, noWeekdays = false) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n const today = getDayStart(new Date());\n\n if (!noWeekdays) {\n if (toIsoString(date) === toIsoString(today)) {\n return (isShort ? lowerFirst : upperFirst)(lang('Weekday.Today'));\n }\n\n const yesterday = new Date(today);\n yesterday.setDate(today.getDate() - 1);\n if (toIsoString(date) === toIsoString(yesterday)) {\n return (isShort ? lowerFirst : upperFirst)(lang('Weekday.Yesterday'));\n }\n\n const weekAgo = new Date(today);\n const weekAhead = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n weekAhead.setDate(today.getDate() + 7);\n if (date >= weekAgo && date <= weekAhead) {\n const weekDay = WEEKDAYS_FULL[date.getDay()];\n return isShort\n ? lowerFirst(lang(`Weekday.Short${weekDay}`))\n : upperFirst(lang(`Weekday.${weekDay}`));\n }\n }\n\n const withYear = date.getFullYear() !== today.getFullYear();\n const formatKey = isShort\n ? (withYear ? 'formatDateScheduleYear' : 'formatDateSchedule')\n : (withYear ? 'chatFullDate' : 'chatDate');\n const format = lang(formatKey) || 'd MMMM yyyy';\n\n return (isShort ? lowerFirst : upperFirst)(formatDate(lang, date, format));\n}\n\nfunction formatDate(lang: LangFn, date: Date, format: string) {\n const day = date.getDate();\n const monthIndex = date.getMonth();\n\n return format\n .replace('LLLL', lang(MONTHS_FULL[monthIndex]))\n .replace('MMMM', lang(`Month.Gen${MONTHS_FULL[monthIndex]}`))\n .replace('MMM', lang(`Month.Short${MONTHS_FULL[monthIndex]}`))\n .replace('MM', String(monthIndex + 1).padStart(2, '0'))\n .replace('dd', String(day).padStart(2, '0'))\n .replace('d', String(day))\n .replace('yyyy', String(date.getFullYear()));\n}\n\nexport function formatMediaDateTime(lang: LangFn, datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n return `${formatHumanDate(lang, date, true)}, ${formatTime(date)}`;\n}\n\nexport function formatMediaDuration(duration: number) {\n const hours = Math.floor(duration / 3600);\n const minutes = Math.floor((duration % 3600) / 60);\n const seconds = Math.floor(duration % 3600 % 60);\n\n let string = '';\n if (hours > 0) {\n string += `${String(hours).padStart(2, '0')}:`;\n string += `${String(minutes).padStart(2, '0')}:`;\n } else {\n string += `${String(minutes)}:`;\n }\n string += String(seconds).padStart(2, '0');\n\n return string;\n}\n\nexport function formatVoiceRecordDuration(durationInMs: number) {\n const parts = [];\n\n let milliseconds = durationInMs % 1000;\n durationInMs -= milliseconds;\n milliseconds = Math.floor(milliseconds / 10);\n\n durationInMs = Math.floor(durationInMs / 1000);\n const seconds = durationInMs % 60;\n durationInMs -= seconds;\n\n durationInMs = Math.floor(durationInMs / 60);\n const minutes = durationInMs % 60;\n durationInMs -= minutes;\n\n durationInMs = Math.floor(durationInMs / 60);\n const hours = durationInMs % 60;\n\n if (hours > 0) {\n parts.push(String(hours).padStart(2, '0'));\n }\n parts.push(String(minutes).padStart(hours > 0 ? 2 : 1, '0'));\n parts.push(String(seconds).padStart(2, '0'));\n\n return `${parts.join(':')},${String(milliseconds).padStart(2, '0')}`;\n}\n\nexport function formatDateToString(date: Date, locale = 'en-US') {\n return date.toLocaleString(\n locale,\n {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n },\n );\n}\n\nfunction isValidDate(day: number, month: number, year = 2021): boolean {\n if (month > (MAX_MONTH_IN_YEAR - 1) || day > MAX_DAY_IN_MONTH) {\n return false;\n }\n const date = new Date(year, month, day);\n return !Number.isNaN(date.getTime()) && date.getDate() === day;\n}\n\nexport function parseDateString(query = ''): string | undefined {\n const matchStringDate = query.match(/\\d{1,2}\\s[a-zA-Z]{3,}/);\n const matchEuropeStringDate = query.match(/[a-zA-Z]{3,}\\s\\d{1,2}/);\n const matchNumberDate = query.match(/\\d{1,2}[./-]\\d{1,2}([./-]\\d{2,4})?/);\n if (!matchStringDate && !matchNumberDate && !matchEuropeStringDate) {\n return undefined;\n }\n\n if (matchNumberDate) {\n const [date, month, year] = query.split(/[./-]/).map(Number);\n return !(year && year < MIN_SEARCH_YEAR) && isValidDate(date, month - 1, year || undefined)\n ? `${year ? `${year}-` : ''}${String(month).padStart(2, '0')}-${String(date).padStart(2, '0')}`\n : undefined;\n }\n\n const dateParts = query.split(' ');\n const date = matchStringDate ? dateParts[0] : dateParts[1];\n const month = (matchStringDate ? dateParts[1] : dateParts[0]).toLowerCase();\n const monthIndex = MONTHS_FULL_LOWERCASE.findIndex((item) => item.startsWith(month));\n\n return monthIndex !== -1 && isValidDate(Number(date), monthIndex)\n ? `${String(monthIndex + 1).padStart(2, '0')}-${String(date).padStart(2, '0')}`\n : undefined;\n}\n\nexport function timestampPlusDay(timestamp: number) {\n return timestamp + MILISECONDS_IN_DAY / 1000;\n}\n\nfunction lowerFirst(str: string) {\n return `${str[0].toLowerCase()}${str.slice(1)}`;\n}\n\nfunction upperFirst(str: string) {\n return `${str[0].toUpperCase()}${str.slice(1)}`;\n}\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default () => {\n const [, setTrigger] = useState(false);\n\n return useCallback(() => {\n setTrigger((trigger) => !trigger);\n }, []);\n};\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Link.scss';\n\ntype OwnProps = {\n children: any;\n className?: string;\n isRtl?: boolean;\n onClick?: (e: React.MouseEvent) => void;\n};\n\nconst Link: FC = ({\n children, className, isRtl, onClick,\n}) => {\n const handleClick = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n onClick!(e);\n }, [onClick]);\n\n return (\n \n {children}\n \n );\n};\n\nexport default Link;\n","export default (store: AnyLiteral) => {\n let id;\n\n do {\n id = String(Math.random()).replace('0.', 'id');\n } while (store.hasOwnProperty(id));\n\n return id;\n};\n","import { callApi } from '../api/gramjs';\nimport { ApiChat, ApiMessage, ApiUser } from '../api/types';\nimport { renderActionMessageText } from '../components/common/helpers/renderActionMessageText';\nimport { DEBUG } from '../config';\nimport { getDispatch, getGlobal, setGlobal } from '../lib/teact/teactn';\nimport {\n getChatTitle,\n getMessageAction,\n getMessageSenderName,\n getMessageSummaryText,\n getPrivateChatUserId,\n isActionMessage,\n isChatChannel,\n selectIsChatMuted,\n} from '../modules/helpers';\nimport { getTranslation } from './langProvider';\nimport { addNotifyExceptions, replaceSettings } from '../modules/reducers';\nimport {\n selectChatMessage, selectNotifyExceptions, selectNotifySettings, selectUser,\n} from '../modules/selectors';\nimport { IS_SERVICE_WORKER_SUPPORTED } from './environment';\n\nfunction getDeviceToken(subscription: PushSubscription) {\n const data = subscription.toJSON();\n return JSON.stringify({\n endpoint: data.endpoint,\n keys: data.keys,\n });\n}\n\nfunction checkIfPushSupported() {\n if (!IS_SERVICE_WORKER_SUPPORTED) return false;\n if (!('showNotification' in ServiceWorkerRegistration.prototype)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] Push notifications aren\\'t supported.');\n }\n return false;\n }\n\n // Check the current Notification permission.\n // If its denied, it's a permanent block until the\n // user changes the permission\n if (Notification.permission === 'denied') {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n return false;\n }\n\n // Check if push messaging is supported\n if (!('PushManager' in window)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] Push messaging isn\\'t supported.');\n }\n return false;\n }\n return true;\n}\n\nfunction checkIfNotificationsSupported() {\n // Let's check if the browser supports notifications\n if (!('Notification' in window)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] This browser does not support desktop notification');\n }\n return false;\n }\n\n if (Notification.permission === 'denied' as NotificationPermission) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n return false;\n }\n return true;\n}\n\nconst expirationTime = 12 * 60 * 60 * 1000; // 12 hours\n\nfunction checkIfShouldResubscribe(subscription: PushSubscription | null) {\n const global = getGlobal();\n if (!global.push || !subscription) return true;\n if (getDeviceToken(subscription) !== global.push.deviceToken) return true;\n return Date.now() - global.push.subscribedAt > expirationTime;\n}\n\nasync function requestPermission() {\n if (!('Notification' in window)) return;\n if (!['granted', 'denied'].includes(Notification.permission)) {\n await Notification.requestPermission();\n }\n}\n\nasync function unsubscribeFromPush(subscription: PushSubscription | null) {\n const global = getGlobal();\n const dispatch = getDispatch();\n if (subscription) {\n try {\n const deviceToken = getDeviceToken(subscription);\n await callApi('unregisterDevice', deviceToken);\n await subscription.unsubscribe();\n dispatch.deleteDeviceToken();\n return;\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unable to unsubscribe from push.', error);\n }\n }\n }\n if (global.push) {\n await callApi('unregisterDevice', global.push.deviceToken);\n dispatch.deleteDeviceToken();\n }\n}\n\nexport async function unsubscribe() {\n if (!checkIfPushSupported()) return;\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n const subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n await unsubscribeFromPush(subscription);\n}\n\n// Indicates if notification settings are loaded from the api\nlet areSettingsLoaded = false;\n\n// Load notification settings from the api\nasync function loadNotificationSettings() {\n if (areSettingsLoaded) return;\n const [resultSettings, resultExceptions] = await Promise.all([\n callApi('fetchNotificationSettings', {\n serverTimeOffset: getGlobal().serverTimeOffset,\n }),\n callApi('fetchNotificationExceptions', {\n serverTimeOffset: getGlobal().serverTimeOffset,\n }),\n ]);\n if (!resultSettings) return;\n\n let global = replaceSettings(getGlobal(), resultSettings);\n if (resultExceptions) {\n global = addNotifyExceptions(global, resultExceptions);\n }\n setGlobal(global);\n areSettingsLoaded = true;\n}\n\nexport async function subscribe() {\n if (!checkIfPushSupported()) {\n // Ask for notification permissions only if service worker notifications are not supported\n // As pushManager.subscribe automatically triggers permission popup\n await requestPermission();\n return;\n }\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n let subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n if (!checkIfShouldResubscribe(subscription)) return;\n await unsubscribeFromPush(subscription);\n try {\n subscription = await serviceWorkerRegistration.pushManager.subscribe({\n userVisibleOnly: true,\n });\n const deviceToken = getDeviceToken(subscription);\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Received push subscription: ', deviceToken);\n }\n await callApi('registerDevice', deviceToken);\n getDispatch()\n .setDeviceToken(deviceToken);\n } catch (error) {\n if (Notification.permission === 'denied' as NotificationPermission) {\n // The user denied the notification permission which\n // means we failed to subscribe and the user will need\n // to manually change the notification permission to\n // subscribe to push messages\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n } else if (DEBUG) {\n // A problem occurred with the subscription, this can\n // often be down to an issue or lack of the gcm_sender_id\n // and / or gcm_user_visible_only\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unable to subscribe to push.', error);\n\n // Request permissions and fall back to local notifications\n // if pushManager.subscribe was aborted due to invalid VAPID key.\n if (error.code === DOMException.ABORT_ERR) {\n await requestPermission();\n }\n }\n }\n}\n\nfunction checkIfShouldNotify(chat: ApiChat, isActive: boolean) {\n if (!areSettingsLoaded) return false;\n const global = getGlobal();\n if (selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)) || chat.isNotJoined\n || !chat.isListed) {\n return false;\n }\n // Dont show notification for active chat if client has focus\n return !(isActive && document.hasFocus());\n}\n\nfunction getNotificationContent(chat: ApiChat, message: ApiMessage) {\n const global = getGlobal();\n const {\n senderId,\n replyToMessageId,\n } = message;\n const messageSender = senderId ? selectUser(global, senderId) : undefined;\n const messageAction = getMessageAction(message as ApiMessage);\n const actionTargetMessage = messageAction && replyToMessageId\n ? selectChatMessage(global, chat.id, replyToMessageId)\n : undefined;\n const {\n targetUserIds: actionTargetUserIds,\n targetChatId: actionTargetChatId,\n } = messageAction || {};\n\n const actionTargetUsers = actionTargetUserIds\n ? actionTargetUserIds.map((userId) => selectUser(global, userId)).filter(Boolean as any)\n : undefined;\n const privateChatUserId = getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n let body: string;\n if (isActionMessage(message)) {\n const actionOrigin = chat && (isChatChannel(chat) || message.senderId === message.chatId)\n ? chat\n : messageSender;\n body = renderActionMessageText(\n getTranslation,\n message,\n actionOrigin,\n actionTargetUsers,\n actionTargetMessage,\n actionTargetChatId,\n { asPlain: true },\n ) as string;\n } else {\n const senderName = getMessageSenderName(getTranslation, chat.id, messageSender);\n const summary = getMessageSummaryText(getTranslation, message);\n\n body = senderName ? `${senderName}: ${summary}` : summary;\n }\n\n return {\n title: getChatTitle(getTranslation, chat, privateChatUser),\n body,\n };\n}\n\nexport async function showNewMessageNotification({\n chat,\n message,\n isActiveChat,\n}: { chat: ApiChat; message: Partial; isActiveChat: boolean}) {\n if (!checkIfNotificationsSupported()) return;\n if (!message.id) return;\n\n await loadNotificationSettings();\n if (!checkIfShouldNotify(chat, isActiveChat)) return;\n\n const {\n title,\n body,\n } = getNotificationContent(chat, message as ApiMessage);\n\n if (checkIfPushSupported()) {\n if (navigator.serviceWorker.controller) {\n // notify service worker about new message notification\n navigator.serviceWorker.controller.postMessage({\n type: 'newMessageNotification',\n payload: {\n title,\n body,\n chatId: chat.id,\n messageId: message.id,\n },\n });\n }\n } else {\n const dispatch = getDispatch();\n const options: NotificationOptions = {\n body,\n icon: 'icon-192x192.png',\n badge: 'icon-192x192.png',\n tag: message.id.toString(),\n };\n\n if ('vibrate' in navigator) {\n options.vibrate = [200, 100, 200];\n }\n\n const notification = new Notification(title, options);\n\n notification.onclick = () => {\n notification.close();\n dispatch.focusMessage({\n chatId: chat.id,\n messageId: message.id,\n });\n if (window.focus) {\n window.focus();\n }\n };\n }\n}\n\n// Notify service worker that client is fully loaded\nexport function notifyClientReady() {\n if (!navigator.serviceWorker.controller) return;\n navigator.serviceWorker.controller.postMessage({\n type: 'clientReady',\n });\n}\n","import { ApiChat, ApiUser } from '../../api/types';\n\nimport { SERVICE_NOTIFICATIONS_USER_ID } from '../../config';\nimport { formatFullDate, formatTime } from '../../util/dateFormat';\nimport { orderBy } from '../../util/iteratees';\nimport { LangFn } from '../../hooks/useLang';\n\nconst USER_COLOR_KEYS = [1, 8, 5, 2, 7, 4, 6];\n\nexport function getUserFirstOrLastName(user?: ApiUser) {\n if (!user) {\n return undefined;\n }\n\n switch (user.type) {\n case 'userTypeBot':\n case 'userTypeRegular': {\n return user.firstName || user.lastName;\n }\n\n case 'userTypeDeleted':\n case 'userTypeUnknown': {\n return 'Deleted';\n }\n\n default:\n return undefined;\n }\n}\n\nexport function getUserFullName(user?: ApiUser) {\n if (!user) {\n return undefined;\n }\n\n if (isDeletedUser(user)) {\n return 'Deleted account';\n }\n\n switch (user.type) {\n case 'userTypeBot':\n case 'userTypeRegular': {\n if (user.firstName && user.lastName) {\n return `${user.firstName} ${user.lastName}`;\n }\n\n if (user.firstName) {\n return user.firstName;\n }\n\n if (user.lastName) {\n return user.lastName;\n }\n\n break;\n }\n\n case 'userTypeDeleted':\n case 'userTypeUnknown': {\n return 'Deleted account';\n }\n }\n\n return undefined;\n}\n\nexport function getUserStatus(lang: LangFn, user: ApiUser, serverTimeOffset: number) {\n if (user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return lang('ServiceNotifications').toLowerCase();\n }\n\n if (user.type && user.type === 'userTypeBot') {\n return lang('Bot');\n }\n\n if (!user.status) {\n return '';\n }\n\n switch (user.status.type) {\n case 'userStatusEmpty': {\n return lang('ALongTimeAgo');\n }\n\n case 'userStatusLastMonth': {\n return lang('WithinAMonth');\n }\n\n case 'userStatusLastWeek': {\n return lang('WithinAWeek');\n }\n\n case 'userStatusOffline': {\n const { wasOnline } = user.status;\n\n if (!wasOnline) return lang('LastSeen.Offline');\n\n const now = new Date(new Date().getTime() + serverTimeOffset * 1000);\n const wasOnlineDate = new Date(wasOnline * 1000);\n\n if (wasOnlineDate >= now) {\n return lang('LastSeen.JustNow');\n }\n\n const diff = new Date(now.getTime() - wasOnlineDate.getTime());\n\n // within a minute\n if (diff.getTime() / 1000 < 60) {\n return lang('LastSeen.JustNow');\n }\n\n // within an hour\n if (diff.getTime() / 1000 < 60 * 60) {\n const minutes = Math.floor(diff.getTime() / 1000 / 60);\n return lang('LastSeen.MinutesAgo', minutes);\n }\n\n // today\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const serverToday = new Date(today.getTime() + serverTimeOffset * 1000);\n if (wasOnlineDate > serverToday) {\n // up to 6 hours ago\n if (diff.getTime() / 1000 < 6 * 60 * 60) {\n const hours = Math.floor(diff.getTime() / 1000 / 60 / 60);\n return lang('LastSeen.HoursAgo', hours);\n }\n\n // other\n return lang('LastSeen.TodayAt', formatTime(wasOnlineDate));\n }\n\n // yesterday\n const yesterday = new Date();\n yesterday.setDate(now.getDate() - 1);\n yesterday.setHours(0, 0, 0, 0);\n const serverYesterday = new Date(yesterday.getTime() + serverTimeOffset * 1000);\n if (wasOnlineDate > serverYesterday) {\n return lang('LastSeen.YesterdayAt', formatTime(wasOnlineDate));\n }\n\n return lang('LastSeen.AtDate', formatFullDate(lang, wasOnlineDate));\n }\n\n case 'userStatusOnline': {\n return lang('Online');\n }\n\n case 'userStatusRecently': {\n return lang('Lately');\n }\n\n default:\n return undefined;\n }\n}\n\nexport function isUserOnline(user: ApiUser) {\n const { id, status, type } = user;\n\n if (!status) {\n return false;\n }\n\n if (id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return status.type === 'userStatusOnline' && type !== 'userTypeBot';\n}\n\nexport function isDeletedUser(user: ApiUser) {\n if (!user.status || user.type === 'userTypeBot' || user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return user.type === 'userTypeDeleted'\n || user.type === 'userTypeUnknown';\n}\n\nexport function isUserBot(user: ApiUser) {\n return user.type === 'userTypeBot';\n}\n\nexport function sortUserIds(\n userIds: number[],\n usersById: Record,\n priorityIds?: number[],\n serverTimeOffset = 0,\n) {\n return orderBy(userIds, (id) => {\n const now = Date.now() / 1000 + serverTimeOffset;\n\n if (priorityIds && priorityIds.includes(id)) {\n // Assuming that online status expiration date can't be as far as two days from now,\n // this should place prioritized on top of the list.\n // Then we subtract index of `id` in `priorityIds` to preserve selected order\n return now + (48 * 60 * 60) - (priorityIds.length - priorityIds.indexOf(id));\n }\n\n const user = usersById[id];\n if (!user || !user.status) {\n return 0;\n }\n\n if (user.status.type === 'userStatusOnline') {\n return user.status.expires;\n } else if (user.status.type === 'userStatusOffline' && user.status.wasOnline) {\n return user.status.wasOnline;\n }\n\n switch (user.status.type) {\n case 'userStatusRecently':\n return now - 60 * 60 * 24;\n case 'userStatusLastWeek':\n return now - 60 * 60 * 24 * 7;\n case 'userStatusLastMonth':\n return now - 60 * 60 * 24 * 7 * 30;\n default:\n return 0;\n }\n }, 'desc');\n}\n\n// eslint-disable-next-line max-len\n// https://github.com/telegramdesktop/tdesktop/blob/371510cfe23b0bd226de8c076bc49248fbe40c26/Telegram/SourceFiles/data/data_peer.cpp#L53\nexport function getUserColorKey(peer: ApiUser | ApiChat | undefined) {\n const index = peer ? Math.abs(peer.id) % 7 : 0;\n\n return USER_COLOR_KEYS[index];\n}\n","import {\n ApiChat,\n ApiUser,\n ApiChatBannedRights,\n ApiChatAdminRights,\n ApiChatFolder,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { NotifyException, NotifySettings } from '../../types';\nimport { LangFn } from '../../hooks/useLang';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { orderBy } from '../../util/iteratees';\nimport { getUserFirstOrLastName } from './users';\nimport { formatDateToString, formatTime } from '../../util/dateFormat';\n\nconst FOREVER_BANNED_DATE = Date.now() / 1000 + 31622400; // 366 days\n\nconst VERIFIED_PRIORITY_BASE = 3e9;\nconst PINNED_PRIORITY_BASE = 3e8;\n\nexport function isChatPrivate(chatId: number) {\n return chatId > 0;\n}\n\nexport function isChatGroup(chat: ApiChat) {\n return isChatBasicGroup(chat) || isChatSuperGroup(chat);\n}\n\nexport function isChatBasicGroup(chat: ApiChat) {\n return chat.type === 'chatTypeBasicGroup';\n}\n\nexport function isChatSuperGroup(chat: ApiChat) {\n return chat.type === 'chatTypeSuperGroup';\n}\n\nexport function isChatChannel(chat: ApiChat) {\n return chat.type === 'chatTypeChannel';\n}\n\nexport function isCommonBoxChat(chat: ApiChat) {\n return chat.type === 'chatTypePrivate' || chat.type === 'chatTypeBasicGroup';\n}\n\nexport function getChatTypeString(chat: ApiChat) {\n switch (chat.type) {\n case 'chatTypePrivate':\n return 'PrivateChat';\n case 'chatTypeBasicGroup':\n case 'chatTypeSuperGroup':\n return 'AccDescrGroup';\n case 'chatTypeChannel':\n return 'AccDescrChannel';\n default:\n return 'Chat';\n }\n}\n\nexport function getPrivateChatUserId(chat: ApiChat) {\n if (chat.type !== 'chatTypePrivate' && chat.type !== 'chatTypeSecret') {\n return undefined;\n }\n return chat.id;\n}\n\n// TODO Get rid of `user`\nexport function getChatTitle(lang: LangFn, chat: ApiChat, user?: ApiUser, isSelf = false) {\n if (isSelf || (user && chat.id === user.id && user.isSelf)) {\n return lang('SavedMessages');\n }\n return chat.title || lang('HiddenName');\n}\n\nexport function getChatDescription(chat: ApiChat) {\n if (!chat.fullInfo) {\n return undefined;\n }\n return chat.fullInfo.about;\n}\n\nexport function getChatLink(chat: ApiChat) {\n const { username } = chat;\n if (username) {\n return `https://t.me/${username}`;\n }\n\n const { inviteLink } = chat.fullInfo || {};\n\n return inviteLink;\n}\n\nexport function getChatAvatarHash(\n owner: ApiChat | ApiUser,\n size: 'normal' | 'big' = 'normal',\n) {\n if (!owner.avatarHash) {\n return undefined;\n }\n\n switch (size) {\n case 'big':\n return `profile${owner.id}?${owner.avatarHash}`;\n default:\n return `avatar${owner.id}?${owner.avatarHash}`;\n }\n}\n\nexport function isChatSummaryOnly(chat: ApiChat) {\n return !chat.lastMessage;\n}\n\nexport function isChatAdmin(chat: ApiChat) {\n return Boolean(chat.adminRights);\n}\n\nexport function getHasAdminRight(chat: ApiChat, key: keyof ApiChatAdminRights) {\n return chat.adminRights ? chat.adminRights[key] : false;\n}\n\nexport function isUserRightBanned(chat: ApiChat, key: keyof ApiChatBannedRights) {\n return Boolean(\n (chat.currentUserBannedRights && chat.currentUserBannedRights[key])\n || (chat.defaultBannedRights && chat.defaultBannedRights[key]),\n );\n}\n\nexport function getCanPostInChat(chat: ApiChat, threadId: number) {\n if (threadId !== MAIN_THREAD_ID) {\n return true;\n }\n\n if (chat.isRestricted || chat.migratedTo || chat.isNotJoined) {\n return false;\n }\n\n if (chat.isCreator) {\n return true;\n }\n\n if (isChatPrivate(chat.id)) {\n return true;\n }\n\n if (isChatChannel(chat)) {\n return getHasAdminRight(chat, 'postMessages');\n }\n\n return isChatAdmin(chat) || !isUserRightBanned(chat, 'sendMessages');\n}\n\nexport interface IAllowedAttachmentOptions {\n canAttachMedia: boolean;\n canAttachPolls: boolean;\n canSendStickers: boolean;\n canSendGifs: boolean;\n canAttachEmbedLinks: boolean;\n}\n\nexport function getAllowedAttachmentOptions(chat?: ApiChat, isChatWithBot = false): IAllowedAttachmentOptions {\n if (!chat) {\n return {\n canAttachMedia: false,\n canAttachPolls: false,\n canSendStickers: false,\n canSendGifs: false,\n canAttachEmbedLinks: false,\n };\n }\n\n const isAdmin = isChatAdmin(chat);\n\n return {\n canAttachMedia: isAdmin || !isUserRightBanned(chat, 'sendMedia'),\n canAttachPolls: (isAdmin || !isUserRightBanned(chat, 'sendPolls')) && (!isChatPrivate(chat.id) || isChatWithBot),\n canSendStickers: isAdmin || !isUserRightBanned(chat, 'sendStickers'),\n canSendGifs: isAdmin || !isUserRightBanned(chat, 'sendGifs'),\n canAttachEmbedLinks: isAdmin || !isUserRightBanned(chat, 'embedLinks'),\n };\n}\n\nexport function getMessageSendingRestrictionReason(\n lang: LangFn, currentUserBannedRights?: ApiChatBannedRights, defaultBannedRights?: ApiChatBannedRights,\n) {\n if (currentUserBannedRights && currentUserBannedRights.sendMessages) {\n const { untilDate } = currentUserBannedRights;\n return untilDate && untilDate < FOREVER_BANNED_DATE\n ? lang(\n 'Channel.Persmission.Denied.SendMessages.Until',\n lang(\n 'formatDateAtTime',\n [formatDateToString(new Date(untilDate * 1000), lang.code), formatTime(untilDate * 1000)],\n ),\n )\n : lang('Channel.Persmission.Denied.SendMessages.Forever');\n }\n\n if (defaultBannedRights && defaultBannedRights.sendMessages) {\n return lang('Channel.Persmission.Denied.SendMessages.DefaultRestrictedText');\n }\n\n return undefined;\n}\n\nexport function getChatSlowModeOptions(chat?: ApiChat) {\n if (!chat || !chat.fullInfo) {\n return undefined;\n }\n\n return chat.fullInfo.slowMode;\n}\n\n\nexport function getChatOrder(chat: ApiChat) {\n return Math.max(\n chat.joinDate || 0,\n chat.draftDate || 0,\n chat.lastMessage ? chat.lastMessage.date : 0,\n );\n}\n\nexport function isChatArchived(chat: ApiChat) {\n return chat.folderId === ARCHIVED_FOLDER_ID;\n}\n\nexport function selectIsChatMuted(\n chat: ApiChat, notifySettings: NotifySettings, notifyExceptions?: Record,\n) {\n return !(notifyExceptions && notifyExceptions[chat.id] && !notifyExceptions[chat.id].isMuted) && (\n chat.isMuted\n || (isChatPrivate(chat.id) && !notifySettings.hasPrivateChatsNotifications)\n || (isChatChannel(chat) && !notifySettings.hasBroadcastNotifications)\n || (isChatGroup(chat) && !notifySettings.hasGroupNotifications)\n );\n}\n\nexport function getCanDeleteChat(chat: ApiChat) {\n return isChatBasicGroup(chat) || ((isChatSuperGroup(chat) || isChatChannel(chat)) && chat.isCreator);\n}\n\nexport function prepareFolderListIds(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n chatIdsCache?: number[],\n) {\n const excludedChatIds = folder.excludedChatIds ? new Set(folder.excludedChatIds) : undefined;\n const includedChatIds = folder.excludedChatIds ? new Set(folder.includedChatIds) : undefined;\n const pinnedChatIds = folder.excludedChatIds ? new Set(folder.pinnedChatIds) : undefined;\n const listIds = (chatIdsCache || Object.keys(chatsById).map(Number))\n .filter((id) => {\n return filterChatFolder(\n chatsById[id],\n folder,\n usersById,\n notifySettings,\n notifyExceptions,\n excludedChatIds,\n includedChatIds,\n pinnedChatIds,\n );\n });\n\n return [listIds, folder.pinnedChatIds] as const;\n}\n\nfunction filterChatFolder(\n chat: ApiChat,\n folder: ApiChatFolder,\n usersById: Record,\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n excludedChatIds?: Set,\n includedChatIds?: Set,\n pinnedChatIds?: Set,\n) {\n if (!chat.isListed) {\n return false;\n }\n\n if (excludedChatIds && excludedChatIds.has(chat.id)) {\n return false;\n }\n\n if (includedChatIds && includedChatIds.has(chat.id)) {\n return true;\n }\n\n if (pinnedChatIds && pinnedChatIds.has(chat.id)) {\n return true;\n }\n\n if (isChatArchived(chat) && folder.excludeArchived) {\n return false;\n }\n\n if (folder.excludeMuted && !chat.unreadMentionsCount && selectIsChatMuted(chat, notifySettings, notifyExceptions)) {\n return false;\n }\n\n if (!chat.unreadCount && !chat.unreadMentionsCount && !chat.hasUnreadMark && folder.excludeRead) {\n return false;\n }\n\n if (isChatPrivate(chat.id)) {\n const privateChatUser = usersById[chat.id];\n\n const isChatWithBot = privateChatUser && privateChatUser.type === 'userTypeBot';\n if (isChatWithBot) {\n if (folder.bots) {\n return true;\n }\n } else {\n if (folder.contacts && privateChatUser && privateChatUser.isContact) {\n return true;\n }\n\n if (folder.nonContacts && privateChatUser && !privateChatUser.isContact) {\n return true;\n }\n }\n } else if (isChatGroup(chat)) {\n return !!folder.groups;\n } else if (isChatChannel(chat)) {\n return !!folder.channels;\n }\n\n return false;\n}\n\nexport function prepareChatList(\n chatsById: Record,\n listIds: number[],\n orderedPinnedIds?: number[],\n folderType: 'all' | 'archived' | 'folder' = 'all',\n) {\n function chatFilter(chat?: ApiChat) {\n if (!chat || !chat.lastMessage || chat.migratedTo) {\n return false;\n }\n\n switch (folderType) {\n case 'all':\n if (isChatArchived(chat)) {\n return false;\n }\n break;\n case 'archived':\n if (!isChatArchived(chat)) {\n return false;\n }\n break;\n }\n\n return !chat.isRestricted && !chat.isNotJoined;\n }\n\n const listedChats = listIds\n .map((id) => chatsById[id])\n .filter(chatFilter);\n\n const listIdsSet = new Set(listIds);\n const pinnedChats = orderedPinnedIds\n ? (\n orderedPinnedIds\n .map((id) => chatsById[id])\n .filter(chatFilter)\n .filter((chat) => listIdsSet.has(chat.id))\n )\n : [];\n\n const otherChats = orderBy(\n orderedPinnedIds\n ? listedChats.filter((chat) => !orderedPinnedIds.includes(chat.id))\n : listedChats,\n getChatOrder,\n 'desc',\n );\n\n return {\n pinnedChats,\n otherChats,\n };\n}\n\nexport function getFolderUnreadDialogs(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n) {\n const [listIds] = prepareFolderListIds(chatsById, usersById, folder, notifySettings, notifyExceptions, chatIdsCache);\n\n const listedChats = listIds\n .map((id) => chatsById[id])\n .filter((chat) => (chat && chat.lastMessage && !chat.isRestricted && !chat.isNotJoined));\n\n const unreadDialogsCount = listedChats\n .reduce((total, chat) => (chat.unreadCount || chat.hasUnreadMark ? total + 1 : total), 0);\n\n const hasActiveDialogs = listedChats.some((chat) => (\n chat.unreadMentionsCount\n || (!selectIsChatMuted(chat, notifySettings, notifyExceptions) && (chat.unreadCount || chat.hasUnreadMark))\n ));\n\n return {\n unreadDialogsCount,\n hasActiveDialogs,\n };\n}\n\nexport function getFolderDescriptionText(\n lang: LangFn,\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n) {\n const {\n id, title, emoticon, description, pinnedChatIds,\n excludedChatIds, includedChatIds,\n excludeArchived, excludeMuted, excludeRead,\n ...filters\n } = folder;\n\n // If folder has multiple additive filters or uses include/exclude lists,\n // we display folder chats count\n if (\n Object.values(filters).filter(Boolean).length > 1\n || (excludedChatIds && excludedChatIds.length)\n || (includedChatIds && includedChatIds.length)\n ) {\n const length = getFolderChatsCount(chatsById, usersById, folder, chatIdsCache, notifySettings, notifyExceptions);\n return lang('Chats', length);\n }\n\n // Otherwise, we return a short description of a single filter\n if (filters.bots) {\n return lang('FilterBots');\n } else if (filters.groups) {\n return lang('FilterGroups');\n } else if (filters.channels) {\n return lang('FilterChannels');\n } else if (filters.contacts) {\n return lang('FilterContacts');\n } else if (filters.nonContacts) {\n return lang('FilterNonContacts');\n } else {\n return undefined;\n }\n}\n\nfunction getFolderChatsCount(\n chatsById: Record,\n usersById: Record,\n folder: ApiChatFolder,\n chatIdsCache: number[],\n notifySettings: NotifySettings,\n notifyExceptions?: Record,\n) {\n const [listIds, pinnedIds] = prepareFolderListIds(\n chatsById, usersById, folder, notifySettings, notifyExceptions, chatIdsCache,\n );\n const { pinnedChats, otherChats } = prepareChatList(chatsById, listIds, pinnedIds, 'folder');\n return pinnedChats.length + otherChats.length;\n}\n\nexport function isChat(chatOrUser?: ApiUser | ApiChat): chatOrUser is ApiChat {\n if (!chatOrUser) {\n return false;\n }\n\n return chatOrUser.id < 0;\n}\n\nexport function getMessageSenderName(lang: LangFn, chatId: number, sender?: ApiUser) {\n if (!sender || isChatPrivate(chatId)) {\n return undefined;\n }\n\n if (sender.isSelf) {\n return lang('FromYou');\n }\n\n return getUserFirstOrLastName(sender);\n}\n\nexport function sortChatIds(\n chatIds: number[],\n chatsById: Record,\n shouldPrioritizeVerified = false,\n priorityIds?: number[],\n) {\n return orderBy(chatIds, (id) => {\n const chat = chatsById[id];\n if (!chat) {\n return 0;\n }\n\n let priority = 0;\n\n if (chat.lastMessage) {\n priority += chat.lastMessage.date;\n }\n\n if (shouldPrioritizeVerified && chat.isVerified) {\n priority += VERIFIED_PRIORITY_BASE; // ~100 years in seconds\n }\n\n if (priorityIds && priorityIds.includes(id)) {\n priority = Date.now() + PINNED_PRIORITY_BASE + (priorityIds.length - priorityIds.indexOf(id));\n }\n\n return priority;\n }, 'desc');\n}\n","import { useEffect } from '../lib/teact/teact';\n\nexport const ANIMATION_START_EVENT = 'tt-event-heavy-animation-start';\nexport const ANIMATION_END_EVENT = 'tt-event-heavy-animation-end';\n\nlet timeout: number | undefined;\nlet isAnimating = false;\n\nexport const dispatchHeavyAnimationEvent = (duration?: number) => {\n if (!isAnimating) {\n isAnimating = true;\n document.dispatchEvent(new Event(ANIMATION_START_EVENT));\n }\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n if (duration) {\n timeout = window.setTimeout(() => {\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n timeout = undefined;\n }, duration);\n }\n\n return () => {\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n };\n};\n\nexport default (\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n) => {\n useEffect(() => {\n if (isAnimating) {\n handleAnimationStart();\n }\n\n document.addEventListener(ANIMATION_START_EVENT, handleAnimationStart);\n document.addEventListener(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n document.removeEventListener(ANIMATION_END_EVENT, handleAnimationEnd);\n document.removeEventListener(ANIMATION_START_EVENT, handleAnimationStart);\n };\n }, [handleAnimationEnd, handleAnimationStart]);\n};\n","import { DEBUG } from '../../config';\n\ntype Handler = (e: Event) => void;\n\nconst NON_BUBBLEABLE_EVENTS = new Set(['scroll', 'mouseenter', 'mouseleave']);\n\nconst delegationRegistry: Record> = {};\nconst delegatedEventsByElement = new Map>();\nconst documentEventCounters: Record = {};\n\nexport function addEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element, asCapture)) {\n addDelegatedListener(eventName, element, handler);\n } else {\n element.addEventListener(eventName, handler, asCapture);\n }\n}\n\nexport function removeEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element, asCapture)) {\n removeDelegatedListener(eventName, element);\n } else {\n element.removeEventListener(eventName, handler, asCapture);\n }\n}\n\nfunction resolveEventName(propName: string, element: HTMLElement) {\n const eventName = propName\n .replace(/^on/, '')\n .replace(/Capture$/, '').toLowerCase();\n\n if (eventName === 'change' && element.tagName !== 'SELECT') {\n // React behavior repeated here.\n // https://stackoverflow.com/questions/38256332/in-react-whats-the-difference-between-onchange-and-oninput\n return 'input';\n }\n\n if (eventName === 'doubleclick') {\n return 'dblclick';\n }\n\n // Replace focus/blur by their \"bubbleable\" versions\n if (eventName === 'focus') {\n return 'focusin';\n }\n\n if (eventName === 'blur') {\n return 'focusout';\n }\n\n return eventName;\n}\n\nfunction canUseEventDelegation(realEventName: string, element: HTMLElement, asCapture: boolean) {\n return (\n !asCapture\n && !NON_BUBBLEABLE_EVENTS.has(realEventName)\n && element.tagName !== 'VIDEO'\n && element.tagName !== 'IFRAME'\n );\n}\n\nfunction addDelegatedListener(eventName: string, element: HTMLElement, handler: Handler) {\n if (!documentEventCounters[eventName]) {\n documentEventCounters[eventName] = 0;\n document.addEventListener(eventName, handleEvent);\n }\n\n resolveDelegationRegistryForName(eventName).set(element, handler);\n resolveDelegatedEventsForElement(element).add(eventName);\n documentEventCounters[eventName]++;\n}\n\nfunction removeDelegatedListener(eventName: string, element: HTMLElement) {\n documentEventCounters[eventName]--;\n if (!documentEventCounters[eventName]) {\n // Synchronous deletion on 0 will cause perf degradation in the case of 1 element\n // which is not a real case, so it's ok to do it this way\n document.removeEventListener(eventName, handleEvent);\n }\n\n delegationRegistry[eventName].delete(element);\n delegatedEventsByElement.get(element)!.delete(eventName);\n}\n\nexport function removeAllDelegatedListeners(element: HTMLElement) {\n const eventNames = delegatedEventsByElement.get(element);\n if (!eventNames) {\n return;\n }\n\n eventNames.forEach((eventName) => removeDelegatedListener(eventName, element));\n delegatedEventsByElement.delete(element);\n}\n\nfunction handleEvent(realEvent: Event) {\n const events = delegationRegistry[realEvent.type];\n\n if (events) {\n let furtherCallsPrevented = false;\n let current: HTMLElement = realEvent.target as HTMLElement;\n\n const stopPropagation = () => {\n furtherCallsPrevented = true;\n };\n\n const preventDefault = () => {\n realEvent.preventDefault();\n };\n\n // Proxy is a simplest way to provide an access to the event property\n const event = new Proxy(realEvent, {\n get(target, p) {\n if (p === 'currentTarget') {\n return current;\n }\n if (p === 'stopPropagation' || p === 'stopImmediatePropagation') {\n return stopPropagation;\n }\n if (p === 'preventDefault') {\n // \"this\" is changed to proxy and one can't call methods via it\n return preventDefault;\n }\n return Reflect.get(target, p);\n },\n });\n\n // This can also be limited by teact root\n while (current && current !== document.body) {\n const handler = events.get(current);\n if (handler) {\n handler(event);\n if (furtherCallsPrevented) {\n return;\n }\n }\n\n current = current.parentNode as HTMLElement;\n }\n }\n}\n\nfunction resolveDelegationRegistryForName(eventName: string) {\n if (!delegationRegistry[eventName]) {\n delegationRegistry[eventName] = new Map();\n }\n\n return delegationRegistry[eventName];\n}\n\nfunction resolveDelegatedEventsForElement(element: HTMLElement) {\n const existing = delegatedEventsByElement.get(element);\n if (existing) {\n return existing;\n }\n\n const newSet = new Set();\n delegatedEventsByElement.set(element, newSet);\n\n return newSet;\n}\n\nif (DEBUG) {\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('DELEGATED EVENTS', { delegationRegistry, delegatedEventsByElement, documentEventCounters });\n });\n}\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nimport { IS_IOS } from '../util/environment';\nimport usePrevious from './usePrevious';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { areSortedArraysEqual } from '../util/iteratees';\n\n// Carefully selected by swiping and observing visual changes\n// TODO: may be different on other devices such as iPad, maybe take dpi into account?\nconst SAFARI_EDGE_BACK_GESTURE_LIMIT = 300;\nconst SAFARI_EDGE_BACK_GESTURE_DURATION = 350;\n\ntype HistoryState = {\n currentIndex: number;\n nextStateIndexToReplace: number;\n isHistoryAltered: boolean;\n isDisabled: boolean;\n isEdge: boolean;\n currentIndexes: number[];\n};\n\nconst historyState: HistoryState = {\n currentIndex: 0,\n nextStateIndexToReplace: -1,\n isHistoryAltered: false,\n isDisabled: false,\n isEdge: false,\n currentIndexes: [],\n};\n\nexport const disableHistoryBack = () => {\n historyState.isDisabled = true;\n};\n\nconst handleTouchStart = (event: TouchEvent) => {\n const x = event.touches[0].pageX;\n\n if (x <= SAFARI_EDGE_BACK_GESTURE_LIMIT || x >= window.innerWidth - SAFARI_EDGE_BACK_GESTURE_LIMIT) {\n historyState.isEdge = true;\n }\n};\n\nconst handleTouchEnd = () => {\n if (historyState.isEdge) {\n setTimeout(() => {\n historyState.isEdge = false;\n }, SAFARI_EDGE_BACK_GESTURE_DURATION);\n }\n};\n\nif (IS_IOS) {\n window.addEventListener('touchstart', handleTouchStart);\n window.addEventListener('touchend', handleTouchEnd);\n window.addEventListener('popstate', handleTouchEnd);\n}\n\nwindow.history.replaceState({ index: historyState.currentIndex }, '');\n\nexport default function useHistoryBack(\n isActive: boolean | undefined,\n onBack: ((noDisableAnimation: boolean) => void) | undefined,\n onForward?: (state: any) => void,\n currentState?: any,\n shouldReplaceNext = false,\n hashes?: string[],\n) {\n const indexRef = useRef(-1);\n const isForward = useRef(false);\n const prevIsActive = usePrevious(isActive);\n const isClosed = useRef(true);\n const indexHashRef = useRef<{ index: number; hash: string }[]>([]);\n const prevHashes = usePrevious(hashes);\n const isHashChangedFromEvent = useRef(false);\n\n const handleChange = useCallback((isForceClose = false) => {\n if (!hashes) {\n if (isActive && !isForceClose) {\n isClosed.current = false;\n\n if (isForward.current) {\n isForward.current = false;\n historyState.currentIndexes.push(indexRef.current);\n } else {\n setTimeout(() => {\n const index = ++historyState.currentIndex;\n\n historyState.currentIndexes.push(index);\n\n window.history[\n (historyState.currentIndexes.includes(historyState.nextStateIndexToReplace - 1)\n && window.history.state.index !== 0\n && historyState.nextStateIndexToReplace === index\n && !shouldReplaceNext)\n ? 'replaceState'\n : 'pushState'\n ]({\n index,\n state: currentState,\n }, '');\n\n\n indexRef.current = index;\n\n if (shouldReplaceNext) {\n historyState.nextStateIndexToReplace = historyState.currentIndex + 1;\n }\n }, 0);\n }\n }\n\n if ((isForceClose || !isActive) && !isClosed.current) {\n if ((indexRef.current === historyState.currentIndex || !shouldReplaceNext)) {\n historyState.isHistoryAltered = true;\n window.history.back();\n\n setTimeout(() => {\n historyState.nextStateIndexToReplace = -1;\n }, 400);\n }\n historyState.currentIndexes.splice(historyState.currentIndexes.indexOf(indexRef.current), 1);\n\n isClosed.current = true;\n }\n } else {\n const prev = prevHashes || [];\n if (prev.length < hashes.length) {\n const index = ++historyState.currentIndex;\n historyState.currentIndexes.push(index);\n\n window.history.pushState({\n index,\n state: currentState,\n }, '', `#${hashes[hashes.length - 1]}`);\n\n indexHashRef.current.push({\n index,\n hash: hashes[hashes.length - 1],\n });\n } else {\n const delta = prev.length - hashes.length;\n if (isHashChangedFromEvent.current) {\n isHashChangedFromEvent.current = false;\n } else {\n if (hashes.length !== indexHashRef.current.length) {\n if (delta > 0) {\n const last = indexHashRef.current[indexHashRef.current.length - delta - 1];\n let realDelta = delta;\n if (last) {\n const indexLast = historyState.currentIndexes.findIndex(\n (l) => l === last.index,\n );\n realDelta = historyState.currentIndexes.length - indexLast - 1;\n }\n historyState.isHistoryAltered = true;\n window.history.go(-realDelta);\n const removed = indexHashRef.current.splice(indexHashRef.current.length - delta - 1, delta);\n removed.forEach(({ index }) => {\n historyState.currentIndexes.splice(historyState.currentIndexes.indexOf(index), 1);\n });\n }\n }\n\n if (hashes.length > 0) {\n setTimeout(() => {\n const index = ++historyState.currentIndex;\n historyState.currentIndexes[historyState.currentIndexes.length - 1] = index;\n\n window.history.replaceState({\n index,\n state: currentState,\n }, '', `#${hashes[hashes.length - 1]}`);\n\n indexHashRef.current[indexHashRef.current.length - 1] = {\n index,\n hash: hashes[hashes.length - 1],\n };\n }, 0);\n }\n }\n }\n }\n }, [currentState, hashes, isActive, prevHashes, shouldReplaceNext]);\n\n useEffect(() => {\n const handlePopState = (event: PopStateEvent) => {\n if (historyState.isHistoryAltered) {\n setTimeout(() => {\n historyState.isHistoryAltered = false;\n }, 0);\n return;\n }\n const { index: i } = event.state;\n const index = i || 0;\n try {\n const currIndex = hashes ? indexHashRef.current[indexHashRef.current.length - 1].index : indexRef.current;\n\n const prev = historyState.currentIndexes[historyState.currentIndexes.indexOf(currIndex) - 1];\n\n if (historyState.isDisabled) return;\n\n if ((!isClosed.current && (index === 0 || index === prev)) || (hashes && (index === 0 || index === prev))) {\n if (hashes) {\n isHashChangedFromEvent.current = true;\n indexHashRef.current.pop();\n }\n\n historyState.currentIndexes.splice(historyState.currentIndexes.indexOf(currIndex), 1);\n\n if (onBack) {\n if (historyState.isEdge) {\n getDispatch()\n .disableHistoryAnimations();\n }\n onBack(!historyState.isEdge);\n isClosed.current = true;\n }\n } else if (index === currIndex && isClosed.current && onForward && !hashes) {\n isForward.current = true;\n if (historyState.isEdge) {\n getDispatch()\n .disableHistoryAnimations();\n }\n onForward(event.state.state);\n }\n } catch (e) {\n // Forward navigation for hashed is not supported\n }\n };\n\n const hasChanged = hashes\n ? (!prevHashes || !areSortedArraysEqual(prevHashes, hashes))\n : prevIsActive !== isActive;\n\n if (!historyState.isDisabled && hasChanged) {\n handleChange();\n }\n\n window.addEventListener('popstate', handlePopState);\n return () => window.removeEventListener('popstate', handlePopState);\n }, [\n currentState, handleChange, hashes, isActive, onBack, onForward, prevHashes, prevIsActive, shouldReplaceNext,\n ]);\n\n return {\n forceClose: () => handleChange(true),\n };\n}\n","import { useRef, useState } from '../lib/teact/teact';\nimport buildClassName from '../util/buildClassName';\n\nconst CLOSE_DURATION = 350;\n\nexport default (\n isOpen = false,\n onCloseTransitionEnd?: () => void,\n noOpenTransition = false,\n className: string | false = 'fast',\n noCloseTransition = false,\n) => {\n const [isClosed, setIsClosed] = useState(!isOpen);\n const closeTimeoutRef = useRef();\n // СSS class should be added in a separate tick to turn on CSS transition.\n const [hasOpenClassName, setHasOpenClassName] = useState(isOpen && noOpenTransition);\n\n\n if (isOpen) {\n setIsClosed(false);\n setHasOpenClassName(true);\n\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = undefined;\n }\n } else {\n setHasOpenClassName(false);\n\n if (!isClosed && !closeTimeoutRef.current) {\n closeTimeoutRef.current = window.setTimeout(() => {\n setIsClosed(true);\n\n if (onCloseTransitionEnd) {\n onCloseTransitionEnd();\n }\n\n closeTimeoutRef.current = undefined;\n }, noCloseTransition ? 0 : CLOSE_DURATION);\n }\n }\n\n // `noCloseTransition`, when set to true, should remove the open class immediately\n const shouldHaveOpenClassName = hasOpenClassName && !(noCloseTransition && !isOpen);\n const isClosing = Boolean(closeTimeoutRef.current);\n const shouldRender = isOpen || isClosing;\n const transitionClassNames = buildClassName(\n className && 'opacity-transition',\n className,\n shouldHaveOpenClassName && 'open',\n shouldRender && 'shown',\n isClosing && 'closing',\n );\n\n return {\n shouldRender,\n transitionClassNames,\n };\n};\n","const DEFAULT_MAX_TEXT_LENGTH = 30;\n\nexport default function trimText(text: string | undefined, length = DEFAULT_MAX_TEXT_LENGTH) {\n if (!text || text.length <= length) {\n return text;\n }\n\n return `${text.substr(0, length)}...`;\n}\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport './MenuItem.scss';\n\ntype OnClickHandler = (e: React.SyntheticEvent) => void;\n\ntype OwnProps = {\n icon?: string;\n className?: string;\n children: any;\n onClick?: OnClickHandler;\n href?: string;\n download?: string;\n disabled?: boolean;\n destructive?: boolean;\n ariaLabel?: string;\n};\n\nconst MenuItem: FC = (props) => {\n const {\n icon,\n className,\n children,\n onClick,\n href,\n download,\n disabled,\n destructive,\n ariaLabel,\n } = props;\n\n const lang = useLang();\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || !onClick) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n\n onClick(e);\n }, [disabled, onClick]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode !== 13 && e.keyCode !== 32) {\n return;\n }\n\n if (disabled || !onClick) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n\n onClick(e);\n }, [disabled, onClick]);\n\n const fullClassName = buildClassName(\n 'MenuItem',\n className,\n disabled && 'disabled',\n destructive && 'destructive',\n );\n\n const content = (\n <>\n {icon && (\n \n )}\n {children}\n \n );\n\n if (href) {\n return (\n \n {content}\n \n );\n }\n\n return (\n \n {content}\n
\n );\n};\n\nexport default MenuItem;\n","import React, {\n FC, useCallback, useMemo, useState, memo,\n} from '../../lib/teact/teact';\nimport { debounce } from '../../util/schedulers';\n\nimport './RippleEffect.scss';\n\ninterface Ripple {\n x: number;\n y: number;\n size: number;\n}\n\nconst ANIMATION_DURATION_MS = 700;\n\nconst RippleEffect: FC = () => {\n const [ripples, setRipples] = useState([]);\n\n const cleanUpDebounced = useMemo(() => {\n return debounce(() => {\n setRipples([]);\n }, ANIMATION_DURATION_MS, false);\n }, []);\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (e.button !== 0) {\n return;\n }\n\n const container = e.currentTarget as HTMLDivElement;\n const position = container.getBoundingClientRect() as DOMRect;\n\n const rippleSize = container.offsetWidth / 2;\n\n setRipples([\n ...ripples,\n {\n x: e.clientX - position.x - (rippleSize / 2),\n y: e.clientY - position.y - (rippleSize / 2),\n size: rippleSize,\n },\n ]);\n\n requestAnimationFrame(() => {\n cleanUpDebounced();\n });\n }, [ripples, cleanUpDebounced]);\n\n return (\n
\n {ripples.map(({ x, y, size }: Ripple) => (\n \n ))}\n
\n );\n};\n\nexport default memo(RippleEffect);\n","import { ISettings } from '../types';\n\nimport { animateSingle } from './animation';\n\nimport themeColors from '../styles/themes.json';\n\ntype RGBAColor = {\n r: number;\n g: number;\n b: number;\n a?: number;\n};\n\nlet isInitialized = false;\n\nconst HEX_COLOR_REGEX = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})?$/i;\nconst DURATION_MS = 200;\nconst ENABLE_ANIMATION_DELAY_MS = 500;\n\nconst lerp = (start: number, end: number, interpolationRatio: number) => {\n return (1 - interpolationRatio) * start + interpolationRatio * end;\n};\n\nconst colors = (Object.keys(themeColors) as Array).map((property) => ({\n property,\n colors: [hexToRgb(themeColors[property][0]), hexToRgb(themeColors[property][1])],\n}));\n\nexport default (theme: ISettings['theme'], withAnimation: boolean) => {\n const isDarkTheme = theme === 'dark';\n const shouldAnimate = isInitialized && withAnimation;\n const startIndex = isDarkTheme ? 0 : 1;\n const endIndex = isDarkTheme ? 1 : 0;\n const startAt = Date.now();\n const themeColorTag = document.querySelector('meta[name=\"theme-color\"]');\n\n document.documentElement.classList.remove(`theme-${isDarkTheme ? 'light' : 'dark'}`);\n if (isInitialized) {\n document.documentElement.classList.add('no-animations');\n }\n document.documentElement.classList.add(`theme-${theme}`);\n if (themeColorTag) {\n themeColorTag.setAttribute('content', isDarkTheme ? '#212121' : '#fff');\n }\n\n setTimeout(() => {\n document.documentElement.classList.remove('no-animations');\n }, ENABLE_ANIMATION_DELAY_MS);\n\n isInitialized = true;\n\n if (shouldAnimate) {\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / DURATION_MS, 1);\n\n applyColorAnimationStep(startIndex, endIndex, transition(t));\n\n return t < 1;\n });\n } else {\n applyColorAnimationStep(startIndex, endIndex);\n }\n};\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n\nfunction hexToRgb(hex: string): RGBAColor {\n const result = HEX_COLOR_REGEX.exec(hex)!;\n\n return {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n a: result[4] !== undefined ? parseInt(result[4], 16) : undefined,\n };\n}\n\nfunction applyColorAnimationStep(startIndex: number, endIndex: number, interpolationRatio: number = 1) {\n colors.forEach(({ property, colors: propertyColors }) => {\n const r = Math.round(lerp(propertyColors[startIndex].r, propertyColors[endIndex].r, interpolationRatio));\n const g = Math.round(lerp(propertyColors[startIndex].g, propertyColors[endIndex].g, interpolationRatio));\n const b = Math.round(lerp(propertyColors[startIndex].b, propertyColors[endIndex].b, interpolationRatio));\n const a = propertyColors[startIndex].a !== undefined\n ? Math.round(lerp(propertyColors[startIndex].a!, propertyColors[endIndex].a!, interpolationRatio))\n : undefined;\n\n document.documentElement.style.setProperty(property, a !== undefined\n ? `rgba(${r},${g},${b},${a / 255})`\n : `rgb(${r},${g},${b})`);\n });\n}\n","import WebpWorker from 'worker-loader!../lib/webp/webp_wasm.worker';\nimport { isWebpSupported } from './environment';\nimport { dataUriToBlob, blobToDataUri } from './files';\nimport { pause } from './schedulers';\n\ntype TEncodedImage = {\n result: Uint8ClampedArray;\n width: number;\n height: number;\n};\n\nconst WORKER_INITIALIZATION_TIMEOUT = 2000;\n\nlet canvas: HTMLCanvasElement;\nlet worker: IWebpWorker;\n\nexport const EMPTY_IMAGE_DATA_URI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk'\n + 'YAAAAAYAAjCB0C8AAAAASUVORK5CYII=';\n\nexport async function webpToPng(url: string, blob: Blob): Promise {\n initWebpWorker();\n\n while (!worker.wasmReady) {\n await pause(WORKER_INITIALIZATION_TIMEOUT);\n }\n\n const { result, width, height } = await getDecodePromise(url, blob);\n if (!width || !height) {\n return undefined;\n }\n\n return createPng({ result, width, height });\n}\n\nexport async function webpToPngBase64(key: string, url: string): Promise {\n if (isWebpSupported() || url.substr(0, 15) !== 'data:image/webp') {\n return url;\n }\n\n initWebpWorker();\n\n const pngBlob = await webpToPng(key, dataUriToBlob(url));\n\n if (!pngBlob) {\n throw new Error(`Can't convert webp to png. Url: ${url}`);\n }\n\n return blobToDataUri(pngBlob);\n}\n\nfunction initWebpWorker() {\n if (!worker) {\n worker = new WebpWorker() as IWebpWorker;\n worker.wasmReady = false;\n worker.onmessage = handleLibWebpMessage;\n }\n}\n\nfunction createPng({ result, width, height }: TEncodedImage): Promise {\n if (!canvas) {\n canvas = document.createElement('canvas');\n }\n\n return new Promise((resolve) => {\n const img = new ImageData(result, width, height);\n\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d')!;\n ctx.putImageData(img, 0, 0);\n\n canvas.toBlob((blob) => {\n resolve(blob ?? undefined);\n }, 'image/png', 1);\n });\n}\n\nfunction handleLibWebpMessage(e: MessageEvent) {\n const { id } = e.data;\n switch (e.data.type) {\n case 'initialized': {\n worker.wasmReady = true;\n break;\n }\n\n case 'result': {\n if (worker.requests.has(id)) {\n const resolve = worker.requests.get(id)!;\n\n worker.requests.delete(id);\n resolve(e.data!);\n }\n break;\n }\n }\n}\n\nfunction getDecodePromise(url: string, blob: Blob): Promise {\n return new Promise((resolve) => {\n worker.requests = worker.requests || new Map();\n worker.requests.set(url, resolve);\n worker.postMessage({ id: url, blob });\n });\n}\n","import { ChangeEvent, FormEvent, RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\ntype OwnProps = {\n ref?: RefObject;\n id?: string;\n className?: string;\n value?: string;\n label?: string;\n error?: string;\n success?: string;\n disabled?: boolean;\n readOnly?: boolean;\n placeholder?: string;\n autoComplete?: string;\n maxLength?: number;\n inputMode?: 'text' | 'none' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search';\n onChange?: (e: ChangeEvent) => void;\n onInput?: (e: FormEvent) => void;\n onKeyPress?: (e: React.KeyboardEvent) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n onBlur?: (e: React.FocusEvent) => void;\n onPaste?: (e: React.ClipboardEvent) => void;\n};\n\nconst InputText: FC = ({\n ref,\n id,\n className,\n value,\n label,\n error,\n success,\n disabled,\n readOnly,\n placeholder,\n autoComplete,\n inputMode,\n maxLength,\n onChange,\n onInput,\n onKeyPress,\n onKeyDown,\n onBlur,\n onPaste,\n}) => {\n const lang = useLang();\n const labelText = error || success || label;\n const fullClassName = buildClassName(\n 'input-group',\n value && 'touched',\n error ? 'error' : success && 'success',\n disabled && 'disabled',\n readOnly && 'disabled',\n labelText && 'with-label',\n className,\n );\n\n return (\n
\n \n {labelText && (\n \n )}\n
\n );\n};\n\nexport default memo(InputText);\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from './Spinner';\n\nimport './Checkbox.scss';\n\ntype OwnProps = {\n id?: string;\n name?: string;\n value?: string;\n label: string;\n subLabel?: string;\n checked: boolean;\n disabled?: boolean;\n round?: boolean;\n blocking?: boolean;\n isLoading?: boolean;\n withCheckedCallback?: boolean;\n onChange?: (e: ChangeEvent) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Checkbox: FC = ({\n id,\n name,\n value,\n label,\n subLabel,\n checked,\n disabled,\n round,\n blocking,\n isLoading,\n onChange,\n onCheck,\n}) => {\n const lang = useLang();\n const handleChange = useCallback((event: ChangeEvent) => {\n if (onChange) {\n onChange(event);\n }\n\n if (onCheck) {\n onCheck(event.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const className = buildClassName(\n 'Checkbox',\n disabled && 'disabled',\n round && 'round',\n isLoading && 'loading',\n blocking && 'blocking',\n );\n\n return (\n \n );\n};\n\nexport default memo(Checkbox);\n","import captureKeyboardListener from './captureKeyboardListeners';\n\ntype IHandlerFunction = () => void;\n\nexport default function captureEscKeyListener(handler: IHandlerFunction) {\n return captureKeyboardListener({ onEsc: handler });\n}\n","export function formatInteger(value: number) {\n return String(value).replace(/\\d(?=(\\d{3})+$)/g, '$& ');\n}\n\nfunction formatFixedNumber(number: number) {\n const fixed = String(number.toFixed(1));\n if (fixed.substr(-2) === '.0') {\n return Math.round(number);\n }\n\n return number.toFixed(1).replace('.', ',');\n}\n\nexport function formatIntegerCompact(views: number) {\n if (views < 1e3) {\n return views;\n }\n\n if (views < 1e6) {\n return `${formatFixedNumber(views / 1e3)}K`;\n }\n\n return `${formatFixedNumber(views / 1e6)}M`;\n}\n\nexport function getFirstLetters(phrase: string, count = 2) {\n return phrase\n .replace(/[.,!@#$%^&*()_+=\\-`~[\\]/\\\\{}:\"|<>?]+/gi, '')\n .trim()\n .split(/\\s+/)\n .slice(0, count)\n .map((word: string) => word.length && word.match(/./u)![0].toUpperCase())\n .join('');\n}\n","export const MEMO_EMPTY_ARRAY = [];\n","import usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T) => {\n const prevDeps = usePrevious(dependencies);\n if (!prevDeps || dependencies.some((d, i) => d !== prevDeps[i])) {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n cb(prevDeps || []);\n }\n};\n","const RE_NOT_LETTER = /[^\\wа-яё]+/;\n\nexport default function searchWords(haystack: string, needle: string) {\n if (!haystack || !needle) {\n return false;\n }\n\n const haystackWords = haystack.toLowerCase().split(RE_NOT_LETTER);\n const needleWords = needle.toLowerCase().split(RE_NOT_LETTER);\n\n return needleWords.every((needleWord) => (\n haystackWords.some((haystackWord) => haystackWord.startsWith(needleWord))\n ));\n}\n","import { throttle } from './schedulers';\nimport {\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n MOBILE_SCREEN_MAX_WIDTH,\n} from '../config';\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT } from './environment';\n\ntype IDimensions = {\n width: number;\n height: number;\n};\n\nconst IS_LANDSCAPE = IS_SINGLE_COLUMN_LAYOUT && isLandscape();\n\nconst initialHeight = window.innerHeight;\nlet windowSize = updateSizes();\nlet isRefreshDisabled = false;\n\nfunction disableRefresh() {\n isRefreshDisabled = true;\n}\n\nfunction enableRefresh() {\n isRefreshDisabled = false;\n}\n\nconst handleResize = throttle(() => {\n windowSize = updateSizes();\n\n if (!isRefreshDisabled && (\n isMobileScreen() !== IS_SINGLE_COLUMN_LAYOUT\n || (IS_SINGLE_COLUMN_LAYOUT && IS_LANDSCAPE !== isLandscape())\n )) {\n window.location.reload();\n }\n}, 250, true);\n\nwindow.addEventListener('resize', handleResize);\nwindow.addEventListener('orientationchange', handleResize);\n\nexport function updateSizes(): IDimensions {\n const vh = window.innerHeight * 0.01;\n\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n}\n\nfunction isMobileScreen() {\n return windowSize.width <= MOBILE_SCREEN_MAX_WIDTH || (\n windowSize.width <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && windowSize.height <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n );\n}\n\nfunction isLandscape() {\n if (IS_IOS) {\n return window.matchMedia('(orientation: landscape)').matches;\n }\n\n // eslint-disable-next-line max-len\n // Source: https://web.archive.org/web/20160509220835/http://blog.abouthalf.com/development/orientation-media-query-challenges-in-android-browsers/\n // Feature is marked as deprecated now, but it is still supported\n // https://developer.mozilla.org/en-US/docs/Web/CSS/@media/device-aspect-ratio#browser_compatibility\n return window.matchMedia('screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)').matches;\n}\n\nexport default {\n get: () => windowSize,\n getIsKeyboardVisible: () => initialHeight > windowSize.height,\n disableRefresh,\n enableRefresh,\n};\n","import { RefObject } from 'react';\nimport React, { FC, useEffect, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\nimport useVirtualBackdrop from '../../hooks/useVirtualBackdrop';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport './Menu.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n containerRef?: RefObject;\n isOpen: boolean;\n className?: string;\n style?: string;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n autoClose?: boolean;\n shouldSkipTransition?: boolean;\n footer?: string;\n noCloseOnBackdrop?: boolean;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n onCloseAnimationEnd?: () => void;\n onClose?: () => void;\n onMouseEnter?: (e: React.MouseEvent) => void;\n onMouseLeave?: (e: React.MouseEvent) => void;\n children: any;\n};\n\nconst ANIMATION_DURATION = 200;\n\nconst Menu: FC = ({\n ref,\n containerRef,\n isOpen,\n className,\n style,\n children,\n positionX = 'left',\n positionY = 'top',\n autoClose = false,\n footer,\n noCloseOnBackdrop = false,\n onCloseAnimationEnd,\n onClose,\n onMouseEnter,\n onMouseLeave,\n shouldSkipTransition,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let menuRef = useRef(null);\n if (ref) {\n menuRef = ref;\n }\n const backdropContainerRef = containerRef || menuRef;\n\n const {\n transitionClassNames,\n } = useShowTransition(\n isOpen,\n onCloseAnimationEnd,\n shouldSkipTransition,\n undefined,\n shouldSkipTransition,\n );\n\n useEffect(\n () => (isOpen && onClose ? captureEscKeyListener(onClose) : undefined),\n [isOpen, onClose],\n );\n\n useHistoryBack(isOpen, onClose, undefined, undefined, autoClose);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n if (prevIsOpen !== undefined) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n }, [isOpen]);\n\n const handleKeyDown = useKeyboardListNavigation(menuRef, isOpen, autoClose ? onClose : undefined, undefined, true);\n\n useVirtualBackdrop(\n isOpen,\n backdropContainerRef,\n noCloseOnBackdrop ? undefined : onClose,\n );\n\n const bubbleClassName = buildClassName(\n 'bubble menu-container custom-scroll',\n positionY,\n positionX,\n footer && 'with-footer',\n transitionClassNames,\n );\n\n return (\n \n {isOpen && (\n // This only prevents click events triggering on underlying elements\n
\n )}\n \n {children}\n {footer &&
{footer}
}\n
\n
\n );\n};\n\nexport default Menu;\n","type HandlerName = 'onEnter' | 'onBackspace' | 'onDelete' | 'onEsc' | 'onUp' | 'onDown' | 'onLeft' | 'onRight'\n| 'onTab';\ntype Handler = (e: KeyboardEvent) => void;\ntype CaptureOptions = Partial>;\n\nconst keyToHandlerName: Record = {\n Enter: 'onEnter',\n Backspace: 'onBackspace',\n Delete: 'onDelete',\n Esc: 'onEsc',\n Escape: 'onEsc',\n ArrowUp: 'onUp',\n ArrowDown: 'onDown',\n ArrowLeft: 'onLeft',\n ArrowRight: 'onRight',\n Tab: 'onTab',\n};\n\nconst handlers: Record = {\n onEnter: [],\n onDelete: [],\n onBackspace: [],\n onEsc: [],\n onUp: [],\n onDown: [],\n onLeft: [],\n onRight: [],\n onTab: [],\n};\n\nexport default function captureKeyboardListeners(options: CaptureOptions) {\n if (!hasActiveHandlers()) {\n document.addEventListener('keydown', handleKeyDown, true);\n }\n\n (Object.keys(options) as Array).forEach((handlerName) => {\n const handler = options[handlerName];\n if (!handler) {\n return;\n }\n\n const currentEventHandlers = handlers[handlerName];\n if (currentEventHandlers) {\n currentEventHandlers.push(handler);\n }\n });\n\n return () => {\n releaseKeyboardListener(options);\n };\n}\n\nfunction hasActiveHandlers() {\n return Object.values(handlers).some((keyHandlers) => Boolean(keyHandlers.length));\n}\n\nfunction handleKeyDown(e: KeyboardEvent) {\n const handlerName = keyToHandlerName[e.key];\n if (!handlerName) {\n return;\n }\n\n const { length } = handlers[handlerName];\n if (!length) {\n return;\n }\n e.stopPropagation();\n\n const handler = handlers[handlerName][length - 1];\n handler!(e);\n}\n\nfunction releaseKeyboardListener(options: CaptureOptions) {\n (Object.keys(options) as Array).forEach((handlerName) => {\n const handler = options[handlerName];\n const currentEventHandlers = handlers[handlerName];\n if (currentEventHandlers) {\n const index = currentEventHandlers.findIndex((cb) => cb === handler);\n if (index !== -1) {\n currentEventHandlers.splice(index, 1);\n }\n }\n });\n\n if (!hasActiveHandlers()) {\n document.removeEventListener('keydown', handleKeyDown, false);\n }\n}\n","import DecoderWorker from 'worker-loader!opus-recorder/dist/decoderWorker.min';\nimport WavWorker from 'worker-loader!opus-recorder/dist/waveWorker.min';\n\nconst SAMPLE_RATE = 48000;\nconst BIT_DEPTH = 16;\n\nexport async function oggToWav(opusData: Blob): Promise {\n const arrayBuffer = await new Response(opusData).arrayBuffer();\n\n return new Promise((resolve) => {\n const typedArray = new Uint8Array(arrayBuffer);\n\n let decoderWorker: DecoderWorker | undefined = new DecoderWorker();\n let wavWorker: WavWorker | undefined = new WavWorker();\n\n decoderWorker.onmessage = (e) => {\n // eslint-disable-next-line no-null/no-null\n if (e.data === null) {\n // `null` means decoder is finished\n wavWorker!.postMessage({ command: 'done' });\n } else {\n // `e.data` contains decoded buffers as float32 values\n wavWorker!.postMessage(\n {\n command: 'encode',\n buffers: e.data,\n },\n e.data.map(({ buffer }: Float32Array) => buffer),\n );\n }\n };\n\n wavWorker.onmessage = (e) => {\n if (e.data.message === 'page') {\n resolve(new Blob([e.data.page], { type: 'audio/wav' }));\n\n decoderWorker!.terminate();\n decoderWorker = undefined;\n wavWorker!.terminate();\n wavWorker = undefined;\n }\n };\n\n wavWorker.postMessage({\n command: 'init',\n wavBitDepth: BIT_DEPTH,\n wavSampleRate: SAMPLE_RATE,\n });\n\n decoderWorker.postMessage({\n command: 'init',\n decoderSampleRate: SAMPLE_RATE,\n outputBufferSampleRate: SAMPLE_RATE,\n });\n\n decoderWorker.postMessage({\n command: 'decode',\n pages: typedArray,\n }, [typedArray.buffer]);\n });\n}\n","import {\n ApiMediaFormat,\n ApiMediaFormatToPrepared,\n ApiOnProgress,\n ApiParsedMedia,\n ApiPreparedMedia,\n} from '../api/types';\n\nimport {\n DEBUG, MEDIA_CACHE_DISABLED, MEDIA_CACHE_NAME, MEDIA_CACHE_NAME_AVATARS,\n} from '../config';\nimport { callApi, cancelApiProgress } from '../api/gramjs';\nimport * as cacheApi from './cacheApi';\nimport { fetchBlob } from './files';\nimport { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, isWebpSupported } from './environment';\nimport { oggToWav } from './oggToWav';\nimport { webpToPng } from './webpToPng';\n\nconst asCacheApiType = {\n [ApiMediaFormat.DataUri]: cacheApi.Type.Text,\n [ApiMediaFormat.BlobUrl]: cacheApi.Type.Blob,\n [ApiMediaFormat.Lottie]: cacheApi.Type.Json,\n [ApiMediaFormat.Progressive]: undefined,\n [ApiMediaFormat.Stream]: undefined,\n};\n\nconst PROGRESSIVE_URL_PREFIX = './progressive/';\n\nconst memoryCache = new Map();\nconst fetchPromises = new Map>();\n\nexport function fetch(\n url: string, mediaFormat: T, onProgress?: ApiOnProgress,\n): Promise> {\n if (mediaFormat === ApiMediaFormat.Progressive) {\n return (\n IS_PROGRESSIVE_SUPPORTED\n ? getProgressive(url)\n : fetch(url, ApiMediaFormat.BlobUrl, onProgress)\n ) as Promise>;\n }\n\n if (!fetchPromises.has(url)) {\n const promise = fetchFromCacheOrRemote(url, mediaFormat, onProgress)\n .catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err);\n }\n\n return undefined;\n })\n .finally(() => {\n fetchPromises.delete(url);\n });\n\n fetchPromises.set(url, promise);\n }\n\n return fetchPromises.get(url) as Promise>;\n}\n\nexport function getFromMemory(url: string) {\n return memoryCache.get(url) as ApiMediaFormatToPrepared;\n}\n\nexport function cancelProgress(progressCallback: ApiOnProgress) {\n cancelApiProgress(progressCallback);\n}\n\nfunction getProgressive(url: string) {\n const progressiveUrl = `${PROGRESSIVE_URL_PREFIX}${url}`;\n\n memoryCache.set(url, progressiveUrl);\n\n return Promise.resolve(progressiveUrl);\n}\n\nasync function fetchFromCacheOrRemote(url: string, mediaFormat: ApiMediaFormat, onProgress?: ApiOnProgress) {\n if (!MEDIA_CACHE_DISABLED) {\n const cacheName = url.startsWith('avatar') ? MEDIA_CACHE_NAME_AVATARS : MEDIA_CACHE_NAME;\n const cached = await cacheApi.fetch(cacheName, url, asCacheApiType[mediaFormat]!);\n if (cached) {\n let media = cached;\n\n if (cached.type === 'audio/ogg' && !IS_OPUS_SUPPORTED) {\n media = await oggToWav(media);\n }\n\n if (cached.type === 'image/webp' && !isWebpSupported() && media) {\n const mediaPng = await webpToPng(url, media);\n if (mediaPng) {\n media = mediaPng;\n }\n }\n\n const prepared = prepareMedia(media);\n\n memoryCache.set(url, prepared);\n\n return prepared;\n }\n }\n\n if (mediaFormat === ApiMediaFormat.Stream) {\n const mediaSource = new MediaSource();\n const streamUrl = URL.createObjectURL(mediaSource);\n let isOpen = false;\n\n mediaSource.addEventListener('sourceopen', () => {\n if (isOpen) {\n return;\n }\n isOpen = true;\n\n const sourceBuffer = mediaSource.addSourceBuffer('audio/mpeg');\n\n void callApi('downloadMedia', { url, mediaFormat }, (progress: number, arrayBuffer: ArrayBuffer) => {\n if (onProgress) {\n onProgress(progress);\n }\n\n if (progress === 1) {\n mediaSource.endOfStream();\n }\n\n if (!arrayBuffer) {\n return;\n }\n\n sourceBuffer.appendBuffer(arrayBuffer!);\n });\n });\n\n memoryCache.set(url, streamUrl);\n return streamUrl;\n }\n\n const remote = await callApi('downloadMedia', { url, mediaFormat }, onProgress);\n if (!remote) {\n throw new Error('Failed to fetch media');\n }\n\n let { prepared, mimeType } = remote;\n\n if (mimeType === 'audio/ogg' && !IS_OPUS_SUPPORTED) {\n const blob = await fetchBlob(prepared as string);\n URL.revokeObjectURL(prepared as string);\n const media = await oggToWav(blob);\n prepared = prepareMedia(media);\n mimeType = blob.type;\n }\n\n if (mimeType === 'image/webp' && !isWebpSupported()) {\n const blob = await fetchBlob(prepared as string);\n URL.revokeObjectURL(prepared as string);\n const media = await webpToPng(url, blob);\n if (media) {\n prepared = prepareMedia(media);\n }\n }\n\n memoryCache.set(url, prepared);\n\n return prepared;\n}\n\nfunction prepareMedia(mediaData: ApiParsedMedia): ApiPreparedMedia {\n if (mediaData instanceof Blob) {\n return URL.createObjectURL(mediaData);\n }\n\n return mediaData;\n}\n\nif (IS_PROGRESSIVE_SUPPORTED) {\n navigator.serviceWorker.addEventListener('message', async (e) => {\n const { type, messageId, params } = e.data as {\n type: string;\n messageId: string;\n params: { url: string; start: number; end: number };\n };\n\n if (type !== 'requestPart') {\n return;\n }\n\n const result = await callApi('downloadMedia', { mediaFormat: ApiMediaFormat.Progressive, ...params });\n if (!result) {\n return;\n }\n\n const { arrayBuffer, mimeType, fullSize } = result;\n\n navigator.serviceWorker.controller!.postMessage({\n type: 'partResponse',\n messageId,\n result: {\n arrayBuffer,\n mimeType,\n fullSize,\n },\n }, [arrayBuffer!]);\n });\n}\n","import { useEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T, debugKey?: string) => {\n const prevDeps = usePrevious(dependencies);\n return useEffect(() => {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n return cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies, debugKey);\n};\n","/* eslint-disable no-nested-ternary */\n/* eslint-disable no-bitwise */\n\nconst utf16 = {\n // The utf16-class is necessary to convert from javascripts internal character representation to unicode and back.\n decode: (input) => {\n const output = [];\n let i = 0;\n const len = input.length;\n let value;\n let extra;\n\n while (i < len) {\n value = input.charCodeAt(i++);\n if ((value & 0xf800) === 0xd800) {\n extra = input.charCodeAt(i++);\n if ((value & 0xfc00) !== 0xd800 || (extra & 0xfc00) !== 0xdc00) {\n throw new RangeError('UTF-16(decode): Illegal UTF-16 sequence');\n }\n value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;\n }\n output.push(value);\n }\n return output;\n },\n encode: (input) => {\n const output = [];\n let i = 0;\n const len = input.length;\n let value;\n\n while (i < len) {\n value = input[i++];\n if ((value & 0xf800) === 0xd800) {\n throw new RangeError('UTF-16(encode): Illegal UTF-16 value');\n }\n if (value > 0xffff) {\n value -= 0x10000;\n output.push(String.fromCharCode(((value >>> 10) & 0x3ff) | 0xd800));\n value = 0xdc00 | (value & 0x3ff);\n }\n output.push(String.fromCharCode(value));\n }\n return output.join('');\n },\n};\n\n// Default parameters\nconst initial_n = 0x80;\nconst initial_bias = 72;\nconst delimiter = '\\x2D';\nconst base = 36;\nconst damp = 700;\nconst tmin = 1;\nconst tmax = 26;\nconst skew = 38;\nconst maxint = 0x7fffffff;\n\n// decode_digit(cp) returns the numeric value of a basic code\n// point (for use in representing integers) in the range 0 to\n// base-1, or base if cp is does not represent a value.\n\nfunction decode_digit(cp) {\n return cp - 48 < 10 ? cp - 22 : cp - 65 < 26 ? cp - 65 : cp - 97 < 26 ? cp - 97 : base;\n}\n\n// ** Bias adaptation function **\nfunction adapt(delta, numpoints, firsttime) {\n let k;\n delta = firsttime ? Math.floor(delta / damp) : delta >> 1;\n delta += Math.floor(delta / numpoints);\n\n for (k = 0; delta > ((base - tmin) * tmax) >> 1; k += base) {\n delta = Math.floor(delta / (base - tmin));\n }\n return Math.floor(k + ((base - tmin + 1) * delta) / (delta + skew));\n}\n\n// Main decode\nfunction decode(input, preserveCase) {\n // Dont use utf16\n const output = [];\n const case_flags = [];\n const input_length = input.length;\n\n let n; let out; let i; let bias; let basic; let j; let ic; let oldi; let w; let k; let digit; let t; let len;\n\n // Initialize the state:\n\n n = initial_n;\n i = 0;\n bias = initial_bias;\n\n // Handle the basic code points: Let basic be the number of input code\n // points before the last delimiter, or 0 if there is none, then\n // copy the first basic code points to the output.\n\n basic = input.lastIndexOf(delimiter);\n if (basic < 0) basic = 0;\n\n for (j = 0; j < basic; ++j) {\n if (preserveCase) case_flags[output.length] = input.charCodeAt(j) - 65 < 26;\n if (input.charCodeAt(j) >= 0x80) {\n throw new RangeError('Illegal input >= 0x80');\n }\n output.push(input.charCodeAt(j));\n }\n\n // Main decoding loop: Start just after the last delimiter if any\n // basic code points were copied; start at the beginning otherwise.\n\n for (ic = basic > 0 ? basic + 1 : 0; ic < input_length;) {\n // ic is the index of the next character to be consumed,\n\n // Decode a generalized variable-length integer into delta,\n // which gets added to i. The overflow checking is easier\n // if we increase i as we go, then subtract off its starting\n // value at the end to obtain delta.\n for (oldi = i, w = 1, k = base; ; k += base) {\n if (ic >= input_length) {\n throw RangeError('punycode_bad_input(1)');\n }\n digit = decode_digit(input.charCodeAt(ic++));\n\n if (digit >= base) {\n throw RangeError('punycode_bad_input(2)');\n }\n if (digit > Math.floor((maxint - i) / w)) {\n throw RangeError('punycode_overflow(1)');\n }\n i += digit * w;\n t = k <= bias ? tmin : k >= bias + tmax ? tmax : k - bias;\n if (digit < t) {\n break;\n }\n if (w > Math.floor(maxint / (base - t))) {\n throw RangeError('punycode_overflow(2)');\n }\n w *= base - t;\n }\n\n out = output.length + 1;\n bias = adapt(i - oldi, out, oldi === 0);\n\n // i was supposed to wrap around from out to 0,\n // incrementing n each time, so we'll fix that now:\n if (Math.floor(i / out) > maxint - n) {\n throw RangeError('punycode_overflow(3)');\n }\n n += Math.floor(i / out);\n i %= out;\n\n // Insert n at position i of the output:\n // Case of last character determines uppercase flag:\n if (preserveCase) {\n case_flags.splice(i, 0, input.charCodeAt(ic - 1) - 65 < 26);\n }\n\n output.splice(i, 0, n);\n i++;\n }\n if (preserveCase) {\n for (i = 0, len = output.length; i < len; i++) {\n if (case_flags[i]) {\n output[i] = String.fromCharCode(output[i])\n .toUpperCase()\n .charCodeAt(0);\n }\n }\n }\n return utf16.encode(output);\n}\n\nfunction toUnicode(domain) {\n const domain_array = domain.split('.');\n const out = [];\n for (let i = 0; i < domain_array.length; ++i) {\n const s = domain_array[i];\n out.push(s.match(/^xn--/) ? decode(s.slice(4)) : s);\n }\n return out.join('.');\n}\n\nexport default toUnicode;\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\nimport convertPunycode from '../../lib/punycode';\n\nimport { DEBUG, RE_TME_INVITE_LINK, RE_TME_LINK } from '../../config';\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n url?: string;\n text: string;\n className?: string;\n children?: any;\n isRtl?: boolean;\n};\n\nconst SafeLink: FC = ({\n url,\n text,\n className,\n children,\n isRtl,\n}) => {\n const { toggleSafeLinkModal, openTelegramLink } = getDispatch();\n\n const content = children || text;\n const isNotSafe = url !== content;\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (\n e.ctrlKey || e.altKey || e.shiftKey || e.metaKey\n || !url || (!url.match(RE_TME_LINK) && !url.match(RE_TME_INVITE_LINK))\n ) {\n if (isNotSafe) {\n toggleSafeLinkModal({ url });\n\n e.preventDefault();\n return false;\n }\n\n return true;\n }\n\n e.preventDefault();\n openTelegramLink({ url });\n\n return false;\n }, [isNotSafe, openTelegramLink, toggleSafeLinkModal, url]);\n\n if (!url) {\n return undefined;\n }\n\n const classNames = buildClassName(\n className || 'text-entity-link',\n text.length > 50 && 'long-word-break-all',\n );\n\n return (\n \n {content}\n \n );\n};\n\nfunction ensureProtocol(url?: string) {\n if (!url) {\n return undefined;\n }\n\n return url.includes('://') ? url : `https://${url}`;\n}\n\nfunction getDomain(url?: string) {\n if (!url) {\n return undefined;\n }\n\n const href = ensureProtocol(url);\n if (!href) {\n return undefined;\n }\n\n try {\n let decodedHref = decodeURI(href);\n\n const match = decodedHref.match(/^https?:\\/\\/([^/:?#]+)(?:[/:?#]|$)/i);\n if (!match) {\n return undefined;\n }\n const domain = match[1];\n decodedHref = decodedHref.replace(domain, convertPunycode(domain));\n\n return decodedHref;\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('SafeLink.getDecodedUrl error ', url, error);\n }\n }\n\n return undefined;\n}\n\nexport default memo(SafeLink);\n","import { ApiDocument } from '../../../api/types';\n\nconst ONE_GIGABYTE = 1024 * 1024 * 1024;\nconst ONE_MEGABYTE = 1024 * 1024;\n\nexport function getFileSizeString(bytes: number) {\n if (bytes > (ONE_GIGABYTE / 2)) {\n return `${(bytes / ONE_GIGABYTE).toFixed(1)} GB`;\n }\n if (bytes > (ONE_MEGABYTE / 2)) {\n return `${(bytes / ONE_MEGABYTE).toFixed(1)} MB`;\n }\n return `${(bytes / (1024)).toFixed(1)} KB`;\n}\n\nexport function getDocumentExtension(document: ApiDocument) {\n const { fileName, mimeType } = document;\n\n return getFileExtension(fileName, mimeType);\n}\n\nexport function getFileExtension(fileName: string, mimeType: string) {\n if (fileName && fileName.indexOf('.') !== -1) {\n return fileName.split('.').pop();\n } else {\n return mimeType.split('/').pop();\n }\n}\n\nexport function getColorFromExtension(extension: string) {\n switch (extension) {\n case 'apk':\n case 'xls':\n case 'xlsx':\n return 'green';\n case 'zip':\n case 'rar':\n case '7z':\n case 'tar':\n case 'gz':\n case 'ppt':\n case 'pptx':\n return 'orange';\n case 'pdf':\n case 'xps':\n return 'red';\n default:\n return 'default';\n }\n}\n\nexport function getDocumentHasPreview(document: ApiDocument) {\n return Boolean(document.previewBlobUrl || document.thumbnail);\n}\n","import { ApiError, ApiInviteInfo } from '../../api/types';\n\nconst STRIPE_ERRORS: Record> = {\n missing_payment_information: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n invalid_number: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n number: {\n field: 'cardNumber',\n fieldError: 'Incorrect card number',\n },\n exp_year: {\n field: 'expiry',\n fieldError: 'Incorrect year',\n },\n exp_month: {\n field: 'expiry',\n fieldError: 'Incorrect month',\n },\n invalid_expiry_year: {\n field: 'expiry',\n fieldError: 'Incorrect year',\n },\n invalid_expiry_month: {\n field: 'expiry',\n fieldError: 'Incorrect month',\n },\n cvc: {\n field: 'cvv',\n fieldError: 'Incorrect CVV',\n },\n invalid_cvc: {\n field: 'cvv',\n fieldError: 'Incorrect CVV',\n },\n};\n\nexport function getStripeError(error: {\n code: string;\n message: string;\n param?: string;\n}) {\n const { message, code, param } = error;\n const { field, fieldError, description } = param ? STRIPE_ERRORS[param] : STRIPE_ERRORS[code];\n return {\n field,\n fieldError,\n description: description || message,\n };\n}\n\nconst SHIPPING_ERRORS: Record> = {\n ADDRESS_STREET_LINE1_INVALID: {\n field: 'streetLine1',\n fieldError: 'Incorrect street address',\n },\n ADDRESS_STREET_LINE2_INVALID: {\n field: 'streetLine2',\n fieldError: 'Incorrect street address',\n },\n ADDRESS_CITY_INVALID: {\n field: 'city',\n fieldError: 'Incorrect city',\n },\n ADDRESS_COUNTRY_INVALID: {\n field: 'countryIso2',\n fieldError: 'Incorrect country',\n },\n ADDRESS_POSTCODE_INVALID: {\n field: 'postCode',\n fieldError: 'Incorrect post code',\n },\n ADDRESS_STATE_INVALID: {\n field: 'state',\n fieldError: 'Incorrect state',\n },\n REQ_INFO_NAME_INVALID: {\n field: 'fullName',\n fieldError: 'Incorrect name',\n },\n REQ_INFO_PHONE_INVALID: {\n field: 'phone',\n fieldError: 'Incorrect phone',\n },\n REQ_INFO_EMAIL_INVALID: {\n field: 'email',\n fieldError: 'Incorrect email',\n },\n};\n\n\nexport function getShippingErrors(dialogs: (ApiError | ApiInviteInfo)[]) {\n return Object.values(dialogs).reduce((acc, cur) => {\n if (!('hasErrorKey' in cur) || !cur.hasErrorKey) return acc;\n const error = SHIPPING_ERRORS[cur.message];\n if (error) {\n acc = {\n ...acc,\n [error.field]: error.fieldError,\n };\n }\n return acc;\n }, {});\n}\n","import { fastRaf } from './schedulers';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n}\n\nlet currentInstance: AnimationInstance | undefined;\n\nexport function animateSingle(tick: Function, instance?: AnimationInstance) {\n if (!instance) {\n if (currentInstance && !currentInstance.isCancelled) {\n currentInstance.isCancelled = true;\n }\n\n instance = { isCancelled: false };\n currentInstance = instance;\n }\n\n fastRaf(() => {\n if (!instance!.isCancelled && tick()) {\n animateSingle(tick, instance);\n }\n });\n}\n\nexport function animate(tick: Function) {\n fastRaf(() => {\n if (tick()) {\n animate(tick);\n }\n });\n}\n","import React, { FC, useState, useRef } from '../../lib/teact/teact';\n\nimport Menu from './Menu';\n\nimport './DropdownMenu.scss';\n\ntype OwnProps = {\n className?: string;\n trigger: FC<{ onTrigger: () => void; isOpen?: boolean }>;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n footer?: string;\n forceOpen?: boolean;\n onOpen?: NoneToVoidFunction;\n onClose?: NoneToVoidFunction;\n children: any;\n};\n\nconst DropdownMenu: FC = ({\n trigger,\n className,\n children,\n positionX = 'left',\n positionY = 'top',\n footer,\n forceOpen,\n onOpen,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const dropdownRef = useRef(null);\n const [isOpen, setIsOpen] = useState(false);\n\n const toggleIsOpen = () => {\n setIsOpen(!isOpen);\n if (isOpen) {\n if (onClose) onClose();\n } else if (onOpen) onOpen();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n const menu = menuRef.current;\n\n if (!isOpen || e.keyCode !== 40 || !menu) {\n return;\n }\n\n const focusedElement = document.activeElement;\n const elementChildren = Array.from(menu.children);\n\n if (!focusedElement || elementChildren.indexOf(focusedElement) === -1) {\n (elementChildren[0] as HTMLElement).focus();\n }\n };\n\n const handleClose = () => {\n setIsOpen(false);\n if (onClose) onClose();\n };\n\n return (\n \n {trigger({ onTrigger: toggleIsOpen, isOpen })}\n\n \n {children}\n \n
\n );\n};\n\nexport default DropdownMenu;\n","import { RefObject } from 'react';\nimport { useState, useCallback, useEffect } from '../lib/teact/teact';\n\nexport default (\n elementRef: RefObject,\n isOpen: boolean,\n onSelectWithEnter?: (index: number) => void,\n itemSelector?: string,\n noCaptureFocus?: boolean,\n) => {\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n useEffect(() => {\n setFocusedIndex(-1);\n\n const element = elementRef.current;\n if (isOpen && element && !noCaptureFocus) {\n element.tabIndex = -1;\n element.focus();\n }\n }, [elementRef, isOpen, noCaptureFocus]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n const element = elementRef.current;\n\n if (!element) {\n return;\n }\n\n if (e.keyCode === 13 && onSelectWithEnter) {\n onSelectWithEnter(focusedIndex);\n return;\n }\n\n if (e.keyCode !== 38 && e.keyCode !== 40) {\n return;\n }\n\n const focusedElement = document.activeElement;\n const elementChildren = Array.from(itemSelector ? element.querySelectorAll(itemSelector) : element.children);\n\n let newIndex = (focusedElement && elementChildren.indexOf(focusedElement)) || focusedIndex;\n\n if (e.keyCode === 38 && newIndex > 0) {\n newIndex--;\n } else if (e.keyCode === 40 && newIndex < elementChildren.length - 1) {\n newIndex++;\n } else if (elementChildren.length === 1) {\n newIndex = 0;\n } else {\n return;\n }\n\n const item = elementChildren[newIndex] as HTMLElement;\n if (item) {\n setFocusedIndex(newIndex);\n item.focus();\n }\n }, [elementRef, onSelectWithEnter, itemSelector, focusedIndex]);\n\n return handleKeyDown;\n};\n","// @ts-ignore\nimport twemojiRegex from '../../../lib/twemojiRegex';\n\nconst DETECT_UP_TO = 3;\nconst MAX_LENGTH = DETECT_UP_TO * 8; // Maximum 8 per one emoji.\nconst RE_EMOJI_ONLY = new RegExp(`^(?:${twemojiRegex.source})+$`, '');\n\nexport default (text: string): number | false => {\n if (text.length > MAX_LENGTH) {\n return false;\n }\n\n const isEmojiOnly = Boolean(text.match(RE_EMOJI_ONLY));\n if (!isEmojiOnly) {\n return false;\n }\n\n let emojiCount = 0;\n while (twemojiRegex.exec(text)) {\n emojiCount++;\n\n if (emojiCount > DETECT_UP_TO) {\n twemojiRegex.lastIndex = 0;\n return false;\n }\n }\n\n return emojiCount;\n};\n","// Due to the fact that emoji from Apple do not contain some characters, it is necessary to remove them from emoji-data\n// https://github.com/iamcal/emoji-data/issues/136\nconst EXCLUDE_EMOJIS = ['female_sign', 'male_sign', 'medical_symbol'];\n\nexport type EmojiRawData = typeof import('emoji-data-ios/emoji-data.json');\nexport type EmojiModule = { default: EmojiRawData };\n\nexport type EmojiData = {\n categories: Array;\n emojis: Record;\n};\n\nfunction unifiedToNative(unified: string) {\n const unicodes = unified.split('-');\n const codePoints = unicodes.map((i) => parseInt(i, 16));\n\n return String.fromCodePoint(...codePoints);\n}\n\nexport function nativeToUnfified(emoji: string) {\n let code;\n\n if (emoji.length === 1) {\n code = emoji.charCodeAt(0).toString(16).padStart(4, '0');\n } else {\n const pairs = [];\n for (let i = 0; i < emoji.length; i++) {\n if (emoji.charCodeAt(i) >= 0xd800 && emoji.charCodeAt(i) <= 0xdbff) {\n if (emoji.charCodeAt(i + 1) >= 0xdc00 && emoji.charCodeAt(i + 1) <= 0xdfff) {\n pairs.push(\n (emoji.charCodeAt(i) - 0xd800) * 0x400\n + (emoji.charCodeAt(i + 1) - 0xdc00) + 0x10000,\n );\n }\n } else if (emoji.charCodeAt(i) < 0xd800 || emoji.charCodeAt(i) > 0xdfff) {\n pairs.push(emoji.charCodeAt(i));\n }\n }\n\n code = pairs.map((x) => x.toString(16).padStart(4, '0')).join('-');\n }\n\n return code;\n}\n\nexport function uncompressEmoji(data: EmojiRawData): EmojiData {\n const emojiData: EmojiData = { categories: [], emojis: {} };\n\n for (let i = 0; i < data.length; i += 2) {\n const category = {\n id: data[i][0],\n name: data[i][1],\n emojis: [],\n } as EmojiCategory;\n\n for (let j = 0; j < data[i + 1].length; j++) {\n const emojiRaw = data[i + 1][j];\n if (!EXCLUDE_EMOJIS.includes(emojiRaw[1][0])) {\n category.emojis.push(emojiRaw[1][0]);\n emojiData.emojis[emojiRaw[1][0]] = {\n id: emojiRaw[1][0],\n names: emojiRaw[1] as string[],\n native: unifiedToNative(emojiRaw[0] as string),\n image: (emojiRaw[0] as string).toLowerCase(),\n };\n }\n }\n\n emojiData.categories.push(category);\n }\n\n return emojiData;\n}\n","import {\n hasElementChanged,\n isComponentElement,\n isEmptyElement,\n isRealElement,\n isTextElement,\n mountComponent,\n renderComponent,\n unmountTree,\n getTarget,\n setTarget,\n VirtualElement,\n VirtualElementComponent,\n VirtualRealElement,\n} from './teact';\nimport generateIdFor from '../../util/generateIdFor';\nimport { DEBUG } from '../../config';\nimport { addEventListener, removeEventListener } from './dom-events';\n\ntype VirtualDomHead = {\n children: [VirtualElement] | [];\n};\n\nconst FILTERED_ATTRIBUTES = new Set(['key', 'ref', 'teactFastList', 'teactOrderKey']);\nconst HTML_ATTRIBUTES = new Set(['dir']);\nconst MAPPED_ATTRIBUTES: { [k: string]: string } = {\n autoPlay: 'autoplay',\n autoComplete: 'autocomplete',\n};\nconst INDEX_KEY_PREFIX = '__indexKey#';\n\nconst headsByElement: Record = {};\nlet DEBUG_virtualTreeSize = 1;\n\nfunction render($element?: VirtualElement, parentEl?: HTMLElement | null) {\n if (!parentEl) {\n return undefined;\n }\n\n let headId = parentEl.getAttribute('data-teact-head-id');\n if (!headId) {\n headId = generateIdFor(headsByElement);\n headsByElement[headId] = { children: [] };\n parentEl.setAttribute('data-teact-head-id', headId);\n }\n\n const $head = headsByElement[headId];\n $head.children = [renderWithVirtual(parentEl, $head.children[0], $element, $head, 0) as VirtualElement];\n\n if (process.env.APP_ENV === 'perf') {\n DEBUG_virtualTreeSize = 0;\n DEBUG_addToVirtualTreeSize($head);\n\n return DEBUG_virtualTreeSize;\n }\n\n return undefined;\n}\n\nfunction renderWithVirtual(\n parentEl: HTMLElement,\n $current: VirtualElement | undefined,\n $new: VirtualElement | undefined,\n $parent: VirtualRealElement | VirtualDomHead,\n index: number,\n {\n skipComponentUpdate = false,\n forceIndex = false,\n fragment,\n moveDirection,\n }: {\n skipComponentUpdate?: boolean;\n forceIndex?: boolean;\n fragment?: DocumentFragment;\n moveDirection?: 'up' | 'down';\n } = {},\n) {\n if (\n !skipComponentUpdate\n && $current && $new\n && isComponentElement($current) && isComponentElement($new)\n && !hasElementChanged($current, $new)\n ) {\n $new = updateComponent($current, $new);\n }\n\n // Parent element may have changed, so we need to update the listener closure.\n if (!skipComponentUpdate && $new && isComponentElement($new) && $new.componentInstance.isMounted) {\n setupComponentUpdateListener($new, $parent, index, parentEl);\n }\n\n if ($current === $new) {\n return $new;\n }\n\n if (!$current && $new) {\n if (isComponentElement($new)) {\n $new = initComponent($new, $parent, index, parentEl);\n }\n\n const node = createNode($new);\n setTarget($new, node);\n\n if (forceIndex && parentEl.childNodes[index]) {\n parentEl.insertBefore(node, parentEl.childNodes[index]);\n } else {\n (fragment || parentEl).appendChild(node);\n }\n } else if ($current && !$new) {\n parentEl.removeChild(getTarget($current)!);\n unmountTree($current);\n } else if ($current && $new) {\n if (hasElementChanged($current, $new)) {\n if (isComponentElement($new)) {\n $new = initComponent($new, $parent, index, parentEl);\n }\n\n const node = createNode($new);\n setTarget($new, node);\n parentEl.replaceChild(node, getTarget($current)!);\n unmountTree($current);\n } else {\n const areComponents = isComponentElement($current) && isComponentElement($new);\n\n if (!areComponents) {\n setTarget($new, getTarget($current)!);\n }\n\n if (isRealElement($current) && isRealElement($new)) {\n if (moveDirection) {\n const node = getTarget($current)!;\n const nextSibling = parentEl.childNodes[moveDirection === 'up' ? index : index + 1];\n\n if (nextSibling) {\n parentEl.insertBefore(node, nextSibling);\n } else {\n (fragment || parentEl).appendChild(node);\n }\n }\n\n if (!areComponents) {\n updateAttributes($current, $new, getTarget($current) as HTMLElement);\n }\n\n $new.children = renderChildren(\n $current,\n $new,\n areComponents ? parentEl : getTarget($current) as HTMLElement,\n );\n }\n }\n }\n\n return $new;\n}\n\nfunction initComponent(\n $element: VirtualElementComponent, $parent: VirtualRealElement | VirtualDomHead, index: number, parentEl: HTMLElement,\n) {\n if (!isComponentElement($element)) {\n return $element;\n }\n\n const { componentInstance } = $element;\n\n if (!componentInstance.isMounted) {\n $element = mountComponent(componentInstance);\n setupComponentUpdateListener($element, $parent, index, parentEl);\n\n const $firstChild = $element.children[0];\n if (isComponentElement($firstChild)) {\n $element.children = [initComponent($firstChild, $element, 0, parentEl)];\n }\n\n componentInstance.isMounted = true;\n }\n\n return $element;\n}\n\nfunction updateComponent($current: VirtualElementComponent, $new: VirtualElementComponent) {\n $current.componentInstance.props = $new.componentInstance.props;\n\n return renderComponent($current.componentInstance);\n}\n\nfunction setupComponentUpdateListener(\n $element: VirtualElementComponent, $parent: VirtualRealElement | VirtualDomHead, index: number, parentEl: HTMLElement,\n) {\n const { componentInstance } = $element;\n\n componentInstance.onUpdate = () => {\n $parent.children[index] = renderWithVirtual(\n parentEl,\n $parent.children[index],\n componentInstance.$element,\n $parent,\n index,\n { skipComponentUpdate: true },\n ) as VirtualElementComponent;\n };\n}\n\nfunction createNode($element: VirtualElement): Node {\n if (isEmptyElement($element)) {\n return document.createTextNode('');\n }\n\n if (isTextElement($element)) {\n return document.createTextNode($element.value);\n }\n\n if (isComponentElement($element)) {\n return createNode($element.children[0] as VirtualElement);\n }\n\n const { tag, props, children = [] } = $element;\n const element = document.createElement(tag);\n\n if (typeof props.ref === 'object') {\n props.ref.current = element;\n }\n\n Object.keys(props).forEach((key) => {\n addAttribute(element, key, props[key]);\n });\n\n $element.children = children.map(($child, i) => (\n renderWithVirtual(element, undefined, $child, $element, i) as VirtualElement\n ));\n\n return element;\n}\n\nfunction renderChildren(\n $current: VirtualRealElement, $new: VirtualRealElement, currentEl: HTMLElement,\n) {\n if ($new.props.teactFastList) {\n return renderFastListChildren($current, $new, currentEl);\n }\n\n const maxLength = Math.max($current.children.length, $new.children.length);\n const newChildren = [];\n const fragment = $new.children.length > $current.children.length + 1 ? document.createDocumentFragment() : undefined;\n\n for (let i = 0; i < maxLength; i++) {\n const $newChild = renderWithVirtual(\n currentEl,\n $current.children[i],\n $new.children[i],\n $new,\n i,\n i >= $current.children.length ? { fragment } : undefined,\n );\n\n if ($newChild) {\n newChildren.push($newChild);\n }\n }\n\n if (fragment) {\n currentEl.appendChild(fragment);\n }\n\n return newChildren;\n}\n\nfunction renderFastListChildren($current: VirtualRealElement, $new: VirtualRealElement, currentEl: HTMLElement) {\n const newKeys = new Set(\n $new.children.map(($newChild) => {\n const key = 'props' in $newChild && $newChild.props.key;\n\n if (DEBUG && isRealElement($newChild) && !key) {\n // eslint-disable-next-line no-console\n console.warn('Missing `key` in `teactFastList`');\n }\n\n return key;\n }),\n );\n\n let currentRemainingIndex = 0;\n const remainingByKey = $current.children\n .reduce((acc, $currentChild, i) => {\n let key = 'props' in $currentChild ? $currentChild.props.key : undefined;\n\n // First we handle removed children\n if (key && !newKeys.has(key)) {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n } else if (!key) {\n const $newChild = $new.children[i];\n const newChildKey = ($newChild && 'props' in $newChild) ? $newChild.props.key : undefined;\n // If a non-key element remains at the same index we preserve it with a virtual `key`\n if ($newChild && !newChildKey) {\n key = `${INDEX_KEY_PREFIX}${i}`;\n } else {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n }\n }\n\n // Then we build up info about remaining children\n acc[key] = {\n $element: $currentChild,\n index: currentRemainingIndex++,\n order: 'props' in $currentChild ? $currentChild.props.teactOrderKey : undefined,\n };\n return acc;\n }, {} as Record);\n\n let newChildren: VirtualElement[] = [];\n\n let fragmentQueue: VirtualElement[] | undefined;\n let fragmentIndex: number | undefined;\n\n let currentPreservedIndex = 0;\n\n $new.children.forEach(($newChild, i) => {\n const key = 'props' in $newChild ? $newChild.props.key : `${INDEX_KEY_PREFIX}${i}`;\n const currentChildInfo = remainingByKey[key];\n\n if (!currentChildInfo) {\n // All new nodes are queued to be inserted with fragments if possible.\n if (!fragmentQueue) {\n fragmentQueue = [];\n fragmentIndex = i;\n }\n\n fragmentQueue.push($newChild);\n return;\n }\n\n if (fragmentQueue) {\n newChildren = newChildren.concat(flushFragmentQueue(fragmentQueue, fragmentIndex!, currentEl, $new));\n fragmentIndex = undefined;\n fragmentQueue = undefined;\n }\n\n // This is a \"magic\" `teactOrderKey` property that tells us the element is updated\n const order = 'props' in $newChild ? $newChild.props.teactOrderKey : undefined;\n const shouldMoveNode = currentChildInfo.index !== currentPreservedIndex && currentChildInfo.order !== order;\n const isMovingDown = shouldMoveNode && currentPreservedIndex > currentChildInfo.index;\n\n // When the node goes down, preserved indexing actually breaks, so the \"magic\" should help.\n if (!shouldMoveNode || isMovingDown) {\n currentPreservedIndex++;\n }\n\n newChildren.push(\n renderWithVirtual(currentEl, currentChildInfo.$element, $newChild, $new, i, {\n forceIndex: true,\n ...(shouldMoveNode && {\n moveDirection: isMovingDown ? 'down' : 'up',\n }),\n })!,\n );\n });\n\n if (fragmentQueue) {\n newChildren = newChildren.concat(flushFragmentQueue(fragmentQueue, fragmentIndex!, currentEl, $new));\n }\n\n return newChildren;\n}\n\nfunction flushFragmentQueue(\n fragmentQueue: VirtualElement[], fragmentIndex: number, parentEl: HTMLElement, $parent: VirtualRealElement,\n) {\n if (fragmentQueue.length === 1) {\n return [renderWithVirtual(parentEl, undefined, fragmentQueue[0], $parent, fragmentIndex, { forceIndex: true })!];\n } else if (fragmentQueue.length > 1) {\n const fragment = document.createDocumentFragment();\n const newChildren = fragmentQueue.map(($fragmentChild) => (\n renderWithVirtual(parentEl, undefined, $fragmentChild, $parent, fragmentIndex!, { fragment })!\n ));\n\n if (parentEl.childNodes[fragmentIndex]) {\n parentEl.insertBefore(fragment, parentEl.childNodes[fragmentIndex]);\n } else {\n parentEl.appendChild(fragment);\n }\n\n return newChildren;\n }\n\n throw new Error('Unexpected input');\n}\n\nfunction updateAttributes($current: VirtualRealElement, $new: VirtualRealElement, element: HTMLElement) {\n const currentKeys = Object.keys($current.props);\n const newKeys = Object.keys($new.props);\n\n currentKeys.forEach((key) => {\n if ($current.props[key] !== undefined && $new.props[key] === undefined) {\n removeAttribute(element, key, $current.props[key]);\n }\n });\n\n newKeys.forEach((key) => {\n if ($new.props[key] === undefined) {\n return;\n }\n\n if ($current.props[key] !== $new.props[key]) {\n if ($current.props[key] === undefined) {\n addAttribute(element, key, $new.props[key]);\n } else {\n updateAttribute(element, key, $current.props[key], $new.props[key]);\n }\n }\n });\n}\n\nfunction addAttribute(element: HTMLElement, key: string, value: any) {\n if (value === undefined) {\n return;\n }\n\n // An optimization attempt\n if (key === 'className') {\n element.className = value;\n // An optimization attempt\n } else if (key === 'value') {\n (element as HTMLInputElement).value = value;\n } else if (key === 'style') {\n element.style.cssText = value;\n } else if (key.startsWith('on')) {\n addEventListener(element, key, value, key.endsWith('Capture'));\n } else if (key.startsWith('data-') || HTML_ATTRIBUTES.has(key)) {\n element.setAttribute(key, value);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n (element as any)[MAPPED_ATTRIBUTES[key] || key] = value;\n }\n}\n\nfunction removeAttribute(element: HTMLElement, key: string, value: any) {\n if (key === 'className') {\n element.className = '';\n } else if (key === 'value') {\n (element as HTMLInputElement).value = '';\n } else if (key === 'style') {\n element.style.cssText = '';\n } else if (key.startsWith('on')) {\n removeEventListener(element, key, value, key.endsWith('Capture'));\n } else if (key.startsWith('data-') || HTML_ATTRIBUTES.has(key)) {\n element.removeAttribute(key);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n delete (element as any)[MAPPED_ATTRIBUTES[key] || key];\n }\n}\n\nfunction updateAttribute(element: HTMLElement, key: string, oldValue: any, newValue: any) {\n if (key === 'value') {\n // Removing and adding value causes a cursor jump\n (element as HTMLInputElement).value = newValue !== undefined ? newValue : '';\n } else {\n removeAttribute(element, key, oldValue);\n addAttribute(element, key, newValue);\n }\n}\n\nfunction DEBUG_addToVirtualTreeSize($current: VirtualRealElement | VirtualDomHead) {\n DEBUG_virtualTreeSize += $current.children.length;\n\n $current.children.forEach(($child) => {\n if (isRealElement($child)) {\n DEBUG_addToVirtualTreeSize($child);\n }\n });\n}\n\nexport default { render };\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n sender?: ApiUser | ApiChat;\n children: any;\n};\n\ntype DispatchProps = Pick;\n\nconst UserLink: FC = ({\n className, sender, openUserInfo, children,\n}) => {\n const handleClick = useCallback(() => {\n if (sender) {\n openUserInfo({ id: sender.id });\n }\n }, [sender, openUserInfo]);\n\n if (!sender) {\n return children;\n }\n\n return (\n {children}\n );\n};\n\nexport default withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['openUserInfo']),\n)(UserLink);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\nimport { ApiMessage } from '../../api/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n message?: ApiMessage;\n children: any;\n};\n\ntype DispatchProps = Pick;\n\nconst MessageLink: FC = ({\n className, message, children, focusMessage,\n}) => {\n const handleMessageClick = useCallback((): void => {\n if (message) {\n focusMessage({ chatId: message.chatId, messageId: message.id });\n }\n }, [focusMessage, message]);\n\n if (!message) {\n return children;\n }\n\n return (\n {children}\n );\n};\n\nexport default withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['focusMessage']),\n)(MessageLink);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../global/types';\n\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n chatId?: number;\n children: any;\n};\n\ntype DispatchProps = Pick;\n\nconst ChatLink: FC = ({\n className, chatId, openChat, children,\n}) => {\n const handleClick = useCallback(() => {\n if (chatId) {\n openChat({ id: chatId });\n }\n }, [chatId, openChat]);\n\n if (!chatId) {\n return children;\n }\n\n return (\n {children}\n );\n};\n\nexport default withGlobal(\n undefined,\n (setGlobal, actions): DispatchProps => pick(actions, ['openChat']),\n)(ChatLink);\n","import React from '../../../lib/teact/teact';\n\nimport { ApiChat, ApiMessage, ApiUser } from '../../../api/types';\nimport { LangFn } from '../../../hooks/useLang';\nimport {\n getChatTitle,\n getMessageContent,\n getMessageSummaryText,\n getUserFullName,\n isChat,\n} from '../../../modules/helpers';\nimport trimText from '../../../util/trimText';\nimport { TextPart } from './renderMessageText';\nimport renderText from './renderText';\n\nimport UserLink from '../UserLink';\nimport MessageLink from '../MessageLink';\nimport ChatLink from '../ChatLink';\n\ninterface ActionMessageTextOptions {\n maxTextLength?: number;\n asPlain?: boolean;\n isEmbedded?: boolean;\n}\n\nconst NBSP = '\\u00A0';\n\nexport function renderActionMessageText(\n lang: LangFn,\n message: ApiMessage,\n actionOrigin?: ApiUser | ApiChat,\n targetUsers?: ApiUser[],\n targetMessage?: ApiMessage,\n targetChatId?: number,\n options: ActionMessageTextOptions = {},\n) {\n if (!message.content.action) {\n return [];\n }\n const { text, translationValues } = message.content.action;\n const content: TextPart[] = [];\n const textOptions: ActionMessageTextOptions = { ...options, maxTextLength: 32 };\n const translationKey = text === 'Chat.Service.Group.UpdatedPinnedMessage1' && !targetMessage\n ? 'Message.PinnedGenericMessage'\n : text;\n\n let unprocessed: string;\n let processed = processPlaceholder(\n lang(translationKey, translationValues && translationValues.length ? translationValues : undefined),\n '%action_origin%',\n actionOrigin\n ? (!options.isEmbedded && renderOriginContent(lang, actionOrigin, options.asPlain)) || NBSP\n : 'User',\n );\n\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%target_user%',\n targetUsers\n ? targetUsers.map((user) => renderUserContent(user, options.asPlain)).filter(Boolean as any)\n : 'User',\n );\n\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%message%',\n targetMessage\n ? renderMessageContent(lang, targetMessage, textOptions)\n : 'a message',\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%product%',\n targetMessage\n ? renderProductContent(targetMessage)\n : 'a product',\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%target_chat%',\n targetChatId\n ? renderMigratedContent(targetChatId, options.asPlain)\n : 'another chat',\n );\n content.push(...processed);\n\n if (options.asPlain) {\n return content.join('').trim();\n }\n\n return content;\n}\n\nfunction renderProductContent(message: ApiMessage) {\n return message.content && message.content.invoice\n ? message.content.invoice.title\n : 'a product';\n}\n\nfunction renderMessageContent(lang: LangFn, message: ApiMessage, options: ActionMessageTextOptions = {}) {\n const text = getMessageSummaryText(lang, message);\n const {\n photo, video, document, sticker,\n } = getMessageContent(message);\n\n const { maxTextLength, isEmbedded, asPlain } = options;\n\n const showQuotes = isEmbedded && text && !photo && !video && !document && !sticker;\n let messageText = trimText(text as string, maxTextLength)!;\n\n if (isEmbedded) {\n if (photo) {\n messageText = 'a photo';\n } else if (video) {\n messageText = video.isGif ? 'a GIF' : 'a video';\n } else if (document) {\n messageText = 'a document';\n } else if (sticker) {\n messageText = text;\n }\n }\n\n if (asPlain) {\n return showQuotes ? `«${messageText}»` : messageText;\n }\n\n if (showQuotes) {\n return (\n \n «\n {renderText(messageText)}\n »\n \n );\n }\n\n return (\n {renderText(messageText)}\n );\n}\n\nfunction renderOriginContent(lang: LangFn, origin: ApiUser | ApiChat, asPlain?: boolean) {\n return isChat(origin)\n ? renderChatContent(lang, origin, asPlain)\n : renderUserContent(origin, asPlain);\n}\n\nfunction renderUserContent(sender: ApiUser, asPlain?: boolean): string | TextPart | undefined {\n const text = trimText(getUserFullName(sender));\n\n if (asPlain) {\n return text;\n }\n\n return {sender && renderText(text!)};\n}\n\nfunction renderChatContent(lang: LangFn, chat: ApiChat, asPlain?: boolean): string | TextPart | undefined {\n const text = trimText(getChatTitle(lang, chat));\n\n if (asPlain) {\n return text;\n }\n\n return {chat && renderText(text!)};\n}\n\nfunction renderMigratedContent(chatId: number, asPlain?: boolean): string | TextPart | undefined {\n const text = 'another chat';\n\n if (asPlain) {\n return text;\n }\n\n return {text};\n}\n\nfunction processPlaceholder(text: string, placeholder: string, replaceValue?: TextPart | TextPart[]): TextPart[] {\n const placeholderPosition = text.indexOf(placeholder);\n if (placeholderPosition < 0 || !replaceValue) {\n return [text];\n }\n\n const content: TextPart[] = [];\n content.push(text.substring(0, placeholderPosition));\n if (Array.isArray(replaceValue)) {\n replaceValue.forEach((value, index) => {\n content.push(value);\n if (index + 1 < replaceValue.length) {\n content.push(', ');\n }\n });\n } else {\n content.push(replaceValue);\n }\n content.push(text.substring(placeholderPosition + placeholder.length));\n\n return content;\n}\n","export interface ApiDimensions {\n width: number;\n height: number;\n}\n\nexport interface ApiPhotoSize extends ApiDimensions {\n type: 's' | 'm' | 'x' | 'y' | 'z';\n}\n\nexport interface ApiThumbnail extends ApiDimensions {\n dataUri: string;\n}\n\nexport interface ApiPhoto {\n id: string;\n thumbnail?: ApiThumbnail;\n sizes: ApiPhotoSize[];\n blobUrl?: string;\n}\n\nexport interface ApiSticker {\n id: string;\n stickerSetId: string;\n stickerSetAccessHash?: string;\n emoji?: string;\n isAnimated: boolean;\n width?: number;\n height?: number;\n thumbnail?: ApiThumbnail;\n isPreloadedGlobally?: boolean;\n}\n\nexport interface ApiStickerSet {\n archived?: true;\n isAnimated?: true;\n installedDate?: number;\n id: string;\n accessHash: string;\n title: string;\n hasThumbnail?: boolean;\n count: number;\n hash: number;\n stickers?: ApiSticker[];\n packs?: Record;\n covers?: ApiSticker[];\n}\n\nexport interface ApiVideo {\n id: string;\n mimeType: string;\n duration: number;\n fileName: string;\n width?: number;\n height?: number;\n supportsStreaming?: boolean;\n isRound?: boolean;\n isGif?: boolean;\n thumbnail?: ApiThumbnail;\n blobUrl?: string;\n size: number;\n}\n\nexport interface ApiAudio {\n size: number;\n mimeType: string;\n fileName: string;\n duration: number;\n performer?: string;\n title?: string;\n}\n\nexport interface ApiVoice {\n duration: number;\n waveform?: number[];\n}\n\nexport interface ApiDocument {\n id?: string;\n fileName: string;\n size: number;\n timestamp?: number;\n mimeType: string;\n thumbnail?: ApiThumbnail;\n previewBlobUrl?: string;\n mediaType?: 'photo' | 'video';\n mediaSize?: ApiDimensions;\n}\n\nexport interface ApiContact {\n firstName: string;\n lastName: string;\n phoneNumber: string;\n userId: number;\n}\n\nexport interface ApiPollAnswer {\n text: string;\n option: string;\n}\n\nexport interface ApiPollResult {\n isChosen?: true;\n isCorrect?: true;\n option: string;\n votersCount: number;\n}\n\nexport interface ApiPoll {\n id: string;\n summary: {\n closed?: true;\n isPublic?: true;\n multipleChoice?: true;\n quiz?: true;\n question: string;\n answers: ApiPollAnswer[];\n closePeriod?: number;\n closeDate?: number;\n };\n results: {\n results?: ApiPollResult[];\n totalVoters?: number;\n recentVoterIds?: number[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n}\n\nexport interface ApiInvoice {\n text: string;\n title: string;\n photoUrl?: string;\n description?: string;\n receiptMsgId?: number;\n}\n\nexport type ApiNewPoll = {\n summary: ApiPoll['summary'];\n quiz?: {\n correctAnswers: string[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n};\n\nexport interface ApiAction {\n text: string;\n targetUserIds?: number[];\n targetChatId?: number;\n type: 'historyClear' | 'contactSignUp' | 'chatCreate' | 'other';\n photo?: ApiPhoto;\n translationValues: string[];\n}\n\nexport interface ApiWebPage {\n id: number;\n url: string;\n displayUrl: string;\n type?: string;\n siteName?: string;\n title?: string;\n description?: string;\n photo?: ApiPhoto;\n duration?: number;\n document?: ApiDocument;\n video?: ApiVideo;\n}\n\nexport interface ApiMessageForwardInfo {\n isChannelPost: boolean;\n isLinkedChannelPost?: boolean;\n fromChatId?: number;\n senderUserId?: number;\n fromMessageId?: number;\n hiddenUserName?: string;\n adminTitle?: string;\n}\n\nexport interface ApiMessageEntity {\n type: string;\n offset: number;\n length: number;\n userId?: number;\n url?: string;\n}\n\nexport enum ApiMessageEntityTypes {\n Bold = 'MessageEntityBold',\n Blockquote = 'MessageEntityBlockquote',\n BotCommand = 'MessageEntityBotCommand',\n Cashtag = 'MessageEntityCashtag',\n Code = 'MessageEntityCode',\n Email = 'MessageEntityEmail',\n Hashtag = 'MessageEntityHashtag',\n Italic = 'MessageEntityItalic',\n MentionName = 'MessageEntityMentionName',\n Mention = 'MessageEntityMention',\n Phone = 'MessageEntityPhone',\n Pre = 'MessageEntityPre',\n Strike = 'MessageEntityStrike',\n TextUrl = 'MessageEntityTextUrl',\n Url = 'MessageEntityUrl',\n Underline = 'MessageEntityUnderline',\n Unknown = 'MessageEntityUnknown',\n}\n\nexport interface ApiFormattedText {\n text: string;\n entities?: ApiMessageEntity[];\n}\n\nexport interface ApiMessage {\n id: number;\n chatId: number;\n content: {\n text?: ApiFormattedText;\n photo?: ApiPhoto;\n video?: ApiVideo;\n document?: ApiDocument;\n sticker?: ApiSticker;\n contact?: ApiContact;\n poll?: ApiPoll;\n action?: ApiAction;\n webPage?: ApiWebPage;\n audio?: ApiAudio;\n voice?: ApiVoice;\n invoice?: ApiInvoice;\n };\n date: number;\n isOutgoing: boolean;\n senderId?: number;\n replyToMessageId?: number;\n replyToTopMessageId?: number;\n sendingState?: 'messageSendingStatePending' | 'messageSendingStateFailed';\n forwardInfo?: ApiMessageForwardInfo;\n isDeleting?: boolean;\n previousLocalId?: number;\n views?: number;\n isEdited?: boolean;\n isMediaUnread?: boolean;\n groupedId?: string;\n isInAlbum?: boolean;\n hasUnreadMention?: boolean;\n inlineButtons?: ApiKeyboardButtons;\n keyboardButtons?: ApiKeyboardButtons;\n viaBotId?: number;\n threadInfo?: ApiThreadInfo;\n adminTitle?: string;\n isScheduled?: boolean;\n shouldHideKeyboardButtons?: boolean;\n isFromScheduled?: boolean;\n}\n\nexport interface ApiThreadInfo {\n threadId: number;\n chatId: number;\n topMessageId?: number;\n originChannelId?: number;\n messagesCount: number;\n lastMessageId?: number;\n lastReadInboxMessageId?: number;\n recentReplierIds?: number[];\n}\n\nexport type ApiMessageOutgoingStatus = 'read' | 'succeeded' | 'pending' | 'failed';\n\nexport interface ApiKeyboardButton {\n type: 'command' | 'url' | 'callback' | 'requestPoll' | 'buy' | 'NOT_SUPPORTED';\n text: string;\n messageId: number;\n value?: string;\n}\n\nexport type ApiKeyboardButtons = ApiKeyboardButton[][];\n\nexport type ApiMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'profilePhoto';\nexport type ApiGlobalMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\n\nexport type ApiReportReason = 'spam' | 'violence' | 'pornography' | 'childAbuse'\n| 'copyright' | 'geoIrrelevant' | 'fake' | 'other';\n\nexport const MAIN_THREAD_ID = -1;\n\n// `Symbol` can not be transferred from worker\nexport const MESSAGE_DELETED = 'MESSAGE_DELETED';\n","// We cache avatars as Data URI for faster initial load\n// and messages media as Blob for smaller size.\n\nexport enum ApiMediaFormat {\n DataUri,\n BlobUrl,\n Lottie,\n Progressive,\n Stream,\n}\n\nexport type ApiParsedMedia = string | Blob | AnyLiteral | ArrayBuffer;\nexport type ApiPreparedMedia = string | AnyLiteral;\nexport type ApiMediaFormatToPrepared = T extends ApiMediaFormat.Lottie ? AnyLiteral : string;\n","import React, { FC } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport { pick } from '../../../util/iteratees';\nimport { selectUser } from '../../../modules/selectors';\n\ntype OwnProps = {\n userId?: number;\n username?: string;\n children: any;\n};\n\ntype StateProps = {\n userOrChat?: ApiUser | ApiChat;\n};\n\ntype DispatchProps = Pick;\n\nconst MentionLink: FC = ({\n username,\n userOrChat,\n children,\n openChat,\n openChatByUsername,\n}) => {\n const handleClick = () => {\n if (userOrChat) {\n openChat({ id: userOrChat.id });\n } else if (username) {\n openChatByUsername({ username: username.substring(1) });\n }\n };\n\n return (\n \n {children}\n \n );\n};\n\nexport default withGlobal(\n (global, { userId }): StateProps => {\n return {\n userOrChat: userId ? selectUser(global, userId) : undefined,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['openChat', 'openChatByUsername']),\n)(MentionLink);\n","import { DEBUG } from '../config';\n\nexport function updateAppBadge(unreadCount: number) {\n if (typeof window.navigator.setAppBadge !== 'function') {\n return;\n }\n\n window.navigator.setAppBadge(unreadCount).catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n });\n}\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\n\nconst BACKDROP_CLASSNAME = 'backdrop';\n\n// This effect implements closing menus by clicking outside of them\n// without adding extra elements to the DOM\nexport default function useVirtualBackdrop(\n isOpen: boolean,\n menuRef: RefObject,\n onClose?: () => void | undefined,\n) {\n useEffect(() => {\n const handleEvent = (e: Event) => {\n const menu = menuRef.current;\n const target = e.target as HTMLElement | null;\n if (!menu || !target) {\n return;\n }\n\n if (\n !menu.contains(e.target as Node | null)\n || target.classList.contains(BACKDROP_CLASSNAME)\n ) {\n e.preventDefault();\n e.stopPropagation();\n if (onClose) {\n onClose();\n }\n }\n };\n\n if (isOpen && onClose) {\n document.addEventListener('mousedown', handleEvent);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleEvent);\n };\n }, [isOpen, menuRef, onClose]);\n}\n","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"f04c4dace6672b308b1e.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"5054ce745024de60a724.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"695e66b225ec96107343.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"4c9029ba18603b924ede.worker.js\");\n};","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ANIMATION_LEVEL_MAX } from '../../../config';\nimport {\n IS_ANDROID, IS_IOS, IS_MAC_OS, IS_SAFARI, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport { setLanguage } from '../../../util/langProvider';\nimport switchTheme from '../../../util/switchTheme';\nimport { selectTheme } from '../../selectors';\n\nconst HISTORY_ANIMATION_DURATION = 450;\n\nsubscribeToSystemThemeChange();\n\naddReducer('init', (global) => {\n const { animationLevel, messageTextSize, language } = global.settings.byKey;\n const theme = selectTheme(global);\n\n setLanguage(language, undefined, true);\n\n document.documentElement.style.setProperty(\n '--composer-text-size', `${Math.max(messageTextSize, IS_IOS ? 16 : 15)}px`,\n );\n document.documentElement.style.setProperty('--message-text-size', `${messageTextSize}px`);\n document.body.classList.add('initial');\n document.body.classList.add(`animation-level-${animationLevel}`);\n document.body.classList.add(IS_TOUCH_ENV ? 'is-touch-env' : 'is-pointer-env');\n switchTheme(theme, animationLevel === ANIMATION_LEVEL_MAX);\n\n if (IS_SAFARI) {\n document.body.classList.add('is-safari');\n }\n if (IS_IOS) {\n document.body.classList.add('is-ios');\n } else if (IS_ANDROID) {\n document.body.classList.add('is-android');\n } else if (IS_MAC_OS) {\n document.body.classList.add('is-macos');\n }\n});\n\naddReducer('setIsUiReady', (global, actions, payload) => {\n const { uiReadyState } = payload!;\n\n if (uiReadyState === 2) {\n document.body.classList.remove('initial');\n }\n\n return {\n ...global,\n uiReadyState,\n };\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n return {\n ...global,\n authPhoneNumber: phoneNumber,\n };\n});\n\naddReducer('setAuthRememberMe', (global, actions, payload) => {\n return {\n ...global,\n authRememberMe: Boolean(payload),\n };\n});\n\naddReducer('clearAuthError', (global) => {\n return {\n ...global,\n authError: undefined,\n };\n});\n\naddReducer('disableHistoryAnimations', () => {\n setTimeout(() => {\n setGlobal({\n ...getGlobal(),\n shouldSkipHistoryAnimations: false,\n });\n document.body.classList.remove('no-animate');\n }, HISTORY_ANIMATION_DURATION);\n\n setGlobal({\n ...getGlobal(),\n shouldSkipHistoryAnimations: true,\n }, true);\n});\n\nfunction subscribeToSystemThemeChange() {\n function handleSystemThemeChange() {\n const currentThemeMatch = document.documentElement.className.match(/theme-(\\w+)/);\n const currentTheme = currentThemeMatch ? currentThemeMatch[1] : 'light';\n const global = getGlobal();\n const nextTheme = selectTheme(global);\n const { animationLevel } = global.settings.byKey;\n\n if (nextTheme !== currentTheme) {\n switchTheme(nextTheme, animationLevel === ANIMATION_LEVEL_MAX);\n // Force-update component containers\n setGlobal({ ...global });\n }\n }\n\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handleSystemThemeChange);\n } else if (typeof mql.addListener === 'function') {\n mql.addListener(handleSystemThemeChange);\n }\n}\n","import { addReducer } from '../../../lib/teact/teactn';\nimport { ISettings, IThemeSettings, ThemeKey } from '../../../types';\nimport { replaceSettings, replaceThemeSettings } from '../../reducers';\n\naddReducer('setSettingOption', (global, actions, payload?: Partial) => {\n return replaceSettings(global, payload);\n});\n\naddReducer('setThemeSettings', (global, actions, payload: { theme: ThemeKey } & Partial) => {\n const { theme, ...settings } = payload;\n\n return replaceThemeSettings(global, theme, settings);\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { initApi, callApi } from '../../../api/gramjs';\nimport { GlobalState } from '../../../global/types';\n\nimport {\n LANG_CACHE_NAME,\n CUSTOM_BG_CACHE_NAME,\n MEDIA_CACHE_NAME,\n MEDIA_CACHE_NAME_AVATARS,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n IS_TEST,\n} from '../../../config';\nimport { PLATFORM_ENV } from '../../../util/environment';\nimport { unsubscribe } from '../../../util/notifications';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { updateAppBadge } from '../../../util/appBadge';\nimport {\n storeSession,\n loadStoredSession,\n clearStoredSession,\n importLegacySession,\n clearLegacySessions,\n} from '../../../util/sessions';\n\naddReducer('initApi', (global: GlobalState, actions) => {\n (async () => {\n if (!IS_TEST) {\n await importLegacySession();\n void clearLegacySessions();\n }\n\n void initApi(actions.apiUpdate, {\n userAgent: navigator.userAgent,\n platform: PLATFORM_ENV,\n sessionData: loadStoredSession(),\n });\n })();\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n void callApi('provideAuthPhoneNumber', phoneNumber.replace(/[^\\d]/g, ''));\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('setAuthCode', (global, actions, payload) => {\n const { code } = payload!;\n\n void callApi('provideAuthCode', code);\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('setAuthPassword', (global, actions, payload) => {\n const { password } = payload!;\n\n void callApi('provideAuthPassword', password);\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('uploadProfilePhoto', (global, actions, payload) => {\n const { file } = payload!;\n\n void callApi('uploadProfilePhoto', file);\n});\n\naddReducer('signUp', (global, actions, payload) => {\n const { firstName, lastName } = payload!;\n\n void callApi('provideAuthRegistration', { firstName, lastName });\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('returnToAuthPhoneNumber', (global) => {\n void callApi('restartAuth');\n\n return {\n ...global,\n authError: undefined,\n };\n});\n\naddReducer('goToAuthQrCode', (global) => {\n void callApi('restartAuthWithQr');\n\n return {\n ...global,\n authIsLoadingQrCode: true,\n authError: undefined,\n };\n});\n\naddReducer('saveSession', (global, actions, payload) => {\n const { sessionData } = payload;\n\n if (sessionData) {\n storeSession(payload.sessionData, global.currentUserId);\n } else {\n clearStoredSession();\n }\n});\n\naddReducer('signOut', () => {\n (async () => {\n try {\n await unsubscribe();\n await callApi('destroy');\n } catch (err) {\n // Do nothing\n }\n\n getDispatch().reset();\n })();\n});\n\naddReducer('reset', () => {\n clearStoredSession();\n\n void cacheApi.clear(MEDIA_CACHE_NAME);\n void cacheApi.clear(MEDIA_CACHE_NAME_AVATARS);\n void cacheApi.clear(MEDIA_PROGRESSIVE_CACHE_NAME);\n void cacheApi.clear(CUSTOM_BG_CACHE_NAME);\n\n const langCachePrefix = LANG_CACHE_NAME.replace(/\\d+$/, '');\n const langCacheVersion = (LANG_CACHE_NAME.match(/\\d+$/) || [0])[0];\n for (let i = 0; i < langCacheVersion; i++) {\n void cacheApi.clear(`${langCachePrefix}${i === 0 ? '' : i}`);\n }\n\n void clearLegacySessions();\n\n updateAppBadge(0);\n\n getDispatch().init();\n});\n\naddReducer('disconnect', () => {\n (async () => {\n await callApi('disconnect');\n })();\n});\n\naddReducer('loadNearestCountry', (global) => {\n if (global.connectionState !== 'connectionStateReady') {\n return;\n }\n\n (async () => {\n const authNearestCountry = await callApi('fetchNearestCountry');\n\n setGlobal({\n ...getGlobal(),\n authNearestCountry,\n });\n })();\n});\n\naddReducer('setDeviceToken', (global, actions, deviceToken) => {\n setGlobal({\n ...global,\n push: {\n deviceToken,\n subscribedAt: Date.now(),\n },\n });\n});\n\naddReducer('deleteDeviceToken', (global) => {\n const newGlobal = { ...global };\n delete newGlobal.push;\n setGlobal(newGlobal);\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport {\n ApiPrivacyKey, PrivacyVisibility, ProfileEditProgress, IInputPrivacyRules, IInputPrivacyContact,\n UPLOADING_WALLPAPER_SLUG,\n} from '../../../types';\n\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { selectUser } from '../../selectors';\nimport {\n addUsers, addBlockedContact, updateChats, updateUser, removeBlockedContact, replaceSettings, updateNotifySettings,\n addNotifyExceptions,\n} from '../../reducers';\nimport { isChatPrivate } from '../../helpers';\n\naddReducer('updateProfile', (global, actions, payload) => {\n const {\n photo, firstName, lastName, bio: about, username,\n } = payload!;\n\n (async () => {\n const { currentUserId } = global;\n if (!currentUserId) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.InProgress,\n },\n });\n\n if (photo) {\n await callApi('updateProfilePhoto', photo);\n }\n\n if (firstName || lastName || about) {\n const result = await callApi('updateProfile', { firstName, lastName, about });\n if (result) {\n global = getGlobal();\n const currentUser = currentUserId && selectUser(global, currentUserId);\n\n if (currentUser) {\n setGlobal(updateUser(\n global,\n currentUser.id,\n {\n firstName,\n lastName,\n fullInfo: {\n ...currentUser.fullInfo,\n bio: about,\n },\n },\n ));\n }\n }\n }\n\n if (username) {\n const result = await callApi('updateUsername', username);\n if (result && currentUserId) {\n setGlobal(updateUser(getGlobal(), currentUserId, { username }));\n }\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.Complete,\n },\n });\n })();\n});\n\naddReducer('checkUsername', (global, actions, payload) => {\n const { username } = payload!;\n\n (async () => {\n // No need to check the username if profile update is already in progress\n if (global.profileEdit && global.profileEdit.progress === ProfileEditProgress.InProgress) {\n return;\n }\n\n setGlobal({\n ...global,\n profileEdit: {\n progress: global.profileEdit ? global.profileEdit.progress : ProfileEditProgress.Idle,\n isUsernameAvailable: undefined,\n },\n });\n\n const isUsernameAvailable = await callApi('checkUsername', username);\n\n global = getGlobal();\n setGlobal({\n ...global,\n profileEdit: {\n ...global.profileEdit!,\n isUsernameAvailable,\n },\n });\n })();\n});\n\naddReducer('loadWallpapers', () => {\n (async () => {\n const result = await callApi('fetchWallpapers', 0);\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: result.wallpapers,\n },\n });\n })();\n});\n\naddReducer('uploadWallpaper', (global, actions, payload) => {\n const file = payload;\n const previewBlobUrl = URL.createObjectURL(file);\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n {\n slug: UPLOADING_WALLPAPER_SLUG,\n document: {\n fileName: '',\n size: file.size,\n mimeType: file.type,\n previewBlobUrl,\n },\n },\n ...(global.settings.loadedWallpapers || []),\n ],\n },\n });\n\n (async () => {\n const result = await callApi('uploadWallpaper', file);\n if (!result) {\n return;\n }\n\n const { wallpaper } = result;\n\n global = getGlobal();\n if (!global.settings.loadedWallpapers) {\n return;\n }\n\n const firstWallpaper = global.settings.loadedWallpapers[0];\n if (!firstWallpaper || firstWallpaper.slug !== UPLOADING_WALLPAPER_SLUG) {\n return;\n }\n\n const withLocalMedia = {\n ...wallpaper,\n document: {\n ...wallpaper.document,\n previewBlobUrl,\n },\n };\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n withLocalMedia,\n ...global.settings.loadedWallpapers.slice(1),\n ],\n },\n });\n })();\n});\n\naddReducer('loadBlockedContacts', () => {\n (async () => {\n const result = await callApi('fetchBlockedContacts');\n\n if (!result) {\n return;\n }\n\n let newGlobal = getGlobal();\n\n if (result.users && result.users.length) {\n newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users, 'id'));\n }\n if (result.chats && result.chats.length) {\n newGlobal = updateChats(newGlobal, buildCollectionByKey(result.chats, 'id'));\n }\n\n newGlobal = {\n ...newGlobal,\n blocked: {\n ...newGlobal.blocked,\n ids: [...(newGlobal.blocked.ids || []), ...result.blockedIds],\n totalCount: result.totalCount,\n },\n };\n\n setGlobal(newGlobal);\n })();\n});\n\naddReducer('blockContact', (global, actions, payload) => {\n const { contactId, accessHash } = payload!;\n\n (async () => {\n const result = await callApi('blockContact', contactId, accessHash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal(addBlockedContact(newGlobal, contactId));\n })();\n});\n\naddReducer('unblockContact', (global, actions, payload) => {\n const { contactId } = payload!;\n let accessHash: string | undefined;\n const isPrivate = isChatPrivate(contactId);\n\n if (isPrivate) {\n const user = selectUser(global, contactId);\n if (!user) {\n return;\n }\n\n accessHash = user.accessHash;\n }\n\n (async () => {\n const result = await callApi('unblockContact', contactId, accessHash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal(removeBlockedContact(newGlobal, contactId));\n })();\n});\n\naddReducer('loadAuthorizations', () => {\n (async () => {\n const result = await callApi('fetchAuthorizations');\n if (!result) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n activeSessions: result,\n });\n })();\n});\n\naddReducer('terminateAuthorization', (global, actions, payload) => {\n const { hash } = payload!;\n\n (async () => {\n const result = await callApi('terminateAuthorization', hash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n activeSessions: newGlobal.activeSessions.filter((session) => session.hash !== hash),\n });\n })();\n});\n\naddReducer('terminateAllAuthorizations', () => {\n (async () => {\n const result = await callApi('terminateAllAuthorizations');\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n activeSessions: global.activeSessions.filter((session) => session.isCurrent),\n });\n })();\n});\n\naddReducer('loadNotificationExceptions', (global) => {\n const { serverTimeOffset } = global;\n\n (async () => {\n const result = await callApi('fetchNotificationExceptions', { serverTimeOffset });\n if (!result) {\n return;\n }\n\n setGlobal(addNotifyExceptions(getGlobal(), result));\n })();\n});\n\naddReducer('loadNotificationSettings', (global) => {\n const { serverTimeOffset } = global;\n (async () => {\n const result = await callApi('fetchNotificationSettings', {\n serverTimeOffset,\n });\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), result));\n })();\n});\n\naddReducer('updateNotificationSettings', (global, actions, payload) => {\n const { peerType, isSilent, shouldShowPreviews } = payload!;\n\n (async () => {\n const result = await callApi('updateNotificationSettings', peerType, { isSilent, shouldShowPreviews });\n\n if (!result) {\n return;\n }\n\n setGlobal(updateNotifySettings(getGlobal(), peerType, isSilent, shouldShowPreviews));\n })();\n});\n\naddReducer('updateContactSignUpNotification', (global, actions, payload) => {\n const { isSilent } = payload!;\n\n (async () => {\n const result = await callApi('updateContactSignUpNotification', isSilent);\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { hasContactJoinedNotifications: !isSilent }));\n })();\n});\n\naddReducer('loadLanguages', () => {\n (async () => {\n const result = await callApi('fetchLanguages');\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { languages: result }));\n })();\n});\n\naddReducer('loadPrivacySettings', () => {\n (async () => {\n const [\n phoneNumberSettings, lastSeenSettings, profilePhotoSettings, forwardsSettings, chatInviteSettings,\n ] = await Promise.all([\n callApi('fetchPrivacySettings', 'phoneNumber'),\n callApi('fetchPrivacySettings', 'lastSeen'),\n callApi('fetchPrivacySettings', 'profilePhoto'),\n callApi('fetchPrivacySettings', 'forwards'),\n callApi('fetchPrivacySettings', 'chatInvite'),\n ]);\n\n if (\n !phoneNumberSettings || !lastSeenSettings || !profilePhotoSettings || !forwardsSettings || !chatInviteSettings\n ) {\n return;\n }\n\n const global = getGlobal();\n\n global.settings.privacy.phoneNumber = phoneNumberSettings;\n global.settings.privacy.lastSeen = lastSeenSettings;\n global.settings.privacy.profilePhoto = profilePhotoSettings;\n global.settings.privacy.forwards = forwardsSettings;\n global.settings.privacy.chatInvite = chatInviteSettings;\n\n setGlobal(global);\n })();\n});\n\naddReducer('setPrivacyVisibility', (global, actions, payload) => {\n const { privacyKey, visibility } = payload!;\n\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility,\n allowedIds: [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n (async () => {\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n\n if (result) {\n const newGlobal = getGlobal();\n\n newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result;\n\n setGlobal(newGlobal);\n }\n })();\n});\n\naddReducer('setPrivacySettings', (global, actions, payload) => {\n const { privacyKey, isAllowList, contactsIds } = payload!;\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility: settings.visibility,\n allowedIds: isAllowList ? contactsIds : [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: !isAllowList ? contactsIds : [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n (async () => {\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n\n if (result) {\n const newGlobal = getGlobal();\n\n newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result;\n\n setGlobal(newGlobal);\n }\n })();\n});\n\nfunction buildInputPrivacyRules(global: GlobalState, {\n visibility,\n allowedIds,\n deniedIds,\n}: {\n visibility: PrivacyVisibility;\n allowedIds: number[];\n deniedIds: number[];\n}): IInputPrivacyRules {\n const {\n users: { byId: usersById },\n chats: { byId: chatsById },\n } = global;\n\n const rules: IInputPrivacyRules = {\n visibility,\n };\n let users: IInputPrivacyContact[];\n let chats: IInputPrivacyContact[];\n\n const collectUsers = (userId: number) => {\n if (!isChatPrivate(userId)) {\n return undefined;\n }\n const { id, accessHash } = usersById[userId] || {};\n if (!id) {\n return undefined;\n }\n\n return { id, accessHash };\n };\n\n const collectChats = (userId: number) => {\n if (isChatPrivate(userId)) {\n return undefined;\n }\n const chat = chatsById[userId];\n\n return chat ? { id: chat.id } : undefined;\n };\n\n if (visibility === 'contacts' || visibility === 'nobody') {\n users = allowedIds.map(collectUsers).filter(Boolean) as IInputPrivacyContact[];\n chats = allowedIds.map(collectChats).filter(Boolean) as IInputPrivacyContact[];\n\n if (users.length > 0) {\n rules.allowedUsers = users;\n }\n if (chats.length > 0) {\n rules.allowedChats = chats;\n }\n }\n\n if (visibility === 'everybody' || visibility === 'contacts') {\n users = deniedIds.map(collectUsers).filter(Boolean) as IInputPrivacyContact[];\n chats = deniedIds.map(collectChats).filter(Boolean) as IInputPrivacyContact[];\n\n if (users.length > 0) {\n rules.blockedUsers = users;\n }\n if (chats.length > 0) {\n rules.blockedChats = chats;\n }\n }\n\n return rules;\n}\n\naddReducer('updateIsOnline', (global, actions, payload) => {\n callApi('updateIsOnline', payload);\n});\n\naddReducer('loadContentSettings', () => {\n (async () => {\n const result = await callApi('fetchContentSettings');\n if (!result) return;\n\n setGlobal(replaceSettings(getGlobal(), result));\n })();\n});\n\naddReducer('updateContentSettings', (global, actions, payload) => {\n (async () => {\n setGlobal(replaceSettings(getGlobal(), { isSensitiveEnabled: payload }));\n\n const result = await callApi('updateContentSettings', payload);\n if (!result) {\n setGlobal(replaceSettings(getGlobal(), { isSensitiveEnabled: !payload }));\n }\n })();\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport {\n ApiUpdate,\n ApiUpdateAuthorizationState,\n ApiUpdateAuthorizationError,\n ApiUpdateConnectionState,\n ApiUpdateSession,\n ApiUpdateCurrentUser, ApiUpdateServerTimeOffset,\n} from '../../../api/types';\nimport { DEBUG, SESSION_USER_KEY } from '../../../config';\nimport { subscribe } from '../../../util/notifications';\nimport { updateUser } from '../../reducers';\nimport { setLanguage } from '../../../util/langProvider';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n if (DEBUG) {\n if (update['@type'] !== 'updateUserStatus' && update['@type'] !== 'updateServerTimeOffset') {\n // eslint-disable-next-line no-console\n console.log('[GramJs] UPDATE', update['@type'], { update });\n }\n }\n\n switch (update['@type']) {\n case 'updateApiReady':\n onUpdateApiReady(global);\n break;\n\n case 'updateAuthorizationState':\n onUpdateAuthorizationState(update);\n break;\n\n case 'updateAuthorizationError':\n onUpdateAuthorizationError(update);\n break;\n\n case 'updateConnectionState':\n onUpdateConnectionState(update);\n break;\n\n case 'updateSession':\n onUpdateSession(update);\n break;\n\n case 'updateServerTimeOffset':\n onUpdateServerTimeOffset(update);\n break;\n\n case 'updateCurrentUser':\n onUpdateCurrentUser(update);\n break;\n\n case 'error':\n if (update.error.message === 'SESSION_REVOKED') {\n actions.signOut();\n }\n\n if (actions.showDialog) {\n actions.showDialog({ data: { ...update.error, hasErrorKey: true } });\n }\n\n break;\n }\n});\n\nfunction onUpdateApiReady(global: GlobalState) {\n subscribe();\n setLanguage(global.settings.byKey.language);\n}\n\nfunction onUpdateAuthorizationState(update: ApiUpdateAuthorizationState) {\n let global = getGlobal();\n\n const wasAuthReady = global.authState === 'authorizationStateReady';\n const authState = update.authorizationState;\n\n setGlobal({\n ...global,\n authState,\n authIsLoading: false,\n });\n\n global = getGlobal();\n\n switch (authState) {\n case 'authorizationStateLoggingOut':\n setGlobal({\n ...global,\n isLoggingOut: true,\n });\n break;\n case 'authorizationStateWaitCode':\n setGlobal({\n ...global,\n authIsCodeViaApp: update.isCodeViaApp,\n });\n break;\n case 'authorizationStateWaitPassword':\n setGlobal({\n ...global,\n authHint: update.hint,\n });\n break;\n case 'authorizationStateWaitQrCode':\n setGlobal({\n ...global,\n authIsLoadingQrCode: false,\n authQrCode: update.qrCode,\n });\n break;\n case 'authorizationStateReady': {\n if (wasAuthReady) {\n break;\n }\n\n setGlobal({\n ...global,\n isLoggingOut: false,\n lastSyncTime: Date.now(),\n });\n\n break;\n }\n }\n}\n\nfunction onUpdateAuthorizationError(update: ApiUpdateAuthorizationError) {\n setGlobal({\n ...getGlobal(),\n authError: update.message,\n });\n}\n\nfunction onUpdateConnectionState(update: ApiUpdateConnectionState) {\n const { connectionState } = update;\n const global = getGlobal();\n\n setGlobal({\n ...global,\n connectionState,\n });\n\n if (connectionState === 'connectionStateReady' && global.authState === 'authorizationStateReady') {\n getDispatch().sync();\n } else if (connectionState === 'connectionStateBroken') {\n getDispatch().signOut();\n }\n}\n\nfunction onUpdateSession(update: ApiUpdateSession) {\n const { sessionData } = update;\n const { authRememberMe, authState } = getGlobal();\n const isEmpty = !sessionData || !sessionData.mainDcId;\n\n if (!authRememberMe || authState !== 'authorizationStateReady' || isEmpty) {\n return;\n }\n\n getDispatch().saveSession({ sessionData });\n}\n\nfunction onUpdateServerTimeOffset(update: ApiUpdateServerTimeOffset) {\n const global = getGlobal();\n\n if (global.serverTimeOffset === update.serverTimeOffset) {\n return;\n }\n\n setGlobal({\n ...global,\n serverTimeOffset: update.serverTimeOffset,\n });\n}\n\nfunction onUpdateCurrentUser(update: ApiUpdateCurrentUser) {\n const { currentUser } = update;\n\n setGlobal({\n ...updateUser(getGlobal(), currentUser.id, currentUser),\n currentUserId: currentUser.id,\n });\n\n updateSessionUserId(currentUser.id);\n}\n\nfunction updateSessionUserId(currentUserId: number) {\n const sessionUserAuth = localStorage.getItem(SESSION_USER_KEY);\n if (!sessionUserAuth) return;\n\n const userAuth = JSON.parse(sessionUserAuth);\n userAuth.id = currentUserId;\n\n localStorage.setItem(SESSION_USER_KEY, JSON.stringify(userAuth));\n}\n","export var ServiceWorkerNoSupportError = (function() {\n\n\tfunction ServiceWorkerNoSupportError() {\n\t\tvar err = Error.call(this, 'ServiceWorker is not supported.');\n\t\tObject.setPrototypeOf(err, ServiceWorkerNoSupportError.prototype);\n\t\treturn err;\n\t}\n\n\tServiceWorkerNoSupportError.prototype = Object.create(Error.prototype);\n\n\treturn ServiceWorkerNoSupportError;\n})();\n\nexport var scriptUrl = __webpack_public_path__ + \"serviceWorker.js\";\n\nexport default function registerServiceWorkerIfSupported(mapScriptUrlOrOptions, maybeOptions) {\n\n\tvar targetScriptUrl = scriptUrl;\n\tvar options = maybeOptions;\n\n\tif (typeof mapScriptUrlOrOptions === 'function') {\n\t\ttargetScriptUrl = mapScriptUrlOrOptions(targetScriptUrl);\n\t} else {\n\t\toptions = mapScriptUrlOrOptions;\n\t}\n\n\tif ('serviceWorker' in navigator) {\n\t\treturn navigator.serviceWorker.register(targetScriptUrl, options);\n\t}\n\n\treturn Promise.reject(new ServiceWorkerNoSupportError());\n}\n","import { scriptUrl } from 'service-worker-loader!../serviceWorker';\n\nimport { DEBUG } from '../config';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { IS_ANDROID, IS_IOS, IS_SERVICE_WORKER_SUPPORTED } from './environment';\nimport { notifyClientReady } from './notifications';\n\ntype WorkerAction = {\n type: string;\n payload: Record;\n};\n\nfunction handleWorkerMessage(e: MessageEvent) {\n const action: WorkerAction = e.data;\n if (!action.type) return;\n const dispatch = getDispatch();\n switch (action.type) {\n case 'focusMessage':\n dispatch.focusMessage(action.payload);\n break;\n }\n}\n\nfunction subscribeToWorker() {\n navigator.serviceWorker.removeEventListener('message', handleWorkerMessage);\n navigator.serviceWorker.addEventListener('message', handleWorkerMessage);\n // Notify web worker that client is ready to receive messages\n notifyClientReady();\n}\n\nif (IS_SERVICE_WORKER_SUPPORTED) {\n window.addEventListener('load', async () => {\n try {\n await navigator.serviceWorker.register(scriptUrl);\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] ServiceWorker registered');\n }\n\n await navigator.serviceWorker.ready;\n\n if (navigator.serviceWorker.controller) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] ServiceWorker ready');\n }\n subscribeToWorker();\n } else {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('[SW] ServiceWorker not available');\n }\n\n if (!IS_IOS && !IS_ANDROID) {\n getDispatch().showDialog({ data: { message: 'SERVICE_WORKER_DISABLED', hasErrorKey: true } });\n }\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('[SW] ServiceWorker registration failed: ', err);\n }\n }\n });\n window.addEventListener('focus', async () => {\n await navigator.serviceWorker.ready;\n subscribeToWorker();\n });\n}\n","import { GlobalState } from './types';\nimport { NewChatMembersProgress } from '../types';\n\nimport {\n ANIMATION_LEVEL_DEFAULT, DARK_THEME_PATTERN_COLOR, DEFAULT_MESSAGE_TEXT_SIZE_PX, DEFAULT_PATTERN_COLOR,\n IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX, MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX,\n} from '../config';\nimport { IS_IOS, IS_MAC_OS } from '../util/environment';\n\nexport const INITIAL_STATE: GlobalState = {\n isLeftColumnShown: true,\n isChatInfoShown: false,\n newChatMembersProgress: NewChatMembersProgress.Closed,\n uiReadyState: 0,\n serverTimeOffset: 0,\n\n authRememberMe: true,\n\n blocked: {\n ids: [],\n totalCount: 0,\n },\n\n users: {\n byId: {},\n },\n\n chats: {\n listIds: {},\n isFullyLoaded: {},\n orderedPinnedIds: {},\n totalCount: {},\n byId: {},\n },\n\n messages: {\n byChatId: {},\n messageLists: [],\n },\n\n scheduledMessages: {\n byChatId: {},\n },\n\n chatFolders: {\n byId: {},\n activeChatFolder: 0,\n },\n\n fileUploads: {\n byMessageLocalId: {},\n },\n\n recentEmojis: ['grinning', 'kissing_heart', 'christmas_tree', 'brain', 'trophy'],\n\n stickers: {\n setsById: {},\n added: {},\n recent: {\n stickers: [],\n },\n favorite: {\n stickers: [],\n },\n greeting: {\n stickers: [],\n },\n featured: {\n setIds: [],\n },\n search: {},\n forEmoji: {},\n },\n\n emojiKeywords: {},\n\n gifs: {\n saved: {},\n search: {},\n },\n\n inlineBots: {\n isLoading: false,\n byUsername: {},\n },\n\n globalSearch: {},\n\n userSearch: {},\n\n localTextSearch: {\n byChatThreadKey: {},\n },\n\n localMediaSearch: {\n byChatId: {},\n },\n\n management: {\n byChatId: {},\n },\n\n topPeers: {},\n\n topInlineBots: {},\n\n mediaViewer: {},\n\n audioPlayer: {},\n\n forwardMessages: {},\n\n pollResults: {},\n\n payment: {},\n\n notifications: [],\n\n dialogs: [],\n\n activeSessions: [],\n\n settings: {\n byKey: {\n theme: 'light',\n shouldUseSystemTheme: true,\n messageTextSize: IS_IOS\n ? IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX\n : (IS_MAC_OS ? MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX : DEFAULT_MESSAGE_TEXT_SIZE_PX),\n animationLevel: ANIMATION_LEVEL_DEFAULT,\n messageSendKeyCombo: 'enter',\n shouldAutoDownloadMediaFromContacts: true,\n shouldAutoDownloadMediaInPrivateChats: true,\n shouldAutoDownloadMediaInGroups: true,\n shouldAutoDownloadMediaInChannels: true,\n shouldAutoPlayGifs: true,\n shouldAutoPlayVideos: true,\n shouldSuggestStickers: true,\n shouldLoopStickers: true,\n language: 'en',\n },\n themes: {\n light: {\n isBlurred: true,\n patternColor: DEFAULT_PATTERN_COLOR,\n },\n dark: {\n isBlurred: true,\n patternColor: DARK_THEME_PATTERN_COLOR,\n },\n },\n privacy: {},\n notifyExceptions: {},\n },\n\n twoFaSettings: {},\n\n shouldShowContextMenuHint: true,\n};\n","import {\n addCallback, addReducer, getGlobal, removeCallback,\n} from '../lib/teact/teactn';\n\nimport { GlobalState } from './types';\nimport { MAIN_THREAD_ID } from '../api/types';\n\nimport { onBeforeUnload, onIdle, throttle } from '../util/schedulers';\nimport {\n DEBUG,\n GLOBAL_STATE_CACHE_DISABLED,\n GLOBAL_STATE_CACHE_KEY,\n GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n GLOBAL_STATE_CACHE_USER_LIST_LIMIT,\n} from '../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../util/environment';\nimport { ANIMATION_END_EVENT, ANIMATION_START_EVENT } from '../hooks/useHeavyAnimationCheck';\nimport { pick } from '../util/iteratees';\nimport { selectCurrentMessageList } from '../modules/selectors';\nimport { hasStoredSession } from '../util/sessions';\nimport { INITIAL_STATE } from './initial';\n\nconst UPDATE_THROTTLE = 5000;\n\nconst updateCacheThrottled = throttle(() => onIdle(updateCache), UPDATE_THROTTLE, false);\n\nlet isCaching = false;\nlet isHeavyAnimating = false;\nlet unsubscribeFromBeforeUnload: NoneToVoidFunction | undefined;\n\nsetupHeavyAnimationListeners();\n\nexport function initCache() {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return;\n }\n\n addReducer('saveSession', () => {\n if (isCaching) {\n return;\n }\n\n setupCaching();\n });\n\n addReducer('reset', () => {\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n\n if (!isCaching) {\n return;\n }\n\n clearCaching();\n });\n}\n\nexport function loadCache(initialState: GlobalState) {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return undefined;\n }\n\n if (hasStoredSession(true)) {\n setupCaching();\n\n return readCache(initialState);\n } else {\n clearCaching();\n\n return undefined;\n }\n}\n\nfunction setupCaching() {\n isCaching = true;\n unsubscribeFromBeforeUnload = onBeforeUnload(updateCache, true);\n window.addEventListener('blur', updateCache);\n addCallback(updateCacheThrottled);\n}\n\nfunction clearCaching() {\n isCaching = false;\n removeCallback(updateCacheThrottled);\n window.removeEventListener('blur', updateCache);\n if (unsubscribeFromBeforeUnload) {\n unsubscribeFromBeforeUnload();\n }\n}\n\nfunction readCache(initialState: GlobalState) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.time('global-state-cache-read');\n }\n\n const json = localStorage.getItem(GLOBAL_STATE_CACHE_KEY);\n const cached = json ? JSON.parse(json) as GlobalState : undefined;\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.timeEnd('global-state-cache-read');\n }\n\n if (cached) {\n // Pre-fill defaults in nested objects which may be missing in older cache\n cached.settings.byKey = {\n ...initialState.settings.byKey,\n ...cached.settings.byKey,\n };\n cached.settings.themes = {\n ...initialState.settings.themes,\n ...cached.settings.themes,\n };\n cached.chatFolders = {\n ...initialState.chatFolders,\n ...cached.chatFolders,\n };\n\n if (!cached.messages.messageLists) {\n cached.messages.messageLists = [];\n }\n }\n\n return {\n ...initialState,\n ...cached,\n };\n}\n\nfunction updateCache() {\n if (!isCaching || isHeavyAnimating) {\n return;\n }\n\n const global = getGlobal();\n\n if (global.isLoggingOut) {\n return;\n }\n\n const reducedGlobal: GlobalState = {\n ...INITIAL_STATE,\n ...pick(global, [\n 'authState',\n 'authPhoneNumber',\n 'authRememberMe',\n 'authNearestCountry',\n 'currentUserId',\n 'contactList',\n 'topPeers',\n 'topInlineBots',\n 'recentEmojis',\n 'push',\n 'shouldShowContextMenuHint',\n ]),\n isChatInfoShown: reduceShowChatInfo(global),\n users: reduceUsers(global),\n chats: reduceChats(global),\n messages: reduceMessages(global),\n globalSearch: {\n recentlyFoundChatIds: global.globalSearch.recentlyFoundChatIds,\n },\n settings: reduceSettings(global),\n chatFolders: reduceChatFolders(global),\n };\n\n const json = JSON.stringify(reducedGlobal);\n localStorage.setItem(GLOBAL_STATE_CACHE_KEY, json);\n}\n\nfunction reduceShowChatInfo(global: GlobalState): boolean {\n return window.innerWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n ? global.isChatInfoShown\n : false;\n}\n\nfunction reduceUsers(global: GlobalState): GlobalState['users'] {\n const { users: { byId, selectedId } } = global;\n const idsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT).filter((cid) => cid > 0),\n ...Object.keys(byId),\n ].slice(0, GLOBAL_STATE_CACHE_USER_LIST_LIMIT);\n\n return {\n byId: pick(byId, idsToSave as number[]),\n selectedId: window.innerWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN ? selectedId : undefined,\n };\n}\n\nfunction reduceChats(global: GlobalState): GlobalState['chats'] {\n const chatIdsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT),\n ];\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n return {\n ...global.chats,\n byId: pick(global.chats.byId, currentChatId ? [...chatIdsToSave, currentChatId] : chatIdsToSave),\n listIds: {\n active: chatIdsToSave,\n },\n isFullyLoaded: {},\n orderedPinnedIds: {\n active: global.chats.orderedPinnedIds.active,\n },\n };\n}\n\nfunction reduceMessages(global: GlobalState): GlobalState['messages'] {\n const byChatId: GlobalState['messages']['byChatId'] = {};\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n const chatIdsToSave = [\n ...(global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT),\n ...(currentChatId ? [currentChatId] : []),\n ];\n chatIdsToSave.forEach((chatId) => {\n const current = global.messages.byChatId[chatId];\n if (!current) {\n return;\n }\n\n const mainThread = current.threadsById[MAIN_THREAD_ID];\n if (!mainThread || !mainThread.viewportIds) {\n return;\n }\n\n byChatId[chatId] = {\n byId: pick(current.byId, mainThread.viewportIds),\n threadsById: {\n [MAIN_THREAD_ID]: mainThread,\n },\n };\n });\n\n const currentMessageList = selectCurrentMessageList(global);\n\n return {\n byChatId,\n messageLists: !currentMessageList || IS_SINGLE_COLUMN_LAYOUT ? [] : [{\n ...currentMessageList,\n threadId: MAIN_THREAD_ID,\n type: 'thread',\n }],\n };\n}\n\nfunction reduceSettings(global: GlobalState): GlobalState['settings'] {\n const { byKey, themes } = global.settings;\n\n return {\n byKey,\n themes,\n privacy: {},\n notifyExceptions: {},\n };\n}\n\nfunction reduceChatFolders(global: GlobalState): GlobalState['chatFolders'] {\n return {\n ...global.chatFolders,\n activeChatFolder: 0,\n };\n}\n\nfunction setupHeavyAnimationListeners() {\n document.addEventListener(ANIMATION_START_EVENT, () => {\n isHeavyAnimating = true;\n });\n document.addEventListener(ANIMATION_END_EVENT, () => {\n isHeavyAnimating = false;\n });\n}\n","import { addReducer } from '../lib/teact/teactn';\n\nimport { INITIAL_STATE } from './initial';\nimport { initCache, loadCache } from './cache';\nimport { cloneDeep } from '../util/iteratees';\n\ninitCache();\n\naddReducer('init', () => {\n const initial = cloneDeep(INITIAL_STATE);\n return loadCache(initial) || initial;\n});\n","const STORAGE_KEY = 'tt-active-tab';\nconst INTERVAL = 2000;\n\nconst tabKey = String(Date.now() + Math.random());\n\nlocalStorage.setItem(STORAGE_KEY, tabKey);\n\nlet callback: NoneToVoidFunction;\n\nconst interval = window.setInterval(() => {\n if (callback && localStorage.getItem(STORAGE_KEY) !== tabKey) {\n callback();\n clearInterval(interval);\n }\n}, INTERVAL);\n\nexport function addActiveTabChangeListener(_callback: NoneToVoidFunction) {\n callback = _callback;\n}\n","const SITE_FONTS = ['400 1em Roboto', '500 1em Roboto'];\n\nexport default function preloadFonts() {\n if ('fonts' in document) {\n return Promise.all(SITE_FONTS.map((font) => document.fonts.load(font)));\n }\n\n return undefined;\n}\n","export default __webpack_public_path__ + \"telegram-logo.df3a91becaa9678c529b4c4cadd45204.svg\";","export default __webpack_public_path__ + \"monkey.a3d5fcdc50b18dc55695f7dd4101a8c9.svg\";","import React, { FC, useEffect } from '../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../api/types';\nimport { GlobalActions, GlobalState } from '../../global/types';\n\nimport { getChatAvatarHash } from '../../modules/helpers/chats'; // Direct import for better module splitting\nimport useFlag from '../../hooks/useFlag';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport { pause } from '../../util/schedulers';\nimport { preloadImage } from '../../util/files';\nimport preloadFonts from '../../util/fonts';\nimport * as mediaLoader from '../../util/mediaLoader';\nimport { Bundles, loadModule } from '../../util/moduleLoader';\nimport { pick } from '../../util/iteratees';\nimport buildClassName from '../../util/buildClassName';\n\nimport './UiLoader.scss';\n\n// @ts-ignore\nimport telegramLogoPath from '../../assets/telegram-logo.svg';\n// @ts-ignore\nimport monkeyPath from '../../assets/monkey.svg';\nimport { selectIsRightColumnShown, selectTheme } from '../../modules/selectors';\n\ntype OwnProps = {\n page: 'main' | 'authCode' | 'authPassword' | 'authPhoneNumber' | 'authQrCode';\n children: any;\n};\n\ntype StateProps = Pick & {\n hasCustomBackground?: boolean;\n hasCustomBackgroundColor: boolean;\n isRightColumnShown?: boolean;\n};\n\ntype DispatchProps = Pick;\n\nconst MAX_PRELOAD_DELAY = 700;\nconst SECOND_STATE_DELAY = 1000;\nconst AVATARS_TO_PRELOAD = 10;\n\nfunction preloadAvatars() {\n const { listIds, byId } = getGlobal().chats;\n if (!listIds.active) {\n return undefined;\n }\n\n return Promise.all(listIds.active.slice(0, AVATARS_TO_PRELOAD).map((chatId) => {\n const chat = byId[chatId];\n if (!chat) {\n return undefined;\n }\n\n const avatarHash = getChatAvatarHash(chat);\n if (!avatarHash) {\n return undefined;\n }\n\n return mediaLoader.fetch(avatarHash, ApiMediaFormat.DataUri);\n }));\n}\n\nconst preloadTasks = {\n main: () => Promise.all([\n loadModule(Bundles.Main, 'Main')\n .then(preloadFonts),\n preloadAvatars(),\n ]),\n authPhoneNumber: () => Promise.all([\n preloadFonts(),\n preloadImage(telegramLogoPath),\n ]),\n authCode: () => preloadImage(monkeyPath),\n authPassword: () => preloadImage(monkeyPath),\n authQrCode: preloadFonts,\n};\n\nconst UiLoader: FC = ({\n page,\n children,\n hasCustomBackground,\n hasCustomBackgroundColor,\n isRightColumnShown,\n shouldSkipHistoryAnimations,\n setIsUiReady,\n}) => {\n const [isReady, markReady] = useFlag();\n const {\n shouldRender: shouldRenderMask, transitionClassNames,\n } = useShowTransition(!isReady, undefined, true);\n\n useEffect(() => {\n let timeout: number | undefined;\n\n const safePreload = async () => {\n try {\n await preloadTasks[page]();\n } catch (err) {\n // Do nothing\n }\n };\n\n Promise.race([\n pause(MAX_PRELOAD_DELAY),\n safePreload(),\n ]).then(() => {\n markReady();\n setIsUiReady({ uiReadyState: 1 });\n\n timeout = window.setTimeout(() => {\n setIsUiReady({ uiReadyState: 2 });\n }, SECOND_STATE_DELAY);\n });\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n setIsUiReady({ uiReadyState: 0 });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n
\n {children}\n {shouldRenderMask && !shouldSkipHistoryAnimations && (\n
\n {page === 'main' ? (\n <>\n
\n \n {isRightColumnShown &&
}\n \n ) : (\n
\n )}\n
\n )}\n
\n );\n};\n\nexport default withGlobal(\n (global): StateProps => {\n const theme = selectTheme(global);\n const { background, backgroundColor } = global.settings.themes[theme] || {};\n\n return {\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n uiReadyState: global.uiReadyState,\n hasCustomBackground: Boolean(background),\n hasCustomBackgroundColor: Boolean(backgroundColor),\n isRightColumnShown: selectIsRightColumnShown(global),\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, ['setIsUiReady']),\n)(UiLoader);\n","import * as langProvider from '../util/langProvider';\nimport { useState } from '../lib/teact/teact';\n\nexport default (langCode: string | undefined, key: string): string | undefined => {\n const [translation, setTranslation] = useState();\n\n if (langCode) {\n langProvider\n .getTranslationForLangString(langCode, key)\n .then(setTranslation);\n }\n\n return translation;\n};\n","export function getSuggestedLanguage() {\n let suggestedLanguage = navigator.language;\n\n if (suggestedLanguage && suggestedLanguage !== 'pt-br') {\n suggestedLanguage = suggestedLanguage.substr(0, 2);\n }\n\n return suggestedLanguage;\n}\n","import React, {\n FC, useState, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { countryList } from '../../util/phoneNumber';\nimport searchWords from '../../util/searchWords';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport Spinner from '../ui/Spinner';\n\nimport './CountryCodeInput.scss';\n\ntype OwnProps = {\n id: string;\n value?: Country;\n isLoading?: boolean;\n onChange: (value: Country) => void;\n};\n\nconst MENU_HIDING_DURATION = 200 + ANIMATION_END_DELAY;\nconst SELECT_TIMEOUT = 50;\n\nconst CountryCodeInput: FC = ({\n id,\n value,\n isLoading,\n onChange,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n\n const [filter, setFilter] = useState();\n const [filteredList, setFilteredList] = useState(countryList);\n\n function updateFilter(filterValue?: string) {\n setFilter(filterValue);\n setFilteredList(getFilteredList(filterValue));\n }\n\n const handleChange = useCallback((e: React.SyntheticEvent) => {\n const { countryId } = (e.currentTarget.firstElementChild as HTMLDivElement).dataset;\n const country = countryList.find((c) => c.id === countryId);\n\n if (country) {\n onChange(country);\n }\n\n setTimeout(() => updateFilter(undefined), MENU_HIDING_DURATION);\n }, [onChange]);\n\n const handleInput = useCallback((e: React.FormEvent) => {\n updateFilter(e.currentTarget.value);\n }, []);\n\n const handleInputKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.keyCode !== 8) {\n return;\n }\n\n const target = e.currentTarget;\n if (value && filter === undefined) {\n target.value = '';\n }\n\n updateFilter(target.value);\n }, [filter, value]);\n\n const CodeInput: FC<{ onTrigger: () => void; isOpen?: boolean }> = ({ onTrigger, isOpen }) => {\n const handleTrigger = () => {\n if (isOpen) {\n return;\n }\n\n setTimeout(() => {\n inputRef.current!.select();\n }, SELECT_TIMEOUT);\n\n onTrigger();\n\n const formEl = document.getElementById('auth-phone-number-form')!;\n formEl.scrollTo({ top: formEl.scrollHeight, behavior: 'smooth' });\n };\n\n const inputValue = filter !== undefined\n ? filter\n : (value && value.name) || '';\n\n return (\n
\n \n \n {isLoading ? (\n \n ) : (\n \n )}\n
\n );\n };\n\n return (\n \n {filteredList.map((country: Country) => (\n \n \n {renderText(country.flag, ['hq_emoji'])}\n {country.name}\n {country.code}\n \n ))}\n {!filteredList.length && (\n \n {lang('lng_country_none')}\n \n )}\n \n );\n};\n\nfunction getFilteredList(filter = ''): Country[] {\n return filter.length\n ? countryList.filter((country) => searchWords(country.name, filter))\n : countryList;\n}\n\nexport default memo(CountryCodeInput);\n","import { ChangeEvent } from 'react';\n\n// @ts-ignore\nimport monkeyPath from '../../assets/monkey.svg';\n\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\nimport { LangCode } from '../../types';\n\nimport { IS_SAFARI, IS_TOUCH_ENV } from '../../util/environment';\nimport { preloadImage } from '../../util/files';\nimport preloadFonts from '../../util/fonts';\nimport { pick } from '../../util/iteratees';\nimport { formatPhoneNumber, getCountryById, getCountryFromPhoneNumber } from '../../util/phoneNumber';\nimport { setLanguage } from '../../util/langProvider';\nimport useLang from '../../hooks/useLang';\nimport useFlag from '../../hooks/useFlag';\nimport useLangString from '../../hooks/useLangString';\nimport { getSuggestedLanguage } from './helpers/getSuggestedLanguage';\n\nimport Button from '../ui/Button';\nimport Checkbox from '../ui/Checkbox';\nimport InputText from '../ui/InputText';\nimport Loading from '../ui/Loading';\nimport CountryCodeInput from './CountryCodeInput';\n\ntype StateProps = Pick & {\n language?: LangCode;\n};\ntype DispatchProps = Pick;\n\nconst MIN_NUMBER_LENGTH = 7;\n\nlet isPreloadInitiated = false;\n\nconst AuthPhoneNumber: FC = ({\n connectionState,\n authState,\n authPhoneNumber,\n authIsLoading,\n authIsLoadingQrCode,\n authError,\n authRememberMe,\n authNearestCountry,\n language,\n setAuthPhoneNumber,\n setAuthRememberMe,\n loadNearestCountry,\n clearAuthError,\n goToAuthQrCode,\n setSettingOption,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const suggestedLanguage = getSuggestedLanguage();\n\n const continueText = useLangString(suggestedLanguage, 'ContinueOnThisLanguage');\n const [country, setCountry] = useState();\n const [phoneNumber, setPhoneNumber] = useState();\n const [isTouched, setIsTouched] = useState(false);\n const [lastSelection, setLastSelection] = useState<[number, number] | undefined>();\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n const fullNumber = country ? `${country.code} ${phoneNumber || ''}` : phoneNumber;\n const canSubmit = fullNumber && fullNumber.replace(/[^\\d]+/g, '').length >= MIN_NUMBER_LENGTH;\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n inputRef.current!.focus();\n }\n }, [country]);\n\n useEffect(() => {\n if (connectionState === 'connectionStateReady' && !authNearestCountry) {\n loadNearestCountry();\n }\n }, [connectionState, authNearestCountry, loadNearestCountry]);\n\n useEffect(() => {\n if (authNearestCountry && !country && !isTouched) {\n setCountry(getCountryById(authNearestCountry));\n }\n }, [country, authNearestCountry, isTouched]);\n\n const parseFullNumber = useCallback((newFullNumber: string) => {\n if (!newFullNumber.length) {\n setPhoneNumber('');\n }\n\n const suggestedCountry = getCountryFromPhoneNumber(newFullNumber);\n\n // Any phone numbers should be allowed, in some cases ignoring formatting\n const selectedCountry = !country\n || (suggestedCountry && suggestedCountry.id !== country.id)\n || (!suggestedCountry && newFullNumber.length)\n ? suggestedCountry\n : country;\n\n if (!country || !selectedCountry || (selectedCountry && selectedCountry.code !== country.code)) {\n setCountry(selectedCountry);\n }\n\n setPhoneNumber(formatPhoneNumber(newFullNumber, selectedCountry));\n }, [country]);\n\n const handleLangChange = useCallback(() => {\n markIsLoading();\n\n setLanguage(suggestedLanguage!, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: suggestedLanguage });\n });\n }, [markIsLoading, setSettingOption, suggestedLanguage, unmarkIsLoading]);\n\n useEffect(() => {\n if (phoneNumber === undefined && authPhoneNumber) {\n parseFullNumber(authPhoneNumber);\n }\n }, [authPhoneNumber, phoneNumber, parseFullNumber]);\n\n useLayoutEffect(() => {\n if (inputRef.current && lastSelection) {\n inputRef.current.setSelectionRange(...lastSelection);\n }\n }, [lastSelection]);\n\n const isJustPastedRef = useRef(false);\n const handlePaste = useCallback(() => {\n isJustPastedRef.current = true;\n requestAnimationFrame(() => {\n isJustPastedRef.current = false;\n });\n }, []);\n\n const handlePhoneNumberChange = useCallback((e: ChangeEvent) => {\n if (authError) {\n clearAuthError();\n }\n\n // This is for further screens. We delay it until user input to speed up the initial loading.\n if (!isPreloadInitiated) {\n isPreloadInitiated = true;\n preloadFonts();\n preloadImage(monkeyPath);\n }\n\n const { value, selectionStart, selectionEnd } = e.target;\n setLastSelection(\n selectionStart && selectionEnd && selectionEnd < value.length\n ? [selectionStart, selectionEnd]\n : undefined,\n );\n\n setIsTouched(true);\n\n const shouldFixSafariAutoComplete = (\n IS_SAFARI && country && fullNumber !== undefined\n && value.length - fullNumber.length > 1 && !isJustPastedRef.current\n );\n parseFullNumber(shouldFixSafariAutoComplete ? `${country!.code} ${value}` : value);\n }, [authError, clearAuthError, country, fullNumber, parseFullNumber]);\n\n const handleKeepSessionChange = useCallback((e: ChangeEvent) => {\n setAuthRememberMe(e.target.checked);\n }, [setAuthRememberMe]);\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n\n if (authIsLoading) {\n return;\n }\n\n if (canSubmit) {\n setAuthPhoneNumber({ phoneNumber: fullNumber });\n }\n }\n\n const isAuthReady = authState === 'authorizationStateWaitPhoneNumber';\n\n return (\n
\n
\n
\n

Telegram

\n

{lang('StartText')}

\n
\n \n \n \n {canSubmit && (\n isAuthReady ? (\n \n ) : (\n \n )\n )}\n {isAuthReady && (\n \n )}\n {suggestedLanguage && suggestedLanguage !== language && continueText && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: { byKey: { language } },\n } = global;\n\n return {\n ...pick(global, [\n 'connectionState',\n 'authState',\n 'authPhoneNumber',\n 'authIsLoading',\n 'authIsLoadingQrCode',\n 'authError',\n 'authRememberMe',\n 'authNearestCountry',\n ]),\n language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'setAuthPhoneNumber',\n 'setAuthRememberMe',\n 'clearAuthError',\n 'loadNearestCountry',\n 'goToAuthQrCode',\n 'setSettingOption',\n ]),\n)(AuthPhoneNumber));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthCodeAsync: FC = () => {\n const AuthCode = useModuleLoader(Bundles.Auth, 'AuthCode');\n\n return AuthCode ? : ;\n};\n\nexport default memo(AuthCodeAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthPasswordAsync: FC = () => {\n const AuthPassword = useModuleLoader(Bundles.Auth, 'AuthPassword');\n\n return AuthPassword ? : ;\n};\n\nexport default memo(AuthPasswordAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthRegisterAsync: FC = () => {\n const AuthRegister = useModuleLoader(Bundles.Auth, 'AuthRegister');\n\n return AuthRegister ? : ;\n};\n\nexport default memo(AuthRegisterAsync);\n","/*\n jquery-qrcode v0.14.0 - https://larsjung.de/jquery-qrcode/ */\n'use strict';let G=null;class H{}H.render=function(w,B){G(w,B)};self.QrCreator=H;\n(function(w){function B(t,c,a,e){var b={},h=w(a,c);h.u(t);h.J();e=e||0;var r=h.h(),d=h.h()+2*e;b.text=t;b.level=c;b.version=a;b.O=d;b.a=function(b,a){b-=e;a-=e;return 0>b||b>=r||0>a||a>=r?!1:h.a(b,a)};return b}function C(t,c,a,e,b,h,r,d,g,x){function u(b,a,f,c,d,r,g){b?(t.lineTo(a+r,f+g),t.arcTo(a,f,c,d,h)):t.lineTo(a,f)}r?t.moveTo(c+h,a):t.moveTo(c,a);u(d,e,a,e,b,-h,0);u(g,e,b,c,b,0,-h);u(x,c,b,c,a,h,0);u(r,c,a,e,a,0,h)}function z(t,c,a,e,b,h,r,d,g,x){function u(b,a,c,d){t.moveTo(b+c,a);t.lineTo(b,\na);t.lineTo(b,a+d);t.arcTo(b,a,b+c,a,h)}r&&u(c,a,h,h);d&&u(e,a,-h,h);g&&u(e,b,-h,-h);x&&u(c,b,h,-h)}function A(t,c){var a=c.fill;if(\"string\"===typeof a)t.fillStyle=a;else{var e=a.type,b=a.colorStops;a=a.position.map((b)=>Math.round(b*c.size));if(\"linear-gradient\"===e)var h=t.createLinearGradient.apply(t,a);else if(\"radial-gradient\"===e)h=t.createRadialGradient.apply(t,a);else throw Error(\"Unsupported fill\");b.forEach(([b,a])=>{h.addColorStop(b,a)});t.fillStyle=h}}function y(t,c){a:{var a=c.text,e=\nc.v,b=c.N,h=c.K,r=c.P;b=Math.max(1,b||1);for(h=Math.min(40,h||40);b<=h;b+=1)try{var d=B(a,e,b,r);break a}catch(J){}d=void 0}if(!d)return null;a=t.getContext(\"2d\");c.background&&(a.fillStyle=c.background,a.fillRect(c.left,c.top,c.size,c.size));e=d.O;h=c.size/e;a.beginPath();for(r=0;r>>7-b%8&1)},put:function(b,h){for(var a=0;a>>h-a-1&1))},f:function(){return a},m:function(b){var h=Math.floor(a/8);c.length<=h&&c.push(0);b&&(c[h]|=128>>>a%8);a+=1}};return e}function C(c,a){function e(b,h){for(var a=-1;7>=a;a+=1)if(!(-1>=b+a||d<=b+a))for(var c=-1;7>=c;c+=1)-1>=h+c||d<=h+c||(r[b+a][h+c]=0<=a&&6>=a&&(0==c||6==c)||0<=c&&6>=c&&(0==a||6==a)||2<=a&&4>=a&&2<=c&&4>=c?!0:!1)}function b(b,a){for(var f=d=4*c+17,k=Array(f),m=0;m<\nf;m+=1){k[m]=Array(f);for(var p=0;p=n;n+=1)for(var l=-2;2>=l;l+=1)r[p+n][q+l]=-2==n||2==n||-2==l||2==l||0==n&&0==l}for(f=8;fk;k+=1)m=!b&&1==(f>>k&1),r[6>k?k:8>k?k+1:d-15+k][8]=m,r[8][8>k?d-k-1:9>k?15-k:14-k]=m;r[d-8][8]=!b;if(7<=\nc){f=y.A(c);for(k=0;18>k;k+=1)m=!b&&1==(f>>k&1),r[Math.floor(k/3)][k%3+d-8-3]=m;for(k=0;18>k;k+=1)m=!b&&1==(f>>k&1),r[k%3+d-8-3][Math.floor(k/3)]=m}if(null==g){b=t.I(c,h);f=B();for(k=0;k8*m)throw Error(\"code length overflow. (\"+f.f()+\">\"+8*m+\")\");for(f.f()+4<=8*m&&f.put(0,4);0!=f.f()%8;)f.m(!1);for(;!(f.f()>=8*m);){f.put(236,8);if(f.f()>=8*m)break;f.put(17,8)}var u=0;m=k=0;p=Array(b.length);\nq=Array(b.length);for(n=0;nn;n+=1)null==r[k][q-n]&&(l=!1,p>>m&1)),a(k,q-n)&&(l=!l),r[k][q-n]=l,--m,-1==m&&(p+=1,m=7));k+=f;if(0>k||d<=k){k-=f;f=-f;break}}}var h=A[a],r=null,d=0,g=null,x=[],u={u:function(b){b=w(b);x.push(b);g=null},a:function(b,a){if(0>b||d<=b||0>a||d<=a)throw Error(b+\",\"+a);return r[b][a]},h:function(){return d},J:function(){for(var a=0,h=0,c=0;8>c;c+=1){b(!0,c);var d=y.D(u);if(0==c||a>d)a=d,h=c}b(!1,h)}};return u}\nfunction z(c,a){if(\"undefined\"==typeof c.length)throw Error(c.length+\"/\"+a);var e=function(){for(var b=0;bb.b()-a.b())return b;for(var c=v.g(b.c(0))-v.g(a.c(0)),h=Array(b.b()),\ng=0;gb?a.push(b):2048>b?a.push(192|b>>6,128|b&63):55296>b||57344<=b?a.push(224|b>>12,128|b>>6&63,128|b&63):(e++,b=65536+((b&1023)<<10|c.charCodeAt(e)&1023),a.push(240|b>>18,128|b>>12&63,128|b>>6&63,128|b&63))}return a};var A={L:1,M:0,Q:3,H:2},y=function(){function c(b){for(var a=0;0!=b;)a+=1,b>>>=1;return a}var a=[[],[6,18],\n[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],\n[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],e={w:function(b){for(var a=b<<10;0<=c(a)-c(1335);)a^=1335<a||40a?8:16},D:function(b){for(var a=b.h(),c=0,\nd=0;d=p;p+=1)if(!(0>d+p||a<=d+p))for(var q=-1;1>=q;q+=1)0>g+q||a<=g+q||(0!=p||0!=q)&&t==b.a(d+p,g+q)&&(e+=1);5e;e+=1)c[e]=1<e;e+=1)c[e]=c[e-4]^c[e-5]^c[e-6]^c[e-8];for(e=0;255>e;e+=1)a[c[e]]=e;return{g:function(b){if(1>b)throw Error(\"glog(\"+b+\")\");return a[b]},i:function(b){for(;0>b;)b+=255;for(;256<=b;)b-=255;return c[b]}}}(),t=function(){function c(b,c){switch(c){case A.L:return a[4*\n(b-1)];case A.M:return a[4*(b-1)+1];case A.Q:return a[4*(b-1)+2];case A.H:return a[4*(b-1)+3]}}var a=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,\n2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,\n45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,\n151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],\n[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],\n[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],e={I:function(b,a){var e=c(b,a);if(\"undefined\"==\ntypeof e)throw Error(\"bad rs block @ typeNumber:\"+b+\"/errorCorrectLevel:\"+a);b=e.length/3;a=[];for(var d=0;d & {\n language?: LangCode;\n};\ntype DispatchProps = Pick;\n\nconst DATA_PREFIX = 'tg://login?token=';\n\nconst AuthCode: FC = ({\n connectionState,\n authState,\n authQrCode,\n language,\n returnToAuthPhoneNumber,\n setSettingOption,\n}) => {\n const suggestedLanguage = getSuggestedLanguage();\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const qrCodeRef = useRef(null);\n const continueText = useLangString(suggestedLanguage, 'ContinueOnThisLanguage');\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n useEffect(() => {\n if (!authQrCode || connectionState !== 'connectionStateReady') {\n return;\n }\n\n const container = qrCodeRef.current!;\n\n container.innerHTML = '';\n container.classList.remove('pre-animate');\n\n QrCreator.render({\n text: `${DATA_PREFIX}${authQrCode.token}`,\n radius: 0.5,\n ecLevel: 'M',\n fill: '#4E96D4',\n size: 280,\n }, container);\n }, [connectionState, authQrCode]);\n\n const handleLangChange = useCallback(() => {\n markIsLoading();\n\n setLanguage(suggestedLanguage!, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: suggestedLanguage });\n });\n }, [markIsLoading, setSettingOption, suggestedLanguage, unmarkIsLoading]);\n\n const isAuthReady = authState === 'authorizationStateWaitQrCode';\n\n return (\n
\n
\n {authQrCode ? (\n
\n ) : (\n
\n )}\n

{lang('Login.QR.Title')}

\n
    \n
  1. {lang('Login.QR.Help1')}
  2. \n
  3. {renderText(lang('Login.QR.Help2'), ['simple_markdown'])}
  4. \n
  5. {lang('Login.QR.Help3')}
  6. \n
\n {isAuthReady && (\n \n )}\n {suggestedLanguage && suggestedLanguage !== language && continueText && (\n \n )}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n connectionState, authState, authQrCode, settings: { byKey: { language } },\n } = global;\n\n return {\n connectionState,\n authState,\n authQrCode,\n language,\n };\n },\n (setGlobal, actions): DispatchProps => pick(actions, [\n 'returnToAuthPhoneNumber', 'setSettingOption',\n ]),\n)(AuthCode));\n","import React, { FC, useEffect, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from '../../global/types';\n\nimport '../../modules/actions/initial';\nimport { pick } from '../../util/iteratees';\nimport { PLATFORM_ENV } from '../../util/environment';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport UiLoader from '../common/UiLoader';\nimport AuthPhoneNumber from './AuthPhoneNumber';\nimport AuthCode from './AuthCode.async';\nimport AuthPassword from './AuthPassword.async';\nimport AuthRegister from './AuthRegister.async';\nimport AuthQrCode from './AuthQrCode';\n\nimport './Auth.scss';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst Auth: FC = ({\n authState, reset, initApi, returnToAuthPhoneNumber, goToAuthQrCode,\n}) => {\n useEffect(() => {\n reset();\n initApi();\n }, [reset, initApi]);\n\n const isMobile = PLATFORM_ENV === 'iOS' || PLATFORM_ENV === 'Android';\n\n const handleChangeAuthorizationMethod = () => {\n if (!isMobile) {\n goToAuthQrCode();\n } else {\n returnToAuthPhoneNumber();\n }\n };\n\n useHistoryBack(\n (!isMobile && authState === 'authorizationStateWaitPhoneNumber')\n || (isMobile && authState === 'authorizationStateWaitQrCode'), handleChangeAuthorizationMethod,\n );\n\n switch (authState) {\n case 'authorizationStateWaitCode':\n return ;\n case 'authorizationStateWaitPassword':\n return ;\n case 'authorizationStateWaitRegistration':\n return ;\n case 'authorizationStateWaitPhoneNumber':\n return ;\n case 'authorizationStateWaitQrCode':\n return ;\n default:\n return isMobile\n ? \n : ;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (global, actions): DispatchProps => pick(actions, ['reset', 'initApi', 'returnToAuthPhoneNumber', 'goToAuthQrCode']),\n)(Auth));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MainAsync: FC = () => {\n const Main = useModuleLoader(Bundles.Main, 'Main');\n\n return Main ?
: undefined;\n};\n\nexport default memo(MainAsync);\n","export default __webpack_public_path__ + \"app-inactive.bc7953c2dfebcabce2c43ca7dc778a89.png\";","import React, { FC } from '../../lib/teact/teact';\n\nimport Button from '../ui/Button';\n\nimport appInactivePath from '../../assets/app-inactive.png';\nimport './AppInactive.scss';\n\nconst AppInactive: FC = () => {\n const handleReload = () => {\n window.location.reload();\n };\n\n return (\n
\n
\n \"\"\n

Such error, many tabs

\n
\n Telegram supports only one active tab with the app.\n
\n Please reload this page to continue using this tab or close it.\n
\n
\n \n
\n
\n
\n );\n};\n\nexport default AppInactive;\n","import { FC, useEffect } from './lib/teact/teact';\nimport React, { withGlobal } from './lib/teact/teactn';\n\nimport { GlobalActions, GlobalState } from './global/types';\n\nimport { INACTIVE_MARKER, PAGE_TITLE } from './config';\nimport { pick } from './util/iteratees';\nimport { updateSizes } from './util/windowSize';\nimport { addActiveTabChangeListener } from './util/activeTabMonitor';\nimport useFlag from './hooks/useFlag';\n\nimport Auth from './components/auth/Auth';\nimport UiLoader from './components/common/UiLoader';\nimport Main from './components/main/Main.async';\nimport AppInactive from './components/main/AppInactive';\nimport { hasStoredSession } from './util/sessions';\n// import Test from './components/test/TestNoRedundancy';\n\ntype StateProps = Pick;\ntype DispatchProps = Pick;\n\nconst App: FC = ({ authState, disconnect }) => {\n const [isInactive, markInactive] = useFlag(false);\n\n useEffect(() => {\n updateSizes();\n addActiveTabChangeListener(() => {\n disconnect();\n document.title = `${PAGE_TITLE}${INACTIVE_MARKER}`;\n\n markInactive();\n });\n }, [disconnect, markInactive]);\n\n // return ;\n\n if (isInactive) {\n return ;\n }\n\n if (authState) {\n switch (authState) {\n case 'authorizationStateWaitPhoneNumber':\n case 'authorizationStateWaitCode':\n case 'authorizationStateWaitPassword':\n case 'authorizationStateWaitRegistration':\n case 'authorizationStateWaitQrCode':\n return ;\n case 'authorizationStateClosed':\n case 'authorizationStateClosing':\n case 'authorizationStateLoggingOut':\n case 'authorizationStateReady':\n return renderMain();\n }\n }\n\n return hasStoredSession(true) ? renderMain() : ;\n};\n\nfunction renderMain() {\n return (\n \n
\n \n );\n}\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['authState']),\n (setGlobal, actions): DispatchProps => pick(actions, ['disconnect']),\n)(App);\n","import './util/handleError';\nimport './util/setupServiceWorker';\n\nimport React, { getDispatch, getGlobal } from './lib/teact/teactn';\nimport TeactDOM from './lib/teact/teact-dom';\n\nimport './global';\n\nimport { DEBUG } from './config';\n\nimport App from './App';\n\nimport './styles/index.scss';\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> INIT');\n}\n\ngetDispatch().init();\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START INITIAL RENDER');\n}\n\nTeactDOM.render(\n ,\n document.getElementById('root'),\n);\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH INITIAL RENDER');\n}\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('GLOBAL STATE', getGlobal());\n});\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/report.html b/dist/report.html index 4c65bdca0..624ca119a 100644 --- a/dist/report.html +++ b/dist/report.html @@ -3,7 +3,7 @@ - telegram-t [4 Aug 2021 at 23:38] + telegram-t [4 Aug 2021 at 23:54]